@ouro.bot/cli 0.1.0-alpha.36 → 0.1.0-alpha.360
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 +194 -184
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +3 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +1 -1
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
- package/changelog.json +2149 -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 +37 -2
- 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 +463 -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 +53 -21
- package/dist/heart/core.js +743 -252
- package/dist/heart/cross-chat-delivery.js +131 -0
- package/dist/heart/daemon/agent-config-check.js +561 -0
- package/dist/heart/daemon/agent-discovery.js +79 -3
- package/dist/heart/daemon/agent-service.js +360 -0
- package/dist/heart/daemon/agentic-repair.js +185 -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 +591 -0
- package/dist/heart/daemon/cli-exec.js +2649 -0
- package/dist/heart/daemon/cli-help.js +306 -0
- package/dist/heart/daemon/cli-parse.js +913 -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 +30 -1171
- package/dist/heart/daemon/daemon-entry.js +358 -3
- package/dist/heart/daemon/daemon-health.js +141 -0
- package/dist/heart/daemon/daemon-runtime-sync.js +157 -12
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +757 -58
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +465 -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 +115 -1
- 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 +91 -0
- package/dist/heart/daemon/launchd.js +46 -9
- 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 +1 -1
- package/dist/heart/daemon/process-manager.js +201 -0
- package/dist/heart/daemon/provider-discovery.js +140 -0
- package/dist/heart/daemon/pulse.js +475 -0
- package/dist/heart/daemon/run-hooks.js +2 -0
- package/dist/heart/daemon/runtime-logging.js +67 -16
- package/dist/heart/daemon/runtime-metadata.js +101 -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 +72 -3
- 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/{daemon → hatch}/hatch-flow.js +52 -120
- package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
- package/dist/heart/{daemon → hatch}/specialist-prompt.js +10 -7
- package/dist/heart/{daemon → hatch}/specialist-tools.js +56 -10
- package/dist/heart/identity.js +154 -59
- 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 +127 -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/progress-story.js +42 -0
- package/dist/heart/provider-attempt.js +133 -0
- package/dist/heart/provider-binding-resolver.js +240 -0
- package/dist/heart/provider-credential-pool.js +395 -0
- package/dist/heart/provider-failover.js +274 -0
- package/dist/heart/provider-models.js +81 -0
- package/dist/heart/provider-ping.js +227 -0
- package/dist/heart/provider-state.js +208 -0
- package/dist/heart/provider-visibility.js +183 -0
- package/dist/heart/providers/anthropic-token.js +163 -0
- package/dist/heart/providers/anthropic.js +177 -50
- package/dist/heart/providers/azure.js +102 -11
- 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 +28 -6
- package/dist/heart/providers/openai-codex.js +38 -23
- 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 +36 -27
- 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 +362 -0
- package/dist/heart/turn-coordinator.js +28 -0
- package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +1 -1
- package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
- package/dist/heart/versioning/ouro-path-installer.js +296 -0
- package/dist/heart/versioning/ouro-version-manager.js +295 -0
- package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
- package/dist/heart/{daemon → versioning}/update-checker.js +12 -2
- package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
- package/dist/mind/bundle-manifest.js +7 -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 +14 -1
- package/dist/mind/friends/channel.js +56 -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 +9 -1
- 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 +74 -7
- package/dist/mind/prompt.js +1013 -112
- 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 +7 -1
- 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/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-LwChZTgL.css +1 -0
- package/dist/outlook-ui/assets/index-xTdv64BV.js +61 -0
- package/dist/outlook-ui/index.html +15 -0
- package/dist/repertoire/ado-client.js +15 -56
- package/dist/repertoire/ado-semantic.js +11 -10
- package/dist/repertoire/api-client.js +97 -0
- package/dist/repertoire/bitwarden-store.js +319 -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 +197 -30
- package/dist/repertoire/coding/manager.js +158 -9
- package/dist/repertoire/coding/spawner.js +55 -9
- package/dist/repertoire/coding/tools.js +170 -7
- package/dist/repertoire/commerce-errors.js +109 -0
- package/dist/repertoire/commerce-self-test.js +156 -0
- package/dist/repertoire/credential-access.js +527 -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 +375 -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 +316 -0
- package/dist/repertoire/tools-base.js +45 -771
- package/dist/repertoire/tools-bluebubbles.js +1 -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 +12 -62
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-user-profile.js +144 -0
- package/dist/repertoire/tools-vault.js +110 -0
- package/dist/repertoire/tools.js +144 -138
- package/dist/repertoire/travel-api-client.js +360 -0
- package/dist/repertoire/user-profile.js +118 -0
- package/dist/repertoire/vault-setup.js +241 -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 → bluebubbles/client.js} +225 -9
- package/dist/senses/bluebubbles/entry.js +13 -0
- package/dist/senses/bluebubbles/inbound-log.js +113 -0
- package/dist/senses/bluebubbles/index.js +1616 -0
- package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
- package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +43 -12
- package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +46 -6
- package/dist/senses/bluebubbles/replay.js +129 -0
- package/dist/senses/bluebubbles/runtime-state.js +109 -0
- package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
- 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 +1 -1
- package/dist/senses/cli-layout.js +187 -0
- package/dist/senses/cli.js +587 -249
- 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 +633 -86
- package/dist/senses/pipeline.js +603 -0
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +199 -0
- package/dist/senses/surface-tool.js +68 -0
- package/dist/senses/teams.js +690 -160
- package/dist/senses/trust-gate.js +112 -2
- package/package.json +29 -7
- 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 +81 -0
- package/skills/travel-planning.md +138 -0
- package/dist/heart/daemon/ouro-path-installer.js +0 -178
- package/dist/heart/daemon/subagent-installer.js +0 -134
- package/dist/mind/associative-recall.js +0 -197
- package/dist/senses/bluebubbles-entry.js +0 -11
- package/dist/senses/bluebubbles.js +0 -558
- package/dist/senses/debug-activity.js +0 -127
- package/subagents/README.md +0 -73
- package/subagents/work-doer.md +0 -235
- package/subagents/work-merger.md +0 -618
- package/subagents/work-planner.md +0 -382
- /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/monty.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
- /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
- /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
- /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
- /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.buildSpecialistSystemPrompt = buildSpecialistSystemPrompt;
|
|
4
4
|
const runtime_1 = require("../../nerves/runtime");
|
|
5
5
|
/**
|
|
6
|
-
* Build the
|
|
6
|
+
* Build the serpent guide's system prompt from its components.
|
|
7
7
|
* The prompt is written in first person (the specialist's own voice).
|
|
8
8
|
*/
|
|
9
9
|
function buildSpecialistSystemPrompt(soulText, identityText, existingBundles, context) {
|
|
@@ -31,7 +31,7 @@ function buildSpecialistSystemPrompt(soulText, identityText, existingBundles, co
|
|
|
31
31
|
"I am one of thirteen serpent guides who help humans hatch their first agent. The system randomly selected me for this session.",
|
|
32
32
|
"Most humans only go through this process once, so this is likely the only time they'll meet me.",
|
|
33
33
|
"I make this encounter count — warm, memorable, and uniquely mine.",
|
|
34
|
-
"IMPORTANT: I NEVER refer to myself
|
|
34
|
+
"IMPORTANT: I NEVER refer to myself by internal implementation labels — I introduce myself by my own name from my identity.",
|
|
35
35
|
"",
|
|
36
36
|
"## Voice rules",
|
|
37
37
|
"IMPORTANT: I keep every response to 1-3 short sentences. I sound like a friend texting, not a manual.",
|
|
@@ -59,8 +59,10 @@ function buildSpecialistSystemPrompt(soulText, identityText, existingBundles, co
|
|
|
59
59
|
"It also needs an **agent.json** with at minimum:",
|
|
60
60
|
'```json',
|
|
61
61
|
'{',
|
|
62
|
+
' "version": 2,',
|
|
62
63
|
' "name": "AgentName",',
|
|
63
|
-
` "provider": "${context.provider}",`,
|
|
64
|
+
` "humanFacing": { "provider": "${context.provider}", "model": "${context.model}" },`,
|
|
65
|
+
` "agentFacing": { "provider": "${context.provider}", "model": "${context.model}" },`,
|
|
64
66
|
' "enabled": true',
|
|
65
67
|
'}',
|
|
66
68
|
'```',
|
|
@@ -76,23 +78,24 @@ function buildSpecialistSystemPrompt(soulText, identityText, existingBundles, co
|
|
|
76
78
|
"Then I ask what they'd like their agent to help with — one question at a time.",
|
|
77
79
|
"I'm proactive: I suggest ideas and guide them. If they seem unsure, I offer a concrete suggestion.",
|
|
78
80
|
"I don't wait for the human to figure things out — I explain simply what an agent is if needed.",
|
|
81
|
+
"Before finalizing, I offer to collect their phone number and/or Teams email so the new agent can recognize them across channels.",
|
|
79
82
|
"When I have enough context about the agent's personality and purpose:",
|
|
80
83
|
"1. I write all 5 psyche files to the temp directory using write_file",
|
|
81
84
|
"2. I write agent.json to the temp directory using write_file",
|
|
82
85
|
"3. I suggest a PascalCase name for the hatchling and confirm with the human",
|
|
83
86
|
"4. I call complete_adoption with the name and a warm handoff message",
|
|
84
|
-
"5. I call
|
|
87
|
+
"5. I call settle to end the session",
|
|
85
88
|
].join("\n"));
|
|
86
89
|
sections.push([
|
|
87
90
|
"## Tools",
|
|
88
91
|
"- `write_file`: Write a file to disk. Use this to write psyche files and agent.json to the temp directory.",
|
|
89
92
|
"- `read_file`: Read a file from disk. Useful for reviewing existing agent bundles or migration sources.",
|
|
90
93
|
"- `list_directory`: List directory contents. Useful for exploring existing agent bundles.",
|
|
91
|
-
"- I also have the normal local harness tools when useful here, including `shell`, task
|
|
94
|
+
"- I also have the normal local harness tools when useful here, including `shell`, `ouro task create`, `ouro reminder create`, note tools, coding tools, and repo helpers.",
|
|
92
95
|
"- `complete_adoption`: Finalize the bundle. Validates, scaffolds structural dirs, moves to ~/AgentBundles/, writes secrets, plays hatch animation. I call this with `name` (PascalCase) and `handoff_message` (warm message for the human).",
|
|
93
|
-
"- `
|
|
96
|
+
"- `settle`: End the conversation with a final message. I call this after complete_adoption succeeds.",
|
|
94
97
|
"",
|
|
95
|
-
"I must call `
|
|
98
|
+
"I must call `settle` when I am done to end the session cleanly.",
|
|
96
99
|
].join("\n"));
|
|
97
100
|
return sections.join("\n\n");
|
|
98
101
|
}
|
|
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.getSpecialistTools = getSpecialistTools;
|
|
37
37
|
exports.createSpecialistExecTool = createSpecialistExecTool;
|
|
38
|
+
const crypto = __importStar(require("crypto"));
|
|
38
39
|
const fs = __importStar(require("fs"));
|
|
39
40
|
const path = __importStar(require("path"));
|
|
40
41
|
const tools_base_1 = require("../../repertoire/tools-base");
|
|
@@ -58,6 +59,14 @@ const completeAdoptionTool = {
|
|
|
58
59
|
type: "string",
|
|
59
60
|
description: "a warm handoff message to display to the human after the agent is hatched",
|
|
60
61
|
},
|
|
62
|
+
phone: {
|
|
63
|
+
type: "string",
|
|
64
|
+
description: "the human's phone number (optional, for iMessage contact recognition)",
|
|
65
|
+
},
|
|
66
|
+
teams_handle: {
|
|
67
|
+
type: "string",
|
|
68
|
+
description: "the human's Teams email/handle (optional, for Teams contact recognition)",
|
|
69
|
+
},
|
|
61
70
|
},
|
|
62
71
|
required: ["name", "handoff_message"],
|
|
63
72
|
},
|
|
@@ -65,12 +74,23 @@ const completeAdoptionTool = {
|
|
|
65
74
|
};
|
|
66
75
|
const readFileTool = tools_base_1.baseToolDefinitions.find((d) => d.tool.function.name === "read_file");
|
|
67
76
|
const writeFileTool = tools_base_1.baseToolDefinitions.find((d) => d.tool.function.name === "write_file");
|
|
68
|
-
const
|
|
77
|
+
const listDirToolSchema = {
|
|
78
|
+
type: "function",
|
|
79
|
+
function: {
|
|
80
|
+
name: "list_directory",
|
|
81
|
+
description: "list directory contents",
|
|
82
|
+
parameters: {
|
|
83
|
+
type: "object",
|
|
84
|
+
properties: { path: { type: "string" } },
|
|
85
|
+
required: ["path"],
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
};
|
|
69
89
|
/**
|
|
70
90
|
* Returns the specialist's tool schema array.
|
|
71
91
|
*/
|
|
72
92
|
function getSpecialistTools() {
|
|
73
|
-
return [completeAdoptionTool, tools_base_1.
|
|
93
|
+
return [completeAdoptionTool, tools_base_1.settleTool, readFileTool.tool, writeFileTool.tool, listDirToolSchema];
|
|
74
94
|
}
|
|
75
95
|
const PSYCHE_FILES = ["SOUL.md", "IDENTITY.md", "LORE.md", "TACIT.md", "ASPIRATIONS.md"];
|
|
76
96
|
function isPascalCase(name) {
|
|
@@ -85,21 +105,21 @@ function writeReadme(dir, purpose) {
|
|
|
85
105
|
}
|
|
86
106
|
}
|
|
87
107
|
function scaffoldBundle(bundleRoot) {
|
|
88
|
-
writeReadme(path.join(bundleRoot, "
|
|
89
|
-
writeReadme(path.join(bundleRoot, "
|
|
90
|
-
writeReadme(path.join(bundleRoot, "
|
|
108
|
+
writeReadme(path.join(bundleRoot, "notes"), "Persistent notes store.");
|
|
109
|
+
writeReadme(path.join(bundleRoot, "notes", "daily"), "Daily note entries.");
|
|
110
|
+
writeReadme(path.join(bundleRoot, "notes", "archive"), "Archived notes.");
|
|
91
111
|
writeReadme(path.join(bundleRoot, "friends"), "Known friend records.");
|
|
92
112
|
writeReadme(path.join(bundleRoot, "tasks"), "Task files.");
|
|
93
|
-
writeReadme(path.join(bundleRoot, "tasks", "habits"), "Recurring tasks.");
|
|
94
113
|
writeReadme(path.join(bundleRoot, "tasks", "one-shots"), "One-shot tasks.");
|
|
114
|
+
writeReadme(path.join(bundleRoot, "habits"), "Recurring habits and autonomous rhythms.");
|
|
95
115
|
writeReadme(path.join(bundleRoot, "tasks", "ongoing"), "Ongoing tasks.");
|
|
96
116
|
writeReadme(path.join(bundleRoot, "skills"), "Local skill files.");
|
|
97
117
|
writeReadme(path.join(bundleRoot, "senses"), "Sense-specific config.");
|
|
98
118
|
writeReadme(path.join(bundleRoot, "senses", "teams"), "Teams sense config.");
|
|
99
|
-
//
|
|
100
|
-
const
|
|
101
|
-
const factsPath = path.join(
|
|
102
|
-
const entitiesPath = path.join(
|
|
119
|
+
// Notes scaffold files
|
|
120
|
+
const notesRoot = path.join(bundleRoot, "notes");
|
|
121
|
+
const factsPath = path.join(notesRoot, "facts.jsonl");
|
|
122
|
+
const entitiesPath = path.join(notesRoot, "entities.json");
|
|
103
123
|
/* v8 ignore next -- defensive: guard against re-scaffold on existing bundle @preserve */
|
|
104
124
|
if (!fs.existsSync(factsPath))
|
|
105
125
|
fs.writeFileSync(factsPath, "", "utf-8");
|
|
@@ -164,6 +184,32 @@ async function execCompleteAdoption(args, deps) {
|
|
|
164
184
|
}
|
|
165
185
|
return `error: failed to write secrets: ${e instanceof Error ? e.message : /* v8 ignore next -- defensive: non-Error catch branch @preserve */ String(e)}`;
|
|
166
186
|
}
|
|
187
|
+
// Create initial friend record if contact info provided
|
|
188
|
+
const phone = args.phone;
|
|
189
|
+
const teamsHandle = args.teams_handle;
|
|
190
|
+
if (phone || teamsHandle) {
|
|
191
|
+
const friendId = crypto.randomUUID();
|
|
192
|
+
const now = new Date().toISOString();
|
|
193
|
+
const externalIds = [];
|
|
194
|
+
if (phone)
|
|
195
|
+
externalIds.push({ provider: "imessage-handle", externalId: phone, linkedAt: now });
|
|
196
|
+
if (teamsHandle)
|
|
197
|
+
externalIds.push({ provider: "aad", externalId: teamsHandle, linkedAt: now });
|
|
198
|
+
const friendRecord = {
|
|
199
|
+
id: friendId,
|
|
200
|
+
name: deps.humanName ?? "primary",
|
|
201
|
+
trustLevel: "family",
|
|
202
|
+
externalIds,
|
|
203
|
+
tenantMemberships: [],
|
|
204
|
+
toolPreferences: {},
|
|
205
|
+
notes: {},
|
|
206
|
+
createdAt: now,
|
|
207
|
+
updatedAt: now,
|
|
208
|
+
schemaVersion: 1,
|
|
209
|
+
};
|
|
210
|
+
const friendPath = path.join(targetBundle, "friends", `${friendId}.json`);
|
|
211
|
+
fs.writeFileSync(friendPath, JSON.stringify(friendRecord, null, 2), "utf-8");
|
|
212
|
+
}
|
|
167
213
|
// Play hatch animation
|
|
168
214
|
await (0, hatch_animation_1.playHatchAnimation)(name, deps.animationWriter);
|
|
169
215
|
// Display handoff message
|
package/dist/heart/identity.js
CHANGED
|
@@ -33,13 +33,21 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.DEFAULT_AGENT_SENSES = exports.DEFAULT_AGENT_PHRASES = exports.DEFAULT_AGENT_CONTEXT = void 0;
|
|
36
|
+
exports.HARNESS_CANONICAL_REPO_URL = exports.DEFAULT_AGENT_SENSES = exports.DEFAULT_VAULT_SERVER_URL = exports.DEFAULT_AGENT_PHRASES = exports.DEFAULT_AGENT_CONTEXT = exports.PROVIDER_CREDENTIALS = void 0;
|
|
37
|
+
exports.resolveVaultConfig = resolveVaultConfig;
|
|
38
|
+
exports.normalizeSenses = normalizeSenses;
|
|
37
39
|
exports.buildDefaultAgentTemplate = buildDefaultAgentTemplate;
|
|
38
40
|
exports.getAgentName = getAgentName;
|
|
39
41
|
exports.getRepoRoot = getRepoRoot;
|
|
40
42
|
exports.getAgentBundlesRoot = getAgentBundlesRoot;
|
|
41
43
|
exports.getAgentRoot = getAgentRoot;
|
|
42
44
|
exports.getAgentStateRoot = getAgentStateRoot;
|
|
45
|
+
exports.getAgentRepoWorkspacesRoot = getAgentRepoWorkspacesRoot;
|
|
46
|
+
exports.getAgentDaemonStateRoot = getAgentDaemonStateRoot;
|
|
47
|
+
exports.getAgentDaemonLogsDir = getAgentDaemonLogsDir;
|
|
48
|
+
exports.getAgentDaemonLoggingConfigPath = getAgentDaemonLoggingConfigPath;
|
|
49
|
+
exports.getAgentMessagesRoot = getAgentMessagesRoot;
|
|
50
|
+
exports.getAgentToolsRoot = getAgentToolsRoot;
|
|
43
51
|
exports.getAgentSecretsPath = getAgentSecretsPath;
|
|
44
52
|
exports.loadAgentConfig = loadAgentConfig;
|
|
45
53
|
exports.setAgentName = setAgentName;
|
|
@@ -50,6 +58,15 @@ const fs = __importStar(require("fs"));
|
|
|
50
58
|
const os = __importStar(require("os"));
|
|
51
59
|
const path = __importStar(require("path"));
|
|
52
60
|
const runtime_1 = require("../nerves/runtime");
|
|
61
|
+
const migrate_config_1 = require("./migrate-config");
|
|
62
|
+
/** Single source of truth for per-provider credential field names, env var mappings, and prompt labels. */
|
|
63
|
+
exports.PROVIDER_CREDENTIALS = {
|
|
64
|
+
anthropic: { required: ["setupToken"], envVars: { ANTHROPIC_API_KEY: "setupToken" }, promptLabels: { setupToken: "Anthropic setup-token" } },
|
|
65
|
+
"openai-codex": { required: ["oauthAccessToken"], envVars: { OPENAI_API_KEY: "oauthAccessToken" }, promptLabels: { oauthAccessToken: "OpenAI Codex OAuth token" } },
|
|
66
|
+
azure: { required: ["apiKey", "endpoint", "deployment"], envVars: { AZURE_OPENAI_API_KEY: "apiKey", AZURE_OPENAI_KEY: "apiKey", AZURE_OPENAI_ENDPOINT: "endpoint", AZURE_OPENAI_DEPLOYMENT: "deployment" }, promptLabels: { apiKey: "Azure API key", endpoint: "Azure endpoint", deployment: "Azure deployment" } },
|
|
67
|
+
minimax: { required: ["apiKey"], envVars: { MINIMAX_API_KEY: "apiKey" }, promptLabels: { apiKey: "MiniMax API key" } },
|
|
68
|
+
"github-copilot": { required: ["githubToken", "baseUrl"], envVars: { GH_TOKEN: "githubToken", GITHUB_TOKEN: "githubToken" }, promptLabels: { githubToken: "GitHub token" } },
|
|
69
|
+
};
|
|
53
70
|
exports.DEFAULT_AGENT_CONTEXT = {
|
|
54
71
|
maxTokens: 80000,
|
|
55
72
|
contextMargin: 20,
|
|
@@ -59,6 +76,17 @@ exports.DEFAULT_AGENT_PHRASES = {
|
|
|
59
76
|
tool: ["running tool"],
|
|
60
77
|
followup: ["processing"],
|
|
61
78
|
};
|
|
79
|
+
exports.DEFAULT_VAULT_SERVER_URL = "https://vault.ouro.bot";
|
|
80
|
+
/**
|
|
81
|
+
* Resolve the vault config for an agent, applying defaults.
|
|
82
|
+
* If vault is not configured in agent.json, returns default values.
|
|
83
|
+
*/
|
|
84
|
+
function resolveVaultConfig(agentName, config) {
|
|
85
|
+
return {
|
|
86
|
+
email: config?.email ?? `${agentName}@ouro.bot`,
|
|
87
|
+
serverUrl: config?.serverUrl ?? exports.DEFAULT_VAULT_SERVER_URL,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
62
90
|
exports.DEFAULT_AGENT_SENSES = {
|
|
63
91
|
cli: { enabled: true },
|
|
64
92
|
teams: { enabled: false },
|
|
@@ -117,9 +145,10 @@ function normalizeSenses(value, configFile) {
|
|
|
117
145
|
}
|
|
118
146
|
function buildDefaultAgentTemplate(_agentName) {
|
|
119
147
|
return {
|
|
120
|
-
version:
|
|
148
|
+
version: 2,
|
|
121
149
|
enabled: true,
|
|
122
|
-
provider: "anthropic",
|
|
150
|
+
humanFacing: { provider: "anthropic", model: "claude-opus-4-6" },
|
|
151
|
+
agentFacing: { provider: "anthropic", model: "claude-opus-4-6" },
|
|
123
152
|
context: { ...exports.DEFAULT_AGENT_CONTEXT },
|
|
124
153
|
senses: {
|
|
125
154
|
cli: { ...exports.DEFAULT_AGENT_SENSES.cli },
|
|
@@ -134,7 +163,6 @@ function buildDefaultAgentTemplate(_agentName) {
|
|
|
134
163
|
};
|
|
135
164
|
}
|
|
136
165
|
let _cachedAgentName = null;
|
|
137
|
-
let _cachedAgentConfig = null;
|
|
138
166
|
let _agentConfigOverride = null;
|
|
139
167
|
/**
|
|
140
168
|
* Parse `--agent <name>` from process.argv.
|
|
@@ -185,11 +213,40 @@ function getAgentBundlesRoot() {
|
|
|
185
213
|
function getAgentRoot(agentName = getAgentName()) {
|
|
186
214
|
return path.join(getAgentBundlesRoot(), `${agentName}.ouro`);
|
|
187
215
|
}
|
|
216
|
+
function resolveOptionalAgentName(agentName) {
|
|
217
|
+
if (agentName && agentName.trim().length > 0)
|
|
218
|
+
return agentName.trim();
|
|
219
|
+
try {
|
|
220
|
+
return getAgentName();
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
return "slugger";
|
|
224
|
+
}
|
|
225
|
+
}
|
|
188
226
|
/**
|
|
189
227
|
* Returns the bundle-local runtime state directory: `~/AgentBundles/<agentName>.ouro/state/`
|
|
190
228
|
*/
|
|
191
|
-
function getAgentStateRoot(agentName
|
|
192
|
-
return path.join(getAgentRoot(agentName), "state");
|
|
229
|
+
function getAgentStateRoot(agentName) {
|
|
230
|
+
return path.join(getAgentRoot(resolveOptionalAgentName(agentName)), "state");
|
|
231
|
+
}
|
|
232
|
+
exports.HARNESS_CANONICAL_REPO_URL = "https://github.com/ouroborosbot/ouroboros.git";
|
|
233
|
+
function getAgentRepoWorkspacesRoot(agentName) {
|
|
234
|
+
return path.join(getAgentStateRoot(resolveOptionalAgentName(agentName)), "workspaces");
|
|
235
|
+
}
|
|
236
|
+
function getAgentDaemonStateRoot(agentName) {
|
|
237
|
+
return path.join(getAgentStateRoot(resolveOptionalAgentName(agentName)), "daemon");
|
|
238
|
+
}
|
|
239
|
+
function getAgentDaemonLogsDir(agentName) {
|
|
240
|
+
return path.join(getAgentDaemonStateRoot(resolveOptionalAgentName(agentName)), "logs");
|
|
241
|
+
}
|
|
242
|
+
function getAgentDaemonLoggingConfigPath(agentName) {
|
|
243
|
+
return path.join(getAgentDaemonStateRoot(resolveOptionalAgentName(agentName)), "logging.json");
|
|
244
|
+
}
|
|
245
|
+
function getAgentMessagesRoot(agentName) {
|
|
246
|
+
return path.join(getAgentStateRoot(resolveOptionalAgentName(agentName)), "messages");
|
|
247
|
+
}
|
|
248
|
+
function getAgentToolsRoot(agentName) {
|
|
249
|
+
return path.join(getAgentStateRoot(resolveOptionalAgentName(agentName)), "tools");
|
|
193
250
|
}
|
|
194
251
|
/**
|
|
195
252
|
* Returns the conventional secrets path: `~/.agentsecrets/<agentName>/secrets.json`
|
|
@@ -197,26 +254,11 @@ function getAgentStateRoot(agentName = getAgentName()) {
|
|
|
197
254
|
function getAgentSecretsPath(agentName = getAgentName()) {
|
|
198
255
|
return path.join(os.homedir(), ".agentsecrets", agentName, "secrets.json");
|
|
199
256
|
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
function loadAgentConfig() {
|
|
206
|
-
if (_agentConfigOverride) {
|
|
207
|
-
return _agentConfigOverride;
|
|
208
|
-
}
|
|
209
|
-
if (_cachedAgentConfig) {
|
|
210
|
-
(0, runtime_1.emitNervesEvent)({
|
|
211
|
-
event: "identity.resolve",
|
|
212
|
-
component: "config/identity",
|
|
213
|
-
message: "loaded agent config from cache",
|
|
214
|
-
meta: { source: "cache" },
|
|
215
|
-
});
|
|
216
|
-
return _cachedAgentConfig;
|
|
217
|
-
}
|
|
218
|
-
const agentRoot = getAgentRoot();
|
|
219
|
-
const configFile = path.join(agentRoot, "agent.json");
|
|
257
|
+
const VALID_PROVIDERS = ["azure", "minimax", "anthropic", "openai-codex", "github-copilot"];
|
|
258
|
+
function isValidProvider(value) {
|
|
259
|
+
return typeof value === "string" && VALID_PROVIDERS.includes(value);
|
|
260
|
+
}
|
|
261
|
+
function readAndParseAgentJson(configFile) {
|
|
220
262
|
let raw;
|
|
221
263
|
try {
|
|
222
264
|
raw = fs.readFileSync(configFile, "utf-8");
|
|
@@ -234,9 +276,8 @@ function loadAgentConfig() {
|
|
|
234
276
|
});
|
|
235
277
|
throw new Error(`Cannot read agent.json at ${configFile}. Does the agent directory exist?`);
|
|
236
278
|
}
|
|
237
|
-
let parsed;
|
|
238
279
|
try {
|
|
239
|
-
|
|
280
|
+
return JSON.parse(raw);
|
|
240
281
|
}
|
|
241
282
|
catch (error) {
|
|
242
283
|
(0, runtime_1.emitNervesEvent)({
|
|
@@ -251,6 +292,62 @@ function loadAgentConfig() {
|
|
|
251
292
|
});
|
|
252
293
|
throw new Error(`Invalid JSON in agent.json at ${configFile}. Check syntax.`);
|
|
253
294
|
}
|
|
295
|
+
}
|
|
296
|
+
function validateFacingConfig(parsed, facingName, configFile) {
|
|
297
|
+
const raw = parsed[facingName];
|
|
298
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
|
|
299
|
+
(0, runtime_1.emitNervesEvent)({
|
|
300
|
+
level: "error",
|
|
301
|
+
event: "config_identity.error",
|
|
302
|
+
component: "config/identity",
|
|
303
|
+
message: `agent config missing or invalid ${facingName}`,
|
|
304
|
+
meta: { path: configFile, [facingName]: raw ?? null },
|
|
305
|
+
});
|
|
306
|
+
throw new Error(`agent.json at ${configFile} must include ${facingName} as { provider, model }.`);
|
|
307
|
+
}
|
|
308
|
+
const facing = raw;
|
|
309
|
+
if (!isValidProvider(facing.provider)) {
|
|
310
|
+
(0, runtime_1.emitNervesEvent)({
|
|
311
|
+
level: "error",
|
|
312
|
+
event: "config_identity.error",
|
|
313
|
+
component: "config/identity",
|
|
314
|
+
message: `agent config has invalid provider in ${facingName}`,
|
|
315
|
+
meta: { path: configFile, provider: facing.provider ?? null },
|
|
316
|
+
});
|
|
317
|
+
throw new Error(`agent.json at ${configFile} ${facingName}.provider must be one of: ${VALID_PROVIDERS.join(", ")}.`);
|
|
318
|
+
}
|
|
319
|
+
if (typeof facing.model !== "string") {
|
|
320
|
+
(0, runtime_1.emitNervesEvent)({
|
|
321
|
+
level: "error",
|
|
322
|
+
event: "config_identity.error",
|
|
323
|
+
component: "config/identity",
|
|
324
|
+
message: `agent config has invalid model in ${facingName}`,
|
|
325
|
+
meta: { path: configFile, model: facing.model ?? null },
|
|
326
|
+
});
|
|
327
|
+
throw new Error(`agent.json at ${configFile} ${facingName}.model must be a string.`);
|
|
328
|
+
}
|
|
329
|
+
return { provider: facing.provider, model: facing.model };
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Load and parse `<agentRoot>/agent.json`.
|
|
333
|
+
* Reads the file fresh on each call unless an override is set.
|
|
334
|
+
* If the config is v1, auto-migrates to v2 via migrateAgentConfigV1ToV2 and re-reads.
|
|
335
|
+
* Throws descriptive error if file is missing or contains invalid JSON.
|
|
336
|
+
*/
|
|
337
|
+
function loadAgentConfig() {
|
|
338
|
+
if (_agentConfigOverride) {
|
|
339
|
+
return _agentConfigOverride;
|
|
340
|
+
}
|
|
341
|
+
const agentRoot = getAgentRoot();
|
|
342
|
+
const configFile = path.join(agentRoot, "agent.json");
|
|
343
|
+
let parsed = readAndParseAgentJson(configFile);
|
|
344
|
+
// Inline migration: v1 -> v2
|
|
345
|
+
const rawVersion = parsed.version;
|
|
346
|
+
const initialVersion = typeof rawVersion === "number" ? rawVersion : 1;
|
|
347
|
+
if (initialVersion < 2) {
|
|
348
|
+
(0, migrate_config_1.migrateAgentConfigV1ToV2)(agentRoot);
|
|
349
|
+
parsed = readAndParseAgentJson(configFile);
|
|
350
|
+
}
|
|
254
351
|
const existingPhrases = parsed.phrases;
|
|
255
352
|
const needsFill = !existingPhrases ||
|
|
256
353
|
!existingPhrases.thinking ||
|
|
@@ -272,27 +369,11 @@ function loadAgentConfig() {
|
|
|
272
369
|
});
|
|
273
370
|
fs.writeFileSync(configFile, JSON.stringify(parsed, null, 2) + "\n", "utf-8");
|
|
274
371
|
}
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
(0, runtime_1.emitNervesEvent)({
|
|
281
|
-
level: "error",
|
|
282
|
-
event: "config_identity.error",
|
|
283
|
-
component: "config/identity",
|
|
284
|
-
message: "agent config missing or invalid provider",
|
|
285
|
-
meta: {
|
|
286
|
-
path: configFile,
|
|
287
|
-
provider: rawProvider,
|
|
288
|
-
},
|
|
289
|
-
});
|
|
290
|
-
throw new Error(`agent.json at ${configFile} must include provider: "azure", "minimax", "anthropic", or "openai-codex".`);
|
|
291
|
-
}
|
|
292
|
-
const rawVersion = parsed.version;
|
|
293
|
-
const version = rawVersion === undefined ? 1 : rawVersion;
|
|
294
|
-
if (typeof version !== "number" ||
|
|
295
|
-
!Number.isInteger(version) ||
|
|
372
|
+
// Validate v2 facing configs
|
|
373
|
+
const humanFacing = validateFacingConfig(parsed, "humanFacing", configFile);
|
|
374
|
+
const agentFacing = validateFacingConfig(parsed, "agentFacing", configFile);
|
|
375
|
+
const version = typeof parsed.version === "number" ? parsed.version : 1;
|
|
376
|
+
if (!Number.isInteger(version) ||
|
|
296
377
|
version < 1) {
|
|
297
378
|
(0, runtime_1.emitNervesEvent)({
|
|
298
379
|
level: "error",
|
|
@@ -301,7 +382,7 @@ function loadAgentConfig() {
|
|
|
301
382
|
message: "agent config missing or invalid version",
|
|
302
383
|
meta: {
|
|
303
384
|
path: configFile,
|
|
304
|
-
version:
|
|
385
|
+
version: parsed.version,
|
|
305
386
|
},
|
|
306
387
|
});
|
|
307
388
|
throw new Error(`agent.json at ${configFile} must include version as integer >= 1.`);
|
|
@@ -321,22 +402,37 @@ function loadAgentConfig() {
|
|
|
321
402
|
});
|
|
322
403
|
throw new Error(`agent.json at ${configFile} must include enabled as boolean.`);
|
|
323
404
|
}
|
|
324
|
-
|
|
405
|
+
// Tolerate deprecated provider field for backward compatibility
|
|
406
|
+
const rawProvider = parsed.provider;
|
|
407
|
+
const provider = isValidProvider(rawProvider) ? rawProvider : undefined;
|
|
408
|
+
// Spread parsed first so any field present in AgentConfig is carried
|
|
409
|
+
// through by default, then explicitly override the fields that need
|
|
410
|
+
// validation or normalization. This eliminates the field-drop bug class
|
|
411
|
+
// that caused the `sync` block (and previously `shell`) to be silently
|
|
412
|
+
// omitted from the returned config. Regression-guarded by the
|
|
413
|
+
// Required<AgentConfig> contract test in identity-contract.test.ts.
|
|
414
|
+
const config = {
|
|
415
|
+
...parsed,
|
|
325
416
|
version,
|
|
326
417
|
enabled,
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
logging: parsed.logging,
|
|
418
|
+
humanFacing,
|
|
419
|
+
agentFacing,
|
|
330
420
|
senses: normalizeSenses(parsed.senses, configFile),
|
|
331
421
|
phrases: parsed.phrases,
|
|
332
422
|
};
|
|
423
|
+
if (provider !== undefined) {
|
|
424
|
+
config.provider = provider;
|
|
425
|
+
}
|
|
426
|
+
else {
|
|
427
|
+
delete config.provider;
|
|
428
|
+
}
|
|
333
429
|
(0, runtime_1.emitNervesEvent)({
|
|
334
430
|
event: "identity.resolve",
|
|
335
431
|
component: "config/identity",
|
|
336
432
|
message: "loaded agent config from disk",
|
|
337
433
|
meta: { source: "disk" },
|
|
338
434
|
});
|
|
339
|
-
return
|
|
435
|
+
return config;
|
|
340
436
|
}
|
|
341
437
|
/**
|
|
342
438
|
* Prime the agent name cache explicitly.
|
|
@@ -356,11 +452,11 @@ function setAgentConfigOverride(config) {
|
|
|
356
452
|
_agentConfigOverride = config;
|
|
357
453
|
}
|
|
358
454
|
/**
|
|
359
|
-
*
|
|
360
|
-
*
|
|
455
|
+
* Preserve the compatibility hook for callers that previously cleared cached
|
|
456
|
+
* disk-backed agent config. Agent config is now read fresh on every call.
|
|
361
457
|
*/
|
|
362
458
|
function resetAgentConfigCache() {
|
|
363
|
-
|
|
459
|
+
// No-op: disk-backed agent config is no longer memoized in-process.
|
|
364
460
|
}
|
|
365
461
|
/**
|
|
366
462
|
* Clear all cached identity state.
|
|
@@ -368,6 +464,5 @@ function resetAgentConfigCache() {
|
|
|
368
464
|
*/
|
|
369
465
|
function resetIdentity() {
|
|
370
466
|
_cachedAgentName = null;
|
|
371
|
-
_cachedAgentConfig = null;
|
|
372
467
|
_agentConfigOverride = null;
|
|
373
468
|
}
|