@ouro.bot/cli 0.1.0-alpha.70 → 0.1.0-alpha.700
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 +133 -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 +4454 -14
- 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 +144 -0
- package/dist/arc/episodes.js +118 -0
- package/dist/arc/evolution.js +490 -0
- package/dist/arc/flight-recorder.js +928 -0
- package/dist/arc/intentions.js +134 -0
- package/dist/arc/json-store.js +117 -0
- package/dist/arc/obligations.js +348 -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 +867 -43
- package/dist/heart/agent-entry.js +190 -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/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/autonomy-budget.js +434 -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 +378 -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 +135 -0
- package/dist/heart/config-registry.js +331 -0
- package/dist/heart/config.js +119 -127
- package/dist/heart/context-loss-gauntlet.js +354 -0
- package/dist/heart/context-loss-sentinel.js +1155 -0
- package/dist/heart/core.js +1306 -278
- package/dist/heart/cross-chat-delivery.js +8 -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 +523 -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-health-diagnostics.js +122 -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 +780 -0
- package/dist/heart/daemon/cli-desk.js +322 -0
- package/dist/heart/daemon/cli-exec.js +8142 -0
- package/dist/heart/daemon/cli-help.js +675 -0
- package/dist/heart/daemon/cli-parse.js +2461 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +770 -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 -1930
- package/dist/heart/daemon/daemon-entry.js +822 -10
- 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 +1264 -84
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +1126 -0
- package/dist/heart/daemon/habit-private-wake.js +56 -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 +110 -0
- package/dist/heart/daemon/mcp-canary.js +297 -0
- package/dist/heart/daemon/message-router.js +45 -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 +519 -40
- 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 +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 +41 -14
- 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 +670 -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 +171 -12
- package/dist/heart/daemon/stale-bundle-prune.js +113 -0
- package/dist/heart/daemon/startup-tui.js +338 -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 +255 -43
- 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 +121 -0
- package/dist/heart/habits/habit-migration.js +189 -0
- package/dist/heart/habits/habit-parser.js +214 -0
- package/dist/heart/habits/habit-runtime-state.js +114 -0
- package/dist/heart/habits/habit-scheduler.js +431 -0
- package/dist/heart/habits/habit-session-summary.js +318 -0
- package/dist/heart/habits/habit-session.js +617 -0
- package/dist/heart/{daemon → hatch}/hatch-flow.js +51 -60
- 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 +174 -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 +353 -0
- package/dist/heart/mailbox/mailbox-http-hooks.js +96 -0
- package/dist/heart/mailbox/mailbox-http-response.js +7 -0
- package/dist/heart/mailbox/mailbox-http-routes.js +375 -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 +37 -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 +815 -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 +696 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +11 -0
- package/dist/heart/orientation-frame.js +217 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/primitives.js +1 -1
- package/dist/heart/private-runtime/decision-renderer.js +156 -0
- package/dist/heart/private-runtime/index.js +18 -0
- package/dist/heart/private-runtime/ledger.js +218 -0
- package/dist/heart/private-runtime/policy.js +214 -0
- package/dist/heart/private-runtime/types.js +2 -0
- package/dist/heart/progress-story.js +1 -1
- package/dist/heart/provider-attempt.js +134 -0
- package/dist/heart/provider-binding-resolver.js +273 -0
- package/dist/heart/provider-credentials.js +441 -0
- package/dist/heart/provider-failover.js +311 -0
- package/dist/heart/provider-models.js +81 -0
- package/dist/heart/provider-ping.js +262 -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 +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 +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/run-ledger.js +247 -0
- package/dist/heart/runtime-capability-check.js +170 -0
- package/dist/heart/runtime-credentials.js +398 -0
- package/dist/heart/runtime-cwd.js +87 -0
- package/dist/heart/sense-truth.js +20 -4
- package/dist/heart/session-activity.js +90 -24
- package/dist/heart/session-events.js +1133 -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 +365 -0
- package/dist/heart/streaming.js +44 -27
- 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-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 +472 -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 +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/work-card.js +380 -0
- package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
- package/dist/mailbox-ui/assets/index-J8zDwHmE.js +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 +715 -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 +568 -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 +334 -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 +250 -101
- 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 +221 -0
- package/dist/mind/pending.js +13 -8
- package/dist/mind/prompt-budget.js +380 -0
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +1028 -169
- 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/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/event-buffer.js +111 -0
- package/dist/nerves/index.js +234 -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 +16 -10
- package/dist/repertoire/api-client.js +97 -0
- package/dist/repertoire/bitwarden-store.js +1042 -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 +218 -30
- package/dist/repertoire/coding/index.js +15 -3
- package/dist/repertoire/coding/manager.js +166 -10
- package/dist/repertoire/coding/spawner.js +58 -11
- package/dist/repertoire/coding/tools.js +242 -14
- 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 +156 -27
- package/dist/repertoire/mcp-client.js +44 -3
- package/dist/repertoire/mcp-manager.js +259 -20
- package/dist/repertoire/mcp-tools.js +83 -0
- package/dist/repertoire/plugin-mcp.js +175 -0
- package/dist/repertoire/plugins.js +253 -0
- package/dist/repertoire/shell-sessions.js +133 -0
- package/dist/repertoire/skills.js +48 -4
- package/dist/repertoire/stripe-client.js +131 -0
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-a2a.js +699 -0
- package/dist/repertoire/tools-attachments.js +317 -0
- package/dist/repertoire/tools-awaiting.js +372 -0
- package/dist/repertoire/tools-base.js +65 -1095
- 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 +252 -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-mail.js +1975 -0
- package/dist/repertoire/tools-notes.js +459 -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-session.js +881 -0
- package/dist/repertoire/tools-shell.js +120 -0
- package/dist/repertoire/tools-stripe.js +224 -0
- package/dist/repertoire/tools-surface.js +355 -0
- package/dist/repertoire/tools-teams.js +12 -39
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-trip.js +982 -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 +250 -80
- 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/rsvp/aisleplanner-client.js +354 -0
- package/dist/rsvp/cli.js +704 -0
- package/dist/rsvp/config.js +327 -0
- package/dist/rsvp/cutover.js +431 -0
- package/dist/rsvp/diagnostics.js +222 -0
- package/dist/rsvp/diff-renderer.js +161 -0
- package/dist/rsvp/habit-policy.js +85 -0
- package/dist/rsvp/habit-stage.js +93 -0
- package/dist/rsvp/incident-bundle.js +97 -0
- package/dist/rsvp/migration.js +204 -0
- package/dist/rsvp/outbound-state.js +254 -0
- package/dist/rsvp/query.js +118 -0
- package/dist/rsvp/replay.js +233 -0
- package/dist/rsvp/snapshot.js +232 -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/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} +226 -19
- 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 +2937 -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/outbound-state.js +304 -0
- package/dist/senses/bluebubbles/processed-log.js +133 -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-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
- 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 +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 +521 -214
- package/dist/senses/commands.js +66 -3
- package/dist/senses/context-packet-ledger.js +245 -0
- package/dist/senses/context-packets.js +154 -0
- package/dist/senses/habit-turn-message.js +160 -0
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +395 -0
- package/dist/senses/pipeline.js +952 -178
- package/dist/senses/private-runtime-worker.js +723 -0
- package/dist/senses/private-runtime.js +1157 -0
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +416 -0
- package/dist/senses/surface-tool.js +109 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +397 -112
- 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 +5081 -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/package.json +57 -12
- 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 -409
- package/dist/heart/daemon/ouro-path-installer.js +0 -178
- package/dist/heart/daemon/update-hooks.js +0 -138
- 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 -1180
- package/dist/senses/debug-activity.js +0 -148
- package/dist/senses/inner-dialog-worker.js +0 -90
- package/dist/senses/inner-dialog.js +0 -480
- 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
|
@@ -2,8 +2,20 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.formatCodingTail = formatCodingTail;
|
|
4
4
|
exports.attachCodingSessionFeedback = attachCodingSessionFeedback;
|
|
5
|
+
const identity_1 = require("../../heart/identity");
|
|
6
|
+
const socket_client_1 = require("../../heart/daemon/socket-client");
|
|
7
|
+
const obligations_1 = require("../../arc/obligations");
|
|
5
8
|
const runtime_1 = require("../../nerves/runtime");
|
|
6
9
|
const TERMINAL_UPDATE_KINDS = new Set(["completed", "failed", "killed"]);
|
|
10
|
+
const OBLIGATION_WAKE_UPDATE_KINDS = new Set([
|
|
11
|
+
"waiting_input",
|
|
12
|
+
"stalled",
|
|
13
|
+
"completed",
|
|
14
|
+
"failed",
|
|
15
|
+
"killed",
|
|
16
|
+
]);
|
|
17
|
+
const PULL_REQUEST_NUMBER_PATTERN = /\bPR\s*#(\d+)\b/i;
|
|
18
|
+
const PULL_REQUEST_URL_PATTERN = /\/pull\/(\d+)(?:\b|\/)?/i;
|
|
7
19
|
function clip(text, maxLength = 280) {
|
|
8
20
|
const trimmed = text.trim();
|
|
9
21
|
if (trimmed.length <= maxLength)
|
|
@@ -42,25 +54,133 @@ function lastMeaningfulLine(text) {
|
|
|
42
54
|
return clip(lines.at(-1));
|
|
43
55
|
}
|
|
44
56
|
function formatSessionLabel(session) {
|
|
45
|
-
|
|
57
|
+
const origin = session.originSession
|
|
58
|
+
? ` for ${session.originSession.channel}/${session.originSession.key}`
|
|
59
|
+
: "";
|
|
60
|
+
return `${session.runner} ${session.id}${origin}`;
|
|
61
|
+
}
|
|
62
|
+
function codingFeedbackOriginSessionId(session) {
|
|
63
|
+
return session.originSession
|
|
64
|
+
? `${session.originSession.friendId}/${session.originSession.channel}/${session.originSession.key}`
|
|
65
|
+
: "detached";
|
|
66
|
+
}
|
|
67
|
+
function buildCodingFeedbackPrivateWakeOptions(input) {
|
|
68
|
+
return {
|
|
69
|
+
reason: "coding feedback private attention",
|
|
70
|
+
triggerSource: "coding-feedback",
|
|
71
|
+
budgetClass: "interactive",
|
|
72
|
+
idempotencyKey: `coding-feedback:${input.agentName}:${input.obligationId}:${input.update.session.id}:${input.update.kind}`,
|
|
73
|
+
originRefs: [
|
|
74
|
+
{ kind: "coding-session", id: input.update.session.id },
|
|
75
|
+
{ kind: "coding-update", id: input.update.kind },
|
|
76
|
+
{ kind: "obligation", id: input.obligationId },
|
|
77
|
+
{ kind: "session", id: codingFeedbackOriginSessionId(input.update.session) },
|
|
78
|
+
],
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function extractPullRequestLabel(snippet) {
|
|
82
|
+
if (!snippet)
|
|
83
|
+
return null;
|
|
84
|
+
const numberMatch = snippet.match(PULL_REQUEST_NUMBER_PATTERN);
|
|
85
|
+
if (numberMatch)
|
|
86
|
+
return `PR #${numberMatch[1]}`;
|
|
87
|
+
const urlMatch = snippet.match(PULL_REQUEST_URL_PATTERN);
|
|
88
|
+
if (urlMatch)
|
|
89
|
+
return `PR #${urlMatch[1]}`;
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
function isMergedPullRequestSnippet(snippet) {
|
|
93
|
+
return /\bmerged\b/i.test(snippet) || /\blanded\b/i.test(snippet);
|
|
94
|
+
}
|
|
95
|
+
function deriveObligationMilestone(update) {
|
|
96
|
+
const snippet = pickUpdateSnippet(update);
|
|
97
|
+
const pullRequest = extractPullRequestLabel(snippet);
|
|
98
|
+
if (update.kind === "completed" && snippet && pullRequest && isMergedPullRequestSnippet(snippet)) {
|
|
99
|
+
return {
|
|
100
|
+
status: "updating_runtime",
|
|
101
|
+
currentSurface: { kind: "runtime", label: "ouro up" },
|
|
102
|
+
currentArtifact: pullRequest,
|
|
103
|
+
nextAction: "update runtime, verify version/changelog, then re-observe",
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
if (update.kind === "completed" && pullRequest) {
|
|
107
|
+
return {
|
|
108
|
+
status: "waiting_for_merge",
|
|
109
|
+
currentSurface: { kind: "merge", label: pullRequest },
|
|
110
|
+
currentArtifact: pullRequest,
|
|
111
|
+
nextAction: `wait for checks, merge ${pullRequest}, then update runtime`,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
if (update.kind === "waiting_input") {
|
|
115
|
+
return {
|
|
116
|
+
status: "investigating",
|
|
117
|
+
currentSurface: { kind: "coding", label: `${update.session.runner} ${update.session.id}` },
|
|
118
|
+
nextAction: `answer ${update.session.runner} ${update.session.id} and continue`,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
if (update.kind === "stalled") {
|
|
122
|
+
return {
|
|
123
|
+
status: "investigating",
|
|
124
|
+
currentSurface: { kind: "coding", label: `${update.session.runner} ${update.session.id}` },
|
|
125
|
+
nextAction: `unstick ${update.session.runner} ${update.session.id} and continue`,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
if (update.kind === "progress" || update.kind === "spawned" || update.kind === "failed" || update.kind === "killed" || update.kind === "completed") {
|
|
129
|
+
return {
|
|
130
|
+
status: "investigating",
|
|
131
|
+
currentSurface: { kind: "coding", label: `${update.session.runner} ${update.session.id}` },
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
return null;
|
|
46
135
|
}
|
|
47
136
|
function isSafeProgressSnippet(snippet) {
|
|
137
|
+
const normalized = snippet.trim();
|
|
48
138
|
const wordCount = snippet.split(/\s+/).filter(Boolean).length;
|
|
49
|
-
return (
|
|
139
|
+
return (normalized.length <= 80
|
|
140
|
+
&& wordCount >= 2
|
|
50
141
|
&& wordCount <= 8
|
|
51
|
-
&&
|
|
52
|
-
&& !
|
|
53
|
-
&&
|
|
54
|
-
&&
|
|
55
|
-
&& !/^
|
|
56
|
-
&& !/^
|
|
57
|
-
&& !/^
|
|
142
|
+
&& /[A-Za-z]{3,}/.test(normalized)
|
|
143
|
+
&& !normalized.includes(":")
|
|
144
|
+
&& !/[{}\[\]();]/.test(normalized)
|
|
145
|
+
&& !normalized.startsWith("**")
|
|
146
|
+
&& !/^Respond with\b/i.test(normalized)
|
|
147
|
+
&& !/^Coding session metadata\b/i.test(normalized)
|
|
148
|
+
&& !/^sessionId\b/i.test(normalized)
|
|
149
|
+
&& !/^taskRef\b/i.test(normalized)
|
|
150
|
+
&& !/^parentAgent\b/i.test(normalized));
|
|
58
151
|
}
|
|
59
152
|
function pickUpdateSnippet(update) {
|
|
60
|
-
|
|
153
|
+
const checkpoint = update.session.checkpoint?.trim() || null;
|
|
154
|
+
return (checkpoint
|
|
155
|
+
?? lastMeaningfulLine(update.text)
|
|
61
156
|
?? lastMeaningfulLine(update.session.stderrTail)
|
|
62
157
|
?? lastMeaningfulLine(update.session.stdoutTail));
|
|
63
158
|
}
|
|
159
|
+
function renderValue(text) {
|
|
160
|
+
const trimmed = text?.trim();
|
|
161
|
+
return trimmed && trimmed.length > 0 ? trimmed : "(empty)";
|
|
162
|
+
}
|
|
163
|
+
function renderPath(text) {
|
|
164
|
+
return text && text.trim().length > 0 ? text : "(none)";
|
|
165
|
+
}
|
|
166
|
+
function formatCodingTail(session) {
|
|
167
|
+
const stdout = renderValue(session.stdoutTail);
|
|
168
|
+
const stderr = renderValue(session.stderrTail);
|
|
169
|
+
return [
|
|
170
|
+
`sessionId: ${session.id}`,
|
|
171
|
+
`runner: ${session.runner}`,
|
|
172
|
+
`status: ${session.status}`,
|
|
173
|
+
`checkpoint: ${renderValue(session.checkpoint ?? undefined)}`,
|
|
174
|
+
`artifactPath: ${renderPath(session.artifactPath)}`,
|
|
175
|
+
`workdir: ${session.workdir}`,
|
|
176
|
+
"",
|
|
177
|
+
"[stdout]",
|
|
178
|
+
stdout,
|
|
179
|
+
"",
|
|
180
|
+
"[stderr]",
|
|
181
|
+
stderr,
|
|
182
|
+
].join("\n");
|
|
183
|
+
}
|
|
64
184
|
function formatUpdateMessage(update) {
|
|
65
185
|
const label = formatSessionLabel(update.session);
|
|
66
186
|
const snippet = pickUpdateSnippet(update);
|
|
@@ -81,26 +201,90 @@ function formatUpdateMessage(update) {
|
|
|
81
201
|
return `${label} started`;
|
|
82
202
|
}
|
|
83
203
|
}
|
|
84
|
-
function
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
204
|
+
function formatReportBackMessage(update, baseMessage) {
|
|
205
|
+
if (!baseMessage)
|
|
206
|
+
return null;
|
|
207
|
+
if (!update.session.obligationId || !update.session.originSession) {
|
|
208
|
+
return baseMessage;
|
|
209
|
+
}
|
|
210
|
+
const milestone = deriveObligationMilestone(update);
|
|
211
|
+
const extraLines = [];
|
|
212
|
+
if (milestone?.currentArtifact) {
|
|
213
|
+
extraLines.push(`current artifact: ${milestone.currentArtifact}`);
|
|
214
|
+
}
|
|
215
|
+
if (milestone?.nextAction) {
|
|
216
|
+
extraLines.push(`next: ${milestone.nextAction}`);
|
|
217
|
+
}
|
|
218
|
+
return extraLines.length > 0 ? `${baseMessage}\n${extraLines.join("\n")}` : baseMessage;
|
|
219
|
+
}
|
|
220
|
+
function obligationNoteFromUpdate(update) {
|
|
221
|
+
const snippet = pickUpdateSnippet(update);
|
|
222
|
+
switch (update.kind) {
|
|
223
|
+
case "spawned":
|
|
224
|
+
return update.session.originSession
|
|
225
|
+
? `coding session started for ${update.session.originSession.channel}/${update.session.originSession.key}`
|
|
226
|
+
: "coding session started";
|
|
227
|
+
case "progress":
|
|
228
|
+
return snippet ? `coding session progress: ${snippet}` : null;
|
|
229
|
+
case "waiting_input":
|
|
230
|
+
return snippet ? `coding session waiting: ${snippet}` : "coding session waiting for input";
|
|
231
|
+
case "stalled":
|
|
232
|
+
return snippet ? `coding session stalled: ${snippet}` : "coding session stalled";
|
|
233
|
+
case "completed":
|
|
234
|
+
return snippet
|
|
235
|
+
? `coding session completed: ${snippet}; merge/update still pending`
|
|
236
|
+
: "coding session completed; merge/update still pending";
|
|
237
|
+
case "failed":
|
|
238
|
+
return snippet ? `coding session failed: ${snippet}` : "coding session failed";
|
|
239
|
+
case "killed":
|
|
240
|
+
return "coding session killed";
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
function syncObligationFromUpdate(update) {
|
|
244
|
+
const obligationId = update.session.obligationId;
|
|
245
|
+
if (!obligationId)
|
|
246
|
+
return;
|
|
247
|
+
const milestone = deriveObligationMilestone(update);
|
|
248
|
+
try {
|
|
249
|
+
(0, obligations_1.advanceObligation)((0, identity_1.getAgentRoot)(), obligationId, {
|
|
250
|
+
status: milestone?.status ?? "investigating",
|
|
251
|
+
currentSurface: milestone?.currentSurface ?? { kind: "coding", label: `${update.session.runner} ${update.session.id}` },
|
|
252
|
+
currentArtifact: milestone?.currentArtifact,
|
|
253
|
+
nextAction: milestone?.nextAction,
|
|
254
|
+
latestNote: obligationNoteFromUpdate(update) ?? undefined,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
// Detached feedback should still reach the human even if obligation sync is unavailable.
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
async function requestPrivateWakeForObligation(update) {
|
|
262
|
+
const obligationId = update.session.obligationId;
|
|
263
|
+
if (!obligationId || !OBLIGATION_WAKE_UPDATE_KINDS.has(update.kind)) {
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
try {
|
|
267
|
+
const agentName = (0, identity_1.getAgentName)();
|
|
268
|
+
await (0, socket_client_1.requestPrivateWake)(agentName, undefined, buildCodingFeedbackPrivateWakeOptions({ agentName, obligationId, update }));
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
(0, runtime_1.emitNervesEvent)({
|
|
272
|
+
level: "warn",
|
|
273
|
+
component: "repertoire",
|
|
274
|
+
event: "repertoire.coding_feedback_wake_error",
|
|
275
|
+
message: "coding feedback wake request failed",
|
|
276
|
+
meta: {
|
|
277
|
+
sessionId: update.session.id,
|
|
278
|
+
kind: update.kind,
|
|
279
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
280
|
+
},
|
|
281
|
+
});
|
|
282
|
+
}
|
|
99
283
|
}
|
|
100
284
|
function attachCodingSessionFeedback(manager, session, target) {
|
|
101
285
|
let lastMessage = "";
|
|
102
286
|
let closed = false;
|
|
103
|
-
let unsubscribe =
|
|
287
|
+
let unsubscribe = null;
|
|
104
288
|
const sendMessage = (message) => {
|
|
105
289
|
if (closed || !message || message === lastMessage) {
|
|
106
290
|
return;
|
|
@@ -119,16 +303,20 @@ function attachCodingSessionFeedback(manager, session, target) {
|
|
|
119
303
|
});
|
|
120
304
|
});
|
|
121
305
|
};
|
|
122
|
-
|
|
306
|
+
const spawnedUpdate = { kind: "spawned", session };
|
|
307
|
+
syncObligationFromUpdate(spawnedUpdate);
|
|
308
|
+
sendMessage(formatReportBackMessage(spawnedUpdate, formatUpdateMessage(spawnedUpdate)));
|
|
123
309
|
unsubscribe = manager.subscribe(session.id, async (update) => {
|
|
124
|
-
|
|
310
|
+
syncObligationFromUpdate(update);
|
|
311
|
+
sendMessage(formatReportBackMessage(update, formatUpdateMessage(update)));
|
|
312
|
+
await requestPrivateWakeForObligation(update);
|
|
125
313
|
if (TERMINAL_UPDATE_KINDS.has(update.kind)) {
|
|
126
314
|
closed = true;
|
|
127
|
-
unsubscribe();
|
|
315
|
+
unsubscribe?.();
|
|
128
316
|
}
|
|
129
317
|
});
|
|
130
318
|
return () => {
|
|
131
319
|
closed = true;
|
|
132
|
-
unsubscribe();
|
|
320
|
+
unsubscribe?.();
|
|
133
321
|
};
|
|
134
322
|
}
|
|
@@ -1,19 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.formatCodingTail = exports.attachCodingSessionFeedback = exports.formatCodingMonitorReport = exports.CodingSessionMonitor = exports.CodingSessionManager = void 0;
|
|
3
|
+
exports.formatCodingTail = exports.attachCodingSessionFeedback = exports.formatCodingMonitorReport = exports.CodingSessionMonitor = exports.WorkbenchMcpClient = exports.WorkbenchCodingSessionManager = exports.CodingSessionManager = void 0;
|
|
4
4
|
exports.getCodingSessionManager = getCodingSessionManager;
|
|
5
5
|
exports.resetCodingSessionManager = resetCodingSessionManager;
|
|
6
6
|
const runtime_1 = require("../../nerves/runtime");
|
|
7
|
+
const config_1 = require("../../heart/config");
|
|
8
|
+
const identity_1 = require("../../heart/identity");
|
|
7
9
|
const manager_1 = require("./manager");
|
|
10
|
+
const workbench_manager_1 = require("./workbench-manager");
|
|
11
|
+
const workbench_client_1 = require("./workbench-client");
|
|
8
12
|
let manager = null;
|
|
9
13
|
function getCodingSessionManager() {
|
|
10
14
|
if (!manager) {
|
|
11
|
-
|
|
15
|
+
const config = (0, config_1.loadConfig)();
|
|
16
|
+
const backend = config.features.workbenchCoding ? "workbench" : "process";
|
|
17
|
+
manager = config.features.workbenchCoding
|
|
18
|
+
? new workbench_manager_1.WorkbenchCodingSessionManager({ agentName: (0, identity_1.getAgentName)(), client: new workbench_client_1.WorkbenchMcpClient() })
|
|
19
|
+
: new manager_1.CodingSessionManager({});
|
|
12
20
|
(0, runtime_1.emitNervesEvent)({
|
|
13
21
|
component: "repertoire",
|
|
14
22
|
event: "repertoire.coding_manager_init",
|
|
15
23
|
message: "initialized coding session manager singleton",
|
|
16
|
-
meta: {},
|
|
24
|
+
meta: { backend },
|
|
17
25
|
});
|
|
18
26
|
}
|
|
19
27
|
return manager;
|
|
@@ -30,6 +38,10 @@ function resetCodingSessionManager() {
|
|
|
30
38
|
}
|
|
31
39
|
var manager_2 = require("./manager");
|
|
32
40
|
Object.defineProperty(exports, "CodingSessionManager", { enumerable: true, get: function () { return manager_2.CodingSessionManager; } });
|
|
41
|
+
var workbench_manager_2 = require("./workbench-manager");
|
|
42
|
+
Object.defineProperty(exports, "WorkbenchCodingSessionManager", { enumerable: true, get: function () { return workbench_manager_2.WorkbenchCodingSessionManager; } });
|
|
43
|
+
var workbench_client_2 = require("./workbench-client");
|
|
44
|
+
Object.defineProperty(exports, "WorkbenchMcpClient", { enumerable: true, get: function () { return workbench_client_2.WorkbenchMcpClient; } });
|
|
33
45
|
var monitor_1 = require("./monitor");
|
|
34
46
|
Object.defineProperty(exports, "CodingSessionMonitor", { enumerable: true, get: function () { return monitor_1.CodingSessionMonitor; } });
|
|
35
47
|
var reporter_1 = require("./reporter");
|
|
@@ -37,19 +37,15 @@ exports.CodingSessionManager = void 0;
|
|
|
37
37
|
const fs = __importStar(require("fs"));
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
39
|
const identity_1 = require("../../heart/identity");
|
|
40
|
+
const session_events_1 = require("../../heart/session-events");
|
|
40
41
|
const runtime_1 = require("../../nerves/runtime");
|
|
41
42
|
const spawner_1 = require("./spawner");
|
|
42
|
-
function safeAgentName() {
|
|
43
|
-
try {
|
|
44
|
-
return (0, identity_1.getAgentName)();
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
return "default";
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
43
|
function defaultStateFilePath(agentName) {
|
|
51
44
|
return path.join((0, identity_1.getAgentRoot)(agentName), "state", "coding", "sessions.json");
|
|
52
45
|
}
|
|
46
|
+
function defaultArtifactDirPath(agentName) {
|
|
47
|
+
return path.join((0, identity_1.getAgentRoot)(agentName), "state", "coding", "sessions");
|
|
48
|
+
}
|
|
53
49
|
function isPidAlive(pid) {
|
|
54
50
|
try {
|
|
55
51
|
process.kill(pid, 0);
|
|
@@ -62,6 +58,9 @@ function isPidAlive(pid) {
|
|
|
62
58
|
function cloneSession(session) {
|
|
63
59
|
return {
|
|
64
60
|
...session,
|
|
61
|
+
originSession: session.originSession ? { ...session.originSession } : undefined,
|
|
62
|
+
checkpoint: session.checkpoint ?? null,
|
|
63
|
+
artifactPath: session.artifactPath,
|
|
65
64
|
stdoutTail: session.stdoutTail,
|
|
66
65
|
stderrTail: session.stderrTail,
|
|
67
66
|
failure: session.failure
|
|
@@ -85,6 +84,46 @@ function appendTail(existing, nextChunk, maxLength = 2000) {
|
|
|
85
84
|
const combined = `${existing}${nextChunk}`;
|
|
86
85
|
return combined.length <= maxLength ? combined : combined.slice(combined.length - maxLength);
|
|
87
86
|
}
|
|
87
|
+
function compactText(text) {
|
|
88
|
+
return text.replace(/\s+/g, " ").trim();
|
|
89
|
+
}
|
|
90
|
+
function clipText(text, maxLength = 240) {
|
|
91
|
+
return text.length <= maxLength ? text : `${text.slice(0, maxLength - 3)}...`;
|
|
92
|
+
}
|
|
93
|
+
function latestMeaningfulLine(text) {
|
|
94
|
+
const lines = text
|
|
95
|
+
.split(/\r?\n/)
|
|
96
|
+
.map((line) => compactText(line))
|
|
97
|
+
.filter(Boolean);
|
|
98
|
+
if (lines.length === 0)
|
|
99
|
+
return null;
|
|
100
|
+
return clipText(lines.at(-1));
|
|
101
|
+
}
|
|
102
|
+
function fallbackCheckpoint(status, code, signal) {
|
|
103
|
+
switch (status) {
|
|
104
|
+
case "waiting_input":
|
|
105
|
+
return "needs input";
|
|
106
|
+
case "stalled":
|
|
107
|
+
return "no recent output";
|
|
108
|
+
case "completed":
|
|
109
|
+
return "completed";
|
|
110
|
+
case "failed":
|
|
111
|
+
if (code !== null)
|
|
112
|
+
return `exit code ${code}`;
|
|
113
|
+
if (signal)
|
|
114
|
+
return `terminated by ${signal}`;
|
|
115
|
+
return "failed";
|
|
116
|
+
case "killed":
|
|
117
|
+
return "terminated by parent agent";
|
|
118
|
+
default:
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function deriveCheckpoint(session) {
|
|
123
|
+
return (latestMeaningfulLine(session.stderrTail)
|
|
124
|
+
?? latestMeaningfulLine(session.stdoutTail)
|
|
125
|
+
?? fallbackCheckpoint(session.status, session.lastExitCode, session.lastSignal));
|
|
126
|
+
}
|
|
88
127
|
function isSpawnCodingResult(value) {
|
|
89
128
|
return typeof value === "object" && value !== null && "process" in value;
|
|
90
129
|
}
|
|
@@ -122,6 +161,7 @@ class CodingSessionManager {
|
|
|
122
161
|
maxRestarts;
|
|
123
162
|
defaultStallThresholdMs;
|
|
124
163
|
stateFilePath;
|
|
164
|
+
artifactDirPath;
|
|
125
165
|
existsSync;
|
|
126
166
|
readFileSync;
|
|
127
167
|
writeFileSync;
|
|
@@ -139,8 +179,19 @@ class CodingSessionManager {
|
|
|
139
179
|
this.writeFileSync = options.writeFileSync ?? fs.writeFileSync;
|
|
140
180
|
this.mkdirSync = options.mkdirSync ?? fs.mkdirSync;
|
|
141
181
|
this.pidAlive = options.pidAlive ?? isPidAlive;
|
|
142
|
-
|
|
182
|
+
// No silent fallback to "default" — if there's no agentName and no
|
|
183
|
+
// explicit option, getAgentName() throws. The previous `safeAgentName`
|
|
184
|
+
// helper fell back to "default" and ended up writing coding session
|
|
185
|
+
// state to `~/AgentBundles/default.ouro/state/coding/sessions.json` on
|
|
186
|
+
// every vitest run because the coding manager singleton constructs with
|
|
187
|
+
// `{}`. That leaked real-fs state into the developer's home directory
|
|
188
|
+
// on every coverage run. Production callers always pass via argv (see
|
|
189
|
+
// getAgentName); test callers must either pass `agentName` explicitly
|
|
190
|
+
// or mock `../../heart/identity`.
|
|
191
|
+
this.agentName = options.agentName ?? (0, identity_1.getAgentName)();
|
|
143
192
|
this.stateFilePath = options.stateFilePath ?? defaultStateFilePath(this.agentName);
|
|
193
|
+
this.artifactDirPath = options.artifactDirPath
|
|
194
|
+
?? (options.stateFilePath ? path.dirname(options.stateFilePath) : defaultArtifactDirPath(this.agentName));
|
|
144
195
|
this.loadPersistedState();
|
|
145
196
|
}
|
|
146
197
|
async spawnSession(request) {
|
|
@@ -157,8 +208,13 @@ class CodingSessionManager {
|
|
|
157
208
|
runner: normalizedRequest.runner,
|
|
158
209
|
workdir: normalizedRequest.workdir,
|
|
159
210
|
taskRef: normalizedRequest.taskRef,
|
|
211
|
+
originSession: normalizedRequest.originSession ? { ...normalizedRequest.originSession } : undefined,
|
|
212
|
+
obligationId: normalizedRequest.obligationId,
|
|
213
|
+
evolutionCaseId: normalizedRequest.evolutionCaseId,
|
|
160
214
|
scopeFile: normalizedRequest.scopeFile,
|
|
161
215
|
stateFile: normalizedRequest.stateFile,
|
|
216
|
+
checkpoint: null,
|
|
217
|
+
artifactPath: this.artifactPathFor(id),
|
|
162
218
|
status: "spawning",
|
|
163
219
|
stdoutTail: "",
|
|
164
220
|
stderrTail: "",
|
|
@@ -245,6 +301,7 @@ class CodingSessionManager {
|
|
|
245
301
|
record.process.kill("SIGTERM");
|
|
246
302
|
record.process = null;
|
|
247
303
|
record.session.status = "killed";
|
|
304
|
+
record.session.checkpoint = "terminated by parent agent";
|
|
248
305
|
record.session.endedAt = this.nowIso();
|
|
249
306
|
(0, runtime_1.emitNervesEvent)({
|
|
250
307
|
component: "repertoire",
|
|
@@ -267,6 +324,7 @@ class CodingSessionManager {
|
|
|
267
324
|
continue;
|
|
268
325
|
stalled += 1;
|
|
269
326
|
record.session.status = "stalled";
|
|
327
|
+
record.session.checkpoint = deriveCheckpoint(record.session);
|
|
270
328
|
(0, runtime_1.emitNervesEvent)({
|
|
271
329
|
level: "warn",
|
|
272
330
|
component: "repertoire",
|
|
@@ -292,6 +350,7 @@ class CodingSessionManager {
|
|
|
292
350
|
record.process = null;
|
|
293
351
|
if (record.session.status === "running" || record.session.status === "spawning") {
|
|
294
352
|
record.session.status = "killed";
|
|
353
|
+
record.session.checkpoint = "terminated during manager shutdown";
|
|
295
354
|
record.session.endedAt = this.nowIso();
|
|
296
355
|
}
|
|
297
356
|
}
|
|
@@ -336,6 +395,13 @@ class CodingSessionManager {
|
|
|
336
395
|
record.session.endedAt = this.nowIso();
|
|
337
396
|
updateKind = "completed";
|
|
338
397
|
}
|
|
398
|
+
const checkpoint = latestMeaningfulLine(text);
|
|
399
|
+
if (checkpoint) {
|
|
400
|
+
record.session.checkpoint = checkpoint;
|
|
401
|
+
}
|
|
402
|
+
else if (!record.session.checkpoint) {
|
|
403
|
+
record.session.checkpoint = deriveCheckpoint(record.session);
|
|
404
|
+
}
|
|
339
405
|
(0, runtime_1.emitNervesEvent)({
|
|
340
406
|
component: "repertoire",
|
|
341
407
|
event: "repertoire.coding_session_output",
|
|
@@ -359,12 +425,14 @@ class CodingSessionManager {
|
|
|
359
425
|
record.session.lastSignal = signal;
|
|
360
426
|
if (record.session.status === "killed" || record.session.status === "completed") {
|
|
361
427
|
record.session.endedAt = this.nowIso();
|
|
428
|
+
record.session.checkpoint = deriveCheckpoint(record.session);
|
|
362
429
|
this.persistState();
|
|
363
430
|
return;
|
|
364
431
|
}
|
|
365
432
|
if (code === 0) {
|
|
366
433
|
record.session.status = "completed";
|
|
367
434
|
record.session.endedAt = this.nowIso();
|
|
435
|
+
record.session.checkpoint = deriveCheckpoint(record.session);
|
|
368
436
|
this.persistState();
|
|
369
437
|
this.notifyListeners(record.session.id, { kind: "completed", session: cloneSession(record.session) });
|
|
370
438
|
return;
|
|
@@ -376,6 +444,7 @@ class CodingSessionManager {
|
|
|
376
444
|
record.session.status = "failed";
|
|
377
445
|
record.session.endedAt = this.nowIso();
|
|
378
446
|
record.session.failure = defaultFailureDiagnostics(code, signal, record.command, record.args, record.stdoutTail, record.stderrTail);
|
|
447
|
+
record.session.checkpoint = deriveCheckpoint(record.session);
|
|
379
448
|
(0, runtime_1.emitNervesEvent)({
|
|
380
449
|
level: "error",
|
|
381
450
|
component: "repertoire",
|
|
@@ -401,6 +470,7 @@ class CodingSessionManager {
|
|
|
401
470
|
record.session.lastActivityAt = this.nowIso();
|
|
402
471
|
record.session.endedAt = null;
|
|
403
472
|
record.session.failure = null;
|
|
473
|
+
record.session.checkpoint = `restarted after ${reason}`;
|
|
404
474
|
this.attachProcessListeners(record);
|
|
405
475
|
(0, runtime_1.emitNervesEvent)({
|
|
406
476
|
level: "warn",
|
|
@@ -482,15 +552,22 @@ class CodingSessionManager {
|
|
|
482
552
|
}
|
|
483
553
|
const normalizedRequest = {
|
|
484
554
|
...request,
|
|
555
|
+
originSession: request.originSession ? { ...request.originSession } : undefined,
|
|
485
556
|
sessionId: request.sessionId ?? session.id,
|
|
557
|
+
obligationId: request.obligationId,
|
|
486
558
|
parentAgent: request.parentAgent ?? this.agentName,
|
|
487
559
|
};
|
|
488
560
|
const normalizedSession = {
|
|
489
561
|
...session,
|
|
490
562
|
taskRef: session.taskRef ?? normalizedRequest.taskRef,
|
|
563
|
+
originSession: session.originSession ?? normalizedRequest.originSession,
|
|
564
|
+
obligationId: session.obligationId ?? normalizedRequest.obligationId,
|
|
565
|
+
evolutionCaseId: session.evolutionCaseId ?? normalizedRequest.evolutionCaseId,
|
|
491
566
|
failure: session.failure ?? null,
|
|
492
567
|
stdoutTail: session.stdoutTail ?? session.failure?.stdoutTail ?? "",
|
|
493
568
|
stderrTail: session.stderrTail ?? session.failure?.stderrTail ?? "",
|
|
569
|
+
checkpoint: typeof session.checkpoint === "string" ? session.checkpoint : null,
|
|
570
|
+
artifactPath: typeof session.artifactPath === "string" ? session.artifactPath : this.artifactPathFor(session.id),
|
|
494
571
|
};
|
|
495
572
|
if (typeof normalizedSession.pid === "number") {
|
|
496
573
|
const alive = this.pidAlive(normalizedSession.pid);
|
|
@@ -503,6 +580,7 @@ class CodingSessionManager {
|
|
|
503
580
|
normalizedSession.pid = null;
|
|
504
581
|
}
|
|
505
582
|
}
|
|
583
|
+
normalizedSession.checkpoint = normalizedSession.checkpoint ?? deriveCheckpoint(normalizedSession);
|
|
506
584
|
this.records.set(normalizedSession.id, {
|
|
507
585
|
request: normalizedRequest,
|
|
508
586
|
session: normalizedSession,
|
|
@@ -525,7 +603,10 @@ class CodingSessionManager {
|
|
|
525
603
|
const payload = {
|
|
526
604
|
sequence: this.sequence,
|
|
527
605
|
records: [...this.records.values()].map((record) => ({
|
|
528
|
-
request:
|
|
606
|
+
request: {
|
|
607
|
+
...record.request,
|
|
608
|
+
prompt: (0, session_events_1.capStructuredRecordString)(record.request.prompt),
|
|
609
|
+
},
|
|
529
610
|
session: record.session,
|
|
530
611
|
})),
|
|
531
612
|
};
|
|
@@ -542,6 +623,81 @@ class CodingSessionManager {
|
|
|
542
623
|
meta: { path: this.stateFilePath, reason: error instanceof Error ? error.message : String(error) },
|
|
543
624
|
});
|
|
544
625
|
}
|
|
626
|
+
this.persistArtifacts();
|
|
627
|
+
}
|
|
628
|
+
artifactPathFor(sessionId) {
|
|
629
|
+
return path.join(this.artifactDirPath, `${sessionId}.md`);
|
|
630
|
+
}
|
|
631
|
+
renderArtifact(record) {
|
|
632
|
+
const { request, session } = record;
|
|
633
|
+
const stdout = session.stdoutTail.trim() || "(empty)";
|
|
634
|
+
const stderr = session.stderrTail.trim() || "(empty)";
|
|
635
|
+
const lines = [
|
|
636
|
+
"# Coding Session Artifact",
|
|
637
|
+
"",
|
|
638
|
+
"## Session",
|
|
639
|
+
`id: ${session.id}`,
|
|
640
|
+
`runner: ${session.runner}`,
|
|
641
|
+
`status: ${session.status}`,
|
|
642
|
+
`taskRef: ${session.taskRef ?? "unassigned"}`,
|
|
643
|
+
`evolutionCaseId: ${session.evolutionCaseId ?? "none"}`,
|
|
644
|
+
`workdir: ${session.workdir}`,
|
|
645
|
+
`startedAt: ${session.startedAt}`,
|
|
646
|
+
`lastActivityAt: ${session.lastActivityAt}`,
|
|
647
|
+
`endedAt: ${session.endedAt ?? "active"}`,
|
|
648
|
+
`pid: ${session.pid ?? "none"}`,
|
|
649
|
+
`restarts: ${session.restartCount}`,
|
|
650
|
+
`checkpoint: ${session.checkpoint ?? "none"}`,
|
|
651
|
+
`scopeFile: ${session.scopeFile ?? "none"}`,
|
|
652
|
+
`stateFile: ${session.stateFile ?? "none"}`,
|
|
653
|
+
"",
|
|
654
|
+
"## Request",
|
|
655
|
+
(0, session_events_1.capStructuredRecordString)(request.prompt),
|
|
656
|
+
"",
|
|
657
|
+
"## Stdout Tail",
|
|
658
|
+
stdout,
|
|
659
|
+
"",
|
|
660
|
+
"## Stderr Tail",
|
|
661
|
+
stderr,
|
|
662
|
+
];
|
|
663
|
+
if (session.failure) {
|
|
664
|
+
lines.push("", "## Failure", `command: ${session.failure.command}`, `args: ${session.failure.args.join(" ") || "(none)"}`, `code: ${session.failure.code ?? "null"}`, `signal: ${session.failure.signal ?? "null"}`);
|
|
665
|
+
}
|
|
666
|
+
return `${lines.join("\n")}\n`;
|
|
667
|
+
}
|
|
668
|
+
persistArtifacts() {
|
|
669
|
+
try {
|
|
670
|
+
this.mkdirSync(this.artifactDirPath, { recursive: true });
|
|
671
|
+
}
|
|
672
|
+
catch (error) {
|
|
673
|
+
(0, runtime_1.emitNervesEvent)({
|
|
674
|
+
level: "warn",
|
|
675
|
+
component: "repertoire",
|
|
676
|
+
event: "repertoire.coding_artifact_persist_error",
|
|
677
|
+
message: "failed preparing coding artifact directory",
|
|
678
|
+
meta: { path: this.artifactDirPath, reason: error instanceof Error ? error.message : String(error) },
|
|
679
|
+
});
|
|
680
|
+
return;
|
|
681
|
+
}
|
|
682
|
+
for (const record of this.records.values()) {
|
|
683
|
+
try {
|
|
684
|
+
record.session.artifactPath = record.session.artifactPath ?? this.artifactPathFor(record.session.id);
|
|
685
|
+
this.writeFileSync(record.session.artifactPath, this.renderArtifact(record), "utf-8");
|
|
686
|
+
}
|
|
687
|
+
catch (error) {
|
|
688
|
+
(0, runtime_1.emitNervesEvent)({
|
|
689
|
+
level: "warn",
|
|
690
|
+
component: "repertoire",
|
|
691
|
+
event: "repertoire.coding_artifact_persist_error",
|
|
692
|
+
message: "failed writing coding session artifact",
|
|
693
|
+
meta: {
|
|
694
|
+
id: record.session.id,
|
|
695
|
+
path: record.session.artifactPath ?? this.artifactPathFor(record.session.id),
|
|
696
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
697
|
+
},
|
|
698
|
+
});
|
|
699
|
+
}
|
|
700
|
+
}
|
|
545
701
|
}
|
|
546
702
|
}
|
|
547
703
|
exports.CodingSessionManager = CodingSessionManager;
|