@ouro.bot/cli 0.1.0-alpha.92 → 0.1.0-alpha.920
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/LICENSE +21 -0
- package/README.md +154 -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/assets/bluebubbles-host +264 -0
- package/assets/sanctuary-host-launcher.sh +16 -0
- package/changelog.json +5819 -16
- package/deploy/unraid/Dockerfile +58 -0
- package/deploy/unraid/README.txt +2997 -0
- package/deploy/unraid/audit-container-spec.sh +4 -0
- package/deploy/unraid/container-runtime.json +1 -0
- package/deploy/unraid/docker-man-template-transaction.mjs +711 -0
- package/deploy/unraid/docker-man-template-xml.cjs +105 -0
- package/deploy/unraid/migrate-sanctuary-bundle.mjs +60 -0
- package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
- package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
- package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
- package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
- package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
- package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
- package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
- package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
- package/deploy/unraid/sanctuary-authority-installation.json +36 -0
- package/deploy/unraid/sanctuary-authority-service.sh +30 -0
- package/deploy/unraid/sanctuary-butler-upgrade.mjs +1254 -0
- package/deploy/unraid/sanctuary-deployment-target.mjs +710 -0
- package/deploy/unraid/sanctuary-replay-gate.mjs +1564 -0
- package/deploy/unraid/sanctuary-safe-rename.py +24 -0
- package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2086 -0
- package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
- package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
- package/deploy/unraid/sanctuary.ouro/agent.json +66 -0
- package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
- package/deploy/unraid/sanctuary.ouro/awaiting/house-care-sweep.md +17 -0
- package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
- package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
- package/deploy/unraid/sanctuary.ouro/mcp/media-mcp.mjs +2231 -0
- package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
- package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
- package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
- package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +33 -0
- package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +27 -0
- package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +22 -0
- package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
- package/deploy/unraid/sanctuary.ouro/tool-profiles.json +232 -0
- package/deploy/unraid/sanctuary.xml +30 -0
- package/dist/a2a/card.js +57 -0
- package/dist/a2a/client.js +250 -0
- package/dist/a2a/config.js +50 -0
- package/dist/a2a/delegated-command-grants.js +93 -0
- package/dist/a2a/delegated-command.js +197 -0
- package/dist/a2a/delegation-stores.js +56 -0
- package/dist/a2a/did-resolution.js +93 -0
- package/dist/a2a/escalation-grants.js +84 -0
- package/dist/a2a/escalation-wiring.js +60 -0
- package/dist/a2a/identity.js +258 -0
- package/dist/a2a/inbound-share.js +110 -0
- package/dist/a2a/mission-result-wire.js +196 -0
- package/dist/a2a/onboarding.js +133 -0
- package/dist/a2a/operator-trust.js +382 -0
- package/dist/a2a/outbox-client.js +57 -0
- package/dist/a2a/outbox-store.js +188 -0
- package/dist/a2a/outbox-wire.js +95 -0
- package/dist/a2a/pin-store.js +132 -0
- package/dist/a2a/replay-grant-holders.js +33 -0
- package/dist/a2a/replay-harness.js +188 -0
- package/dist/a2a/resolution-proof.js +53 -0
- package/dist/a2a/sealed-chat.js +113 -0
- package/dist/a2a/seen-ledger.js +120 -0
- package/dist/a2a/server.js +771 -0
- package/dist/a2a/task-store.js +69 -0
- package/dist/a2a/transport.js +45 -0
- package/dist/a2a/trust-commands.js +203 -0
- package/dist/a2a/trusted-files.js +185 -0
- package/dist/a2a/types.js +3 -0
- package/dist/arc/attention-types.js +8 -0
- package/dist/arc/cares.js +360 -0
- package/dist/arc/episodes.js +118 -0
- package/dist/arc/evolution.js +490 -0
- package/dist/arc/flight-recorder.js +1034 -0
- package/dist/arc/intentions.js +134 -0
- package/dist/arc/json-store.js +117 -0
- package/dist/arc/obligations.js +386 -0
- package/dist/arc/packets.js +336 -0
- package/dist/arc/presence.js +185 -0
- package/dist/arc/task-lifecycle.js +57 -0
- package/dist/commerce/store.js +755 -0
- package/dist/commerce/types.js +3 -0
- package/dist/heart/active-work.js +798 -40
- package/dist/heart/agent-entry.js +252 -3
- package/dist/heart/approval-files.js +113 -0
- package/dist/heart/approval-store.js +960 -0
- 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 +18 -0
- package/dist/heart/attachments/sources/telegram.js +71 -0
- package/dist/heart/attachments/store.js +132 -0
- package/dist/heart/attachments/types.js +93 -0
- package/dist/heart/auth/auth-flow.js +495 -0
- package/dist/heart/autonomy-budget.js +478 -0
- package/dist/heart/awaiting/a2a-await-delivery.js +109 -0
- package/dist/heart/awaiting/await-alert.js +152 -0
- package/dist/heart/awaiting/await-expiry.js +143 -0
- package/dist/heart/awaiting/await-loader.js +91 -0
- package/dist/heart/awaiting/await-parser.js +152 -0
- package/dist/heart/awaiting/await-runtime-state.js +111 -0
- package/dist/heart/awaiting/await-scheduler.js +391 -0
- package/dist/heart/background-operations.js +281 -0
- package/dist/heart/bluebubbles-host-account.js +78 -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 +44 -18
- package/dist/heart/config-registry.js +331 -0
- package/dist/heart/config.js +174 -131
- package/dist/heart/context-loss-gauntlet.js +387 -0
- package/dist/heart/context-loss-sentinel.js +1159 -0
- package/dist/heart/core.js +2364 -578
- package/dist/heart/cross-chat-delivery.js +9 -22
- package/dist/heart/daemon/agent-config-check.js +451 -0
- package/dist/heart/daemon/agent-discovery.js +283 -3
- package/dist/heart/daemon/agent-home.js +319 -0
- package/dist/heart/daemon/agent-service.js +542 -0
- package/dist/heart/daemon/agentic-repair.js +547 -0
- package/dist/heart/daemon/await-private-wake.js +59 -0
- package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
- package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
- package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
- package/dist/heart/daemon/bluebubbles-host.js +273 -0
- package/dist/heart/daemon/boot-sync-probe.js +197 -0
- package/dist/heart/daemon/cadence.js +180 -0
- package/dist/heart/daemon/cli-arg-redaction.js +26 -0
- package/dist/heart/daemon/cli-defaults.js +876 -0
- package/dist/heart/daemon/cli-desk.js +322 -0
- package/dist/heart/daemon/cli-exec.js +9199 -0
- package/dist/heart/daemon/cli-help.js +735 -0
- package/dist/heart/daemon/cli-parse.js +3211 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +819 -0
- package/dist/heart/daemon/cli-types.js +8 -0
- package/dist/heart/daemon/connect-bay.js +323 -0
- package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
- package/dist/heart/daemon/container-healthcheck.js +112 -0
- package/dist/heart/daemon/container-runtime.js +97 -0
- package/dist/heart/daemon/container-spec-auditor-main.js +171 -0
- package/dist/heart/daemon/container-spec-auditor.js +235 -0
- package/dist/heart/daemon/daemon-bootstrap-startup.js +115 -0
- package/dist/heart/daemon/daemon-cli.js +29 -2350
- package/dist/heart/daemon/daemon-entry.js +953 -11
- package/dist/heart/daemon/daemon-health.js +186 -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 +2084 -105
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +1766 -0
- package/dist/heart/daemon/freshness.js +345 -0
- package/dist/heart/daemon/habit-private-wake.js +61 -0
- package/dist/heart/daemon/health-monitor.js +154 -11
- package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
- package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
- package/dist/heart/daemon/http-health-probe.js +80 -0
- package/dist/heart/daemon/human-command-screens.js +234 -0
- package/dist/heart/daemon/human-readiness.js +114 -0
- package/dist/heart/daemon/inner-status.js +78 -0
- package/dist/heart/daemon/interactive-repair.js +394 -0
- package/dist/heart/daemon/launchd.js +37 -8
- package/dist/heart/daemon/log-tailer.js +79 -10
- package/dist/heart/daemon/logs-prune.js +132 -0
- package/dist/heart/daemon/mcp-canary.js +524 -0
- package/dist/heart/daemon/message-router.js +65 -5
- package/dist/heart/daemon/migrate-to-desk.js +848 -0
- package/dist/heart/daemon/os-cron-deps.js +135 -0
- package/dist/heart/daemon/os-cron.js +22 -14
- package/dist/heart/daemon/ouro-bot-entry.js +6 -3
- package/dist/heart/daemon/ouro-entry.js +5 -2
- package/dist/heart/daemon/plugin-cli.js +432 -0
- package/dist/heart/daemon/process-manager.js +760 -61
- package/dist/heart/daemon/provider-discovery.js +137 -0
- package/dist/heart/daemon/provider-ping-progress.js +83 -0
- package/dist/heart/daemon/prunable-bundle.js +144 -0
- package/dist/heart/daemon/pulse.js +511 -0
- package/dist/heart/daemon/readiness-repair.js +365 -0
- package/dist/heart/daemon/run-hooks.js +2 -0
- package/dist/heart/daemon/runtime-logging.js +47 -14
- package/dist/heart/daemon/runtime-metadata.js +2 -30
- package/dist/heart/daemon/runtime-mode.js +13 -2
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2654 -0
- package/dist/heart/daemon/sanctuary-acceptance-harness.js +1830 -0
- package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
- package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +955 -0
- package/dist/heart/daemon/sanctuary-authority-codec.js +86 -0
- package/dist/heart/daemon/sanctuary-authority-epoch.js +281 -0
- package/dist/heart/daemon/sanctuary-authority-installation.js +161 -0
- package/dist/heart/daemon/sanctuary-authority-ledger.js +241 -0
- package/dist/heart/daemon/sanctuary-authority-root-lifecycle.js +1267 -0
- package/dist/heart/daemon/sanctuary-authority-vault-migration.js +79 -0
- package/dist/heart/daemon/sanctuary-bundle-migration.js +730 -0
- package/dist/heart/daemon/sanctuary-host-authority.js +1008 -0
- package/dist/heart/daemon/sanctuary-host-detached-supervisor.js +493 -0
- package/dist/heart/daemon/sanctuary-host-executor.js +670 -0
- package/dist/heart/daemon/sanctuary-host-linux-kernel.js +334 -0
- package/dist/heart/daemon/sanctuary-host-supervisor-entry.js +207 -0
- package/dist/heart/daemon/sanctuary-host-supervisor.js +95 -0
- package/dist/heart/daemon/sanctuary-package-management.js +103 -0
- package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
- package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
- package/dist/heart/daemon/sanctuary-telegram-authority-entry.js +475 -0
- package/dist/heart/daemon/sanctuary-telegram-authority-gateway.js +585 -0
- package/dist/heart/daemon/sanctuary-telegram-authority-service.js +676 -0
- package/dist/heart/daemon/sense-manager.js +733 -48
- package/dist/heart/daemon/session-id-resolver.js +131 -0
- package/dist/heart/daemon/skill-management-installer.js +1 -1
- package/dist/heart/daemon/socket-client.js +180 -12
- package/dist/heart/daemon/stale-bundle-prune.js +113 -0
- package/dist/heart/daemon/startup-tui.js +339 -0
- package/dist/heart/daemon/supercronic-supervisor.js +282 -0
- package/dist/heart/daemon/task-scheduler.js +117 -39
- package/dist/heart/daemon/terminal-ui.js +503 -0
- package/dist/heart/daemon/thoughts.js +138 -54
- package/dist/heart/daemon/up-progress.js +366 -0
- package/dist/heart/daemon/vault-items.js +56 -0
- package/dist/heart/delegation.js +1 -4
- package/dist/heart/external-events/router.js +1516 -0
- package/dist/heart/failure-reports.js +336 -0
- package/dist/heart/file-lock.js +109 -0
- package/dist/heart/frontend-approval-runtime.js +506 -0
- package/dist/heart/frontend-journal.js +215 -0
- package/dist/heart/frontend-session-service.js +237 -0
- package/dist/heart/frontend-socket-client.js +164 -0
- package/dist/heart/frontend-socket.js +400 -0
- package/dist/heart/habits/habit-cancel.js +810 -0
- package/dist/heart/habits/habit-lifecycle.js +1327 -0
- package/dist/heart/habits/habit-migration.js +194 -0
- package/dist/heart/habits/habit-parser.js +278 -0
- package/dist/heart/habits/habit-runtime-state.js +93 -0
- package/dist/heart/habits/habit-scheduler.js +653 -0
- package/dist/heart/habits/habit-session-summary.js +318 -0
- package/dist/heart/habits/habit-session.js +636 -0
- package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
- package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
- package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
- package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
- package/dist/heart/identity.js +230 -59
- package/dist/heart/kept-notes.js +289 -0
- package/dist/heart/kicks.js +1 -1
- package/dist/heart/machine-identity.js +175 -0
- package/dist/heart/mail-import-discovery.js +356 -0
- package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
- package/dist/heart/mailbox/mailbox-http-response.js +7 -0
- package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
- package/dist/heart/mailbox/mailbox-http-static.js +103 -0
- package/dist/heart/mailbox/mailbox-http-transport.js +272 -0
- package/dist/heart/mailbox/mailbox-http.js +99 -0
- package/dist/heart/mailbox/mailbox-read.js +39 -0
- package/dist/heart/mailbox/mailbox-types.js +27 -0
- package/dist/heart/mailbox/mailbox-view.js +197 -0
- package/dist/heart/mailbox/readers/agent-machine.js +428 -0
- package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
- package/dist/heart/mailbox/readers/mail.js +375 -0
- package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
- package/dist/heart/mailbox/readers/sessions.js +231 -0
- package/dist/heart/mailbox/readers/shared.js +111 -0
- package/dist/heart/mcp/mcp-server.js +696 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +83 -16
- package/dist/heart/orientation-frame.js +345 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/primitives.js +1 -1
- package/dist/heart/private-runtime/decision-renderer.js +158 -0
- package/dist/heart/private-runtime/index.js +18 -0
- package/dist/heart/private-runtime/ledger.js +221 -0
- package/dist/heart/private-runtime/policy.js +260 -0
- package/dist/heart/private-runtime/types.js +2 -0
- package/dist/heart/progress-story.js +1 -1
- package/dist/heart/provider-attempt.js +137 -0
- package/dist/heart/provider-binding-resolver.js +273 -0
- package/dist/heart/provider-credentials.js +449 -0
- package/dist/heart/provider-failover.js +311 -0
- package/dist/heart/provider-models.js +96 -0
- package/dist/heart/provider-ping.js +265 -0
- package/dist/heart/provider-readiness-cache.js +119 -0
- package/dist/heart/provider-visibility.js +188 -0
- package/dist/heart/providers/anthropic-token.js +131 -0
- package/dist/heart/providers/anthropic.js +173 -60
- package/dist/heart/providers/azure.js +23 -11
- package/dist/heart/providers/error-classification.js +127 -0
- package/dist/heart/providers/github-copilot.js +38 -39
- package/dist/heart/providers/minimax-vlm.js +189 -0
- package/dist/heart/providers/minimax.js +26 -8
- package/dist/heart/providers/openai-codex-token.js +349 -0
- package/dist/heart/providers/openai-codex.js +55 -40
- package/dist/heart/providers/openai-compatible.js +177 -0
- package/dist/heart/reply-style.js +52 -0
- package/dist/heart/run-ledger.js +247 -0
- package/dist/heart/runtime-capability-check.js +170 -0
- package/dist/heart/runtime-credentials.js +607 -0
- package/dist/heart/runtime-cwd.js +87 -0
- package/dist/heart/sense-truth.js +24 -4
- package/dist/heart/session-activity.js +92 -24
- package/dist/heart/session-events.js +1504 -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-redaction-repair-cli-main.js +31 -0
- package/dist/heart/session-redaction-repair.js +552 -0
- package/dist/heart/session-stats-cli-main.js +5 -0
- package/dist/heart/session-stats.js +183 -0
- package/dist/heart/session-transcript.js +133 -0
- package/dist/heart/shelf-claims.js +78 -0
- package/dist/heart/shepherd-config.js +113 -0
- package/dist/heart/source-grounding.js +297 -0
- package/dist/heart/start-of-turn-packet.js +372 -0
- package/dist/heart/steward-policy.js +656 -0
- package/dist/heart/streaming.js +609 -207
- package/dist/heart/structured-output.js +196 -0
- package/dist/heart/sync-classification.js +176 -0
- package/dist/heart/sync-health.js +152 -0
- package/dist/heart/sync.js +726 -0
- package/dist/heart/target-resolution.js +11 -7
- package/dist/heart/tempo.js +93 -0
- package/dist/heart/temporal-view.js +41 -0
- package/dist/heart/timeouts.js +101 -0
- package/dist/heart/tool-activity-callbacks.js +59 -0
- package/dist/heart/tool-approval.js +382 -0
- package/dist/heart/tool-description.js +155 -0
- package/dist/heart/tool-friction.js +55 -0
- package/dist/heart/tool-loop.js +206 -0
- package/dist/heart/turn-context.js +496 -0
- package/dist/heart/turn-execution-lease.js +30 -0
- package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
- package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +3 -2
- package/dist/heart/versioning/ouro-path-installer.js +432 -0
- package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
- package/dist/heart/versioning/ouro-version-manager.js +432 -0
- package/dist/heart/versioning/release-sources.js +173 -0
- package/dist/heart/versioning/self-update-defaults.js +294 -0
- package/dist/heart/versioning/self-update.js +196 -0
- package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
- package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
- package/dist/heart/versioning/update-hooks.js +154 -0
- package/dist/heart/versioning/update-state.js +126 -0
- package/dist/heart/versioning/updater-launchd.js +150 -0
- package/dist/heart/versioning/version-intent.js +114 -0
- package/dist/heart/work-card.js +380 -0
- package/dist/mailbox-ui/assets/index-Cyv4mw3Y.js +1 -0
- package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
- package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
- package/dist/mailbox-ui/index.html +16 -0
- package/dist/mailroom/attention.js +167 -0
- package/dist/mailroom/autonomy.js +209 -0
- package/dist/mailroom/blob-store.js +889 -0
- package/dist/mailroom/body-cache.js +61 -0
- package/dist/mailroom/cache-sync-cli.js +58 -0
- package/dist/mailroom/core.js +803 -0
- package/dist/mailroom/entry.js +160 -0
- package/dist/mailroom/file-store.js +568 -0
- package/dist/mailroom/hosted-cache-sync.js +384 -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 +292 -0
- package/dist/mailroom/search-cache.js +513 -0
- package/dist/mailroom/search-relevance.js +319 -0
- package/dist/mailroom/smtp-ingress.js +176 -0
- package/dist/mailroom/source-state.js +176 -0
- package/dist/mailroom/thread.js +109 -0
- package/dist/mailroom/travel-extract.js +89 -0
- package/dist/mind/bundle-manifest.js +24 -2
- package/dist/mind/context.js +307 -139
- package/dist/mind/desk-section.js +362 -0
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +68 -77
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/friend-link-codes.js +209 -0
- package/dist/mind/friend-merge.js +330 -0
- package/dist/mind/{associative-recall.js → note-search.js} +47 -58
- package/dist/mind/obligation-steering.js +199 -3
- package/dist/mind/pending.js +36 -10
- package/dist/mind/prompt-budget.js +479 -0
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +1085 -198
- package/dist/mind/provenance-trust.js +26 -0
- package/dist/mind/record-paths.js +312 -0
- package/dist/mind/scrutiny.js +173 -0
- package/dist/mind/session-transaction.js +564 -0
- package/dist/nerves/cli-logging.js +7 -1
- package/dist/nerves/coverage/audit-rules.js +15 -6
- package/dist/nerves/coverage/audit.js +28 -2
- package/dist/nerves/coverage/cli.js +1 -1
- package/dist/nerves/coverage/contract.js +5 -5
- package/dist/nerves/coverage/file-completeness.js +139 -5
- package/dist/nerves/coverage/run-artifacts.js +55 -35
- package/dist/nerves/coverage/source-scanner.js +4 -4
- package/dist/nerves/event-buffer.js +111 -0
- package/dist/nerves/index.js +293 -9
- 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 +159 -0
- package/dist/nerves/runtime.js +17 -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 +1201 -0
- package/dist/repertoire/bundle-templates.js +71 -0
- package/dist/repertoire/bw-installer.js +231 -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 +174 -32
- package/dist/repertoire/coding/index.js +15 -3
- package/dist/repertoire/coding/manager.js +159 -10
- package/dist/repertoire/coding/spawner.js +40 -11
- package/dist/repertoire/coding/tools.js +182 -18
- package/dist/repertoire/coding/workbench-client.js +272 -0
- package/dist/repertoire/coding/workbench-manager.js +346 -0
- package/dist/repertoire/commerce-errors.js +109 -0
- package/dist/repertoire/commerce-self-test.js +156 -0
- package/dist/repertoire/credential-access.js +183 -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 +968 -20
- package/dist/repertoire/house-sweep.js +469 -0
- package/dist/repertoire/mcp-client.js +58 -5
- package/dist/repertoire/mcp-manager.js +427 -139
- package/dist/repertoire/mcp-tools.js +132 -0
- package/dist/repertoire/mcp-write-guard.js +46 -0
- package/dist/repertoire/plugin-mcp.js +175 -0
- package/dist/repertoire/plugins.js +253 -0
- package/dist/repertoire/relationship-authorization.js +322 -0
- package/dist/repertoire/sanctuary-container-policy.js +46 -0
- package/dist/repertoire/shell-sessions.js +134 -0
- package/dist/repertoire/skills.js +48 -4
- package/dist/repertoire/stripe-client.js +131 -0
- package/dist/repertoire/tool-arguments.js +182 -0
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-a2a.js +699 -0
- package/dist/repertoire/tools-attachments.js +322 -0
- package/dist/repertoire/tools-awaiting.js +872 -0
- package/dist/repertoire/tools-base.js +83 -1168
- package/dist/repertoire/tools-bluebubbles.js +2 -0
- package/dist/repertoire/tools-bridge.js +144 -0
- package/dist/repertoire/tools-bundle.js +995 -0
- package/dist/repertoire/tools-commerce.js +253 -0
- package/dist/repertoire/tools-config.js +186 -0
- package/dist/repertoire/tools-continuity.js +575 -0
- package/dist/repertoire/tools-credential.js +383 -0
- package/dist/repertoire/tools-escalation.js +84 -0
- package/dist/repertoire/tools-evolution.js +527 -0
- package/dist/repertoire/tools-files.js +344 -0
- package/dist/repertoire/tools-flight.js +290 -0
- package/dist/repertoire/tools-flow.js +119 -0
- package/dist/repertoire/tools-friend-link.js +57 -0
- package/dist/repertoire/tools-github.js +3 -8
- package/dist/repertoire/tools-habits.js +103 -0
- package/dist/repertoire/tools-house-care.js +174 -0
- package/dist/repertoire/tools-mail.js +1828 -0
- package/dist/repertoire/tools-notes.js +496 -0
- package/dist/repertoire/tools-obligations.js +182 -0
- package/dist/repertoire/tools-orientation.js +31 -0
- package/dist/repertoire/tools-record.js +482 -0
- package/dist/repertoire/tools-rsvp.js +139 -0
- package/dist/repertoire/tools-runtime.js +238 -0
- package/dist/repertoire/tools-sanctuary-host.js +202 -0
- package/dist/repertoire/tools-session.js +1133 -0
- package/dist/repertoire/tools-shell.js +149 -0
- package/dist/repertoire/tools-shepherd.js +262 -0
- package/dist/repertoire/tools-steward-policy.js +147 -0
- package/dist/repertoire/tools-stripe.js +224 -0
- package/dist/repertoire/tools-surface.js +369 -0
- package/dist/repertoire/tools-teams.js +12 -39
- package/dist/repertoire/tools-telegram-contacts.js +37 -0
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-trip.js +982 -0
- package/dist/repertoire/tools-unraid.js +556 -0
- package/dist/repertoire/tools-user-profile.js +146 -0
- package/dist/repertoire/tools-vault.js +40 -0
- package/dist/repertoire/tools-voice-local.js +198 -0
- package/dist/repertoire/tools-voice.js +145 -0
- package/dist/repertoire/tools.js +514 -156
- package/dist/repertoire/travel-api-client.js +360 -0
- package/dist/repertoire/unraid-client.js +155 -0
- package/dist/repertoire/unraid-restart.js +339 -0
- package/dist/repertoire/user-profile.js +131 -0
- package/dist/repertoire/vault-setup.js +246 -0
- package/dist/repertoire/vault-unlock.js +686 -0
- package/dist/rsvp/aisleplanner-client.js +354 -0
- package/dist/rsvp/cli.js +936 -0
- package/dist/rsvp/config.js +327 -0
- package/dist/rsvp/cutover.js +433 -0
- package/dist/rsvp/diagnostics.js +232 -0
- package/dist/rsvp/diff-renderer.js +176 -0
- package/dist/rsvp/habit-policy.js +110 -0
- package/dist/rsvp/habit-stage.js +123 -0
- package/dist/rsvp/incident-bundle.js +97 -0
- package/dist/rsvp/migration.js +204 -0
- package/dist/rsvp/native-habit-runner.js +630 -0
- package/dist/rsvp/outbound-state.js +628 -0
- package/dist/rsvp/query.js +118 -0
- package/dist/rsvp/replay.js +233 -0
- package/dist/rsvp/snapshot.js +232 -0
- package/dist/rsvp/spend-ledger.js +175 -0
- package/dist/scripts/claude-code-hook.js +41 -0
- package/dist/scripts/claude-code-stop-hook.js +47 -0
- package/dist/senses/a2a-entry.js +132 -0
- package/dist/senses/acp-server.js +386 -0
- package/dist/senses/attention-queue.js +186 -0
- package/dist/senses/await-turn-message.js +65 -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} +379 -41
- package/dist/senses/bluebubbles/context-packet.js +207 -0
- package/dist/senses/bluebubbles/context-smoke.js +144 -0
- package/dist/senses/bluebubbles/entry.js +90 -0
- package/dist/senses/bluebubbles/host-account-verifier.js +88 -0
- package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
- package/dist/senses/bluebubbles/index.js +3878 -0
- package/dist/senses/bluebubbles/latest-turn.js +311 -0
- package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
- package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
- package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
- package/dist/senses/bluebubbles/outbound-state.js +308 -0
- package/dist/senses/bluebubbles/processed-log.js +133 -0
- package/dist/senses/bluebubbles/reaction-policy.js +47 -0
- package/dist/senses/bluebubbles/replay.js +284 -0
- package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
- package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
- package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
- package/dist/senses/bluebubbles/webhook-registration.js +257 -0
- package/dist/senses/bluebubbles-meta-guard.js +39 -0
- package/dist/senses/cli/bracketed-paste.js +82 -0
- package/dist/senses/cli/image-paste.js +287 -0
- package/dist/senses/cli/image-ref-navigation.js +75 -0
- package/dist/senses/cli/ink-app.js +156 -0
- package/dist/senses/cli/inline-diff.js +64 -0
- package/dist/senses/cli/input-keys.js +174 -0
- package/dist/senses/cli/kill-ring.js +86 -0
- package/dist/senses/cli/message-list.js +51 -0
- package/dist/senses/cli/ouro-tui.js +607 -0
- package/dist/senses/cli/spinner-imperative.js +135 -0
- package/dist/senses/cli/spinner.js +101 -0
- package/dist/senses/cli/status-line.js +60 -0
- package/dist/senses/cli/streaming-markdown.js +526 -0
- package/dist/senses/cli/tool-display.js +85 -0
- package/dist/senses/cli/tool-render.js +85 -0
- package/dist/senses/cli/tui-store.js +241 -0
- package/dist/senses/cli/virtual-list.js +35 -0
- package/dist/senses/cli-entry.js +60 -8
- package/dist/senses/cli.js +601 -304
- package/dist/senses/commands.js +66 -3
- package/dist/senses/context-packet-ledger.js +371 -0
- package/dist/senses/context-packets.js +154 -0
- package/dist/senses/habit-lifecycle-guard.js +24 -0
- package/dist/senses/habit-turn-message.js +160 -0
- package/dist/senses/ingress-evidence.js +2 -0
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +524 -0
- package/dist/senses/pipeline.js +1158 -204
- package/dist/senses/private-runtime-worker.js +859 -0
- package/dist/senses/private-runtime.js +1627 -0
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/root-host-approval-port.js +345 -0
- package/dist/senses/root-host-approval-runtime.js +393 -0
- package/dist/senses/sanctuary-authority-resident.js +102 -0
- package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
- package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
- package/dist/senses/sanctuary-grounding.js +118 -0
- package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
- package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
- package/dist/senses/sanctuary-health-runner.js +104 -0
- package/dist/senses/sanctuary-health.js +422 -0
- package/dist/senses/sanctuary-install-state-contract.js +169 -0
- package/dist/senses/sanctuary-interactive-control.js +410 -0
- package/dist/senses/sanctuary-media-catalog-contract.js +259 -0
- package/dist/senses/sanctuary-media-optimization.js +514 -0
- package/dist/senses/sanctuary-runtime.js +369 -0
- package/dist/senses/sanctuary-sab.js +85 -0
- package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
- package/dist/senses/shared-turn.js +793 -0
- package/dist/senses/shepherd/client.js +196 -0
- package/dist/senses/shepherd/cmux.js +344 -0
- package/dist/senses/shepherd/herdr.js +315 -0
- package/dist/senses/shepherd/host.js +14 -0
- package/dist/senses/shepherd/judge.js +137 -0
- package/dist/senses/shepherd/owner-notice.js +245 -0
- package/dist/senses/shepherd/redact.js +66 -0
- package/dist/senses/shepherd/returns.js +79 -0
- package/dist/senses/shepherd/sense.js +309 -0
- package/dist/senses/shepherd-entry.js +78 -0
- package/dist/senses/surface-tool.js +109 -0
- package/dist/senses/teams-entry.js +68 -8
- package/dist/senses/teams.js +598 -233
- package/dist/senses/telegram-admission.js +718 -0
- package/dist/senses/telegram-approval-runtime.js +793 -0
- package/dist/senses/telegram-attachments.js +186 -0
- package/dist/senses/telegram-audit-ledger.js +220 -0
- package/dist/senses/telegram-authority-transport.js +231 -0
- package/dist/senses/telegram-client.js +1749 -0
- package/dist/senses/telegram-effect-adapter.js +900 -0
- package/dist/senses/telegram-entry.js +83 -0
- package/dist/senses/telegram-handoff.js +80 -0
- package/dist/senses/telegram.js +2405 -0
- package/dist/senses/trust-gate.js +104 -9
- package/dist/senses/voice/audio-playback.js +237 -0
- package/dist/senses/voice/audio-routing.js +119 -0
- package/dist/senses/voice/call-auth.js +250 -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/local-audio-control.js +344 -0
- package/dist/senses/voice/local-audio-devices.js +516 -0
- package/dist/senses/voice/local-audio-disclosure.js +174 -0
- package/dist/senses/voice/local-audio-identity.js +103 -0
- package/dist/senses/voice/local-audio-join.js +325 -0
- package/dist/senses/voice/local-audio-mute.js +199 -0
- package/dist/senses/voice/local-audio-notify.js +121 -0
- package/dist/senses/voice/local-audio-prompts.js +116 -0
- package/dist/senses/voice/local-audio-transport.js +427 -0
- package/dist/senses/voice/local-audio.js +281 -0
- package/dist/senses/voice/local-media-stream.js +145 -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/process-guards.js +51 -0
- package/dist/senses/voice/realtime-eval.js +496 -0
- package/dist/senses/voice/realtime-tool-schema.js +195 -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 +836 -0
- package/dist/senses/voice/twilio-phone.js +5454 -0
- package/dist/senses/voice/types.js +2 -0
- package/dist/senses/voice/whisper.js +161 -0
- package/dist/senses/voice-entry.js +83 -0
- package/dist/senses/voice-realtime-eval-command.js +99 -0
- package/dist/senses/voice-realtime-eval-entry.js +21 -0
- package/dist/senses/voice-twilio-entry.js +87 -0
- package/dist/trips/core.js +138 -0
- package/dist/trips/store.js +265 -0
- package/dist/util/frontmatter.js +69 -0
- package/npm-shrinkwrap.json +8100 -0
- package/package.json +74 -13
- package/skills/agent-commerce.md +113 -0
- package/skills/browser-navigation.md +117 -0
- package/skills/commerce-setup-guide.md +116 -0
- package/skills/commerce-setup.md +84 -0
- package/skills/configure-dev-tools.md +99 -0
- package/skills/travel-planning.md +138 -0
- package/dist/heart/daemon/auth-flow.js +0 -430
- package/dist/heart/daemon/ouro-path-installer.js +0 -260
- package/dist/heart/daemon/ouro-version-manager.js +0 -171
- package/dist/heart/daemon/update-hooks.js +0 -138
- package/dist/heart/obligations.js +0 -191
- package/dist/heart/safe-workspace.js +0 -362
- package/dist/heart/session-recall.js +0 -116
- package/dist/mind/friends/channel.js +0 -84
- package/dist/mind/friends/group-context.js +0 -144
- package/dist/mind/friends/resolver.js +0 -84
- package/dist/mind/friends/store-file.js +0 -190
- package/dist/mind/friends/store.js +0 -4
- package/dist/mind/friends/tokens.js +0 -26
- package/dist/mind/friends/trust-explanation.js +0 -74
- package/dist/mind/friends/types.js +0 -29
- package/dist/repertoire/tasks/board.js +0 -134
- package/dist/repertoire/tasks/index.js +0 -224
- package/dist/repertoire/tasks/lifecycle.js +0 -80
- package/dist/repertoire/tasks/middleware.js +0 -65
- package/dist/repertoire/tasks/parser.js +0 -173
- package/dist/repertoire/tasks/scanner.js +0 -132
- package/dist/repertoire/tasks/transitions.js +0 -144
- package/dist/senses/bluebubbles-entry.js +0 -13
- package/dist/senses/bluebubbles.js +0 -1181
- package/dist/senses/debug-activity.js +0 -154
- package/dist/senses/inner-dialog-worker.js +0 -90
- package/dist/senses/inner-dialog.js +0 -525
- 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
|
@@ -0,0 +1,294 @@
|
|
|
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.releaseSourceDeps = void 0;
|
|
37
|
+
exports.isSelfUpdateLockHeld = isSelfUpdateLockHeld;
|
|
38
|
+
exports.createDefaultSelfUpdateDeps = createDefaultSelfUpdateDeps;
|
|
39
|
+
exports.ensureDefaultUpdaterAgent = ensureDefaultUpdaterAgent;
|
|
40
|
+
exports.isDefaultUpdaterAgentInstalled = isDefaultUpdaterAgentInstalled;
|
|
41
|
+
/* v8 ignore start -- production wiring for self-update: real network, npm, launchd and daemon socket; the logic it feeds is unit-tested through injected deps @preserve */
|
|
42
|
+
const child_process_1 = require("child_process");
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const os = __importStar(require("os"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
47
|
+
const cli_render_1 = require("../daemon/cli-render");
|
|
48
|
+
const socket_client_1 = require("../daemon/socket-client");
|
|
49
|
+
const ouro_version_manager_1 = require("./ouro-version-manager");
|
|
50
|
+
const release_sources_1 = require("./release-sources");
|
|
51
|
+
const update_state_1 = require("./update-state");
|
|
52
|
+
const updater_launchd_1 = require("./updater-launchd");
|
|
53
|
+
const version_intent_1 = require("./version-intent");
|
|
54
|
+
const DAEMON_UP_TIMEOUT_MS = 10 * 60_000;
|
|
55
|
+
const DAEMON_HEALTH_WAIT_MS = 90_000;
|
|
56
|
+
function execFileText(command, args, options) {
|
|
57
|
+
return new Promise((resolve, reject) => {
|
|
58
|
+
(0, child_process_1.execFile)(command, args, { timeout: options.timeoutMs, maxBuffer: 16 * 1024 * 1024, env: process.env }, (error, stdout, stderr) => {
|
|
59
|
+
if (error) {
|
|
60
|
+
const detail = String(stderr || "").trim().split("\n").slice(-3).join(" ");
|
|
61
|
+
reject(new Error(`${command} ${args[0] ?? ""} failed: ${detail || error.message}`));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
resolve(String(stdout));
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
async function fetchJson(url, timeoutMs) {
|
|
69
|
+
const controller = new AbortController();
|
|
70
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
71
|
+
try {
|
|
72
|
+
const response = await fetch(url, {
|
|
73
|
+
signal: controller.signal,
|
|
74
|
+
headers: { accept: "application/json", "user-agent": "ouro-self-update" },
|
|
75
|
+
});
|
|
76
|
+
if (!response.ok)
|
|
77
|
+
throw new Error(`HTTP ${response.status} from ${new URL(url).host}`);
|
|
78
|
+
return await response.json();
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
82
|
+
throw new Error(`timed out after ${Math.round(timeoutMs / 1000)}s reaching ${new URL(url).host}`);
|
|
83
|
+
}
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
clearTimeout(timer);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Run a command with stdin closed and OURO_UNATTENDED=1. `ouro up` can prompt
|
|
92
|
+
* (for example about manually cloned bundles); unattended, every prompt takes
|
|
93
|
+
* its default answer at once instead of waiting out the restart timeout.
|
|
94
|
+
*/
|
|
95
|
+
function runDetachedFromStdin(command, args, timeoutMs) {
|
|
96
|
+
return new Promise((resolve, reject) => {
|
|
97
|
+
const child = (0, child_process_1.spawn)(command, args, { stdio: ["ignore", "ignore", "pipe"], env: { ...process.env, OURO_UNATTENDED: "1" } });
|
|
98
|
+
let stderr = "";
|
|
99
|
+
child.stderr?.on("data", (chunk) => { stderr = (stderr + String(chunk)).slice(-4000); });
|
|
100
|
+
const timer = setTimeout(() => {
|
|
101
|
+
child.kill("SIGTERM");
|
|
102
|
+
reject(new Error(`${command} ${args.join(" ")} timed out after ${Math.round(timeoutMs / 1000)}s`));
|
|
103
|
+
}, timeoutMs);
|
|
104
|
+
child.on("error", (error) => {
|
|
105
|
+
clearTimeout(timer);
|
|
106
|
+
reject(error);
|
|
107
|
+
});
|
|
108
|
+
child.on("close", (code) => {
|
|
109
|
+
clearTimeout(timer);
|
|
110
|
+
if (code === 0)
|
|
111
|
+
resolve();
|
|
112
|
+
else
|
|
113
|
+
reject(new Error(`${args.join(" ")} exited ${code}: ${stderr.trim().split("\n").slice(-3).join(" ")}`));
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
exports.releaseSourceDeps = { fetchJson, execFile: execFileText, ...(0, release_sources_1.selfUpdateE2eOverrides)(process.env) };
|
|
118
|
+
function isPidAlive(pid) {
|
|
119
|
+
try {
|
|
120
|
+
process.kill(pid, 0);
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
function lockPath(cliHome) {
|
|
128
|
+
return path.join(cliHome, "self-update.lock");
|
|
129
|
+
}
|
|
130
|
+
/** The pid holding the update lock when that process is still alive. */
|
|
131
|
+
function liveLockOwner(cliHome) {
|
|
132
|
+
try {
|
|
133
|
+
const pid = Number.parseInt(fs.readFileSync(lockPath(cliHome), "utf8"), 10);
|
|
134
|
+
return Number.isFinite(pid) && pid > 0 && isPidAlive(pid) ? pid : null;
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/** True when another live process is in the middle of an update pass. */
|
|
141
|
+
function isSelfUpdateLockHeld(cliHome) {
|
|
142
|
+
const owner = liveLockOwner(cliHome);
|
|
143
|
+
return owner !== null && owner !== process.pid;
|
|
144
|
+
}
|
|
145
|
+
function acquireLock(cliHome) {
|
|
146
|
+
const file = lockPath(cliHome);
|
|
147
|
+
fs.mkdirSync(cliHome, { recursive: true });
|
|
148
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
149
|
+
try {
|
|
150
|
+
const fd = fs.openSync(file, "wx", 0o600);
|
|
151
|
+
fs.writeSync(fd, `${process.pid}\n`);
|
|
152
|
+
fs.closeSync(fd);
|
|
153
|
+
return () => {
|
|
154
|
+
try {
|
|
155
|
+
fs.unlinkSync(file);
|
|
156
|
+
}
|
|
157
|
+
catch { /* already released */ }
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
if (error.code !== "EEXIST")
|
|
162
|
+
throw error;
|
|
163
|
+
// A lock is stale only when its owner is gone; a long install by a live
|
|
164
|
+
// owner keeps it, however long it takes.
|
|
165
|
+
if (liveLockOwner(cliHome) !== null)
|
|
166
|
+
return null;
|
|
167
|
+
try {
|
|
168
|
+
fs.unlinkSync(file);
|
|
169
|
+
}
|
|
170
|
+
catch { /* raced with the owner releasing it */ }
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
function versionEntry(cliHome, version) {
|
|
176
|
+
return path.join(cliHome, "versions", version, "node_modules", "@ouro.bot", "cli", "dist", "heart", "daemon", "ouro-entry.js");
|
|
177
|
+
}
|
|
178
|
+
async function runningDaemonVersion(socketPath) {
|
|
179
|
+
try {
|
|
180
|
+
const response = await (0, socket_client_1.sendDaemonCommand)(socketPath, { kind: "daemon.status" });
|
|
181
|
+
return (0, cli_render_1.parseStatusPayload)(response.data)?.overview.version ?? null;
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
function createDefaultSelfUpdateDeps(options = {}) {
|
|
188
|
+
const homeDir = options.homeDir ?? os.homedir();
|
|
189
|
+
const cliHome = (0, ouro_version_manager_1.getOuroCliHome)(homeDir);
|
|
190
|
+
// The package end-to-end test must never see a daemon on the host machine.
|
|
191
|
+
const socketPath = process.env.OURO_SELF_UPDATE_E2E === "1"
|
|
192
|
+
? path.join(cliHome, "e2e-no-daemon.sock")
|
|
193
|
+
: options.socketPath ?? socket_client_1.DEFAULT_DAEMON_SOCKET_PATH;
|
|
194
|
+
const launcher = path.join(cliHome, "bin", "ouro-launcher.js");
|
|
195
|
+
return {
|
|
196
|
+
now: () => Date.now(),
|
|
197
|
+
getCurrentVersion: () => (0, ouro_version_manager_1.getCurrentVersion)({ homeDir }),
|
|
198
|
+
readIntent: () => (0, version_intent_1.readVersionIntent)({ homeDir }),
|
|
199
|
+
writeIntent: (intent) => (0, version_intent_1.writeVersionIntent)(intent, { homeDir }),
|
|
200
|
+
readState: () => (0, update_state_1.readUpdateState)({ homeDir }),
|
|
201
|
+
writeState: (state) => (0, update_state_1.writeUpdateState)(state, { homeDir }),
|
|
202
|
+
lookupLatest: () => (0, release_sources_1.lookupLatestRelease)(exports.releaseSourceDeps),
|
|
203
|
+
install: (version, lookup) => (0, release_sources_1.installRelease)(version, lookup, cliHome, exports.releaseSourceDeps),
|
|
204
|
+
validate: (version) => (0, ouro_version_manager_1.validateInstalledVersionForActivation)(version, { homeDir }),
|
|
205
|
+
smokeTest: async (version) => {
|
|
206
|
+
try {
|
|
207
|
+
const output = (await execFileText(process.execPath, [versionEntry(cliHome, version), "--version"], { timeoutMs: 60_000 })).trim();
|
|
208
|
+
return output.includes(version) ? { ok: true } : { ok: false, detail: `--version printed "${output.slice(0, 120)}"` };
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
return { ok: false, detail: error instanceof Error ? error.message : String(error) };
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
activate: (version) => {
|
|
215
|
+
(0, ouro_version_manager_1.activateVersion)(version, { homeDir });
|
|
216
|
+
(0, ouro_version_manager_1.pruneOldVersions)(undefined, { homeDir });
|
|
217
|
+
},
|
|
218
|
+
isDaemonRunning: () => (0, socket_client_1.checkDaemonSocketAlive)(socketPath),
|
|
219
|
+
runningDaemonVersion: async () => (await (0, socket_client_1.checkDaemonSocketAlive)(socketPath)) ? runningDaemonVersion(socketPath) : null,
|
|
220
|
+
restartDaemon: async (expectedVersion) => {
|
|
221
|
+
try {
|
|
222
|
+
await runDetachedFromStdin(process.execPath, [launcher, "up"], DAEMON_UP_TIMEOUT_MS);
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
return { ok: false, detail: error instanceof Error ? error.message : String(error) };
|
|
226
|
+
}
|
|
227
|
+
const deadline = Date.now() + DAEMON_HEALTH_WAIT_MS;
|
|
228
|
+
let seen = null;
|
|
229
|
+
while (Date.now() < deadline) {
|
|
230
|
+
seen = await runningDaemonVersion(socketPath);
|
|
231
|
+
if (seen === expectedVersion)
|
|
232
|
+
return { ok: true };
|
|
233
|
+
await new Promise((resolve) => setTimeout(resolve, 2_000));
|
|
234
|
+
}
|
|
235
|
+
return { ok: false, detail: seen ? `daemon answered with ${seen}, expected ${expectedVersion}` : "daemon did not answer after ouro up" };
|
|
236
|
+
},
|
|
237
|
+
isDevMode: () => fs.existsSync(path.join(cliHome, "dev-config.json")),
|
|
238
|
+
acquireLock: () => acquireLock(cliHome),
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
function nodeMajorOf(nodePath) {
|
|
242
|
+
try {
|
|
243
|
+
fs.accessSync(nodePath, fs.constants.X_OK);
|
|
244
|
+
const version = (0, child_process_1.execFileSync)(nodePath, ["--version"], { encoding: "utf8", timeout: 10_000, stdio: ["ignore", "pipe", "ignore"] }).trim();
|
|
245
|
+
const major = Number.parseInt(version.replace(/^v/, ""), 10);
|
|
246
|
+
return Number.isFinite(major) ? major : null;
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
function ensureDefaultUpdaterAgent(options = {}) {
|
|
253
|
+
// The package end-to-end test runs in a throwaway HOME; it must never load
|
|
254
|
+
// a real launch agent on the host.
|
|
255
|
+
if (process.platform !== "darwin" || process.env.OURO_SELF_UPDATE_E2E === "1")
|
|
256
|
+
return null;
|
|
257
|
+
const homeDir = options.homeDir ?? os.homedir();
|
|
258
|
+
const result = (0, updater_launchd_1.ensureUpdaterAgent)({
|
|
259
|
+
homeDir,
|
|
260
|
+
userUid: os.userInfo().uid,
|
|
261
|
+
nodePath: (0, updater_launchd_1.chooseUpdaterNodePath)({
|
|
262
|
+
execPath: process.execPath,
|
|
263
|
+
runningMajor: Number.parseInt(process.versions.node, 10),
|
|
264
|
+
majorOf: nodeMajorOf,
|
|
265
|
+
}),
|
|
266
|
+
readFile: (filePath) => {
|
|
267
|
+
try {
|
|
268
|
+
return fs.readFileSync(filePath, "utf8");
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
return null;
|
|
272
|
+
}
|
|
273
|
+
},
|
|
274
|
+
writeFile: (filePath, content) => fs.writeFileSync(filePath, content, "utf8"),
|
|
275
|
+
mkdirp: (dir) => fs.mkdirSync(dir, { recursive: true }),
|
|
276
|
+
exec: (command) => { require("child_process").execSync(command, { stdio: "ignore" }); },
|
|
277
|
+
runningUnderUpdaterAgent: process.env.XPC_SERVICE_NAME === updater_launchd_1.UPDATER_PLIST_LABEL,
|
|
278
|
+
updateInProgress: isSelfUpdateLockHeld((0, ouro_version_manager_1.getOuroCliHome)(homeDir)),
|
|
279
|
+
});
|
|
280
|
+
(0, runtime_1.emitNervesEvent)({
|
|
281
|
+
component: "daemon",
|
|
282
|
+
event: "daemon.self_update_agent_checked",
|
|
283
|
+
message: "checked the unattended updater launch agent",
|
|
284
|
+
meta: { result },
|
|
285
|
+
});
|
|
286
|
+
return result;
|
|
287
|
+
}
|
|
288
|
+
function isDefaultUpdaterAgentInstalled(options = {}) {
|
|
289
|
+
if (process.platform !== "darwin")
|
|
290
|
+
return null;
|
|
291
|
+
const homeDir = options.homeDir ?? os.homedir();
|
|
292
|
+
return fs.existsSync(path.join(homeDir, "Library", "LaunchAgents", `${updater_launchd_1.UPDATER_PLIST_LABEL}.plist`));
|
|
293
|
+
}
|
|
294
|
+
/* v8 ignore stop */
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PIN_MAX_AGE_MS = void 0;
|
|
4
|
+
exports.runSelfUpdate = runSelfUpdate;
|
|
5
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
6
|
+
const ouro_version_manager_1 = require("./ouro-version-manager");
|
|
7
|
+
/**
|
|
8
|
+
* One unattended update pass. It never starts a stopped daemon, never leaves
|
|
9
|
+
* the machine on a version that failed its checks, and always records what
|
|
10
|
+
* happened in update-state.json so `ouro status` can report it.
|
|
11
|
+
*
|
|
12
|
+
* Steps:
|
|
13
|
+
* 1. Honor a human pin (`ouro rollback`) for PIN_MAX_AGE_MS, then expire it
|
|
14
|
+
* by rewriting the intent to "latest". A pin without a timestamp gets
|
|
15
|
+
* one the first time a pass sees it.
|
|
16
|
+
* 2. Ask every release source for the newest version. When nothing is newer
|
|
17
|
+
* but a running daemon still reports an older version (a pass was killed
|
|
18
|
+
* between activation and restart), restart it on CurrentVersion.
|
|
19
|
+
* 3. Install it, validate the payload and run its `--version` smoke test.
|
|
20
|
+
* 4. Activate it. If the daemon was running, restart it on the new version
|
|
21
|
+
* and check that it answers; otherwise leave the daemon stopped.
|
|
22
|
+
* 5. On a failed check, reactivate the previous version, pin it with reason
|
|
23
|
+
* "auto-rollback", restart the daemon on it, and never retry the failed
|
|
24
|
+
* version.
|
|
25
|
+
*/
|
|
26
|
+
exports.PIN_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;
|
|
27
|
+
function errorText(error) {
|
|
28
|
+
return error instanceof Error ? error.message : String(error);
|
|
29
|
+
}
|
|
30
|
+
const FAILURE_OUTCOMES = ["unreachable", "install-failed", "rejected", "rolled-back"];
|
|
31
|
+
async function runSelfUpdate(deps) {
|
|
32
|
+
const release = deps.acquireLock();
|
|
33
|
+
if (!release) {
|
|
34
|
+
return { outcome: "busy", summary: "another ouro self-update is already running" };
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
return await runLocked(deps);
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
release();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async function runLocked(deps) {
|
|
44
|
+
const now = deps.now();
|
|
45
|
+
const previous = deps.readState();
|
|
46
|
+
const failedVersions = [...(previous?.failedVersions ?? [])];
|
|
47
|
+
const currentVersion = deps.getCurrentVersion();
|
|
48
|
+
const finish = (outcome, fields) => {
|
|
49
|
+
const { summary, ...rest } = fields;
|
|
50
|
+
const state = {
|
|
51
|
+
schemaVersion: 1,
|
|
52
|
+
lastRunAt: new Date(now).toISOString(),
|
|
53
|
+
outcome,
|
|
54
|
+
currentVersion: deps.getCurrentVersion(),
|
|
55
|
+
failedVersions,
|
|
56
|
+
consecutiveFailures: FAILURE_OUTCOMES.includes(outcome) ? (previous?.consecutiveFailures ?? 0) + 1 : 0,
|
|
57
|
+
...rest,
|
|
58
|
+
detail: rest.detail ?? summary,
|
|
59
|
+
};
|
|
60
|
+
deps.writeState(state);
|
|
61
|
+
(0, runtime_1.emitNervesEvent)({
|
|
62
|
+
level: FAILURE_OUTCOMES.includes(outcome) ? "warn" : "info",
|
|
63
|
+
component: "daemon",
|
|
64
|
+
event: "daemon.self_update_result",
|
|
65
|
+
message: summary,
|
|
66
|
+
meta: { outcome, currentVersion: state.currentVersion, latestVersion: state.latestVersion ?? null },
|
|
67
|
+
});
|
|
68
|
+
return { outcome, summary, state };
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Restart the daemon on `target`. On a failed health check, never retry
|
|
72
|
+
* `target`, pin and reactivate `fallback`, and restart on it. Returns the
|
|
73
|
+
* rolled-back result, or null when `target` came up healthy.
|
|
74
|
+
*/
|
|
75
|
+
const restartOrRollBack = async (target, fallback, source) => {
|
|
76
|
+
const health = await deps.restartDaemon(target);
|
|
77
|
+
if (health.ok)
|
|
78
|
+
return null;
|
|
79
|
+
failedVersions.push(target);
|
|
80
|
+
if (!fallback) {
|
|
81
|
+
return finish("rolled-back", {
|
|
82
|
+
summary: `${target} did not come up healthy (${health.detail ?? "no detail"}) and there is no previous version to return to`,
|
|
83
|
+
latestVersion: target,
|
|
84
|
+
source,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
deps.writeIntent({
|
|
88
|
+
schemaVersion: 1,
|
|
89
|
+
mode: "pinned",
|
|
90
|
+
targetVersion: fallback,
|
|
91
|
+
pinnedAt: new Date(now).toISOString(),
|
|
92
|
+
reason: "auto-rollback",
|
|
93
|
+
});
|
|
94
|
+
deps.activate(fallback);
|
|
95
|
+
const restored = await deps.restartDaemon(fallback);
|
|
96
|
+
return finish("rolled-back", {
|
|
97
|
+
summary: `${target} did not come up healthy (${health.detail ?? "no detail"}); rolled back to ${fallback}${restored.ok ? "" : ` but the daemon did not answer on it either (${restored.detail ?? "no detail"})`}`,
|
|
98
|
+
latestVersion: target,
|
|
99
|
+
source,
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
// 1. Pins.
|
|
103
|
+
const intent = deps.readIntent();
|
|
104
|
+
if (intent?.mode === "pinned" && intent.reason !== "auto-rollback") {
|
|
105
|
+
let pinnedAt = intent.pinnedAt;
|
|
106
|
+
if (!pinnedAt || Number.isNaN(Date.parse(pinnedAt))) {
|
|
107
|
+
// A pin written before pins carried a timestamp: start its clock now and
|
|
108
|
+
// record it in the intent itself, so the pin cannot outlive its expiry.
|
|
109
|
+
pinnedAt = new Date(now).toISOString();
|
|
110
|
+
deps.writeIntent({ ...intent, pinnedAt });
|
|
111
|
+
}
|
|
112
|
+
const expiresAtMs = Date.parse(pinnedAt) + exports.PIN_MAX_AGE_MS;
|
|
113
|
+
if (now < expiresAtMs) {
|
|
114
|
+
const until = new Date(expiresAtMs).toISOString();
|
|
115
|
+
return finish("pinned", {
|
|
116
|
+
summary: `pinned to ${intent.targetVersion} by ouro rollback; unattended updates resume after ${until} (run \`ouro up --latest\` to resume now)`,
|
|
117
|
+
detail: `pin honored until ${until}`,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
(0, runtime_1.emitNervesEvent)({
|
|
121
|
+
level: "warn",
|
|
122
|
+
component: "daemon",
|
|
123
|
+
event: "daemon.self_update_pin_expired",
|
|
124
|
+
message: "a rollback pin older than the maximum age no longer blocks updates",
|
|
125
|
+
meta: { targetVersion: intent.targetVersion, pinnedAt },
|
|
126
|
+
});
|
|
127
|
+
deps.writeIntent({ schemaVersion: 1, mode: "latest", targetVersion: intent.targetVersion });
|
|
128
|
+
}
|
|
129
|
+
// 2. Lookup.
|
|
130
|
+
const lookup = await deps.lookupLatest();
|
|
131
|
+
const sourceSummary = lookup.answers.map((answer) => `${answer.source}: ${answer.version ?? answer.error}`).join("; ");
|
|
132
|
+
const latest = lookup.latestVersion;
|
|
133
|
+
if (!latest) {
|
|
134
|
+
return finish("unreachable", { summary: `no release source answered (${sourceSummary})` });
|
|
135
|
+
}
|
|
136
|
+
const lookupSource = lookup.answers.find((answer) => answer.version === latest)?.source;
|
|
137
|
+
if (currentVersion && (0, ouro_version_manager_1.compareCliVersions)(latest, currentVersion) <= 0) {
|
|
138
|
+
// A pass killed between activation and restart leaves the old daemon
|
|
139
|
+
// running; finish the job instead of reporting "current" forever.
|
|
140
|
+
const daemonVersion = deps.isDevMode() ? null : await deps.runningDaemonVersion();
|
|
141
|
+
if (daemonVersion && daemonVersion !== currentVersion) {
|
|
142
|
+
const restart = await restartOrRollBack(currentVersion, daemonVersion);
|
|
143
|
+
if (restart)
|
|
144
|
+
return restart;
|
|
145
|
+
return finish("updated", {
|
|
146
|
+
summary: `daemon was still running ${daemonVersion}; restarted it on ${currentVersion} and it is healthy`,
|
|
147
|
+
latestVersion: latest,
|
|
148
|
+
source: lookupSource,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
const failedSources = lookup.answers.filter((answer) => !answer.version).map((answer) => `${answer.source}: ${answer.error}`);
|
|
152
|
+
return finish("current", {
|
|
153
|
+
summary: `current at ${currentVersion}${failedSources.length ? ` (unreachable: ${failedSources.join("; ")})` : ""}`,
|
|
154
|
+
latestVersion: latest,
|
|
155
|
+
source: lookupSource,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
if (failedVersions.includes(latest)) {
|
|
159
|
+
return finish("rejected", {
|
|
160
|
+
summary: `latest ${latest} failed its checks on this machine earlier; staying on ${currentVersion} until a newer release ships`,
|
|
161
|
+
latestVersion: latest,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
// 3. Install, validate, smoke test.
|
|
165
|
+
let installSource;
|
|
166
|
+
try {
|
|
167
|
+
installSource = await deps.install(latest, lookup);
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
return finish("install-failed", { summary: errorText(error), latestVersion: latest });
|
|
171
|
+
}
|
|
172
|
+
const validation = deps.validate(latest);
|
|
173
|
+
const smoke = validation.ok ? await deps.smokeTest(latest) : { ok: false, detail: validation.message };
|
|
174
|
+
if (!smoke.ok) {
|
|
175
|
+
failedVersions.push(latest);
|
|
176
|
+
return finish("rejected", {
|
|
177
|
+
summary: `${latest} failed its pre-activation check: ${smoke.detail ?? "no detail"}; staying on ${currentVersion}`,
|
|
178
|
+
latestVersion: latest,
|
|
179
|
+
source: installSource,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
// 4. Activate, then restart a running daemon on the new version.
|
|
183
|
+
const daemonWasRunning = !deps.isDevMode() && await deps.isDaemonRunning();
|
|
184
|
+
deps.writeIntent({ schemaVersion: 1, mode: "latest", targetVersion: latest });
|
|
185
|
+
deps.activate(latest);
|
|
186
|
+
if (daemonWasRunning) {
|
|
187
|
+
const restart = await restartOrRollBack(latest, currentVersion, installSource);
|
|
188
|
+
if (restart)
|
|
189
|
+
return restart;
|
|
190
|
+
}
|
|
191
|
+
return finish("updated", {
|
|
192
|
+
summary: `updated ${currentVersion ?? "unknown"} -> ${latest} via ${installSource}${daemonWasRunning ? "; daemon restarted and healthy" : "; daemon was not running and was left stopped"}`,
|
|
193
|
+
latestVersion: latest,
|
|
194
|
+
source: installSource,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
@@ -45,14 +45,22 @@ async function performStagedRestart(version, deps) {
|
|
|
45
45
|
});
|
|
46
46
|
// Step 1: Install new version
|
|
47
47
|
try {
|
|
48
|
-
deps.
|
|
48
|
+
if (deps.installNewVersion) {
|
|
49
|
+
deps.installNewVersion(version);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// Backward-compat fallback for callers that haven't migrated to the
|
|
53
|
+
// version-managed installer. Tests use this path with a mocked
|
|
54
|
+
// execSync; production callers inject installNewVersion.
|
|
55
|
+
deps.execSync(`npm install -g @ouro.bot/cli@${version}`);
|
|
56
|
+
}
|
|
49
57
|
}
|
|
50
58
|
catch (err) {
|
|
51
59
|
const errorMessage = err instanceof Error ? err.message : /* v8 ignore next -- defensive: non-Error catch branch @preserve */ String(err);
|
|
52
60
|
(0, runtime_1.emitNervesEvent)({
|
|
53
61
|
component: "daemon",
|
|
54
62
|
event: "daemon.staged_restart_install_failed",
|
|
55
|
-
message: "
|
|
63
|
+
message: "install failed",
|
|
56
64
|
meta: { version, error: errorMessage },
|
|
57
65
|
});
|
|
58
66
|
return { ok: false, error: errorMessage };
|
|
@@ -90,25 +98,49 @@ async function performStagedRestart(version, deps) {
|
|
|
90
98
|
});
|
|
91
99
|
return { ok: false, error: `hook runner exited with code ${spawnResult.status}` };
|
|
92
100
|
}
|
|
93
|
-
// Step 4: Graceful shutdown
|
|
101
|
+
// Step 4: Graceful shutdown then self-spawn new daemon
|
|
102
|
+
// We can't rely on launchd KeepAlive — the plist may not be loaded.
|
|
103
|
+
// Instead: shut down (releases socket), spawn new daemon from updated code.
|
|
94
104
|
(0, runtime_1.emitNervesEvent)({
|
|
95
105
|
component: "daemon",
|
|
96
106
|
event: "daemon.staged_restart_hooks_passed",
|
|
97
|
-
message: "hooks passed, shutting down
|
|
107
|
+
message: "hooks passed, shutting down and spawning new daemon",
|
|
98
108
|
meta: { version },
|
|
99
109
|
});
|
|
110
|
+
let shutdownError;
|
|
100
111
|
try {
|
|
101
112
|
await deps.gracefulShutdown();
|
|
102
113
|
}
|
|
103
114
|
catch (err) {
|
|
104
|
-
|
|
115
|
+
shutdownError = err instanceof Error ? err.message : /* v8 ignore next -- defensive: non-Error catch branch @preserve */ String(err);
|
|
105
116
|
(0, runtime_1.emitNervesEvent)({
|
|
106
117
|
component: "daemon",
|
|
107
118
|
event: "daemon.staged_restart_shutdown_error",
|
|
108
|
-
message: "graceful shutdown encountered error",
|
|
119
|
+
message: "graceful shutdown encountered error (continuing with spawn)",
|
|
109
120
|
meta: { version, error: shutdownError },
|
|
110
121
|
});
|
|
111
|
-
return { ok: true, shutdownError };
|
|
112
122
|
}
|
|
113
|
-
|
|
123
|
+
// Spawn new daemon from updated code path
|
|
124
|
+
const newEntry = path.join(newCodePath, "dist", "heart", "daemon", "daemon-entry.js");
|
|
125
|
+
const socketArg = deps.socketPath ?? "/tmp/ouroboros-daemon.sock";
|
|
126
|
+
try {
|
|
127
|
+
const { pid } = deps.spawnNewDaemon(newEntry, socketArg);
|
|
128
|
+
(0, runtime_1.emitNervesEvent)({
|
|
129
|
+
component: "daemon",
|
|
130
|
+
event: "daemon.staged_restart_spawned",
|
|
131
|
+
message: "new daemon spawned successfully",
|
|
132
|
+
meta: { version, pid, entry: newEntry },
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
const spawnError = err instanceof Error ? err.message : /* v8 ignore next -- defensive: non-Error catch branch @preserve */ String(err);
|
|
137
|
+
(0, runtime_1.emitNervesEvent)({
|
|
138
|
+
component: "daemon",
|
|
139
|
+
event: "daemon.staged_restart_respawn_failed",
|
|
140
|
+
message: "failed to spawn new daemon after shutdown",
|
|
141
|
+
meta: { version, error: spawnError, entry: newEntry },
|
|
142
|
+
});
|
|
143
|
+
return { ok: false, error: `shutdown succeeded but failed to spawn new daemon: ${spawnError}`, shutdownError };
|
|
144
|
+
}
|
|
145
|
+
return { ok: true, shutdownError };
|
|
114
146
|
}
|
|
@@ -33,12 +33,15 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.CLI_UPDATE_DIST_TAG = exports.CLI_UPDATE_CHECK_TIMEOUT_MS = void 0;
|
|
36
37
|
exports.checkForUpdate = checkForUpdate;
|
|
37
38
|
exports.startUpdateChecker = startUpdateChecker;
|
|
38
39
|
exports.stopUpdateChecker = stopUpdateChecker;
|
|
39
40
|
const semver = __importStar(require("semver"));
|
|
40
41
|
const runtime_1 = require("../../nerves/runtime");
|
|
41
42
|
const DEFAULT_INTERVAL_MS = 30 * 60 * 1000; // 30 minutes
|
|
43
|
+
exports.CLI_UPDATE_CHECK_TIMEOUT_MS = 3_000;
|
|
44
|
+
exports.CLI_UPDATE_DIST_TAG = "latest";
|
|
42
45
|
async function checkForUpdate(currentVersion, deps) {
|
|
43
46
|
(0, runtime_1.emitNervesEvent)({
|
|
44
47
|
component: "daemon",
|
|
@@ -102,9 +105,11 @@ function stopUpdateChecker() {
|
|
|
102
105
|
clearInterval(_intervalId);
|
|
103
106
|
_intervalId = null;
|
|
104
107
|
}
|
|
108
|
+
// `_end` (not `_stop`) to satisfy the nerves audit's start/end pairing
|
|
109
|
+
// rule — counterpart to `daemon.update_checker_start` above.
|
|
105
110
|
(0, runtime_1.emitNervesEvent)({
|
|
106
111
|
component: "daemon",
|
|
107
|
-
event: "daemon.
|
|
112
|
+
event: "daemon.update_checker_end",
|
|
108
113
|
message: "stopping update checker",
|
|
109
114
|
meta: {},
|
|
110
115
|
});
|