@ouro.bot/cli 0.1.0-alpha.83 → 0.1.0-alpha.831

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 (647) 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/assets/sanctuary-host-launcher.sh +16 -0
  15. package/changelog.json +5308 -16
  16. package/deploy/unraid/Dockerfile +54 -0
  17. package/deploy/unraid/README.txt +2983 -0
  18. package/deploy/unraid/audit-container-spec.sh +4 -0
  19. package/deploy/unraid/container-runtime.json +1 -0
  20. package/deploy/unraid/docker-man-template-transaction.mjs +711 -0
  21. package/deploy/unraid/docker-man-template-xml.cjs +105 -0
  22. package/deploy/unraid/migrate-sanctuary-bundle.mjs +60 -0
  23. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  24. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  25. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  26. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  27. package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
  28. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  29. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
  30. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  31. package/deploy/unraid/sanctuary-authority-installation.json +36 -0
  32. package/deploy/unraid/sanctuary-authority-service.sh +30 -0
  33. package/deploy/unraid/sanctuary-deployment-target.mjs +710 -0
  34. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  35. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2084 -0
  36. package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
  37. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  38. package/deploy/unraid/sanctuary.ouro/agent.json +66 -0
  39. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  40. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  41. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  42. package/deploy/unraid/sanctuary.ouro/mcp/media-mcp.mjs +795 -0
  43. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  44. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  45. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
  46. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +15 -0
  47. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +25 -0
  48. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +15 -0
  49. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  50. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +135 -0
  51. package/deploy/unraid/sanctuary.xml +28 -0
  52. package/dist/a2a/card.js +57 -0
  53. package/dist/a2a/client.js +180 -0
  54. package/dist/a2a/config.js +50 -0
  55. package/dist/a2a/delegation-stores.js +56 -0
  56. package/dist/a2a/did-resolution.js +93 -0
  57. package/dist/a2a/identity.js +170 -0
  58. package/dist/a2a/inbound-share.js +107 -0
  59. package/dist/a2a/mission-result-wire.js +196 -0
  60. package/dist/a2a/onboarding.js +115 -0
  61. package/dist/a2a/pin-store.js +132 -0
  62. package/dist/a2a/seen-ledger.js +120 -0
  63. package/dist/a2a/server.js +604 -0
  64. package/dist/a2a/task-store.js +69 -0
  65. package/dist/a2a/transport.js +45 -0
  66. package/dist/a2a/types.js +3 -0
  67. package/dist/arc/attention-types.js +8 -0
  68. package/dist/arc/cares.js +360 -0
  69. package/dist/arc/episodes.js +118 -0
  70. package/dist/arc/evolution.js +490 -0
  71. package/dist/arc/flight-recorder.js +1034 -0
  72. package/dist/arc/intentions.js +134 -0
  73. package/dist/arc/json-store.js +117 -0
  74. package/dist/arc/obligations.js +386 -0
  75. package/dist/arc/packets.js +336 -0
  76. package/dist/arc/presence.js +185 -0
  77. package/dist/arc/task-lifecycle.js +57 -0
  78. package/dist/commerce/store.js +755 -0
  79. package/dist/commerce/types.js +3 -0
  80. package/dist/heart/active-work.js +798 -40
  81. package/dist/heart/agent-entry.js +252 -3
  82. package/dist/heart/approval-files.js +113 -0
  83. package/dist/heart/approval-store.js +960 -0
  84. package/dist/heart/attachments/image-normalize.js +194 -0
  85. package/dist/heart/attachments/materialize.js +97 -0
  86. package/dist/heart/attachments/originals.js +88 -0
  87. package/dist/heart/attachments/render.js +29 -0
  88. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  89. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  90. package/dist/heart/attachments/sources/index.js +18 -0
  91. package/dist/heart/attachments/sources/telegram.js +71 -0
  92. package/dist/heart/attachments/store.js +132 -0
  93. package/dist/heart/attachments/types.js +93 -0
  94. package/dist/heart/auth/auth-flow.js +495 -0
  95. package/dist/heart/autonomy-budget.js +478 -0
  96. package/dist/heart/awaiting/await-alert.js +148 -0
  97. package/dist/heart/awaiting/await-expiry.js +143 -0
  98. package/dist/heart/awaiting/await-loader.js +91 -0
  99. package/dist/heart/awaiting/await-parser.js +149 -0
  100. package/dist/heart/awaiting/await-runtime-state.js +111 -0
  101. package/dist/heart/awaiting/await-scheduler.js +382 -0
  102. package/dist/heart/background-operations.js +281 -0
  103. package/dist/heart/bridges/manager.js +137 -17
  104. package/dist/heart/bridges/store.js +14 -2
  105. package/dist/heart/bundle-state.js +168 -0
  106. package/dist/heart/commitments.js +44 -18
  107. package/dist/heart/config-registry.js +331 -0
  108. package/dist/heart/config.js +174 -131
  109. package/dist/heart/context-loss-gauntlet.js +387 -0
  110. package/dist/heart/context-loss-sentinel.js +1157 -0
  111. package/dist/heart/core.js +2169 -581
  112. package/dist/heart/cross-chat-delivery.js +9 -22
  113. package/dist/heart/daemon/agent-config-check.js +451 -0
  114. package/dist/heart/daemon/agent-discovery.js +185 -3
  115. package/dist/heart/daemon/agent-service.js +542 -0
  116. package/dist/heart/daemon/agentic-repair.js +547 -0
  117. package/dist/heart/daemon/await-private-wake.js +59 -0
  118. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  119. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  120. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  121. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  122. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  123. package/dist/heart/daemon/cadence.js +180 -0
  124. package/dist/heart/daemon/cli-defaults.js +854 -0
  125. package/dist/heart/daemon/cli-desk.js +322 -0
  126. package/dist/heart/daemon/cli-exec.js +8822 -0
  127. package/dist/heart/daemon/cli-help.js +716 -0
  128. package/dist/heart/daemon/cli-parse.js +2771 -0
  129. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  130. package/dist/heart/daemon/cli-render.js +777 -0
  131. package/dist/heart/daemon/cli-types.js +8 -0
  132. package/dist/heart/daemon/connect-bay.js +323 -0
  133. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  134. package/dist/heart/daemon/container-healthcheck.js +112 -0
  135. package/dist/heart/daemon/container-runtime.js +97 -0
  136. package/dist/heart/daemon/container-spec-auditor-main.js +171 -0
  137. package/dist/heart/daemon/container-spec-auditor.js +229 -0
  138. package/dist/heart/daemon/daemon-bootstrap-startup.js +115 -0
  139. package/dist/heart/daemon/daemon-cli.js +29 -2349
  140. package/dist/heart/daemon/daemon-entry.js +930 -11
  141. package/dist/heart/daemon/daemon-health.js +186 -0
  142. package/dist/heart/daemon/daemon-rollup.js +57 -0
  143. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  144. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  145. package/dist/heart/daemon/daemon.js +2084 -105
  146. package/dist/heart/daemon/dns-workflow.js +394 -0
  147. package/dist/heart/daemon/doctor-types.js +8 -0
  148. package/dist/heart/daemon/doctor.js +1755 -0
  149. package/dist/heart/daemon/freshness.js +345 -0
  150. package/dist/heart/daemon/habit-private-wake.js +61 -0
  151. package/dist/heart/daemon/health-monitor.js +142 -11
  152. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  153. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  154. package/dist/heart/daemon/http-health-probe.js +80 -0
  155. package/dist/heart/daemon/human-command-screens.js +234 -0
  156. package/dist/heart/daemon/human-readiness.js +114 -0
  157. package/dist/heart/daemon/inner-status.js +78 -0
  158. package/dist/heart/daemon/interactive-repair.js +394 -0
  159. package/dist/heart/daemon/launchd.js +37 -8
  160. package/dist/heart/daemon/log-tailer.js +79 -10
  161. package/dist/heart/daemon/logs-prune.js +132 -0
  162. package/dist/heart/daemon/mcp-canary.js +524 -0
  163. package/dist/heart/daemon/message-router.js +65 -5
  164. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  165. package/dist/heart/daemon/os-cron-deps.js +135 -0
  166. package/dist/heart/daemon/os-cron.js +22 -14
  167. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  168. package/dist/heart/daemon/ouro-entry.js +3 -1
  169. package/dist/heart/daemon/plugin-cli.js +432 -0
  170. package/dist/heart/daemon/process-manager.js +733 -61
  171. package/dist/heart/daemon/provider-discovery.js +137 -0
  172. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  173. package/dist/heart/daemon/prunable-bundle.js +144 -0
  174. package/dist/heart/daemon/pulse.js +511 -0
  175. package/dist/heart/daemon/readiness-repair.js +365 -0
  176. package/dist/heart/daemon/run-hooks.js +2 -0
  177. package/dist/heart/daemon/runtime-logging.js +47 -14
  178. package/dist/heart/daemon/runtime-metadata.js +2 -30
  179. package/dist/heart/daemon/runtime-mode.js +13 -2
  180. package/dist/heart/daemon/safe-mode.js +161 -0
  181. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2654 -0
  182. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1830 -0
  183. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  184. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +955 -0
  185. package/dist/heart/daemon/sanctuary-authority-codec.js +86 -0
  186. package/dist/heart/daemon/sanctuary-authority-epoch.js +256 -0
  187. package/dist/heart/daemon/sanctuary-authority-installation.js +140 -0
  188. package/dist/heart/daemon/sanctuary-authority-ledger.js +241 -0
  189. package/dist/heart/daemon/sanctuary-authority-root-lifecycle.js +819 -0
  190. package/dist/heart/daemon/sanctuary-authority-vault-migration.js +79 -0
  191. package/dist/heart/daemon/sanctuary-bundle-migration.js +729 -0
  192. package/dist/heart/daemon/sanctuary-host-authority.js +1008 -0
  193. package/dist/heart/daemon/sanctuary-host-detached-supervisor.js +494 -0
  194. package/dist/heart/daemon/sanctuary-host-executor.js +670 -0
  195. package/dist/heart/daemon/sanctuary-host-linux-kernel.js +334 -0
  196. package/dist/heart/daemon/sanctuary-host-supervisor-entry.js +207 -0
  197. package/dist/heart/daemon/sanctuary-host-supervisor.js +95 -0
  198. package/dist/heart/daemon/sanctuary-package-management.js +103 -0
  199. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  200. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  201. package/dist/heart/daemon/sanctuary-telegram-authority-entry.js +445 -0
  202. package/dist/heart/daemon/sanctuary-telegram-authority-gateway.js +585 -0
  203. package/dist/heart/daemon/sanctuary-telegram-authority-service.js +630 -0
  204. package/dist/heart/daemon/sense-manager.js +699 -48
  205. package/dist/heart/daemon/session-id-resolver.js +131 -0
  206. package/dist/heart/daemon/skill-management-installer.js +1 -1
  207. package/dist/heart/daemon/socket-client.js +180 -12
  208. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  209. package/dist/heart/daemon/startup-tui.js +339 -0
  210. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  211. package/dist/heart/daemon/task-scheduler.js +117 -39
  212. package/dist/heart/daemon/terminal-ui.js +499 -0
  213. package/dist/heart/daemon/thoughts.js +138 -54
  214. package/dist/heart/daemon/up-progress.js +366 -0
  215. package/dist/heart/daemon/vault-items.js +56 -0
  216. package/dist/heart/delegation.js +1 -4
  217. package/dist/heart/external-events/router.js +1430 -0
  218. package/dist/heart/frontend-approval-runtime.js +506 -0
  219. package/dist/heart/frontend-journal.js +215 -0
  220. package/dist/heart/frontend-session-service.js +237 -0
  221. package/dist/heart/frontend-socket-client.js +164 -0
  222. package/dist/heart/frontend-socket.js +400 -0
  223. package/dist/heart/habits/habit-cancel.js +810 -0
  224. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  225. package/dist/heart/habits/habit-migration.js +194 -0
  226. package/dist/heart/habits/habit-parser.js +278 -0
  227. package/dist/heart/habits/habit-runtime-state.js +93 -0
  228. package/dist/heart/habits/habit-scheduler.js +653 -0
  229. package/dist/heart/habits/habit-session-summary.js +318 -0
  230. package/dist/heart/habits/habit-session.js +636 -0
  231. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  232. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  233. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  234. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  235. package/dist/heart/identity.js +196 -59
  236. package/dist/heart/kept-notes.js +289 -0
  237. package/dist/heart/kicks.js +1 -1
  238. package/dist/heart/machine-identity.js +161 -0
  239. package/dist/heart/mail-import-discovery.js +356 -0
  240. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  241. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  242. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  243. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  244. package/dist/heart/mailbox/mailbox-http-transport.js +129 -0
  245. package/dist/heart/mailbox/mailbox-http.js +99 -0
  246. package/dist/heart/mailbox/mailbox-read.js +39 -0
  247. package/dist/heart/mailbox/mailbox-types.js +27 -0
  248. package/dist/heart/mailbox/mailbox-view.js +197 -0
  249. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  250. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  251. package/dist/heart/mailbox/readers/mail.js +375 -0
  252. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  253. package/dist/heart/mailbox/readers/sessions.js +231 -0
  254. package/dist/heart/mailbox/readers/shared.js +111 -0
  255. package/dist/heart/mcp/mcp-server.js +696 -0
  256. package/dist/heart/migrate-config.js +100 -0
  257. package/dist/heart/model-capabilities.js +11 -0
  258. package/dist/heart/orientation-frame.js +345 -0
  259. package/dist/heart/platform.js +81 -0
  260. package/dist/heart/primitives.js +1 -1
  261. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  262. package/dist/heart/private-runtime/index.js +18 -0
  263. package/dist/heart/private-runtime/ledger.js +221 -0
  264. package/dist/heart/private-runtime/policy.js +252 -0
  265. package/dist/heart/private-runtime/types.js +2 -0
  266. package/dist/heart/progress-story.js +1 -1
  267. package/dist/heart/provider-attempt.js +137 -0
  268. package/dist/heart/provider-binding-resolver.js +273 -0
  269. package/dist/heart/provider-credentials.js +449 -0
  270. package/dist/heart/provider-failover.js +311 -0
  271. package/dist/heart/provider-models.js +96 -0
  272. package/dist/heart/provider-ping.js +265 -0
  273. package/dist/heart/provider-readiness-cache.js +119 -0
  274. package/dist/heart/provider-visibility.js +188 -0
  275. package/dist/heart/providers/anthropic-token.js +131 -0
  276. package/dist/heart/providers/anthropic.js +173 -60
  277. package/dist/heart/providers/azure.js +23 -11
  278. package/dist/heart/providers/error-classification.js +127 -0
  279. package/dist/heart/providers/github-copilot.js +34 -38
  280. package/dist/heart/providers/minimax-vlm.js +189 -0
  281. package/dist/heart/providers/minimax.js +26 -8
  282. package/dist/heart/providers/openai-codex-token.js +349 -0
  283. package/dist/heart/providers/openai-codex.js +55 -40
  284. package/dist/heart/providers/openai-compatible.js +177 -0
  285. package/dist/heart/run-ledger.js +247 -0
  286. package/dist/heart/runtime-capability-check.js +170 -0
  287. package/dist/heart/runtime-credentials.js +607 -0
  288. package/dist/heart/runtime-cwd.js +87 -0
  289. package/dist/heart/sense-truth.js +22 -4
  290. package/dist/heart/session-activity.js +92 -24
  291. package/dist/heart/session-events.js +1504 -0
  292. package/dist/heart/session-playback-cli-main.js +5 -0
  293. package/dist/heart/session-playback-cli.js +36 -0
  294. package/dist/heart/session-playback.js +231 -0
  295. package/dist/heart/session-redaction-repair-cli-main.js +31 -0
  296. package/dist/heart/session-redaction-repair.js +552 -0
  297. package/dist/heart/session-stats-cli-main.js +5 -0
  298. package/dist/heart/session-stats.js +183 -0
  299. package/dist/heart/session-transcript.js +133 -0
  300. package/dist/heart/start-of-turn-packet.js +372 -0
  301. package/dist/heart/steward-policy.js +618 -0
  302. package/dist/heart/streaming.js +604 -207
  303. package/dist/heart/structured-output.js +196 -0
  304. package/dist/heart/sync-classification.js +176 -0
  305. package/dist/heart/sync.js +449 -0
  306. package/dist/heart/target-resolution.js +11 -7
  307. package/dist/heart/tempo.js +93 -0
  308. package/dist/heart/temporal-view.js +41 -0
  309. package/dist/heart/timeouts.js +101 -0
  310. package/dist/heart/tool-activity-callbacks.js +59 -0
  311. package/dist/heart/tool-approval.js +382 -0
  312. package/dist/heart/tool-description.js +155 -0
  313. package/dist/heart/tool-friction.js +55 -0
  314. package/dist/heart/tool-loop.js +200 -0
  315. package/dist/heart/turn-context.js +482 -0
  316. package/dist/heart/turn-execution-lease.js +30 -0
  317. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  318. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  319. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  320. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  321. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  322. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  323. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  324. package/dist/heart/versioning/update-hooks.js +154 -0
  325. package/dist/heart/versioning/version-intent.js +114 -0
  326. package/dist/heart/work-card.js +380 -0
  327. package/dist/mailbox-ui/assets/index-Cyv4mw3Y.js +1 -0
  328. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  329. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  330. package/dist/mailbox-ui/index.html +16 -0
  331. package/dist/mailroom/attention.js +167 -0
  332. package/dist/mailroom/autonomy.js +209 -0
  333. package/dist/mailroom/blob-store.js +889 -0
  334. package/dist/mailroom/body-cache.js +61 -0
  335. package/dist/mailroom/cache-sync-cli.js +58 -0
  336. package/dist/mailroom/core.js +803 -0
  337. package/dist/mailroom/entry.js +160 -0
  338. package/dist/mailroom/file-store.js +568 -0
  339. package/dist/mailroom/hosted-cache-sync.js +384 -0
  340. package/dist/mailroom/mbox-import.js +393 -0
  341. package/dist/mailroom/migration.js +164 -0
  342. package/dist/mailroom/outbound.js +380 -0
  343. package/dist/mailroom/policy.js +263 -0
  344. package/dist/mailroom/reader.js +292 -0
  345. package/dist/mailroom/search-cache.js +513 -0
  346. package/dist/mailroom/search-relevance.js +319 -0
  347. package/dist/mailroom/smtp-ingress.js +176 -0
  348. package/dist/mailroom/source-state.js +176 -0
  349. package/dist/mailroom/thread.js +109 -0
  350. package/dist/mailroom/travel-extract.js +89 -0
  351. package/dist/mind/bundle-manifest.js +24 -2
  352. package/dist/mind/context.js +309 -111
  353. package/dist/mind/desk-section.js +362 -0
  354. package/dist/mind/diary-integrity.js +60 -0
  355. package/dist/mind/{memory.js → diary.js} +68 -77
  356. package/dist/mind/embedding-provider.js +60 -0
  357. package/dist/mind/file-state.js +179 -0
  358. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  359. package/dist/mind/obligation-steering.js +199 -3
  360. package/dist/mind/pending.js +36 -10
  361. package/dist/mind/prompt-budget.js +479 -0
  362. package/dist/mind/prompt-refresh.js +3 -2
  363. package/dist/mind/prompt.js +1050 -189
  364. package/dist/mind/provenance-trust.js +26 -0
  365. package/dist/mind/record-paths.js +312 -0
  366. package/dist/mind/scrutiny.js +173 -0
  367. package/dist/mind/session-transaction.js +564 -0
  368. package/dist/nerves/cli-logging.js +7 -1
  369. package/dist/nerves/coverage/audit-rules.js +15 -6
  370. package/dist/nerves/coverage/audit.js +28 -2
  371. package/dist/nerves/coverage/cli.js +1 -1
  372. package/dist/nerves/coverage/contract.js +5 -5
  373. package/dist/nerves/coverage/file-completeness.js +139 -5
  374. package/dist/nerves/coverage/run-artifacts.js +55 -35
  375. package/dist/nerves/coverage/source-scanner.js +4 -4
  376. package/dist/nerves/event-buffer.js +111 -0
  377. package/dist/nerves/index.js +293 -9
  378. package/dist/nerves/observation.js +20 -0
  379. package/dist/nerves/redact.js +79 -0
  380. package/dist/nerves/review/cli-main.js +5 -0
  381. package/dist/nerves/review/cli.js +156 -0
  382. package/dist/nerves/review/core.js +159 -0
  383. package/dist/nerves/runtime.js +17 -1
  384. package/dist/repertoire/ado-client.js +15 -56
  385. package/dist/repertoire/ado-semantic.js +16 -10
  386. package/dist/repertoire/api-client.js +97 -0
  387. package/dist/repertoire/bitwarden-store.js +1045 -0
  388. package/dist/repertoire/bundle-templates.js +71 -0
  389. package/dist/repertoire/bw-installer.js +180 -0
  390. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  391. package/dist/repertoire/coding/context-pack.js +331 -0
  392. package/dist/repertoire/coding/feedback.js +174 -32
  393. package/dist/repertoire/coding/index.js +15 -3
  394. package/dist/repertoire/coding/manager.js +159 -10
  395. package/dist/repertoire/coding/spawner.js +58 -11
  396. package/dist/repertoire/coding/tools.js +221 -15
  397. package/dist/repertoire/coding/workbench-client.js +272 -0
  398. package/dist/repertoire/coding/workbench-manager.js +346 -0
  399. package/dist/repertoire/commerce-errors.js +109 -0
  400. package/dist/repertoire/commerce-self-test.js +156 -0
  401. package/dist/repertoire/credential-access.js +178 -0
  402. package/dist/repertoire/desk/classifier.js +362 -0
  403. package/dist/repertoire/duffel-client.js +185 -0
  404. package/dist/repertoire/github-client.js +14 -55
  405. package/dist/repertoire/graph-client.js +11 -52
  406. package/dist/repertoire/guardrails.js +811 -18
  407. package/dist/repertoire/mcp-client.js +44 -3
  408. package/dist/repertoire/mcp-manager.js +427 -139
  409. package/dist/repertoire/mcp-tools.js +124 -0
  410. package/dist/repertoire/plugin-mcp.js +175 -0
  411. package/dist/repertoire/plugins.js +253 -0
  412. package/dist/repertoire/relationship-authorization.js +322 -0
  413. package/dist/repertoire/shell-sessions.js +134 -0
  414. package/dist/repertoire/skills.js +48 -4
  415. package/dist/repertoire/stripe-client.js +131 -0
  416. package/dist/repertoire/tool-arguments.js +170 -0
  417. package/dist/repertoire/tool-results.js +29 -0
  418. package/dist/repertoire/tools-a2a.js +699 -0
  419. package/dist/repertoire/tools-attachments.js +322 -0
  420. package/dist/repertoire/tools-awaiting.js +575 -0
  421. package/dist/repertoire/tools-base.js +77 -1138
  422. package/dist/repertoire/tools-bluebubbles.js +2 -0
  423. package/dist/repertoire/tools-bridge.js +144 -0
  424. package/dist/repertoire/tools-bundle.js +993 -0
  425. package/dist/repertoire/tools-commerce.js +253 -0
  426. package/dist/repertoire/tools-config.js +186 -0
  427. package/dist/repertoire/tools-continuity.js +575 -0
  428. package/dist/repertoire/tools-credential.js +383 -0
  429. package/dist/repertoire/tools-evolution.js +527 -0
  430. package/dist/repertoire/tools-files.js +344 -0
  431. package/dist/repertoire/tools-flight.js +290 -0
  432. package/dist/repertoire/tools-flow.js +119 -0
  433. package/dist/repertoire/tools-github.js +3 -8
  434. package/dist/repertoire/tools-habits.js +103 -0
  435. package/dist/repertoire/tools-mail.js +1828 -0
  436. package/dist/repertoire/tools-notes.js +485 -0
  437. package/dist/repertoire/tools-obligations.js +182 -0
  438. package/dist/repertoire/tools-orientation.js +31 -0
  439. package/dist/repertoire/tools-record.js +482 -0
  440. package/dist/repertoire/tools-rsvp.js +139 -0
  441. package/dist/repertoire/tools-runtime.js +150 -0
  442. package/dist/repertoire/tools-sanctuary-host.js +202 -0
  443. package/dist/repertoire/tools-session.js +1133 -0
  444. package/dist/repertoire/tools-shell.js +149 -0
  445. package/dist/repertoire/tools-steward-policy.js +119 -0
  446. package/dist/repertoire/tools-stripe.js +224 -0
  447. package/dist/repertoire/tools-surface.js +369 -0
  448. package/dist/repertoire/tools-teams.js +12 -39
  449. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  450. package/dist/repertoire/tools-travel.js +125 -0
  451. package/dist/repertoire/tools-trip.js +982 -0
  452. package/dist/repertoire/tools-unraid.js +531 -0
  453. package/dist/repertoire/tools-user-profile.js +146 -0
  454. package/dist/repertoire/tools-vault.js +40 -0
  455. package/dist/repertoire/tools-voice.js +145 -0
  456. package/dist/repertoire/tools.js +494 -148
  457. package/dist/repertoire/travel-api-client.js +360 -0
  458. package/dist/repertoire/unraid-client.js +155 -0
  459. package/dist/repertoire/unraid-restart.js +339 -0
  460. package/dist/repertoire/user-profile.js +131 -0
  461. package/dist/repertoire/vault-setup.js +246 -0
  462. package/dist/repertoire/vault-unlock.js +628 -0
  463. package/dist/rsvp/aisleplanner-client.js +354 -0
  464. package/dist/rsvp/cli.js +926 -0
  465. package/dist/rsvp/config.js +327 -0
  466. package/dist/rsvp/cutover.js +433 -0
  467. package/dist/rsvp/diagnostics.js +232 -0
  468. package/dist/rsvp/diff-renderer.js +176 -0
  469. package/dist/rsvp/habit-policy.js +110 -0
  470. package/dist/rsvp/habit-stage.js +123 -0
  471. package/dist/rsvp/incident-bundle.js +97 -0
  472. package/dist/rsvp/migration.js +204 -0
  473. package/dist/rsvp/native-habit-runner.js +630 -0
  474. package/dist/rsvp/outbound-state.js +628 -0
  475. package/dist/rsvp/query.js +118 -0
  476. package/dist/rsvp/replay.js +233 -0
  477. package/dist/rsvp/snapshot.js +232 -0
  478. package/dist/rsvp/spend-ledger.js +175 -0
  479. package/dist/scripts/claude-code-hook.js +41 -0
  480. package/dist/scripts/claude-code-stop-hook.js +47 -0
  481. package/dist/senses/a2a-entry.js +115 -0
  482. package/dist/senses/acp-server.js +386 -0
  483. package/dist/senses/attention-queue.js +186 -0
  484. package/dist/senses/await-turn-message.js +58 -0
  485. package/dist/senses/bluebubbles/active-turns.js +216 -0
  486. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  487. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  488. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +355 -40
  489. package/dist/senses/bluebubbles/context-packet.js +207 -0
  490. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  491. package/dist/senses/bluebubbles/entry.js +90 -0
  492. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  493. package/dist/senses/bluebubbles/index.js +3841 -0
  494. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  495. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  496. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  497. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  498. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  499. package/dist/senses/bluebubbles/processed-log.js +133 -0
  500. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  501. package/dist/senses/bluebubbles/replay.js +284 -0
  502. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  503. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  504. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  505. package/dist/senses/bluebubbles/webhook-registration.js +228 -0
  506. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  507. package/dist/senses/cli/bracketed-paste.js +82 -0
  508. package/dist/senses/cli/image-paste.js +287 -0
  509. package/dist/senses/cli/image-ref-navigation.js +75 -0
  510. package/dist/senses/cli/ink-app.js +156 -0
  511. package/dist/senses/cli/inline-diff.js +64 -0
  512. package/dist/senses/cli/input-keys.js +174 -0
  513. package/dist/senses/cli/kill-ring.js +86 -0
  514. package/dist/senses/cli/message-list.js +51 -0
  515. package/dist/senses/cli/ouro-tui.js +607 -0
  516. package/dist/senses/cli/spinner-imperative.js +135 -0
  517. package/dist/senses/cli/spinner.js +101 -0
  518. package/dist/senses/cli/status-line.js +60 -0
  519. package/dist/senses/cli/streaming-markdown.js +526 -0
  520. package/dist/senses/cli/tool-display.js +85 -0
  521. package/dist/senses/cli/tool-render.js +85 -0
  522. package/dist/senses/cli/tui-store.js +241 -0
  523. package/dist/senses/cli/virtual-list.js +35 -0
  524. package/dist/senses/cli-entry.js +60 -8
  525. package/dist/senses/cli.js +604 -320
  526. package/dist/senses/commands.js +66 -3
  527. package/dist/senses/context-packet-ledger.js +371 -0
  528. package/dist/senses/context-packets.js +154 -0
  529. package/dist/senses/habit-lifecycle-guard.js +24 -0
  530. package/dist/senses/habit-turn-message.js +160 -0
  531. package/dist/senses/ingress-evidence.js +2 -0
  532. package/dist/senses/mail-entry.js +66 -0
  533. package/dist/senses/mail.js +524 -0
  534. package/dist/senses/pipeline.js +1115 -204
  535. package/dist/senses/private-runtime-worker.js +859 -0
  536. package/dist/senses/private-runtime.js +1517 -0
  537. package/dist/senses/proactive-content-guard.js +51 -0
  538. package/dist/senses/root-host-approval-port.js +345 -0
  539. package/dist/senses/root-host-approval-runtime.js +393 -0
  540. package/dist/senses/sanctuary-authority-resident.js +102 -0
  541. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  542. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  543. package/dist/senses/sanctuary-grounding.js +118 -0
  544. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  545. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  546. package/dist/senses/sanctuary-health-runner.js +100 -0
  547. package/dist/senses/sanctuary-health.js +408 -0
  548. package/dist/senses/sanctuary-install-state-contract.js +126 -0
  549. package/dist/senses/sanctuary-interactive-control.js +410 -0
  550. package/dist/senses/sanctuary-media-catalog-contract.js +297 -0
  551. package/dist/senses/sanctuary-media-optimization.js +514 -0
  552. package/dist/senses/sanctuary-runtime.js +340 -0
  553. package/dist/senses/sanctuary-sab.js +85 -0
  554. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  555. package/dist/senses/shared-turn.js +772 -0
  556. package/dist/senses/surface-tool.js +109 -0
  557. package/dist/senses/teams-entry.js +60 -8
  558. package/dist/senses/teams.js +519 -218
  559. package/dist/senses/telegram-admission.js +718 -0
  560. package/dist/senses/telegram-approval-runtime.js +793 -0
  561. package/dist/senses/telegram-attachments.js +186 -0
  562. package/dist/senses/telegram-audit-ledger.js +220 -0
  563. package/dist/senses/telegram-authority-transport.js +231 -0
  564. package/dist/senses/telegram-client.js +1749 -0
  565. package/dist/senses/telegram-effect-adapter.js +896 -0
  566. package/dist/senses/telegram-entry.js +83 -0
  567. package/dist/senses/telegram.js +2324 -0
  568. package/dist/senses/trust-gate.js +104 -9
  569. package/dist/senses/voice/audio-playback.js +237 -0
  570. package/dist/senses/voice/audio-routing.js +119 -0
  571. package/dist/senses/voice/elevenlabs.js +202 -0
  572. package/dist/senses/voice/floor-control.js +431 -0
  573. package/dist/senses/voice/floor-controller.js +115 -0
  574. package/dist/senses/voice/golden-path.js +116 -0
  575. package/dist/senses/voice/index.js +29 -0
  576. package/dist/senses/voice/meeting.js +113 -0
  577. package/dist/senses/voice/outbound.js +190 -0
  578. package/dist/senses/voice/phone.js +33 -0
  579. package/dist/senses/voice/playback.js +139 -0
  580. package/dist/senses/voice/realtime-eval.js +496 -0
  581. package/dist/senses/voice/realtime-trace.js +531 -0
  582. package/dist/senses/voice/transcript.js +70 -0
  583. package/dist/senses/voice/turn.js +191 -0
  584. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  585. package/dist/senses/voice/twilio-phone.js +5031 -0
  586. package/dist/senses/voice/types.js +2 -0
  587. package/dist/senses/voice/whisper.js +161 -0
  588. package/dist/senses/voice-entry.js +81 -0
  589. package/dist/senses/voice-realtime-eval-command.js +99 -0
  590. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  591. package/dist/senses/voice-twilio-entry.js +87 -0
  592. package/dist/trips/core.js +138 -0
  593. package/dist/trips/store.js +265 -0
  594. package/dist/util/frontmatter.js +69 -0
  595. package/npm-shrinkwrap.json +8138 -0
  596. package/package.json +72 -13
  597. package/skills/agent-commerce.md +113 -0
  598. package/skills/browser-navigation.md +117 -0
  599. package/skills/commerce-setup-guide.md +116 -0
  600. package/skills/commerce-setup.md +84 -0
  601. package/skills/configure-dev-tools.md +99 -0
  602. package/skills/travel-planning.md +138 -0
  603. package/dist/heart/daemon/auth-flow.js +0 -430
  604. package/dist/heart/daemon/ouro-path-installer.js +0 -260
  605. package/dist/heart/daemon/ouro-version-manager.js +0 -171
  606. package/dist/heart/daemon/update-hooks.js +0 -138
  607. package/dist/heart/obligations.js +0 -191
  608. package/dist/heart/safe-workspace.js +0 -228
  609. package/dist/heart/session-recall.js +0 -116
  610. package/dist/mind/friends/channel.js +0 -84
  611. package/dist/mind/friends/group-context.js +0 -144
  612. package/dist/mind/friends/resolver.js +0 -84
  613. package/dist/mind/friends/store-file.js +0 -190
  614. package/dist/mind/friends/store.js +0 -4
  615. package/dist/mind/friends/tokens.js +0 -26
  616. package/dist/mind/friends/trust-explanation.js +0 -74
  617. package/dist/mind/friends/types.js +0 -29
  618. package/dist/repertoire/tasks/board.js +0 -134
  619. package/dist/repertoire/tasks/index.js +0 -224
  620. package/dist/repertoire/tasks/lifecycle.js +0 -80
  621. package/dist/repertoire/tasks/middleware.js +0 -65
  622. package/dist/repertoire/tasks/parser.js +0 -173
  623. package/dist/repertoire/tasks/scanner.js +0 -132
  624. package/dist/repertoire/tasks/transitions.js +0 -144
  625. package/dist/senses/bluebubbles-entry.js +0 -13
  626. package/dist/senses/bluebubbles.js +0 -1181
  627. package/dist/senses/debug-activity.js +0 -154
  628. package/dist/senses/inner-dialog-worker.js +0 -90
  629. package/dist/senses/inner-dialog.js +0 -525
  630. package/subagents/README.md +0 -7
  631. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  632. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  633. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  634. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  635. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  636. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  637. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  638. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  639. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  640. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  641. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  642. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  643. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  644. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  645. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  646. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  647. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,854 @@
1
+ "use strict";
2
+ /**
3
+ * CLI default dependency wiring.
4
+ *
5
+ * Creates the production OuroCliDeps with real filesystem, socket, and
6
+ * process bindings. Tests inject mocks for all of these.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.defaultStartDaemonProcess = defaultStartDaemonProcess;
43
+ exports.defaultStartDaemonForFrontend = defaultStartDaemonForFrontend;
44
+ exports.readFirstBundleMetaVersion = readFirstBundleMetaVersion;
45
+ exports.isDaemonLaunchAgentLoaded = isDaemonLaunchAgentLoaded;
46
+ exports.waitForBootstrappedDaemonSocket = waitForBootstrappedDaemonSocket;
47
+ exports.defaultListDiscoveredAgents = defaultListDiscoveredAgents;
48
+ exports.defaultRunSerpentGuide = defaultRunSerpentGuide;
49
+ exports.createDefaultOuroCliDeps = createDefaultOuroCliDeps;
50
+ const child_process_1 = require("child_process");
51
+ const fs = __importStar(require("fs"));
52
+ const os = __importStar(require("os"));
53
+ const path = __importStar(require("path"));
54
+ const identity_1 = require("../identity");
55
+ const runtime_1 = require("../../nerves/runtime");
56
+ const ouro_path_installer_1 = require("../versioning/ouro-path-installer");
57
+ const ouro_uti_1 = require("../versioning/ouro-uti");
58
+ const ouro_version_manager_1 = require("../versioning/ouro-version-manager");
59
+ const update_checker_1 = require("../versioning/update-checker");
60
+ const skill_management_installer_1 = require("./skill-management-installer");
61
+ const hatch_flow_1 = require("../hatch/hatch-flow");
62
+ const specialist_orchestrator_1 = require("../hatch/specialist-orchestrator");
63
+ const specialist_prompt_1 = require("../hatch/specialist-prompt");
64
+ const specialist_tools_1 = require("../hatch/specialist-tools");
65
+ const runtime_mode_1 = require("./runtime-mode");
66
+ const agent_discovery_1 = require("./agent-discovery");
67
+ const bundle_manifest_1 = require("../../mind/bundle-manifest");
68
+ const ouro_bot_global_installer_1 = require("../versioning/ouro-bot-global-installer");
69
+ const version_intent_1 = require("../versioning/version-intent");
70
+ const logs_prune_1 = require("./logs-prune");
71
+ const daemon_health_1 = require("./daemon-health");
72
+ const log_tailer_1 = require("./log-tailer");
73
+ const launchd_1 = require("./launchd");
74
+ const socket_client_1 = require("./socket-client");
75
+ const session_activity_1 = require("../session-activity");
76
+ const auth_flow_1 = require("../auth/auth-flow");
77
+ const provider_models_1 = require("../provider-models");
78
+ const cli_parse_1 = require("./cli-parse");
79
+ const provider_discovery_1 = require("./provider-discovery");
80
+ const provider_credentials_1 = require("../provider-credentials");
81
+ const startup_tui_1 = require("./startup-tui");
82
+ const daemon_tombstone_1 = require("./daemon-tombstone");
83
+ // ── Default implementations ──
84
+ function spawnDetachedDaemonProcess(socketPath, environment = process.env) {
85
+ const entry = path.join((0, identity_1.getRepoRoot)(), "dist", "heart", "daemon", "daemon-entry.js");
86
+ // Redirect stdio to /dev/null via file descriptors — using 'ignore' causes EPIPE
87
+ // when the daemon's logging system writes to stderr after the parent exits.
88
+ const outFd = fs.openSync(os.devNull, "w");
89
+ const errFd = fs.openSync(os.devNull, "w");
90
+ const child = (0, child_process_1.spawn)(process.execPath, [entry, "--socket", socketPath], {
91
+ detached: true,
92
+ stdio: ["ignore", outFd, errFd],
93
+ env: environment,
94
+ });
95
+ child.unref();
96
+ // Don't close fds — the child process needs them. They'll be cleaned up when the parent exits.
97
+ return { pid: child.pid ?? null };
98
+ }
99
+ async function defaultStartDaemonProcess(socketPath) {
100
+ const launchdStarted = await startDaemonProcessViaLaunchd(socketPath);
101
+ if (launchdStarted)
102
+ return launchdStarted;
103
+ return spawnDetachedDaemonProcess(socketPath);
104
+ }
105
+ async function defaultStartDaemonForFrontend(socketPath, agent) {
106
+ if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(agent)) {
107
+ throw new Error("frontend daemon startup requires a safe agent name");
108
+ }
109
+ if (process.platform === "darwin") {
110
+ bootoutDaemonLaunchAgentLabel(currentUserUid());
111
+ }
112
+ return spawnDetachedDaemonProcess(socketPath, {
113
+ ...process.env,
114
+ OURO_DAEMON_REQUIRED_AGENT: agent,
115
+ });
116
+ }
117
+ function defaultWriteStdout(text) {
118
+ process.stdout.write(text.endsWith("\n") ? text : `${text}\n`);
119
+ }
120
+ /* v8 ignore start -- thin terminal adapter around process stdout @preserve */
121
+ function defaultWriteRaw(text) {
122
+ process.stdout.write(text);
123
+ }
124
+ /* v8 ignore stop */
125
+ function resolveDaemonBootEntryPath(homeDir) {
126
+ const repoRoot = (0, identity_1.getRepoRoot)();
127
+ const versionManagerRootMarker = `${path.sep}.ouro-cli${path.sep}versions${path.sep}`;
128
+ if ((0, runtime_mode_1.detectRuntimeMode)(repoRoot) === "production" && repoRoot.includes(versionManagerRootMarker)) {
129
+ return path.join((0, ouro_version_manager_1.getOuroCliHome)(homeDir), "CurrentVersion", "node_modules", "@ouro.bot", "cli", "dist", "heart", "daemon", "daemon-entry.js");
130
+ }
131
+ return path.join(repoRoot, "dist", "heart", "daemon", "daemon-entry.js");
132
+ }
133
+ /**
134
+ * Read the runtimeVersion from the first .ouro bundle's bundle-meta.json.
135
+ * Returns undefined if none found or unreadable.
136
+ */
137
+ function readFirstBundleMetaVersion(bundlesRoot) {
138
+ try {
139
+ if (!fs.existsSync(bundlesRoot))
140
+ return undefined;
141
+ const entries = fs.readdirSync(bundlesRoot, { withFileTypes: true });
142
+ for (const entry of entries) {
143
+ /* v8 ignore next -- skip non-.ouro dirs: tested via version-detect tests @preserve */
144
+ if (!entry.isDirectory() || !entry.name.endsWith(".ouro"))
145
+ continue;
146
+ const agentJsonPath = path.join(bundlesRoot, entry.name, "agent.json");
147
+ if (entry.name === "default.ouro" && !fs.existsSync(agentJsonPath))
148
+ continue;
149
+ const metaPath = path.join(bundlesRoot, entry.name, "bundle-meta.json");
150
+ if (!fs.existsSync(metaPath))
151
+ continue;
152
+ const raw = fs.readFileSync(metaPath, "utf-8");
153
+ const meta = JSON.parse(raw);
154
+ if (meta.runtimeVersion)
155
+ return meta.runtimeVersion;
156
+ }
157
+ }
158
+ catch {
159
+ // Best effort — return undefined on any error
160
+ }
161
+ return undefined;
162
+ }
163
+ function defaultCleanupStaleSocket(socketPath) {
164
+ if (fs.existsSync(socketPath)) {
165
+ fs.unlinkSync(socketPath);
166
+ }
167
+ }
168
+ function defaultReadHealthUpdatedAt(healthPath) {
169
+ try {
170
+ return fs.statSync(healthPath).mtimeMs;
171
+ }
172
+ catch {
173
+ return null;
174
+ }
175
+ }
176
+ function defaultReadRecentDaemonLogLines(lines = 10) {
177
+ const files = (0, log_tailer_1.discoverLogFiles)({});
178
+ const recentLines = [];
179
+ for (const file of files) {
180
+ recentLines.push(...(0, log_tailer_1.readLastLines)(file, lines, fs.readFileSync));
181
+ }
182
+ return recentLines.slice(-lines).map((line) => (0, log_tailer_1.formatLogLine)(line));
183
+ }
184
+ /* v8 ignore start -- CLI npm registry fetch wrapper: integration code @preserve */
185
+ async function defaultFetchCliRegistryJson(timeoutMs) {
186
+ const controller = new AbortController();
187
+ const timeoutId = setTimeout(() => {
188
+ controller.abort();
189
+ }, timeoutMs);
190
+ try {
191
+ const res = await fetch("https://registry.npmjs.org/@ouro.bot/cli", {
192
+ signal: controller.signal,
193
+ });
194
+ return res.json();
195
+ }
196
+ catch (error) {
197
+ if (error instanceof Error && error.name === "AbortError") {
198
+ throw new Error(`update check timed out after ${Math.max(1, Math.round(timeoutMs / 1000))}s`);
199
+ }
200
+ throw error;
201
+ }
202
+ finally {
203
+ clearTimeout(timeoutId);
204
+ }
205
+ }
206
+ /* v8 ignore stop */
207
+ function defaultSleep(ms) {
208
+ return new Promise((resolve) => setTimeout(resolve, ms));
209
+ }
210
+ function defaultSpawnBackgroundCli(argv) {
211
+ const child = (0, child_process_1.spawn)(process.execPath, argv, {
212
+ detached: true,
213
+ stdio: "ignore",
214
+ });
215
+ child.unref();
216
+ return Promise.resolve({ pid: child.pid ?? null });
217
+ }
218
+ function defaultFallbackPendingMessage(command) {
219
+ const inboxDir = path.join((0, identity_1.getAgentBundlesRoot)(), `${command.to}.ouro`, "inbox");
220
+ const pendingPath = path.join(inboxDir, "pending.jsonl");
221
+ const queuedAt = new Date().toISOString();
222
+ const payload = {
223
+ from: command.from,
224
+ to: command.to,
225
+ content: command.content,
226
+ priority: command.priority ?? "normal",
227
+ sessionId: command.sessionId,
228
+ taskRef: command.taskRef,
229
+ queuedAt,
230
+ };
231
+ fs.mkdirSync(inboxDir, { recursive: true });
232
+ fs.appendFileSync(pendingPath, `${JSON.stringify(payload)}\n`, "utf-8");
233
+ (0, runtime_1.emitNervesEvent)({
234
+ level: "warn",
235
+ component: "daemon",
236
+ event: "daemon.message_fallback_queued",
237
+ message: "queued message to pending fallback file",
238
+ meta: {
239
+ to: command.to,
240
+ path: pendingPath,
241
+ sessionId: command.sessionId ?? null,
242
+ taskRef: command.taskRef ?? null,
243
+ },
244
+ });
245
+ return pendingPath;
246
+ }
247
+ function currentUserUid() {
248
+ return process.getuid?.() ?? 0;
249
+ }
250
+ function launchAgentDomain(userUid = currentUserUid()) {
251
+ return `gui/${userUid}`;
252
+ }
253
+ function writeDaemonBootPlist(socketPath) {
254
+ const homeDir = os.homedir();
255
+ const writeDeps = {
256
+ writeFile: (filePath, content) => fs.writeFileSync(filePath, content, "utf-8"),
257
+ mkdirp: (dir) => fs.mkdirSync(dir, { recursive: true }),
258
+ homeDir,
259
+ };
260
+ const entryPath = resolveDaemonBootEntryPath(homeDir);
261
+ /* v8 ignore next -- covered via mock in daemon-cli-defaults.test.ts; v8 on CI attributes the real fs.existsSync branch to the non-mock load @preserve */
262
+ if (!fs.existsSync(entryPath)) {
263
+ (0, runtime_1.emitNervesEvent)({
264
+ level: "warn",
265
+ component: "daemon",
266
+ event: "daemon.entry_path_missing",
267
+ message: "entryPath does not exist on disk — plist may point to a stale location. Run 'ouro daemon install' from the correct location.",
268
+ meta: { entryPath },
269
+ });
270
+ }
271
+ return (0, launchd_1.writeLaunchAgentPlist)(writeDeps, {
272
+ nodePath: process.execPath,
273
+ entryPath,
274
+ socketPath,
275
+ logDir: path.join((0, ouro_version_manager_1.getOuroCliHome)(homeDir), "daemon", "logs"),
276
+ envPath: process.env.PATH,
277
+ });
278
+ }
279
+ function isDaemonLaunchAgentLoaded(deps) {
280
+ const userUid = deps?.userUid ?? currentUserUid();
281
+ const exec = deps?.exec ?? ((cmd) => { (0, child_process_1.execSync)(cmd, { stdio: "ignore" }); });
282
+ try {
283
+ exec(`launchctl print ${launchAgentDomain(userUid)}/${launchd_1.DAEMON_PLIST_LABEL}`);
284
+ return true;
285
+ }
286
+ catch {
287
+ return false;
288
+ }
289
+ }
290
+ function readDaemonLaunchAgentPid() {
291
+ try {
292
+ const output = (0, child_process_1.execSync)(`launchctl print ${launchAgentDomain()}/${launchd_1.DAEMON_PLIST_LABEL}`, { encoding: "utf-8" });
293
+ const match = output.match(/^\s*pid = (\d+)/m);
294
+ return match ? Number(match[1]) : null;
295
+ }
296
+ catch {
297
+ return null;
298
+ }
299
+ }
300
+ function launchdExec(cmd) {
301
+ (0, child_process_1.execSync)(cmd, { stdio: "ignore" });
302
+ }
303
+ function bootstrapDaemonLaunchAgent(domain, plistPath) {
304
+ launchdExec(`launchctl bootstrap ${domain} "${plistPath}"`);
305
+ }
306
+ function kickstartDaemonLaunchAgent(domain) {
307
+ launchdExec(`launchctl kickstart -k ${domain}/${launchd_1.DAEMON_PLIST_LABEL}`);
308
+ }
309
+ function bootoutDaemonLaunchAgentLabel(userUid) {
310
+ (0, launchd_1.bootoutLaunchAgentByLabel)({
311
+ exec: launchdExec,
312
+ userUid,
313
+ });
314
+ }
315
+ async function waitForBootstrappedDaemonSocket(socketPath, deps = {}) {
316
+ const checkSocketAlive = deps.checkSocketAlive ?? socket_client_1.checkDaemonSocketAlive;
317
+ const now = deps.now ?? Date.now;
318
+ const sleep = deps.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
319
+ const timeoutMs = deps.timeoutMs ?? 30_000;
320
+ const initialSettleMs = deps.initialSettleMs ?? 1_000;
321
+ const pollIntervalMs = deps.pollIntervalMs ?? 250;
322
+ const requiredConsecutiveAliveChecks = deps.requiredConsecutiveAliveChecks ?? 2;
323
+ const deadline = now() + timeoutMs;
324
+ const firstTrustworthyCheckAt = now() + initialSettleMs;
325
+ let consecutiveAliveChecks = 0;
326
+ while (now() < deadline) {
327
+ await sleep(pollIntervalMs);
328
+ if (now() < firstTrustworthyCheckAt)
329
+ continue;
330
+ if (await checkSocketAlive(socketPath)) {
331
+ consecutiveAliveChecks += 1;
332
+ if (consecutiveAliveChecks >= requiredConsecutiveAliveChecks)
333
+ return;
334
+ }
335
+ else {
336
+ consecutiveAliveChecks = 0;
337
+ }
338
+ }
339
+ (0, runtime_1.emitNervesEvent)({
340
+ level: "warn",
341
+ component: "daemon",
342
+ event: "daemon.launchd_bootstrap_socket_wait_timeout",
343
+ message: "launchd bootstrap finished but daemon socket did not settle before timeout",
344
+ meta: { socketPath },
345
+ });
346
+ }
347
+ async function startDaemonProcessViaLaunchd(socketPath) {
348
+ if (process.platform !== "darwin") {
349
+ return null;
350
+ }
351
+ const plistPath = writeDaemonBootPlist(socketPath);
352
+ const userUid = currentUserUid();
353
+ const domain = launchAgentDomain(userUid);
354
+ try {
355
+ (0, runtime_1.emitNervesEvent)({
356
+ component: "daemon",
357
+ event: "daemon.launchd_bootstrap_start",
358
+ message: "starting daemon launch agent for current login session",
359
+ meta: { plistPath, label: launchd_1.DAEMON_PLIST_LABEL },
360
+ });
361
+ if (isDaemonLaunchAgentLoaded({ exec: launchdExec, userUid })) {
362
+ try {
363
+ kickstartDaemonLaunchAgent(domain);
364
+ }
365
+ catch (error) {
366
+ (0, runtime_1.emitNervesEvent)({
367
+ level: "warn",
368
+ component: "daemon",
369
+ event: "daemon.launchd_kickstart_recovering",
370
+ message: "daemon launch agent kickstart failed; clearing label and bootstrapping from plist",
371
+ meta: { plistPath, label: launchd_1.DAEMON_PLIST_LABEL, error: error instanceof Error ? error.message : String(error) },
372
+ });
373
+ try {
374
+ bootoutDaemonLaunchAgentLabel(userUid);
375
+ bootstrapDaemonLaunchAgent(domain, plistPath);
376
+ }
377
+ catch (repairError) {
378
+ (0, runtime_1.emitNervesEvent)({
379
+ level: "warn",
380
+ component: "daemon",
381
+ event: "daemon.launchd_kickstart_recovery_error",
382
+ message: "daemon launch agent kickstart recovery failed; preserving launchd ownership instead of falling back to detached spawn",
383
+ meta: {
384
+ plistPath,
385
+ label: launchd_1.DAEMON_PLIST_LABEL,
386
+ kickstartError: error instanceof Error ? error.message : String(error),
387
+ recoveryError: repairError instanceof Error ? repairError.message : String(repairError),
388
+ },
389
+ });
390
+ return { pid: readDaemonLaunchAgentPid() };
391
+ }
392
+ }
393
+ }
394
+ else {
395
+ bootstrapDaemonLaunchAgent(domain, plistPath);
396
+ }
397
+ (0, runtime_1.emitNervesEvent)({
398
+ component: "daemon",
399
+ event: "daemon.launchd_bootstrap_end",
400
+ message: "daemon launch agent started for current login session",
401
+ meta: { plistPath, label: launchd_1.DAEMON_PLIST_LABEL },
402
+ });
403
+ await waitForBootstrappedDaemonSocket(socketPath);
404
+ return { pid: readDaemonLaunchAgentPid() };
405
+ }
406
+ catch (error) {
407
+ (0, runtime_1.emitNervesEvent)({
408
+ level: "warn",
409
+ component: "daemon",
410
+ event: "daemon.launchd_bootstrap_error",
411
+ message: "failed to start daemon launch agent for current login session",
412
+ meta: { plistPath, label: launchd_1.DAEMON_PLIST_LABEL, error: error instanceof Error ? error.message : String(error) },
413
+ });
414
+ return null;
415
+ }
416
+ }
417
+ async function defaultEnsureDaemonBootPersistence(socketPath) {
418
+ if (process.platform !== "darwin") {
419
+ return;
420
+ }
421
+ const plistPath = writeDaemonBootPlist(socketPath);
422
+ const userUid = currentUserUid();
423
+ if (isDaemonLaunchAgentLoaded({ exec: launchdExec, userUid })) {
424
+ (0, runtime_1.emitNervesEvent)({
425
+ component: "daemon",
426
+ event: "daemon.launchd_bootstrap_skipped_loaded",
427
+ message: "daemon launch agent already loaded",
428
+ meta: { plistPath, label: launchd_1.DAEMON_PLIST_LABEL },
429
+ });
430
+ return;
431
+ }
432
+ }
433
+ function defaultPrepareDaemonRuntimeReplacement() {
434
+ if (process.platform !== "darwin") {
435
+ return;
436
+ }
437
+ (0, launchd_1.bootoutLaunchAgentByLabel)({
438
+ exec: launchdExec,
439
+ userUid: process.getuid?.() ?? 0,
440
+ });
441
+ // launchctl bootout may return before the old daemon's SIGTERM cleanup has
442
+ // finished unlinking its Unix socket. Give that cleanup a short chance to
443
+ // settle before the replacement daemon binds the same socket path.
444
+ (0, child_process_1.execSync)("/bin/sleep 1", { stdio: "ignore" });
445
+ }
446
+ async function defaultPromptInput(question) {
447
+ const readline = await Promise.resolve().then(() => __importStar(require("readline/promises")));
448
+ const rl = readline.createInterface({
449
+ input: process.stdin,
450
+ output: process.stdout,
451
+ });
452
+ try {
453
+ const response = await rl.question(question);
454
+ return response.trim();
455
+ }
456
+ finally {
457
+ rl.close();
458
+ }
459
+ }
460
+ async function defaultPromptSecret(question) {
461
+ if (process.stdin.isTTY !== true || process.stdout.isTTY !== true) {
462
+ throw new Error("vault unlock secret entry requires an interactive terminal so the secret can be hidden. Re-run this command in a terminal and enter the human-chosen secret when prompted.");
463
+ }
464
+ const readline = await Promise.resolve().then(() => __importStar(require("readline")));
465
+ const rl = readline.createInterface({
466
+ input: process.stdin,
467
+ output: process.stdout,
468
+ terminal: true,
469
+ });
470
+ const mutableRl = rl;
471
+ const originalWriteToOutput = mutableRl._writeToOutput;
472
+ let muted = false;
473
+ if (originalWriteToOutput) {
474
+ mutableRl._writeToOutput = (stringToWrite) => {
475
+ if (!muted) {
476
+ originalWriteToOutput.call(rl, stringToWrite);
477
+ }
478
+ };
479
+ }
480
+ try {
481
+ const response = await new Promise((resolve) => {
482
+ rl.question(question, (answer) => {
483
+ process.stdout.write("\n");
484
+ resolve(answer);
485
+ });
486
+ muted = true;
487
+ });
488
+ return response.trim();
489
+ }
490
+ finally {
491
+ if (originalWriteToOutput) {
492
+ mutableRl._writeToOutput = originalWriteToOutput;
493
+ }
494
+ rl.close();
495
+ }
496
+ }
497
+ function defaultListDiscoveredAgents() {
498
+ return (0, agent_discovery_1.listEnabledBundleAgents)({
499
+ bundlesRoot: (0, identity_1.getAgentBundlesRoot)(),
500
+ readdirSync: fs.readdirSync,
501
+ readFileSync: fs.readFileSync,
502
+ });
503
+ }
504
+ // ── Serpent guide (interactive hatch) ──
505
+ /* v8 ignore start -- integration: interactive terminal specialist session @preserve */
506
+ async function defaultRunSerpentGuide() {
507
+ const { runCliSession } = await Promise.resolve().then(() => __importStar(require("../../senses/cli")));
508
+ const { setAgentName, setAgentConfigOverride } = await Promise.resolve().then(() => __importStar(require("../identity")));
509
+ const readlinePromises = await Promise.resolve().then(() => __importStar(require("readline/promises")));
510
+ const crypto = await Promise.resolve().then(() => __importStar(require("crypto")));
511
+ // Phase 1: cold CLI — collect provider/credentials with a simple readline
512
+ const coldRl = readlinePromises.createInterface({ input: process.stdin, output: process.stdout });
513
+ const coldPrompt = async (q) => {
514
+ const answer = await coldRl.question(q);
515
+ return answer.trim();
516
+ };
517
+ let providerRaw;
518
+ let credentials = {};
519
+ let providerConfig = {};
520
+ let selectedCredentialPayload = {};
521
+ const tempDir = path.join(os.tmpdir(), `ouro-hatch-${crypto.randomUUID()}`);
522
+ try {
523
+ const discovered = [];
524
+ const existingBundles = (0, specialist_orchestrator_1.listExistingBundles)((0, identity_1.getAgentBundlesRoot)());
525
+ const existingBundleCount = existingBundles.length;
526
+ const hatchVerb = existingBundleCount > 0 ? "let's hatch a new agent." : "let's hatch your first agent.";
527
+ // Default models per provider (used when entering new credentials)
528
+ const defaultModels = provider_models_1.DEFAULT_PROVIDER_MODELS;
529
+ const { pingProvider } = await Promise.resolve().then(() => __importStar(require("../provider-ping")));
530
+ const installedAgentCreds = await (0, provider_discovery_1.discoverInstalledAgentCredentials)(existingBundles);
531
+ for (const cred of installedAgentCreds) {
532
+ discovered.push({
533
+ ...cred,
534
+ providerConfig: { model: defaultModels[cred.provider], ...cred.providerConfig },
535
+ });
536
+ }
537
+ // Scan environment variables for API keys using the shared helper
538
+ const envCreds = (0, provider_discovery_1.scanEnvVarCredentials)(process.env);
539
+ const envDiscovered = [];
540
+ for (const cred of envCreds) {
541
+ // Enrich with default model and first matching env var name (for display)
542
+ const desc = identity_1.PROVIDER_CREDENTIALS[cred.provider];
543
+ const firstEnvVar = Object.entries(desc.envVars).find(([envVar]) => process.env[envVar])?.[0] ?? "";
544
+ const provCfg = { model: defaultModels[cred.provider], ...cred.providerConfig };
545
+ if (cred.provider === "azure" && cred.credentials.deployment)
546
+ provCfg.deployment = cred.credentials.deployment;
547
+ const enriched = { ...cred, providerConfig: provCfg };
548
+ envDiscovered.push({ ...enriched, envVar: firstEnvVar });
549
+ discovered.push(enriched);
550
+ }
551
+ let welcomed = false;
552
+ while (true) {
553
+ if (!welcomed) {
554
+ process.stdout.write(`\n\ud83d\udc0d welcome to ouroboros! ${hatchVerb}\n`);
555
+ welcomed = true;
556
+ }
557
+ if (discovered.length > 0) {
558
+ process.stdout.write("i found existing API credentials:\n\n");
559
+ const credentialOptions = discovered;
560
+ for (let i = 0; i < credentialOptions.length; i++) {
561
+ const model = credentialOptions[i].providerConfig.model || credentialOptions[i].providerConfig.deployment || "";
562
+ const modelLabel = model ? `, ${model}` : "";
563
+ const envMatch = envDiscovered.find((e) => e.provider === credentialOptions[i].provider && credentialOptions[i].agentName === "env");
564
+ const sourceLabel = (0, provider_discovery_1.describeDiscoveredCredentialSource)(credentialOptions[i], envMatch?.envVar);
565
+ process.stdout.write(` ${i + 1}. ${credentialOptions[i].provider}${modelLabel} (${sourceLabel})\n`);
566
+ }
567
+ process.stdout.write("\n");
568
+ const choice = await coldPrompt("use one of these? enter number, or 'new' for a different key, or 'q' to cancel: ");
569
+ if (["q", "quit", "cancel"].includes(choice.toLowerCase())) {
570
+ coldRl.close();
571
+ return null;
572
+ }
573
+ const idx = parseInt(choice, 10) - 1;
574
+ if (idx >= 0 && idx < credentialOptions.length) {
575
+ providerRaw = credentialOptions[idx].provider;
576
+ credentials = credentialOptions[idx].credentials;
577
+ providerConfig = credentialOptions[idx].providerConfig;
578
+ }
579
+ else {
580
+ const pRaw = await coldPrompt("provider (anthropic/azure/minimax/openai-codex/github-copilot): ");
581
+ if (!(0, cli_parse_1.isAgentProvider)(pRaw)) {
582
+ process.stdout.write("unknown provider. run `ouro hatch` to try again.\n");
583
+ coldRl.close();
584
+ return null;
585
+ }
586
+ providerRaw = pRaw;
587
+ providerConfig = { model: defaultModels[providerRaw] };
588
+ credentials = await (0, auth_flow_1.collectRuntimeAuthCredentials)({ agentName: "SerpentGuide", provider: providerRaw, promptInput: coldPrompt }, {});
589
+ }
590
+ }
591
+ else {
592
+ process.stdout.write("i need an API key to power our conversation.\n\n");
593
+ const pRaw = await coldPrompt("provider (anthropic/azure/minimax/openai-codex/github-copilot): ");
594
+ if (!(0, cli_parse_1.isAgentProvider)(pRaw)) {
595
+ process.stdout.write("unknown provider. run `ouro hatch` to try again.\n");
596
+ coldRl.close();
597
+ return null;
598
+ }
599
+ providerRaw = pRaw;
600
+ providerConfig = { model: defaultModels[providerRaw] };
601
+ credentials = await (0, auth_flow_1.collectRuntimeAuthCredentials)({ agentName: "SerpentGuide", provider: providerRaw, promptInput: coldPrompt }, {});
602
+ }
603
+ selectedCredentialPayload = { ...providerConfig, ...credentials };
604
+ const pingResult = await pingProvider(providerRaw, selectedCredentialPayload);
605
+ if (pingResult.ok) {
606
+ break;
607
+ }
608
+ process.stdout.write(`credentials didn't work (${pingResult.message}). `);
609
+ if (discovered.length > 0) {
610
+ process.stdout.write("choose another saved credential or enter 'new'.\n\n");
611
+ }
612
+ else {
613
+ process.stdout.write("let's try again.\n\n");
614
+ }
615
+ }
616
+ coldRl.close();
617
+ process.stdout.write("\n");
618
+ const split = (0, provider_credentials_1.splitProviderCredentialFields)(providerRaw, selectedCredentialPayload);
619
+ (0, provider_credentials_1.cacheProviderCredentialRecords)("SerpentGuide", [
620
+ (0, provider_credentials_1.createProviderCredentialRecord)({
621
+ provider: providerRaw,
622
+ credentials: split.credentials,
623
+ config: split.config,
624
+ provenance: { source: "manual" },
625
+ }),
626
+ ]);
627
+ // Phase 2: configure runtime for serpent guide
628
+ const bundleSourceDir = path.resolve(__dirname, "..", "..", "..", "SerpentGuide.ouro");
629
+ const bundlesRoot = (0, identity_1.getAgentBundlesRoot)();
630
+ // Suppress non-critical log noise during hatch.
631
+ const { setRuntimeLogger } = await Promise.resolve().then(() => __importStar(require("../../nerves/runtime")));
632
+ const { createLogger } = await Promise.resolve().then(() => __importStar(require("../../nerves")));
633
+ setRuntimeLogger(createLogger({ level: "error" }));
634
+ // Configure runtime: set agent identity + config override so runAgent
635
+ // doesn't try to read from ~/AgentBundles/SerpentGuide.ouro/. (As of
636
+ // Layer 3, SerpentGuide identities live in-repo only — the
637
+ // `~/AgentBundles/SerpentGuide.ouro/psyche/identities` override path
638
+ // was removed. The override path is no longer read or honored.)
639
+ setAgentName("SerpentGuide");
640
+ // Build specialist system prompt
641
+ const soulText = (0, specialist_orchestrator_1.loadSoulText)(bundleSourceDir);
642
+ const identitiesDir = path.join(bundleSourceDir, "psyche", "identities");
643
+ const identity = (0, specialist_orchestrator_1.pickRandomIdentity)(identitiesDir);
644
+ // Load identity-specific spinner phrases (falls back to DEFAULT_AGENT_PHRASES)
645
+ const { loadIdentityPhrases } = await Promise.resolve().then(() => __importStar(require("../hatch/specialist-orchestrator")));
646
+ const phrases = loadIdentityPhrases(bundleSourceDir, identity.fileName);
647
+ const resolvedModel = providerConfig.model || providerConfig.deployment || "";
648
+ setAgentConfigOverride({
649
+ version: 2,
650
+ enabled: true,
651
+ provider: providerRaw,
652
+ humanFacing: { provider: providerRaw, model: resolvedModel },
653
+ agentFacing: { provider: providerRaw, model: resolvedModel },
654
+ phrases,
655
+ });
656
+ const systemPrompt = (0, specialist_prompt_1.buildSpecialistSystemPrompt)(soulText, identity.content, existingBundles, {
657
+ tempDir,
658
+ provider: providerRaw,
659
+ model: providerConfig.model ?? "",
660
+ });
661
+ // Build specialist tools
662
+ const specialistTools = (0, specialist_tools_1.getSpecialistTools)();
663
+ const specialistExecTool = (0, specialist_tools_1.createSpecialistExecTool)({
664
+ tempDir,
665
+ credentials: selectedCredentialPayload,
666
+ provider: providerRaw,
667
+ bundlesRoot,
668
+ animationWriter: (text) => process.stdout.write(text),
669
+ promptSecret: defaultPromptSecret,
670
+ });
671
+ // Run the serpent guide session via runCliSession
672
+ const result = await runCliSession({
673
+ agentName: "SerpentGuide",
674
+ tools: specialistTools,
675
+ execTool: specialistExecTool,
676
+ exitOnToolCall: "complete_adoption",
677
+ autoFirstTurn: true,
678
+ banner: false,
679
+ disableCommands: true,
680
+ skipSystemPromptRefresh: true,
681
+ messages: [
682
+ { role: "system", content: systemPrompt },
683
+ { role: "user", content: "hi" },
684
+ ],
685
+ });
686
+ if (result.exitReason === "tool_exit" && result.toolResult) {
687
+ const parsed = typeof result.toolResult === "string" ? JSON.parse(result.toolResult) : result.toolResult;
688
+ if (parsed.success && parsed.agentName) {
689
+ return parsed.agentName;
690
+ }
691
+ }
692
+ return null;
693
+ }
694
+ catch (err) {
695
+ process.stderr.write(`\nouro hatch error: ${err instanceof Error ? err.stack ?? err.message : String(err)}\n`);
696
+ coldRl.close();
697
+ return null;
698
+ }
699
+ finally {
700
+ // Clear specialist config/identity so the hatched agent gets its own
701
+ setAgentConfigOverride(null);
702
+ const { resetProviderRuntime } = await Promise.resolve().then(() => __importStar(require("../core")));
703
+ resetProviderRuntime();
704
+ const { resetConfigCache } = await Promise.resolve().then(() => __importStar(require("../config")));
705
+ resetConfigCache();
706
+ // Restore default logging
707
+ const { setRuntimeLogger: restoreLogger } = await Promise.resolve().then(() => __importStar(require("../../nerves/runtime")));
708
+ restoreLogger(null);
709
+ // Clean up temp dir if it still exists
710
+ try {
711
+ if (fs.existsSync(tempDir)) {
712
+ fs.rmSync(tempDir, { recursive: true, force: true });
713
+ }
714
+ }
715
+ catch {
716
+ // Best effort cleanup
717
+ }
718
+ }
719
+ }
720
+ /* v8 ignore stop */
721
+ // ── Factory ──
722
+ function createDefaultOuroCliDeps(socketPath = socket_client_1.DEFAULT_DAEMON_SOCKET_PATH) {
723
+ return {
724
+ socketPath,
725
+ sendCommand: (commandSocketPath, command) => (0, socket_client_1.sendDaemonCommand)(commandSocketPath, command, {
726
+ timeoutMs: command.kind === "daemon.status"
727
+ ? socket_client_1.DEFAULT_DAEMON_STATUS_TIMEOUT_MS
728
+ : socket_client_1.DEFAULT_DAEMON_COMMAND_TIMEOUT_MS,
729
+ }),
730
+ startDaemonProcess: defaultStartDaemonProcess,
731
+ startDaemonForFrontend: defaultStartDaemonForFrontend,
732
+ writeStdout: defaultWriteStdout,
733
+ setExitCode: (code) => {
734
+ const current = typeof process.exitCode === "number" ? process.exitCode : 0;
735
+ process.exitCode = Math.max(current, code);
736
+ },
737
+ writeRaw: defaultWriteRaw,
738
+ isTTY: process.stdout.isTTY === true,
739
+ checkSocketAlive: socket_client_1.checkDaemonSocketAlive,
740
+ cleanupStaleSocket: defaultCleanupStaleSocket,
741
+ fallbackPendingMessage: defaultFallbackPendingMessage,
742
+ tailLogs: (options) => (0, log_tailer_1.tailLogs)(options),
743
+ healthFilePath: (0, daemon_health_1.getDefaultHealthPath)(),
744
+ readHealthState: daemon_health_1.readHealth,
745
+ readHealthUpdatedAt: defaultReadHealthUpdatedAt,
746
+ readRecentDaemonLogLines: defaultReadRecentDaemonLogLines,
747
+ readDaemonStartupTombstone: daemon_tombstone_1.readDaemonTombstone,
748
+ sleep: defaultSleep,
749
+ spawnBackgroundCli: defaultSpawnBackgroundCli,
750
+ now: () => Date.now(),
751
+ updateCheckTimeoutMs: update_checker_1.CLI_UPDATE_CHECK_TIMEOUT_MS,
752
+ startupPollIntervalMs: 250,
753
+ startupStabilityWindowMs: 1_500,
754
+ startupTimeoutMs: 60_000,
755
+ startupRetryLimit: 1,
756
+ isProcessAlive: startup_tui_1.defaultIsProcessAlive,
757
+ listDiscoveredAgents: defaultListDiscoveredAgents,
758
+ runHatchFlow: hatch_flow_1.runHatchFlow,
759
+ promptInput: defaultPromptInput,
760
+ promptSecret: defaultPromptSecret,
761
+ runSerpentGuide: defaultRunSerpentGuide,
762
+ runAuthFlow: auth_flow_1.runRuntimeAuthFlow,
763
+ registerOuroBundleType: ouro_uti_1.registerOuroBundleUti,
764
+ installOuroCommand: ouro_path_installer_1.installOuroCommand,
765
+ /* v8 ignore start -- self-healing: ensures active symlink matches running runtime version @preserve */
766
+ ensureCurrentVersionInstalled: () => {
767
+ const linkedVersion = (0, ouro_version_manager_1.getCurrentVersion)({});
768
+ const version = (0, bundle_manifest_1.getPackageVersion)();
769
+ if (linkedVersion === version)
770
+ return;
771
+ (0, ouro_version_manager_1.ensureLayout)({});
772
+ const cliHome = (0, ouro_version_manager_1.getOuroCliHome)();
773
+ const versionEntry = path.join(cliHome, "versions", version, "node_modules", "@ouro.bot", "cli", "dist", "heart", "daemon", "ouro-entry.js");
774
+ if (!fs.existsSync(versionEntry)) {
775
+ (0, ouro_version_manager_1.installVersion)(version, {});
776
+ }
777
+ (0, ouro_version_manager_1.activateVersion)(version, {});
778
+ // Self-prune: every successful version activation cleans up old
779
+ // versions outside the retention window. Without this, every CLI
780
+ // version ever installed accumulates indefinitely under
781
+ // ~/.ouro-cli/versions/ — the user observed installs going back to
782
+ // alpha.85 from March 20 (~100MB of dead node_modules trees).
783
+ // pruneOldVersions keeps the 5 most recent + the active + the
784
+ // previous version, so rollback stays one command away.
785
+ (0, ouro_version_manager_1.pruneOldVersions)(undefined, {});
786
+ },
787
+ /* v8 ignore stop */
788
+ /* v8 ignore start -- CLI version management defaults: integration code @preserve */
789
+ checkForCliUpdate: async () => {
790
+ const { checkForUpdate } = await Promise.resolve().then(() => __importStar(require("../versioning/update-checker")));
791
+ return checkForUpdate((0, bundle_manifest_1.getPackageVersion)(), {
792
+ fetchRegistryJson: () => defaultFetchCliRegistryJson(update_checker_1.CLI_UPDATE_CHECK_TIMEOUT_MS),
793
+ distTag: update_checker_1.CLI_UPDATE_DIST_TAG,
794
+ });
795
+ },
796
+ readVersionIntent: () => (0, version_intent_1.readVersionIntent)(),
797
+ writeVersionIntent: (intent) => (0, version_intent_1.writeVersionIntent)(intent),
798
+ installCliVersion: async (version) => { (0, ouro_version_manager_1.installVersion)(version, {}); },
799
+ validateCliVersionForActivation: (version) => (0, ouro_version_manager_1.validateInstalledVersionForActivation)(version, {}),
800
+ activateCliVersion: (version) => {
801
+ (0, ouro_version_manager_1.activateVersion)(version, {});
802
+ // Same self-prune as ensureCurrentVersionInstalled — fires from the
803
+ // checkForCliUpdate path 1 (in-process update detected → activate
804
+ // → re-exec). Without this, the path 1 code path never triggers
805
+ // a prune.
806
+ (0, ouro_version_manager_1.pruneOldVersions)(undefined, {});
807
+ },
808
+ getCurrentCliVersion: () => (0, ouro_version_manager_1.getCurrentVersion)({}),
809
+ getPreviousCliVersion: () => (0, ouro_version_manager_1.getPreviousVersion)({}),
810
+ listCliVersions: () => (0, ouro_version_manager_1.listInstalledVersions)({}),
811
+ reExecFromNewVersion: (reArgs) => {
812
+ const entry = path.join((0, ouro_version_manager_1.getOuroCliHome)(), "CurrentVersion", "node_modules", "@ouro.bot", "cli", "dist", "heart", "daemon", "ouro-entry.js");
813
+ require("child_process").execFileSync("node", [entry, ...reArgs], { stdio: "inherit" });
814
+ process.exit(0);
815
+ },
816
+ /* v8 ignore stop */
817
+ syncGlobalOuroBotWrapper: ouro_bot_global_installer_1.syncGlobalOuroBotWrapper,
818
+ pruneDaemonLogs: logs_prune_1.pruneDaemonLogs,
819
+ ensureSkillManagement: skill_management_installer_1.ensureSkillManagement,
820
+ prepareDaemonRuntimeReplacement: defaultPrepareDaemonRuntimeReplacement,
821
+ ensureDaemonBootPersistence: defaultEnsureDaemonBootPersistence,
822
+ /* v8 ignore start -- dev-mode defaults: tests inject mocks for mode detection and binary resolution @preserve */
823
+ detectMode: () => (0, runtime_mode_1.detectRuntimeMode)((0, identity_1.getRepoRoot)()),
824
+ getInstalledBinaryPath: () => {
825
+ const cliHome = (0, ouro_version_manager_1.getOuroCliHome)();
826
+ const binaryPath = path.join(cliHome, "bin", "ouro");
827
+ return fs.existsSync(binaryPath) ? binaryPath : null;
828
+ },
829
+ execInstalledBinary: (binaryPath, binArgs) => {
830
+ const { execFileSync } = require("child_process");
831
+ execFileSync(binaryPath, binArgs, { stdio: "inherit" });
832
+ process.exit(0);
833
+ },
834
+ /* v8 ignore stop */
835
+ /* v8 ignore next 3 -- integration: launches interactive CLI session @preserve */
836
+ startChat: async (agentName) => {
837
+ const { main } = await Promise.resolve().then(() => __importStar(require("../../senses/cli")));
838
+ await main(agentName);
839
+ },
840
+ scanSessions: async (agentName) => {
841
+ const agentRoot = (0, identity_1.getAgentRoot)(agentName);
842
+ return (0, session_activity_1.listSessionActivity)({
843
+ sessionsDir: path.join(agentRoot, "state", "sessions"),
844
+ friendsDir: path.join(agentRoot, "friends"),
845
+ agentName,
846
+ }).map((entry) => ({
847
+ friendId: entry.friendId,
848
+ friendName: entry.friendName,
849
+ channel: entry.channel,
850
+ lastActivity: entry.lastActivityAt,
851
+ }));
852
+ },
853
+ };
854
+ }