@ouro.bot/cli 0.1.0-alpha.4 → 0.1.0-alpha.400
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +208 -184
- package/SerpentGuide.ouro/agent.json +82 -0
- package/SerpentGuide.ouro/psyche/SOUL.md +25 -0
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +2 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
- package/assets/ouroboros.png +0 -0
- package/changelog.json +2610 -0
- package/dist/arc/attention-types.js +8 -0
- package/dist/arc/cares.js +140 -0
- package/dist/arc/episodes.js +117 -0
- package/dist/arc/intentions.js +133 -0
- package/dist/arc/json-store.js +117 -0
- package/dist/arc/obligations.js +237 -0
- package/dist/arc/packets.js +193 -0
- package/dist/arc/presence.js +185 -0
- package/dist/arc/task-lifecycle.js +65 -0
- package/dist/heart/active-work.js +832 -0
- package/dist/heart/agent-entry.js +58 -3
- package/dist/heart/attachments/image-normalize.js +194 -0
- package/dist/heart/attachments/materialize.js +97 -0
- package/dist/heart/attachments/originals.js +88 -0
- package/dist/heart/attachments/render.js +29 -0
- package/dist/heart/attachments/sources/adapter.js +2 -0
- package/dist/heart/attachments/sources/bluebubbles.js +156 -0
- package/dist/heart/attachments/sources/cli-local-file.js +78 -0
- package/dist/heart/attachments/sources/index.js +16 -0
- package/dist/heart/attachments/store.js +103 -0
- package/dist/heart/attachments/types.js +93 -0
- package/dist/heart/auth/auth-flow.js +417 -0
- package/dist/heart/bridges/manager.js +358 -0
- package/dist/heart/bridges/state-machine.js +135 -0
- package/dist/heart/bridges/store.js +123 -0
- package/dist/heart/bundle-state.js +168 -0
- package/dist/heart/commitments.js +111 -0
- package/dist/heart/config-registry.js +304 -0
- package/dist/heart/config.js +176 -130
- package/dist/heart/core.js +872 -255
- package/dist/heart/cross-chat-delivery.js +131 -0
- package/dist/heart/daemon/agent-config-check.js +397 -0
- package/dist/heart/daemon/agent-discovery.js +157 -0
- package/dist/heart/daemon/agent-service.js +360 -0
- package/dist/heart/daemon/agentic-repair.js +213 -0
- package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
- package/dist/heart/daemon/cadence.js +70 -0
- package/dist/heart/daemon/cli-defaults.js +599 -0
- package/dist/heart/daemon/cli-exec.js +3616 -0
- package/dist/heart/daemon/cli-help.js +396 -0
- package/dist/heart/daemon/cli-parse.js +1118 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +560 -0
- package/dist/heart/daemon/cli-types.js +8 -0
- package/dist/heart/daemon/daemon-cli.js +29 -673
- package/dist/heart/daemon/daemon-entry.js +370 -8
- package/dist/heart/daemon/daemon-health.js +141 -0
- package/dist/heart/daemon/daemon-runtime-sync.js +235 -0
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +813 -19
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +419 -0
- package/dist/heart/daemon/health-monitor.js +79 -1
- package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
- package/dist/heart/daemon/hooks/bundle-meta.js +206 -0
- package/dist/heart/daemon/http-health-probe.js +80 -0
- package/dist/heart/daemon/inner-status.js +89 -0
- package/dist/heart/daemon/interactive-repair.js +209 -0
- package/dist/heart/daemon/launchd.js +171 -0
- package/dist/heart/daemon/log-tailer.js +82 -12
- package/dist/heart/daemon/logs-prune.js +105 -0
- package/dist/heart/daemon/message-router.js +17 -8
- package/dist/heart/daemon/os-cron-deps.js +134 -0
- package/dist/heart/daemon/ouro-bot-entry.js +4 -2
- package/dist/heart/daemon/ouro-entry.js +3 -1
- package/dist/heart/daemon/process-manager.js +202 -1
- package/dist/heart/daemon/provider-discovery.js +137 -0
- package/dist/heart/daemon/pulse.js +475 -0
- package/dist/heart/daemon/readiness-repair.js +216 -0
- package/dist/heart/daemon/run-hooks.js +39 -0
- package/dist/heart/daemon/runtime-logging.js +67 -16
- package/dist/heart/daemon/runtime-metadata.js +191 -0
- package/dist/heart/daemon/runtime-mode.js +67 -0
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sense-manager.js +355 -0
- package/dist/heart/daemon/session-id-resolver.js +131 -0
- package/dist/heart/daemon/skill-management-installer.js +94 -0
- package/dist/heart/daemon/socket-client.js +307 -0
- package/dist/heart/daemon/stale-bundle-prune.js +96 -0
- package/dist/heart/daemon/startup-tui.js +237 -0
- package/dist/heart/daemon/task-scheduler.js +3 -25
- package/dist/heart/daemon/thoughts.js +510 -0
- package/dist/heart/daemon/up-progress.js +135 -0
- package/dist/heart/delegation.js +62 -0
- package/dist/heart/habits/habit-migration.js +181 -0
- package/dist/heart/habits/habit-parser.js +140 -0
- package/dist/heart/habits/habit-scheduler.js +371 -0
- package/dist/heart/hatch/hatch-animation.js +35 -0
- package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -135
- package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
- package/dist/heart/hatch/specialist-orchestrator.js +129 -0
- package/dist/heart/hatch/specialist-prompt.js +102 -0
- package/dist/heart/hatch/specialist-tools.js +304 -0
- package/dist/heart/identity.js +246 -58
- package/dist/heart/kept-notes.js +357 -0
- package/dist/heart/kicks.js +2 -20
- package/dist/heart/machine-identity.js +161 -0
- package/dist/heart/mcp/mcp-server.js +653 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +59 -0
- package/dist/heart/outlook/outlook-http-hooks.js +64 -0
- package/dist/heart/outlook/outlook-http-response.js +7 -0
- package/dist/heart/outlook/outlook-http-routes.js +232 -0
- package/dist/heart/outlook/outlook-http-static.js +99 -0
- package/dist/heart/outlook/outlook-http-transport.js +116 -0
- package/dist/heart/outlook/outlook-http.js +99 -0
- package/dist/heart/outlook/outlook-read.js +28 -0
- package/dist/heart/outlook/outlook-types.js +27 -0
- package/dist/heart/outlook/outlook-view.js +195 -0
- package/dist/heart/outlook/readers/agent-machine.js +359 -0
- package/dist/heart/outlook/readers/continuity-readers.js +332 -0
- package/dist/heart/outlook/readers/runtime-readers.js +660 -0
- package/dist/heart/outlook/readers/sessions.js +232 -0
- package/dist/heart/outlook/readers/shared.js +111 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/progress-story.js +42 -0
- package/dist/heart/provider-attempt.js +133 -0
- package/dist/heart/provider-binding-resolver.js +239 -0
- package/dist/heart/provider-credentials.js +383 -0
- package/dist/heart/provider-failover.js +266 -0
- package/dist/heart/provider-models.js +81 -0
- package/dist/heart/provider-ping.js +237 -0
- package/dist/heart/provider-state.js +216 -0
- package/dist/heart/provider-visibility.js +186 -0
- package/dist/heart/providers/anthropic-token.js +131 -0
- package/dist/heart/providers/anthropic.js +202 -50
- package/dist/heart/providers/azure.js +103 -12
- package/dist/heart/providers/error-classification.js +63 -0
- package/dist/heart/providers/github-copilot.js +145 -0
- package/dist/heart/providers/minimax-vlm.js +189 -0
- package/dist/heart/providers/minimax.js +29 -7
- package/dist/heart/providers/openai-codex.js +39 -29
- package/dist/heart/runtime-credentials.js +181 -0
- package/dist/heart/sense-truth.js +61 -0
- package/dist/heart/session-activity.js +190 -0
- package/dist/heart/session-events.js +855 -0
- package/dist/heart/session-transcript.js +167 -0
- package/dist/heart/start-of-turn-packet.js +345 -0
- package/dist/heart/streaming.js +117 -33
- package/dist/heart/sync.js +332 -0
- package/dist/heart/target-resolution.js +127 -0
- package/dist/heart/tempo.js +93 -0
- package/dist/heart/temporal-view.js +41 -0
- package/dist/heart/tool-activity-callbacks.js +36 -0
- package/dist/heart/tool-description.js +135 -0
- package/dist/heart/tool-friction.js +55 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-context.js +351 -0
- package/dist/heart/turn-coordinator.js +28 -0
- package/dist/heart/versioning/ouro-bot-global-installer.js +128 -0
- package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
- package/dist/heart/versioning/ouro-path-installer.js +301 -0
- package/dist/heart/{daemon → versioning}/ouro-uti.js +11 -2
- package/dist/heart/versioning/ouro-version-manager.js +295 -0
- package/dist/heart/versioning/staged-restart.js +146 -0
- package/dist/heart/versioning/update-checker.js +113 -0
- package/dist/heart/versioning/update-hooks.js +142 -0
- package/dist/heart/versioning/wrapper-publish-guard.js +86 -0
- package/dist/mind/bundle-manifest.js +77 -1
- package/dist/mind/context.js +141 -94
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +84 -96
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/first-impressions.js +16 -2
- package/dist/mind/friends/channel.js +64 -0
- package/dist/mind/friends/group-context.js +144 -0
- package/dist/mind/friends/resolver.js +38 -1
- package/dist/mind/friends/store-file.js +58 -3
- package/dist/mind/friends/trust-explanation.js +74 -0
- package/dist/mind/friends/types.js +10 -2
- package/dist/mind/journal-index.js +161 -0
- package/dist/mind/note-search.js +268 -0
- package/dist/mind/obligation-steering.js +221 -0
- package/dist/mind/pending.js +76 -9
- package/dist/mind/phrases.js +1 -0
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +1111 -117
- package/dist/mind/provenance-trust.js +26 -0
- package/dist/mind/scrutiny.js +173 -0
- package/dist/mind/token-estimate.js +8 -12
- package/dist/nerves/cli-logging.js +22 -3
- package/dist/nerves/coverage/audit-rules.js +15 -6
- package/dist/nerves/coverage/audit.js +28 -2
- package/dist/nerves/coverage/cli.js +1 -1
- package/dist/nerves/coverage/contract.js +5 -5
- package/dist/nerves/coverage/file-completeness.js +83 -5
- package/dist/nerves/coverage/run-artifacts.js +1 -1
- package/dist/nerves/event-buffer.js +111 -0
- package/dist/nerves/index.js +224 -4
- package/dist/nerves/observation.js +20 -0
- package/dist/nerves/redact.js +79 -0
- package/dist/nerves/runtime.js +5 -1
- package/dist/outlook-ui/assets/index-BAcU08c-.css +1 -0
- package/dist/outlook-ui/assets/index-D7l3l4vY.js +61 -0
- package/dist/outlook-ui/index.html +15 -0
- package/dist/repertoire/ado-client.js +17 -56
- package/dist/repertoire/ado-semantic.js +11 -10
- package/dist/repertoire/api-client.js +97 -0
- package/dist/repertoire/bitwarden-store.js +461 -0
- package/dist/repertoire/bundle-templates.js +72 -0
- package/dist/repertoire/bw-installer.js +79 -0
- package/dist/repertoire/coding/codex-jsonl.js +64 -0
- package/dist/repertoire/coding/context-pack.js +330 -0
- package/dist/repertoire/coding/feedback.js +301 -0
- package/dist/repertoire/coding/index.js +4 -1
- package/dist/repertoire/coding/manager.js +220 -13
- package/dist/repertoire/coding/spawner.js +58 -12
- package/dist/repertoire/coding/tools.js +209 -7
- package/dist/repertoire/commerce-errors.js +109 -0
- package/dist/repertoire/commerce-self-test.js +156 -0
- package/dist/repertoire/credential-access.js +107 -0
- package/dist/repertoire/data/ado-endpoints.json +188 -0
- package/dist/repertoire/duffel-client.js +185 -0
- package/dist/repertoire/github-client.js +14 -55
- package/dist/repertoire/graph-client.js +11 -52
- package/dist/repertoire/guardrails.js +371 -0
- package/dist/repertoire/mcp-client.js +255 -0
- package/dist/repertoire/mcp-manager.js +305 -0
- package/dist/repertoire/mcp-tools.js +63 -0
- package/dist/repertoire/shell-sessions.js +133 -0
- package/dist/repertoire/skills.js +15 -24
- package/dist/repertoire/stripe-client.js +131 -0
- package/dist/repertoire/tasks/board.js +43 -5
- package/dist/repertoire/tasks/fix.js +182 -0
- package/dist/repertoire/tasks/index.js +28 -10
- package/dist/repertoire/tasks/lifecycle.js +2 -2
- package/dist/repertoire/tasks/parser.js +3 -2
- package/dist/repertoire/tasks/scanner.js +194 -37
- package/dist/repertoire/tasks/transitions.js +16 -79
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-attachments.js +317 -0
- package/dist/repertoire/tools-base.js +45 -707
- package/dist/repertoire/tools-bluebubbles.js +94 -0
- package/dist/repertoire/tools-bridge.js +141 -0
- package/dist/repertoire/tools-bundle.js +984 -0
- package/dist/repertoire/tools-config.js +185 -0
- package/dist/repertoire/tools-continuity.js +248 -0
- package/dist/repertoire/tools-credential.js +182 -0
- package/dist/repertoire/tools-files.js +342 -0
- package/dist/repertoire/tools-flight.js +224 -0
- package/dist/repertoire/tools-flow.js +105 -0
- package/dist/repertoire/tools-github.js +1 -7
- package/dist/repertoire/tools-notes.js +376 -0
- package/dist/repertoire/tools-session.js +739 -0
- package/dist/repertoire/tools-shell.js +120 -0
- package/dist/repertoire/tools-stripe.js +180 -0
- package/dist/repertoire/tools-surface.js +243 -0
- package/dist/repertoire/tools-teams.js +64 -61
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-user-profile.js +144 -0
- package/dist/repertoire/tools-vault.js +40 -0
- package/dist/repertoire/tools.js +149 -98
- package/dist/repertoire/travel-api-client.js +360 -0
- package/dist/repertoire/user-profile.js +118 -0
- package/dist/repertoire/vault-setup.js +246 -0
- package/dist/repertoire/vault-unlock.js +382 -0
- package/dist/scripts/claude-code-hook.js +41 -0
- package/dist/scripts/claude-code-stop-hook.js +47 -0
- package/dist/senses/attention-queue.js +116 -0
- package/dist/senses/bluebubbles/attachment-cache.js +53 -0
- package/dist/senses/bluebubbles/attachment-download.js +137 -0
- package/dist/senses/bluebubbles/client.js +685 -0
- package/dist/senses/bluebubbles/entry.js +70 -0
- package/dist/senses/bluebubbles/inbound-log.js +113 -0
- package/dist/senses/bluebubbles/index.js +1620 -0
- package/dist/senses/bluebubbles/media.js +389 -0
- package/dist/senses/bluebubbles/model.js +282 -0
- package/dist/senses/bluebubbles/mutation-log.js +116 -0
- package/dist/senses/bluebubbles/replay.js +129 -0
- package/dist/senses/bluebubbles/runtime-state.js +109 -0
- package/dist/senses/bluebubbles/session-cleanup.js +72 -0
- package/dist/senses/cli/bracketed-paste.js +82 -0
- package/dist/senses/cli/image-paste.js +287 -0
- package/dist/senses/cli/image-ref-navigation.js +75 -0
- package/dist/senses/cli/ink-app.js +156 -0
- package/dist/senses/cli/inline-diff.js +64 -0
- package/dist/senses/cli/input-keys.js +174 -0
- package/dist/senses/cli/kill-ring.js +86 -0
- package/dist/senses/cli/message-list.js +51 -0
- package/dist/senses/cli/ouro-tui.js +605 -0
- package/dist/senses/cli/spinner-imperative.js +135 -0
- package/dist/senses/cli/spinner.js +101 -0
- package/dist/senses/cli/status-line.js +60 -0
- package/dist/senses/cli/streaming-markdown.js +526 -0
- package/dist/senses/cli/tool-display.js +83 -0
- package/dist/senses/cli/tool-render.js +85 -0
- package/dist/senses/cli/tui-store.js +240 -0
- package/dist/senses/cli/virtual-list.js +35 -0
- package/dist/senses/cli-entry.js +60 -8
- package/dist/senses/cli-layout.js +187 -0
- package/dist/senses/cli.js +768 -264
- package/dist/senses/commands.js +66 -3
- package/dist/senses/continuity.js +94 -0
- package/dist/senses/habit-turn-message.js +108 -0
- package/dist/senses/inner-dialog-worker.js +112 -19
- package/dist/senses/inner-dialog.js +636 -86
- package/dist/senses/pipeline.js +602 -0
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +205 -0
- package/dist/senses/surface-tool.js +68 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +844 -197
- package/dist/senses/trust-gate.js +112 -2
- package/package.json +38 -6
- package/skills/agent-commerce.md +106 -0
- package/skills/browser-navigation.md +110 -0
- package/skills/commerce-setup-guide.md +116 -0
- package/skills/commerce-setup.md +84 -0
- package/skills/configure-dev-tools.md +101 -0
- package/skills/travel-planning.md +134 -0
- package/AdoptionSpecialist.ouro/agent.json +0 -20
- package/AdoptionSpecialist.ouro/psyche/SOUL.md +0 -22
- package/dist/heart/daemon/subagent-installer.js +0 -125
- package/dist/inner-worker-entry.js +0 -4
- package/dist/mind/associative-recall.js +0 -197
- package/subagents/README.md +0 -73
- package/subagents/work-doer.md +0 -233
- package/subagents/work-merger.md +0 -624
- package/subagents/work-planner.md +0 -373
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Configure Dev Tools for MCP Agent Bridge
|
|
2
|
+
|
|
3
|
+
Set up your development tools (Claude Code, Codex) to communicate with Ouroboros agents via MCP. One command does everything — including cross-platform WSL2 bridging on Windows.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
### Claude Code
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
ouro setup --tool claude-code --agent <agent-name>
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
This command:
|
|
14
|
+
1. Registers the MCP server with Claude Code via `claude mcp add`
|
|
15
|
+
2. Configures lifecycle hooks (SessionStart, Stop, PostToolUse) for passive awareness
|
|
16
|
+
3. Detects dev vs installed mode automatically and uses the correct command path
|
|
17
|
+
|
|
18
|
+
**On WSL2 (Windows):** The command automatically detects the WSL environment and:
|
|
19
|
+
- Calls `claude.exe` (the Windows binary) instead of `claude`
|
|
20
|
+
- Prefixes MCP serve and hook commands with `wsl` so Windows-side Claude Code spawns them through WSL
|
|
21
|
+
- Resolves the Windows-side home directory and writes config to the Windows-side `~/.claude/`
|
|
22
|
+
- After setup, open Claude Code in PowerShell — the agent is there
|
|
23
|
+
|
|
24
|
+
**On native Windows (no WSL):** Not yet supported. The command prints a message directing you to install WSL2.
|
|
25
|
+
|
|
26
|
+
For the full cross-machine setup flow (including cloning an agent to a new machine), see `docs/cross-machine-setup.md` in the harness repo.
|
|
27
|
+
|
|
28
|
+
### Codex
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
ouro setup --tool codex --agent <agent-name>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
This command:
|
|
35
|
+
1. Registers the MCP server with Codex via `codex mcp add`
|
|
36
|
+
2. Detects dev vs installed mode automatically
|
|
37
|
+
|
|
38
|
+
## Verification
|
|
39
|
+
|
|
40
|
+
After setup, verify the connection:
|
|
41
|
+
|
|
42
|
+
1. **Check daemon is running**: `ouro up` (installed) or `ouro dev --repo-path <path>` (dev mode).
|
|
43
|
+
2. **Test from Claude Code**: Start a new session and use the `status` tool.
|
|
44
|
+
3. **Test from Codex**: Run `codex exec "Use the <agent-name> status tool"`.
|
|
45
|
+
4. **Check registration**: `claude mcp list` or `codex mcp list`.
|
|
46
|
+
|
|
47
|
+
## Available MCP Tools
|
|
48
|
+
|
|
49
|
+
Once connected, these tools are available:
|
|
50
|
+
|
|
51
|
+
### Conversation tools (new)
|
|
52
|
+
- **send_message** -- Send a message and get a synchronous agent response (full turn with tools)
|
|
53
|
+
- **check_response** -- Check for pending messages from the agent (after ponder or proactive surface)
|
|
54
|
+
|
|
55
|
+
### Read-only tools
|
|
56
|
+
- **ask** -- Ask the agent a question (uses diary, journal, and context)
|
|
57
|
+
- **status** -- Get agent's current status and activity
|
|
58
|
+
- **catchup** -- Get recent activity summary
|
|
59
|
+
- **get_context** -- Get agent's current working context
|
|
60
|
+
- **search_notes** -- Search the agent's diary for specific topics
|
|
61
|
+
- **get_task** -- Get details of the agent's current task
|
|
62
|
+
- **check_scope** -- Verify if something is in scope for current work
|
|
63
|
+
- **check_guidance** -- Get guidance on how to approach something
|
|
64
|
+
|
|
65
|
+
### Write tools
|
|
66
|
+
- **delegate** -- Request the agent to handle a task (runs full conversation turn)
|
|
67
|
+
- **request_decision** -- Ask agent to make a decision about something
|
|
68
|
+
- **report_progress** -- Report progress on delegated work
|
|
69
|
+
- **report_blocker** -- Report a blocker on delegated work
|
|
70
|
+
- **report_complete** -- Report completion of delegated work
|
|
71
|
+
|
|
72
|
+
## Troubleshooting
|
|
73
|
+
|
|
74
|
+
### "Daemon not running" error
|
|
75
|
+
Most read-only tools work without the daemon (reads filesystem directly). For write operations and `send_message`, start the daemon with `ouro up` or `ouro dev`.
|
|
76
|
+
|
|
77
|
+
### MCP server not appearing
|
|
78
|
+
- Run `claude mcp list` or `codex mcp list` to verify registration
|
|
79
|
+
- Re-run `ouro setup` to fix
|
|
80
|
+
- Restart your dev tool (MCP loads at session start)
|
|
81
|
+
|
|
82
|
+
### Connection timeouts
|
|
83
|
+
- Ensure `dist/` is built: `npm run build`
|
|
84
|
+
- Check that the entry point path is correct (setup auto-detects this)
|
|
85
|
+
|
|
86
|
+
### WSL2-specific issues
|
|
87
|
+
|
|
88
|
+
**`claude.exe` not found** — Windows executables must be accessible from WSL. This is the default, but enterprise environments may disable it via `/etc/wsl.conf` setting `appendWindowsPath = false`. Check with `which claude.exe`. If missing, add Claude Code's install directory to WSL's PATH manually or update `wsl.conf`.
|
|
89
|
+
|
|
90
|
+
**`cmd.exe` or `wslpath` fails** — The setup command resolves the Windows home directory using `cmd.exe /C echo %USERPROFILE%` piped through `wslpath`. If either is unavailable, the setup will fail. `wslpath` ships with all standard WSL distributions. `cmd.exe` requires Windows executables to be on PATH (see above).
|
|
91
|
+
|
|
92
|
+
**MCP server hangs or returns empty** — The MCP server runs inside WSL via `wsl ouro mcp-serve --agent <name>`. If stdio piping between Windows and WSL is broken, check that the WSL distribution is running (`wsl --status`) and that no other process has claimed stdin.
|
|
93
|
+
|
|
94
|
+
**Hooks not firing** — Claude Code hooks use `wsl ouro hook <event> --agent <name>`. If hooks fail silently, check that `ouro` is on PATH inside WSL (run `wsl ouro --version` from PowerShell to verify).
|
|
95
|
+
|
|
96
|
+
### Removing
|
|
97
|
+
```bash
|
|
98
|
+
claude mcp remove ouro-<agent-name>
|
|
99
|
+
# or
|
|
100
|
+
codex mcp remove ouro-<agent-name>
|
|
101
|
+
```
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# Travel Planning Skill
|
|
2
|
+
|
|
3
|
+
Compose all travel infrastructure to plan and book trips effectively.
|
|
4
|
+
|
|
5
|
+
## Research Phase
|
|
6
|
+
|
|
7
|
+
### Destination Research
|
|
8
|
+
1. Use `geocode_search` to find candidate destinations and get coordinates
|
|
9
|
+
2. Use `weather_lookup` to check climate for travel dates
|
|
10
|
+
3. Use `travel_advisory` to check US State Dept safety levels (1-4):
|
|
11
|
+
- Level 1: Exercise Normal Precautions
|
|
12
|
+
- Level 2: Exercise Increased Caution
|
|
13
|
+
- Level 3: Reconsider Travel
|
|
14
|
+
- Level 4: Do Not Travel
|
|
15
|
+
4. Use browser tools (see `browser-navigation` skill) for destination reviews, travel blogs, local tips
|
|
16
|
+
5. Compare multiple destinations on weather, safety, cost, and flight availability
|
|
17
|
+
|
|
18
|
+
### Information Gathering Workflow
|
|
19
|
+
```
|
|
20
|
+
geocode_search -> get coordinates
|
|
21
|
+
weather_lookup -> check weather at coordinates
|
|
22
|
+
travel_advisory -> check safety level
|
|
23
|
+
browser tools -> reviews, local info, pricing
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Flight Search
|
|
27
|
+
|
|
28
|
+
### Using Duffel MCP (when available)
|
|
29
|
+
- Search via `duffel_search_flights` tool (first-class MCP tool)
|
|
30
|
+
- Provide: origin, destination, dates, passengers, cabin class
|
|
31
|
+
- Compare options on price, duration, stops, airline
|
|
32
|
+
|
|
33
|
+
### Using Browser (fallback)
|
|
34
|
+
- Use browser-navigation skill patterns for Google Flights, airline sites
|
|
35
|
+
- Add delays between searches to avoid detection
|
|
36
|
+
|
|
37
|
+
### Comparison Criteria
|
|
38
|
+
Present top 3-5 options comparing:
|
|
39
|
+
- Total price (including bags, seat selection)
|
|
40
|
+
- Duration and number of stops
|
|
41
|
+
- Airline and aircraft
|
|
42
|
+
- Departure/arrival times
|
|
43
|
+
- Cancellation/change policy
|
|
44
|
+
|
|
45
|
+
## Accommodation Search
|
|
46
|
+
|
|
47
|
+
### Hotel Search
|
|
48
|
+
- Use Expedia MCP when available (`expedia_search_hotels` tool)
|
|
49
|
+
- Compare: price per night, total stay cost, location, rating, amenities
|
|
50
|
+
- Check cancellation policies (crucial for travel planning)
|
|
51
|
+
|
|
52
|
+
### Vacation Rentals (Browser-based)
|
|
53
|
+
- Use browser-navigation skill for Airbnb/VRBO
|
|
54
|
+
- Search by location, dates, guests, budget
|
|
55
|
+
- Compare: price, location proximity, reviews, amenities, host rating
|
|
56
|
+
- Screenshot listings for user review
|
|
57
|
+
|
|
58
|
+
### Comparison Criteria
|
|
59
|
+
- Price per night and total cost
|
|
60
|
+
- Location (distance to key attractions/activities)
|
|
61
|
+
- Reviews and ratings
|
|
62
|
+
- Amenities (WiFi, kitchen, parking, pool)
|
|
63
|
+
- Cancellation flexibility
|
|
64
|
+
|
|
65
|
+
## Booking Workflow
|
|
66
|
+
|
|
67
|
+
### Critical Safety Gates
|
|
68
|
+
- **ALWAYS confirm with user before any booking action**
|
|
69
|
+
- **ALWAYS confirm before entering payment information**
|
|
70
|
+
- **ALWAYS confirm before agreeing to terms**
|
|
71
|
+
- **Never proceed with a financial commitment without explicit approval**
|
|
72
|
+
|
|
73
|
+
### Credential Handling
|
|
74
|
+
|
|
75
|
+
Credentials are managed through the credential access layer, which stores
|
|
76
|
+
agent-owned secrets in the agent's Bitwarden/Vaultwarden credential vault.
|
|
77
|
+
Raw passwords never enter model context.
|
|
78
|
+
|
|
79
|
+
- Use `credential_get` to check what credentials exist for a domain (metadata only, never passwords)
|
|
80
|
+
- Use `credential_store` to save credentials the agent acquired (e.g., during sign-up for a service)
|
|
81
|
+
- The credential gateway automatically injects secrets into API requests via `getRawSecret()`
|
|
82
|
+
- Use browser-navigation skill form patterns for entering credentials during interactive sessions
|
|
83
|
+
|
|
84
|
+
**How credentials work:**
|
|
85
|
+
- Agent-owned credentials live in the agent's Bitwarden/Vaultwarden vault
|
|
86
|
+
- Travel credentials such as Duffel and Stripe are ordinary vault credential items
|
|
87
|
+
- The agent can sign up for services and store its own credentials
|
|
88
|
+
- Stored passwords are never returned to the model — only metadata (domain, username, notes)
|
|
89
|
+
|
|
90
|
+
### Post-Booking
|
|
91
|
+
- Save confirmation details (confirmation number, dates, hotel name, airline, booking reference)
|
|
92
|
+
- Save to diary/journal for future reference
|
|
93
|
+
- Set reminders for check-in windows
|
|
94
|
+
- Note cancellation deadlines
|
|
95
|
+
|
|
96
|
+
## Preference Management
|
|
97
|
+
|
|
98
|
+
### Storing Preferences
|
|
99
|
+
Track and reference these travel preferences:
|
|
100
|
+
- Preferred airlines and alliance status
|
|
101
|
+
- Preferred hotel chains and loyalty numbers
|
|
102
|
+
- Seat preferences (window/aisle, extra legroom)
|
|
103
|
+
- Dietary needs for in-flight meals
|
|
104
|
+
- Budget ranges (per night for hotels, per flight)
|
|
105
|
+
- Must-have amenities (WiFi, gym, pool)
|
|
106
|
+
|
|
107
|
+
### Using Preferences
|
|
108
|
+
- Reference stored preferences when searching
|
|
109
|
+
- Apply airline preferences to flight comparisons
|
|
110
|
+
- Apply hotel brand preferences to accommodation searches
|
|
111
|
+
- Adjust budget ranges based on destination
|
|
112
|
+
|
|
113
|
+
## Tool Reference
|
|
114
|
+
|
|
115
|
+
### Native Tools (always available)
|
|
116
|
+
- `weather_lookup` - Current weather and daily forecast by city or coordinates (Open-Meteo, zero config)
|
|
117
|
+
- `travel_advisory` - US State Dept advisory by country code
|
|
118
|
+
- `geocode_search` - Location/POI search with coordinates
|
|
119
|
+
- `credential_get` - Check credential metadata for a domain (never returns passwords)
|
|
120
|
+
- `credential_store` - Store credentials the agent acquired (family trust, confirmation required)
|
|
121
|
+
- `credential_list` - List stored credential domains
|
|
122
|
+
- `credential_delete` - Delete stored credentials (family trust, confirmation required)
|
|
123
|
+
|
|
124
|
+
### MCP Tools (when configured)
|
|
125
|
+
- Browser tools via `@playwright/mcp` - see `browser-navigation` skill
|
|
126
|
+
- Duffel flight search (when MCP server available)
|
|
127
|
+
- Expedia hotel search (when MCP server available)
|
|
128
|
+
|
|
129
|
+
### Human Confirmation Required For
|
|
130
|
+
- Any booking or payment
|
|
131
|
+
- Entering personal information
|
|
132
|
+
- Agreeing to terms of service
|
|
133
|
+
- Creating financial obligations
|
|
134
|
+
- Sharing credentials with third parties
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 1,
|
|
3
|
-
"enabled": false,
|
|
4
|
-
"provider": "anthropic",
|
|
5
|
-
"context": {
|
|
6
|
-
"maxTokens": 80000,
|
|
7
|
-
"contextMargin": 20
|
|
8
|
-
},
|
|
9
|
-
"phrases": {
|
|
10
|
-
"thinking": [
|
|
11
|
-
"matching hatchlings"
|
|
12
|
-
],
|
|
13
|
-
"tool": [
|
|
14
|
-
"checking adoption notes"
|
|
15
|
-
],
|
|
16
|
-
"followup": [
|
|
17
|
-
"finalizing hatch plan"
|
|
18
|
-
]
|
|
19
|
-
}
|
|
20
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
# Adoption Specialist Soul
|
|
2
|
-
|
|
3
|
-
I help humans hatch new agent partners.
|
|
4
|
-
|
|
5
|
-
## Core contract
|
|
6
|
-
- I run a practical adoption interview to understand the human, their work, and constraints.
|
|
7
|
-
- I can migrate useful context from existing agent systems when the human asks.
|
|
8
|
-
- I explain where the hatchling bundle lives on disk and what was created.
|
|
9
|
-
- I use the configured provider and I verify credentials before hatch flow continues.
|
|
10
|
-
- I am professional, concise, and warm. I guide without overwhelming.
|
|
11
|
-
|
|
12
|
-
## Hatch flow
|
|
13
|
-
1. Confirm provider setup and usable credentials.
|
|
14
|
-
2. Interview for goals, style, and operating context.
|
|
15
|
-
3. Synthesize a concrete hatchling identity and bootstrap files.
|
|
16
|
-
4. Create canonical bundle structure with required defaults.
|
|
17
|
-
5. Introduce the hatchling and hand off clearly.
|
|
18
|
-
|
|
19
|
-
## Filesystem orientation
|
|
20
|
-
- Bundles live at `~/AgentBundles/<Name>.ouro/`.
|
|
21
|
-
- Secrets live at `~/.agentsecrets/<name>/secrets.json`.
|
|
22
|
-
- I tell the human exactly where their hatchling was created.
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.installSubagentsForAvailableCli = installSubagentsForAvailableCli;
|
|
37
|
-
const fs = __importStar(require("fs"));
|
|
38
|
-
const os = __importStar(require("os"));
|
|
39
|
-
const path = __importStar(require("path"));
|
|
40
|
-
const child_process_1 = require("child_process");
|
|
41
|
-
const runtime_1 = require("../../nerves/runtime");
|
|
42
|
-
function detectCliBinary(binary) {
|
|
43
|
-
const result = (0, child_process_1.spawnSync)("which", [binary], { encoding: "utf-8" });
|
|
44
|
-
if (result.status !== 0)
|
|
45
|
-
return null;
|
|
46
|
-
const resolved = result.stdout.trim();
|
|
47
|
-
return resolved.length > 0 ? resolved : null;
|
|
48
|
-
}
|
|
49
|
-
function listSubagentSources(subagentsDir) {
|
|
50
|
-
if (!fs.existsSync(subagentsDir))
|
|
51
|
-
return [];
|
|
52
|
-
return fs.readdirSync(subagentsDir)
|
|
53
|
-
.filter((name) => name.endsWith(".md"))
|
|
54
|
-
.filter((name) => name !== "README.md")
|
|
55
|
-
.map((name) => path.join(subagentsDir, name))
|
|
56
|
-
.sort((a, b) => a.localeCompare(b));
|
|
57
|
-
}
|
|
58
|
-
function ensureSymlink(source, target) {
|
|
59
|
-
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
60
|
-
if (fs.existsSync(target)) {
|
|
61
|
-
const stats = fs.lstatSync(target);
|
|
62
|
-
if (stats.isSymbolicLink()) {
|
|
63
|
-
const linkedPath = fs.readlinkSync(target);
|
|
64
|
-
if (linkedPath === source)
|
|
65
|
-
return false;
|
|
66
|
-
}
|
|
67
|
-
fs.unlinkSync(target);
|
|
68
|
-
}
|
|
69
|
-
fs.symlinkSync(source, target);
|
|
70
|
-
return true;
|
|
71
|
-
}
|
|
72
|
-
async function installSubagentsForAvailableCli(options = {}) {
|
|
73
|
-
const repoRoot = options.repoRoot ?? path.resolve(__dirname, "..", "..", "..");
|
|
74
|
-
const homeDir = options.homeDir ?? os.homedir();
|
|
75
|
-
const which = options.which ?? detectCliBinary;
|
|
76
|
-
const subagentsDir = path.join(repoRoot, "subagents");
|
|
77
|
-
const sources = listSubagentSources(subagentsDir);
|
|
78
|
-
const notes = [];
|
|
79
|
-
(0, runtime_1.emitNervesEvent)({
|
|
80
|
-
component: "daemon",
|
|
81
|
-
event: "daemon.subagent_install_start",
|
|
82
|
-
message: "starting subagent auto-install",
|
|
83
|
-
meta: { sources: sources.length },
|
|
84
|
-
});
|
|
85
|
-
if (sources.length === 0) {
|
|
86
|
-
notes.push(`no subagent files found at ${subagentsDir}`);
|
|
87
|
-
return { claudeInstalled: 0, codexInstalled: 0, notes };
|
|
88
|
-
}
|
|
89
|
-
let claudeInstalled = 0;
|
|
90
|
-
let codexInstalled = 0;
|
|
91
|
-
const claudePath = which("claude");
|
|
92
|
-
if (!claudePath) {
|
|
93
|
-
notes.push("claude CLI not found; skipping subagent install");
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
const claudeAgentsDir = path.join(homeDir, ".claude", "agents");
|
|
97
|
-
for (const source of sources) {
|
|
98
|
-
const target = path.join(claudeAgentsDir, path.basename(source));
|
|
99
|
-
if (ensureSymlink(source, target)) {
|
|
100
|
-
claudeInstalled += 1;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
const codexPath = which("codex");
|
|
105
|
-
if (!codexPath) {
|
|
106
|
-
notes.push("codex CLI not found; skipping subagent install");
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
const codexSkillsDir = path.join(homeDir, ".codex", "skills");
|
|
110
|
-
for (const source of sources) {
|
|
111
|
-
const skillName = path.basename(source, ".md");
|
|
112
|
-
const target = path.join(codexSkillsDir, skillName, "SKILL.md");
|
|
113
|
-
if (ensureSymlink(source, target)) {
|
|
114
|
-
codexInstalled += 1;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
(0, runtime_1.emitNervesEvent)({
|
|
119
|
-
component: "daemon",
|
|
120
|
-
event: "daemon.subagent_install_end",
|
|
121
|
-
message: "completed subagent auto-install",
|
|
122
|
-
meta: { claudeInstalled, codexInstalled, notes: notes.length },
|
|
123
|
-
});
|
|
124
|
-
return { claudeInstalled, codexInstalled, notes };
|
|
125
|
-
}
|
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.cosineSimilarity = cosineSimilarity;
|
|
37
|
-
exports.recallFactsForQuery = recallFactsForQuery;
|
|
38
|
-
exports.injectAssociativeRecall = injectAssociativeRecall;
|
|
39
|
-
const fs = __importStar(require("fs"));
|
|
40
|
-
const path = __importStar(require("path"));
|
|
41
|
-
const config_1 = require("../heart/config");
|
|
42
|
-
const identity_1 = require("../heart/identity");
|
|
43
|
-
const runtime_1 = require("../nerves/runtime");
|
|
44
|
-
const DEFAULT_EMBEDDING_MODEL = "text-embedding-3-small";
|
|
45
|
-
const DEFAULT_MIN_SCORE = 0.5;
|
|
46
|
-
const DEFAULT_TOP_K = 3;
|
|
47
|
-
class OpenAIEmbeddingProvider {
|
|
48
|
-
apiKey;
|
|
49
|
-
model;
|
|
50
|
-
constructor(apiKey, model = DEFAULT_EMBEDDING_MODEL) {
|
|
51
|
-
this.apiKey = apiKey;
|
|
52
|
-
this.model = model;
|
|
53
|
-
}
|
|
54
|
-
async embed(texts) {
|
|
55
|
-
const response = await fetch("https://api.openai.com/v1/embeddings", {
|
|
56
|
-
method: "POST",
|
|
57
|
-
headers: {
|
|
58
|
-
Authorization: `Bearer ${this.apiKey}`,
|
|
59
|
-
"Content-Type": "application/json",
|
|
60
|
-
},
|
|
61
|
-
body: JSON.stringify({
|
|
62
|
-
model: this.model,
|
|
63
|
-
input: texts,
|
|
64
|
-
}),
|
|
65
|
-
});
|
|
66
|
-
if (!response.ok) {
|
|
67
|
-
throw new Error(`embedding request failed: ${response.status} ${response.statusText}`);
|
|
68
|
-
}
|
|
69
|
-
const payload = (await response.json());
|
|
70
|
-
if (!payload.data || payload.data.length !== texts.length) {
|
|
71
|
-
throw new Error("embedding response missing expected vectors");
|
|
72
|
-
}
|
|
73
|
-
return payload.data.map((entry) => entry.embedding);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
function createDefaultProvider() {
|
|
77
|
-
const apiKey = (0, config_1.getOpenAIEmbeddingsApiKey)();
|
|
78
|
-
if (!apiKey) {
|
|
79
|
-
throw new Error("openaiEmbeddingsApiKey not configured");
|
|
80
|
-
}
|
|
81
|
-
return new OpenAIEmbeddingProvider(apiKey);
|
|
82
|
-
}
|
|
83
|
-
function readFacts(memoryRoot) {
|
|
84
|
-
const factsPath = path.join(memoryRoot, "facts.jsonl");
|
|
85
|
-
if (!fs.existsSync(factsPath))
|
|
86
|
-
return [];
|
|
87
|
-
const raw = fs.readFileSync(factsPath, "utf8").trim();
|
|
88
|
-
if (!raw)
|
|
89
|
-
return [];
|
|
90
|
-
return raw.split("\n").map((line) => JSON.parse(line));
|
|
91
|
-
}
|
|
92
|
-
function getLatestUserText(messages) {
|
|
93
|
-
for (let i = messages.length - 1; i >= 0; i--) {
|
|
94
|
-
const message = messages[i];
|
|
95
|
-
if (message.role !== "user")
|
|
96
|
-
continue;
|
|
97
|
-
if (typeof message.content !== "string")
|
|
98
|
-
continue;
|
|
99
|
-
const text = message.content.trim();
|
|
100
|
-
if (text.length > 0)
|
|
101
|
-
return text;
|
|
102
|
-
}
|
|
103
|
-
return "";
|
|
104
|
-
}
|
|
105
|
-
function cosineSimilarity(left, right) {
|
|
106
|
-
if (left.length === 0 || right.length === 0 || left.length !== right.length)
|
|
107
|
-
return 0;
|
|
108
|
-
let dot = 0;
|
|
109
|
-
let leftNorm = 0;
|
|
110
|
-
let rightNorm = 0;
|
|
111
|
-
for (let i = 0; i < left.length; i++) {
|
|
112
|
-
dot += left[i] * right[i];
|
|
113
|
-
leftNorm += left[i] * left[i];
|
|
114
|
-
rightNorm += right[i] * right[i];
|
|
115
|
-
}
|
|
116
|
-
if (leftNorm === 0 || rightNorm === 0)
|
|
117
|
-
return 0;
|
|
118
|
-
return dot / (Math.sqrt(leftNorm) * Math.sqrt(rightNorm));
|
|
119
|
-
}
|
|
120
|
-
async function recallFactsForQuery(query, facts, provider, options) {
|
|
121
|
-
const trimmed = query.trim();
|
|
122
|
-
if (!trimmed)
|
|
123
|
-
return [];
|
|
124
|
-
const minScore = options?.minScore ?? DEFAULT_MIN_SCORE;
|
|
125
|
-
const topK = options?.topK ?? DEFAULT_TOP_K;
|
|
126
|
-
const [queryEmbedding] = await provider.embed([trimmed]);
|
|
127
|
-
return facts
|
|
128
|
-
.map((fact) => ({
|
|
129
|
-
...fact,
|
|
130
|
-
score: cosineSimilarity(queryEmbedding, fact.embedding),
|
|
131
|
-
}))
|
|
132
|
-
.filter((fact) => fact.score >= minScore)
|
|
133
|
-
.sort((left, right) => right.score - left.score)
|
|
134
|
-
.slice(0, topK);
|
|
135
|
-
}
|
|
136
|
-
async function injectAssociativeRecall(messages, options) {
|
|
137
|
-
try {
|
|
138
|
-
if (messages[0]?.role !== "system" || typeof messages[0].content !== "string")
|
|
139
|
-
return;
|
|
140
|
-
const query = getLatestUserText(messages);
|
|
141
|
-
if (!query)
|
|
142
|
-
return;
|
|
143
|
-
const memoryRoot = options?.memoryRoot ?? path.join((0, identity_1.getAgentRoot)(), "psyche", "memory");
|
|
144
|
-
const facts = readFacts(memoryRoot);
|
|
145
|
-
if (facts.length === 0)
|
|
146
|
-
return;
|
|
147
|
-
let recalled;
|
|
148
|
-
try {
|
|
149
|
-
const provider = options?.provider ?? createDefaultProvider();
|
|
150
|
-
recalled = await recallFactsForQuery(query, facts, provider, options);
|
|
151
|
-
}
|
|
152
|
-
catch {
|
|
153
|
-
// Embeddings unavailable — fall back to substring matching
|
|
154
|
-
const lowerQuery = query.toLowerCase();
|
|
155
|
-
const topK = options?.topK ?? DEFAULT_TOP_K;
|
|
156
|
-
recalled = facts
|
|
157
|
-
.filter((fact) => fact.text.toLowerCase().includes(lowerQuery))
|
|
158
|
-
.slice(0, topK)
|
|
159
|
-
.map((fact) => ({ ...fact, score: 1 }));
|
|
160
|
-
if (recalled.length > 0) {
|
|
161
|
-
(0, runtime_1.emitNervesEvent)({
|
|
162
|
-
level: "warn",
|
|
163
|
-
component: "mind",
|
|
164
|
-
event: "mind.associative_recall_fallback",
|
|
165
|
-
message: "embeddings unavailable, used substring fallback",
|
|
166
|
-
meta: { matchCount: recalled.length },
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
if (recalled.length === 0)
|
|
171
|
-
return;
|
|
172
|
-
const recallSection = recalled
|
|
173
|
-
.map((fact, index) => `${index + 1}. ${fact.text} [score=${fact.score.toFixed(3)} source=${fact.source}]`)
|
|
174
|
-
.join("\n");
|
|
175
|
-
messages[0] = {
|
|
176
|
-
role: "system",
|
|
177
|
-
content: `${messages[0].content}\n\n## recalled context\n${recallSection}`,
|
|
178
|
-
};
|
|
179
|
-
(0, runtime_1.emitNervesEvent)({
|
|
180
|
-
component: "mind",
|
|
181
|
-
event: "mind.associative_recall",
|
|
182
|
-
message: "associative recall injected",
|
|
183
|
-
meta: { count: recalled.length },
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
catch (error) {
|
|
187
|
-
(0, runtime_1.emitNervesEvent)({
|
|
188
|
-
level: "warn",
|
|
189
|
-
component: "mind",
|
|
190
|
-
event: "mind.associative_recall_error",
|
|
191
|
-
message: "associative recall failed",
|
|
192
|
-
meta: {
|
|
193
|
-
reason: error instanceof Error ? error.message : String(error),
|
|
194
|
-
},
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
}
|
package/subagents/README.md
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
# Sub-agents
|
|
2
|
-
|
|
3
|
-
These are source-of-truth workflow definitions (`work-planner`, `work-doer`, `work-merger`) for planning, execution, and merge. They can be consumed either as Claude sub-agents (`.md` files with YAML frontmatter) or as Codex-style skills (`SKILL.md`).
|
|
4
|
-
|
|
5
|
-
## Installation
|
|
6
|
-
|
|
7
|
-
### Claude Code (sub-agents)
|
|
8
|
-
|
|
9
|
-
Copy or symlink these files into Claude's sub-agent directory:
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
# Claude Code
|
|
13
|
-
cp subagents/*.md ~/.claude/agents/
|
|
14
|
-
# or
|
|
15
|
-
ln -s "$(pwd)"/subagents/*.md ~/.claude/agents/
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
### Codex / skill-based harnesses
|
|
19
|
-
|
|
20
|
-
For tools that support skills but not Claude sub-agents, install these as skills:
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
mkdir -p ~/.codex/skills/work-planner ~/.codex/skills/work-doer ~/.codex/skills/work-merger
|
|
24
|
-
|
|
25
|
-
# Hard-link to keep one source of truth
|
|
26
|
-
ln -f "$(pwd)/subagents/work-planner.md" ~/.codex/skills/work-planner/SKILL.md
|
|
27
|
-
ln -f "$(pwd)/subagents/work-doer.md" ~/.codex/skills/work-doer/SKILL.md
|
|
28
|
-
ln -f "$(pwd)/subagents/work-merger.md" ~/.codex/skills/work-merger/SKILL.md
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
**Important:** Hard-links break when editors save by replacing the file (new inode). After editing any `subagents/*.md` file, re-run the `ln -f` command for that file to restore the link. You can verify with `stat -f '%i'` — both files should share the same inode.
|
|
32
|
-
|
|
33
|
-
Optional UI metadata:
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
mkdir -p ~/.codex/skills/work-planner/agents ~/.codex/skills/work-doer/agents ~/.codex/skills/work-merger/agents
|
|
37
|
-
cat > ~/.codex/skills/work-planner/agents/openai.yaml << 'EOF'
|
|
38
|
-
interface:
|
|
39
|
-
display_name: "Work Planner"
|
|
40
|
-
short_description: "Create and gate planning/doing task docs"
|
|
41
|
-
default_prompt: "Use $work-planner to create or update a planning doc, then stop at NEEDS_REVIEW."
|
|
42
|
-
EOF
|
|
43
|
-
cat > ~/.codex/skills/work-doer/agents/openai.yaml << 'EOF'
|
|
44
|
-
interface:
|
|
45
|
-
display_name: "Work Doer"
|
|
46
|
-
short_description: "Execute approved doing docs with strict TDD"
|
|
47
|
-
default_prompt: "Use $work-doer to execute an approved doing doc unit by unit."
|
|
48
|
-
EOF
|
|
49
|
-
cat > ~/.codex/skills/work-merger/agents/openai.yaml << 'EOF'
|
|
50
|
-
interface:
|
|
51
|
-
display_name: "Work Merger"
|
|
52
|
-
short_description: "Merge feature branch into main via PR after work-doer completes"
|
|
53
|
-
default_prompt: "Use $work-merger to merge the current feature branch into main."
|
|
54
|
-
EOF
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
Restart the harness after install so new skills are discovered.
|
|
58
|
-
|
|
59
|
-
## Available sub-agents
|
|
60
|
-
|
|
61
|
-
| File | Purpose |
|
|
62
|
-
|------|---------|
|
|
63
|
-
| `work-planner.md` | Interactive task planner. Generates planning docs through conversation, then converts to doing docs after human approval. |
|
|
64
|
-
| `work-doer.md` | Task executor. Reads a doing doc and works through each unit sequentially with strict TDD. |
|
|
65
|
-
| `work-merger.md` | Sync-and-merge agent. Merges feature branch into main via PR after work-doer completes. Handles conflicts, CI failures, and race conditions. |
|
|
66
|
-
|
|
67
|
-
## Workflow
|
|
68
|
-
|
|
69
|
-
1. Human describes a task
|
|
70
|
-
2. Agent invokes **work-planner** to create a planning doc → human approves → planner converts to doing doc
|
|
71
|
-
3. Agent invokes **work-doer** to execute the doing doc unit by unit
|
|
72
|
-
4. Each unit is committed independently with progress tracked in the doing doc
|
|
73
|
-
5. Agent invokes **work-merger** to merge the feature branch into main via PR (fetch, merge, resolve conflicts, CI gate, merge PR, cleanup)
|