@ouro.bot/cli 0.1.0-alpha.6 → 0.1.0-alpha.600
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 +229 -183
- 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/SerpentGuide.ouro/agent.json +83 -0
- package/SerpentGuide.ouro/psyche/SOUL.md +25 -0
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +2 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
- package/assets/ouroboros.png +0 -0
- package/changelog.json +4182 -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 +254 -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 +989 -0
- package/dist/heart/agent-entry.js +69 -3
- package/dist/heart/attachments/image-normalize.js +194 -0
- package/dist/heart/attachments/materialize.js +97 -0
- package/dist/heart/attachments/originals.js +88 -0
- package/dist/heart/attachments/render.js +29 -0
- package/dist/heart/attachments/sources/adapter.js +2 -0
- package/dist/heart/attachments/sources/bluebubbles.js +156 -0
- package/dist/heart/attachments/sources/cli-local-file.js +78 -0
- package/dist/heart/attachments/sources/index.js +16 -0
- package/dist/heart/attachments/store.js +103 -0
- package/dist/heart/attachments/types.js +93 -0
- package/dist/heart/auth/auth-flow.js +479 -0
- package/dist/heart/awaiting/await-alert.js +146 -0
- package/dist/heart/awaiting/await-expiry.js +108 -0
- package/dist/heart/awaiting/await-loader.js +91 -0
- package/dist/heart/awaiting/await-parser.js +141 -0
- package/dist/heart/awaiting/await-runtime-state.js +97 -0
- package/dist/heart/awaiting/await-scheduler.js +377 -0
- package/dist/heart/background-operations.js +281 -0
- package/dist/heart/bridges/manager.js +358 -0
- package/dist/heart/bridges/state-machine.js +135 -0
- package/dist/heart/bridges/store.js +123 -0
- package/dist/heart/bundle-state.js +168 -0
- package/dist/heart/commitments.js +142 -0
- package/dist/heart/config-registry.js +322 -0
- package/dist/heart/config.js +164 -135
- package/dist/heart/core.js +1069 -260
- package/dist/heart/cross-chat-delivery.js +131 -0
- package/dist/heart/daemon/agent-config-check.js +419 -0
- package/dist/heart/daemon/agent-discovery.js +180 -0
- package/dist/heart/daemon/agent-service.js +522 -0
- package/dist/heart/daemon/agentic-repair.js +547 -0
- package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
- package/dist/heart/daemon/boot-sync-probe.js +197 -0
- package/dist/heart/daemon/cadence.js +70 -0
- package/dist/heart/daemon/cli-defaults.js +776 -0
- package/dist/heart/daemon/cli-exec.js +7571 -0
- package/dist/heart/daemon/cli-help.js +498 -0
- package/dist/heart/daemon/cli-parse.js +1599 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +763 -0
- package/dist/heart/daemon/cli-types.js +8 -0
- package/dist/heart/daemon/connect-bay.js +323 -0
- package/dist/heart/daemon/daemon-cli.js +30 -758
- package/dist/heart/daemon/daemon-entry.js +540 -8
- 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 +287 -0
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +972 -20
- 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 +206 -0
- 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 +188 -0
- 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 +17 -8
- 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 +381 -26
- 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 +39 -0
- package/dist/heart/daemon/runtime-logging.js +67 -16
- package/dist/heart/daemon/runtime-metadata.js +191 -0
- package/dist/heart/daemon/runtime-mode.js +67 -0
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sense-manager.js +731 -0
- 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 +349 -0
- 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 +524 -0
- package/dist/heart/daemon/up-progress.js +366 -0
- package/dist/heart/daemon/vault-items.js +56 -0
- package/dist/heart/delegation.js +62 -0
- 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-animation.js +10 -3
- package/dist/heart/{daemon → hatch}/hatch-flow.js +34 -136
- package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
- package/dist/heart/hatch/specialist-orchestrator.js +129 -0
- package/dist/heart/hatch/specialist-prompt.js +102 -0
- package/dist/heart/hatch/specialist-tools.js +306 -0
- package/dist/heart/identity.js +281 -67
- package/dist/heart/kept-notes.js +357 -0
- package/dist/heart/kicks.js +2 -20
- 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 +367 -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 +656 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +59 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/progress-story.js +42 -0
- package/dist/heart/provider-attempt.js +134 -0
- package/dist/heart/provider-binding-resolver.js +267 -0
- package/dist/heart/provider-credentials.js +425 -0
- package/dist/heart/provider-failover.js +301 -0
- package/dist/heart/provider-models.js +81 -0
- package/dist/heart/provider-ping.js +262 -0
- package/dist/heart/provider-readiness-cache.js +40 -0
- package/dist/heart/provider-visibility.js +188 -0
- package/dist/heart/providers/anthropic-token.js +131 -0
- package/dist/heart/providers/anthropic.js +202 -50
- package/dist/heart/providers/azure.js +104 -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 +29 -7
- package/dist/heart/providers/openai-codex.js +63 -39
- 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 +70 -0
- package/dist/heart/session-activity.js +190 -0
- 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 +129 -34
- package/dist/heart/sync-classification.js +176 -0
- package/dist/heart/sync.js +449 -0
- package/dist/heart/target-resolution.js +127 -0
- package/dist/heart/tempo.js +93 -0
- package/dist/heart/temporal-view.js +41 -0
- package/dist/heart/timeouts.js +101 -0
- package/dist/heart/tool-activity-callbacks.js +59 -0
- package/dist/heart/tool-description.js +143 -0
- package/dist/heart/tool-friction.js +55 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-context.js +421 -0
- package/dist/heart/turn-coordinator.js +28 -0
- package/dist/heart/versioning/ouro-bot-global-installer.js +129 -0
- package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
- package/dist/heart/versioning/ouro-path-installer.js +426 -0
- package/dist/heart/{daemon → versioning}/ouro-uti.js +11 -2
- package/dist/heart/versioning/ouro-version-manager.js +295 -0
- package/dist/heart/versioning/staged-restart.js +146 -0
- package/dist/heart/versioning/update-checker.js +116 -0
- package/dist/heart/versioning/update-hooks.js +142 -0
- package/dist/heart/versioning/wrapper-publish-guard.js +86 -0
- package/dist/mailbox-ui/assets/index-B-461hes.js +61 -0
- package/dist/mailbox-ui/assets/index-BPr5vNuM.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 +700 -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 +457 -0
- package/dist/mailroom/mbox-import.js +393 -0
- package/dist/mailroom/migration.js +164 -0
- package/dist/mailroom/outbound.js +380 -0
- package/dist/mailroom/policy.js +263 -0
- package/dist/mailroom/reader.js +233 -0
- package/dist/mailroom/search-cache.js +268 -0
- package/dist/mailroom/search-relevance.js +319 -0
- package/dist/mailroom/smtp-ingress.js +176 -0
- package/dist/mailroom/source-state.js +176 -0
- package/dist/mailroom/thread.js +109 -0
- package/dist/mailroom/travel-extract.js +89 -0
- package/dist/mind/bundle-manifest.js +77 -1
- package/dist/mind/context.js +174 -94
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +84 -96
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/first-impressions.js +16 -2
- package/dist/mind/friends/channel.js +74 -0
- package/dist/mind/friends/group-context.js +144 -0
- package/dist/mind/friends/resolver.js +54 -2
- package/dist/mind/friends/store-file.js +58 -3
- package/dist/mind/friends/trust-explanation.js +74 -0
- package/dist/mind/friends/types.js +10 -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 +76 -9
- package/dist/mind/phrases.js +1 -0
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +1267 -130
- package/dist/mind/provenance-trust.js +26 -0
- package/dist/mind/scrutiny.js +173 -0
- package/dist/mind/token-estimate.js +8 -12
- package/dist/nerves/cli-logging.js +22 -3
- package/dist/nerves/coverage/audit-rules.js +15 -6
- package/dist/nerves/coverage/audit.js +28 -2
- package/dist/nerves/coverage/cli.js +1 -1
- package/dist/nerves/coverage/contract.js +5 -5
- package/dist/nerves/coverage/file-completeness.js +129 -5
- package/dist/nerves/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 +17 -56
- package/dist/repertoire/ado-semantic.js +11 -10
- package/dist/repertoire/api-client.js +97 -0
- package/dist/repertoire/bitwarden-store.js +997 -0
- package/dist/repertoire/bundle-templates.js +72 -0
- package/dist/repertoire/bw-installer.js +180 -0
- package/dist/repertoire/coding/codex-jsonl.js +64 -0
- package/dist/repertoire/coding/context-pack.js +330 -0
- package/dist/repertoire/coding/feedback.js +301 -0
- package/dist/repertoire/coding/index.js +4 -1
- package/dist/repertoire/coding/manager.js +220 -13
- package/dist/repertoire/coding/spawner.js +58 -12
- package/dist/repertoire/coding/tools.js +209 -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/data/ado-endpoints.json +188 -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 +43 -5
- package/dist/repertoire/tasks/fix.js +182 -0
- package/dist/repertoire/tasks/index.js +39 -13
- 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 -79
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-attachments.js +317 -0
- package/dist/repertoire/tools-awaiting.js +360 -0
- package/dist/repertoire/tools-base.js +56 -707
- package/dist/repertoire/tools-bluebubbles.js +94 -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 +1916 -0
- package/dist/repertoire/tools-notes.js +421 -0
- package/dist/repertoire/tools-obligations.js +142 -0
- package/dist/repertoire/tools-runtime.js +61 -0
- package/dist/repertoire/tools-session.js +809 -0
- package/dist/repertoire/tools-shell.js +120 -0
- package/dist/repertoire/tools-stripe.js +180 -0
- package/dist/repertoire/tools-surface.js +345 -0
- package/dist/repertoire/tools-teams.js +64 -61
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-trip.js +604 -0
- package/dist/repertoire/tools-user-profile.js +144 -0
- package/dist/repertoire/tools-vault.js +40 -0
- package/dist/repertoire/tools-voice.js +144 -0
- package/dist/repertoire/tools.js +154 -98
- 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 +685 -0
- package/dist/senses/bluebubbles/entry.js +77 -0
- package/dist/senses/bluebubbles/inbound-log.js +126 -0
- package/dist/senses/bluebubbles/index.js +2548 -0
- package/dist/senses/bluebubbles/media.js +389 -0
- package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +45 -16
- package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +46 -6
- package/dist/senses/bluebubbles/processed-log.js +133 -0
- package/dist/senses/bluebubbles/replay.js +137 -0
- package/dist/senses/bluebubbles/runtime-state.js +137 -0
- package/dist/senses/bluebubbles/session-cleanup.js +72 -0
- 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 +187 -0
- package/dist/senses/cli.js +777 -264
- package/dist/senses/commands.js +66 -3
- package/dist/senses/continuity.js +94 -0
- package/dist/senses/habit-turn-message.js +108 -0
- package/dist/senses/inner-dialog-worker.js +209 -16
- package/dist/senses/inner-dialog.js +682 -91
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +379 -0
- package/dist/senses/pipeline.js +751 -0
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +392 -0
- package/dist/senses/surface-tool.js +70 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +925 -195
- package/dist/senses/trust-gate.js +207 -2
- 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 +5077 -0
- package/dist/senses/voice/types.js +2 -0
- package/dist/senses/voice/whisper.js +161 -0
- package/dist/senses/voice-entry.js +81 -0
- package/dist/senses/voice-realtime-eval-command.js +99 -0
- package/dist/senses/voice-realtime-eval-entry.js +21 -0
- package/dist/senses/voice-twilio-entry.js +87 -0
- package/dist/trips/core.js +138 -0
- package/dist/trips/store.js +265 -0
- package/package.json +52 -7
- package/skills/agent-commerce.md +106 -0
- package/skills/browser-navigation.md +117 -0
- package/skills/commerce-setup-guide.md +116 -0
- package/skills/commerce-setup.md +84 -0
- package/skills/configure-dev-tools.md +99 -0
- package/skills/travel-planning.md +138 -0
- package/AdoptionSpecialist.ouro/agent.json +0 -20
- package/AdoptionSpecialist.ouro/psyche/SOUL.md +0 -22
- package/dist/heart/daemon/specialist-orchestrator.js +0 -160
- package/dist/heart/daemon/specialist-prompt.js +0 -40
- package/dist/heart/daemon/specialist-session.js +0 -142
- package/dist/heart/daemon/specialist-tools.js +0 -128
- package/dist/heart/daemon/subagent-installer.js +0 -125
- package/dist/inner-worker-entry.js +0 -4
- package/dist/mind/associative-recall.js +0 -197
- package/dist/senses/bluebubbles-client.js +0 -279
- package/dist/senses/bluebubbles-entry.js +0 -11
- package/dist/senses/bluebubbles.js +0 -332
- package/subagents/README.md +0 -73
- package/subagents/work-doer.md +0 -233
- package/subagents/work-merger.md +0 -624
- package/subagents/work-planner.md +0 -373
- /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/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
|
@@ -0,0 +1,176 @@
|
|
|
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.HEALTH_TRACKED_EVENTS = exports.DaemonHealthWriter = void 0;
|
|
37
|
+
exports.isRollupStatus = isRollupStatus;
|
|
38
|
+
exports.isDaemonStatus = isDaemonStatus;
|
|
39
|
+
exports.getDefaultHealthPath = getDefaultHealthPath;
|
|
40
|
+
exports.createHealthNervesSink = createHealthNervesSink;
|
|
41
|
+
exports.readHealth = readHealth;
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const os = __importStar(require("os"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
46
|
+
/**
|
|
47
|
+
* Daemon-wide rollup vocabulary — locked layer-1 contract.
|
|
48
|
+
*
|
|
49
|
+
* - `RollupStatus` is what `computeDaemonRollup` returns (post-inventory,
|
|
50
|
+
* four-state). The function never returns `"down"` because by the time
|
|
51
|
+
* the rollup is reachable the daemon has already started, opened its
|
|
52
|
+
* socket, and read its agent inventory — pre-inventory failure is the
|
|
53
|
+
* caller's domain.
|
|
54
|
+
* - `DaemonStatus` is what `DaemonHealthState.status` accepts. The caller
|
|
55
|
+
* widens the rollup result with `"down"` along the daemon-entry failure
|
|
56
|
+
* path (e.g. when the daemon process can't read inventory at all).
|
|
57
|
+
*
|
|
58
|
+
* `isRollupStatus` and `isDaemonStatus` are runtime guards used both by
|
|
59
|
+
* `readHealth` (validating cached health files on disk) and by render-side
|
|
60
|
+
* consumers that want to narrow `unknown` JSON into the typed union before
|
|
61
|
+
* branching on it.
|
|
62
|
+
*/
|
|
63
|
+
// Single source of truth — the literal lists below are the runtime
|
|
64
|
+
// projection of the type unions. A future literal added to RollupStatus
|
|
65
|
+
// MUST also be added to ROLLUP_STATUS_LITERALS or `satisfies` blows up
|
|
66
|
+
// at tsc. That tightens the Layer 1 contract: producer + consumer +
|
|
67
|
+
// guard all stay in lockstep.
|
|
68
|
+
const ROLLUP_STATUS_LITERALS = ["healthy", "partial", "degraded", "safe-mode"];
|
|
69
|
+
const DAEMON_STATUS_LITERALS = [...ROLLUP_STATUS_LITERALS, "down"];
|
|
70
|
+
const ROLLUP_STATUS_VALUES = new Set(ROLLUP_STATUS_LITERALS);
|
|
71
|
+
const DAEMON_STATUS_VALUES = new Set(DAEMON_STATUS_LITERALS);
|
|
72
|
+
function isRollupStatus(value) {
|
|
73
|
+
return typeof value === "string" && ROLLUP_STATUS_VALUES.has(value);
|
|
74
|
+
}
|
|
75
|
+
function isDaemonStatus(value) {
|
|
76
|
+
return typeof value === "string" && DAEMON_STATUS_VALUES.has(value);
|
|
77
|
+
}
|
|
78
|
+
class DaemonHealthWriter {
|
|
79
|
+
healthPath;
|
|
80
|
+
constructor(healthPath) {
|
|
81
|
+
this.healthPath = healthPath;
|
|
82
|
+
}
|
|
83
|
+
writeHealth(state) {
|
|
84
|
+
try {
|
|
85
|
+
const dir = path.dirname(this.healthPath);
|
|
86
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
87
|
+
const tmpPath = `${this.healthPath}.tmp.${process.pid}`;
|
|
88
|
+
fs.writeFileSync(tmpPath, JSON.stringify(state, null, 2) + "\n", "utf-8");
|
|
89
|
+
fs.renameSync(tmpPath, this.healthPath);
|
|
90
|
+
(0, runtime_1.emitNervesEvent)({
|
|
91
|
+
component: "daemon",
|
|
92
|
+
event: "daemon.health_written",
|
|
93
|
+
message: "daemon health file written",
|
|
94
|
+
meta: { path: this.healthPath, status: state.status },
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// Best-effort: if we can't write, don't crash the daemon.
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
exports.DaemonHealthWriter = DaemonHealthWriter;
|
|
103
|
+
function getDefaultHealthPath() {
|
|
104
|
+
return path.join(os.homedir(), ".ouro-cli", "daemon-health.json");
|
|
105
|
+
}
|
|
106
|
+
/** Events that trigger a debounced health file write */
|
|
107
|
+
exports.HEALTH_TRACKED_EVENTS = new Set([
|
|
108
|
+
"daemon.habit_cron_verification_failed",
|
|
109
|
+
"daemon.habit_fire",
|
|
110
|
+
"daemon.agent_exit",
|
|
111
|
+
"daemon.agent_started",
|
|
112
|
+
"daemon.agent_config_invalid",
|
|
113
|
+
"daemon.agent_config_failure",
|
|
114
|
+
"daemon.agent_entry_missing",
|
|
115
|
+
"daemon.agent_spawn_failed",
|
|
116
|
+
"daemon.agent_startup_stale_recovered",
|
|
117
|
+
"daemon.agent_restart_exhausted",
|
|
118
|
+
"daemon.agent_permanent_failure",
|
|
119
|
+
"daemon.agent_cooldown_recovery",
|
|
120
|
+
"daemon.bootstrap_degraded",
|
|
121
|
+
"daemon.safe_mode_entered",
|
|
122
|
+
"daemon.habit_scheduler_start",
|
|
123
|
+
]);
|
|
124
|
+
/**
|
|
125
|
+
* Creates a nerves LogSink that triggers debounced health writes on relevant events.
|
|
126
|
+
* Components don't know about the health writer — they just emit events.
|
|
127
|
+
*/
|
|
128
|
+
function createHealthNervesSink(writer, getState) {
|
|
129
|
+
let debounceTimer = null;
|
|
130
|
+
return (entry) => {
|
|
131
|
+
if (!exports.HEALTH_TRACKED_EVENTS.has(entry.event)) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
// Debounce: max once per second
|
|
135
|
+
if (debounceTimer !== null) {
|
|
136
|
+
clearTimeout(debounceTimer);
|
|
137
|
+
}
|
|
138
|
+
debounceTimer = setTimeout(() => {
|
|
139
|
+
debounceTimer = null;
|
|
140
|
+
const state = getState();
|
|
141
|
+
writer.writeHealth(state);
|
|
142
|
+
}, 1000);
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function readHealth(healthPath) {
|
|
146
|
+
try {
|
|
147
|
+
const raw = fs.readFileSync(healthPath, "utf-8");
|
|
148
|
+
const parsed = JSON.parse(raw);
|
|
149
|
+
if (!isDaemonStatus(parsed.status) ||
|
|
150
|
+
typeof parsed.mode !== "string" ||
|
|
151
|
+
typeof parsed.pid !== "number" ||
|
|
152
|
+
typeof parsed.startedAt !== "string" ||
|
|
153
|
+
typeof parsed.uptimeSeconds !== "number" ||
|
|
154
|
+
!Array.isArray(parsed.degraded) ||
|
|
155
|
+
typeof parsed.agents !== "object" ||
|
|
156
|
+
parsed.agents === null ||
|
|
157
|
+
typeof parsed.habits !== "object" ||
|
|
158
|
+
parsed.habits === null) {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
status: parsed.status,
|
|
163
|
+
mode: parsed.mode,
|
|
164
|
+
pid: parsed.pid,
|
|
165
|
+
startedAt: parsed.startedAt,
|
|
166
|
+
uptimeSeconds: parsed.uptimeSeconds,
|
|
167
|
+
safeMode: parsed.safeMode,
|
|
168
|
+
degraded: parsed.degraded,
|
|
169
|
+
agents: parsed.agents,
|
|
170
|
+
habits: parsed.habits,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.computeDaemonRollup = computeDaemonRollup;
|
|
4
|
+
/**
|
|
5
|
+
* Pure rollup decision function — given the post-inventory daemon
|
|
6
|
+
* surface, returns the daemon-wide rollup state per the locked Layer 1
|
|
7
|
+
* vocabulary table:
|
|
8
|
+
*
|
|
9
|
+
* | rollup | when |
|
|
10
|
+
* | ---------- | --------------------------------------------------------- |
|
|
11
|
+
* | healthy | every enabled agent serving + no bootstrap-degraded + no safe-mode |
|
|
12
|
+
* | partial | (≥1 serving + ≥1 not serving) OR (all serving + ≥1 bootstrap-degraded) |
|
|
13
|
+
* | degraded | zero enabled agents serving (fresh install OR all unhealthy) |
|
|
14
|
+
* | safe-mode | `safeMode === true` overrides everything else |
|
|
15
|
+
*
|
|
16
|
+
* The function NEVER returns `"down"`. By the time `computeDaemonRollup`
|
|
17
|
+
* is reachable, the daemon process has started, opened its socket, and
|
|
18
|
+
* read its agent inventory — pre-inventory failure is the caller's
|
|
19
|
+
* domain. `daemon-entry.ts`'s startup-failure path assigns `"down"` to
|
|
20
|
+
* `DaemonHealthState.status` directly without consulting this function.
|
|
21
|
+
*/
|
|
22
|
+
function computeDaemonRollup(input) {
|
|
23
|
+
// Safe mode wins, period. Crash-loop detection trumps everything —
|
|
24
|
+
// we want the human to see SAFE MODE, not a noisy partial/degraded.
|
|
25
|
+
if (input.safeMode) {
|
|
26
|
+
return "safe-mode";
|
|
27
|
+
}
|
|
28
|
+
// Count serving agents. "Serving" = "running" worker status.
|
|
29
|
+
// Anything else (crashed/stopped/starting/etc) is not serving.
|
|
30
|
+
let serving = 0;
|
|
31
|
+
let notServing = 0;
|
|
32
|
+
for (const agent of input.enabledAgents) {
|
|
33
|
+
if (agent.status === "running") {
|
|
34
|
+
serving++;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
notServing++;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// Zero-serving wins over bootstrap-degraded — we have no working
|
|
41
|
+
// agents to surface a "partially working" story about. This covers
|
|
42
|
+
// both fresh-install (`enabledAgents.length === 0`) and
|
|
43
|
+
// all-failed-live-check (`serving === 0` with `notServing > 0`).
|
|
44
|
+
// Render layer (cli-render.ts) splits the UX copy by inspecting the
|
|
45
|
+
// agents map; the rollup itself doesn't carry the distinction.
|
|
46
|
+
if (serving === 0) {
|
|
47
|
+
return "degraded";
|
|
48
|
+
}
|
|
49
|
+
// From here we have ≥1 serving agent. The remaining choice is
|
|
50
|
+
// healthy vs partial.
|
|
51
|
+
const hasUnhealthyAgent = notServing > 0;
|
|
52
|
+
const hasBootstrapDegraded = input.bootstrapDegraded.length > 0;
|
|
53
|
+
if (hasUnhealthyAgent || hasBootstrapDegraded) {
|
|
54
|
+
return "partial";
|
|
55
|
+
}
|
|
56
|
+
return "healthy";
|
|
57
|
+
}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ensureCurrentDaemonRuntime = ensureCurrentDaemonRuntime;
|
|
4
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
5
|
+
/* v8 ignore start -- daemon liveness poll: real socket timing untestable in vitest @preserve */
|
|
6
|
+
async function verifyDaemonStarted(deps) {
|
|
7
|
+
if (!deps.checkSocketAlive)
|
|
8
|
+
return true;
|
|
9
|
+
const maxWaitMs = 10_000;
|
|
10
|
+
const pollIntervalMs = 500;
|
|
11
|
+
const deadline = Date.now() + maxWaitMs;
|
|
12
|
+
deps.onProgress?.("waiting for the replacement background service to answer");
|
|
13
|
+
while (Date.now() < deadline) {
|
|
14
|
+
await new Promise((r) => setTimeout(r, pollIntervalMs));
|
|
15
|
+
if (await deps.checkSocketAlive(deps.socketPath))
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
/* v8 ignore stop */
|
|
21
|
+
function isKnownVersion(version) {
|
|
22
|
+
return version !== "unknown" && version.trim().length > 0;
|
|
23
|
+
}
|
|
24
|
+
function isKnownRuntimeValue(value) {
|
|
25
|
+
return typeof value === "string" && value.trim().length > 0 && value !== "unknown";
|
|
26
|
+
}
|
|
27
|
+
function formatErrorReason(error) {
|
|
28
|
+
return error instanceof Error ? error.message : String(error);
|
|
29
|
+
}
|
|
30
|
+
function normalizeRuntimeIdentity(value) {
|
|
31
|
+
return {
|
|
32
|
+
version: typeof value.version === "string" ? value.version : "unknown",
|
|
33
|
+
lastUpdated: typeof value.lastUpdated === "string" ? value.lastUpdated : "unknown",
|
|
34
|
+
repoRoot: typeof value.repoRoot === "string" ? value.repoRoot : "unknown",
|
|
35
|
+
configFingerprint: typeof value.configFingerprint === "string" ? value.configFingerprint : "unknown",
|
|
36
|
+
managedAgents: typeof value.managedAgents === "string" ? value.managedAgents : "unknown",
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
async function readRunningRuntimeIdentity(deps) {
|
|
40
|
+
if (!deps.fetchRunningRuntimeMetadata) {
|
|
41
|
+
return normalizeRuntimeIdentity({
|
|
42
|
+
version: await deps.fetchRunningVersion(),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
const metadata = normalizeRuntimeIdentity(await deps.fetchRunningRuntimeMetadata());
|
|
46
|
+
if (isKnownVersion(metadata.version))
|
|
47
|
+
return metadata;
|
|
48
|
+
return normalizeRuntimeIdentity({
|
|
49
|
+
...metadata,
|
|
50
|
+
version: await deps.fetchRunningVersion(),
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function collectRuntimeDriftReasons(local, running) {
|
|
54
|
+
const reasons = [];
|
|
55
|
+
const comparableVersions = isKnownVersion(local.version) && isKnownVersion(running.version);
|
|
56
|
+
if (comparableVersions && local.version !== running.version) {
|
|
57
|
+
reasons.push({ key: "version", label: "version", local: local.version, running: running.version });
|
|
58
|
+
}
|
|
59
|
+
if (comparableVersions && isKnownRuntimeValue(local.lastUpdated) && isKnownRuntimeValue(running.lastUpdated) && local.lastUpdated !== running.lastUpdated) {
|
|
60
|
+
reasons.push({ key: "lastUpdated", label: "last updated", local: local.lastUpdated, running: running.lastUpdated });
|
|
61
|
+
}
|
|
62
|
+
if (isKnownRuntimeValue(local.repoRoot) && isKnownRuntimeValue(running.repoRoot) && local.repoRoot !== running.repoRoot) {
|
|
63
|
+
reasons.push({ key: "repoRoot", label: "code path", local: local.repoRoot, running: running.repoRoot });
|
|
64
|
+
}
|
|
65
|
+
if (isKnownRuntimeValue(local.configFingerprint)
|
|
66
|
+
&& isKnownRuntimeValue(running.configFingerprint)
|
|
67
|
+
&& local.configFingerprint !== running.configFingerprint) {
|
|
68
|
+
reasons.push({
|
|
69
|
+
key: "configFingerprint",
|
|
70
|
+
label: "config fingerprint",
|
|
71
|
+
local: local.configFingerprint,
|
|
72
|
+
running: running.configFingerprint,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
if (isKnownRuntimeValue(local.managedAgents)
|
|
76
|
+
&& isKnownRuntimeValue(running.managedAgents)
|
|
77
|
+
&& local.managedAgents !== running.managedAgents) {
|
|
78
|
+
reasons.push({
|
|
79
|
+
key: "managedAgents",
|
|
80
|
+
label: "managed agents",
|
|
81
|
+
local: local.managedAgents,
|
|
82
|
+
running: running.managedAgents,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return reasons;
|
|
86
|
+
}
|
|
87
|
+
function formatRuntimeDriftPublicSummary(reasons) {
|
|
88
|
+
return reasons.map((reason) => reason.label).join(", ");
|
|
89
|
+
}
|
|
90
|
+
async function ensureCurrentDaemonRuntime(deps) {
|
|
91
|
+
deps.onProgress?.("checking whether an older background service is already running");
|
|
92
|
+
const localRuntime = normalizeRuntimeIdentity({
|
|
93
|
+
version: deps.localVersion,
|
|
94
|
+
lastUpdated: deps.localLastUpdated,
|
|
95
|
+
repoRoot: deps.localRepoRoot,
|
|
96
|
+
configFingerprint: deps.localConfigFingerprint,
|
|
97
|
+
managedAgents: deps.localManagedAgents,
|
|
98
|
+
});
|
|
99
|
+
try {
|
|
100
|
+
const runningRuntime = await readRunningRuntimeIdentity(deps);
|
|
101
|
+
const runningVersion = runningRuntime.version;
|
|
102
|
+
const driftReasons = collectRuntimeDriftReasons(localRuntime, runningRuntime);
|
|
103
|
+
let result;
|
|
104
|
+
if (driftReasons.length > 0) {
|
|
105
|
+
const includesVersionDrift = driftReasons.some((entry) => entry.key === "version");
|
|
106
|
+
const publicDriftSummary = formatRuntimeDriftPublicSummary(driftReasons);
|
|
107
|
+
try {
|
|
108
|
+
deps.onProgress?.("stopping the older background service");
|
|
109
|
+
await deps.stopDaemon();
|
|
110
|
+
if (deps.prepareDaemonRuntimeReplacement) {
|
|
111
|
+
deps.onProgress?.("disabling daemon auto-restart during replacement");
|
|
112
|
+
try {
|
|
113
|
+
await Promise.resolve(deps.prepareDaemonRuntimeReplacement());
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
(0, runtime_1.emitNervesEvent)({
|
|
117
|
+
level: "warn",
|
|
118
|
+
component: "daemon",
|
|
119
|
+
event: "daemon.runtime_sync_replacement_prepare_error",
|
|
120
|
+
message: "daemon runtime replacement preparation failed",
|
|
121
|
+
meta: {
|
|
122
|
+
socketPath: deps.socketPath,
|
|
123
|
+
reason: formatErrorReason(error),
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
const reason = formatErrorReason(error);
|
|
131
|
+
result = {
|
|
132
|
+
ok: false,
|
|
133
|
+
alreadyRunning: true,
|
|
134
|
+
message: includesVersionDrift
|
|
135
|
+
? `daemon already running (${deps.socketPath}; could not replace the older background service ${runningVersion} -> ${deps.localVersion}: ${reason})`
|
|
136
|
+
: `daemon already running (${deps.socketPath}; could not replace the older background service after runtime drift ${publicDriftSummary}: ${reason})`,
|
|
137
|
+
startupFailureReason: includesVersionDrift
|
|
138
|
+
? "could not replace the older background service"
|
|
139
|
+
: "could not replace the older background service after runtime drift",
|
|
140
|
+
};
|
|
141
|
+
(0, runtime_1.emitNervesEvent)({
|
|
142
|
+
level: "warn",
|
|
143
|
+
component: "daemon",
|
|
144
|
+
event: "daemon.runtime_sync_decision",
|
|
145
|
+
message: "evaluated daemon runtime sync outcome",
|
|
146
|
+
meta: {
|
|
147
|
+
socketPath: deps.socketPath,
|
|
148
|
+
localVersion: deps.localVersion,
|
|
149
|
+
localLastUpdated: localRuntime.lastUpdated,
|
|
150
|
+
localRepoRoot: localRuntime.repoRoot,
|
|
151
|
+
localConfigFingerprint: localRuntime.configFingerprint,
|
|
152
|
+
localManagedAgents: localRuntime.managedAgents,
|
|
153
|
+
runningVersion,
|
|
154
|
+
runningLastUpdated: runningRuntime.lastUpdated,
|
|
155
|
+
runningRepoRoot: runningRuntime.repoRoot,
|
|
156
|
+
runningConfigFingerprint: runningRuntime.configFingerprint,
|
|
157
|
+
runningManagedAgents: runningRuntime.managedAgents,
|
|
158
|
+
action: "stale_replace_failed",
|
|
159
|
+
driftKeys: driftReasons.map((entry) => entry.key),
|
|
160
|
+
reason,
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
return result;
|
|
164
|
+
}
|
|
165
|
+
deps.cleanupStaleSocket(deps.socketPath);
|
|
166
|
+
deps.onProgress?.("starting the replacement background service");
|
|
167
|
+
const bootStartedAtMs = (deps.now ?? Date.now)();
|
|
168
|
+
const started = await deps.startDaemonProcess(deps.socketPath);
|
|
169
|
+
const pid = started.pid ?? "unknown";
|
|
170
|
+
const startupCheck = deps.waitForDaemonStartup
|
|
171
|
+
? await deps.waitForDaemonStartup({ pid: started.pid ?? null, bootStartedAtMs })
|
|
172
|
+
: { ok: await verifyDaemonStarted(deps) };
|
|
173
|
+
const verified = startupCheck.ok;
|
|
174
|
+
/* v8 ignore next -- daemon liveness failure: requires real daemon crash timing @preserve */
|
|
175
|
+
const suffix = verified
|
|
176
|
+
? ""
|
|
177
|
+
: `\n${startupCheck.reason ?? "replacement background service did not answer in time"}; check logs with \`ouro logs\` or run \`ouro doctor\`.`;
|
|
178
|
+
result = {
|
|
179
|
+
ok: verified,
|
|
180
|
+
alreadyRunning: false,
|
|
181
|
+
message: includesVersionDrift
|
|
182
|
+
? `replaced an older background service ${runningVersion} -> ${deps.localVersion} (pid ${pid})${suffix}`
|
|
183
|
+
: `replaced an older background service after runtime drift: ${publicDriftSummary} (pid ${pid})${suffix}`,
|
|
184
|
+
verifyStartupStatus: verified,
|
|
185
|
+
startedPid: started.pid ?? null,
|
|
186
|
+
startupFailureReason: verified ? null : (startupCheck.reason ?? "replacement background service did not answer in time"),
|
|
187
|
+
};
|
|
188
|
+
(0, runtime_1.emitNervesEvent)({
|
|
189
|
+
component: "daemon",
|
|
190
|
+
event: "daemon.runtime_sync_decision",
|
|
191
|
+
message: "evaluated daemon runtime sync outcome",
|
|
192
|
+
meta: {
|
|
193
|
+
socketPath: deps.socketPath,
|
|
194
|
+
localVersion: deps.localVersion,
|
|
195
|
+
localLastUpdated: localRuntime.lastUpdated,
|
|
196
|
+
localRepoRoot: localRuntime.repoRoot,
|
|
197
|
+
localConfigFingerprint: localRuntime.configFingerprint,
|
|
198
|
+
localManagedAgents: localRuntime.managedAgents,
|
|
199
|
+
runningVersion,
|
|
200
|
+
runningLastUpdated: runningRuntime.lastUpdated,
|
|
201
|
+
runningRepoRoot: runningRuntime.repoRoot,
|
|
202
|
+
runningConfigFingerprint: runningRuntime.configFingerprint,
|
|
203
|
+
runningManagedAgents: runningRuntime.managedAgents,
|
|
204
|
+
action: "stale_restarted",
|
|
205
|
+
driftKeys: driftReasons.map((entry) => entry.key),
|
|
206
|
+
pid: started.pid ?? null,
|
|
207
|
+
},
|
|
208
|
+
});
|
|
209
|
+
return result;
|
|
210
|
+
}
|
|
211
|
+
if (!isKnownVersion(localRuntime.version) || !isKnownVersion(runningVersion)) {
|
|
212
|
+
result = {
|
|
213
|
+
ok: true,
|
|
214
|
+
alreadyRunning: true,
|
|
215
|
+
message: `daemon already running (${deps.socketPath}; unable to verify version)`,
|
|
216
|
+
};
|
|
217
|
+
(0, runtime_1.emitNervesEvent)({
|
|
218
|
+
component: "daemon",
|
|
219
|
+
event: "daemon.runtime_sync_decision",
|
|
220
|
+
message: "evaluated daemon runtime sync outcome",
|
|
221
|
+
meta: {
|
|
222
|
+
socketPath: deps.socketPath,
|
|
223
|
+
localVersion: deps.localVersion,
|
|
224
|
+
localLastUpdated: localRuntime.lastUpdated,
|
|
225
|
+
localRepoRoot: localRuntime.repoRoot,
|
|
226
|
+
localConfigFingerprint: localRuntime.configFingerprint,
|
|
227
|
+
localManagedAgents: localRuntime.managedAgents,
|
|
228
|
+
runningVersion,
|
|
229
|
+
runningLastUpdated: runningRuntime.lastUpdated,
|
|
230
|
+
runningRepoRoot: runningRuntime.repoRoot,
|
|
231
|
+
runningConfigFingerprint: runningRuntime.configFingerprint,
|
|
232
|
+
runningManagedAgents: runningRuntime.managedAgents,
|
|
233
|
+
action: "unknown_version",
|
|
234
|
+
},
|
|
235
|
+
});
|
|
236
|
+
return result;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
const reason = formatErrorReason(error);
|
|
241
|
+
const result = {
|
|
242
|
+
ok: true,
|
|
243
|
+
alreadyRunning: true,
|
|
244
|
+
message: `daemon already running (${deps.socketPath}; unable to verify version: ${reason})`,
|
|
245
|
+
};
|
|
246
|
+
(0, runtime_1.emitNervesEvent)({
|
|
247
|
+
level: "warn",
|
|
248
|
+
component: "daemon",
|
|
249
|
+
event: "daemon.runtime_sync_decision",
|
|
250
|
+
message: "evaluated daemon runtime sync outcome",
|
|
251
|
+
meta: {
|
|
252
|
+
socketPath: deps.socketPath,
|
|
253
|
+
localVersion: deps.localVersion,
|
|
254
|
+
localLastUpdated: localRuntime.lastUpdated,
|
|
255
|
+
localRepoRoot: localRuntime.repoRoot,
|
|
256
|
+
localConfigFingerprint: localRuntime.configFingerprint,
|
|
257
|
+
localManagedAgents: localRuntime.managedAgents,
|
|
258
|
+
action: "status_lookup_failed",
|
|
259
|
+
reason,
|
|
260
|
+
},
|
|
261
|
+
});
|
|
262
|
+
return result;
|
|
263
|
+
}
|
|
264
|
+
const result = {
|
|
265
|
+
ok: true,
|
|
266
|
+
alreadyRunning: true,
|
|
267
|
+
message: `daemon already running (${deps.socketPath})`,
|
|
268
|
+
verifyStartupStatus: true,
|
|
269
|
+
startedPid: null,
|
|
270
|
+
startupFailureReason: null,
|
|
271
|
+
};
|
|
272
|
+
(0, runtime_1.emitNervesEvent)({
|
|
273
|
+
component: "daemon",
|
|
274
|
+
event: "daemon.runtime_sync_decision",
|
|
275
|
+
message: "evaluated daemon runtime sync outcome",
|
|
276
|
+
meta: {
|
|
277
|
+
socketPath: deps.socketPath,
|
|
278
|
+
localVersion: deps.localVersion,
|
|
279
|
+
localLastUpdated: localRuntime.lastUpdated,
|
|
280
|
+
localRepoRoot: localRuntime.repoRoot,
|
|
281
|
+
localConfigFingerprint: localRuntime.configFingerprint,
|
|
282
|
+
localManagedAgents: localRuntime.managedAgents,
|
|
283
|
+
action: "already_current",
|
|
284
|
+
},
|
|
285
|
+
});
|
|
286
|
+
return result;
|
|
287
|
+
}
|