@ouro.bot/cli 0.1.0-alpha.55 → 0.1.0-alpha.550
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 -19
- 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-bootstrap-drift.md +54 -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 +3555 -0
- package/dist/arc/attention-types.js +8 -0
- package/dist/arc/cares.js +140 -0
- package/dist/arc/episodes.js +117 -0
- package/dist/arc/intentions.js +133 -0
- package/dist/arc/json-store.js +117 -0
- package/dist/arc/obligations.js +237 -0
- package/dist/arc/packets.js +193 -0
- package/dist/arc/presence.js +185 -0
- package/dist/arc/task-lifecycle.js +65 -0
- package/dist/heart/active-work.js +837 -26
- package/dist/heart/agent-entry.js +58 -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/background-operations.js +281 -0
- package/dist/heart/bundle-state.js +168 -0
- package/dist/heart/commitments.js +111 -0
- package/dist/heart/config-registry.js +304 -0
- package/dist/heart/config.js +114 -118
- package/dist/heart/core.js +925 -246
- package/dist/heart/cross-chat-delivery.js +3 -18
- package/dist/heart/daemon/agent-config-check.js +512 -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 +554 -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 +665 -0
- package/dist/heart/daemon/cli-exec.js +7565 -0
- package/dist/heart/daemon/cli-help.js +498 -0
- package/dist/heart/daemon/cli-parse.js +1590 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +775 -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 -1672
- package/dist/heart/daemon/daemon-entry.js +417 -2
- package/dist/heart/daemon/daemon-health.js +183 -0
- package/dist/heart/daemon/daemon-rollup.js +58 -0
- package/dist/heart/daemon/daemon-runtime-sync.js +87 -13
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +758 -71
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +844 -0
- package/dist/heart/daemon/drift-detection.js +146 -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 +102 -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 +82 -12
- 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 +2 -2
- 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 +375 -33
- 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 +67 -16
- package/dist/heart/daemon/runtime-metadata.js +3 -31
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sense-manager.js +353 -38
- package/dist/heart/daemon/session-id-resolver.js +131 -0
- package/dist/heart/daemon/skill-management-installer.js +94 -0
- package/dist/heart/daemon/socket-client.js +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 +162 -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 +52 -117
- 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 +200 -51
- 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 +195 -0
- package/dist/heart/mailbox/readers/agent-machine.js +382 -0
- package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
- package/dist/heart/mailbox/readers/mail.js +362 -0
- package/dist/heart/mailbox/readers/runtime-readers.js +651 -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 +683 -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 +255 -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-state.js +216 -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 +97 -13
- 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 +11 -4
- package/dist/heart/session-activity.js +43 -22
- package/dist/heart/session-events.js +1149 -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 +243 -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 +139 -0
- package/dist/heart/tool-friction.js +55 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-context.js +381 -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-BPr5vNuM.css +1 -0
- package/dist/mailbox-ui/assets/index-Cm51CY9W.js +61 -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 +674 -0
- package/dist/mailroom/body-cache.js +61 -0
- package/dist/mailroom/core.js +720 -0
- package/dist/mailroom/entry.js +160 -0
- package/dist/mailroom/file-store.js +430 -0
- package/dist/mailroom/mbox-import.js +383 -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 +256 -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 +165 -101
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +62 -75
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/friends/channel.js +30 -0
- package/dist/mind/friends/resolver.js +54 -2
- package/dist/mind/friends/store-file.js +39 -3
- package/dist/mind/friends/types.js +2 -2
- package/dist/mind/journal-index.js +161 -0
- package/dist/mind/note-search.js +268 -0
- package/dist/mind/obligation-steering.js +221 -0
- package/dist/mind/pending.js +4 -0
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +995 -123
- 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 +139 -5
- package/dist/nerves/coverage/run-artifacts.js +1 -1
- package/dist/nerves/event-buffer.js +111 -0
- package/dist/nerves/index.js +224 -4
- package/dist/nerves/observation.js +20 -0
- package/dist/nerves/redact.js +79 -0
- package/dist/nerves/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 +816 -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 +330 -0
- package/dist/repertoire/coding/feedback.js +197 -30
- package/dist/repertoire/coding/manager.js +158 -9
- package/dist/repertoire/coding/spawner.js +55 -9
- package/dist/repertoire/coding/tools.js +170 -7
- package/dist/repertoire/commerce-errors.js +109 -0
- package/dist/repertoire/commerce-self-test.js +156 -0
- package/dist/repertoire/credential-access.js +111 -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 +15 -24
- 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-base.js +47 -1075
- package/dist/repertoire/tools-bluebubbles.js +1 -0
- package/dist/repertoire/tools-bridge.js +142 -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 +1857 -0
- package/dist/repertoire/tools-notes.js +421 -0
- package/dist/repertoire/tools-session.js +750 -0
- package/dist/repertoire/tools-shell.js +120 -0
- package/dist/repertoire/tools-stripe.js +180 -0
- package/dist/repertoire/tools-surface.js +243 -0
- package/dist/repertoire/tools-teams.js +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.js +108 -100
- 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 +561 -0
- package/dist/scripts/claude-code-hook.js +41 -0
- package/dist/scripts/claude-code-stop-hook.js +47 -0
- package/dist/senses/attention-queue.js +116 -0
- package/dist/senses/bluebubbles/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 +2305 -0
- package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
- 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/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 +187 -0
- package/dist/senses/cli.js +520 -209
- package/dist/senses/commands.js +66 -3
- package/dist/senses/habit-turn-message.js +108 -0
- package/dist/senses/inner-dialog-worker.js +175 -21
- package/dist/senses/inner-dialog.js +330 -27
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +379 -0
- package/dist/senses/pipeline.js +569 -182
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +248 -0
- package/dist/senses/surface-tool.js +68 -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/trips/core.js +138 -0
- package/dist/trips/store.js +146 -0
- package/package.json +38 -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 +101 -0
- package/skills/travel-planning.md +138 -0
- package/dist/heart/daemon/ouro-path-installer.js +0 -178
- package/dist/heart/daemon/subagent-installer.js +0 -166
- 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 -86
- package/subagents/work-doer.md +0 -237
- package/subagents/work-merger.md +0 -618
- package/subagents/work-planner.md +0 -390
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
- /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
- /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
- /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
- /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Templates for agent bundle scaffolding.
|
|
4
|
+
*
|
|
5
|
+
* ## .gitignore design philosophy
|
|
6
|
+
*
|
|
7
|
+
* The bundle .gitignore handles FUNCTIONAL "shouldn't track" cases only:
|
|
8
|
+
*
|
|
9
|
+
* - Runtime state (sessions, logs, runtime files) — stale data with no
|
|
10
|
+
* value for review or history.
|
|
11
|
+
* - Credentials — real secrets live in the agent vault, but defense
|
|
12
|
+
* in depth in case anything leaks into the bundle.
|
|
13
|
+
* - Editor / OS noise (.DS_Store, .idea/, etc.).
|
|
14
|
+
* - Build artifacts (rare in bundles, but possible).
|
|
15
|
+
*
|
|
16
|
+
* It DOES NOT handle PII. The bundle is inherently full of PII — `friends/`,
|
|
17
|
+
* `diary/`, `journal/`, `psyche/`, `arc/`, `facts/`, `family/`, `travel/`
|
|
18
|
+
* etc. That's the point of the bundle; blocking those via .gitignore would
|
|
19
|
+
* defeat the purpose.
|
|
20
|
+
*
|
|
21
|
+
* PII is handled at first-push time by `bundle_first_push_review`, which
|
|
22
|
+
* enumerates PII-bearing directories, shows the agent counts, probes the
|
|
23
|
+
* remote URL for GitHub visibility, and hard-pauses until the human
|
|
24
|
+
* confirms. See Directive D in the planning doc.
|
|
25
|
+
*
|
|
26
|
+
* No content-pattern blocks (no `**\/sk-ant-*` or similar). Content-review
|
|
27
|
+
* failures are a different safety layer — credential scanning at commit
|
|
28
|
+
* time would be a follow-up feature.
|
|
29
|
+
*/
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.PII_BUNDLE_DIRECTORIES = exports.BUNDLE_GITIGNORE_TEMPLATE = void 0;
|
|
32
|
+
exports.BUNDLE_GITIGNORE_TEMPLATE = `# Runtime state — sessions, logs, runtime files, never tracked
|
|
33
|
+
state/
|
|
34
|
+
|
|
35
|
+
# Credentials — never tracked. Real secrets live in the agent vault, but
|
|
36
|
+
# defense in depth in case anything leaks into the bundle.
|
|
37
|
+
.env
|
|
38
|
+
.env.*
|
|
39
|
+
secrets/
|
|
40
|
+
**/*.key
|
|
41
|
+
**/*.pem
|
|
42
|
+
**/*.credentials
|
|
43
|
+
**/*.pfx
|
|
44
|
+
|
|
45
|
+
# Editor and OS noise
|
|
46
|
+
.DS_Store
|
|
47
|
+
.idea/
|
|
48
|
+
.vscode/
|
|
49
|
+
*.swp
|
|
50
|
+
*.swo
|
|
51
|
+
|
|
52
|
+
# Build artifacts (rare in bundles, but possible if a workspace lands here)
|
|
53
|
+
node_modules/
|
|
54
|
+
dist/
|
|
55
|
+
`;
|
|
56
|
+
/**
|
|
57
|
+
* PII-sensitive top-level directories. Enumerated here so `bundle_first_push_review`
|
|
58
|
+
* can categorize and count. Adding a new PII bucket to the bundle means adding
|
|
59
|
+
* it here so the first-push warning includes it.
|
|
60
|
+
*/
|
|
61
|
+
exports.PII_BUNDLE_DIRECTORIES = [
|
|
62
|
+
"friends",
|
|
63
|
+
"diary",
|
|
64
|
+
"journal",
|
|
65
|
+
"psyche",
|
|
66
|
+
"arc",
|
|
67
|
+
"facts",
|
|
68
|
+
"family",
|
|
69
|
+
"travel",
|
|
70
|
+
"notes",
|
|
71
|
+
"sessions",
|
|
72
|
+
];
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Lazy bw CLI installer — auto-installs the Bitwarden CLI when not present.
|
|
4
|
+
*
|
|
5
|
+
* Mirrors the whisper-cpp pattern in senses/bluebubbles/media.ts:
|
|
6
|
+
* check PATH first, install via npm if missing, emit nerves event.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.findExecutableOnPath = findExecutableOnPath;
|
|
43
|
+
exports.findExecutableViaNpmPrefix = findExecutableViaNpmPrefix;
|
|
44
|
+
exports.ensureBwCli = ensureBwCli;
|
|
45
|
+
const node_child_process_1 = require("node:child_process");
|
|
46
|
+
const fs = __importStar(require("node:fs"));
|
|
47
|
+
const path = __importStar(require("node:path"));
|
|
48
|
+
const runtime_1 = require("../nerves/runtime");
|
|
49
|
+
const INSTALL_TIMEOUT_MS = 120_000;
|
|
50
|
+
const WHICH_TIMEOUT_MS = 5_000;
|
|
51
|
+
const DEFAULT_WINDOWS_PATHEXT = ".EXE;.CMD;.BAT;.COM";
|
|
52
|
+
function execFileAsync(cmd, args, timeout) {
|
|
53
|
+
return new Promise((resolve, reject) => {
|
|
54
|
+
(0, node_child_process_1.execFile)(cmd, args, { timeout }, (err, stdout) => {
|
|
55
|
+
if (err) {
|
|
56
|
+
reject(err);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
resolve(stdout);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
function stripWrappingQuotes(value) {
|
|
64
|
+
const trimmed = value.trim();
|
|
65
|
+
if (trimmed.startsWith("\"") && trimmed.endsWith("\"")) {
|
|
66
|
+
return trimmed.slice(1, -1);
|
|
67
|
+
}
|
|
68
|
+
return trimmed;
|
|
69
|
+
}
|
|
70
|
+
function isExecutableFile(targetPath, platform) {
|
|
71
|
+
try {
|
|
72
|
+
fs.accessSync(targetPath, platform === "win32" ? fs.constants.F_OK : fs.constants.X_OK);
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function executableNames(command, platform, pathExt) {
|
|
80
|
+
if (platform !== "win32")
|
|
81
|
+
return [command];
|
|
82
|
+
if (path.extname(command))
|
|
83
|
+
return [command];
|
|
84
|
+
const extensions = pathExt
|
|
85
|
+
.split(";")
|
|
86
|
+
.map((entry) => entry.trim())
|
|
87
|
+
.filter((entry) => entry.length > 0);
|
|
88
|
+
return extensions.length === 0
|
|
89
|
+
? [command]
|
|
90
|
+
: extensions.map((extension) => (extension.startsWith(".") ? `${command}${extension}` : `${command}.${extension}`));
|
|
91
|
+
}
|
|
92
|
+
function findExecutableInDirectory(command, directory, platform, pathExt) {
|
|
93
|
+
const cleanDirectory = stripWrappingQuotes(directory);
|
|
94
|
+
if (!cleanDirectory)
|
|
95
|
+
return null;
|
|
96
|
+
for (const candidateName of executableNames(command, platform, pathExt)) {
|
|
97
|
+
const candidatePath = path.isAbsolute(candidateName)
|
|
98
|
+
? candidateName
|
|
99
|
+
: path.join(cleanDirectory, candidateName);
|
|
100
|
+
if (isExecutableFile(candidatePath, platform)) {
|
|
101
|
+
return candidatePath;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
function findExecutableOnPath(command, envPath = process.env.PATH ?? "", platform = process.platform, pathExt = process.env.PATHEXT ?? DEFAULT_WINDOWS_PATHEXT) {
|
|
107
|
+
if (path.isAbsolute(command) || command.includes(path.sep)) {
|
|
108
|
+
return isExecutableFile(command, platform) ? command : null;
|
|
109
|
+
}
|
|
110
|
+
for (const directory of envPath.split(path.delimiter)) {
|
|
111
|
+
const found = findExecutableInDirectory(command, directory, platform, pathExt);
|
|
112
|
+
if (found)
|
|
113
|
+
return found;
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
async function findExecutableViaNpmPrefix(command, platform = process.platform, pathExt = process.env.PATHEXT ?? DEFAULT_WINDOWS_PATHEXT) {
|
|
118
|
+
try {
|
|
119
|
+
const prefix = stripWrappingQuotes((await execFileAsync("npm", ["prefix", "-g"], WHICH_TIMEOUT_MS)).trim());
|
|
120
|
+
if (!prefix)
|
|
121
|
+
return null;
|
|
122
|
+
const searchDirs = platform === "win32"
|
|
123
|
+
? [prefix, path.join(prefix, "bin")]
|
|
124
|
+
: [path.join(prefix, "bin"), prefix];
|
|
125
|
+
for (const directory of searchDirs) {
|
|
126
|
+
const found = findExecutableInDirectory(command, directory, platform, pathExt);
|
|
127
|
+
if (found)
|
|
128
|
+
return found;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// Prefix lookup is only a post-install fallback.
|
|
133
|
+
}
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Ensure the `bw` CLI is available, installing it via npm if needed.
|
|
138
|
+
* Returns the path to the `bw` binary.
|
|
139
|
+
*/
|
|
140
|
+
async function ensureBwCli() {
|
|
141
|
+
// 1. Check if bw is already in PATH
|
|
142
|
+
const existing = findExecutableOnPath("bw");
|
|
143
|
+
if (existing) {
|
|
144
|
+
return existing;
|
|
145
|
+
}
|
|
146
|
+
// 2. Install via npm
|
|
147
|
+
(0, runtime_1.emitNervesEvent)({
|
|
148
|
+
event: "repertoire.bw_cli_install_start",
|
|
149
|
+
component: "repertoire",
|
|
150
|
+
message: "bw CLI not found, installing via npm",
|
|
151
|
+
meta: {},
|
|
152
|
+
});
|
|
153
|
+
try {
|
|
154
|
+
await execFileAsync("npm", ["install", "-g", "@bitwarden/cli"], INSTALL_TIMEOUT_MS);
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
/* v8 ignore next -- execFileCb always throws Error instances @preserve */
|
|
158
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
159
|
+
(0, runtime_1.emitNervesEvent)({
|
|
160
|
+
level: "error",
|
|
161
|
+
event: "repertoire.bw_cli_install_fail",
|
|
162
|
+
component: "repertoire",
|
|
163
|
+
message: "failed to install bw CLI via npm",
|
|
164
|
+
meta: { reason },
|
|
165
|
+
});
|
|
166
|
+
throw new Error(`failed to install bw CLI via npm: ${reason}`);
|
|
167
|
+
}
|
|
168
|
+
// 3. Verify installation and return path
|
|
169
|
+
const installed = findExecutableOnPath("bw") ?? await findExecutableViaNpmPrefix("bw");
|
|
170
|
+
if (installed) {
|
|
171
|
+
(0, runtime_1.emitNervesEvent)({
|
|
172
|
+
event: "repertoire.bw_cli_install_end",
|
|
173
|
+
component: "repertoire",
|
|
174
|
+
message: "bw CLI installed successfully",
|
|
175
|
+
meta: { path: installed },
|
|
176
|
+
});
|
|
177
|
+
return installed;
|
|
178
|
+
}
|
|
179
|
+
throw new Error("bw CLI installed via npm but binary not found in PATH or npm global bin");
|
|
180
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Codex JSONL event parser.
|
|
4
|
+
* Parses typed events from Codex --json output:
|
|
5
|
+
* thread.started, turn.started, turn.completed, item.completed.
|
|
6
|
+
* Maps events to coding session status transitions.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.parseCodexJsonlEvent = parseCodexJsonlEvent;
|
|
10
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
11
|
+
const KNOWN_TYPES = new Set(["thread.started", "turn.started", "turn.completed", "item.completed"]);
|
|
12
|
+
/**
|
|
13
|
+
* Parse a single JSONL line from Codex --json output.
|
|
14
|
+
* Returns null for invalid JSON, empty strings, or unknown event types.
|
|
15
|
+
*/
|
|
16
|
+
function parseCodexJsonlEvent(line) {
|
|
17
|
+
const trimmed = line.trim();
|
|
18
|
+
if (trimmed.length === 0)
|
|
19
|
+
return null;
|
|
20
|
+
let parsed;
|
|
21
|
+
try {
|
|
22
|
+
parsed = JSON.parse(trimmed);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
(0, runtime_1.emitNervesEvent)({
|
|
26
|
+
component: "repertoire",
|
|
27
|
+
event: "repertoire.codex_jsonl_parse_error",
|
|
28
|
+
message: "failed to parse codex JSONL line",
|
|
29
|
+
meta: { line: trimmed.slice(0, 100) },
|
|
30
|
+
});
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
const type = parsed.type;
|
|
34
|
+
if (!type || !KNOWN_TYPES.has(type))
|
|
35
|
+
return null;
|
|
36
|
+
const event = {
|
|
37
|
+
type: type,
|
|
38
|
+
threadId: typeof parsed.thread_id === "string" ? parsed.thread_id : undefined,
|
|
39
|
+
turnId: typeof parsed.turn_id === "string" ? parsed.turn_id : undefined,
|
|
40
|
+
item: typeof parsed.item === "object" && parsed.item !== null ? parsed.item : undefined,
|
|
41
|
+
raw: parsed,
|
|
42
|
+
statusHint: mapStatusHint(type),
|
|
43
|
+
};
|
|
44
|
+
(0, runtime_1.emitNervesEvent)({
|
|
45
|
+
component: "repertoire",
|
|
46
|
+
event: "repertoire.codex_jsonl_event",
|
|
47
|
+
message: "parsed codex JSONL event",
|
|
48
|
+
meta: { type, threadId: event.threadId ?? null },
|
|
49
|
+
});
|
|
50
|
+
return event;
|
|
51
|
+
}
|
|
52
|
+
function mapStatusHint(type) {
|
|
53
|
+
switch (type) {
|
|
54
|
+
case "thread.started":
|
|
55
|
+
case "turn.started":
|
|
56
|
+
return "running";
|
|
57
|
+
case "turn.completed":
|
|
58
|
+
case "item.completed":
|
|
59
|
+
return null; // No automatic status change for completion events
|
|
60
|
+
/* v8 ignore next -- defensive default for unknown event types */
|
|
61
|
+
default:
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.prepareCodingContextPack = prepareCodingContextPack;
|
|
37
|
+
exports.emitCodingEpisode = emitCodingEpisode;
|
|
38
|
+
const crypto = __importStar(require("crypto"));
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const child_process_1 = require("child_process");
|
|
42
|
+
const active_work_1 = require("../../heart/active-work");
|
|
43
|
+
const identity_1 = require("../../heart/identity");
|
|
44
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
45
|
+
const episodes_1 = require("../../arc/episodes");
|
|
46
|
+
const skills_1 = require("../skills");
|
|
47
|
+
const CONTEXT_FILENAMES = ["AGENTS.md", "CLAUDE.md"];
|
|
48
|
+
function defaultRunCommand(command, args, cwd) {
|
|
49
|
+
const result = (0, child_process_1.spawnSync)(command, args, {
|
|
50
|
+
cwd,
|
|
51
|
+
encoding: "utf-8",
|
|
52
|
+
});
|
|
53
|
+
return {
|
|
54
|
+
status: result.status ?? 1,
|
|
55
|
+
stdout: typeof result.stdout === "string" ? result.stdout : "",
|
|
56
|
+
stderr: typeof result.stderr === "string" ? result.stderr : "",
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function stableContextKey(request) {
|
|
60
|
+
const payload = JSON.stringify({
|
|
61
|
+
runner: request.runner,
|
|
62
|
+
workdir: request.workdir,
|
|
63
|
+
taskRef: request.taskRef ?? "",
|
|
64
|
+
parentAgent: request.parentAgent ?? "",
|
|
65
|
+
obligationId: request.obligationId ?? "",
|
|
66
|
+
originSession: request.originSession ?? null,
|
|
67
|
+
});
|
|
68
|
+
return crypto.createHash("sha1").update(payload).digest("hex").slice(0, 12);
|
|
69
|
+
}
|
|
70
|
+
function collectProjectContextFiles(workdir, deps) {
|
|
71
|
+
const files = [];
|
|
72
|
+
const seen = new Set();
|
|
73
|
+
let current = path.resolve(workdir);
|
|
74
|
+
const root = path.parse(current).root;
|
|
75
|
+
while (true) {
|
|
76
|
+
for (const filename of CONTEXT_FILENAMES) {
|
|
77
|
+
const candidate = path.join(current, filename);
|
|
78
|
+
if (!deps.existsSync(candidate) || seen.has(candidate))
|
|
79
|
+
continue;
|
|
80
|
+
try {
|
|
81
|
+
const content = deps.readFileSync(candidate, "utf-8").trim();
|
|
82
|
+
if (content.length > 0) {
|
|
83
|
+
files.unshift({ path: candidate, content });
|
|
84
|
+
seen.add(candidate);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// Best-effort loading only.
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (current === root)
|
|
92
|
+
break;
|
|
93
|
+
current = path.dirname(current);
|
|
94
|
+
}
|
|
95
|
+
return files;
|
|
96
|
+
}
|
|
97
|
+
function captureRepoSnapshot(workdir, runCommand) {
|
|
98
|
+
const repoRoot = runCommand("git", ["rev-parse", "--show-toplevel"], workdir);
|
|
99
|
+
if (repoRoot.status !== 0) {
|
|
100
|
+
return {
|
|
101
|
+
available: false,
|
|
102
|
+
repoRoot: null,
|
|
103
|
+
branch: null,
|
|
104
|
+
head: null,
|
|
105
|
+
statusLines: [],
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const branch = runCommand("git", ["rev-parse", "--abbrev-ref", "HEAD"], workdir);
|
|
109
|
+
const head = runCommand("git", ["rev-parse", "--short", "HEAD"], workdir);
|
|
110
|
+
const status = runCommand("git", ["status", "--short"], workdir);
|
|
111
|
+
return {
|
|
112
|
+
available: true,
|
|
113
|
+
repoRoot: repoRoot.stdout.trim() || null,
|
|
114
|
+
branch: branch.status === 0 ? branch.stdout.trim() || null : null,
|
|
115
|
+
head: head.status === 0 ? head.stdout.trim() || null : null,
|
|
116
|
+
statusLines: status.status === 0
|
|
117
|
+
? status.stdout.split(/\r?\n/).map((line) => line.trimEnd()).filter(Boolean)
|
|
118
|
+
: [],
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function buildIdentityPacket(snapshot, request) {
|
|
122
|
+
if (!snapshot.available) {
|
|
123
|
+
return {
|
|
124
|
+
repoPath: null,
|
|
125
|
+
worktreePath: null,
|
|
126
|
+
branch: null,
|
|
127
|
+
commit: null,
|
|
128
|
+
dirty: false,
|
|
129
|
+
dirtyFiles: [],
|
|
130
|
+
taskRef: request.taskRef ?? null,
|
|
131
|
+
verificationCommands: request.verificationCommands ?? [],
|
|
132
|
+
verificationStatus: "not-verified",
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
const dirtyFiles = snapshot.statusLines.filter((line) => line.length > 0);
|
|
136
|
+
return {
|
|
137
|
+
repoPath: snapshot.repoRoot,
|
|
138
|
+
worktreePath: snapshot.repoRoot,
|
|
139
|
+
branch: snapshot.branch,
|
|
140
|
+
commit: snapshot.head,
|
|
141
|
+
dirty: dirtyFiles.length > 0,
|
|
142
|
+
dirtyFiles,
|
|
143
|
+
taskRef: request.taskRef ?? null,
|
|
144
|
+
verificationCommands: request.verificationCommands ?? [],
|
|
145
|
+
verificationStatus: "not-verified",
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
function formatIdentitySection(packet) {
|
|
149
|
+
const lines = [
|
|
150
|
+
"## Coding Identity",
|
|
151
|
+
`repoPath: ${packet.repoPath ?? "unknown"}`,
|
|
152
|
+
`worktreePath: ${packet.worktreePath ?? "unknown"}`,
|
|
153
|
+
`branch: ${packet.branch ?? "unknown"}`,
|
|
154
|
+
`commit: ${packet.commit ?? "unknown"}`,
|
|
155
|
+
`dirty: ${packet.dirty}`,
|
|
156
|
+
];
|
|
157
|
+
if (packet.dirtyFiles.length > 0) {
|
|
158
|
+
lines.push("dirtyFiles:");
|
|
159
|
+
for (const file of packet.dirtyFiles) {
|
|
160
|
+
lines.push(file);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
lines.push(`taskRef: ${packet.taskRef ?? "none"}`);
|
|
164
|
+
if (packet.verificationCommands.length > 0) {
|
|
165
|
+
lines.push(`verificationCommands: ${packet.verificationCommands.join(", ")}`);
|
|
166
|
+
}
|
|
167
|
+
lines.push(`verificationStatus: ${packet.verificationStatus}`);
|
|
168
|
+
return lines.join("\n");
|
|
169
|
+
}
|
|
170
|
+
function formatContextFiles(files) {
|
|
171
|
+
if (files.length === 0)
|
|
172
|
+
return "(none found)";
|
|
173
|
+
return files.map((file) => `### ${file.path}\n${file.content}`).join("\n\n");
|
|
174
|
+
}
|
|
175
|
+
function formatSkills(skills) {
|
|
176
|
+
return skills.length > 0 ? skills.join(", ") : "(none found)";
|
|
177
|
+
}
|
|
178
|
+
function formatExistingSessions(sessions) {
|
|
179
|
+
if (sessions.length === 0)
|
|
180
|
+
return "activeSessions: none";
|
|
181
|
+
return sessions
|
|
182
|
+
.map((session) => {
|
|
183
|
+
return [
|
|
184
|
+
`- ${session.id}`,
|
|
185
|
+
`status=${session.status}`,
|
|
186
|
+
`lastActivityAt=${session.lastActivityAt}`,
|
|
187
|
+
session.taskRef ? `taskRef=${session.taskRef}` : null,
|
|
188
|
+
session.checkpoint ? `checkpoint=${session.checkpoint}` : null,
|
|
189
|
+
session.artifactPath ? `artifact=${session.artifactPath}` : null,
|
|
190
|
+
].filter(Boolean).join(" ");
|
|
191
|
+
})
|
|
192
|
+
.join("\n");
|
|
193
|
+
}
|
|
194
|
+
function formatOrigin(request) {
|
|
195
|
+
if (!request.originSession)
|
|
196
|
+
return "originSession: none";
|
|
197
|
+
return `originSession: ${request.originSession.channel}/${request.originSession.key} (${request.originSession.friendId})`;
|
|
198
|
+
}
|
|
199
|
+
function buildScopeContent(request, contextFiles, skills, agentName) {
|
|
200
|
+
return [
|
|
201
|
+
"# Coding Session Scope",
|
|
202
|
+
"",
|
|
203
|
+
"## Request",
|
|
204
|
+
`runner: ${request.runner}`,
|
|
205
|
+
`taskRef: ${request.taskRef ?? "unassigned"}`,
|
|
206
|
+
`parentAgent: ${request.parentAgent ?? agentName}`,
|
|
207
|
+
`workdir: ${request.workdir}`,
|
|
208
|
+
formatOrigin(request),
|
|
209
|
+
`obligationId: ${request.obligationId ?? "none"}`,
|
|
210
|
+
"",
|
|
211
|
+
"## Prompt",
|
|
212
|
+
request.prompt,
|
|
213
|
+
"",
|
|
214
|
+
"## Session Contract",
|
|
215
|
+
"- This is a focused coding lane opened by the parent Ouro agent.",
|
|
216
|
+
"- Execute the concrete prompt in the supplied workdir directly.",
|
|
217
|
+
"- Do not switch into planning/doing workflows or approval gates unless the prompt explicitly asks for them.",
|
|
218
|
+
"- Treat the current prompt, scope file, and live world-state checkpoint in the state file as the authoritative briefing for this lane.",
|
|
219
|
+
"",
|
|
220
|
+
"## Project Context Files",
|
|
221
|
+
formatContextFiles(contextFiles),
|
|
222
|
+
"",
|
|
223
|
+
"## Available Bundle Skills",
|
|
224
|
+
formatSkills(skills),
|
|
225
|
+
].join("\n");
|
|
226
|
+
}
|
|
227
|
+
function buildStateContent(request, contextKey, generatedAt, snapshot, existingSessions, agentName, identityPacket, activeWorkFrame, startOfTurnPacket) {
|
|
228
|
+
const gitSection = snapshot.available
|
|
229
|
+
? [
|
|
230
|
+
`repoRoot: ${snapshot.repoRoot ?? "unknown"}`,
|
|
231
|
+
`branch: ${snapshot.branch ?? "unknown"}`,
|
|
232
|
+
`head: ${snapshot.head ?? "unknown"}`,
|
|
233
|
+
"status:",
|
|
234
|
+
snapshot.statusLines.length > 0 ? snapshot.statusLines.join("\n") : "(clean)",
|
|
235
|
+
].join("\n")
|
|
236
|
+
: "git: unavailable";
|
|
237
|
+
return [
|
|
238
|
+
"# Coding Session State",
|
|
239
|
+
`generatedAt: ${generatedAt}`,
|
|
240
|
+
`contextKey: ${contextKey}`,
|
|
241
|
+
`agent: ${request.parentAgent ?? agentName}`,
|
|
242
|
+
formatOrigin(request),
|
|
243
|
+
`obligationId: ${request.obligationId ?? "none"}`,
|
|
244
|
+
...(startOfTurnPacket ? ["", "## Continuity", startOfTurnPacket] : []),
|
|
245
|
+
"",
|
|
246
|
+
formatIdentitySection(identityPacket),
|
|
247
|
+
"",
|
|
248
|
+
"## Workspace Snapshot",
|
|
249
|
+
gitSection,
|
|
250
|
+
...(activeWorkFrame ? ["", (0, active_work_1.formatLiveWorldStateCheckpoint)(activeWorkFrame)] : []),
|
|
251
|
+
"",
|
|
252
|
+
"## Related Coding Sessions",
|
|
253
|
+
formatExistingSessions(existingSessions),
|
|
254
|
+
].join("\n");
|
|
255
|
+
}
|
|
256
|
+
function relatedSessions(request, existingSessions) {
|
|
257
|
+
return existingSessions.filter((session) => {
|
|
258
|
+
return session.runner === request.runner
|
|
259
|
+
&& session.workdir === request.workdir
|
|
260
|
+
&& session.taskRef === request.taskRef;
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
function prepareCodingContextPack(input, deps = {}) {
|
|
264
|
+
const agentRoot = deps.agentRoot ?? (0, identity_1.getAgentRoot)();
|
|
265
|
+
const agentName = deps.agentName ?? (0, identity_1.getAgentName)();
|
|
266
|
+
const nowIso = deps.nowIso ?? (() => new Date().toISOString());
|
|
267
|
+
const existsSync = deps.existsSync ?? fs.existsSync;
|
|
268
|
+
const readFileSync = deps.readFileSync ?? fs.readFileSync;
|
|
269
|
+
const writeFileSync = deps.writeFileSync ?? fs.writeFileSync;
|
|
270
|
+
const mkdirSync = deps.mkdirSync ?? fs.mkdirSync;
|
|
271
|
+
const listAvailableSkills = deps.listSkills ?? skills_1.listSkills;
|
|
272
|
+
const runCommand = deps.runCommand ?? defaultRunCommand;
|
|
273
|
+
const contextKey = stableContextKey(input.request);
|
|
274
|
+
const contextDir = path.join(agentRoot, "state", "coding", "context");
|
|
275
|
+
const scopeFile = path.join(contextDir, `${contextKey}-scope.md`);
|
|
276
|
+
const stateFile = path.join(contextDir, `${contextKey}-state.md`);
|
|
277
|
+
const contextFiles = collectProjectContextFiles(input.request.workdir, { existsSync, readFileSync });
|
|
278
|
+
const skills = listAvailableSkills();
|
|
279
|
+
const existingSessions = relatedSessions(input.request, input.existingSessions ?? []);
|
|
280
|
+
const snapshot = captureRepoSnapshot(input.request.workdir, runCommand);
|
|
281
|
+
const generatedAt = nowIso();
|
|
282
|
+
const identityPacket = buildIdentityPacket(snapshot, input.request);
|
|
283
|
+
const scopeContent = buildScopeContent(input.request, contextFiles, skills, agentName);
|
|
284
|
+
const stateContent = buildStateContent(input.request, contextKey, generatedAt, snapshot, existingSessions, agentName, identityPacket, input.activeWorkFrame, input.startOfTurnPacket || undefined);
|
|
285
|
+
mkdirSync(contextDir, { recursive: true });
|
|
286
|
+
writeFileSync(scopeFile, `${scopeContent}\n`, "utf-8");
|
|
287
|
+
writeFileSync(stateFile, `${stateContent}\n`, "utf-8");
|
|
288
|
+
(0, runtime_1.emitNervesEvent)({
|
|
289
|
+
component: "repertoire",
|
|
290
|
+
event: "repertoire.coding_context_pack_written",
|
|
291
|
+
message: "prepared coding session context pack",
|
|
292
|
+
meta: {
|
|
293
|
+
contextKey,
|
|
294
|
+
workdir: input.request.workdir,
|
|
295
|
+
taskRef: input.request.taskRef ?? null,
|
|
296
|
+
contextFiles: contextFiles.length,
|
|
297
|
+
skills: skills.length,
|
|
298
|
+
relatedSessions: existingSessions.length,
|
|
299
|
+
gitAvailable: snapshot.available,
|
|
300
|
+
},
|
|
301
|
+
});
|
|
302
|
+
return {
|
|
303
|
+
contextKey,
|
|
304
|
+
scopeFile,
|
|
305
|
+
stateFile,
|
|
306
|
+
scopeContent,
|
|
307
|
+
stateContent,
|
|
308
|
+
identityPacket,
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Emit a coding milestone episode when a session completes or blocks.
|
|
313
|
+
* This is the outbound leg of the coding round-trip: compact start-of-turn packet goes IN,
|
|
314
|
+
* episodes come BACK OUT.
|
|
315
|
+
*/
|
|
316
|
+
function emitCodingEpisode(agentRoot, session, outcome) {
|
|
317
|
+
(0, episodes_1.emitEpisode)(agentRoot, {
|
|
318
|
+
kind: "coding_milestone",
|
|
319
|
+
summary: `coding session ${session.id} (${session.runner}): ${outcome}`,
|
|
320
|
+
whyItMattered: `coding lane ${session.status}`,
|
|
321
|
+
relatedEntities: [`coding:${session.id}`],
|
|
322
|
+
salience: session.status === "failed" ? "high" : "medium",
|
|
323
|
+
});
|
|
324
|
+
(0, runtime_1.emitNervesEvent)({
|
|
325
|
+
component: "repertoire",
|
|
326
|
+
event: "repertoire.coding_episode_emitted",
|
|
327
|
+
message: `coding episode emitted for ${session.id}`,
|
|
328
|
+
meta: { sessionId: session.id, outcome, status: session.status },
|
|
329
|
+
});
|
|
330
|
+
}
|