diff --git a/docs/planning/learn-command-integration.md b/docs/planning/learn-command-integration.md new file mode 100644 index 00000000..411686f0 --- /dev/null +++ b/docs/planning/learn-command-integration.md @@ -0,0 +1,148 @@ +# /learn Command Web UI Integration Plan + +Date: 2026-06-25 + +## Context + +Hermes Agent added a `/learn` slash command that turns a user-described source +or recent workflow into a reusable Hermes skill. The command does not use a +separate model or learning engine. It builds a standards-guided prompt with +`agent.learn_prompt.build_learn_prompt()` and submits that prompt through the +normal agent loop. + +Web UI chat sessions use the local bridge run path instead of always going +through the upstream CLI or gateway slash-command handler. For a reliable user +experience, Web UI should explicitly recognize `/learn` and expand it through +the bridge command path before running the generated prompt. + +## Goals + +- Let users type `/learn ` in a normal Hermes chat session. +- Show `/learn` in the chat input slash-command picker. +- Run the prompt generated by Hermes Agent's `build_learn_prompt()` as the real + agent input. +- Preserve the visible transcript as a command invocation, not as the expanded + internal prompt. +- Support bare `/learn` as "learn from this conversation". +- Fail clearly when the bundled/runtime Hermes Agent version does not provide + `agent.learn_prompt`. + +## Non-Goals + +- Do not add a dedicated model, provider, or auxiliary model for `/learn`. +- Do not create a new Web UI page for skill creation. +- Do not duplicate Hermes Agent's skill-authoring prompt in TypeScript. +- Do not treat `/learn` as memory, fine-tuning, or persistent model training. + +## Proposed Design + +### Server Bridge Command + +Add `/learn` to the Web UI session-command layer: + +- Extend `CommandName` in + `packages/server/src/services/hermes/run-chat/session-command.ts`. +- Add `learn` to `COMMAND_ALIASES`. +- Handle `command.name === "learn"` similarly to `/skill`: + - call the bridge command endpoint with `/learn `; + - expect a handled result with `type: "learn"` and a generated `message`; + - enqueue or start a run with the generated message as the actual input; + - keep the visible/display input as `/learn `. + +### Python Bridge + +Add support in +`packages/server/src/services/hermes/agent-bridge/python/bridge_pool.py`: + +- In `dispatch_command()`, recognize `learn`. +- Import `build_learn_prompt` from `agent.learn_prompt`. +- Return a handled bridge result: + +```python +{ + "session_id": session_id, + "command": name, + "handled": True, + "type": "learn", + "message": build_learn_prompt(arg), +} +``` + +If the import fails, return a clear unsupported-version message instead of +silently passing `/learn` through as normal text. + +### Client Slash Picker + +Update `packages/client/src/utils/hermes/bridge-session-commands.ts`: + +- Add `learn` to `BridgeSessionCommandName`. +- Add a command definition with text args. +- Keep it as a bridge session command so the UI renders it as a command message. + +Update all locale files under `packages/client/src/i18n/locales/`: + +- Add `chat.slashCommands.learn`. +- Reuse the existing `chat.slashCommandArgs.text` placeholder unless a more + specific placeholder is needed. + +### Runtime Compatibility + +The feature depends on Hermes Agent containing `agent/learn_prompt.py`. Web UI +should not copy the prompt text locally. The bridge should surface a clear error +when the runtime agent is too old, for example: + +```text +/learn requires a newer Hermes Agent runtime with agent.learn_prompt. +``` + +This keeps the upstream agent as the source of truth for skill-authoring rules. + +## UX Notes + +- Idle session: + - user sees `/learn ...` as a command message; + - assistant runs the generated skill-authoring prompt; + - final answer should mention the created skill name and category, as directed + by the upstream prompt. +- Running session: + - `/learn ...` should queue like `/skill` and `/plan`; + - queued item should display the original command, not the expanded prompt. +- Bare `/learn`: + - should be accepted and should expand to the upstream fallback for the + current conversation. + +## Tests + +Add or update focused tests: + +- Server: + - `parseSessionCommand("/learn from docs")` returns a learn command. + - idle `/learn` starts a run using the bridge-generated prompt. + - running `/learn` queues the command like `/skill`. + - missing `agent.learn_prompt` returns a clear error. +- Client: + - slash picker includes `/learn`. + - `isKnownBridgeSessionCommand("/learn something")` is true. + - queued/running behavior displays `/learn ...`, not the expanded prompt. +- Harness: + - Run the smallest relevant unit tests while iterating. + - Run `npm run harness:check` before opening a PR. + +## Rollout + +1. Land bridge command support and tests. +2. Update bundled/runtime Hermes Agent to a revision containing + `agent/learn_prompt.py`. +3. Add the client slash-picker entry and locale strings. +4. Verify against a local chat session with: + - `/learn` + - `/learn from docs/workflow.md` + - `/learn the workflow we just performed` + +## Open Questions + +- Should `/learn` be available in workflow node chat drawers, or only normal + Hermes chat sessions? +- Should Web UI refresh the skills list automatically after `/learn` completes? +- Should the skills page show a lightweight "created by /learn" marker if the + upstream skill metadata exposes one later?