@ouro.bot/cli 0.1.0-alpha.61 → 0.1.0-alpha.612
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +127 -23
- package/RepairGuide.ouro/agent.json +5 -0
- package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
- package/RepairGuide.ouro/psyche/SOUL.md +55 -0
- package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
- package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
- package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
- package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
- package/changelog.json +3912 -0
- package/dist/arc/attention-types.js +8 -0
- package/dist/arc/cares.js +144 -0
- package/dist/arc/episodes.js +118 -0
- package/dist/arc/intentions.js +134 -0
- package/dist/arc/json-store.js +117 -0
- package/dist/arc/obligations.js +266 -0
- package/dist/arc/packets.js +194 -0
- package/dist/arc/presence.js +185 -0
- package/dist/arc/task-lifecycle.js +65 -0
- package/dist/heart/active-work.js +837 -26
- package/dist/heart/agent-entry.js +69 -3
- package/dist/heart/attachments/image-normalize.js +194 -0
- package/dist/heart/attachments/materialize.js +97 -0
- package/dist/heart/attachments/originals.js +88 -0
- package/dist/heart/attachments/render.js +29 -0
- package/dist/heart/attachments/sources/adapter.js +2 -0
- package/dist/heart/attachments/sources/bluebubbles.js +156 -0
- package/dist/heart/attachments/sources/cli-local-file.js +78 -0
- package/dist/heart/attachments/sources/index.js +16 -0
- package/dist/heart/attachments/store.js +103 -0
- package/dist/heart/attachments/types.js +93 -0
- package/dist/heart/auth/auth-flow.js +479 -0
- package/dist/heart/awaiting/await-alert.js +146 -0
- package/dist/heart/awaiting/await-expiry.js +108 -0
- package/dist/heart/awaiting/await-loader.js +91 -0
- package/dist/heart/awaiting/await-parser.js +141 -0
- package/dist/heart/awaiting/await-runtime-state.js +100 -0
- package/dist/heart/awaiting/await-scheduler.js +377 -0
- package/dist/heart/background-operations.js +281 -0
- package/dist/heart/bridges/store.js +14 -2
- package/dist/heart/bundle-state.js +168 -0
- package/dist/heart/commitments.js +142 -0
- package/dist/heart/config-registry.js +322 -0
- package/dist/heart/config.js +114 -119
- package/dist/heart/core.js +909 -246
- package/dist/heart/cross-chat-delivery.js +3 -18
- package/dist/heart/daemon/agent-config-check.js +419 -0
- package/dist/heart/daemon/agent-discovery.js +102 -3
- package/dist/heart/daemon/agent-service.js +522 -0
- package/dist/heart/daemon/agentic-repair.js +547 -0
- package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
- package/dist/heart/daemon/boot-sync-probe.js +197 -0
- package/dist/heart/daemon/cadence.js +70 -0
- package/dist/heart/daemon/cli-defaults.js +776 -0
- package/dist/heart/daemon/cli-exec.js +7579 -0
- package/dist/heart/daemon/cli-help.js +498 -0
- package/dist/heart/daemon/cli-parse.js +1599 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +763 -0
- package/dist/heart/daemon/cli-types.js +8 -0
- package/dist/heart/daemon/connect-bay.js +323 -0
- package/dist/heart/daemon/daemon-cli.js +29 -1700
- package/dist/heart/daemon/daemon-entry.js +485 -2
- package/dist/heart/daemon/daemon-health.js +176 -0
- package/dist/heart/daemon/daemon-rollup.js +57 -0
- package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +904 -70
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +873 -0
- package/dist/heart/daemon/health-monitor.js +122 -1
- package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
- package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
- package/dist/heart/daemon/http-health-probe.js +80 -0
- package/dist/heart/daemon/human-command-screens.js +234 -0
- package/dist/heart/daemon/human-readiness.js +114 -0
- package/dist/heart/daemon/inner-status.js +89 -0
- package/dist/heart/daemon/interactive-repair.js +394 -0
- package/dist/heart/daemon/launchd.js +37 -8
- package/dist/heart/daemon/log-tailer.js +78 -9
- package/dist/heart/daemon/logs-prune.js +110 -0
- package/dist/heart/daemon/mcp-canary.js +297 -0
- package/dist/heart/daemon/os-cron-deps.js +135 -0
- package/dist/heart/daemon/os-cron.js +14 -12
- package/dist/heart/daemon/ouro-bot-entry.js +4 -2
- package/dist/heart/daemon/ouro-entry.js +3 -1
- package/dist/heart/daemon/process-manager.js +463 -34
- package/dist/heart/daemon/provider-discovery.js +137 -0
- package/dist/heart/daemon/provider-ping-progress.js +83 -0
- package/dist/heart/daemon/pulse.js +475 -0
- package/dist/heart/daemon/readiness-repair.js +365 -0
- package/dist/heart/daemon/run-hooks.js +2 -0
- package/dist/heart/daemon/runtime-logging.js +10 -2
- package/dist/heart/daemon/runtime-metadata.js +2 -30
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sense-manager.js +493 -38
- package/dist/heart/daemon/session-id-resolver.js +131 -0
- package/dist/heart/daemon/skill-management-installer.js +28 -7
- package/dist/heart/daemon/socket-client.js +158 -11
- package/dist/heart/daemon/stale-bundle-prune.js +96 -0
- package/dist/heart/daemon/startup-tui.js +330 -0
- package/dist/heart/daemon/task-scheduler.js +3 -25
- package/dist/heart/daemon/terminal-ui.js +499 -0
- package/dist/heart/daemon/thoughts.js +229 -17
- package/dist/heart/daemon/up-progress.js +366 -0
- package/dist/heart/daemon/vault-items.js +56 -0
- package/dist/heart/delegation.js +1 -1
- package/dist/heart/habits/habit-migration.js +189 -0
- package/dist/heart/habits/habit-parser.js +140 -0
- package/dist/heart/habits/habit-runtime-state.js +100 -0
- package/dist/heart/habits/habit-scheduler.js +372 -0
- package/dist/heart/{daemon → hatch}/hatch-flow.js +32 -56
- package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
- package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
- package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
- package/dist/heart/identity.js +166 -55
- package/dist/heart/kept-notes.js +357 -0
- package/dist/heart/kicks.js +1 -1
- package/dist/heart/machine-identity.js +161 -0
- package/dist/heart/mail-import-discovery.js +353 -0
- package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
- package/dist/heart/mailbox/mailbox-http-response.js +7 -0
- package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
- package/dist/heart/mailbox/mailbox-http-static.js +103 -0
- package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
- package/dist/heart/mailbox/mailbox-http.js +99 -0
- package/dist/heart/mailbox/mailbox-read.js +31 -0
- package/dist/heart/mailbox/mailbox-types.js +27 -0
- package/dist/heart/mailbox/mailbox-view.js +197 -0
- package/dist/heart/mailbox/readers/agent-machine.js +425 -0
- package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
- package/dist/heart/mailbox/readers/mail.js +375 -0
- package/dist/heart/mailbox/readers/runtime-readers.js +756 -0
- package/dist/heart/mailbox/readers/sessions.js +232 -0
- package/dist/heart/mailbox/readers/shared.js +111 -0
- package/dist/heart/mcp/mcp-server.js +656 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +19 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/provider-attempt.js +134 -0
- package/dist/heart/provider-binding-resolver.js +267 -0
- package/dist/heart/provider-credentials.js +425 -0
- package/dist/heart/provider-failover.js +301 -0
- package/dist/heart/provider-models.js +81 -0
- package/dist/heart/provider-ping.js +262 -0
- package/dist/heart/provider-readiness-cache.js +40 -0
- package/dist/heart/provider-visibility.js +188 -0
- package/dist/heart/providers/anthropic-token.js +131 -0
- package/dist/heart/providers/anthropic.js +139 -52
- package/dist/heart/providers/azure.js +23 -11
- package/dist/heart/providers/error-classification.js +127 -0
- package/dist/heart/providers/github-copilot.js +145 -0
- package/dist/heart/providers/minimax-vlm.js +189 -0
- package/dist/heart/providers/minimax.js +26 -8
- package/dist/heart/providers/openai-codex.js +55 -40
- package/dist/heart/runtime-capability-check.js +170 -0
- package/dist/heart/runtime-credentials.js +367 -0
- package/dist/heart/runtime-cwd.js +87 -0
- package/dist/heart/sense-truth.js +13 -4
- package/dist/heart/session-activity.js +48 -24
- package/dist/heart/session-events.js +1156 -0
- package/dist/heart/session-playback-cli-main.js +5 -0
- package/dist/heart/session-playback-cli.js +36 -0
- package/dist/heart/session-playback.js +231 -0
- package/dist/heart/session-stats-cli-main.js +5 -0
- package/dist/heart/session-stats.js +182 -0
- package/dist/heart/session-transcript.js +133 -0
- package/dist/heart/start-of-turn-packet.js +345 -0
- package/dist/heart/streaming.js +44 -27
- package/dist/heart/sync-classification.js +176 -0
- package/dist/heart/sync.js +449 -0
- package/dist/heart/target-resolution.js +9 -5
- package/dist/heart/tempo.js +93 -0
- package/dist/heart/temporal-view.js +41 -0
- package/dist/heart/timeouts.js +101 -0
- package/dist/heart/tool-activity-callbacks.js +59 -0
- package/dist/heart/tool-description.js +143 -0
- package/dist/heart/tool-friction.js +55 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-context.js +421 -0
- package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
- package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
- package/dist/heart/versioning/ouro-path-installer.js +426 -0
- package/dist/heart/versioning/ouro-version-manager.js +295 -0
- package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
- package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
- package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
- package/dist/mailbox-ui/assets/index-9-AxCxuB.js +61 -0
- package/dist/mailbox-ui/assets/index-CWzt267f.css +1 -0
- package/dist/mailbox-ui/index.html +15 -0
- package/dist/mailroom/attention.js +167 -0
- package/dist/mailroom/autonomy.js +209 -0
- package/dist/mailroom/blob-store.js +712 -0
- package/dist/mailroom/body-cache.js +61 -0
- package/dist/mailroom/core.js +788 -0
- package/dist/mailroom/entry.js +160 -0
- package/dist/mailroom/file-store.js +460 -0
- package/dist/mailroom/mbox-import.js +393 -0
- package/dist/mailroom/migration.js +164 -0
- package/dist/mailroom/outbound.js +380 -0
- package/dist/mailroom/policy.js +263 -0
- package/dist/mailroom/reader.js +233 -0
- package/dist/mailroom/search-cache.js +268 -0
- package/dist/mailroom/search-relevance.js +319 -0
- package/dist/mailroom/smtp-ingress.js +176 -0
- package/dist/mailroom/source-state.js +176 -0
- package/dist/mailroom/thread.js +109 -0
- package/dist/mailroom/travel-extract.js +89 -0
- package/dist/mind/bundle-manifest.js +7 -1
- package/dist/mind/context.js +250 -101
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +68 -76
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/friends/channel.js +39 -0
- package/dist/mind/friends/resolver.js +54 -2
- package/dist/mind/friends/store-file.js +48 -4
- package/dist/mind/friends/types.js +2 -2
- package/dist/mind/journal-index.js +162 -0
- package/dist/mind/note-search.js +268 -0
- package/dist/mind/obligation-steering.js +221 -0
- package/dist/mind/pending.js +6 -1
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +1051 -135
- package/dist/mind/provenance-trust.js +26 -0
- package/dist/mind/scrutiny.js +173 -0
- package/dist/nerves/cli-logging.js +7 -1
- package/dist/nerves/coverage/audit-rules.js +15 -6
- package/dist/nerves/coverage/audit.js +28 -2
- package/dist/nerves/coverage/cli.js +1 -1
- package/dist/nerves/coverage/contract.js +5 -5
- package/dist/nerves/coverage/file-completeness.js +129 -5
- package/dist/nerves/event-buffer.js +111 -0
- package/dist/nerves/index.js +224 -4
- package/dist/nerves/observation.js +20 -0
- package/dist/nerves/redact.js +79 -0
- package/dist/nerves/review/cli-main.js +5 -0
- package/dist/nerves/review/cli.js +156 -0
- package/dist/nerves/review/core.js +152 -0
- package/dist/nerves/runtime.js +5 -1
- package/dist/repertoire/ado-client.js +15 -56
- package/dist/repertoire/ado-semantic.js +11 -10
- package/dist/repertoire/api-client.js +97 -0
- package/dist/repertoire/bitwarden-store.js +997 -0
- package/dist/repertoire/bundle-templates.js +72 -0
- package/dist/repertoire/bw-installer.js +180 -0
- package/dist/repertoire/coding/codex-jsonl.js +64 -0
- package/dist/repertoire/coding/context-pack.js +331 -0
- package/dist/repertoire/coding/feedback.js +197 -30
- package/dist/repertoire/coding/manager.js +163 -10
- package/dist/repertoire/coding/spawner.js +55 -9
- package/dist/repertoire/coding/tools.js +170 -7
- package/dist/repertoire/commerce-errors.js +109 -0
- package/dist/repertoire/commerce-self-test.js +156 -0
- package/dist/repertoire/credential-access.js +178 -0
- package/dist/repertoire/duffel-client.js +185 -0
- package/dist/repertoire/github-client.js +14 -55
- package/dist/repertoire/graph-client.js +11 -52
- package/dist/repertoire/guardrails.js +396 -0
- package/dist/repertoire/mcp-client.js +295 -0
- package/dist/repertoire/mcp-manager.js +362 -0
- package/dist/repertoire/mcp-tools.js +63 -0
- package/dist/repertoire/shell-sessions.js +133 -0
- package/dist/repertoire/skills.js +18 -4
- package/dist/repertoire/stripe-client.js +131 -0
- package/dist/repertoire/tasks/board.js +31 -5
- package/dist/repertoire/tasks/fix.js +182 -0
- package/dist/repertoire/tasks/index.js +16 -4
- package/dist/repertoire/tasks/lifecycle.js +2 -2
- package/dist/repertoire/tasks/parser.js +3 -2
- package/dist/repertoire/tasks/scanner.js +194 -37
- package/dist/repertoire/tasks/transitions.js +16 -78
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-attachments.js +317 -0
- package/dist/repertoire/tools-awaiting.js +365 -0
- package/dist/repertoire/tools-base.js +55 -1082
- package/dist/repertoire/tools-bluebubbles.js +1 -0
- package/dist/repertoire/tools-bridge.js +141 -0
- package/dist/repertoire/tools-bundle.js +984 -0
- package/dist/repertoire/tools-config.js +185 -0
- package/dist/repertoire/tools-continuity.js +248 -0
- package/dist/repertoire/tools-credential.js +381 -0
- package/dist/repertoire/tools-files.js +342 -0
- package/dist/repertoire/tools-flight.js +224 -0
- package/dist/repertoire/tools-flow.js +119 -0
- package/dist/repertoire/tools-github.js +1 -7
- package/dist/repertoire/tools-mail.js +1916 -0
- package/dist/repertoire/tools-notes.js +421 -0
- package/dist/repertoire/tools-obligations.js +142 -0
- package/dist/repertoire/tools-record.js +463 -0
- package/dist/repertoire/tools-runtime.js +148 -0
- package/dist/repertoire/tools-session.js +781 -0
- package/dist/repertoire/tools-shell.js +120 -0
- package/dist/repertoire/tools-stripe.js +180 -0
- package/dist/repertoire/tools-surface.js +345 -0
- package/dist/repertoire/tools-teams.js +9 -39
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-trip.js +604 -0
- package/dist/repertoire/tools-user-profile.js +144 -0
- package/dist/repertoire/tools-vault.js +40 -0
- package/dist/repertoire/tools-voice.js +144 -0
- package/dist/repertoire/tools.js +115 -103
- package/dist/repertoire/travel-api-client.js +360 -0
- package/dist/repertoire/user-profile.js +131 -0
- package/dist/repertoire/vault-setup.js +246 -0
- package/dist/repertoire/vault-unlock.js +594 -0
- package/dist/scripts/claude-code-hook.js +41 -0
- package/dist/scripts/claude-code-stop-hook.js +47 -0
- package/dist/senses/attention-queue.js +116 -0
- package/dist/senses/await-turn-message.js +58 -0
- package/dist/senses/bluebubbles/active-turns.js +216 -0
- package/dist/senses/bluebubbles/attachment-cache.js +53 -0
- package/dist/senses/bluebubbles/attachment-download.js +137 -0
- package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
- package/dist/senses/bluebubbles/entry.js +77 -0
- package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
- package/dist/senses/bluebubbles/index.js +2613 -0
- package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
- package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
- package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
- package/dist/senses/bluebubbles/processed-log.js +133 -0
- package/dist/senses/bluebubbles/replay.js +137 -0
- package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
- package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
- package/dist/senses/bluebubbles-meta-guard.js +40 -0
- package/dist/senses/cli/bracketed-paste.js +82 -0
- package/dist/senses/cli/image-paste.js +287 -0
- package/dist/senses/cli/image-ref-navigation.js +75 -0
- package/dist/senses/cli/ink-app.js +156 -0
- package/dist/senses/cli/inline-diff.js +64 -0
- package/dist/senses/cli/input-keys.js +174 -0
- package/dist/senses/cli/kill-ring.js +86 -0
- package/dist/senses/cli/message-list.js +51 -0
- package/dist/senses/cli/ouro-tui.js +607 -0
- package/dist/senses/cli/spinner-imperative.js +135 -0
- package/dist/senses/cli/spinner.js +101 -0
- package/dist/senses/cli/status-line.js +60 -0
- package/dist/senses/cli/streaming-markdown.js +526 -0
- package/dist/senses/cli/tool-display.js +85 -0
- package/dist/senses/cli/tool-render.js +85 -0
- package/dist/senses/cli/tui-store.js +240 -0
- package/dist/senses/cli/virtual-list.js +35 -0
- package/dist/senses/cli-entry.js +60 -8
- package/dist/senses/cli-layout.js +100 -0
- package/dist/senses/cli.js +516 -204
- package/dist/senses/commands.js +66 -3
- package/dist/senses/habit-turn-message.js +108 -0
- package/dist/senses/inner-dialog-worker.js +185 -21
- package/dist/senses/inner-dialog.js +469 -39
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +379 -0
- package/dist/senses/pipeline.js +654 -181
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +392 -0
- package/dist/senses/surface-tool.js +70 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +387 -98
- package/dist/senses/trust-gate.js +100 -5
- package/dist/senses/voice/audio-playback.js +237 -0
- package/dist/senses/voice/audio-routing.js +119 -0
- package/dist/senses/voice/elevenlabs.js +202 -0
- package/dist/senses/voice/floor-control.js +431 -0
- package/dist/senses/voice/floor-controller.js +115 -0
- package/dist/senses/voice/golden-path.js +116 -0
- package/dist/senses/voice/index.js +29 -0
- package/dist/senses/voice/meeting.js +113 -0
- package/dist/senses/voice/outbound.js +190 -0
- package/dist/senses/voice/phone.js +33 -0
- package/dist/senses/voice/playback.js +139 -0
- package/dist/senses/voice/realtime-eval.js +496 -0
- package/dist/senses/voice/realtime-trace.js +531 -0
- package/dist/senses/voice/transcript.js +70 -0
- package/dist/senses/voice/turn.js +191 -0
- package/dist/senses/voice/twilio-phone-runtime.js +807 -0
- package/dist/senses/voice/twilio-phone.js +5079 -0
- package/dist/senses/voice/types.js +2 -0
- package/dist/senses/voice/whisper.js +161 -0
- package/dist/senses/voice-entry.js +81 -0
- package/dist/senses/voice-realtime-eval-command.js +99 -0
- package/dist/senses/voice-realtime-eval-entry.js +21 -0
- package/dist/senses/voice-twilio-entry.js +87 -0
- package/dist/trips/core.js +138 -0
- package/dist/trips/store.js +265 -0
- package/package.json +41 -7
- package/skills/agent-commerce.md +106 -0
- package/skills/browser-navigation.md +117 -0
- package/skills/commerce-setup-guide.md +116 -0
- package/skills/commerce-setup.md +84 -0
- package/skills/configure-dev-tools.md +99 -0
- package/skills/travel-planning.md +138 -0
- package/dist/heart/daemon/auth-flow.js +0 -351
- package/dist/heart/daemon/ouro-path-installer.js +0 -178
- package/dist/heart/safe-workspace.js +0 -228
- package/dist/heart/session-recall.js +0 -116
- package/dist/mind/associative-recall.js +0 -209
- package/dist/senses/bluebubbles-entry.js +0 -13
- package/dist/senses/bluebubbles.js +0 -1177
- package/dist/senses/debug-activity.js +0 -148
- package/subagents/README.md +0 -7
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
- /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
- /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
- /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
- /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
|
@@ -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,114 @@ 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 extractPullRequestLabel(snippet) {
|
|
63
|
+
if (!snippet)
|
|
64
|
+
return null;
|
|
65
|
+
const numberMatch = snippet.match(PULL_REQUEST_NUMBER_PATTERN);
|
|
66
|
+
if (numberMatch)
|
|
67
|
+
return `PR #${numberMatch[1]}`;
|
|
68
|
+
const urlMatch = snippet.match(PULL_REQUEST_URL_PATTERN);
|
|
69
|
+
if (urlMatch)
|
|
70
|
+
return `PR #${urlMatch[1]}`;
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
function isMergedPullRequestSnippet(snippet) {
|
|
74
|
+
return /\bmerged\b/i.test(snippet) || /\blanded\b/i.test(snippet);
|
|
75
|
+
}
|
|
76
|
+
function deriveObligationMilestone(update) {
|
|
77
|
+
const snippet = pickUpdateSnippet(update);
|
|
78
|
+
const pullRequest = extractPullRequestLabel(snippet);
|
|
79
|
+
if (update.kind === "completed" && snippet && pullRequest && isMergedPullRequestSnippet(snippet)) {
|
|
80
|
+
return {
|
|
81
|
+
status: "updating_runtime",
|
|
82
|
+
currentSurface: { kind: "runtime", label: "ouro up" },
|
|
83
|
+
currentArtifact: pullRequest,
|
|
84
|
+
nextAction: "update runtime, verify version/changelog, then re-observe",
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
if (update.kind === "completed" && pullRequest) {
|
|
88
|
+
return {
|
|
89
|
+
status: "waiting_for_merge",
|
|
90
|
+
currentSurface: { kind: "merge", label: pullRequest },
|
|
91
|
+
currentArtifact: pullRequest,
|
|
92
|
+
nextAction: `wait for checks, merge ${pullRequest}, then update runtime`,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
if (update.kind === "waiting_input") {
|
|
96
|
+
return {
|
|
97
|
+
status: "investigating",
|
|
98
|
+
currentSurface: { kind: "coding", label: `${update.session.runner} ${update.session.id}` },
|
|
99
|
+
nextAction: `answer ${update.session.runner} ${update.session.id} and continue`,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
if (update.kind === "stalled") {
|
|
103
|
+
return {
|
|
104
|
+
status: "investigating",
|
|
105
|
+
currentSurface: { kind: "coding", label: `${update.session.runner} ${update.session.id}` },
|
|
106
|
+
nextAction: `unstick ${update.session.runner} ${update.session.id} and continue`,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
if (update.kind === "progress" || update.kind === "spawned" || update.kind === "failed" || update.kind === "killed" || update.kind === "completed") {
|
|
110
|
+
return {
|
|
111
|
+
status: "investigating",
|
|
112
|
+
currentSurface: { kind: "coding", label: `${update.session.runner} ${update.session.id}` },
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
46
116
|
}
|
|
47
117
|
function isSafeProgressSnippet(snippet) {
|
|
118
|
+
const normalized = snippet.trim();
|
|
48
119
|
const wordCount = snippet.split(/\s+/).filter(Boolean).length;
|
|
49
|
-
return (
|
|
120
|
+
return (normalized.length <= 80
|
|
121
|
+
&& wordCount >= 2
|
|
50
122
|
&& wordCount <= 8
|
|
51
|
-
&&
|
|
52
|
-
&& !
|
|
53
|
-
&&
|
|
54
|
-
&&
|
|
55
|
-
&& !/^
|
|
56
|
-
&& !/^
|
|
57
|
-
&& !/^
|
|
123
|
+
&& /[A-Za-z]{3,}/.test(normalized)
|
|
124
|
+
&& !normalized.includes(":")
|
|
125
|
+
&& !/[{}\[\]();]/.test(normalized)
|
|
126
|
+
&& !normalized.startsWith("**")
|
|
127
|
+
&& !/^Respond with\b/i.test(normalized)
|
|
128
|
+
&& !/^Coding session metadata\b/i.test(normalized)
|
|
129
|
+
&& !/^sessionId\b/i.test(normalized)
|
|
130
|
+
&& !/^taskRef\b/i.test(normalized)
|
|
131
|
+
&& !/^parentAgent\b/i.test(normalized));
|
|
58
132
|
}
|
|
59
133
|
function pickUpdateSnippet(update) {
|
|
60
|
-
|
|
134
|
+
const checkpoint = update.session.checkpoint?.trim() || null;
|
|
135
|
+
return (checkpoint
|
|
136
|
+
?? lastMeaningfulLine(update.text)
|
|
61
137
|
?? lastMeaningfulLine(update.session.stderrTail)
|
|
62
138
|
?? lastMeaningfulLine(update.session.stdoutTail));
|
|
63
139
|
}
|
|
140
|
+
function renderValue(text) {
|
|
141
|
+
const trimmed = text?.trim();
|
|
142
|
+
return trimmed && trimmed.length > 0 ? trimmed : "(empty)";
|
|
143
|
+
}
|
|
144
|
+
function renderPath(text) {
|
|
145
|
+
return text && text.trim().length > 0 ? text : "(none)";
|
|
146
|
+
}
|
|
147
|
+
function formatCodingTail(session) {
|
|
148
|
+
const stdout = renderValue(session.stdoutTail);
|
|
149
|
+
const stderr = renderValue(session.stderrTail);
|
|
150
|
+
return [
|
|
151
|
+
`sessionId: ${session.id}`,
|
|
152
|
+
`runner: ${session.runner}`,
|
|
153
|
+
`status: ${session.status}`,
|
|
154
|
+
`checkpoint: ${renderValue(session.checkpoint ?? undefined)}`,
|
|
155
|
+
`artifactPath: ${renderPath(session.artifactPath)}`,
|
|
156
|
+
`workdir: ${session.workdir}`,
|
|
157
|
+
"",
|
|
158
|
+
"[stdout]",
|
|
159
|
+
stdout,
|
|
160
|
+
"",
|
|
161
|
+
"[stderr]",
|
|
162
|
+
stderr,
|
|
163
|
+
].join("\n");
|
|
164
|
+
}
|
|
64
165
|
function formatUpdateMessage(update) {
|
|
65
166
|
const label = formatSessionLabel(update.session);
|
|
66
167
|
const snippet = pickUpdateSnippet(update);
|
|
@@ -81,26 +182,88 @@ function formatUpdateMessage(update) {
|
|
|
81
182
|
return `${label} started`;
|
|
82
183
|
}
|
|
83
184
|
}
|
|
84
|
-
function
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
185
|
+
function formatReportBackMessage(update, baseMessage) {
|
|
186
|
+
if (!baseMessage)
|
|
187
|
+
return null;
|
|
188
|
+
if (!update.session.obligationId || !update.session.originSession) {
|
|
189
|
+
return baseMessage;
|
|
190
|
+
}
|
|
191
|
+
const milestone = deriveObligationMilestone(update);
|
|
192
|
+
const extraLines = [];
|
|
193
|
+
if (milestone?.currentArtifact) {
|
|
194
|
+
extraLines.push(`current artifact: ${milestone.currentArtifact}`);
|
|
195
|
+
}
|
|
196
|
+
if (milestone?.nextAction) {
|
|
197
|
+
extraLines.push(`next: ${milestone.nextAction}`);
|
|
198
|
+
}
|
|
199
|
+
return extraLines.length > 0 ? `${baseMessage}\n${extraLines.join("\n")}` : baseMessage;
|
|
200
|
+
}
|
|
201
|
+
function obligationNoteFromUpdate(update) {
|
|
202
|
+
const snippet = pickUpdateSnippet(update);
|
|
203
|
+
switch (update.kind) {
|
|
204
|
+
case "spawned":
|
|
205
|
+
return update.session.originSession
|
|
206
|
+
? `coding session started for ${update.session.originSession.channel}/${update.session.originSession.key}`
|
|
207
|
+
: "coding session started";
|
|
208
|
+
case "progress":
|
|
209
|
+
return snippet ? `coding session progress: ${snippet}` : null;
|
|
210
|
+
case "waiting_input":
|
|
211
|
+
return snippet ? `coding session waiting: ${snippet}` : "coding session waiting for input";
|
|
212
|
+
case "stalled":
|
|
213
|
+
return snippet ? `coding session stalled: ${snippet}` : "coding session stalled";
|
|
214
|
+
case "completed":
|
|
215
|
+
return snippet
|
|
216
|
+
? `coding session completed: ${snippet}; merge/update still pending`
|
|
217
|
+
: "coding session completed; merge/update still pending";
|
|
218
|
+
case "failed":
|
|
219
|
+
return snippet ? `coding session failed: ${snippet}` : "coding session failed";
|
|
220
|
+
case "killed":
|
|
221
|
+
return "coding session killed";
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
function syncObligationFromUpdate(update) {
|
|
225
|
+
const obligationId = update.session.obligationId;
|
|
226
|
+
if (!obligationId)
|
|
227
|
+
return;
|
|
228
|
+
const milestone = deriveObligationMilestone(update);
|
|
229
|
+
try {
|
|
230
|
+
(0, obligations_1.advanceObligation)((0, identity_1.getAgentRoot)(), obligationId, {
|
|
231
|
+
status: milestone?.status ?? "investigating",
|
|
232
|
+
currentSurface: milestone?.currentSurface ?? { kind: "coding", label: `${update.session.runner} ${update.session.id}` },
|
|
233
|
+
currentArtifact: milestone?.currentArtifact,
|
|
234
|
+
nextAction: milestone?.nextAction,
|
|
235
|
+
latestNote: obligationNoteFromUpdate(update) ?? undefined,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
// Detached feedback should still reach the human even if obligation sync is unavailable.
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
async function wakeInnerDialogForObligation(update) {
|
|
243
|
+
if (!update.session.obligationId || !OBLIGATION_WAKE_UPDATE_KINDS.has(update.kind)) {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
try {
|
|
247
|
+
await (0, socket_client_1.requestInnerWake)((0, identity_1.getAgentName)());
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
(0, runtime_1.emitNervesEvent)({
|
|
251
|
+
level: "warn",
|
|
252
|
+
component: "repertoire",
|
|
253
|
+
event: "repertoire.coding_feedback_wake_error",
|
|
254
|
+
message: "coding feedback wake request failed",
|
|
255
|
+
meta: {
|
|
256
|
+
sessionId: update.session.id,
|
|
257
|
+
kind: update.kind,
|
|
258
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
259
|
+
},
|
|
260
|
+
});
|
|
261
|
+
}
|
|
99
262
|
}
|
|
100
263
|
function attachCodingSessionFeedback(manager, session, target) {
|
|
101
264
|
let lastMessage = "";
|
|
102
265
|
let closed = false;
|
|
103
|
-
let unsubscribe =
|
|
266
|
+
let unsubscribe = null;
|
|
104
267
|
const sendMessage = (message) => {
|
|
105
268
|
if (closed || !message || message === lastMessage) {
|
|
106
269
|
return;
|
|
@@ -119,16 +282,20 @@ function attachCodingSessionFeedback(manager, session, target) {
|
|
|
119
282
|
});
|
|
120
283
|
});
|
|
121
284
|
};
|
|
122
|
-
|
|
285
|
+
const spawnedUpdate = { kind: "spawned", session };
|
|
286
|
+
syncObligationFromUpdate(spawnedUpdate);
|
|
287
|
+
sendMessage(formatReportBackMessage(spawnedUpdate, formatUpdateMessage(spawnedUpdate)));
|
|
123
288
|
unsubscribe = manager.subscribe(session.id, async (update) => {
|
|
124
|
-
|
|
289
|
+
syncObligationFromUpdate(update);
|
|
290
|
+
sendMessage(formatReportBackMessage(update, formatUpdateMessage(update)));
|
|
291
|
+
await wakeInnerDialogForObligation(update);
|
|
125
292
|
if (TERMINAL_UPDATE_KINDS.has(update.kind)) {
|
|
126
293
|
closed = true;
|
|
127
|
-
unsubscribe();
|
|
294
|
+
unsubscribe?.();
|
|
128
295
|
}
|
|
129
296
|
});
|
|
130
297
|
return () => {
|
|
131
298
|
closed = true;
|
|
132
|
-
unsubscribe();
|
|
299
|
+
unsubscribe?.();
|
|
133
300
|
};
|
|
134
301
|
}
|
|
@@ -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,12 @@ 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,
|
|
160
213
|
scopeFile: normalizedRequest.scopeFile,
|
|
161
214
|
stateFile: normalizedRequest.stateFile,
|
|
215
|
+
checkpoint: null,
|
|
216
|
+
artifactPath: this.artifactPathFor(id),
|
|
162
217
|
status: "spawning",
|
|
163
218
|
stdoutTail: "",
|
|
164
219
|
stderrTail: "",
|
|
@@ -245,6 +300,7 @@ class CodingSessionManager {
|
|
|
245
300
|
record.process.kill("SIGTERM");
|
|
246
301
|
record.process = null;
|
|
247
302
|
record.session.status = "killed";
|
|
303
|
+
record.session.checkpoint = "terminated by parent agent";
|
|
248
304
|
record.session.endedAt = this.nowIso();
|
|
249
305
|
(0, runtime_1.emitNervesEvent)({
|
|
250
306
|
component: "repertoire",
|
|
@@ -267,6 +323,7 @@ class CodingSessionManager {
|
|
|
267
323
|
continue;
|
|
268
324
|
stalled += 1;
|
|
269
325
|
record.session.status = "stalled";
|
|
326
|
+
record.session.checkpoint = deriveCheckpoint(record.session);
|
|
270
327
|
(0, runtime_1.emitNervesEvent)({
|
|
271
328
|
level: "warn",
|
|
272
329
|
component: "repertoire",
|
|
@@ -292,6 +349,7 @@ class CodingSessionManager {
|
|
|
292
349
|
record.process = null;
|
|
293
350
|
if (record.session.status === "running" || record.session.status === "spawning") {
|
|
294
351
|
record.session.status = "killed";
|
|
352
|
+
record.session.checkpoint = "terminated during manager shutdown";
|
|
295
353
|
record.session.endedAt = this.nowIso();
|
|
296
354
|
}
|
|
297
355
|
}
|
|
@@ -336,6 +394,13 @@ class CodingSessionManager {
|
|
|
336
394
|
record.session.endedAt = this.nowIso();
|
|
337
395
|
updateKind = "completed";
|
|
338
396
|
}
|
|
397
|
+
const checkpoint = latestMeaningfulLine(text);
|
|
398
|
+
if (checkpoint) {
|
|
399
|
+
record.session.checkpoint = checkpoint;
|
|
400
|
+
}
|
|
401
|
+
else if (!record.session.checkpoint) {
|
|
402
|
+
record.session.checkpoint = deriveCheckpoint(record.session);
|
|
403
|
+
}
|
|
339
404
|
(0, runtime_1.emitNervesEvent)({
|
|
340
405
|
component: "repertoire",
|
|
341
406
|
event: "repertoire.coding_session_output",
|
|
@@ -359,12 +424,14 @@ class CodingSessionManager {
|
|
|
359
424
|
record.session.lastSignal = signal;
|
|
360
425
|
if (record.session.status === "killed" || record.session.status === "completed") {
|
|
361
426
|
record.session.endedAt = this.nowIso();
|
|
427
|
+
record.session.checkpoint = deriveCheckpoint(record.session);
|
|
362
428
|
this.persistState();
|
|
363
429
|
return;
|
|
364
430
|
}
|
|
365
431
|
if (code === 0) {
|
|
366
432
|
record.session.status = "completed";
|
|
367
433
|
record.session.endedAt = this.nowIso();
|
|
434
|
+
record.session.checkpoint = deriveCheckpoint(record.session);
|
|
368
435
|
this.persistState();
|
|
369
436
|
this.notifyListeners(record.session.id, { kind: "completed", session: cloneSession(record.session) });
|
|
370
437
|
return;
|
|
@@ -376,6 +443,7 @@ class CodingSessionManager {
|
|
|
376
443
|
record.session.status = "failed";
|
|
377
444
|
record.session.endedAt = this.nowIso();
|
|
378
445
|
record.session.failure = defaultFailureDiagnostics(code, signal, record.command, record.args, record.stdoutTail, record.stderrTail);
|
|
446
|
+
record.session.checkpoint = deriveCheckpoint(record.session);
|
|
379
447
|
(0, runtime_1.emitNervesEvent)({
|
|
380
448
|
level: "error",
|
|
381
449
|
component: "repertoire",
|
|
@@ -401,6 +469,7 @@ class CodingSessionManager {
|
|
|
401
469
|
record.session.lastActivityAt = this.nowIso();
|
|
402
470
|
record.session.endedAt = null;
|
|
403
471
|
record.session.failure = null;
|
|
472
|
+
record.session.checkpoint = `restarted after ${reason}`;
|
|
404
473
|
this.attachProcessListeners(record);
|
|
405
474
|
(0, runtime_1.emitNervesEvent)({
|
|
406
475
|
level: "warn",
|
|
@@ -482,15 +551,21 @@ class CodingSessionManager {
|
|
|
482
551
|
}
|
|
483
552
|
const normalizedRequest = {
|
|
484
553
|
...request,
|
|
554
|
+
originSession: request.originSession ? { ...request.originSession } : undefined,
|
|
485
555
|
sessionId: request.sessionId ?? session.id,
|
|
556
|
+
obligationId: request.obligationId,
|
|
486
557
|
parentAgent: request.parentAgent ?? this.agentName,
|
|
487
558
|
};
|
|
488
559
|
const normalizedSession = {
|
|
489
560
|
...session,
|
|
490
561
|
taskRef: session.taskRef ?? normalizedRequest.taskRef,
|
|
562
|
+
originSession: session.originSession ?? normalizedRequest.originSession,
|
|
563
|
+
obligationId: session.obligationId ?? normalizedRequest.obligationId,
|
|
491
564
|
failure: session.failure ?? null,
|
|
492
565
|
stdoutTail: session.stdoutTail ?? session.failure?.stdoutTail ?? "",
|
|
493
566
|
stderrTail: session.stderrTail ?? session.failure?.stderrTail ?? "",
|
|
567
|
+
checkpoint: typeof session.checkpoint === "string" ? session.checkpoint : null,
|
|
568
|
+
artifactPath: typeof session.artifactPath === "string" ? session.artifactPath : this.artifactPathFor(session.id),
|
|
494
569
|
};
|
|
495
570
|
if (typeof normalizedSession.pid === "number") {
|
|
496
571
|
const alive = this.pidAlive(normalizedSession.pid);
|
|
@@ -503,6 +578,7 @@ class CodingSessionManager {
|
|
|
503
578
|
normalizedSession.pid = null;
|
|
504
579
|
}
|
|
505
580
|
}
|
|
581
|
+
normalizedSession.checkpoint = normalizedSession.checkpoint ?? deriveCheckpoint(normalizedSession);
|
|
506
582
|
this.records.set(normalizedSession.id, {
|
|
507
583
|
request: normalizedRequest,
|
|
508
584
|
session: normalizedSession,
|
|
@@ -525,7 +601,10 @@ class CodingSessionManager {
|
|
|
525
601
|
const payload = {
|
|
526
602
|
sequence: this.sequence,
|
|
527
603
|
records: [...this.records.values()].map((record) => ({
|
|
528
|
-
request:
|
|
604
|
+
request: {
|
|
605
|
+
...record.request,
|
|
606
|
+
prompt: (0, session_events_1.capStructuredRecordString)(record.request.prompt),
|
|
607
|
+
},
|
|
529
608
|
session: record.session,
|
|
530
609
|
})),
|
|
531
610
|
};
|
|
@@ -542,6 +621,80 @@ class CodingSessionManager {
|
|
|
542
621
|
meta: { path: this.stateFilePath, reason: error instanceof Error ? error.message : String(error) },
|
|
543
622
|
});
|
|
544
623
|
}
|
|
624
|
+
this.persistArtifacts();
|
|
625
|
+
}
|
|
626
|
+
artifactPathFor(sessionId) {
|
|
627
|
+
return path.join(this.artifactDirPath, `${sessionId}.md`);
|
|
628
|
+
}
|
|
629
|
+
renderArtifact(record) {
|
|
630
|
+
const { request, session } = record;
|
|
631
|
+
const stdout = session.stdoutTail.trim() || "(empty)";
|
|
632
|
+
const stderr = session.stderrTail.trim() || "(empty)";
|
|
633
|
+
const lines = [
|
|
634
|
+
"# Coding Session Artifact",
|
|
635
|
+
"",
|
|
636
|
+
"## Session",
|
|
637
|
+
`id: ${session.id}`,
|
|
638
|
+
`runner: ${session.runner}`,
|
|
639
|
+
`status: ${session.status}`,
|
|
640
|
+
`taskRef: ${session.taskRef ?? "unassigned"}`,
|
|
641
|
+
`workdir: ${session.workdir}`,
|
|
642
|
+
`startedAt: ${session.startedAt}`,
|
|
643
|
+
`lastActivityAt: ${session.lastActivityAt}`,
|
|
644
|
+
`endedAt: ${session.endedAt ?? "active"}`,
|
|
645
|
+
`pid: ${session.pid ?? "none"}`,
|
|
646
|
+
`restarts: ${session.restartCount}`,
|
|
647
|
+
`checkpoint: ${session.checkpoint ?? "none"}`,
|
|
648
|
+
`scopeFile: ${session.scopeFile ?? "none"}`,
|
|
649
|
+
`stateFile: ${session.stateFile ?? "none"}`,
|
|
650
|
+
"",
|
|
651
|
+
"## Request",
|
|
652
|
+
(0, session_events_1.capStructuredRecordString)(request.prompt),
|
|
653
|
+
"",
|
|
654
|
+
"## Stdout Tail",
|
|
655
|
+
stdout,
|
|
656
|
+
"",
|
|
657
|
+
"## Stderr Tail",
|
|
658
|
+
stderr,
|
|
659
|
+
];
|
|
660
|
+
if (session.failure) {
|
|
661
|
+
lines.push("", "## Failure", `command: ${session.failure.command}`, `args: ${session.failure.args.join(" ") || "(none)"}`, `code: ${session.failure.code ?? "null"}`, `signal: ${session.failure.signal ?? "null"}`);
|
|
662
|
+
}
|
|
663
|
+
return `${lines.join("\n")}\n`;
|
|
664
|
+
}
|
|
665
|
+
persistArtifacts() {
|
|
666
|
+
try {
|
|
667
|
+
this.mkdirSync(this.artifactDirPath, { recursive: true });
|
|
668
|
+
}
|
|
669
|
+
catch (error) {
|
|
670
|
+
(0, runtime_1.emitNervesEvent)({
|
|
671
|
+
level: "warn",
|
|
672
|
+
component: "repertoire",
|
|
673
|
+
event: "repertoire.coding_artifact_persist_error",
|
|
674
|
+
message: "failed preparing coding artifact directory",
|
|
675
|
+
meta: { path: this.artifactDirPath, reason: error instanceof Error ? error.message : String(error) },
|
|
676
|
+
});
|
|
677
|
+
return;
|
|
678
|
+
}
|
|
679
|
+
for (const record of this.records.values()) {
|
|
680
|
+
try {
|
|
681
|
+
record.session.artifactPath = record.session.artifactPath ?? this.artifactPathFor(record.session.id);
|
|
682
|
+
this.writeFileSync(record.session.artifactPath, this.renderArtifact(record), "utf-8");
|
|
683
|
+
}
|
|
684
|
+
catch (error) {
|
|
685
|
+
(0, runtime_1.emitNervesEvent)({
|
|
686
|
+
level: "warn",
|
|
687
|
+
component: "repertoire",
|
|
688
|
+
event: "repertoire.coding_artifact_persist_error",
|
|
689
|
+
message: "failed writing coding session artifact",
|
|
690
|
+
meta: {
|
|
691
|
+
id: record.session.id,
|
|
692
|
+
path: record.session.artifactPath ?? this.artifactPathFor(record.session.id),
|
|
693
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
694
|
+
},
|
|
695
|
+
});
|
|
696
|
+
}
|
|
697
|
+
}
|
|
545
698
|
}
|
|
546
699
|
}
|
|
547
700
|
exports.CodingSessionManager = CodingSessionManager;
|