@ouro.bot/cli 0.1.0-alpha.79 → 0.1.0-alpha.791

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.
Files changed (610) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -23
  3. package/RepairGuide.ouro/agent.json +5 -0
  4. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  5. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  6. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  7. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  8. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  9. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/assets/bluebubbles-host +264 -0
  14. package/changelog.json +5060 -16
  15. package/deploy/unraid/Dockerfile +48 -0
  16. package/deploy/unraid/README.txt +2523 -0
  17. package/deploy/unraid/audit-container-spec.sh +4 -0
  18. package/deploy/unraid/container-runtime.json +1 -0
  19. package/deploy/unraid/migrate-sanctuary-bundle.mjs +21 -0
  20. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  21. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  22. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  23. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  24. package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
  25. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  26. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
  27. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  28. package/deploy/unraid/sanctuary-deployment-target.mjs +709 -0
  29. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  30. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2030 -0
  31. package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
  32. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  33. package/deploy/unraid/sanctuary.ouro/agent.json +24 -0
  34. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  35. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  36. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  37. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  38. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  39. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
  40. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +11 -0
  41. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +11 -0
  42. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +11 -0
  43. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  44. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +23 -0
  45. package/deploy/unraid/sanctuary.xml +27 -0
  46. package/dist/a2a/card.js +57 -0
  47. package/dist/a2a/client.js +180 -0
  48. package/dist/a2a/config.js +50 -0
  49. package/dist/a2a/delegation-stores.js +56 -0
  50. package/dist/a2a/did-resolution.js +93 -0
  51. package/dist/a2a/identity.js +170 -0
  52. package/dist/a2a/inbound-share.js +107 -0
  53. package/dist/a2a/mission-result-wire.js +196 -0
  54. package/dist/a2a/onboarding.js +115 -0
  55. package/dist/a2a/pin-store.js +132 -0
  56. package/dist/a2a/seen-ledger.js +120 -0
  57. package/dist/a2a/server.js +604 -0
  58. package/dist/a2a/task-store.js +69 -0
  59. package/dist/a2a/transport.js +45 -0
  60. package/dist/a2a/types.js +3 -0
  61. package/dist/arc/attention-types.js +8 -0
  62. package/dist/arc/cares.js +360 -0
  63. package/dist/arc/episodes.js +118 -0
  64. package/dist/arc/evolution.js +490 -0
  65. package/dist/arc/flight-recorder.js +1034 -0
  66. package/dist/arc/intentions.js +134 -0
  67. package/dist/arc/json-store.js +117 -0
  68. package/dist/arc/obligations.js +386 -0
  69. package/dist/arc/packets.js +336 -0
  70. package/dist/arc/presence.js +185 -0
  71. package/dist/arc/task-lifecycle.js +57 -0
  72. package/dist/commerce/store.js +755 -0
  73. package/dist/commerce/types.js +3 -0
  74. package/dist/heart/active-work.js +820 -29
  75. package/dist/heart/agent-entry.js +252 -3
  76. package/dist/heart/approval-files.js +113 -0
  77. package/dist/heart/approval-store.js +950 -0
  78. package/dist/heart/attachments/image-normalize.js +194 -0
  79. package/dist/heart/attachments/materialize.js +97 -0
  80. package/dist/heart/attachments/originals.js +88 -0
  81. package/dist/heart/attachments/render.js +29 -0
  82. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  83. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  84. package/dist/heart/attachments/sources/index.js +18 -0
  85. package/dist/heart/attachments/sources/telegram.js +71 -0
  86. package/dist/heart/attachments/store.js +132 -0
  87. package/dist/heart/attachments/types.js +93 -0
  88. package/dist/heart/auth/auth-flow.js +495 -0
  89. package/dist/heart/autonomy-budget.js +478 -0
  90. package/dist/heart/awaiting/await-alert.js +148 -0
  91. package/dist/heart/awaiting/await-expiry.js +143 -0
  92. package/dist/heart/awaiting/await-loader.js +91 -0
  93. package/dist/heart/awaiting/await-parser.js +149 -0
  94. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  95. package/dist/heart/awaiting/await-scheduler.js +382 -0
  96. package/dist/heart/background-operations.js +281 -0
  97. package/dist/heart/bridges/manager.js +137 -17
  98. package/dist/heart/bridges/store.js +14 -2
  99. package/dist/heart/bundle-state.js +168 -0
  100. package/dist/heart/commitments.js +64 -18
  101. package/dist/heart/config-registry.js +331 -0
  102. package/dist/heart/config.js +142 -129
  103. package/dist/heart/context-loss-gauntlet.js +387 -0
  104. package/dist/heart/context-loss-sentinel.js +1157 -0
  105. package/dist/heart/core.js +2014 -469
  106. package/dist/heart/cross-chat-delivery.js +9 -22
  107. package/dist/heart/daemon/agent-config-check.js +451 -0
  108. package/dist/heart/daemon/agent-discovery.js +185 -3
  109. package/dist/heart/daemon/agent-service.js +542 -0
  110. package/dist/heart/daemon/agentic-repair.js +547 -0
  111. package/dist/heart/daemon/await-private-wake.js +59 -0
  112. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  113. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  114. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  115. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  116. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  117. package/dist/heart/daemon/cadence.js +180 -0
  118. package/dist/heart/daemon/cli-defaults.js +836 -0
  119. package/dist/heart/daemon/cli-desk.js +322 -0
  120. package/dist/heart/daemon/cli-exec.js +8730 -0
  121. package/dist/heart/daemon/cli-help.js +710 -0
  122. package/dist/heart/daemon/cli-parse.js +2719 -0
  123. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  124. package/dist/heart/daemon/cli-render.js +777 -0
  125. package/dist/heart/daemon/cli-types.js +8 -0
  126. package/dist/heart/daemon/connect-bay.js +323 -0
  127. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  128. package/dist/heart/daemon/container-healthcheck.js +96 -0
  129. package/dist/heart/daemon/container-runtime.js +97 -0
  130. package/dist/heart/daemon/container-spec-auditor-main.js +160 -0
  131. package/dist/heart/daemon/container-spec-auditor.js +176 -0
  132. package/dist/heart/daemon/daemon-bootstrap-startup.js +77 -0
  133. package/dist/heart/daemon/daemon-cli.js +29 -2284
  134. package/dist/heart/daemon/daemon-entry.js +907 -10
  135. package/dist/heart/daemon/daemon-health.js +186 -0
  136. package/dist/heart/daemon/daemon-rollup.js +57 -0
  137. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  138. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  139. package/dist/heart/daemon/daemon.js +2010 -88
  140. package/dist/heart/daemon/dns-workflow.js +394 -0
  141. package/dist/heart/daemon/doctor-types.js +8 -0
  142. package/dist/heart/daemon/doctor.js +1755 -0
  143. package/dist/heart/daemon/freshness.js +345 -0
  144. package/dist/heart/daemon/habit-private-wake.js +61 -0
  145. package/dist/heart/daemon/health-monitor.js +142 -11
  146. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  147. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  148. package/dist/heart/daemon/http-health-probe.js +80 -0
  149. package/dist/heart/daemon/human-command-screens.js +234 -0
  150. package/dist/heart/daemon/human-readiness.js +114 -0
  151. package/dist/heart/daemon/inner-status.js +78 -0
  152. package/dist/heart/daemon/interactive-repair.js +394 -0
  153. package/dist/heart/daemon/launchd.js +37 -8
  154. package/dist/heart/daemon/log-tailer.js +79 -10
  155. package/dist/heart/daemon/logs-prune.js +132 -0
  156. package/dist/heart/daemon/mcp-canary.js +524 -0
  157. package/dist/heart/daemon/message-router.js +65 -5
  158. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  159. package/dist/heart/daemon/os-cron-deps.js +135 -0
  160. package/dist/heart/daemon/os-cron.js +22 -14
  161. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  162. package/dist/heart/daemon/ouro-entry.js +3 -1
  163. package/dist/heart/daemon/plugin-cli.js +432 -0
  164. package/dist/heart/daemon/process-manager.js +733 -61
  165. package/dist/heart/daemon/provider-discovery.js +137 -0
  166. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  167. package/dist/heart/daemon/prunable-bundle.js +144 -0
  168. package/dist/heart/daemon/pulse.js +511 -0
  169. package/dist/heart/daemon/readiness-repair.js +365 -0
  170. package/dist/heart/daemon/run-hooks.js +2 -0
  171. package/dist/heart/daemon/runtime-logging.js +47 -14
  172. package/dist/heart/daemon/runtime-metadata.js +2 -30
  173. package/dist/heart/daemon/runtime-mode.js +13 -2
  174. package/dist/heart/daemon/safe-mode.js +161 -0
  175. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2609 -0
  176. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1866 -0
  177. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  178. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +976 -0
  179. package/dist/heart/daemon/sanctuary-bundle-migration.js +398 -0
  180. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  181. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  182. package/dist/heart/daemon/sense-manager.js +689 -48
  183. package/dist/heart/daemon/session-id-resolver.js +131 -0
  184. package/dist/heart/daemon/skill-management-installer.js +1 -1
  185. package/dist/heart/daemon/socket-client.js +180 -12
  186. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  187. package/dist/heart/daemon/startup-tui.js +339 -0
  188. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  189. package/dist/heart/daemon/task-scheduler.js +117 -39
  190. package/dist/heart/daemon/terminal-ui.js +499 -0
  191. package/dist/heart/daemon/thoughts.js +138 -54
  192. package/dist/heart/daemon/up-progress.js +366 -0
  193. package/dist/heart/daemon/vault-items.js +56 -0
  194. package/dist/heart/delegation.js +1 -4
  195. package/dist/heart/external-events/router.js +1414 -0
  196. package/dist/heart/habits/habit-cancel.js +810 -0
  197. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  198. package/dist/heart/habits/habit-migration.js +194 -0
  199. package/dist/heart/habits/habit-parser.js +278 -0
  200. package/dist/heart/habits/habit-runtime-state.js +93 -0
  201. package/dist/heart/habits/habit-scheduler.js +653 -0
  202. package/dist/heart/habits/habit-session-summary.js +318 -0
  203. package/dist/heart/habits/habit-session.js +636 -0
  204. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  205. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  206. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  207. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  208. package/dist/heart/identity.js +184 -59
  209. package/dist/heart/kept-notes.js +289 -0
  210. package/dist/heart/kicks.js +1 -1
  211. package/dist/heart/machine-identity.js +161 -0
  212. package/dist/heart/mail-import-discovery.js +353 -0
  213. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  214. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  215. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  216. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  217. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  218. package/dist/heart/mailbox/mailbox-http.js +99 -0
  219. package/dist/heart/mailbox/mailbox-read.js +39 -0
  220. package/dist/heart/mailbox/mailbox-types.js +27 -0
  221. package/dist/heart/mailbox/mailbox-view.js +197 -0
  222. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  223. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  224. package/dist/heart/mailbox/readers/mail.js +375 -0
  225. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  226. package/dist/heart/mailbox/readers/sessions.js +232 -0
  227. package/dist/heart/mailbox/readers/shared.js +111 -0
  228. package/dist/heart/mcp/mcp-server.js +696 -0
  229. package/dist/heart/migrate-config.js +100 -0
  230. package/dist/heart/model-capabilities.js +11 -0
  231. package/dist/heart/orientation-frame.js +345 -0
  232. package/dist/heart/platform.js +81 -0
  233. package/dist/heart/primitives.js +1 -1
  234. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  235. package/dist/heart/private-runtime/index.js +18 -0
  236. package/dist/heart/private-runtime/ledger.js +221 -0
  237. package/dist/heart/private-runtime/policy.js +252 -0
  238. package/dist/heart/private-runtime/types.js +2 -0
  239. package/dist/heart/progress-story.js +1 -1
  240. package/dist/heart/provider-attempt.js +137 -0
  241. package/dist/heart/provider-binding-resolver.js +273 -0
  242. package/dist/heart/provider-credentials.js +449 -0
  243. package/dist/heart/provider-failover.js +311 -0
  244. package/dist/heart/provider-models.js +96 -0
  245. package/dist/heart/provider-ping.js +265 -0
  246. package/dist/heart/provider-readiness-cache.js +119 -0
  247. package/dist/heart/provider-visibility.js +188 -0
  248. package/dist/heart/providers/anthropic-token.js +131 -0
  249. package/dist/heart/providers/anthropic.js +173 -60
  250. package/dist/heart/providers/azure.js +23 -11
  251. package/dist/heart/providers/error-classification.js +127 -0
  252. package/dist/heart/providers/github-copilot.js +34 -38
  253. package/dist/heart/providers/minimax-vlm.js +189 -0
  254. package/dist/heart/providers/minimax.js +26 -8
  255. package/dist/heart/providers/openai-codex-token.js +349 -0
  256. package/dist/heart/providers/openai-codex.js +55 -40
  257. package/dist/heart/providers/openai-compatible.js +177 -0
  258. package/dist/heart/run-ledger.js +247 -0
  259. package/dist/heart/runtime-capability-check.js +170 -0
  260. package/dist/heart/runtime-credentials.js +607 -0
  261. package/dist/heart/runtime-cwd.js +87 -0
  262. package/dist/heart/sense-truth.js +22 -4
  263. package/dist/heart/session-activity.js +90 -24
  264. package/dist/heart/session-events.js +1318 -0
  265. package/dist/heart/session-playback-cli-main.js +5 -0
  266. package/dist/heart/session-playback-cli.js +36 -0
  267. package/dist/heart/session-playback.js +231 -0
  268. package/dist/heart/session-stats-cli-main.js +5 -0
  269. package/dist/heart/session-stats.js +182 -0
  270. package/dist/heart/session-transcript.js +133 -0
  271. package/dist/heart/start-of-turn-packet.js +372 -0
  272. package/dist/heart/steward-policy.js +302 -0
  273. package/dist/heart/streaming.js +604 -207
  274. package/dist/heart/structured-output.js +196 -0
  275. package/dist/heart/sync-classification.js +176 -0
  276. package/dist/heart/sync.js +449 -0
  277. package/dist/heart/target-resolution.js +11 -7
  278. package/dist/heart/tempo.js +93 -0
  279. package/dist/heart/temporal-view.js +41 -0
  280. package/dist/heart/timeouts.js +101 -0
  281. package/dist/heart/tool-activity-callbacks.js +59 -0
  282. package/dist/heart/tool-approval.js +342 -0
  283. package/dist/heart/tool-description.js +155 -0
  284. package/dist/heart/tool-friction.js +55 -0
  285. package/dist/heart/tool-loop.js +200 -0
  286. package/dist/heart/turn-context.js +481 -0
  287. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  288. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  289. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  290. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  291. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  292. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  293. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  294. package/dist/heart/versioning/update-hooks.js +154 -0
  295. package/dist/heart/versioning/version-intent.js +114 -0
  296. package/dist/heart/work-card.js +380 -0
  297. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  298. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  299. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  300. package/dist/mailbox-ui/index.html +16 -0
  301. package/dist/mailroom/attention.js +167 -0
  302. package/dist/mailroom/autonomy.js +209 -0
  303. package/dist/mailroom/blob-store.js +889 -0
  304. package/dist/mailroom/body-cache.js +61 -0
  305. package/dist/mailroom/cache-sync-cli.js +58 -0
  306. package/dist/mailroom/core.js +803 -0
  307. package/dist/mailroom/entry.js +160 -0
  308. package/dist/mailroom/file-store.js +568 -0
  309. package/dist/mailroom/hosted-cache-sync.js +384 -0
  310. package/dist/mailroom/mbox-import.js +393 -0
  311. package/dist/mailroom/migration.js +164 -0
  312. package/dist/mailroom/outbound.js +380 -0
  313. package/dist/mailroom/policy.js +263 -0
  314. package/dist/mailroom/reader.js +292 -0
  315. package/dist/mailroom/search-cache.js +513 -0
  316. package/dist/mailroom/search-relevance.js +319 -0
  317. package/dist/mailroom/smtp-ingress.js +176 -0
  318. package/dist/mailroom/source-state.js +176 -0
  319. package/dist/mailroom/thread.js +109 -0
  320. package/dist/mailroom/travel-extract.js +89 -0
  321. package/dist/mind/bundle-manifest.js +24 -2
  322. package/dist/mind/context.js +278 -111
  323. package/dist/mind/desk-section.js +362 -0
  324. package/dist/mind/diary-integrity.js +60 -0
  325. package/dist/mind/{memory.js → diary.js} +68 -77
  326. package/dist/mind/embedding-provider.js +60 -0
  327. package/dist/mind/file-state.js +179 -0
  328. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  329. package/dist/mind/obligation-steering.js +227 -0
  330. package/dist/mind/pending.js +34 -8
  331. package/dist/mind/prompt-budget.js +479 -0
  332. package/dist/mind/prompt-refresh.js +3 -2
  333. package/dist/mind/prompt.js +1056 -187
  334. package/dist/mind/provenance-trust.js +26 -0
  335. package/dist/mind/record-paths.js +312 -0
  336. package/dist/mind/scrutiny.js +173 -0
  337. package/dist/mind/session-transaction.js +415 -0
  338. package/dist/nerves/cli-logging.js +7 -1
  339. package/dist/nerves/coverage/audit-rules.js +15 -6
  340. package/dist/nerves/coverage/audit.js +28 -2
  341. package/dist/nerves/coverage/cli.js +1 -1
  342. package/dist/nerves/coverage/contract.js +5 -5
  343. package/dist/nerves/coverage/file-completeness.js +139 -5
  344. package/dist/nerves/coverage/run-artifacts.js +55 -35
  345. package/dist/nerves/coverage/source-scanner.js +4 -4
  346. package/dist/nerves/event-buffer.js +111 -0
  347. package/dist/nerves/index.js +293 -9
  348. package/dist/nerves/observation.js +20 -0
  349. package/dist/nerves/redact.js +79 -0
  350. package/dist/nerves/review/cli-main.js +5 -0
  351. package/dist/nerves/review/cli.js +156 -0
  352. package/dist/nerves/review/core.js +159 -0
  353. package/dist/nerves/runtime.js +17 -1
  354. package/dist/repertoire/ado-client.js +15 -56
  355. package/dist/repertoire/ado-semantic.js +16 -10
  356. package/dist/repertoire/api-client.js +97 -0
  357. package/dist/repertoire/bitwarden-store.js +1045 -0
  358. package/dist/repertoire/bundle-templates.js +71 -0
  359. package/dist/repertoire/bw-installer.js +180 -0
  360. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  361. package/dist/repertoire/coding/context-pack.js +331 -0
  362. package/dist/repertoire/coding/feedback.js +218 -30
  363. package/dist/repertoire/coding/index.js +15 -3
  364. package/dist/repertoire/coding/manager.js +166 -10
  365. package/dist/repertoire/coding/spawner.js +58 -11
  366. package/dist/repertoire/coding/tools.js +242 -14
  367. package/dist/repertoire/coding/workbench-client.js +272 -0
  368. package/dist/repertoire/coding/workbench-manager.js +346 -0
  369. package/dist/repertoire/commerce-errors.js +109 -0
  370. package/dist/repertoire/commerce-self-test.js +156 -0
  371. package/dist/repertoire/credential-access.js +178 -0
  372. package/dist/repertoire/desk/classifier.js +362 -0
  373. package/dist/repertoire/duffel-client.js +185 -0
  374. package/dist/repertoire/github-client.js +14 -55
  375. package/dist/repertoire/graph-client.js +11 -52
  376. package/dist/repertoire/guardrails.js +811 -18
  377. package/dist/repertoire/mcp-client.js +44 -3
  378. package/dist/repertoire/mcp-manager.js +259 -20
  379. package/dist/repertoire/mcp-tools.js +83 -0
  380. package/dist/repertoire/plugin-mcp.js +175 -0
  381. package/dist/repertoire/plugins.js +253 -0
  382. package/dist/repertoire/relationship-authorization.js +194 -0
  383. package/dist/repertoire/shell-sessions.js +133 -0
  384. package/dist/repertoire/skills.js +48 -4
  385. package/dist/repertoire/stripe-client.js +131 -0
  386. package/dist/repertoire/tool-arguments.js +148 -0
  387. package/dist/repertoire/tool-results.js +29 -0
  388. package/dist/repertoire/tools-a2a.js +699 -0
  389. package/dist/repertoire/tools-attachments.js +322 -0
  390. package/dist/repertoire/tools-awaiting.js +575 -0
  391. package/dist/repertoire/tools-base.js +82 -1139
  392. package/dist/repertoire/tools-bluebubbles.js +2 -0
  393. package/dist/repertoire/tools-bridge.js +144 -0
  394. package/dist/repertoire/tools-bundle.js +993 -0
  395. package/dist/repertoire/tools-commerce.js +253 -0
  396. package/dist/repertoire/tools-config.js +186 -0
  397. package/dist/repertoire/tools-continuity.js +575 -0
  398. package/dist/repertoire/tools-credential.js +383 -0
  399. package/dist/repertoire/tools-evolution.js +527 -0
  400. package/dist/repertoire/tools-files.js +344 -0
  401. package/dist/repertoire/tools-flight.js +290 -0
  402. package/dist/repertoire/tools-flow.js +119 -0
  403. package/dist/repertoire/tools-github.js +3 -8
  404. package/dist/repertoire/tools-habits.js +103 -0
  405. package/dist/repertoire/tools-mail.js +1828 -0
  406. package/dist/repertoire/tools-notes.js +485 -0
  407. package/dist/repertoire/tools-obligations.js +182 -0
  408. package/dist/repertoire/tools-orientation.js +31 -0
  409. package/dist/repertoire/tools-record.js +482 -0
  410. package/dist/repertoire/tools-rsvp.js +139 -0
  411. package/dist/repertoire/tools-runtime.js +150 -0
  412. package/dist/repertoire/tools-session.js +1108 -0
  413. package/dist/repertoire/tools-shell.js +133 -0
  414. package/dist/repertoire/tools-steward-policy.js +95 -0
  415. package/dist/repertoire/tools-stripe.js +224 -0
  416. package/dist/repertoire/tools-surface.js +369 -0
  417. package/dist/repertoire/tools-teams.js +12 -39
  418. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  419. package/dist/repertoire/tools-travel.js +125 -0
  420. package/dist/repertoire/tools-trip.js +982 -0
  421. package/dist/repertoire/tools-unraid.js +483 -0
  422. package/dist/repertoire/tools-user-profile.js +146 -0
  423. package/dist/repertoire/tools-vault.js +40 -0
  424. package/dist/repertoire/tools-voice.js +145 -0
  425. package/dist/repertoire/tools.js +377 -80
  426. package/dist/repertoire/travel-api-client.js +360 -0
  427. package/dist/repertoire/unraid-client.js +155 -0
  428. package/dist/repertoire/unraid-restart.js +212 -0
  429. package/dist/repertoire/user-profile.js +131 -0
  430. package/dist/repertoire/vault-setup.js +246 -0
  431. package/dist/repertoire/vault-unlock.js +628 -0
  432. package/dist/rsvp/aisleplanner-client.js +354 -0
  433. package/dist/rsvp/cli.js +926 -0
  434. package/dist/rsvp/config.js +327 -0
  435. package/dist/rsvp/cutover.js +433 -0
  436. package/dist/rsvp/diagnostics.js +232 -0
  437. package/dist/rsvp/diff-renderer.js +176 -0
  438. package/dist/rsvp/habit-policy.js +110 -0
  439. package/dist/rsvp/habit-stage.js +123 -0
  440. package/dist/rsvp/incident-bundle.js +97 -0
  441. package/dist/rsvp/migration.js +204 -0
  442. package/dist/rsvp/native-habit-runner.js +630 -0
  443. package/dist/rsvp/outbound-state.js +628 -0
  444. package/dist/rsvp/query.js +118 -0
  445. package/dist/rsvp/replay.js +233 -0
  446. package/dist/rsvp/snapshot.js +232 -0
  447. package/dist/rsvp/spend-ledger.js +175 -0
  448. package/dist/scripts/claude-code-hook.js +41 -0
  449. package/dist/scripts/claude-code-stop-hook.js +47 -0
  450. package/dist/senses/a2a-entry.js +115 -0
  451. package/dist/senses/attention-queue.js +186 -0
  452. package/dist/senses/await-turn-message.js +58 -0
  453. package/dist/senses/bluebubbles/active-turns.js +216 -0
  454. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  455. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  456. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +355 -40
  457. package/dist/senses/bluebubbles/context-packet.js +207 -0
  458. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  459. package/dist/senses/bluebubbles/entry.js +90 -0
  460. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  461. package/dist/senses/bluebubbles/index.js +3839 -0
  462. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  463. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  464. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  465. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  466. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  467. package/dist/senses/bluebubbles/processed-log.js +133 -0
  468. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  469. package/dist/senses/bluebubbles/replay.js +284 -0
  470. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  471. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  472. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  473. package/dist/senses/bluebubbles/webhook-registration.js +228 -0
  474. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  475. package/dist/senses/cli/bracketed-paste.js +82 -0
  476. package/dist/senses/cli/image-paste.js +287 -0
  477. package/dist/senses/cli/image-ref-navigation.js +75 -0
  478. package/dist/senses/cli/ink-app.js +156 -0
  479. package/dist/senses/cli/inline-diff.js +64 -0
  480. package/dist/senses/cli/input-keys.js +174 -0
  481. package/dist/senses/cli/kill-ring.js +86 -0
  482. package/dist/senses/cli/message-list.js +51 -0
  483. package/dist/senses/cli/ouro-tui.js +607 -0
  484. package/dist/senses/cli/spinner-imperative.js +135 -0
  485. package/dist/senses/cli/spinner.js +101 -0
  486. package/dist/senses/cli/status-line.js +60 -0
  487. package/dist/senses/cli/streaming-markdown.js +526 -0
  488. package/dist/senses/cli/tool-display.js +85 -0
  489. package/dist/senses/cli/tool-render.js +85 -0
  490. package/dist/senses/cli/tui-store.js +241 -0
  491. package/dist/senses/cli/virtual-list.js +35 -0
  492. package/dist/senses/cli-entry.js +60 -8
  493. package/dist/senses/cli.js +600 -317
  494. package/dist/senses/commands.js +66 -3
  495. package/dist/senses/context-packet-ledger.js +371 -0
  496. package/dist/senses/context-packets.js +154 -0
  497. package/dist/senses/habit-lifecycle-guard.js +24 -0
  498. package/dist/senses/habit-turn-message.js +160 -0
  499. package/dist/senses/ingress-evidence.js +2 -0
  500. package/dist/senses/mail-entry.js +66 -0
  501. package/dist/senses/mail.js +524 -0
  502. package/dist/senses/pipeline.js +1110 -204
  503. package/dist/senses/private-runtime-worker.js +859 -0
  504. package/dist/senses/private-runtime.js +1496 -0
  505. package/dist/senses/proactive-content-guard.js +51 -0
  506. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  507. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  508. package/dist/senses/sanctuary-grounding.js +118 -0
  509. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  510. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  511. package/dist/senses/sanctuary-health-runner.js +101 -0
  512. package/dist/senses/sanctuary-health.js +408 -0
  513. package/dist/senses/sanctuary-interactive-control.js +306 -0
  514. package/dist/senses/sanctuary-media-catalog-contract.js +39 -0
  515. package/dist/senses/sanctuary-media-optimization.js +501 -0
  516. package/dist/senses/sanctuary-runtime.js +331 -0
  517. package/dist/senses/sanctuary-sab.js +85 -0
  518. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  519. package/dist/senses/shared-turn.js +494 -0
  520. package/dist/senses/surface-tool.js +109 -0
  521. package/dist/senses/teams-entry.js +60 -8
  522. package/dist/senses/teams.js +515 -217
  523. package/dist/senses/telegram-admission.js +711 -0
  524. package/dist/senses/telegram-approval-runtime.js +566 -0
  525. package/dist/senses/telegram-attachments.js +182 -0
  526. package/dist/senses/telegram-audit-ledger.js +220 -0
  527. package/dist/senses/telegram-client.js +1676 -0
  528. package/dist/senses/telegram-effect-adapter.js +845 -0
  529. package/dist/senses/telegram-entry.js +83 -0
  530. package/dist/senses/telegram.js +2026 -0
  531. package/dist/senses/trust-gate.js +104 -9
  532. package/dist/senses/voice/audio-playback.js +237 -0
  533. package/dist/senses/voice/audio-routing.js +119 -0
  534. package/dist/senses/voice/elevenlabs.js +202 -0
  535. package/dist/senses/voice/floor-control.js +431 -0
  536. package/dist/senses/voice/floor-controller.js +115 -0
  537. package/dist/senses/voice/golden-path.js +116 -0
  538. package/dist/senses/voice/index.js +29 -0
  539. package/dist/senses/voice/meeting.js +113 -0
  540. package/dist/senses/voice/outbound.js +190 -0
  541. package/dist/senses/voice/phone.js +33 -0
  542. package/dist/senses/voice/playback.js +139 -0
  543. package/dist/senses/voice/realtime-eval.js +496 -0
  544. package/dist/senses/voice/realtime-trace.js +531 -0
  545. package/dist/senses/voice/transcript.js +70 -0
  546. package/dist/senses/voice/turn.js +191 -0
  547. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  548. package/dist/senses/voice/twilio-phone.js +5081 -0
  549. package/dist/senses/voice/types.js +2 -0
  550. package/dist/senses/voice/whisper.js +161 -0
  551. package/dist/senses/voice-entry.js +81 -0
  552. package/dist/senses/voice-realtime-eval-command.js +99 -0
  553. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  554. package/dist/senses/voice-twilio-entry.js +87 -0
  555. package/dist/trips/core.js +138 -0
  556. package/dist/trips/store.js +265 -0
  557. package/dist/util/frontmatter.js +69 -0
  558. package/npm-shrinkwrap.json +8144 -0
  559. package/package.json +72 -13
  560. package/skills/agent-commerce.md +113 -0
  561. package/skills/browser-navigation.md +117 -0
  562. package/skills/commerce-setup-guide.md +116 -0
  563. package/skills/commerce-setup.md +84 -0
  564. package/skills/configure-dev-tools.md +99 -0
  565. package/skills/travel-planning.md +138 -0
  566. package/dist/heart/daemon/auth-flow.js +0 -430
  567. package/dist/heart/daemon/ouro-path-installer.js +0 -260
  568. package/dist/heart/daemon/ouro-version-manager.js +0 -164
  569. package/dist/heart/daemon/update-hooks.js +0 -138
  570. package/dist/heart/obligations.js +0 -141
  571. package/dist/heart/safe-workspace.js +0 -228
  572. package/dist/heart/session-recall.js +0 -116
  573. package/dist/mind/friends/channel.js +0 -84
  574. package/dist/mind/friends/group-context.js +0 -144
  575. package/dist/mind/friends/resolver.js +0 -84
  576. package/dist/mind/friends/store-file.js +0 -190
  577. package/dist/mind/friends/store.js +0 -4
  578. package/dist/mind/friends/tokens.js +0 -26
  579. package/dist/mind/friends/trust-explanation.js +0 -74
  580. package/dist/mind/friends/types.js +0 -29
  581. package/dist/repertoire/tasks/board.js +0 -134
  582. package/dist/repertoire/tasks/index.js +0 -224
  583. package/dist/repertoire/tasks/lifecycle.js +0 -80
  584. package/dist/repertoire/tasks/middleware.js +0 -65
  585. package/dist/repertoire/tasks/parser.js +0 -173
  586. package/dist/repertoire/tasks/scanner.js +0 -132
  587. package/dist/repertoire/tasks/transitions.js +0 -144
  588. package/dist/senses/bluebubbles-entry.js +0 -13
  589. package/dist/senses/bluebubbles.js +0 -1181
  590. package/dist/senses/debug-activity.js +0 -154
  591. package/dist/senses/inner-dialog-worker.js +0 -90
  592. package/dist/senses/inner-dialog.js +0 -525
  593. package/subagents/README.md +0 -7
  594. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  595. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  596. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  597. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  598. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  599. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  600. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  601. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  602. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  603. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  604. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  605. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  606. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  607. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  608. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  609. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  610. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,96 @@
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.runContainerHealthcheck = runContainerHealthcheck;
37
+ exports.runContainerHealthcheckMain = runContainerHealthcheckMain;
38
+ const fs = __importStar(require("node:fs"));
39
+ const os = __importStar(require("node:os"));
40
+ const path = __importStar(require("node:path"));
41
+ const node_child_process_1 = require("node:child_process");
42
+ const runtime_1 = require("../../nerves/runtime");
43
+ const container_runtime_1 = require("./container-runtime");
44
+ function fail(reason) {
45
+ (0, runtime_1.emitNervesEvent)({ level: "error", component: "daemon", event: "daemon.container_healthcheck_error", message: "container healthcheck failed", meta: { reason } });
46
+ process.exitCode = 1;
47
+ throw new Error(reason);
48
+ }
49
+ function runContainerHealthcheck(options = {}) {
50
+ const argv = options.argv ?? process.argv;
51
+ const now = options.now ?? Date.now;
52
+ const index = argv.indexOf("--agent");
53
+ const agent = index >= 0 ? argv[index + 1] : undefined;
54
+ if (!agent)
55
+ fail("missing agent");
56
+ const healthPath = path.join(os.homedir(), ".ouro-cli", "daemon-health.json");
57
+ let stat;
58
+ let health;
59
+ try {
60
+ stat = fs.statSync(healthPath);
61
+ health = JSON.parse(fs.readFileSync(healthPath, "utf8"));
62
+ }
63
+ catch {
64
+ fail("health state unavailable");
65
+ }
66
+ const checkedAt = now();
67
+ if (checkedAt - stat.mtimeMs > 90_000 || stat.mtimeMs > checkedAt + 1_000)
68
+ fail("health state stale");
69
+ if (health.pid !== 1 || !fs.existsSync("/proc/1"))
70
+ fail("daemon is not PID 1");
71
+ if (health.status !== "healthy" && health.status !== "partial")
72
+ fail("daemon status is not ready");
73
+ const agents = health.agents;
74
+ const managed = agents?.[agent];
75
+ if (!managed || managed.status !== "running" || typeof managed.pid !== "number" || managed.pid <= 0)
76
+ fail("managed agent is not running");
77
+ let processArguments = "";
78
+ try {
79
+ processArguments = (0, node_child_process_1.execFileSync)("ps", ["-eo", "args="], { encoding: "utf8", timeout: 2_000 });
80
+ }
81
+ catch {
82
+ fail("managed process inventory is unavailable");
83
+ }
84
+ if (!(0, container_runtime_1.hasManagedAgentProcess)(processArguments, agent))
85
+ fail("managed agent is not running exactly once");
86
+ if (!(0, container_runtime_1.hasManagedTelegramProcess)(processArguments, agent))
87
+ fail("managed Telegram sense is not running exactly once");
88
+ if (!(0, container_runtime_1.hasManagedSupercronicProcess)(processArguments, agent))
89
+ fail("managed Supercronic scheduler is not running exactly once");
90
+ (0, runtime_1.emitNervesEvent)({ component: "daemon", event: "daemon.container_healthcheck_end", message: "container healthcheck passed", meta: { agent } });
91
+ }
92
+ function runContainerHealthcheckMain(isMain, runner) {
93
+ if (isMain)
94
+ runner();
95
+ }
96
+ runContainerHealthcheckMain(require.main === module, runContainerHealthcheck);
@@ -0,0 +1,97 @@
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.hasManagedAgentProcess = hasManagedAgentProcess;
37
+ exports.hasManagedTelegramProcess = hasManagedTelegramProcess;
38
+ exports.hasManagedSupercronicProcess = hasManagedSupercronicProcess;
39
+ exports.readContainerRuntimePolicy = readContainerRuntimePolicy;
40
+ const fs = __importStar(require("node:fs"));
41
+ const runtime_1 = require("../../nerves/runtime");
42
+ function hasManagedAgentProcess(processArguments, agent) {
43
+ const wanted = agent.trim();
44
+ if (!wanted)
45
+ return false;
46
+ const matches = processArguments.split("\n").filter((line) => {
47
+ const fields = line.trim().split(/\s+/u);
48
+ const entryIndex = fields.findIndex((field) => field === "/opt/ouro/dist/heart/agent-entry.js");
49
+ const agentIndex = fields.findIndex((field) => field === "--agent");
50
+ return entryIndex >= 0 && agentIndex >= 0 && fields[agentIndex + 1] === wanted;
51
+ });
52
+ return matches.length === 1;
53
+ }
54
+ function hasManagedTelegramProcess(processArguments, agent) {
55
+ const wanted = agent.trim();
56
+ if (!wanted)
57
+ return false;
58
+ const matches = processArguments.split("\n").filter((line) => {
59
+ const fields = line.trim().split(/\s+/u);
60
+ const entryIndex = fields.findIndex((field) => field === "/opt/ouro/dist/senses/telegram-entry.js");
61
+ const agentIndex = fields.findIndex((field) => field === "--agent");
62
+ return entryIndex >= 0 && agentIndex >= 0 && fields[agentIndex + 1] === wanted;
63
+ });
64
+ return matches.length === 1;
65
+ }
66
+ function hasManagedSupercronicProcess(processArguments, agent) {
67
+ const expected = [
68
+ "/usr/local/bin/supercronic",
69
+ "-split-logs",
70
+ "-inotify",
71
+ `/home/ouro/.ouro-cli/scheduler/${agent}.crontab`,
72
+ ];
73
+ const matches = processArguments.split("\n").filter((line) => {
74
+ const fields = line.trim().split(/\s+/u);
75
+ return fields.length === expected.length && fields.every((field, index) => field === expected[index]);
76
+ });
77
+ return matches.length === 1;
78
+ }
79
+ function readContainerRuntimePolicy(options = {}) {
80
+ const filePath = options.path ?? "/opt/ouro/container-runtime.json";
81
+ const readFile = options.readFile ?? ((target) => fs.readFileSync(target, "utf8"));
82
+ let raw;
83
+ try {
84
+ raw = readFile(filePath);
85
+ }
86
+ catch (error) {
87
+ if (error && typeof error === "object" && "code" in error && error.code === "ENOENT")
88
+ return null;
89
+ throw error;
90
+ }
91
+ const value = JSON.parse(raw);
92
+ if (value.scheduler !== "supercronic" || value.updates !== "disabled" || Object.keys(value).sort().join(",") !== "scheduler,updates") {
93
+ throw new Error("container runtime policy is invalid");
94
+ }
95
+ (0, runtime_1.emitNervesEvent)({ component: "daemon", event: "daemon.container_runtime_policy_loaded", message: "container runtime policy loaded", meta: { scheduler: value.scheduler, updates: value.updates } });
96
+ return { scheduler: "supercronic", updates: "disabled" };
97
+ }
@@ -0,0 +1,160 @@
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.runContainerSpecAuditorCli = runContainerSpecAuditorCli;
37
+ exports.runContainerSpecAuditorMain = runContainerSpecAuditorMain;
38
+ const fs = __importStar(require("node:fs"));
39
+ const runtime_1 = require("../../nerves/runtime");
40
+ const container_spec_auditor_1 = require("./container-spec-auditor");
41
+ function parseModeArguments(args, flags) {
42
+ if (args.length !== flags.length * 2)
43
+ return null;
44
+ const allowed = new Set(flags);
45
+ const parsed = {};
46
+ for (let index = 0; index < args.length; index += 2) {
47
+ const flag = args[index];
48
+ const value = args[index + 1];
49
+ if (!allowed.has(flag) || Object.prototype.hasOwnProperty.call(parsed, flag) || !value)
50
+ return null;
51
+ parsed[flag] = value;
52
+ }
53
+ return parsed;
54
+ }
55
+ function parseSingleInspect(raw) {
56
+ try {
57
+ const value = JSON.parse(raw);
58
+ if (!Array.isArray(value) || value.length !== 1)
59
+ return null;
60
+ const item = value[0];
61
+ if (!item || typeof item !== "object" || Array.isArray(item))
62
+ return null;
63
+ return item;
64
+ }
65
+ catch {
66
+ return null;
67
+ }
68
+ }
69
+ function runContainerSpecAuditorCli(args, deps = {}) {
70
+ const readFile = deps.readFile ?? ((filePath) => fs.readFileSync(filePath, "utf8"));
71
+ const write = deps.write ?? ((text) => process.stdout.write(text));
72
+ const staged = parseModeArguments(args, ["--template", "--runtime-policy", "--expected-image"]);
73
+ const effective = parseModeArguments(args, ["--inspect", "--image-inspect", "--expected-image"]);
74
+ const legacyCandidate = parseModeArguments(args, ["--inspect", "--image-inspect", "--expected-image", "--mount-contract"]);
75
+ const legacyEffective = legacyCandidate?.["--mount-contract"] === "legacy-alpha742" ? legacyCandidate : null;
76
+ const selectedEffective = effective ?? legacyEffective;
77
+ if (!staged && !selectedEffective) {
78
+ write(JSON.stringify({ ok: false, error: "usage: staged --template <path> --runtime-policy <path> --expected-image <id>; effective --inspect <path> --image-inspect <path> --expected-image <id> [--mount-contract legacy-alpha742]" }) + "\n");
79
+ (0, runtime_1.emitNervesEvent)({
80
+ level: "error",
81
+ component: "daemon",
82
+ event: "daemon.container_spec_auditor_cli_error",
83
+ message: "container spec auditor arguments were invalid",
84
+ meta: { argumentCount: args.length },
85
+ });
86
+ return 2;
87
+ }
88
+ if (selectedEffective) {
89
+ let containerText;
90
+ let imageText;
91
+ try {
92
+ containerText = readFile(selectedEffective["--inspect"]);
93
+ imageText = readFile(selectedEffective["--image-inspect"]);
94
+ }
95
+ catch (error) {
96
+ write(JSON.stringify({ ok: false, error: "effective audit inputs are unreadable" }) + "\n");
97
+ (0, runtime_1.emitNervesEvent)({
98
+ level: "error",
99
+ component: "daemon",
100
+ event: "daemon.container_spec_auditor_cli_error",
101
+ message: "container spec auditor could not read effective inputs",
102
+ meta: { reason: error instanceof Error ? error.message : String(error) },
103
+ });
104
+ return 2;
105
+ }
106
+ const containerInspect = parseSingleInspect(containerText);
107
+ const imageInspect = parseSingleInspect(imageText);
108
+ const imageConfig = imageInspect?.Config;
109
+ const expectedEnvironment = imageConfig && typeof imageConfig === "object" && !Array.isArray(imageConfig)
110
+ ? imageConfig.Env
111
+ : null;
112
+ if (!containerInspect || !imageInspect || !Array.isArray(expectedEnvironment) || !expectedEnvironment.every((entry) => typeof entry === "string")) {
113
+ write(JSON.stringify({ ok: false, error: "effective audit inputs must each contain exactly one canonical inspect record" }) + "\n");
114
+ (0, runtime_1.emitNervesEvent)({
115
+ level: "error",
116
+ component: "daemon",
117
+ event: "daemon.container_spec_auditor_cli_error",
118
+ message: "container spec auditor effective inputs were invalid",
119
+ meta: { containerValid: !!containerInspect, imageValid: !!imageInspect },
120
+ });
121
+ return 2;
122
+ }
123
+ const result = (0, container_spec_auditor_1.auditSanctuaryContainerSpec)(containerInspect, {
124
+ expectedImage: selectedEffective["--expected-image"],
125
+ expectedEnvironment,
126
+ mountContract: legacyEffective ? "legacy-alpha742" : "canonical",
127
+ });
128
+ if (imageInspect.Id !== selectedEffective["--expected-image"]) {
129
+ result.ok = false;
130
+ result.violations.unshift("reviewed image inspect identity does not match the expected local image ID");
131
+ }
132
+ write(JSON.stringify(result) + "\n");
133
+ return result.ok ? 0 : 1;
134
+ }
135
+ let templateXml;
136
+ let runtimePolicyText;
137
+ try {
138
+ templateXml = readFile(staged["--template"]);
139
+ runtimePolicyText = readFile(staged["--runtime-policy"]);
140
+ }
141
+ catch (error) {
142
+ write(JSON.stringify({ ok: false, error: "staged audit inputs are unreadable" }) + "\n");
143
+ (0, runtime_1.emitNervesEvent)({
144
+ level: "error",
145
+ component: "daemon",
146
+ event: "daemon.container_spec_auditor_cli_error",
147
+ message: "container spec auditor could not read staged files",
148
+ meta: { reason: error instanceof Error ? error.message : String(error) },
149
+ });
150
+ return 2;
151
+ }
152
+ const result = (0, container_spec_auditor_1.auditSanctuaryStagedFiles)({ templateXml, runtimePolicyText, expectedImage: staged["--expected-image"] });
153
+ write(JSON.stringify(result) + "\n");
154
+ return result.ok ? 0 : 1;
155
+ }
156
+ function runContainerSpecAuditorMain(isMain, args, runner) {
157
+ if (isMain)
158
+ process.exitCode = runner(args);
159
+ }
160
+ runContainerSpecAuditorMain(require.main === module, process.argv.slice(2), runContainerSpecAuditorCli);
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.auditSanctuaryContainerSpec = auditSanctuaryContainerSpec;
4
+ exports.auditSanctuaryStagedFiles = auditSanctuaryStagedFiles;
5
+ const runtime_1 = require("../../nerves/runtime");
6
+ const EXPECTED_BINDS = [
7
+ "/mnt/user/appdata/ouro-butler/runtime/.ouro-cli:/home/ouro/.ouro-cli:rw",
8
+ "/mnt/user/appdata/ouro-butler/agent/sanctuary.ouro:/home/ouro/AgentBundles/sanctuary.ouro:rw",
9
+ "/boot/config/custom/ouro-events/spool:/run/ouro-events:ro",
10
+ ];
11
+ const EXPECTED_MOUNTS = [
12
+ ["/mnt/user/appdata/ouro-butler/runtime/.ouro-cli", "/home/ouro/.ouro-cli", true, "rprivate"],
13
+ ["/mnt/user/appdata/ouro-butler/agent/sanctuary.ouro", "/home/ouro/AgentBundles/sanctuary.ouro", true, "rprivate"],
14
+ ["/boot/config/custom/ouro-events/spool", "/run/ouro-events", false, "rprivate"],
15
+ ];
16
+ const LEGACY_ALPHA742_IMAGE = "sha256:681449ad47a2621705cd339b481e6339236b31dc65e195b1cf5025d0f2191d7d";
17
+ const LEGACY_ALPHA742_MOUNTS = EXPECTED_MOUNTS.slice(0, 2);
18
+ const EXPECTED_EXTRA_PARAMS = "--restart=unless-stopped --user=10001:10001";
19
+ function record(value) {
20
+ return value && typeof value === "object" && !Array.isArray(value)
21
+ ? value
22
+ : null;
23
+ }
24
+ function stringArray(value) {
25
+ return Array.isArray(value) && value.every((entry) => typeof entry === "string") ? value : null;
26
+ }
27
+ function isEmptyRecord(value) {
28
+ const candidate = record(value);
29
+ return candidate !== null && Object.keys(candidate).length === 0;
30
+ }
31
+ function auditSanctuaryContainerSpec(value, options) {
32
+ const violations = [];
33
+ const root = record(value);
34
+ const config = record(root?.Config);
35
+ const host = record(root?.HostConfig);
36
+ const network = record(root?.NetworkSettings);
37
+ if (!root || !config || !host) {
38
+ violations.push("inspect payload must contain object Config and HostConfig records");
39
+ }
40
+ else {
41
+ if (!/^sha256:[a-f0-9]{64}$/u.test(options.expectedImage))
42
+ violations.push("expected image must be an exact local Docker image ID");
43
+ const mountContract = options.mountContract ?? "canonical";
44
+ if (mountContract === "legacy-alpha742" && options.expectedImage !== LEGACY_ALPHA742_IMAGE)
45
+ violations.push("legacy mount exception requires the pinned alpha.742 image ID");
46
+ const expectedMounts = mountContract === "legacy-alpha742" ? LEGACY_ALPHA742_MOUNTS : EXPECTED_MOUNTS;
47
+ if (root.Image !== options.expectedImage)
48
+ violations.push("image does not match the reviewed exact local Docker image ID");
49
+ if (root.Path !== "node")
50
+ violations.push("effective container path must be node");
51
+ if (JSON.stringify(root.Args) !== JSON.stringify(["/opt/ouro/dist/heart/daemon/daemon-entry.js"]))
52
+ violations.push("effective container arguments must be the direct daemon entry");
53
+ if (config.User !== "10001:10001")
54
+ violations.push("container user must be 10001:10001");
55
+ if (JSON.stringify(config.Entrypoint) !== JSON.stringify(["node", "/opt/ouro/dist/heart/daemon/daemon-entry.js"]))
56
+ violations.push("entrypoint must be the direct daemon entry");
57
+ if (!(config.Cmd === null || (Array.isArray(config.Cmd) && config.Cmd.length === 0)))
58
+ violations.push("container command must be empty");
59
+ const environment = stringArray(config.Env);
60
+ if (!environment || JSON.stringify(environment) !== JSON.stringify(options.expectedEnvironment))
61
+ violations.push("container environment must exactly match the reviewed image environment");
62
+ if (!(config.ExposedPorts === null || config.ExposedPorts === undefined || isEmptyRecord(config.ExposedPorts)))
63
+ violations.push("container must expose no ports");
64
+ if (host.NetworkMode !== "host")
65
+ violations.push("network mode must be host");
66
+ if (host.PidMode !== "")
67
+ violations.push("PID namespace must be private");
68
+ if (host.IpcMode !== "private")
69
+ violations.push("IPC namespace must be private");
70
+ if (host.Privileged !== false)
71
+ violations.push("container must not be privileged");
72
+ if (host.ReadonlyRootfs !== false)
73
+ violations.push("root filesystem mode must match the reviewed runtime");
74
+ if (!(host.SecurityOpt === null || (Array.isArray(host.SecurityOpt) && host.SecurityOpt.length === 0)))
75
+ violations.push("container must set no security options");
76
+ const restart = record(host.RestartPolicy);
77
+ if (restart?.Name !== "unless-stopped" || restart.MaximumRetryCount !== 0)
78
+ violations.push("restart policy must be unless-stopped");
79
+ if (!isEmptyRecord(host.PortBindings))
80
+ violations.push("container must publish no ports");
81
+ if (!Array.isArray(host.Devices) || host.Devices.length !== 0)
82
+ violations.push("container must have no devices");
83
+ if (!(host.CapAdd === null || (Array.isArray(host.CapAdd) && host.CapAdd.length === 0)))
84
+ violations.push("container must add no capabilities");
85
+ if (!(host.CapDrop === null || (Array.isArray(host.CapDrop) && host.CapDrop.length === 0)))
86
+ violations.push("container must drop no capabilities");
87
+ if (host.PublishAllPorts !== false)
88
+ violations.push("container must not publish all exposed ports");
89
+ if (!isEmptyRecord(network?.Ports))
90
+ violations.push("effective network ports must be empty");
91
+ const mounts = Array.isArray(root.Mounts) ? root.Mounts : [];
92
+ const normalizedMounts = mounts.map((mount) => {
93
+ const item = record(mount);
94
+ return item && item.Type === "bind" && typeof item.RW === "boolean" && typeof item.Source === "string" && typeof item.Destination === "string" && item.Propagation === "rprivate"
95
+ ? [item.Source, item.Destination, item.RW, item.Propagation]
96
+ : null;
97
+ });
98
+ if (normalizedMounts.some((mount) => mount === null)
99
+ || JSON.stringify(normalizedMounts.sort()) !== JSON.stringify(expectedMounts.map((mount) => [...mount]).sort())) {
100
+ violations.push("effective mounts do not match the selected Sanctuary mount contract");
101
+ }
102
+ }
103
+ const result = { ok: violations.length === 0, violations };
104
+ if (result.ok) {
105
+ (0, runtime_1.emitNervesEvent)({
106
+ component: "daemon",
107
+ event: "daemon.container_spec_audit_end",
108
+ message: "Sanctuary container spec audit passed",
109
+ meta: { violationCount: 0 },
110
+ });
111
+ }
112
+ else {
113
+ (0, runtime_1.emitNervesEvent)({
114
+ level: "error",
115
+ component: "daemon",
116
+ event: "daemon.container_spec_audit_error",
117
+ message: "Sanctuary container spec audit failed",
118
+ meta: { violationCount: violations.length },
119
+ });
120
+ }
121
+ return result;
122
+ }
123
+ function tagValues(xml, name) {
124
+ return [...xml.matchAll(new RegExp(`<${name}>([^<]*)</${name}>`, "gu"))]
125
+ .map((match) => match[1]);
126
+ }
127
+ function singleTag(xml, name) {
128
+ const values = tagValues(xml, name);
129
+ return values.length === 1 ? values[0] : undefined;
130
+ }
131
+ function auditSanctuaryStagedFiles(input) {
132
+ const violations = [];
133
+ let runtimePolicy;
134
+ try {
135
+ runtimePolicy = JSON.parse(input.runtimePolicyText);
136
+ }
137
+ catch {
138
+ runtimePolicy = null;
139
+ }
140
+ const policy = record(runtimePolicy);
141
+ if (policy?.scheduler !== "supercronic" || policy.updates !== "disabled" || Object.keys(policy).sort().join(",") !== "scheduler,updates") {
142
+ violations.push("container runtime policy must be exactly scheduler=supercronic and updates=disabled");
143
+ }
144
+ const configOpenCount = [...input.templateXml.matchAll(/<Config\b/gu)].length;
145
+ const configEntries = [...input.templateXml.matchAll(/<Config\b([^>]*)>([^<]*)<\/Config>/gu)];
146
+ const pathConfigs = configEntries
147
+ .map((match) => {
148
+ const type = match[1].match(/\bType="([^"]+)"/u)?.[1];
149
+ const target = match[1].match(/\bTarget="([^"]+)"/u)?.[1];
150
+ const mode = match[1].match(/\bMode="([^"]+)"/u)?.[1];
151
+ return type === "Path" && target && mode ? `${match[2]}:${target}:${mode}` : "invalid";
152
+ });
153
+ if (configOpenCount !== EXPECTED_BINDS.length
154
+ || configEntries.length !== EXPECTED_BINDS.length
155
+ || JSON.stringify([...pathConfigs].sort()) !== JSON.stringify([...EXPECTED_BINDS].sort())) {
156
+ violations.push("template Config entries must equal the canonical path binds");
157
+ }
158
+ const postArgsOpenCount = [...input.templateXml.matchAll(/<PostArgs\b/gu)].length;
159
+ const postArgs = [...input.templateXml.matchAll(/<PostArgs(?:(?:\s*\/>)|>([^<]*)<\/PostArgs>)/gu)];
160
+ if (postArgsOpenCount !== 1 || postArgs.length !== 1 || (postArgs[0]?.[1] ?? "") !== "") {
161
+ violations.push("template PostArgs must be present exactly once and empty");
162
+ }
163
+ const extraParams = singleTag(input.templateXml, "ExtraParams");
164
+ if (extraParams !== EXPECTED_EXTRA_PARAMS)
165
+ violations.push("template ExtraParams must equal the canonical user and restart flags");
166
+ const repository = singleTag(input.templateXml, "Repository");
167
+ if (!/^sha256:[a-f0-9]{64}$/u.test(input.expectedImage))
168
+ violations.push("expected image must be an exact local Docker image ID");
169
+ if (repository !== input.expectedImage)
170
+ violations.push("image does not match the reviewed exact local Docker image ID");
171
+ if (singleTag(input.templateXml, "Network") !== "host")
172
+ violations.push("network mode must be host");
173
+ if (singleTag(input.templateXml, "Privileged") !== "false")
174
+ violations.push("container must not be privileged");
175
+ return { ok: violations.length === 0, violations };
176
+ }
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PUBLIC_DAEMON_STARTUP_FAILURE_REASON = void 0;
4
+ exports.createProviderReadinessPreparationFailure = createProviderReadinessPreparationFailure;
5
+ exports.failFastContainerCredentialBootstrapStartup = failFastContainerCredentialBootstrapStartup;
6
+ exports.startDaemonAfterContainerCredentialBootstrap = startDaemonAfterContainerCredentialBootstrap;
7
+ const runtime_1 = require("../../nerves/runtime");
8
+ const daemon_tombstone_1 = require("./daemon-tombstone");
9
+ const REDACTED_BOOTSTRAP_STARTUP_ERROR = "container credential bootstrap rejected; recoverable claim retained for reconciliation";
10
+ const REDACTED_DAEMON_PREPARATION_ERROR = "provider runtime preparation failed before startup; run `ouro doctor` for diagnosis";
11
+ exports.PUBLIC_DAEMON_STARTUP_FAILURE_REASON = "startupFailurePublic";
12
+ class DaemonPreparationFailure extends Error {
13
+ name = "DaemonPreparationFailure";
14
+ }
15
+ function createProviderReadinessPreparationFailure(issues) {
16
+ const lines = ["Provider checks need attention"];
17
+ for (const issue of issues) {
18
+ lines.push(issue.summary);
19
+ lines.push(...issue.actions.map((action) => ` ${action.actor}: ${action.command}`));
20
+ }
21
+ return new DaemonPreparationFailure(lines.join("\n"));
22
+ }
23
+ function failFastContainerCredentialBootstrapStartup(input) {
24
+ failFastDaemonStartup({
25
+ exit: input.exit,
26
+ errorMessage: REDACTED_BOOTSTRAP_STARTUP_ERROR,
27
+ eventMessage: "daemon entrypoint failed before server startup",
28
+ });
29
+ }
30
+ function failFastDaemonStartup(input) {
31
+ const errorMessage = input.errorMessage;
32
+ const error = new Error(errorMessage);
33
+ try {
34
+ (0, daemon_tombstone_1.writeDaemonTombstone)(exports.PUBLIC_DAEMON_STARTUP_FAILURE_REASON, error);
35
+ }
36
+ catch {
37
+ // Exit remains mandatory even if best-effort tombstone reporting fails.
38
+ }
39
+ try {
40
+ (0, runtime_1.emitNervesEvent)({
41
+ level: "error",
42
+ component: "daemon",
43
+ event: "daemon.entry_error",
44
+ message: input.eventMessage,
45
+ meta: { error: errorMessage },
46
+ });
47
+ }
48
+ catch {
49
+ // Exit remains mandatory even if best-effort event reporting fails.
50
+ }
51
+ input.exit(1);
52
+ }
53
+ async function startDaemonAfterContainerCredentialBootstrap(input) {
54
+ try {
55
+ await input.loadBootstrap();
56
+ }
57
+ catch {
58
+ input.markStartupFailure();
59
+ failFastContainerCredentialBootstrapStartup({ exit: input.exit });
60
+ return false;
61
+ }
62
+ try {
63
+ await input.prepareDaemon?.();
64
+ }
65
+ catch (error) {
66
+ input.markStartupFailure();
67
+ const controlledMessage = error instanceof DaemonPreparationFailure ? error.message : null;
68
+ failFastDaemonStartup({
69
+ exit: input.exit,
70
+ errorMessage: controlledMessage ?? REDACTED_DAEMON_PREPARATION_ERROR,
71
+ eventMessage: controlledMessage ?? REDACTED_DAEMON_PREPARATION_ERROR,
72
+ });
73
+ return false;
74
+ }
75
+ await input.startDaemon();
76
+ return true;
77
+ }