@ouro.bot/cli 0.1.0-alpha.62 → 0.1.0-alpha.636
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 +4070 -13
- 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 +57 -0
- package/dist/heart/active-work.js +831 -43
- 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/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/manager.js +137 -17
- package/dist/heart/bridges/store.js +14 -2
- package/dist/heart/bundle-state.js +168 -0
- package/dist/heart/commitments.js +135 -0
- package/dist/heart/config-registry.js +322 -0
- package/dist/heart/config.js +114 -119
- package/dist/heart/core.js +914 -248
- 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-desk.js +322 -0
- package/dist/heart/daemon/cli-exec.js +7468 -0
- package/dist/heart/daemon/cli-help.js +505 -0
- package/dist/heart/daemon/cli-parse.js +1554 -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 +905 -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 +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 +79 -10
- package/dist/heart/daemon/logs-prune.js +110 -0
- package/dist/heart/daemon/mcp-canary.js +297 -0
- package/dist/heart/daemon/migrate-to-desk.js +848 -0
- package/dist/heart/daemon/os-cron-deps.js +135 -0
- package/dist/heart/daemon/os-cron.js +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/plugin-cli.js +432 -0
- 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 +11 -3
- 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 +22 -9
- 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 +117 -39
- 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 -4
- 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 +37 -14
- package/dist/heart/identity.js +168 -57
- 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 +418 -0
- package/dist/heart/mailbox/readers/continuity-readers.js +319 -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/orientation-frame.js +217 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/provider-attempt.js +134 -0
- package/dist/heart/provider-binding-resolver.js +272 -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 +1163 -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/structured-output.js +196 -0
- package/dist/heart/sync-classification.js +176 -0
- package/dist/heart/sync.js +449 -0
- package/dist/heart/target-resolution.js +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 +389 -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 +715 -0
- package/dist/mailroom/body-cache.js +61 -0
- package/dist/mailroom/core.js +788 -0
- package/dist/mailroom/entry.js +160 -0
- package/dist/mailroom/file-store.js +568 -0
- package/dist/mailroom/mbox-import.js +393 -0
- package/dist/mailroom/migration.js +164 -0
- package/dist/mailroom/outbound.js +380 -0
- package/dist/mailroom/policy.js +263 -0
- package/dist/mailroom/reader.js +233 -0
- package/dist/mailroom/search-cache.js +334 -0
- package/dist/mailroom/search-relevance.js +319 -0
- package/dist/mailroom/smtp-ingress.js +176 -0
- package/dist/mailroom/source-state.js +176 -0
- package/dist/mailroom/thread.js +109 -0
- package/dist/mailroom/travel-extract.js +89 -0
- package/dist/mind/bundle-manifest.js +14 -1
- package/dist/mind/context.js +251 -101
- package/dist/mind/desk-section.js +310 -0
- 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 +1058 -146
- 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/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 +16 -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 +177 -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/desk/classifier.js +362 -0
- package/dist/repertoire/duffel-client.js +185 -0
- package/dist/repertoire/github-client.js +14 -55
- package/dist/repertoire/graph-client.js +11 -52
- package/dist/repertoire/guardrails.js +385 -0
- package/dist/repertoire/mcp-client.js +295 -0
- package/dist/repertoire/mcp-manager.js +403 -0
- package/dist/repertoire/mcp-tools.js +83 -0
- package/dist/repertoire/plugin-mcp.js +175 -0
- package/dist/repertoire/plugins.js +253 -0
- package/dist/repertoire/shell-sessions.js +133 -0
- package/dist/repertoire/skills.js +48 -4
- package/dist/repertoire/stripe-client.js +131 -0
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-attachments.js +317 -0
- package/dist/repertoire/tools-awaiting.js +372 -0
- package/dist/repertoire/tools-base.js +57 -1082
- package/dist/repertoire/tools-bluebubbles.js +2 -0
- package/dist/repertoire/tools-bridge.js +144 -0
- package/dist/repertoire/tools-bundle.js +993 -0
- package/dist/repertoire/tools-config.js +186 -0
- package/dist/repertoire/tools-continuity.js +252 -0
- package/dist/repertoire/tools-credential.js +383 -0
- package/dist/repertoire/tools-files.js +344 -0
- package/dist/repertoire/tools-flight.js +227 -0
- package/dist/repertoire/tools-flow.js +119 -0
- package/dist/repertoire/tools-github.js +3 -8
- package/dist/repertoire/tools-mail.js +1975 -0
- package/dist/repertoire/tools-notes.js +438 -0
- package/dist/repertoire/tools-obligations.js +143 -0
- package/dist/repertoire/tools-orientation.js +31 -0
- package/dist/repertoire/tools-record.js +464 -0
- package/dist/repertoire/tools-runtime.js +150 -0
- package/dist/repertoire/tools-session.js +756 -0
- package/dist/repertoire/tools-shell.js +120 -0
- package/dist/repertoire/tools-stripe.js +182 -0
- package/dist/repertoire/tools-surface.js +316 -0
- package/dist/repertoire/tools-teams.js +12 -39
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-trip.js +982 -0
- package/dist/repertoire/tools-user-profile.js +146 -0
- package/dist/repertoire/tools-vault.js +40 -0
- package/dist/repertoire/tools-voice.js +145 -0
- package/dist/repertoire/tools.js +215 -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 +2599 -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 +517 -204
- package/dist/senses/commands.js +66 -3
- package/dist/senses/habit-turn-message.js +108 -0
- package/dist/senses/inner-dialog-worker.js +254 -22
- package/dist/senses/inner-dialog.js +488 -39
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +379 -0
- package/dist/senses/pipeline.js +666 -181
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +393 -0
- package/dist/senses/surface-tool.js +70 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +388 -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/dist/util/frontmatter.js +53 -0
- package/package.json +42 -8
- 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/repertoire/tasks/board.js +0 -134
- package/dist/repertoire/tasks/index.js +0 -224
- package/dist/repertoire/tasks/lifecycle.js +0 -80
- package/dist/repertoire/tasks/middleware.js +0 -65
- package/dist/repertoire/tasks/parser.js +0 -173
- package/dist/repertoire/tasks/scanner.js +0 -132
- package/dist/repertoire/tasks/transitions.js +0 -144
- package/dist/senses/bluebubbles-entry.js +0 -13
- package/dist/senses/bluebubbles.js +0 -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/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
- /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
- /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
- /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
- /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
|
@@ -1,13 +1,49 @@
|
|
|
1
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
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.formatBridgeStatus = formatBridgeStatus;
|
|
4
37
|
exports.formatBridgeContext = formatBridgeContext;
|
|
5
38
|
exports.createBridgeManager = createBridgeManager;
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const path = __importStar(require("path"));
|
|
6
41
|
const runtime_1 = require("../../nerves/runtime");
|
|
42
|
+
const config_1 = require("../config");
|
|
43
|
+
const identity_1 = require("../identity");
|
|
7
44
|
const state_machine_1 = require("./state-machine");
|
|
8
45
|
const store_1 = require("./store");
|
|
9
46
|
const turn_coordinator_1 = require("../turn-coordinator");
|
|
10
|
-
const tasks_1 = require("../../repertoire/tasks");
|
|
11
47
|
function defaultIdFactory() {
|
|
12
48
|
return `bridge-${Date.now().toString(36)}`;
|
|
13
49
|
}
|
|
@@ -81,23 +117,105 @@ function hasAttachedSessionActivity(bridge, sessionActivity) {
|
|
|
81
117
|
return sessionActivity.some((activity) => activity.channel !== "inner"
|
|
82
118
|
&& bridge.attachedSessions.some((session) => sessionMatches(activity, session)));
|
|
83
119
|
}
|
|
84
|
-
function hasLiveTaskStatus(bridge, taskBoard) {
|
|
85
|
-
const taskName = bridge.task?.taskName;
|
|
86
|
-
if (!taskName)
|
|
87
|
-
return false;
|
|
88
|
-
return (taskBoard.byStatus.processing.includes(taskName)
|
|
89
|
-
|| taskBoard.byStatus.collaborating.includes(taskName)
|
|
90
|
-
|| taskBoard.byStatus.validating.includes(taskName));
|
|
91
|
-
}
|
|
92
120
|
function isCurrentSessionAttached(bridge, currentSession) {
|
|
93
121
|
if (!currentSession)
|
|
94
122
|
return false;
|
|
95
123
|
return bridge.attachedSessions.some((session) => sessionMatches(session, currentSession));
|
|
96
124
|
}
|
|
125
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
126
|
+
// Desk task writer — bridge promotion durably writes a `task.md` under the
|
|
127
|
+
// bundle's `desk/bridges/<slug>/` track so the desk substrate (W6) owns the
|
|
128
|
+
// promoted task. This module deliberately does not depend on
|
|
129
|
+
// `src/repertoire/tasks/` — the task module is being retired in Unit 8c.
|
|
130
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
131
|
+
function formatStemTimestamp(now = new Date()) {
|
|
132
|
+
const year = now.getFullYear();
|
|
133
|
+
const month = String(now.getMonth() + 1).padStart(2, "0");
|
|
134
|
+
const day = String(now.getDate()).padStart(2, "0");
|
|
135
|
+
const hours = String(now.getHours()).padStart(2, "0");
|
|
136
|
+
const minutes = String(now.getMinutes()).padStart(2, "0");
|
|
137
|
+
return `${year}-${month}-${day}-${hours}${minutes}`;
|
|
138
|
+
}
|
|
139
|
+
function formatDate(now = new Date()) {
|
|
140
|
+
return now.toISOString().slice(0, 10);
|
|
141
|
+
}
|
|
142
|
+
function formatFrontmatterValue(value) {
|
|
143
|
+
if (Array.isArray(value)) {
|
|
144
|
+
if (value.length === 0)
|
|
145
|
+
return ["[]"];
|
|
146
|
+
return ["", ...value.map((entry) => `- ${String(entry)}`)];
|
|
147
|
+
}
|
|
148
|
+
if (value === null)
|
|
149
|
+
return ["null"];
|
|
150
|
+
return [String(value)];
|
|
151
|
+
}
|
|
152
|
+
function renderTaskMarkdown(frontmatter, body) {
|
|
153
|
+
const lines = ["---"];
|
|
154
|
+
for (const key of Object.keys(frontmatter)) {
|
|
155
|
+
const rendered = formatFrontmatterValue(frontmatter[key]);
|
|
156
|
+
if (rendered.length === 1) {
|
|
157
|
+
lines.push(`${key}: ${rendered[0]}`);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
lines.push(`${key}:`);
|
|
161
|
+
for (const entry of rendered.slice(1)) {
|
|
162
|
+
lines.push(entry);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
lines.push("---");
|
|
167
|
+
lines.push("");
|
|
168
|
+
lines.push(body.trim());
|
|
169
|
+
lines.push("");
|
|
170
|
+
return lines.join("\n");
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Default desk-task writer — writes a `task.md` under
|
|
174
|
+
* `<agentRoot>/desk/bridges/<stem>/task.md` and returns the slug + path.
|
|
175
|
+
*
|
|
176
|
+
* The "bridges" track is the home for promoted bridge work; the slug is
|
|
177
|
+
* `<YYYY-MM-DD-HHMM>-<slugified-title>` to match the timestamped shape used
|
|
178
|
+
* elsewhere in desk.
|
|
179
|
+
*/
|
|
180
|
+
function defaultWriteDeskTask(input) {
|
|
181
|
+
(0, runtime_1.emitNervesEvent)({
|
|
182
|
+
event: "engine.bridge_desk_task_write",
|
|
183
|
+
component: "engine",
|
|
184
|
+
message: "writing desk task for promoted bridge",
|
|
185
|
+
meta: { activeBridge: input.activeBridge },
|
|
186
|
+
});
|
|
187
|
+
const now = new Date();
|
|
188
|
+
const stem = `${formatStemTimestamp(now)}-${(0, config_1.slugify)(input.title).slice(0, 64) || "bridge"}`;
|
|
189
|
+
const trackDir = path.join((0, identity_1.getAgentRoot)(), "desk", "bridges", stem);
|
|
190
|
+
const taskPath = path.join(trackDir, "task.md");
|
|
191
|
+
const today = formatDate(now);
|
|
192
|
+
const frontmatter = {
|
|
193
|
+
kind: "task",
|
|
194
|
+
schema_version: 1,
|
|
195
|
+
type: "ongoing",
|
|
196
|
+
category: input.category || "coordination",
|
|
197
|
+
title: input.title,
|
|
198
|
+
status: "processing",
|
|
199
|
+
validator: null,
|
|
200
|
+
requester: "agent",
|
|
201
|
+
cadence: null,
|
|
202
|
+
scheduledAt: null,
|
|
203
|
+
lastRun: null,
|
|
204
|
+
created: today,
|
|
205
|
+
updated: today,
|
|
206
|
+
artifacts: [],
|
|
207
|
+
active_bridge: input.activeBridge,
|
|
208
|
+
bridge_sessions: input.bridgeSessions.filter((value) => typeof value === "string" && value.trim().length > 0),
|
|
209
|
+
};
|
|
210
|
+
fs.mkdirSync(trackDir, { recursive: true });
|
|
211
|
+
fs.writeFileSync(taskPath, renderTaskMarkdown(frontmatter, input.body), "utf-8");
|
|
212
|
+
return { taskName: stem, path: taskPath };
|
|
213
|
+
}
|
|
97
214
|
function createBridgeManager(options = {}) {
|
|
98
215
|
const store = options.store ?? (0, store_1.createBridgeStore)();
|
|
99
216
|
const now = options.now ?? (() => new Date().toISOString());
|
|
100
217
|
const idFactory = options.idFactory ?? defaultIdFactory;
|
|
218
|
+
const writeDeskTask = options.writeDeskTask ?? defaultWriteDeskTask;
|
|
101
219
|
function requireBridge(bridgeId) {
|
|
102
220
|
const bridge = store.get(bridgeId);
|
|
103
221
|
if (!bridge) {
|
|
@@ -187,9 +305,14 @@ function createBridgeManager(options = {}) {
|
|
|
187
305
|
},
|
|
188
306
|
reconcileLifecycles(input) {
|
|
189
307
|
return store.list().map((bridge) => {
|
|
308
|
+
// Unit 8a dropped the legacy task-board read from production callers,
|
|
309
|
+
// and Unit 8b drops it from the manager surface entirely. Bridges
|
|
310
|
+
// suspend when no attached session is active and the current session
|
|
311
|
+
// isn't attached — task-state cross-referencing is no longer part of
|
|
312
|
+
// the lifecycle reconciliation contract.
|
|
190
313
|
const nextState = (0, state_machine_1.reconcileBridgeState)(bridge, {
|
|
191
314
|
hasAttachedSessionActivity: hasAttachedSessionActivity(bridge, input.sessionActivity),
|
|
192
|
-
hasLiveTask:
|
|
315
|
+
hasLiveTask: false,
|
|
193
316
|
currentSessionAttached: isCurrentSessionAttached(bridge, input.currentSession),
|
|
194
317
|
});
|
|
195
318
|
if (nextState.lifecycle === bridge.lifecycle && nextState.runtime === bridge.runtime) {
|
|
@@ -207,21 +330,18 @@ function createBridgeManager(options = {}) {
|
|
|
207
330
|
assertBridgeMutable(bridge, "promote");
|
|
208
331
|
if (bridge.task)
|
|
209
332
|
return bridge;
|
|
210
|
-
const
|
|
333
|
+
const written = writeDeskTask({
|
|
211
334
|
title: input.title?.trim() || bridge.objective,
|
|
212
|
-
type: "ongoing",
|
|
213
335
|
category: input.category?.trim() || "coordination",
|
|
214
|
-
status: "processing",
|
|
215
336
|
body: input.body?.trim() || defaultTaskBody(bridge),
|
|
216
337
|
activeBridge: bridge.id,
|
|
217
338
|
bridgeSessions: bridge.attachedSessions.map((session) => sessionIdentityKey(session)),
|
|
218
339
|
});
|
|
219
|
-
const taskName = taskPath.replace(/^.*\//, "").replace(/\.md$/, "");
|
|
220
340
|
const updated = save({
|
|
221
341
|
...bridge,
|
|
222
342
|
task: {
|
|
223
|
-
taskName,
|
|
224
|
-
path:
|
|
343
|
+
taskName: written.taskName,
|
|
344
|
+
path: written.path,
|
|
225
345
|
mode: "promoted",
|
|
226
346
|
boundAt: now(),
|
|
227
347
|
},
|
|
@@ -233,7 +353,7 @@ function createBridgeManager(options = {}) {
|
|
|
233
353
|
message: "promoted bridge to task-backed work",
|
|
234
354
|
meta: {
|
|
235
355
|
bridgeId,
|
|
236
|
-
taskName,
|
|
356
|
+
taskName: written.taskName,
|
|
237
357
|
},
|
|
238
358
|
});
|
|
239
359
|
return updated;
|
|
@@ -38,6 +38,7 @@ exports.createBridgeStore = createBridgeStore;
|
|
|
38
38
|
const fs = __importStar(require("fs"));
|
|
39
39
|
const path = __importStar(require("path"));
|
|
40
40
|
const identity_1 = require("../identity");
|
|
41
|
+
const session_events_1 = require("../session-events");
|
|
41
42
|
const runtime_1 = require("../../nerves/runtime");
|
|
42
43
|
function sessionIdentityMatches(session, candidate) {
|
|
43
44
|
return (session.friendId === candidate.friendId
|
|
@@ -58,7 +59,18 @@ function createBridgeStore(options = {}) {
|
|
|
58
59
|
return {
|
|
59
60
|
save(bridge) {
|
|
60
61
|
ensureRoot();
|
|
61
|
-
|
|
62
|
+
const cappedBridge = {
|
|
63
|
+
...bridge,
|
|
64
|
+
objective: (0, session_events_1.capStructuredRecordString)(bridge.objective),
|
|
65
|
+
summary: (0, session_events_1.capStructuredRecordString)(bridge.summary),
|
|
66
|
+
attachedSessions: bridge.attachedSessions.map((session) => ({
|
|
67
|
+
...session,
|
|
68
|
+
snapshot: typeof session.snapshot === "string"
|
|
69
|
+
? (0, session_events_1.capStructuredRecordString)(session.snapshot)
|
|
70
|
+
: session.snapshot,
|
|
71
|
+
})),
|
|
72
|
+
};
|
|
73
|
+
fs.writeFileSync(bridgeFilePath(rootDir, bridge.id), JSON.stringify(cappedBridge, null, 2), "utf-8");
|
|
62
74
|
(0, runtime_1.emitNervesEvent)({
|
|
63
75
|
component: "engine",
|
|
64
76
|
event: "engine.bridge_store_save",
|
|
@@ -68,7 +80,7 @@ function createBridgeStore(options = {}) {
|
|
|
68
80
|
rootDir,
|
|
69
81
|
},
|
|
70
82
|
});
|
|
71
|
-
return
|
|
83
|
+
return cappedBridge;
|
|
72
84
|
},
|
|
73
85
|
get(id) {
|
|
74
86
|
const filePath = bridgeFilePath(rootDir, id);
|
|
@@ -0,0 +1,168 @@
|
|
|
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.detectBundleState = detectBundleState;
|
|
37
|
+
exports.renderBundleStateHint = renderBundleStateHint;
|
|
38
|
+
/**
|
|
39
|
+
* Bundle state detection: inspects an agent bundle's git + pending-sync
|
|
40
|
+
* state and returns a structured list of issues the agent needs to remediate
|
|
41
|
+
* via its `bundle_*` tools.
|
|
42
|
+
*
|
|
43
|
+
* Previously the sync pipeline surfaced a single free-form `syncFailure`
|
|
44
|
+
* string that was good for humans but hard for the agent to act on. The
|
|
45
|
+
* new `BundleStateIssue` enum lets the agent pattern-match on discrete
|
|
46
|
+
* cases and pick the correct remediation tool (shipping in PR 6).
|
|
47
|
+
*
|
|
48
|
+
* Detection never throws: every git call is wrapped in try/catch so a
|
|
49
|
+
* broken bundle or a missing git binary degrades to an empty array or a
|
|
50
|
+
* `not_a_git_repo` signal rather than exploding the turn pipeline.
|
|
51
|
+
*
|
|
52
|
+
* The classification returned here is detected from bundle state +
|
|
53
|
+
* the `classification` field of `state/pending-sync.json` (written by
|
|
54
|
+
* `postTurnPush` in sync.ts when it writes the pending-sync record).
|
|
55
|
+
*
|
|
56
|
+
* - `not_a_git_repo`: `.git` directory missing.
|
|
57
|
+
* - `no_remote_configured`: `git remote` returns empty.
|
|
58
|
+
* - `first_commit_never_happened`: `.git` exists but `git rev-parse HEAD`
|
|
59
|
+
* fails (fresh `git init` with nothing committed).
|
|
60
|
+
* - `pending_sync_exists`: `state/pending-sync.json` exists — the agent
|
|
61
|
+
* should inspect it and clear the pending state.
|
|
62
|
+
* - `remote_push_failed`: pending-sync classified as `push_rejected` —
|
|
63
|
+
* the remote advanced and a simple retry won't work.
|
|
64
|
+
* - `pull_rebase_conflict`: pending-sync classified as
|
|
65
|
+
* `pull_rebase_conflict` — the rebase left conflicted files the agent
|
|
66
|
+
* has to walk the user through resolving.
|
|
67
|
+
*/
|
|
68
|
+
const child_process_1 = require("child_process");
|
|
69
|
+
const fs = __importStar(require("fs"));
|
|
70
|
+
const path = __importStar(require("path"));
|
|
71
|
+
const runtime_1 = require("../nerves/runtime");
|
|
72
|
+
function detectBundleState(agentRoot, deps = {}) {
|
|
73
|
+
const exec = deps.execFileSync ?? child_process_1.execFileSync;
|
|
74
|
+
const exists = deps.existsSync ?? fs.existsSync;
|
|
75
|
+
const readFile = deps.readFileSync ?? ((p, enc) => fs.readFileSync(p, enc));
|
|
76
|
+
const issues = [];
|
|
77
|
+
(0, runtime_1.emitNervesEvent)({
|
|
78
|
+
component: "heart",
|
|
79
|
+
event: "heart.bundle_state_detect_start",
|
|
80
|
+
message: "detecting bundle state",
|
|
81
|
+
meta: { agentRoot },
|
|
82
|
+
});
|
|
83
|
+
const gitDir = path.join(agentRoot, ".git");
|
|
84
|
+
const isGitRepo = exists(gitDir);
|
|
85
|
+
if (!isGitRepo) {
|
|
86
|
+
issues.push("not_a_git_repo");
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// Check remote presence
|
|
90
|
+
try {
|
|
91
|
+
const remoteOutput = exec("git", ["remote"], {
|
|
92
|
+
cwd: agentRoot,
|
|
93
|
+
stdio: "pipe",
|
|
94
|
+
timeout: 5000,
|
|
95
|
+
}).toString().trim();
|
|
96
|
+
if (remoteOutput.length === 0) {
|
|
97
|
+
issues.push("no_remote_configured");
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Git missing or broken — treat as no_remote_configured so the
|
|
102
|
+
// agent surfaces a "fix git" signal rather than a silent pass.
|
|
103
|
+
issues.push("no_remote_configured");
|
|
104
|
+
}
|
|
105
|
+
// Check for initial commit
|
|
106
|
+
try {
|
|
107
|
+
exec("git", ["rev-parse", "HEAD"], {
|
|
108
|
+
cwd: agentRoot,
|
|
109
|
+
stdio: "pipe",
|
|
110
|
+
timeout: 5000,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
issues.push("first_commit_never_happened");
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Pending-sync file — independent of git state (could exist on a bundle
|
|
118
|
+
// that was a repo and then had its .git deleted). When present, also
|
|
119
|
+
// inspect the classification field to surface the specific failure
|
|
120
|
+
// mode as an additional issue.
|
|
121
|
+
const pendingSyncPath = path.join(agentRoot, "state", "pending-sync.json");
|
|
122
|
+
if (exists(pendingSyncPath)) {
|
|
123
|
+
issues.push("pending_sync_exists");
|
|
124
|
+
try {
|
|
125
|
+
const raw = readFile(pendingSyncPath, "utf-8");
|
|
126
|
+
const parsed = JSON.parse(raw);
|
|
127
|
+
if (parsed.classification === "push_rejected") {
|
|
128
|
+
issues.push("remote_push_failed");
|
|
129
|
+
}
|
|
130
|
+
else if (parsed.classification === "pull_rebase_conflict") {
|
|
131
|
+
issues.push("pull_rebase_conflict");
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// Malformed or unreadable pending-sync.json — pending_sync_exists
|
|
136
|
+
// alone is enough signal for the agent to investigate.
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
(0, runtime_1.emitNervesEvent)({
|
|
140
|
+
component: "heart",
|
|
141
|
+
event: "heart.bundle_state_detect_end",
|
|
142
|
+
message: `bundle state detected: ${issues.length} issue(s)`,
|
|
143
|
+
meta: { agentRoot, issues },
|
|
144
|
+
});
|
|
145
|
+
return issues;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* First-person remediation hint text for the start-of-turn packet. Reads
|
|
149
|
+
* as the agent's own voice per the declarative first-person note rule.
|
|
150
|
+
* Returns empty string when there are no issues (so the packet renderer
|
|
151
|
+
* can skip the section entirely).
|
|
152
|
+
*/
|
|
153
|
+
function renderBundleStateHint(issues) {
|
|
154
|
+
if (issues.length === 0)
|
|
155
|
+
return "";
|
|
156
|
+
const labels = {
|
|
157
|
+
not_a_git_repo: "not a git repo",
|
|
158
|
+
no_remote_configured: "no remote configured",
|
|
159
|
+
first_commit_never_happened: "first commit never happened",
|
|
160
|
+
pending_sync_exists: "pending sync from a prior turn",
|
|
161
|
+
remote_push_failed: "remote push rejected (remote advanced)",
|
|
162
|
+
pull_rebase_conflict: "pull-rebase left conflicts i need to walk the user through",
|
|
163
|
+
};
|
|
164
|
+
const list = issues.map((issue) => labels[issue]).join(", ");
|
|
165
|
+
return (`my bundle has unresolved git state: ${list}. ` +
|
|
166
|
+
`i have the bundle_* tools available to fix this — i should run ` +
|
|
167
|
+
`bundle_check_sync_status first, then use the appropriate remediation tool.`);
|
|
168
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deriveCommitments = deriveCommitments;
|
|
4
|
+
exports.formatCommitments = formatCommitments;
|
|
5
|
+
const obligations_1 = require("../arc/obligations");
|
|
6
|
+
const runtime_1 = require("../nerves/runtime");
|
|
7
|
+
function describeActiveObligation(obligation) {
|
|
8
|
+
if (obligation.status === "pending") {
|
|
9
|
+
return `i owe ${obligation.origin.friendId}: ${obligation.content}`;
|
|
10
|
+
}
|
|
11
|
+
const surface = obligation.currentSurface?.label;
|
|
12
|
+
const statusText = obligation.status.replaceAll("_", " ");
|
|
13
|
+
if (surface) {
|
|
14
|
+
return `i owe ${obligation.origin.friendId}: ${obligation.content} (${statusText} in ${surface})`;
|
|
15
|
+
}
|
|
16
|
+
return `i owe ${obligation.origin.friendId}: ${obligation.content} (${statusText})`;
|
|
17
|
+
}
|
|
18
|
+
function deriveCommitments(activeWorkFrame, innerJob, pendingObligations, pendingAwaits) {
|
|
19
|
+
const committedTo = [];
|
|
20
|
+
const completionCriteria = [];
|
|
21
|
+
const safeToIgnore = [];
|
|
22
|
+
const awaiting = pendingAwaits ? [...pendingAwaits] : [];
|
|
23
|
+
// Persistent obligations from the obligation store
|
|
24
|
+
// Sort by status priority: investigating/waiting/updating before pending
|
|
25
|
+
if (pendingObligations && pendingObligations.length > 0) {
|
|
26
|
+
const sorted = [...pendingObligations].sort((a, b) => {
|
|
27
|
+
const advancedA = a.status !== "pending" && a.status !== "fulfilled" ? 0 : 1;
|
|
28
|
+
const advancedB = b.status !== "pending" && b.status !== "fulfilled" ? 0 : 1;
|
|
29
|
+
return advancedA - advancedB;
|
|
30
|
+
});
|
|
31
|
+
let hasAdvancedObligation = false;
|
|
32
|
+
for (const ob of sorted) {
|
|
33
|
+
if (!(0, obligations_1.isOpenObligationStatus)(ob.status))
|
|
34
|
+
continue;
|
|
35
|
+
committedTo.push(describeActiveObligation(ob));
|
|
36
|
+
if (ob.status !== "pending")
|
|
37
|
+
hasAdvancedObligation = true;
|
|
38
|
+
}
|
|
39
|
+
completionCriteria.push("fulfill my outstanding obligations");
|
|
40
|
+
if (hasAdvancedObligation) {
|
|
41
|
+
completionCriteria.push("close my active obligation loops");
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Inner job
|
|
45
|
+
if (innerJob.status === "queued" || innerJob.status === "running") {
|
|
46
|
+
const contentSuffix = innerJob.content ? ` -- ${innerJob.content.slice(0, 60)}` : "";
|
|
47
|
+
committedTo.push(`i'm thinking through something privately${contentSuffix}`);
|
|
48
|
+
}
|
|
49
|
+
else if (innerJob.status === "surfaced") {
|
|
50
|
+
committedTo.push("i finished thinking about something and need to bring it back");
|
|
51
|
+
}
|
|
52
|
+
// mustResolveBeforeHandoff
|
|
53
|
+
if (activeWorkFrame.mustResolveBeforeHandoff) {
|
|
54
|
+
committedTo.push("i need to finish what i started before moving on");
|
|
55
|
+
completionCriteria.push("resolve the current thread before moving on");
|
|
56
|
+
}
|
|
57
|
+
// Bridges
|
|
58
|
+
for (const bridge of activeWorkFrame.bridges) {
|
|
59
|
+
committedTo.push(`i have shared work: ${bridge.summary || bridge.objective}`);
|
|
60
|
+
}
|
|
61
|
+
if (activeWorkFrame.bridges.length > 0) {
|
|
62
|
+
completionCriteria.push("keep shared work aligned across sessions");
|
|
63
|
+
}
|
|
64
|
+
// Obligation completion criteria
|
|
65
|
+
if (innerJob.obligationStatus === "pending") {
|
|
66
|
+
const name = innerJob.origin?.friendName ?? innerJob.origin?.friendId ?? "them";
|
|
67
|
+
completionCriteria.push(`bring my answer back to ${name}`);
|
|
68
|
+
}
|
|
69
|
+
// Default completion criteria
|
|
70
|
+
if (completionCriteria.length === 0) {
|
|
71
|
+
completionCriteria.push("just be present in this conversation");
|
|
72
|
+
}
|
|
73
|
+
// Safe to ignore
|
|
74
|
+
if (innerJob.status === "idle" && !(activeWorkFrame.inner?.hasPending)) {
|
|
75
|
+
safeToIgnore.push("no private thinking in progress");
|
|
76
|
+
}
|
|
77
|
+
if (activeWorkFrame.bridges.length === 0) {
|
|
78
|
+
safeToIgnore.push("no shared work to coordinate");
|
|
79
|
+
}
|
|
80
|
+
(0, runtime_1.emitNervesEvent)({
|
|
81
|
+
component: "engine",
|
|
82
|
+
event: "engine.commitments_derive",
|
|
83
|
+
message: "derived commitments frame",
|
|
84
|
+
meta: { committedCount: committedTo.length, criteriaCount: completionCriteria.length, awaitingCount: awaiting.length },
|
|
85
|
+
});
|
|
86
|
+
return { committedTo, completionCriteria, safeToIgnore, awaiting };
|
|
87
|
+
}
|
|
88
|
+
function formatRelativeAge(lastCheckedAt, now) {
|
|
89
|
+
if (!lastCheckedAt)
|
|
90
|
+
return "never checked";
|
|
91
|
+
const lastMs = new Date(lastCheckedAt).getTime();
|
|
92
|
+
if (!Number.isFinite(lastMs))
|
|
93
|
+
return "never checked";
|
|
94
|
+
const elapsedMs = now().getTime() - lastMs;
|
|
95
|
+
if (elapsedMs < 60_000)
|
|
96
|
+
return "<1m ago";
|
|
97
|
+
const minutes = Math.floor(elapsedMs / 60_000);
|
|
98
|
+
if (minutes < 60)
|
|
99
|
+
return `${minutes}m ago`;
|
|
100
|
+
const hours = Math.floor(minutes / 60);
|
|
101
|
+
if (hours < 24)
|
|
102
|
+
return `${hours}h ago`;
|
|
103
|
+
const days = Math.floor(hours / 24);
|
|
104
|
+
return `${days}d ago`;
|
|
105
|
+
}
|
|
106
|
+
function formatCommitments(commitments, now = () => new Date()) {
|
|
107
|
+
const sections = [];
|
|
108
|
+
if (commitments.committedTo.length === 0) {
|
|
109
|
+
sections.push("i'm not holding anything specific right now. i'm free to be present.");
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
sections.push("## what i'm holding right now");
|
|
113
|
+
sections.push("");
|
|
114
|
+
sections.push(commitments.committedTo.map((c) => `- ${c}`).join("\n"));
|
|
115
|
+
}
|
|
116
|
+
sections.push("");
|
|
117
|
+
sections.push("## what \"done\" looks like");
|
|
118
|
+
sections.push(commitments.completionCriteria.map((c) => `- ${c}`).join("\n"));
|
|
119
|
+
sections.push("");
|
|
120
|
+
sections.push("## what i can let go of");
|
|
121
|
+
sections.push(commitments.safeToIgnore.map((c) => `- ${c}`).join("\n"));
|
|
122
|
+
const awaiting = commitments.awaiting ?? [];
|
|
123
|
+
if (awaiting.length > 0) {
|
|
124
|
+
sections.push("");
|
|
125
|
+
sections.push("## what i'm waiting on");
|
|
126
|
+
for (const a of awaiting) {
|
|
127
|
+
sections.push(`- ${a.name}: ${a.condition}`);
|
|
128
|
+
const obs = a.lastObservation && a.lastObservation.trim().length > 0
|
|
129
|
+
? `: "${a.lastObservation.trim()}"`
|
|
130
|
+
: "";
|
|
131
|
+
sections.push(` (checked ${a.checkedCount}x, last ${formatRelativeAge(a.lastCheckedAt, now)}${obs})`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return sections.join("\n");
|
|
135
|
+
}
|