@ouro.bot/cli 0.1.0-alpha.61 → 0.1.0-alpha.612
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 +127 -23
- package/RepairGuide.ouro/agent.json +5 -0
- package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
- package/RepairGuide.ouro/psyche/SOUL.md +55 -0
- package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
- package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
- package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
- package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
- package/changelog.json +3912 -0
- package/dist/arc/attention-types.js +8 -0
- package/dist/arc/cares.js +144 -0
- package/dist/arc/episodes.js +118 -0
- package/dist/arc/intentions.js +134 -0
- package/dist/arc/json-store.js +117 -0
- package/dist/arc/obligations.js +266 -0
- package/dist/arc/packets.js +194 -0
- package/dist/arc/presence.js +185 -0
- package/dist/arc/task-lifecycle.js +65 -0
- package/dist/heart/active-work.js +837 -26
- package/dist/heart/agent-entry.js +69 -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 +479 -0
- package/dist/heart/awaiting/await-alert.js +146 -0
- package/dist/heart/awaiting/await-expiry.js +108 -0
- package/dist/heart/awaiting/await-loader.js +91 -0
- package/dist/heart/awaiting/await-parser.js +141 -0
- package/dist/heart/awaiting/await-runtime-state.js +100 -0
- package/dist/heart/awaiting/await-scheduler.js +377 -0
- package/dist/heart/background-operations.js +281 -0
- package/dist/heart/bridges/store.js +14 -2
- package/dist/heart/bundle-state.js +168 -0
- package/dist/heart/commitments.js +142 -0
- package/dist/heart/config-registry.js +322 -0
- package/dist/heart/config.js +114 -119
- package/dist/heart/core.js +909 -246
- package/dist/heart/cross-chat-delivery.js +3 -18
- package/dist/heart/daemon/agent-config-check.js +419 -0
- package/dist/heart/daemon/agent-discovery.js +102 -3
- package/dist/heart/daemon/agent-service.js +522 -0
- package/dist/heart/daemon/agentic-repair.js +547 -0
- package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
- package/dist/heart/daemon/boot-sync-probe.js +197 -0
- package/dist/heart/daemon/cadence.js +70 -0
- package/dist/heart/daemon/cli-defaults.js +776 -0
- package/dist/heart/daemon/cli-exec.js +7579 -0
- package/dist/heart/daemon/cli-help.js +498 -0
- package/dist/heart/daemon/cli-parse.js +1599 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +763 -0
- package/dist/heart/daemon/cli-types.js +8 -0
- package/dist/heart/daemon/connect-bay.js +323 -0
- package/dist/heart/daemon/daemon-cli.js +29 -1700
- package/dist/heart/daemon/daemon-entry.js +485 -2
- package/dist/heart/daemon/daemon-health.js +176 -0
- package/dist/heart/daemon/daemon-rollup.js +57 -0
- package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +904 -70
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +873 -0
- package/dist/heart/daemon/health-monitor.js +122 -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/human-command-screens.js +234 -0
- package/dist/heart/daemon/human-readiness.js +114 -0
- package/dist/heart/daemon/inner-status.js +89 -0
- package/dist/heart/daemon/interactive-repair.js +394 -0
- package/dist/heart/daemon/launchd.js +37 -8
- package/dist/heart/daemon/log-tailer.js +78 -9
- package/dist/heart/daemon/logs-prune.js +110 -0
- package/dist/heart/daemon/mcp-canary.js +297 -0
- package/dist/heart/daemon/os-cron-deps.js +135 -0
- package/dist/heart/daemon/os-cron.js +14 -12
- 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 +463 -34
- package/dist/heart/daemon/provider-discovery.js +137 -0
- package/dist/heart/daemon/provider-ping-progress.js +83 -0
- package/dist/heart/daemon/pulse.js +475 -0
- package/dist/heart/daemon/readiness-repair.js +365 -0
- package/dist/heart/daemon/run-hooks.js +2 -0
- package/dist/heart/daemon/runtime-logging.js +10 -2
- package/dist/heart/daemon/runtime-metadata.js +2 -30
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sense-manager.js +493 -38
- package/dist/heart/daemon/session-id-resolver.js +131 -0
- package/dist/heart/daemon/skill-management-installer.js +28 -7
- package/dist/heart/daemon/socket-client.js +158 -11
- package/dist/heart/daemon/stale-bundle-prune.js +96 -0
- package/dist/heart/daemon/startup-tui.js +330 -0
- package/dist/heart/daemon/task-scheduler.js +3 -25
- package/dist/heart/daemon/terminal-ui.js +499 -0
- package/dist/heart/daemon/thoughts.js +229 -17
- package/dist/heart/daemon/up-progress.js +366 -0
- package/dist/heart/daemon/vault-items.js +56 -0
- package/dist/heart/delegation.js +1 -1
- package/dist/heart/habits/habit-migration.js +189 -0
- package/dist/heart/habits/habit-parser.js +140 -0
- package/dist/heart/habits/habit-runtime-state.js +100 -0
- package/dist/heart/habits/habit-scheduler.js +372 -0
- package/dist/heart/{daemon → hatch}/hatch-flow.js +32 -56
- package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
- package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
- package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
- package/dist/heart/identity.js +166 -55
- package/dist/heart/kept-notes.js +357 -0
- package/dist/heart/kicks.js +1 -1
- package/dist/heart/machine-identity.js +161 -0
- package/dist/heart/mail-import-discovery.js +353 -0
- package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
- package/dist/heart/mailbox/mailbox-http-response.js +7 -0
- package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
- package/dist/heart/mailbox/mailbox-http-static.js +103 -0
- package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
- package/dist/heart/mailbox/mailbox-http.js +99 -0
- package/dist/heart/mailbox/mailbox-read.js +31 -0
- package/dist/heart/mailbox/mailbox-types.js +27 -0
- package/dist/heart/mailbox/mailbox-view.js +197 -0
- package/dist/heart/mailbox/readers/agent-machine.js +425 -0
- package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
- package/dist/heart/mailbox/readers/mail.js +375 -0
- package/dist/heart/mailbox/readers/runtime-readers.js +756 -0
- package/dist/heart/mailbox/readers/sessions.js +232 -0
- package/dist/heart/mailbox/readers/shared.js +111 -0
- package/dist/heart/mcp/mcp-server.js +656 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +19 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/provider-attempt.js +134 -0
- package/dist/heart/provider-binding-resolver.js +267 -0
- package/dist/heart/provider-credentials.js +425 -0
- package/dist/heart/provider-failover.js +301 -0
- package/dist/heart/provider-models.js +81 -0
- package/dist/heart/provider-ping.js +262 -0
- package/dist/heart/provider-readiness-cache.js +40 -0
- package/dist/heart/provider-visibility.js +188 -0
- package/dist/heart/providers/anthropic-token.js +131 -0
- package/dist/heart/providers/anthropic.js +139 -52
- package/dist/heart/providers/azure.js +23 -11
- package/dist/heart/providers/error-classification.js +127 -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 +26 -8
- package/dist/heart/providers/openai-codex.js +55 -40
- package/dist/heart/runtime-capability-check.js +170 -0
- package/dist/heart/runtime-credentials.js +367 -0
- package/dist/heart/runtime-cwd.js +87 -0
- package/dist/heart/sense-truth.js +13 -4
- package/dist/heart/session-activity.js +48 -24
- package/dist/heart/session-events.js +1156 -0
- package/dist/heart/session-playback-cli-main.js +5 -0
- package/dist/heart/session-playback-cli.js +36 -0
- package/dist/heart/session-playback.js +231 -0
- package/dist/heart/session-stats-cli-main.js +5 -0
- package/dist/heart/session-stats.js +182 -0
- package/dist/heart/session-transcript.js +133 -0
- package/dist/heart/start-of-turn-packet.js +345 -0
- package/dist/heart/streaming.js +44 -27
- package/dist/heart/sync-classification.js +176 -0
- package/dist/heart/sync.js +449 -0
- package/dist/heart/target-resolution.js +9 -5
- package/dist/heart/tempo.js +93 -0
- package/dist/heart/temporal-view.js +41 -0
- package/dist/heart/timeouts.js +101 -0
- package/dist/heart/tool-activity-callbacks.js +59 -0
- package/dist/heart/tool-description.js +143 -0
- package/dist/heart/tool-friction.js +55 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-context.js +421 -0
- package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
- package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
- package/dist/heart/versioning/ouro-path-installer.js +426 -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 +6 -1
- package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
- package/dist/mailbox-ui/assets/index-9-AxCxuB.js +61 -0
- package/dist/mailbox-ui/assets/index-CWzt267f.css +1 -0
- package/dist/mailbox-ui/index.html +15 -0
- package/dist/mailroom/attention.js +167 -0
- package/dist/mailroom/autonomy.js +209 -0
- package/dist/mailroom/blob-store.js +712 -0
- package/dist/mailroom/body-cache.js +61 -0
- package/dist/mailroom/core.js +788 -0
- package/dist/mailroom/entry.js +160 -0
- package/dist/mailroom/file-store.js +460 -0
- package/dist/mailroom/mbox-import.js +393 -0
- package/dist/mailroom/migration.js +164 -0
- package/dist/mailroom/outbound.js +380 -0
- package/dist/mailroom/policy.js +263 -0
- package/dist/mailroom/reader.js +233 -0
- package/dist/mailroom/search-cache.js +268 -0
- package/dist/mailroom/search-relevance.js +319 -0
- package/dist/mailroom/smtp-ingress.js +176 -0
- package/dist/mailroom/source-state.js +176 -0
- package/dist/mailroom/thread.js +109 -0
- package/dist/mailroom/travel-extract.js +89 -0
- package/dist/mind/bundle-manifest.js +7 -1
- package/dist/mind/context.js +250 -101
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +68 -76
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/friends/channel.js +39 -0
- package/dist/mind/friends/resolver.js +54 -2
- package/dist/mind/friends/store-file.js +48 -4
- package/dist/mind/friends/types.js +2 -2
- package/dist/mind/journal-index.js +162 -0
- package/dist/mind/note-search.js +268 -0
- package/dist/mind/obligation-steering.js +221 -0
- package/dist/mind/pending.js +6 -1
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +1051 -135
- package/dist/mind/provenance-trust.js +26 -0
- package/dist/mind/scrutiny.js +173 -0
- 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/contract.js +5 -5
- package/dist/nerves/coverage/file-completeness.js +129 -5
- 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/review/cli-main.js +5 -0
- package/dist/nerves/review/cli.js +156 -0
- package/dist/nerves/review/core.js +152 -0
- package/dist/nerves/runtime.js +5 -1
- 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 +997 -0
- package/dist/repertoire/bundle-templates.js +72 -0
- package/dist/repertoire/bw-installer.js +180 -0
- package/dist/repertoire/coding/codex-jsonl.js +64 -0
- package/dist/repertoire/coding/context-pack.js +331 -0
- package/dist/repertoire/coding/feedback.js +197 -30
- package/dist/repertoire/coding/manager.js +163 -10
- 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 +178 -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 +396 -0
- package/dist/repertoire/mcp-client.js +295 -0
- package/dist/repertoire/mcp-manager.js +362 -0
- package/dist/repertoire/mcp-tools.js +63 -0
- package/dist/repertoire/shell-sessions.js +133 -0
- package/dist/repertoire/skills.js +18 -4
- package/dist/repertoire/stripe-client.js +131 -0
- package/dist/repertoire/tasks/board.js +31 -5
- package/dist/repertoire/tasks/fix.js +182 -0
- package/dist/repertoire/tasks/index.js +16 -4
- 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 -78
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-attachments.js +317 -0
- package/dist/repertoire/tools-awaiting.js +365 -0
- package/dist/repertoire/tools-base.js +55 -1082
- 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 +381 -0
- package/dist/repertoire/tools-files.js +342 -0
- package/dist/repertoire/tools-flight.js +224 -0
- package/dist/repertoire/tools-flow.js +119 -0
- package/dist/repertoire/tools-github.js +1 -7
- package/dist/repertoire/tools-mail.js +1916 -0
- package/dist/repertoire/tools-notes.js +421 -0
- package/dist/repertoire/tools-obligations.js +142 -0
- package/dist/repertoire/tools-record.js +463 -0
- package/dist/repertoire/tools-runtime.js +148 -0
- package/dist/repertoire/tools-session.js +781 -0
- package/dist/repertoire/tools-shell.js +120 -0
- package/dist/repertoire/tools-stripe.js +180 -0
- package/dist/repertoire/tools-surface.js +345 -0
- package/dist/repertoire/tools-teams.js +9 -39
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-trip.js +604 -0
- package/dist/repertoire/tools-user-profile.js +144 -0
- package/dist/repertoire/tools-vault.js +40 -0
- package/dist/repertoire/tools-voice.js +144 -0
- package/dist/repertoire/tools.js +115 -103
- package/dist/repertoire/travel-api-client.js +360 -0
- package/dist/repertoire/user-profile.js +131 -0
- package/dist/repertoire/vault-setup.js +246 -0
- package/dist/repertoire/vault-unlock.js +594 -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/await-turn-message.js +58 -0
- package/dist/senses/bluebubbles/active-turns.js +216 -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} +219 -18
- package/dist/senses/bluebubbles/entry.js +77 -0
- package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
- package/dist/senses/bluebubbles/index.js +2613 -0
- package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
- package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
- package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
- package/dist/senses/bluebubbles/processed-log.js +133 -0
- package/dist/senses/bluebubbles/replay.js +137 -0
- package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
- package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
- package/dist/senses/bluebubbles-meta-guard.js +40 -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 +607 -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 +85 -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 +100 -0
- package/dist/senses/cli.js +516 -204
- package/dist/senses/commands.js +66 -3
- package/dist/senses/habit-turn-message.js +108 -0
- package/dist/senses/inner-dialog-worker.js +185 -21
- package/dist/senses/inner-dialog.js +469 -39
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +379 -0
- package/dist/senses/pipeline.js +654 -181
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +392 -0
- package/dist/senses/surface-tool.js +70 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +387 -98
- package/dist/senses/trust-gate.js +100 -5
- package/dist/senses/voice/audio-playback.js +237 -0
- package/dist/senses/voice/audio-routing.js +119 -0
- package/dist/senses/voice/elevenlabs.js +202 -0
- package/dist/senses/voice/floor-control.js +431 -0
- package/dist/senses/voice/floor-controller.js +115 -0
- package/dist/senses/voice/golden-path.js +116 -0
- package/dist/senses/voice/index.js +29 -0
- package/dist/senses/voice/meeting.js +113 -0
- package/dist/senses/voice/outbound.js +190 -0
- package/dist/senses/voice/phone.js +33 -0
- package/dist/senses/voice/playback.js +139 -0
- package/dist/senses/voice/realtime-eval.js +496 -0
- package/dist/senses/voice/realtime-trace.js +531 -0
- package/dist/senses/voice/transcript.js +70 -0
- package/dist/senses/voice/turn.js +191 -0
- package/dist/senses/voice/twilio-phone-runtime.js +807 -0
- package/dist/senses/voice/twilio-phone.js +5079 -0
- package/dist/senses/voice/types.js +2 -0
- package/dist/senses/voice/whisper.js +161 -0
- package/dist/senses/voice-entry.js +81 -0
- package/dist/senses/voice-realtime-eval-command.js +99 -0
- package/dist/senses/voice-realtime-eval-entry.js +21 -0
- package/dist/senses/voice-twilio-entry.js +87 -0
- package/dist/trips/core.js +138 -0
- package/dist/trips/store.js +265 -0
- package/package.json +41 -7
- package/skills/agent-commerce.md +106 -0
- package/skills/browser-navigation.md +117 -0
- package/skills/commerce-setup-guide.md +116 -0
- package/skills/commerce-setup.md +84 -0
- package/skills/configure-dev-tools.md +99 -0
- package/skills/travel-planning.md +138 -0
- package/dist/heart/daemon/auth-flow.js +0 -351
- package/dist/heart/daemon/ouro-path-installer.js +0 -178
- package/dist/heart/safe-workspace.js +0 -228
- package/dist/heart/session-recall.js +0 -116
- package/dist/mind/associative-recall.js +0 -209
- package/dist/senses/bluebubbles-entry.js +0 -13
- package/dist/senses/bluebubbles.js +0 -1177
- package/dist/senses/debug-activity.js +0 -148
- package/subagents/README.md +0 -7
- /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
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TEMPO_BUDGETS = void 0;
|
|
4
|
+
exports.deriveTempo = deriveTempo;
|
|
5
|
+
exports.getTokenBudget = getTokenBudget;
|
|
6
|
+
exports.detectTempoShift = detectTempoShift;
|
|
7
|
+
const runtime_1 = require("../nerves/runtime");
|
|
8
|
+
exports.TEMPO_BUDGETS = {
|
|
9
|
+
brief: { min: 150, max: 250 },
|
|
10
|
+
standard: { min: 450, max: 700 },
|
|
11
|
+
dense: { min: 900, max: 1100 },
|
|
12
|
+
crisis: { min: 700, max: 1000 },
|
|
13
|
+
};
|
|
14
|
+
const FIVE_MINUTES_MS = 5 * 60 * 1000;
|
|
15
|
+
const TWO_HOURS_MS = 2 * 60 * 60 * 1000;
|
|
16
|
+
function deriveMode(inputs) {
|
|
17
|
+
if (inputs.hasBlockers)
|
|
18
|
+
return "crisis";
|
|
19
|
+
if (inputs.openObligations > 3 || inputs.recentEpisodeCount > 10)
|
|
20
|
+
return "dense";
|
|
21
|
+
if (inputs.activeSessions > 0)
|
|
22
|
+
return "standard";
|
|
23
|
+
return "brief";
|
|
24
|
+
}
|
|
25
|
+
function deriveSignificance(inputs) {
|
|
26
|
+
if (inputs.highSalienceEpisodes > 0 || inputs.atRiskCareCount > 0)
|
|
27
|
+
return "high";
|
|
28
|
+
if (inputs.activeCareCount > 0)
|
|
29
|
+
return "medium";
|
|
30
|
+
return "low";
|
|
31
|
+
}
|
|
32
|
+
function deriveReentryDepth(inputs) {
|
|
33
|
+
if (inputs.lastActivityAgeMs < FIVE_MINUTES_MS)
|
|
34
|
+
return "warm";
|
|
35
|
+
if (inputs.lastActivityAgeMs < TWO_HOURS_MS)
|
|
36
|
+
return "cooled";
|
|
37
|
+
return "cold";
|
|
38
|
+
}
|
|
39
|
+
function computeEffectiveBudget(mode, significance, reentryDepth) {
|
|
40
|
+
const base = exports.TEMPO_BUDGETS[mode];
|
|
41
|
+
// Crisis always uses crisis budget regardless
|
|
42
|
+
if (mode === "crisis")
|
|
43
|
+
return { ...base };
|
|
44
|
+
const range = base.max - base.min;
|
|
45
|
+
// Start at the mode minimum
|
|
46
|
+
let effectiveMin = base.min;
|
|
47
|
+
// Significance pushes up within range
|
|
48
|
+
if (significance === "high") {
|
|
49
|
+
effectiveMin += Math.round(range * 0.5);
|
|
50
|
+
}
|
|
51
|
+
else if (significance === "medium") {
|
|
52
|
+
effectiveMin += Math.round(range * 0.25);
|
|
53
|
+
}
|
|
54
|
+
// Cold re-entry pushes up (need more context to re-orient)
|
|
55
|
+
if (reentryDepth === "cold") {
|
|
56
|
+
effectiveMin += Math.round(range * 0.3);
|
|
57
|
+
}
|
|
58
|
+
else if (reentryDepth === "cooled") {
|
|
59
|
+
effectiveMin += Math.round(range * 0.1);
|
|
60
|
+
}
|
|
61
|
+
// Clamp within mode range
|
|
62
|
+
effectiveMin = Math.min(effectiveMin, base.max);
|
|
63
|
+
return { min: effectiveMin, max: base.max };
|
|
64
|
+
}
|
|
65
|
+
function deriveTempo(inputs) {
|
|
66
|
+
const mode = deriveMode(inputs);
|
|
67
|
+
const significance = deriveSignificance(inputs);
|
|
68
|
+
const reentryDepth = deriveReentryDepth(inputs);
|
|
69
|
+
const effectiveBudget = computeEffectiveBudget(mode, significance, reentryDepth);
|
|
70
|
+
(0, runtime_1.emitNervesEvent)({
|
|
71
|
+
component: "heart",
|
|
72
|
+
event: "heart.tempo_derived",
|
|
73
|
+
message: `tempo derived: ${mode}/${significance}/${reentryDepth}`,
|
|
74
|
+
meta: {
|
|
75
|
+
mode,
|
|
76
|
+
significance,
|
|
77
|
+
reentryDepth,
|
|
78
|
+
effectiveMin: effectiveBudget.min,
|
|
79
|
+
effectiveMax: effectiveBudget.max,
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
return { mode, significance, reentryDepth, effectiveBudget };
|
|
83
|
+
}
|
|
84
|
+
function getTokenBudget(state) {
|
|
85
|
+
return state.effectiveBudget;
|
|
86
|
+
}
|
|
87
|
+
function detectTempoShift(previous, current) {
|
|
88
|
+
if (!previous)
|
|
89
|
+
return true;
|
|
90
|
+
return (previous.mode !== current.mode
|
|
91
|
+
|| previous.significance !== current.significance
|
|
92
|
+
|| previous.reentryDepth !== current.reentryDepth);
|
|
93
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildTemporalView = buildTemporalView;
|
|
4
|
+
const runtime_1 = require("../nerves/runtime");
|
|
5
|
+
const episodes_1 = require("../arc/episodes");
|
|
6
|
+
const obligations_1 = require("../arc/obligations");
|
|
7
|
+
const cares_1 = require("../arc/cares");
|
|
8
|
+
const intentions_1 = require("../arc/intentions");
|
|
9
|
+
const presence_1 = require("../arc/presence");
|
|
10
|
+
function buildTemporalView(agentRoot, options) {
|
|
11
|
+
const episodeLimit = options?.episodeLimit ?? 20;
|
|
12
|
+
const tempo = options?.tempo ?? "brief";
|
|
13
|
+
const recentEpisodes = options?.preloaded?.recentEpisodes ?? (0, episodes_1.readRecentEpisodes)(agentRoot, { limit: episodeLimit });
|
|
14
|
+
const activeObligations = options?.preloaded?.activeObligations ?? (0, obligations_1.readPendingObligations)(agentRoot);
|
|
15
|
+
const activeCares = options?.preloaded?.activeCares ?? (0, cares_1.readActiveCares)(agentRoot);
|
|
16
|
+
const openIntentions = (0, intentions_1.readOpenIntentions)(agentRoot);
|
|
17
|
+
const peerPresence = (0, presence_1.readPeerPresence)(agentRoot);
|
|
18
|
+
const view = {
|
|
19
|
+
recentEpisodes,
|
|
20
|
+
activeObligations,
|
|
21
|
+
activeCares,
|
|
22
|
+
openIntentions,
|
|
23
|
+
peerPresence,
|
|
24
|
+
tempo,
|
|
25
|
+
assembledAt: new Date().toISOString(),
|
|
26
|
+
};
|
|
27
|
+
(0, runtime_1.emitNervesEvent)({
|
|
28
|
+
component: "heart",
|
|
29
|
+
event: "heart.temporal_view_assembled",
|
|
30
|
+
message: `temporal view assembled: ${recentEpisodes.length} episodes, ${activeObligations.length} obligations, ${activeCares.length} cares, ${openIntentions.length} intentions`,
|
|
31
|
+
meta: {
|
|
32
|
+
episodeCount: recentEpisodes.length,
|
|
33
|
+
obligationCount: activeObligations.length,
|
|
34
|
+
careCount: activeCares.length,
|
|
35
|
+
intentionCount: openIntentions.length,
|
|
36
|
+
peerCount: peerPresence.length,
|
|
37
|
+
tempo,
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
return view;
|
|
41
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Soft/hard timeout pattern for boot-path operations — Layer 2.
|
|
4
|
+
*
|
|
5
|
+
* Soft timeout = "log a warning, keep going". The op continues; the consumer
|
|
6
|
+
* records the warning and moves on.
|
|
7
|
+
* Hard timeout = "abort the op via AbortSignal". The underlying op is
|
|
8
|
+
* expected to honour the signal (Node child_process accepts `{ signal }`,
|
|
9
|
+
* fetch accepts `{ signal }`, etc.). When the signal aborts, the op should
|
|
10
|
+
* reject with an AbortError, and the wrapper returns
|
|
11
|
+
* `{ classification: "timeout-hard" }` rather than re-throwing.
|
|
12
|
+
*
|
|
13
|
+
Two optional env overrides (currently only `GIT` is consumed):
|
|
14
|
+
* - `OURO_BOOT_TIMEOUT_GIT_SOFT` / `OURO_BOOT_TIMEOUT_GIT_HARD` — boot
|
|
15
|
+
* git operations (fetch / pull). Used when `envKey === "GIT"`.
|
|
16
|
+
*
|
|
17
|
+
* Env values are parsed as integer milliseconds. Non-numeric or non-positive
|
|
18
|
+
* values are ignored (the explicit `softMs` / `hardMs` defaults from the
|
|
19
|
+
* caller win in that case).
|
|
20
|
+
*
|
|
21
|
+
* Pattern guarantee: timers cleared on resolve / reject so the function
|
|
22
|
+
* holds no refs after settlement. Important because `ouro up` chains
|
|
23
|
+
* many of these and a leaking timer would block process exit.
|
|
24
|
+
*/
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.runWithTimeouts = runWithTimeouts;
|
|
27
|
+
function readEnvMs(name) {
|
|
28
|
+
const raw = process.env[name];
|
|
29
|
+
if (raw === undefined || raw === null)
|
|
30
|
+
return null;
|
|
31
|
+
const parsed = Number.parseInt(raw, 10);
|
|
32
|
+
if (!Number.isFinite(parsed) || parsed <= 0)
|
|
33
|
+
return null;
|
|
34
|
+
return parsed;
|
|
35
|
+
}
|
|
36
|
+
function resolveTimeouts(options) {
|
|
37
|
+
let softMs = options.softMs;
|
|
38
|
+
let hardMs = options.hardMs;
|
|
39
|
+
if (options.envKey === "GIT") {
|
|
40
|
+
const envSoft = readEnvMs("OURO_BOOT_TIMEOUT_GIT_SOFT");
|
|
41
|
+
if (envSoft !== null)
|
|
42
|
+
softMs = envSoft;
|
|
43
|
+
const envHard = readEnvMs("OURO_BOOT_TIMEOUT_GIT_HARD");
|
|
44
|
+
if (envHard !== null)
|
|
45
|
+
hardMs = envHard;
|
|
46
|
+
}
|
|
47
|
+
return { softMs, hardMs };
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Run `fn` with soft and hard timeouts.
|
|
51
|
+
*
|
|
52
|
+
* - Returns `{ result }` on success.
|
|
53
|
+
* - Returns `{ classification: "timeout-hard", warnings }` when aborted.
|
|
54
|
+
* - Returns `{ result, warnings: [...] }` when soft tripped but op completed.
|
|
55
|
+
* - Rejects when `fn` throws a non-abort error (callers can wrap with
|
|
56
|
+
* classifier).
|
|
57
|
+
*/
|
|
58
|
+
async function runWithTimeouts(fn, options) {
|
|
59
|
+
const { softMs, hardMs } = resolveTimeouts(options);
|
|
60
|
+
const controller = new AbortController();
|
|
61
|
+
const warnings = [];
|
|
62
|
+
let softTimer = setTimeout(() => {
|
|
63
|
+
softTimer = null;
|
|
64
|
+
warnings.push(`${options.label}: soft timeout exceeded (${softMs}ms) — warning, continuing until hard cut`);
|
|
65
|
+
}, softMs);
|
|
66
|
+
let hardTimer = setTimeout(() => {
|
|
67
|
+
hardTimer = null;
|
|
68
|
+
controller.abort();
|
|
69
|
+
}, hardMs);
|
|
70
|
+
const cleanup = () => {
|
|
71
|
+
if (softTimer !== null) {
|
|
72
|
+
clearTimeout(softTimer);
|
|
73
|
+
softTimer = null;
|
|
74
|
+
}
|
|
75
|
+
if (hardTimer !== null) {
|
|
76
|
+
clearTimeout(hardTimer);
|
|
77
|
+
hardTimer = null;
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
try {
|
|
81
|
+
const result = await fn(controller.signal);
|
|
82
|
+
cleanup();
|
|
83
|
+
// If the abort fired and the op resolved gracefully (e.g., the inner
|
|
84
|
+
// function caught the AbortError and returned a structured result), we
|
|
85
|
+
// still classify the outcome as timeout-hard — the op was aborted from
|
|
86
|
+
// the caller's perspective even if no exception propagated. The caller
|
|
87
|
+
// can ignore the classification and use `result` if both are present.
|
|
88
|
+
if (controller.signal.aborted) {
|
|
89
|
+
return { classification: "timeout-hard", warnings };
|
|
90
|
+
}
|
|
91
|
+
return { result, warnings };
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
cleanup();
|
|
95
|
+
if (controller.signal.aborted) {
|
|
96
|
+
// Hard timeout fired — abort wins over whatever error the op threw.
|
|
97
|
+
return { classification: "timeout-hard", warnings };
|
|
98
|
+
}
|
|
99
|
+
throw err;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createToolActivityCallbacks = createToolActivityCallbacks;
|
|
4
|
+
const tool_description_1 = require("./tool-description");
|
|
5
|
+
const runtime_1 = require("../nerves/runtime");
|
|
6
|
+
function createToolActivityCallbacks(options) {
|
|
7
|
+
(0, runtime_1.emitNervesEvent)({
|
|
8
|
+
component: "engine",
|
|
9
|
+
event: "engine.tool_activity_callbacks_created",
|
|
10
|
+
message: "tool activity callbacks initialized",
|
|
11
|
+
meta: {},
|
|
12
|
+
});
|
|
13
|
+
// Track the last description so we can reference it in END messages
|
|
14
|
+
let lastDescription = null;
|
|
15
|
+
// Track in-flight hidden tools so onToolEnd can SYMMETRICALLY suppress
|
|
16
|
+
// emission for the same tools that onToolStart already suppresses.
|
|
17
|
+
// Without this, a rejected hidden tool (e.g. settle blocked by the
|
|
18
|
+
// mustResolveBeforeHandoff gate or the inner-dialog attention-queue gate)
|
|
19
|
+
// would emit "✗ <previous visible tool's description> — <hidden tool's args summary>"
|
|
20
|
+
// because lastDescription persists across calls and the hidden tool's summary
|
|
21
|
+
// (built via summarizeArgs) leaks args like settle's `answer`/`intent` into
|
|
22
|
+
// the visible chat. Counter map (not bool) so concurrent hidden starts don't
|
|
23
|
+
// underflow if ends arrive in any order.
|
|
24
|
+
const hiddenInFlight = new Map();
|
|
25
|
+
return {
|
|
26
|
+
onToolStart(name, args) {
|
|
27
|
+
const description = (0, tool_description_1.humanReadableToolDescription)(name, args);
|
|
28
|
+
if (description === null) {
|
|
29
|
+
// hidden tool (settle, rest, descend, observe, speak) — track so the
|
|
30
|
+
// matching onToolEnd is also suppressed symmetrically.
|
|
31
|
+
hiddenInFlight.set(name, (hiddenInFlight.get(name) ?? 0) + 1);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
lastDescription = description;
|
|
35
|
+
options.onDescription(description);
|
|
36
|
+
},
|
|
37
|
+
onToolEnd(name, summary, success) {
|
|
38
|
+
const hiddenCount = hiddenInFlight.get(name) ?? 0;
|
|
39
|
+
if (hiddenCount > 0) {
|
|
40
|
+
// Hidden tool's start was suppressed; suppress its end too.
|
|
41
|
+
if (hiddenCount === 1)
|
|
42
|
+
hiddenInFlight.delete(name);
|
|
43
|
+
else
|
|
44
|
+
hiddenInFlight.set(name, hiddenCount - 1);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const desc = lastDescription ?? name;
|
|
48
|
+
// Strip trailing "..." from description for the result line
|
|
49
|
+
const cleanDesc = desc.endsWith("...") ? desc.slice(0, -3) : desc;
|
|
50
|
+
if (!success) {
|
|
51
|
+
options.onFailure(`✗ ${cleanDesc} — ${summary}`);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (options.isDebug()) {
|
|
55
|
+
options.onResult(`✓ ${cleanDesc}`);
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.humanReadableToolDescription = humanReadableToolDescription;
|
|
4
|
+
const runtime_1 = require("../nerves/runtime");
|
|
5
|
+
function basename(filePath) {
|
|
6
|
+
const idx = filePath.lastIndexOf("/");
|
|
7
|
+
return idx >= 0 ? filePath.slice(idx + 1) : filePath;
|
|
8
|
+
}
|
|
9
|
+
function truncate(text, max) {
|
|
10
|
+
if (text.length <= max)
|
|
11
|
+
return text;
|
|
12
|
+
// Cut at last space before maxLen to avoid mid-word truncation
|
|
13
|
+
const slice = text.slice(0, max - 1);
|
|
14
|
+
const lastSpace = slice.lastIndexOf(" ");
|
|
15
|
+
if (lastSpace > 0)
|
|
16
|
+
return text.slice(0, lastSpace) + "\u2026";
|
|
17
|
+
// No space found (single long word) — hard truncate
|
|
18
|
+
return slice + "\u2026";
|
|
19
|
+
}
|
|
20
|
+
const TOOL_DESCRIPTIONS = {
|
|
21
|
+
// File operations
|
|
22
|
+
shell: (args) => {
|
|
23
|
+
const cmd = args.command;
|
|
24
|
+
if (!cmd)
|
|
25
|
+
return "running a command...";
|
|
26
|
+
return `running ${truncate(cmd, 50)}...`;
|
|
27
|
+
},
|
|
28
|
+
read_file: (args) => {
|
|
29
|
+
const fp = args.path || args.file_path;
|
|
30
|
+
if (!fp)
|
|
31
|
+
return "reading a file...";
|
|
32
|
+
return `reading ${basename(fp)}...`;
|
|
33
|
+
},
|
|
34
|
+
write_file: (args) => {
|
|
35
|
+
const fp = args.path || args.file_path;
|
|
36
|
+
if (!fp)
|
|
37
|
+
return "writing a file...";
|
|
38
|
+
return `writing ${basename(fp)}...`;
|
|
39
|
+
},
|
|
40
|
+
edit_file: (args) => {
|
|
41
|
+
const fp = args.path || args.file_path;
|
|
42
|
+
if (!fp)
|
|
43
|
+
return "editing a file...";
|
|
44
|
+
return `editing ${basename(fp)}...`;
|
|
45
|
+
},
|
|
46
|
+
glob: (args) => {
|
|
47
|
+
const p = args.pattern;
|
|
48
|
+
if (!p)
|
|
49
|
+
return "searching for files...";
|
|
50
|
+
return `searching for ${truncate(p, 40)}...`;
|
|
51
|
+
},
|
|
52
|
+
grep: (args) => {
|
|
53
|
+
const p = args.pattern;
|
|
54
|
+
if (!p)
|
|
55
|
+
return "searching code...";
|
|
56
|
+
return `searching code for '${truncate(p, 40)}'...`;
|
|
57
|
+
},
|
|
58
|
+
// Notes and knowledge
|
|
59
|
+
search_notes: (args) => {
|
|
60
|
+
const q = args.query;
|
|
61
|
+
if (!q)
|
|
62
|
+
return "searching notes...";
|
|
63
|
+
return `searching notes for '${truncate(q, 40)}'...`;
|
|
64
|
+
},
|
|
65
|
+
diary_write: (args) => {
|
|
66
|
+
const about = args.about;
|
|
67
|
+
return about ? `noting something about ${truncate(about, 30)}...` : "noting something down...";
|
|
68
|
+
},
|
|
69
|
+
save_friend_note: () => "making a note about you...",
|
|
70
|
+
get_friend_note: () => "checking my notes...",
|
|
71
|
+
load_skill: (args) => {
|
|
72
|
+
const name = args.name || args.skill;
|
|
73
|
+
return name ? `loading ${name} skill...` : "loading a skill...";
|
|
74
|
+
},
|
|
75
|
+
// Session and context
|
|
76
|
+
query_session: (args) => {
|
|
77
|
+
const mode = args.mode;
|
|
78
|
+
if (mode === "search")
|
|
79
|
+
return `searching session for '${truncate(args.query || "", 30)}'...`;
|
|
80
|
+
if (mode === "status")
|
|
81
|
+
return "checking inner session status...";
|
|
82
|
+
return "checking session history...";
|
|
83
|
+
},
|
|
84
|
+
web_search: (args) => {
|
|
85
|
+
const q = args.query;
|
|
86
|
+
return q ? `searching the web for '${truncate(q, 35)}'...` : "searching the web...";
|
|
87
|
+
},
|
|
88
|
+
coding_spawn: (args) => {
|
|
89
|
+
const runner = args.runner;
|
|
90
|
+
return runner ? `starting ${runner} coding session...` : "starting coding session...";
|
|
91
|
+
},
|
|
92
|
+
coding_status: () => "checking coding sessions...",
|
|
93
|
+
coding_tail: () => "reading coding output...",
|
|
94
|
+
coding_kill: () => "stopping coding session...",
|
|
95
|
+
bridge_manage: () => "managing conversation bridge...",
|
|
96
|
+
// Communication
|
|
97
|
+
send_message: (args) => {
|
|
98
|
+
const to = args.to || args.friendId;
|
|
99
|
+
/* v8 ignore next 3 -- voice-send status wording is exercised by outbound voice tool tests; this generic renderer keeps a defensive fallback @preserve */
|
|
100
|
+
if (args.channel === "voice") {
|
|
101
|
+
return to ? `placing a voice call to ${to}...` : "placing a voice call...";
|
|
102
|
+
}
|
|
103
|
+
return to ? `sending a message to ${to}...` : "sending a message...";
|
|
104
|
+
},
|
|
105
|
+
surface: () => "sharing a thought...",
|
|
106
|
+
// Metacognitive (agent's inner life)
|
|
107
|
+
ponder: (args) => {
|
|
108
|
+
const objective = args.objective || args.thought;
|
|
109
|
+
return objective ? `bookmarking ${truncate(objective, 40)}...` : "bookmarking deeper work...";
|
|
110
|
+
},
|
|
111
|
+
observe: () => null,
|
|
112
|
+
claude: () => "reasoning...",
|
|
113
|
+
set_reasoning_effort: (args) => {
|
|
114
|
+
const level = args.level;
|
|
115
|
+
return level ? `setting thinking depth to ${level}...` : "adjusting thinking depth...";
|
|
116
|
+
},
|
|
117
|
+
// Hidden — these ARE the response or end-of-turn
|
|
118
|
+
settle: () => null,
|
|
119
|
+
rest: () => null,
|
|
120
|
+
descend: () => null,
|
|
121
|
+
// speak's visible output is the message itself, delivered via onTextChunk +
|
|
122
|
+
// flushNow. The shared tool-activity callbacks must skip it so no per-sense
|
|
123
|
+
// tool-status text precedes the actual message.
|
|
124
|
+
speak: () => null,
|
|
125
|
+
};
|
|
126
|
+
function humanReadableToolDescription(name, args) {
|
|
127
|
+
(0, runtime_1.emitNervesEvent)({
|
|
128
|
+
component: "engine",
|
|
129
|
+
event: "engine.tool_description",
|
|
130
|
+
message: "generated human-readable tool description",
|
|
131
|
+
meta: { tool: name },
|
|
132
|
+
});
|
|
133
|
+
const builder = TOOL_DESCRIPTIONS[name];
|
|
134
|
+
if (builder)
|
|
135
|
+
return builder(args);
|
|
136
|
+
// MCP tools: mcp__server__toolname — extract last segment
|
|
137
|
+
if (name.startsWith("mcp__")) {
|
|
138
|
+
const parts = name.split("__");
|
|
139
|
+
const toolName = parts[parts.length - 1];
|
|
140
|
+
return `using ${toolName}...`;
|
|
141
|
+
}
|
|
142
|
+
return `using ${name}...`;
|
|
143
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createToolFrictionLedger = createToolFrictionLedger;
|
|
4
|
+
exports.rewriteToolResultForModel = rewriteToolResultForModel;
|
|
5
|
+
const runtime_1 = require("../nerves/runtime");
|
|
6
|
+
const tool_results_1 = require("../repertoire/tool-results");
|
|
7
|
+
function createToolFrictionLedger() {
|
|
8
|
+
return { signatures: new Map() };
|
|
9
|
+
}
|
|
10
|
+
function parseFrictionResult(result) {
|
|
11
|
+
try {
|
|
12
|
+
const parsed = JSON.parse(result);
|
|
13
|
+
if (parsed.ok !== false || !parsed.tool || !parsed.friction || typeof parsed.friction !== "object") {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
return { tool: parsed.tool, friction: parsed.friction };
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function rewriteToolResultForModel(tool, result, ledger) {
|
|
23
|
+
const parsed = parseFrictionResult(result);
|
|
24
|
+
if (!parsed?.friction.signature)
|
|
25
|
+
return result;
|
|
26
|
+
const seen = ledger.signatures.get(parsed.friction.signature) ?? 0;
|
|
27
|
+
ledger.signatures.set(parsed.friction.signature, seen + 1);
|
|
28
|
+
if (seen === 0 || parsed.friction.kind === "systemic_harness_bug") {
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
const escalated = {
|
|
32
|
+
...parsed.friction,
|
|
33
|
+
kind: "systemic_harness_bug",
|
|
34
|
+
summary: `${parsed.friction.summary} This looks like a harness-level gap now, not just a one-off repair.`,
|
|
35
|
+
suggested_next_actions: [
|
|
36
|
+
...parsed.friction.suggested_next_actions,
|
|
37
|
+
{
|
|
38
|
+
kind: "tool",
|
|
39
|
+
tool: "ponder",
|
|
40
|
+
reason: "Create a harness_friction packet before asking the user to retry again.",
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
};
|
|
44
|
+
(0, runtime_1.emitNervesEvent)({
|
|
45
|
+
component: "engine",
|
|
46
|
+
event: "engine.tool_friction_escalated",
|
|
47
|
+
message: "tool friction escalated to harness bug",
|
|
48
|
+
meta: {
|
|
49
|
+
tool,
|
|
50
|
+
signature: parsed.friction.signature,
|
|
51
|
+
priorOccurrences: seen,
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
return (0, tool_results_1.frictionToolResult)(tool, escalated);
|
|
55
|
+
}
|