@ouro.bot/cli 0.1.0-alpha.83 → 0.1.0-alpha.831
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/LICENSE +21 -0
- package/README.md +154 -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/assets/bluebubbles-host +264 -0
- package/assets/sanctuary-host-launcher.sh +16 -0
- package/changelog.json +5308 -16
- package/deploy/unraid/Dockerfile +54 -0
- package/deploy/unraid/README.txt +2983 -0
- package/deploy/unraid/audit-container-spec.sh +4 -0
- package/deploy/unraid/container-runtime.json +1 -0
- package/deploy/unraid/docker-man-template-transaction.mjs +711 -0
- package/deploy/unraid/docker-man-template-xml.cjs +105 -0
- package/deploy/unraid/migrate-sanctuary-bundle.mjs +60 -0
- package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
- package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
- package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
- package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
- package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
- package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
- package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
- package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
- package/deploy/unraid/sanctuary-authority-installation.json +36 -0
- package/deploy/unraid/sanctuary-authority-service.sh +30 -0
- package/deploy/unraid/sanctuary-deployment-target.mjs +710 -0
- package/deploy/unraid/sanctuary-safe-rename.py +24 -0
- package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2084 -0
- package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
- package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
- package/deploy/unraid/sanctuary.ouro/agent.json +66 -0
- package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
- package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
- package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
- package/deploy/unraid/sanctuary.ouro/mcp/media-mcp.mjs +795 -0
- package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
- package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
- package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
- package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +15 -0
- package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +25 -0
- package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +15 -0
- package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
- package/deploy/unraid/sanctuary.ouro/tool-profiles.json +135 -0
- package/deploy/unraid/sanctuary.xml +28 -0
- package/dist/a2a/card.js +57 -0
- package/dist/a2a/client.js +180 -0
- package/dist/a2a/config.js +50 -0
- package/dist/a2a/delegation-stores.js +56 -0
- package/dist/a2a/did-resolution.js +93 -0
- package/dist/a2a/identity.js +170 -0
- package/dist/a2a/inbound-share.js +107 -0
- package/dist/a2a/mission-result-wire.js +196 -0
- package/dist/a2a/onboarding.js +115 -0
- package/dist/a2a/pin-store.js +132 -0
- package/dist/a2a/seen-ledger.js +120 -0
- package/dist/a2a/server.js +604 -0
- package/dist/a2a/task-store.js +69 -0
- package/dist/a2a/transport.js +45 -0
- package/dist/a2a/types.js +3 -0
- package/dist/arc/attention-types.js +8 -0
- package/dist/arc/cares.js +360 -0
- package/dist/arc/episodes.js +118 -0
- package/dist/arc/evolution.js +490 -0
- package/dist/arc/flight-recorder.js +1034 -0
- package/dist/arc/intentions.js +134 -0
- package/dist/arc/json-store.js +117 -0
- package/dist/arc/obligations.js +386 -0
- package/dist/arc/packets.js +336 -0
- package/dist/arc/presence.js +185 -0
- package/dist/arc/task-lifecycle.js +57 -0
- package/dist/commerce/store.js +755 -0
- package/dist/commerce/types.js +3 -0
- package/dist/heart/active-work.js +798 -40
- package/dist/heart/agent-entry.js +252 -3
- package/dist/heart/approval-files.js +113 -0
- package/dist/heart/approval-store.js +960 -0
- 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/bluebubbles.js +156 -0
- package/dist/heart/attachments/sources/cli-local-file.js +78 -0
- package/dist/heart/attachments/sources/index.js +18 -0
- package/dist/heart/attachments/sources/telegram.js +71 -0
- package/dist/heart/attachments/store.js +132 -0
- package/dist/heart/attachments/types.js +93 -0
- package/dist/heart/auth/auth-flow.js +495 -0
- package/dist/heart/autonomy-budget.js +478 -0
- package/dist/heart/awaiting/await-alert.js +148 -0
- package/dist/heart/awaiting/await-expiry.js +143 -0
- package/dist/heart/awaiting/await-loader.js +91 -0
- package/dist/heart/awaiting/await-parser.js +149 -0
- package/dist/heart/awaiting/await-runtime-state.js +111 -0
- package/dist/heart/awaiting/await-scheduler.js +382 -0
- package/dist/heart/background-operations.js +281 -0
- package/dist/heart/bridges/manager.js +137 -17
- package/dist/heart/bridges/store.js +14 -2
- package/dist/heart/bundle-state.js +168 -0
- package/dist/heart/commitments.js +44 -18
- package/dist/heart/config-registry.js +331 -0
- package/dist/heart/config.js +174 -131
- package/dist/heart/context-loss-gauntlet.js +387 -0
- package/dist/heart/context-loss-sentinel.js +1157 -0
- package/dist/heart/core.js +2169 -581
- package/dist/heart/cross-chat-delivery.js +9 -22
- package/dist/heart/daemon/agent-config-check.js +451 -0
- package/dist/heart/daemon/agent-discovery.js +185 -3
- package/dist/heart/daemon/agent-service.js +542 -0
- package/dist/heart/daemon/agentic-repair.js +547 -0
- package/dist/heart/daemon/await-private-wake.js +59 -0
- package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
- package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
- package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
- package/dist/heart/daemon/bluebubbles-host.js +273 -0
- package/dist/heart/daemon/boot-sync-probe.js +197 -0
- package/dist/heart/daemon/cadence.js +180 -0
- package/dist/heart/daemon/cli-defaults.js +854 -0
- package/dist/heart/daemon/cli-desk.js +322 -0
- package/dist/heart/daemon/cli-exec.js +8822 -0
- package/dist/heart/daemon/cli-help.js +716 -0
- package/dist/heart/daemon/cli-parse.js +2771 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +777 -0
- package/dist/heart/daemon/cli-types.js +8 -0
- package/dist/heart/daemon/connect-bay.js +323 -0
- package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
- package/dist/heart/daemon/container-healthcheck.js +112 -0
- package/dist/heart/daemon/container-runtime.js +97 -0
- package/dist/heart/daemon/container-spec-auditor-main.js +171 -0
- package/dist/heart/daemon/container-spec-auditor.js +229 -0
- package/dist/heart/daemon/daemon-bootstrap-startup.js +115 -0
- package/dist/heart/daemon/daemon-cli.js +29 -2349
- package/dist/heart/daemon/daemon-entry.js +930 -11
- package/dist/heart/daemon/daemon-health.js +186 -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 +2084 -105
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +1755 -0
- package/dist/heart/daemon/freshness.js +345 -0
- package/dist/heart/daemon/habit-private-wake.js +61 -0
- package/dist/heart/daemon/health-monitor.js +142 -11
- package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
- package/dist/heart/daemon/hooks/bundle-meta.js +135 -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 +78 -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 +79 -10
- package/dist/heart/daemon/logs-prune.js +132 -0
- package/dist/heart/daemon/mcp-canary.js +524 -0
- package/dist/heart/daemon/message-router.js +65 -5
- package/dist/heart/daemon/migrate-to-desk.js +848 -0
- package/dist/heart/daemon/os-cron-deps.js +135 -0
- package/dist/heart/daemon/os-cron.js +22 -14
- package/dist/heart/daemon/ouro-bot-entry.js +4 -2
- package/dist/heart/daemon/ouro-entry.js +3 -1
- package/dist/heart/daemon/plugin-cli.js +432 -0
- package/dist/heart/daemon/process-manager.js +733 -61
- package/dist/heart/daemon/provider-discovery.js +137 -0
- package/dist/heart/daemon/provider-ping-progress.js +83 -0
- package/dist/heart/daemon/prunable-bundle.js +144 -0
- package/dist/heart/daemon/pulse.js +511 -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 +47 -14
- package/dist/heart/daemon/runtime-metadata.js +2 -30
- package/dist/heart/daemon/runtime-mode.js +13 -2
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2654 -0
- package/dist/heart/daemon/sanctuary-acceptance-harness.js +1830 -0
- package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
- package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +955 -0
- package/dist/heart/daemon/sanctuary-authority-codec.js +86 -0
- package/dist/heart/daemon/sanctuary-authority-epoch.js +256 -0
- package/dist/heart/daemon/sanctuary-authority-installation.js +140 -0
- package/dist/heart/daemon/sanctuary-authority-ledger.js +241 -0
- package/dist/heart/daemon/sanctuary-authority-root-lifecycle.js +819 -0
- package/dist/heart/daemon/sanctuary-authority-vault-migration.js +79 -0
- package/dist/heart/daemon/sanctuary-bundle-migration.js +729 -0
- package/dist/heart/daemon/sanctuary-host-authority.js +1008 -0
- package/dist/heart/daemon/sanctuary-host-detached-supervisor.js +494 -0
- package/dist/heart/daemon/sanctuary-host-executor.js +670 -0
- package/dist/heart/daemon/sanctuary-host-linux-kernel.js +334 -0
- package/dist/heart/daemon/sanctuary-host-supervisor-entry.js +207 -0
- package/dist/heart/daemon/sanctuary-host-supervisor.js +95 -0
- package/dist/heart/daemon/sanctuary-package-management.js +103 -0
- package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
- package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
- package/dist/heart/daemon/sanctuary-telegram-authority-entry.js +445 -0
- package/dist/heart/daemon/sanctuary-telegram-authority-gateway.js +585 -0
- package/dist/heart/daemon/sanctuary-telegram-authority-service.js +630 -0
- package/dist/heart/daemon/sense-manager.js +699 -48
- package/dist/heart/daemon/session-id-resolver.js +131 -0
- package/dist/heart/daemon/skill-management-installer.js +1 -1
- package/dist/heart/daemon/socket-client.js +180 -12
- package/dist/heart/daemon/stale-bundle-prune.js +113 -0
- package/dist/heart/daemon/startup-tui.js +339 -0
- package/dist/heart/daemon/supercronic-supervisor.js +282 -0
- package/dist/heart/daemon/task-scheduler.js +117 -39
- package/dist/heart/daemon/terminal-ui.js +499 -0
- package/dist/heart/daemon/thoughts.js +138 -54
- package/dist/heart/daemon/up-progress.js +366 -0
- package/dist/heart/daemon/vault-items.js +56 -0
- package/dist/heart/delegation.js +1 -4
- package/dist/heart/external-events/router.js +1430 -0
- package/dist/heart/frontend-approval-runtime.js +506 -0
- package/dist/heart/frontend-journal.js +215 -0
- package/dist/heart/frontend-session-service.js +237 -0
- package/dist/heart/frontend-socket-client.js +164 -0
- package/dist/heart/frontend-socket.js +400 -0
- package/dist/heart/habits/habit-cancel.js +810 -0
- package/dist/heart/habits/habit-lifecycle.js +1327 -0
- package/dist/heart/habits/habit-migration.js +194 -0
- package/dist/heart/habits/habit-parser.js +278 -0
- package/dist/heart/habits/habit-runtime-state.js +93 -0
- package/dist/heart/habits/habit-scheduler.js +653 -0
- package/dist/heart/habits/habit-session-summary.js +318 -0
- package/dist/heart/habits/habit-session.js +636 -0
- package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
- 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 +53 -18
- package/dist/heart/identity.js +196 -59
- package/dist/heart/kept-notes.js +289 -0
- package/dist/heart/kicks.js +1 -1
- package/dist/heart/machine-identity.js +161 -0
- package/dist/heart/mail-import-discovery.js +356 -0
- package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
- package/dist/heart/mailbox/mailbox-http-response.js +7 -0
- package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
- package/dist/heart/mailbox/mailbox-http-static.js +103 -0
- package/dist/heart/mailbox/mailbox-http-transport.js +129 -0
- package/dist/heart/mailbox/mailbox-http.js +99 -0
- package/dist/heart/mailbox/mailbox-read.js +39 -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 +428 -0
- package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
- package/dist/heart/mailbox/readers/mail.js +375 -0
- package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
- package/dist/heart/mailbox/readers/sessions.js +231 -0
- package/dist/heart/mailbox/readers/shared.js +111 -0
- package/dist/heart/mcp/mcp-server.js +696 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +11 -0
- package/dist/heart/orientation-frame.js +345 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/primitives.js +1 -1
- package/dist/heart/private-runtime/decision-renderer.js +158 -0
- package/dist/heart/private-runtime/index.js +18 -0
- package/dist/heart/private-runtime/ledger.js +221 -0
- package/dist/heart/private-runtime/policy.js +252 -0
- package/dist/heart/private-runtime/types.js +2 -0
- package/dist/heart/progress-story.js +1 -1
- package/dist/heart/provider-attempt.js +137 -0
- package/dist/heart/provider-binding-resolver.js +273 -0
- package/dist/heart/provider-credentials.js +449 -0
- package/dist/heart/provider-failover.js +311 -0
- package/dist/heart/provider-models.js +96 -0
- package/dist/heart/provider-ping.js +265 -0
- package/dist/heart/provider-readiness-cache.js +119 -0
- package/dist/heart/provider-visibility.js +188 -0
- package/dist/heart/providers/anthropic-token.js +131 -0
- package/dist/heart/providers/anthropic.js +173 -60
- package/dist/heart/providers/azure.js +23 -11
- package/dist/heart/providers/error-classification.js +127 -0
- package/dist/heart/providers/github-copilot.js +34 -38
- package/dist/heart/providers/minimax-vlm.js +189 -0
- package/dist/heart/providers/minimax.js +26 -8
- package/dist/heart/providers/openai-codex-token.js +349 -0
- package/dist/heart/providers/openai-codex.js +55 -40
- package/dist/heart/providers/openai-compatible.js +177 -0
- package/dist/heart/run-ledger.js +247 -0
- package/dist/heart/runtime-capability-check.js +170 -0
- package/dist/heart/runtime-credentials.js +607 -0
- package/dist/heart/runtime-cwd.js +87 -0
- package/dist/heart/sense-truth.js +22 -4
- package/dist/heart/session-activity.js +92 -24
- package/dist/heart/session-events.js +1504 -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-redaction-repair-cli-main.js +31 -0
- package/dist/heart/session-redaction-repair.js +552 -0
- package/dist/heart/session-stats-cli-main.js +5 -0
- package/dist/heart/session-stats.js +183 -0
- package/dist/heart/session-transcript.js +133 -0
- package/dist/heart/start-of-turn-packet.js +372 -0
- package/dist/heart/steward-policy.js +618 -0
- package/dist/heart/streaming.js +604 -207
- package/dist/heart/structured-output.js +196 -0
- package/dist/heart/sync-classification.js +176 -0
- package/dist/heart/sync.js +449 -0
- package/dist/heart/target-resolution.js +11 -7
- 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-approval.js +382 -0
- package/dist/heart/tool-description.js +155 -0
- package/dist/heart/tool-friction.js +55 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-context.js +482 -0
- package/dist/heart/turn-execution-lease.js +30 -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 +432 -0
- package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
- package/dist/heart/versioning/ouro-version-manager.js +409 -0
- package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
- package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
- package/dist/heart/versioning/update-hooks.js +154 -0
- package/dist/heart/versioning/version-intent.js +114 -0
- package/dist/heart/work-card.js +380 -0
- package/dist/mailbox-ui/assets/index-Cyv4mw3Y.js +1 -0
- package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
- package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
- package/dist/mailbox-ui/index.html +16 -0
- package/dist/mailroom/attention.js +167 -0
- package/dist/mailroom/autonomy.js +209 -0
- package/dist/mailroom/blob-store.js +889 -0
- package/dist/mailroom/body-cache.js +61 -0
- package/dist/mailroom/cache-sync-cli.js +58 -0
- package/dist/mailroom/core.js +803 -0
- package/dist/mailroom/entry.js +160 -0
- package/dist/mailroom/file-store.js +568 -0
- package/dist/mailroom/hosted-cache-sync.js +384 -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 +292 -0
- package/dist/mailroom/search-cache.js +513 -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 +24 -2
- package/dist/mind/context.js +309 -111
- package/dist/mind/desk-section.js +362 -0
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +68 -77
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/{associative-recall.js → note-search.js} +47 -58
- package/dist/mind/obligation-steering.js +199 -3
- package/dist/mind/pending.js +36 -10
- package/dist/mind/prompt-budget.js +479 -0
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +1050 -189
- package/dist/mind/provenance-trust.js +26 -0
- package/dist/mind/record-paths.js +312 -0
- package/dist/mind/scrutiny.js +173 -0
- package/dist/mind/session-transaction.js +564 -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 +139 -5
- package/dist/nerves/coverage/run-artifacts.js +55 -35
- package/dist/nerves/coverage/source-scanner.js +4 -4
- package/dist/nerves/event-buffer.js +111 -0
- package/dist/nerves/index.js +293 -9
- 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 +159 -0
- package/dist/nerves/runtime.js +17 -1
- package/dist/repertoire/ado-client.js +15 -56
- package/dist/repertoire/ado-semantic.js +16 -10
- package/dist/repertoire/api-client.js +97 -0
- package/dist/repertoire/bitwarden-store.js +1045 -0
- package/dist/repertoire/bundle-templates.js +71 -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 +174 -32
- package/dist/repertoire/coding/index.js +15 -3
- package/dist/repertoire/coding/manager.js +159 -10
- package/dist/repertoire/coding/spawner.js +58 -11
- package/dist/repertoire/coding/tools.js +221 -15
- package/dist/repertoire/coding/workbench-client.js +272 -0
- package/dist/repertoire/coding/workbench-manager.js +346 -0
- 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/desk/classifier.js +362 -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 +811 -18
- package/dist/repertoire/mcp-client.js +44 -3
- package/dist/repertoire/mcp-manager.js +427 -139
- package/dist/repertoire/mcp-tools.js +124 -0
- package/dist/repertoire/plugin-mcp.js +175 -0
- package/dist/repertoire/plugins.js +253 -0
- package/dist/repertoire/relationship-authorization.js +322 -0
- package/dist/repertoire/shell-sessions.js +134 -0
- package/dist/repertoire/skills.js +48 -4
- package/dist/repertoire/stripe-client.js +131 -0
- package/dist/repertoire/tool-arguments.js +170 -0
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-a2a.js +699 -0
- package/dist/repertoire/tools-attachments.js +322 -0
- package/dist/repertoire/tools-awaiting.js +575 -0
- package/dist/repertoire/tools-base.js +77 -1138
- package/dist/repertoire/tools-bluebubbles.js +2 -0
- package/dist/repertoire/tools-bridge.js +144 -0
- package/dist/repertoire/tools-bundle.js +993 -0
- package/dist/repertoire/tools-commerce.js +253 -0
- package/dist/repertoire/tools-config.js +186 -0
- package/dist/repertoire/tools-continuity.js +575 -0
- package/dist/repertoire/tools-credential.js +383 -0
- package/dist/repertoire/tools-evolution.js +527 -0
- package/dist/repertoire/tools-files.js +344 -0
- package/dist/repertoire/tools-flight.js +290 -0
- package/dist/repertoire/tools-flow.js +119 -0
- package/dist/repertoire/tools-github.js +3 -8
- package/dist/repertoire/tools-habits.js +103 -0
- package/dist/repertoire/tools-mail.js +1828 -0
- package/dist/repertoire/tools-notes.js +485 -0
- package/dist/repertoire/tools-obligations.js +182 -0
- package/dist/repertoire/tools-orientation.js +31 -0
- package/dist/repertoire/tools-record.js +482 -0
- package/dist/repertoire/tools-rsvp.js +139 -0
- package/dist/repertoire/tools-runtime.js +150 -0
- package/dist/repertoire/tools-sanctuary-host.js +202 -0
- package/dist/repertoire/tools-session.js +1133 -0
- package/dist/repertoire/tools-shell.js +149 -0
- package/dist/repertoire/tools-steward-policy.js +119 -0
- package/dist/repertoire/tools-stripe.js +224 -0
- package/dist/repertoire/tools-surface.js +369 -0
- package/dist/repertoire/tools-teams.js +12 -39
- package/dist/repertoire/tools-telegram-contacts.js +37 -0
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-trip.js +982 -0
- package/dist/repertoire/tools-unraid.js +531 -0
- package/dist/repertoire/tools-user-profile.js +146 -0
- package/dist/repertoire/tools-vault.js +40 -0
- package/dist/repertoire/tools-voice.js +145 -0
- package/dist/repertoire/tools.js +494 -148
- package/dist/repertoire/travel-api-client.js +360 -0
- package/dist/repertoire/unraid-client.js +155 -0
- package/dist/repertoire/unraid-restart.js +339 -0
- package/dist/repertoire/user-profile.js +131 -0
- package/dist/repertoire/vault-setup.js +246 -0
- package/dist/repertoire/vault-unlock.js +628 -0
- package/dist/rsvp/aisleplanner-client.js +354 -0
- package/dist/rsvp/cli.js +926 -0
- package/dist/rsvp/config.js +327 -0
- package/dist/rsvp/cutover.js +433 -0
- package/dist/rsvp/diagnostics.js +232 -0
- package/dist/rsvp/diff-renderer.js +176 -0
- package/dist/rsvp/habit-policy.js +110 -0
- package/dist/rsvp/habit-stage.js +123 -0
- package/dist/rsvp/incident-bundle.js +97 -0
- package/dist/rsvp/migration.js +204 -0
- package/dist/rsvp/native-habit-runner.js +630 -0
- package/dist/rsvp/outbound-state.js +628 -0
- package/dist/rsvp/query.js +118 -0
- package/dist/rsvp/replay.js +233 -0
- package/dist/rsvp/snapshot.js +232 -0
- package/dist/rsvp/spend-ledger.js +175 -0
- package/dist/scripts/claude-code-hook.js +41 -0
- package/dist/scripts/claude-code-stop-hook.js +47 -0
- package/dist/senses/a2a-entry.js +115 -0
- package/dist/senses/acp-server.js +386 -0
- package/dist/senses/attention-queue.js +186 -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} +355 -40
- package/dist/senses/bluebubbles/context-packet.js +207 -0
- package/dist/senses/bluebubbles/context-smoke.js +144 -0
- package/dist/senses/bluebubbles/entry.js +90 -0
- package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
- package/dist/senses/bluebubbles/index.js +3841 -0
- package/dist/senses/bluebubbles/latest-turn.js +311 -0
- package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
- package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
- package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
- package/dist/senses/bluebubbles/outbound-state.js +308 -0
- package/dist/senses/bluebubbles/processed-log.js +133 -0
- package/dist/senses/bluebubbles/reaction-policy.js +47 -0
- package/dist/senses/bluebubbles/replay.js +284 -0
- package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
- package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
- package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
- package/dist/senses/bluebubbles/webhook-registration.js +228 -0
- package/dist/senses/bluebubbles-meta-guard.js +39 -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 +241 -0
- package/dist/senses/cli/virtual-list.js +35 -0
- package/dist/senses/cli-entry.js +60 -8
- package/dist/senses/cli.js +604 -320
- package/dist/senses/commands.js +66 -3
- package/dist/senses/context-packet-ledger.js +371 -0
- package/dist/senses/context-packets.js +154 -0
- package/dist/senses/habit-lifecycle-guard.js +24 -0
- package/dist/senses/habit-turn-message.js +160 -0
- package/dist/senses/ingress-evidence.js +2 -0
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +524 -0
- package/dist/senses/pipeline.js +1115 -204
- package/dist/senses/private-runtime-worker.js +859 -0
- package/dist/senses/private-runtime.js +1517 -0
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/root-host-approval-port.js +345 -0
- package/dist/senses/root-host-approval-runtime.js +393 -0
- package/dist/senses/sanctuary-authority-resident.js +102 -0
- package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
- package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
- package/dist/senses/sanctuary-grounding.js +118 -0
- package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
- package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
- package/dist/senses/sanctuary-health-runner.js +100 -0
- package/dist/senses/sanctuary-health.js +408 -0
- package/dist/senses/sanctuary-install-state-contract.js +126 -0
- package/dist/senses/sanctuary-interactive-control.js +410 -0
- package/dist/senses/sanctuary-media-catalog-contract.js +297 -0
- package/dist/senses/sanctuary-media-optimization.js +514 -0
- package/dist/senses/sanctuary-runtime.js +340 -0
- package/dist/senses/sanctuary-sab.js +85 -0
- package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
- package/dist/senses/shared-turn.js +772 -0
- package/dist/senses/surface-tool.js +109 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +519 -218
- package/dist/senses/telegram-admission.js +718 -0
- package/dist/senses/telegram-approval-runtime.js +793 -0
- package/dist/senses/telegram-attachments.js +186 -0
- package/dist/senses/telegram-audit-ledger.js +220 -0
- package/dist/senses/telegram-authority-transport.js +231 -0
- package/dist/senses/telegram-client.js +1749 -0
- package/dist/senses/telegram-effect-adapter.js +896 -0
- package/dist/senses/telegram-entry.js +83 -0
- package/dist/senses/telegram.js +2324 -0
- package/dist/senses/trust-gate.js +104 -9
- 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 +5031 -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/dist/util/frontmatter.js +69 -0
- package/npm-shrinkwrap.json +8138 -0
- package/package.json +72 -13
- package/skills/agent-commerce.md +113 -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 -430
- package/dist/heart/daemon/ouro-path-installer.js +0 -260
- package/dist/heart/daemon/ouro-version-manager.js +0 -171
- package/dist/heart/daemon/update-hooks.js +0 -138
- package/dist/heart/obligations.js +0 -191
- package/dist/heart/safe-workspace.js +0 -228
- package/dist/heart/session-recall.js +0 -116
- package/dist/mind/friends/channel.js +0 -84
- package/dist/mind/friends/group-context.js +0 -144
- package/dist/mind/friends/resolver.js +0 -84
- package/dist/mind/friends/store-file.js +0 -190
- package/dist/mind/friends/store.js +0 -4
- package/dist/mind/friends/tokens.js +0 -26
- package/dist/mind/friends/trust-explanation.js +0 -74
- package/dist/mind/friends/types.js +0 -29
- package/dist/repertoire/tasks/board.js +0 -134
- package/dist/repertoire/tasks/index.js +0 -224
- package/dist/repertoire/tasks/lifecycle.js +0 -80
- package/dist/repertoire/tasks/middleware.js +0 -65
- package/dist/repertoire/tasks/parser.js +0 -173
- package/dist/repertoire/tasks/scanner.js +0 -132
- package/dist/repertoire/tasks/transitions.js +0 -144
- package/dist/senses/bluebubbles-entry.js +0 -13
- package/dist/senses/bluebubbles.js +0 -1181
- package/dist/senses/debug-activity.js +0 -154
- package/dist/senses/inner-dialog-worker.js +0 -90
- package/dist/senses/inner-dialog.js +0 -525
- 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/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +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,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 private-runtime 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,382 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ApprovalExecutionFailedError = exports.ApprovalExecutionIndeterminateError = void 0;
|
|
4
|
+
exports.coordinateApprovalDecision = coordinateApprovalDecision;
|
|
5
|
+
exports.digestApprovalSuspensionCheckpointPayload = digestApprovalSuspensionCheckpointPayload;
|
|
6
|
+
exports.commitApprovalProposal = commitApprovalProposal;
|
|
7
|
+
exports.recoverApprovalProposals = recoverApprovalProposals;
|
|
8
|
+
exports.digestApprovalToolDefinition = digestApprovalToolDefinition;
|
|
9
|
+
exports.executeApprovalDecision = executeApprovalDecision;
|
|
10
|
+
exports.recoverClaimedApproval = recoverClaimedApproval;
|
|
11
|
+
exports.recoverAttemptedApproval = recoverAttemptedApproval;
|
|
12
|
+
const node_crypto_1 = require("node:crypto");
|
|
13
|
+
const approval_store_1 = require("./approval-store");
|
|
14
|
+
const runtime_1 = require("../nerves/runtime");
|
|
15
|
+
const tool_arguments_1 = require("../repertoire/tool-arguments");
|
|
16
|
+
class ApprovalExecutionIndeterminateError extends Error {
|
|
17
|
+
constructor(message) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = "ApprovalExecutionIndeterminateError";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.ApprovalExecutionIndeterminateError = ApprovalExecutionIndeterminateError;
|
|
23
|
+
class ApprovalExecutionFailedError extends Error {
|
|
24
|
+
constructor(message) {
|
|
25
|
+
super(message);
|
|
26
|
+
this.name = "ApprovalExecutionFailedError";
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.ApprovalExecutionFailedError = ApprovalExecutionFailedError;
|
|
30
|
+
async function coordinateApprovalDecision(options) {
|
|
31
|
+
return options.withSessionLease(async (lease) => {
|
|
32
|
+
let currentSessionRevision = options.readCurrentRevision();
|
|
33
|
+
const record = await options.decideAndExecute({
|
|
34
|
+
currentSessionRevision,
|
|
35
|
+
lease,
|
|
36
|
+
hooks: {
|
|
37
|
+
afterClaim: async () => {
|
|
38
|
+
currentSessionRevision = options.readCurrentRevision();
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
await options.persist?.(record);
|
|
43
|
+
await options.resume(record);
|
|
44
|
+
(0, runtime_1.emitNervesEvent)({
|
|
45
|
+
component: "engine",
|
|
46
|
+
event: "engine.approval_decision_coordinated",
|
|
47
|
+
message: "approval decision coordinated under session turn lease",
|
|
48
|
+
meta: { approvalId: record.approvalId, state: record.state },
|
|
49
|
+
});
|
|
50
|
+
return { record };
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function checkpointMatches(record, checkpoint) {
|
|
54
|
+
return checkpoint.approvalId === record.approvalId
|
|
55
|
+
&& checkpoint.checkpointDigest === record.checkpointDigest
|
|
56
|
+
&& checkpoint.baseSessionRevision === record.baseSessionRevision
|
|
57
|
+
&& (record.state === "preparing" || checkpoint.suspendedSessionRevision === record.suspendedSessionRevision)
|
|
58
|
+
&& checkpoint.argumentDigest === record.argumentDigest
|
|
59
|
+
&& checkpoint.schemaDigest === record.schemaDigest
|
|
60
|
+
&& checkpoint.toolDigest === record.toolDigest
|
|
61
|
+
&& checkpoint.policyDigest === record.policyDigest
|
|
62
|
+
&& checkpoint.preCallDigest === digestTranscript(checkpoint.preCallMessages)
|
|
63
|
+
&& record.checkpointDigest === digestApprovalSuspensionCheckpointPayload(checkpoint)
|
|
64
|
+
&& JSON.stringify(checkpoint.frozenAssistantMessage) === JSON.stringify(record.frozenAssistantMessage);
|
|
65
|
+
}
|
|
66
|
+
function frozenCallMatches(record, checkpoint) {
|
|
67
|
+
const message = checkpoint.frozenAssistantMessage;
|
|
68
|
+
if (message.role !== "assistant")
|
|
69
|
+
return false;
|
|
70
|
+
if (!Array.isArray(message.tool_calls) || message.tool_calls.length !== 1)
|
|
71
|
+
return false;
|
|
72
|
+
const call = message.tool_calls[0];
|
|
73
|
+
if (!call || typeof call !== "object" || Array.isArray(call))
|
|
74
|
+
return false;
|
|
75
|
+
const callRecord = call;
|
|
76
|
+
if (callRecord.type !== "function")
|
|
77
|
+
return false;
|
|
78
|
+
const fn = callRecord.function;
|
|
79
|
+
if (!fn || typeof fn !== "object" || Array.isArray(fn))
|
|
80
|
+
return false;
|
|
81
|
+
const functionRecord = fn;
|
|
82
|
+
if (callRecord.id !== record.toolCallId || functionRecord.name !== record.toolName || typeof functionRecord.arguments !== "string")
|
|
83
|
+
return false;
|
|
84
|
+
try {
|
|
85
|
+
const parsed = JSON.parse(functionRecord.arguments);
|
|
86
|
+
return JSON.stringify(parsed) === JSON.stringify(record.arguments);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function digestTranscript(messages) {
|
|
93
|
+
return (0, node_crypto_1.createHash)("sha256").update(JSON.stringify(messages), "utf8").digest("hex");
|
|
94
|
+
}
|
|
95
|
+
function digestApprovalSuspensionCheckpointPayload(checkpoint) {
|
|
96
|
+
return (0, node_crypto_1.createHash)("sha256").update(JSON.stringify({
|
|
97
|
+
baseSessionRevision: checkpoint.baseSessionRevision,
|
|
98
|
+
argumentDigest: checkpoint.argumentDigest,
|
|
99
|
+
schemaDigest: checkpoint.schemaDigest,
|
|
100
|
+
toolDigest: checkpoint.toolDigest,
|
|
101
|
+
policyDigest: checkpoint.policyDigest,
|
|
102
|
+
preCallDigest: checkpoint.preCallDigest,
|
|
103
|
+
preCallMessages: checkpoint.preCallMessages,
|
|
104
|
+
frozenAssistantMessage: checkpoint.frozenAssistantMessage,
|
|
105
|
+
}), "utf8").digest("hex");
|
|
106
|
+
}
|
|
107
|
+
function digestDecisionToken(token) {
|
|
108
|
+
return (0, node_crypto_1.createHash)("sha256").update(token, "utf8").digest("hex");
|
|
109
|
+
}
|
|
110
|
+
function commitApprovalProposal(options) {
|
|
111
|
+
(0, runtime_1.emitNervesEvent)({
|
|
112
|
+
component: "engine",
|
|
113
|
+
event: "engine.approval_proposal_commit_start",
|
|
114
|
+
message: "approval proposal commit started",
|
|
115
|
+
meta: { toolName: options.proposal.toolName, toolCallId: options.proposal.toolCallId },
|
|
116
|
+
});
|
|
117
|
+
const preCallDigest = digestTranscript(options.preCallMessages);
|
|
118
|
+
const checkpointDigest = digestApprovalSuspensionCheckpointPayload({
|
|
119
|
+
baseSessionRevision: options.proposal.baseSessionRevision,
|
|
120
|
+
argumentDigest: (0, approval_store_1.canonicalApprovalArguments)(options.proposal.arguments).digest,
|
|
121
|
+
schemaDigest: options.proposal.schemaDigest,
|
|
122
|
+
toolDigest: options.proposal.toolDigest,
|
|
123
|
+
policyDigest: options.proposal.policyDigest,
|
|
124
|
+
preCallDigest,
|
|
125
|
+
preCallMessages: options.preCallMessages,
|
|
126
|
+
frozenAssistantMessage: options.proposal.frozenAssistantMessage,
|
|
127
|
+
});
|
|
128
|
+
const prepared = options.approvalStore.prepare({ ...options.proposal, checkpointDigest });
|
|
129
|
+
options.hooks?.afterJournalPrepare?.();
|
|
130
|
+
options.tokenStore.put(prepared.record.approvalId, prepared.decisionToken);
|
|
131
|
+
options.hooks?.afterTokenPersist?.();
|
|
132
|
+
const attestation = options.checkpointStore.write({
|
|
133
|
+
approvalId: prepared.record.approvalId,
|
|
134
|
+
baseSessionRevision: prepared.record.baseSessionRevision,
|
|
135
|
+
argumentDigest: prepared.record.argumentDigest,
|
|
136
|
+
schemaDigest: prepared.record.schemaDigest,
|
|
137
|
+
toolDigest: prepared.record.toolDigest,
|
|
138
|
+
policyDigest: prepared.record.policyDigest,
|
|
139
|
+
preCallDigest,
|
|
140
|
+
preCallMessages: structuredClone(options.preCallMessages),
|
|
141
|
+
frozenAssistantMessage: structuredClone(prepared.record.frozenAssistantMessage),
|
|
142
|
+
});
|
|
143
|
+
options.hooks?.afterCheckpointWrite?.();
|
|
144
|
+
if (attestation.checkpointDigest !== prepared.record.checkpointDigest) {
|
|
145
|
+
options.tokenStore.remove(prepared.record.approvalId);
|
|
146
|
+
options.checkpointStore.remove(prepared.record.approvalId);
|
|
147
|
+
options.approvalStore.recoverPreparing({
|
|
148
|
+
approvalId: prepared.record.approvalId,
|
|
149
|
+
state: "drifted",
|
|
150
|
+
reason: "checkpoint attestation digest mismatch",
|
|
151
|
+
});
|
|
152
|
+
(0, runtime_1.emitNervesEvent)({
|
|
153
|
+
level: "error",
|
|
154
|
+
component: "engine",
|
|
155
|
+
event: "engine.approval_checkpoint_attestation_mismatch",
|
|
156
|
+
message: "approval checkpoint durability attestation did not match proposal",
|
|
157
|
+
meta: { approvalId: prepared.record.approvalId },
|
|
158
|
+
});
|
|
159
|
+
throw new approval_store_1.ApprovalStoreError("checkpoint_attestation_mismatch");
|
|
160
|
+
}
|
|
161
|
+
const record = options.approvalStore.activate({
|
|
162
|
+
approvalId: prepared.record.approvalId,
|
|
163
|
+
checkpointDigest: attestation.checkpointDigest,
|
|
164
|
+
suspendedSessionRevision: attestation.suspendedSessionRevision,
|
|
165
|
+
});
|
|
166
|
+
(0, runtime_1.emitNervesEvent)({
|
|
167
|
+
component: "engine",
|
|
168
|
+
event: "engine.approval_proposal_commit_end",
|
|
169
|
+
message: "approval proposal checkpoint activated",
|
|
170
|
+
meta: { approvalId: record.approvalId },
|
|
171
|
+
});
|
|
172
|
+
return { record, decisionToken: prepared.decisionToken };
|
|
173
|
+
}
|
|
174
|
+
function recoverApprovalProposals(options) {
|
|
175
|
+
const recovered = [];
|
|
176
|
+
const preparing = options.approvalStore.listPreparing();
|
|
177
|
+
const preparingIds = new Set(preparing.map((record) => record.approvalId));
|
|
178
|
+
for (const checkpoint of options.checkpointStore.list()) {
|
|
179
|
+
if (preparingIds.has(checkpoint.approvalId) || options.approvalStore.read(checkpoint.approvalId))
|
|
180
|
+
continue;
|
|
181
|
+
options.checkpointStore.remove(checkpoint.approvalId);
|
|
182
|
+
recovered.push({ approvalId: checkpoint.approvalId, state: "orphan_checkpoint_removed" });
|
|
183
|
+
(0, runtime_1.emitNervesEvent)({
|
|
184
|
+
level: "warn",
|
|
185
|
+
component: "engine",
|
|
186
|
+
event: "engine.approval_orphan_checkpoint_removed",
|
|
187
|
+
message: "removed approval checkpoint with no journal authority",
|
|
188
|
+
meta: { approvalId: checkpoint.approvalId },
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
for (const record of preparing) {
|
|
192
|
+
const checkpoint = options.checkpointStore.read(record.approvalId);
|
|
193
|
+
const token = options.tokenStore.get(record.approvalId);
|
|
194
|
+
const hasToken = token !== null;
|
|
195
|
+
const tokenMatches = token !== null && digestDecisionToken(token) === record.decisionTokenDigest;
|
|
196
|
+
if (checkpoint && tokenMatches && checkpointMatches(record, checkpoint)) {
|
|
197
|
+
const activated = options.approvalStore.activate({
|
|
198
|
+
approvalId: record.approvalId,
|
|
199
|
+
checkpointDigest: checkpoint.checkpointDigest,
|
|
200
|
+
suspendedSessionRevision: checkpoint.suspendedSessionRevision,
|
|
201
|
+
});
|
|
202
|
+
recovered.push({ approvalId: record.approvalId, state: activated.state });
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
options.tokenStore.remove(record.approvalId);
|
|
206
|
+
if (checkpoint)
|
|
207
|
+
options.checkpointStore.remove(record.approvalId);
|
|
208
|
+
const checkpointMismatch = checkpoint !== null && !checkpointMatches(record, checkpoint);
|
|
209
|
+
const tokenMismatch = hasToken && !tokenMatches;
|
|
210
|
+
const mismatch = checkpointMismatch || tokenMismatch;
|
|
211
|
+
const terminal = options.approvalStore.recoverPreparing({
|
|
212
|
+
approvalId: record.approvalId,
|
|
213
|
+
state: mismatch ? "drifted" : "abandoned_before_attempt",
|
|
214
|
+
reason: tokenMismatch ? "decision token evidence mismatch" : mismatch ? "checkpoint evidence mismatch" : "incomplete proposal commit",
|
|
215
|
+
});
|
|
216
|
+
recovered.push({ approvalId: record.approvalId, state: terminal.state });
|
|
217
|
+
}
|
|
218
|
+
(0, runtime_1.emitNervesEvent)({
|
|
219
|
+
component: "engine",
|
|
220
|
+
event: "engine.approval_proposal_recovery",
|
|
221
|
+
message: "approval proposal recovery scan completed",
|
|
222
|
+
meta: { recoveredCount: recovered.length },
|
|
223
|
+
});
|
|
224
|
+
return recovered;
|
|
225
|
+
}
|
|
226
|
+
function terminalizeClaimed(store, claimed, state, reason) {
|
|
227
|
+
(0, runtime_1.emitNervesEvent)({
|
|
228
|
+
level: "warn",
|
|
229
|
+
component: "engine",
|
|
230
|
+
event: "engine.approval_pre_attempt_terminalized",
|
|
231
|
+
message: "approval stopped during live revalidation",
|
|
232
|
+
meta: { approvalId: claimed.approvalId, state, reason },
|
|
233
|
+
});
|
|
234
|
+
return store.terminalizeBeforeAttempt({
|
|
235
|
+
approvalId: claimed.approvalId,
|
|
236
|
+
ownerId: claimed.ownerId,
|
|
237
|
+
epoch: claimed.epoch,
|
|
238
|
+
state,
|
|
239
|
+
reason,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
function digestApprovalToolDefinition(definition, schemaDigest, policyId) {
|
|
243
|
+
const binding = definition.mcpBinding;
|
|
244
|
+
return (0, tool_arguments_1.digestJson)({
|
|
245
|
+
name: definition.tool.function.name, schemaDigest, policyId, advertisedTool: JSON.parse(JSON.stringify(definition.tool)),
|
|
246
|
+
...(binding ? { mcp: {
|
|
247
|
+
agentName: binding.agentName, agentRoot: binding.agentRoot,
|
|
248
|
+
server: binding.server, rawName: binding.rawName, surfacedName: binding.surfacedName,
|
|
249
|
+
source: binding.source, pluginId: binding.pluginId ?? null,
|
|
250
|
+
configDigest: binding.configDigest,
|
|
251
|
+
} } : {}),
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
async function resolveApprovalTool(options, decided) {
|
|
255
|
+
const definition = await options.resolveTool(decided.toolName);
|
|
256
|
+
if (!definition || definition.tool.function.name !== decided.toolName) {
|
|
257
|
+
return { ok: false, reason: "tool identity drift" };
|
|
258
|
+
}
|
|
259
|
+
const schema = definition.tool.function.parameters;
|
|
260
|
+
if (!schema || typeof schema !== "object") {
|
|
261
|
+
return { ok: false, reason: "advertised schema missing" };
|
|
262
|
+
}
|
|
263
|
+
const validated = (0, tool_arguments_1.validateAdvertisedToolArguments)(JSON.stringify(decided.arguments), schema);
|
|
264
|
+
if (!validated.ok || validated.value.argumentDigest !== decided.argumentDigest
|
|
265
|
+
|| validated.value.schemaDigest !== decided.schemaDigest) {
|
|
266
|
+
return { ok: false, reason: "tool arguments or schema drift" };
|
|
267
|
+
}
|
|
268
|
+
const policy = await options.resolveApprovalPolicy?.(decided.toolName, validated.value.arguments)
|
|
269
|
+
?? definition.approvalPolicy?.(validated.value.arguments)
|
|
270
|
+
?? { kind: "not_required" };
|
|
271
|
+
if (policy.kind !== "required") {
|
|
272
|
+
return { ok: false, reason: "approval policy no longer requires approval" };
|
|
273
|
+
}
|
|
274
|
+
const toolDigest = digestApprovalToolDefinition(definition, validated.value.schemaDigest, policy.policyId);
|
|
275
|
+
const policyDigest = (0, tool_arguments_1.digestJson)({ policyId: policy.policyId, actionClass: policy.actionClass, classification: "required" });
|
|
276
|
+
if (policy.policyId !== decided.policyId || toolDigest !== decided.toolDigest || policyDigest !== decided.policyDigest) {
|
|
277
|
+
return { ok: false, reason: "approval policy or tool digest drift" };
|
|
278
|
+
}
|
|
279
|
+
return { ok: true, definition, arguments: validated.value.arguments };
|
|
280
|
+
}
|
|
281
|
+
async function executeApprovalDecision(options) {
|
|
282
|
+
const decided = options.approvalStore.decide({ ...options.decision, ownerId: options.ownerId });
|
|
283
|
+
if (decided.state !== "claimed")
|
|
284
|
+
return decided;
|
|
285
|
+
await options.hooks?.afterClaim?.();
|
|
286
|
+
let currentSessionRevision;
|
|
287
|
+
try {
|
|
288
|
+
currentSessionRevision = typeof options.currentSessionRevision === "function" ? options.currentSessionRevision() : options.currentSessionRevision;
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
return terminalizeClaimed(options.approvalStore, decided, "drifted", "current session revision is unavailable");
|
|
292
|
+
}
|
|
293
|
+
if (currentSessionRevision !== decided.suspendedSessionRevision) {
|
|
294
|
+
return terminalizeClaimed(options.approvalStore, decided, "session_head_changed", "suspended session revision changed");
|
|
295
|
+
}
|
|
296
|
+
const checkpoint = options.checkpointStore.read(decided.approvalId);
|
|
297
|
+
if (!checkpoint || !checkpointMatches(decided, checkpoint) || !frozenCallMatches(decided, checkpoint)) {
|
|
298
|
+
return terminalizeClaimed(options.approvalStore, decided, "drifted", "checkpoint evidence drift");
|
|
299
|
+
}
|
|
300
|
+
const current = await resolveApprovalTool(options, decided);
|
|
301
|
+
if (!current.ok)
|
|
302
|
+
return terminalizeClaimed(options.approvalStore, decided, "drifted", current.reason);
|
|
303
|
+
const context = {
|
|
304
|
+
record: structuredClone(decided),
|
|
305
|
+
checkpoint: structuredClone(checkpoint),
|
|
306
|
+
definition: current.definition,
|
|
307
|
+
arguments: structuredClone(current.arguments),
|
|
308
|
+
};
|
|
309
|
+
const guard = await options.liveGuard(context);
|
|
310
|
+
if (!guard.ok)
|
|
311
|
+
return terminalizeClaimed(options.approvalStore, decided, "drifted", guard.reason);
|
|
312
|
+
const risk = await options.liveRisk(context);
|
|
313
|
+
if (!risk.ok)
|
|
314
|
+
return terminalizeClaimed(options.approvalStore, decided, "drifted", risk.reason);
|
|
315
|
+
const fresh = await resolveApprovalTool(options, decided);
|
|
316
|
+
if (!fresh.ok)
|
|
317
|
+
return terminalizeClaimed(options.approvalStore, decided, "drifted", fresh.reason);
|
|
318
|
+
const preflight = options.preflight
|
|
319
|
+
? await options.preflight({ ...context, definition: fresh.definition, arguments: structuredClone(fresh.arguments) })
|
|
320
|
+
: { ok: false, reason: "canonical tool preflight is unavailable" };
|
|
321
|
+
if (!preflight.ok)
|
|
322
|
+
return terminalizeClaimed(options.approvalStore, decided, "drifted", preflight.reason);
|
|
323
|
+
const attempted = options.approvalStore.markAttempted({
|
|
324
|
+
approvalId: decided.approvalId,
|
|
325
|
+
ownerId: decided.ownerId,
|
|
326
|
+
epoch: decided.epoch,
|
|
327
|
+
});
|
|
328
|
+
await options.hooks?.afterAttempt?.();
|
|
329
|
+
let result;
|
|
330
|
+
try {
|
|
331
|
+
result = await options.execute(attempted.toolName, structuredClone(attempted.arguments));
|
|
332
|
+
}
|
|
333
|
+
catch (error) {
|
|
334
|
+
if (!(error instanceof ApprovalExecutionFailedError))
|
|
335
|
+
throw error;
|
|
336
|
+
result = { kind: "handler_failed", text: `error: ${error.message}`, error };
|
|
337
|
+
}
|
|
338
|
+
if (!result || typeof result.text !== "string"
|
|
339
|
+
|| !["rejected_before_handler", "handler_succeeded", "handler_failed", "handler_indeterminate"].includes(result.kind)) {
|
|
340
|
+
throw new ApprovalExecutionIndeterminateError("executor returned an invalid typed outcome; action was not retried");
|
|
341
|
+
}
|
|
342
|
+
const state = result.kind === "handler_succeeded" ? "succeeded"
|
|
343
|
+
: result.kind === "handler_indeterminate" ? "attempted_indeterminate" : "failed";
|
|
344
|
+
const emptyText = {
|
|
345
|
+
rejected_before_handler: "tool preflight rejected execution",
|
|
346
|
+
handler_succeeded: "action completed without output",
|
|
347
|
+
handler_failed: "action failed without details",
|
|
348
|
+
handler_indeterminate: "execution outcome is indeterminate; action was not retried",
|
|
349
|
+
};
|
|
350
|
+
const text = result.text.trim() ? result.text : emptyText[result.kind];
|
|
351
|
+
await options.hooks?.afterHandler?.();
|
|
352
|
+
return options.approvalStore.complete({
|
|
353
|
+
approvalId: attempted.approvalId,
|
|
354
|
+
ownerId: attempted.ownerId,
|
|
355
|
+
epoch: attempted.epoch,
|
|
356
|
+
state,
|
|
357
|
+
result: result.kind === "rejected_before_handler" ? `no action was taken: ${text}` : text,
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
function recoverClaimedApproval(options) {
|
|
361
|
+
const record = options.approvalStore.read(options.approvalId);
|
|
362
|
+
if (!record || record.state !== "claimed" || !record.ownerId)
|
|
363
|
+
throw new approval_store_1.ApprovalStoreError("claimed_recovery_not_eligible");
|
|
364
|
+
return options.approvalStore.abandonBeforeAttempt({
|
|
365
|
+
approvalId: record.approvalId,
|
|
366
|
+
ownerId: record.ownerId,
|
|
367
|
+
epoch: record.epoch,
|
|
368
|
+
reason: options.reason,
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
function recoverAttemptedApproval(options) {
|
|
372
|
+
const record = options.approvalStore.read(options.approvalId);
|
|
373
|
+
if (!record || record.state !== "attempted" || !record.ownerId)
|
|
374
|
+
throw new approval_store_1.ApprovalStoreError("attempted_recovery_not_eligible");
|
|
375
|
+
return options.approvalStore.complete({
|
|
376
|
+
approvalId: record.approvalId,
|
|
377
|
+
ownerId: record.ownerId,
|
|
378
|
+
epoch: record.epoch,
|
|
379
|
+
state: "attempted_indeterminate",
|
|
380
|
+
result: "execution outcome is indeterminate after restart; action was not retried",
|
|
381
|
+
});
|
|
382
|
+
}
|