@ouro.bot/cli 0.1.0-alpha.56 → 0.1.0-alpha.561

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 (396) hide show
  1. package/README.md +127 -23
  2. package/RepairGuide.ouro/agent.json +5 -0
  3. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  4. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  5. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  6. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  7. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  8. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  9. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  12. package/changelog.json +3604 -0
  13. package/dist/arc/attention-types.js +8 -0
  14. package/dist/arc/cares.js +140 -0
  15. package/dist/arc/episodes.js +117 -0
  16. package/dist/arc/intentions.js +133 -0
  17. package/dist/arc/json-store.js +117 -0
  18. package/dist/arc/obligations.js +237 -0
  19. package/dist/arc/packets.js +193 -0
  20. package/dist/arc/presence.js +185 -0
  21. package/dist/arc/task-lifecycle.js +65 -0
  22. package/dist/heart/active-work.js +837 -26
  23. package/dist/heart/agent-entry.js +58 -3
  24. package/dist/heart/attachments/image-normalize.js +194 -0
  25. package/dist/heart/attachments/materialize.js +97 -0
  26. package/dist/heart/attachments/originals.js +88 -0
  27. package/dist/heart/attachments/render.js +29 -0
  28. package/dist/heart/attachments/sources/adapter.js +2 -0
  29. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  30. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  31. package/dist/heart/attachments/sources/index.js +16 -0
  32. package/dist/heart/attachments/store.js +103 -0
  33. package/dist/heart/attachments/types.js +93 -0
  34. package/dist/heart/auth/auth-flow.js +479 -0
  35. package/dist/heart/background-operations.js +281 -0
  36. package/dist/heart/bundle-state.js +168 -0
  37. package/dist/heart/commitments.js +111 -0
  38. package/dist/heart/config-registry.js +322 -0
  39. package/dist/heart/config.js +114 -118
  40. package/dist/heart/core.js +913 -246
  41. package/dist/heart/cross-chat-delivery.js +3 -18
  42. package/dist/heart/daemon/agent-config-check.js +419 -0
  43. package/dist/heart/daemon/agent-discovery.js +102 -3
  44. package/dist/heart/daemon/agent-service.js +522 -0
  45. package/dist/heart/daemon/agentic-repair.js +547 -0
  46. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  47. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  48. package/dist/heart/daemon/cadence.js +70 -0
  49. package/dist/heart/daemon/cli-defaults.js +776 -0
  50. package/dist/heart/daemon/cli-exec.js +7457 -0
  51. package/dist/heart/daemon/cli-help.js +498 -0
  52. package/dist/heart/daemon/cli-parse.js +1592 -0
  53. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  54. package/dist/heart/daemon/cli-render.js +763 -0
  55. package/dist/heart/daemon/cli-types.js +8 -0
  56. package/dist/heart/daemon/connect-bay.js +323 -0
  57. package/dist/heart/daemon/daemon-cli.js +29 -1698
  58. package/dist/heart/daemon/daemon-entry.js +387 -2
  59. package/dist/heart/daemon/daemon-health.js +176 -0
  60. package/dist/heart/daemon/daemon-rollup.js +57 -0
  61. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  62. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  63. package/dist/heart/daemon/daemon.js +796 -71
  64. package/dist/heart/daemon/dns-workflow.js +394 -0
  65. package/dist/heart/daemon/doctor-types.js +8 -0
  66. package/dist/heart/daemon/doctor.js +826 -0
  67. package/dist/heart/daemon/health-monitor.js +122 -1
  68. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  69. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  70. package/dist/heart/daemon/http-health-probe.js +80 -0
  71. package/dist/heart/daemon/human-command-screens.js +234 -0
  72. package/dist/heart/daemon/human-readiness.js +114 -0
  73. package/dist/heart/daemon/inner-status.js +89 -0
  74. package/dist/heart/daemon/interactive-repair.js +394 -0
  75. package/dist/heart/daemon/launchd.js +37 -8
  76. package/dist/heart/daemon/log-tailer.js +82 -12
  77. package/dist/heart/daemon/logs-prune.js +110 -0
  78. package/dist/heart/daemon/mcp-canary.js +297 -0
  79. package/dist/heart/daemon/message-router.js +2 -2
  80. package/dist/heart/daemon/os-cron-deps.js +135 -0
  81. package/dist/heart/daemon/os-cron.js +14 -12
  82. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  83. package/dist/heart/daemon/ouro-entry.js +3 -1
  84. package/dist/heart/daemon/process-manager.js +375 -33
  85. package/dist/heart/daemon/provider-discovery.js +137 -0
  86. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  87. package/dist/heart/daemon/pulse.js +475 -0
  88. package/dist/heart/daemon/readiness-repair.js +365 -0
  89. package/dist/heart/daemon/run-hooks.js +2 -0
  90. package/dist/heart/daemon/runtime-logging.js +67 -16
  91. package/dist/heart/daemon/runtime-metadata.js +3 -31
  92. package/dist/heart/daemon/safe-mode.js +161 -0
  93. package/dist/heart/daemon/sense-manager.js +389 -38
  94. package/dist/heart/daemon/session-id-resolver.js +131 -0
  95. package/dist/heart/daemon/skill-management-installer.js +94 -0
  96. package/dist/heart/daemon/socket-client.js +158 -11
  97. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  98. package/dist/heart/daemon/startup-tui.js +330 -0
  99. package/dist/heart/daemon/task-scheduler.js +3 -25
  100. package/dist/heart/daemon/terminal-ui.js +499 -0
  101. package/dist/heart/daemon/thoughts.js +162 -17
  102. package/dist/heart/daemon/up-progress.js +366 -0
  103. package/dist/heart/daemon/vault-items.js +56 -0
  104. package/dist/heart/delegation.js +1 -1
  105. package/dist/heart/habits/habit-migration.js +189 -0
  106. package/dist/heart/habits/habit-parser.js +140 -0
  107. package/dist/heart/habits/habit-runtime-state.js +100 -0
  108. package/dist/heart/habits/habit-scheduler.js +372 -0
  109. package/dist/heart/{daemon → hatch}/hatch-flow.js +32 -56
  110. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  111. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  112. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  113. package/dist/heart/identity.js +203 -57
  114. package/dist/heart/kept-notes.js +357 -0
  115. package/dist/heart/kicks.js +1 -1
  116. package/dist/heart/machine-identity.js +161 -0
  117. package/dist/heart/mail-import-discovery.js +353 -0
  118. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  119. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  120. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  121. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  122. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  123. package/dist/heart/mailbox/mailbox-http.js +99 -0
  124. package/dist/heart/mailbox/mailbox-read.js +31 -0
  125. package/dist/heart/mailbox/mailbox-types.js +27 -0
  126. package/dist/heart/mailbox/mailbox-view.js +195 -0
  127. package/dist/heart/mailbox/readers/agent-machine.js +382 -0
  128. package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
  129. package/dist/heart/mailbox/readers/mail.js +362 -0
  130. package/dist/heart/mailbox/readers/runtime-readers.js +651 -0
  131. package/dist/heart/mailbox/readers/sessions.js +232 -0
  132. package/dist/heart/mailbox/readers/shared.js +111 -0
  133. package/dist/heart/mcp/mcp-server.js +683 -0
  134. package/dist/heart/migrate-config.js +100 -0
  135. package/dist/heart/model-capabilities.js +19 -0
  136. package/dist/heart/platform.js +81 -0
  137. package/dist/heart/provider-attempt.js +134 -0
  138. package/dist/heart/provider-binding-resolver.js +267 -0
  139. package/dist/heart/provider-credentials.js +425 -0
  140. package/dist/heart/provider-failover.js +301 -0
  141. package/dist/heart/provider-models.js +81 -0
  142. package/dist/heart/provider-ping.js +262 -0
  143. package/dist/heart/provider-readiness-cache.js +40 -0
  144. package/dist/heart/provider-visibility.js +188 -0
  145. package/dist/heart/providers/anthropic-token.js +131 -0
  146. package/dist/heart/providers/anthropic.js +139 -52
  147. package/dist/heart/providers/azure.js +97 -13
  148. package/dist/heart/providers/error-classification.js +127 -0
  149. package/dist/heart/providers/github-copilot.js +145 -0
  150. package/dist/heart/providers/minimax-vlm.js +189 -0
  151. package/dist/heart/providers/minimax.js +26 -8
  152. package/dist/heart/providers/openai-codex.js +55 -40
  153. package/dist/heart/runtime-capability-check.js +170 -0
  154. package/dist/heart/runtime-credentials.js +367 -0
  155. package/dist/heart/runtime-cwd.js +87 -0
  156. package/dist/heart/sense-truth.js +13 -4
  157. package/dist/heart/session-activity.js +43 -22
  158. package/dist/heart/session-events.js +1149 -0
  159. package/dist/heart/session-playback-cli-main.js +5 -0
  160. package/dist/heart/session-playback-cli.js +36 -0
  161. package/dist/heart/session-playback.js +231 -0
  162. package/dist/heart/session-stats-cli-main.js +5 -0
  163. package/dist/heart/session-stats.js +182 -0
  164. package/dist/heart/session-transcript.js +243 -0
  165. package/dist/heart/start-of-turn-packet.js +345 -0
  166. package/dist/heart/streaming.js +44 -27
  167. package/dist/heart/sync-classification.js +176 -0
  168. package/dist/heart/sync.js +449 -0
  169. package/dist/heart/target-resolution.js +9 -5
  170. package/dist/heart/tempo.js +93 -0
  171. package/dist/heart/temporal-view.js +41 -0
  172. package/dist/heart/timeouts.js +101 -0
  173. package/dist/heart/tool-activity-callbacks.js +59 -0
  174. package/dist/heart/tool-description.js +139 -0
  175. package/dist/heart/tool-friction.js +55 -0
  176. package/dist/heart/tool-loop.js +200 -0
  177. package/dist/heart/turn-context.js +389 -0
  178. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  179. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  180. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  181. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  182. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  183. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  184. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  185. package/dist/mailbox-ui/assets/index-B-461hes.js +61 -0
  186. package/dist/mailbox-ui/assets/index-BPr5vNuM.css +1 -0
  187. package/dist/mailbox-ui/index.html +15 -0
  188. package/dist/mailroom/attention.js +167 -0
  189. package/dist/mailroom/autonomy.js +209 -0
  190. package/dist/mailroom/blob-store.js +674 -0
  191. package/dist/mailroom/body-cache.js +61 -0
  192. package/dist/mailroom/core.js +720 -0
  193. package/dist/mailroom/entry.js +160 -0
  194. package/dist/mailroom/file-store.js +430 -0
  195. package/dist/mailroom/mbox-import.js +383 -0
  196. package/dist/mailroom/outbound.js +380 -0
  197. package/dist/mailroom/policy.js +263 -0
  198. package/dist/mailroom/reader.js +233 -0
  199. package/dist/mailroom/search-cache.js +256 -0
  200. package/dist/mailroom/search-relevance.js +319 -0
  201. package/dist/mailroom/smtp-ingress.js +176 -0
  202. package/dist/mailroom/source-state.js +176 -0
  203. package/dist/mailroom/thread.js +109 -0
  204. package/dist/mailroom/travel-extract.js +89 -0
  205. package/dist/mind/bundle-manifest.js +7 -1
  206. package/dist/mind/context.js +165 -101
  207. package/dist/mind/diary-integrity.js +60 -0
  208. package/dist/mind/{memory.js → diary.js} +62 -75
  209. package/dist/mind/embedding-provider.js +60 -0
  210. package/dist/mind/file-state.js +179 -0
  211. package/dist/mind/friends/channel.js +39 -0
  212. package/dist/mind/friends/resolver.js +54 -2
  213. package/dist/mind/friends/store-file.js +39 -3
  214. package/dist/mind/friends/types.js +2 -2
  215. package/dist/mind/journal-index.js +161 -0
  216. package/dist/mind/note-search.js +268 -0
  217. package/dist/mind/obligation-steering.js +221 -0
  218. package/dist/mind/pending.js +4 -0
  219. package/dist/mind/prompt-refresh.js +3 -2
  220. package/dist/mind/prompt.js +1011 -123
  221. package/dist/mind/provenance-trust.js +26 -0
  222. package/dist/mind/scrutiny.js +173 -0
  223. package/dist/nerves/cli-logging.js +7 -1
  224. package/dist/nerves/coverage/audit-rules.js +15 -6
  225. package/dist/nerves/coverage/audit.js +28 -2
  226. package/dist/nerves/coverage/cli.js +1 -1
  227. package/dist/nerves/coverage/contract.js +5 -5
  228. package/dist/nerves/coverage/file-completeness.js +129 -5
  229. package/dist/nerves/coverage/run-artifacts.js +1 -1
  230. package/dist/nerves/event-buffer.js +111 -0
  231. package/dist/nerves/index.js +224 -4
  232. package/dist/nerves/observation.js +20 -0
  233. package/dist/nerves/redact.js +79 -0
  234. package/dist/nerves/review/cli-main.js +5 -0
  235. package/dist/nerves/review/cli.js +156 -0
  236. package/dist/nerves/review/core.js +152 -0
  237. package/dist/nerves/runtime.js +5 -1
  238. package/dist/repertoire/ado-client.js +15 -56
  239. package/dist/repertoire/ado-semantic.js +11 -10
  240. package/dist/repertoire/api-client.js +97 -0
  241. package/dist/repertoire/bitwarden-store.js +963 -0
  242. package/dist/repertoire/bundle-templates.js +72 -0
  243. package/dist/repertoire/bw-installer.js +180 -0
  244. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  245. package/dist/repertoire/coding/context-pack.js +330 -0
  246. package/dist/repertoire/coding/feedback.js +197 -30
  247. package/dist/repertoire/coding/manager.js +158 -9
  248. package/dist/repertoire/coding/spawner.js +55 -9
  249. package/dist/repertoire/coding/tools.js +170 -7
  250. package/dist/repertoire/commerce-errors.js +109 -0
  251. package/dist/repertoire/commerce-self-test.js +156 -0
  252. package/dist/repertoire/credential-access.js +178 -0
  253. package/dist/repertoire/duffel-client.js +185 -0
  254. package/dist/repertoire/github-client.js +14 -55
  255. package/dist/repertoire/graph-client.js +11 -52
  256. package/dist/repertoire/guardrails.js +396 -0
  257. package/dist/repertoire/mcp-client.js +295 -0
  258. package/dist/repertoire/mcp-manager.js +362 -0
  259. package/dist/repertoire/mcp-tools.js +63 -0
  260. package/dist/repertoire/shell-sessions.js +133 -0
  261. package/dist/repertoire/skills.js +15 -24
  262. package/dist/repertoire/stripe-client.js +131 -0
  263. package/dist/repertoire/tasks/board.js +31 -5
  264. package/dist/repertoire/tasks/fix.js +182 -0
  265. package/dist/repertoire/tasks/index.js +16 -4
  266. package/dist/repertoire/tasks/lifecycle.js +2 -2
  267. package/dist/repertoire/tasks/parser.js +3 -2
  268. package/dist/repertoire/tasks/scanner.js +194 -37
  269. package/dist/repertoire/tasks/transitions.js +16 -78
  270. package/dist/repertoire/tool-results.js +29 -0
  271. package/dist/repertoire/tools-attachments.js +317 -0
  272. package/dist/repertoire/tools-base.js +47 -1075
  273. package/dist/repertoire/tools-bluebubbles.js +1 -0
  274. package/dist/repertoire/tools-bridge.js +142 -0
  275. package/dist/repertoire/tools-bundle.js +984 -0
  276. package/dist/repertoire/tools-config.js +185 -0
  277. package/dist/repertoire/tools-continuity.js +248 -0
  278. package/dist/repertoire/tools-credential.js +381 -0
  279. package/dist/repertoire/tools-files.js +342 -0
  280. package/dist/repertoire/tools-flight.js +224 -0
  281. package/dist/repertoire/tools-flow.js +119 -0
  282. package/dist/repertoire/tools-github.js +1 -7
  283. package/dist/repertoire/tools-mail.js +1857 -0
  284. package/dist/repertoire/tools-notes.js +421 -0
  285. package/dist/repertoire/tools-session.js +750 -0
  286. package/dist/repertoire/tools-shell.js +120 -0
  287. package/dist/repertoire/tools-stripe.js +180 -0
  288. package/dist/repertoire/tools-surface.js +243 -0
  289. package/dist/repertoire/tools-teams.js +9 -39
  290. package/dist/repertoire/tools-travel.js +125 -0
  291. package/dist/repertoire/tools-trip.js +604 -0
  292. package/dist/repertoire/tools-user-profile.js +144 -0
  293. package/dist/repertoire/tools-vault.js +40 -0
  294. package/dist/repertoire/tools.js +108 -100
  295. package/dist/repertoire/travel-api-client.js +360 -0
  296. package/dist/repertoire/user-profile.js +131 -0
  297. package/dist/repertoire/vault-setup.js +246 -0
  298. package/dist/repertoire/vault-unlock.js +594 -0
  299. package/dist/scripts/claude-code-hook.js +41 -0
  300. package/dist/scripts/claude-code-stop-hook.js +47 -0
  301. package/dist/senses/attention-queue.js +116 -0
  302. package/dist/senses/bluebubbles/active-turns.js +216 -0
  303. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  304. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  305. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  306. package/dist/senses/bluebubbles/entry.js +77 -0
  307. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  308. package/dist/senses/bluebubbles/index.js +2305 -0
  309. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  310. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  311. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  312. package/dist/senses/bluebubbles/processed-log.js +133 -0
  313. package/dist/senses/bluebubbles/replay.js +137 -0
  314. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  315. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  316. package/dist/senses/cli/bracketed-paste.js +82 -0
  317. package/dist/senses/cli/image-paste.js +287 -0
  318. package/dist/senses/cli/image-ref-navigation.js +75 -0
  319. package/dist/senses/cli/ink-app.js +156 -0
  320. package/dist/senses/cli/inline-diff.js +64 -0
  321. package/dist/senses/cli/input-keys.js +174 -0
  322. package/dist/senses/cli/kill-ring.js +86 -0
  323. package/dist/senses/cli/message-list.js +51 -0
  324. package/dist/senses/cli/ouro-tui.js +607 -0
  325. package/dist/senses/cli/spinner-imperative.js +135 -0
  326. package/dist/senses/cli/spinner.js +101 -0
  327. package/dist/senses/cli/status-line.js +60 -0
  328. package/dist/senses/cli/streaming-markdown.js +526 -0
  329. package/dist/senses/cli/tool-display.js +85 -0
  330. package/dist/senses/cli/tool-render.js +85 -0
  331. package/dist/senses/cli/tui-store.js +240 -0
  332. package/dist/senses/cli/virtual-list.js +35 -0
  333. package/dist/senses/cli-entry.js +60 -8
  334. package/dist/senses/cli-layout.js +187 -0
  335. package/dist/senses/cli.js +520 -209
  336. package/dist/senses/commands.js +66 -3
  337. package/dist/senses/habit-turn-message.js +108 -0
  338. package/dist/senses/inner-dialog-worker.js +175 -21
  339. package/dist/senses/inner-dialog.js +330 -27
  340. package/dist/senses/mail-entry.js +66 -0
  341. package/dist/senses/mail.js +379 -0
  342. package/dist/senses/pipeline.js +549 -181
  343. package/dist/senses/proactive-content-guard.js +51 -0
  344. package/dist/senses/shared-turn.js +251 -0
  345. package/dist/senses/surface-tool.js +68 -0
  346. package/dist/senses/teams-entry.js +60 -8
  347. package/dist/senses/teams.js +387 -98
  348. package/dist/senses/trust-gate.js +100 -5
  349. package/dist/senses/voice/audio-routing.js +119 -0
  350. package/dist/senses/voice/elevenlabs.js +178 -0
  351. package/dist/senses/voice/golden-path.js +116 -0
  352. package/dist/senses/voice/index.js +26 -0
  353. package/dist/senses/voice/meeting.js +113 -0
  354. package/dist/senses/voice/playback.js +139 -0
  355. package/dist/senses/voice/transcript.js +70 -0
  356. package/dist/senses/voice/turn.js +85 -0
  357. package/dist/senses/voice/types.js +2 -0
  358. package/dist/senses/voice/whisper.js +161 -0
  359. package/dist/senses/voice-entry.js +80 -0
  360. package/dist/trips/core.js +138 -0
  361. package/dist/trips/store.js +146 -0
  362. package/package.json +38 -7
  363. package/skills/agent-commerce.md +106 -0
  364. package/skills/browser-navigation.md +117 -0
  365. package/skills/commerce-setup-guide.md +116 -0
  366. package/skills/commerce-setup.md +84 -0
  367. package/skills/configure-dev-tools.md +101 -0
  368. package/skills/travel-planning.md +138 -0
  369. package/dist/heart/daemon/auth-flow.js +0 -351
  370. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  371. package/dist/heart/daemon/subagent-installer.js +0 -166
  372. package/dist/heart/session-recall.js +0 -116
  373. package/dist/mind/associative-recall.js +0 -209
  374. package/dist/senses/bluebubbles-entry.js +0 -13
  375. package/dist/senses/bluebubbles.js +0 -1177
  376. package/dist/senses/debug-activity.js +0 -148
  377. package/subagents/README.md +0 -86
  378. package/subagents/work-doer.md +0 -237
  379. package/subagents/work-merger.md +0 -618
  380. package/subagents/work-planner.md +0 -390
  381. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  382. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  383. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  384. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  385. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  386. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  387. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  388. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  389. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  390. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  391. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  392. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  393. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  394. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  395. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  396. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readinessItemFromIssue = readinessItemFromIssue;
4
+ exports.buildHumanReadinessSnapshot = buildHumanReadinessSnapshot;
5
+ const runtime_1 = require("../../nerves/runtime");
6
+ const STATUS_PRIORITY = {
7
+ locked: 0,
8
+ "needs credentials": 1,
9
+ "needs attention": 2,
10
+ "needs setup": 3,
11
+ missing: 4,
12
+ "not attached": 5,
13
+ ready: 6,
14
+ attached: 6,
15
+ };
16
+ function statusFromIssue(issue) {
17
+ switch (issue.kind) {
18
+ case "vault-locked":
19
+ return "locked";
20
+ case "vault-unconfigured":
21
+ return "needs setup";
22
+ case "provider-credentials-missing":
23
+ return "needs credentials";
24
+ case "provider-live-check-failed":
25
+ return issue.actions[0]?.kind === "provider-auth" ? "needs credentials" : "needs attention";
26
+ case "generic":
27
+ return "needs attention";
28
+ }
29
+ }
30
+ function copyActions(actions) {
31
+ return actions.map((action) => ({
32
+ label: action.label,
33
+ command: action.command,
34
+ actor: action.actor,
35
+ ...(action.executable === undefined ? {} : { executable: action.executable }),
36
+ }));
37
+ }
38
+ function readinessItemFromIssue(issue, options) {
39
+ return {
40
+ key: options.key,
41
+ title: options.title,
42
+ status: statusFromIssue(issue),
43
+ summary: issue.summary,
44
+ detailLines: issue.detail ? [issue.detail] : [],
45
+ actions: copyActions(issue.actions),
46
+ };
47
+ }
48
+ function compareStatus(a, b) {
49
+ return STATUS_PRIORITY[a.status] - STATUS_PRIORITY[b.status];
50
+ }
51
+ function uniqueActions(items) {
52
+ const seen = new Set();
53
+ const actions = [];
54
+ for (const item of [...items].sort(compareStatus)) {
55
+ for (const [index, action] of item.actions.entries()) {
56
+ if (seen.has(action.command))
57
+ continue;
58
+ seen.add(action.command);
59
+ actions.push({
60
+ ...action,
61
+ ...(actions.length === 0 && index === 0 ? { recommended: true } : {}),
62
+ });
63
+ }
64
+ }
65
+ return actions;
66
+ }
67
+ function overallStatus(items) {
68
+ if (items.length === 0)
69
+ return "ready";
70
+ return [...items].sort(compareStatus)[0].status;
71
+ }
72
+ function summaryFor(status) {
73
+ if (status === "ready" || status === "attached") {
74
+ return "Everything needed here is ready.";
75
+ }
76
+ if (status === "locked") {
77
+ return "Start by unlocking the vault on this machine, then continue through the remaining steps.";
78
+ }
79
+ if (status === "needs credentials") {
80
+ return "At least one credential is missing, so the next move is to authenticate it.";
81
+ }
82
+ if (status === "needs attention") {
83
+ return "Something is configured but not healthy yet, so verify or refresh it before moving on.";
84
+ }
85
+ if (status === "needs setup") {
86
+ return "This capability needs setup before it can be used.";
87
+ }
88
+ return "This area still needs a little attention.";
89
+ }
90
+ function buildHumanReadinessSnapshot(options) {
91
+ const status = overallStatus(options.items);
92
+ const nextActions = uniqueActions(options.items);
93
+ const primaryAction = nextActions[0];
94
+ (0, runtime_1.emitNervesEvent)({
95
+ component: "daemon",
96
+ event: "daemon.human_readiness_snapshot",
97
+ message: "built human readiness snapshot",
98
+ meta: {
99
+ agent: options.agent,
100
+ title: options.title,
101
+ items: options.items.length,
102
+ status,
103
+ },
104
+ });
105
+ return {
106
+ agent: options.agent,
107
+ title: options.title,
108
+ status,
109
+ summary: summaryFor(status),
110
+ items: [...options.items].sort(compareStatus),
111
+ ...(primaryAction ? { primaryAction } : {}),
112
+ nextActions,
113
+ };
114
+ }
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildInnerStatusOutput = buildInnerStatusOutput;
4
+ const runtime_1 = require("../../nerves/runtime");
5
+ function formatRelativeTime(elapsedMs) {
6
+ const minutes = Math.floor(elapsedMs / (60 * 1000));
7
+ if (minutes < 1)
8
+ return "just now";
9
+ if (minutes === 1)
10
+ return "1 minute ago";
11
+ if (minutes < 60)
12
+ return `${minutes} minutes ago`;
13
+ const hours = Math.floor(minutes / 60);
14
+ if (hours === 1)
15
+ return "1 hour ago";
16
+ return `${hours} hours ago`;
17
+ }
18
+ function formatCadence(cadenceMs) {
19
+ const minutes = Math.round(cadenceMs / (60 * 1000));
20
+ if (minutes >= 60) {
21
+ const hours = Math.round(minutes / 60);
22
+ return `${hours}h`;
23
+ }
24
+ return `${minutes}m`;
25
+ }
26
+ function buildInnerStatusOutput(input) {
27
+ const { agentName, runtimeState, journalFiles, heartbeat, attentionCount, now } = input;
28
+ const lines = [];
29
+ lines.push(`inner dialog status: ${agentName}`);
30
+ // Last turn
31
+ if (runtimeState?.lastCompletedAt) {
32
+ const lastMs = new Date(runtimeState.lastCompletedAt).getTime();
33
+ const elapsed = now - lastMs;
34
+ const relativeTime = formatRelativeTime(elapsed);
35
+ const reasonSuffix = runtimeState.reason ? ` (${runtimeState.reason})` : "";
36
+ lines.push(` last turn: ${relativeTime}${reasonSuffix}`);
37
+ }
38
+ else {
39
+ lines.push(" last turn: unknown");
40
+ }
41
+ // Status
42
+ if (runtimeState) {
43
+ const reasonSuffix = runtimeState.status === "running" && runtimeState.reason ? ` (${runtimeState.reason})` : "";
44
+ lines.push(` status: ${runtimeState.status}${reasonSuffix}`);
45
+ }
46
+ else {
47
+ lines.push(" status: unknown");
48
+ }
49
+ // Heartbeat health
50
+ if (heartbeat && heartbeat.lastCompletedAt !== null) {
51
+ const elapsed = now - heartbeat.lastCompletedAt;
52
+ const threshold = heartbeat.cadenceMs * 1.5;
53
+ const health = elapsed < threshold ? "healthy" : "overdue";
54
+ const cadenceStr = formatCadence(heartbeat.cadenceMs);
55
+ const sinceStr = formatRelativeTime(elapsed);
56
+ lines.push(` heartbeat: ${health} (cadence ${cadenceStr}, ${sinceStr})`);
57
+ }
58
+ else {
59
+ lines.push(" heartbeat: unknown");
60
+ }
61
+ // Journal
62
+ if (journalFiles.length === 0) {
63
+ lines.push(" journal: (empty)");
64
+ }
65
+ else {
66
+ lines.push(" journal:");
67
+ const sorted = [...journalFiles].sort((a, b) => b.mtimeMs - a.mtimeMs);
68
+ for (const file of sorted) {
69
+ const elapsed = now - file.mtimeMs;
70
+ const relativeTime = formatRelativeTime(elapsed);
71
+ lines.push(` - ${file.name} (${relativeTime})`);
72
+ }
73
+ }
74
+ // Attention
75
+ const thoughtWord = attentionCount === 1 ? "thought" : "thoughts";
76
+ lines.push(` attention: ${attentionCount} held ${thoughtWord}`);
77
+ (0, runtime_1.emitNervesEvent)({
78
+ component: "daemon",
79
+ event: "daemon.inner_status_read",
80
+ message: "inner dialog status read",
81
+ meta: {
82
+ agentName,
83
+ status: runtimeState?.status ?? "unknown",
84
+ journalCount: journalFiles.length,
85
+ attentionCount,
86
+ },
87
+ });
88
+ return lines.join("\n");
89
+ }
@@ -0,0 +1,394 @@
1
+ "use strict";
2
+ /**
3
+ * Interactive repair flow for degraded agents detected during `ouro up`.
4
+ *
5
+ * Examines each degraded agent's errorReason and fixHint to detect common
6
+ * issue patterns and prompt the user for repair actions.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.hasRunnableInteractiveRepair = hasRunnableInteractiveRepair;
10
+ exports.isAffirmativeAnswer = isAffirmativeAnswer;
11
+ exports.runInteractiveRepair = runInteractiveRepair;
12
+ const runtime_1 = require("../../nerves/runtime");
13
+ const identity_1 = require("../identity");
14
+ const terminal_ui_1 = require("./terminal-ui");
15
+ function isCredentialIssue(degraded) {
16
+ const reason = degraded.errorReason.toLowerCase();
17
+ const hint = degraded.fixHint.toLowerCase();
18
+ return reason.includes("credentials") || hint.includes("ouro auth");
19
+ }
20
+ function isVaultUnlockIssue(degraded) {
21
+ const text = `${degraded.errorReason}\n${degraded.fixHint}`.toLowerCase();
22
+ return /ouro vault unlock|credential vault is locked|vault(?: is)? locked/.test(text);
23
+ }
24
+ function isConfigError(degraded) {
25
+ return degraded.fixHint.length > 0 && !isVaultUnlockIssue(degraded) && !isCredentialIssue(degraded);
26
+ }
27
+ function hasRunnableInteractiveRepair(degraded) {
28
+ if (degraded.issue?.actions.some((action) => typedActionToRunnable(degraded, action) !== undefined)) {
29
+ return true;
30
+ }
31
+ return isVaultUnlockIssue(degraded) || isCredentialIssue(degraded);
32
+ }
33
+ function isAgentProvider(value) {
34
+ return Object.prototype.hasOwnProperty.call(identity_1.PROVIDER_CREDENTIALS, value);
35
+ }
36
+ function extractProviderFromFixHint(fixHint) {
37
+ const provider = fixHint.match(/--provider\s+([a-z0-9-]+)/)?.[1]
38
+ ?? fixHint.match(/providers\.([a-z0-9-]+)/)?.[1];
39
+ if (!provider || !isAgentProvider(provider))
40
+ return undefined;
41
+ return provider;
42
+ }
43
+ function escapeRegExp(value) {
44
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
45
+ }
46
+ function cleanExtractedCommand(command) {
47
+ const cleaned = command?.trim().replace(/[`'",;:.)]+$/g, "").trim();
48
+ return cleaned && cleaned.length > 0 ? cleaned : undefined;
49
+ }
50
+ function extractRepairCommand(fixHint, commandPrefix) {
51
+ const escapedPrefix = escapeRegExp(commandPrefix);
52
+ const commandBody = `${escapedPrefix}(?=\\s|$)[^\`'"]*`;
53
+ const quoted = fixHint.match(new RegExp(`[\`'"](${commandBody})[\`'"]`, "i"))?.[1];
54
+ const unquoted = fixHint.match(new RegExp(`(${escapedPrefix}(?=\\s|$)[^\\n,;.]+)`, "i"))?.[1];
55
+ return cleanExtractedCommand(quoted) ?? cleanExtractedCommand(unquoted);
56
+ }
57
+ function authCommandFor(degraded) {
58
+ const command = extractRepairCommand(degraded.fixHint, "ouro auth");
59
+ return command && command.length > 0 ? command : `ouro auth --agent ${degraded.agent}`;
60
+ }
61
+ function vaultUnlockCommandFor(degraded) {
62
+ const command = extractRepairCommand(degraded.fixHint, "ouro vault unlock");
63
+ return command && command.length > 0 ? command : `ouro vault unlock --agent ${degraded.agent}`;
64
+ }
65
+ function isAffirmativeAnswer(answer) {
66
+ return /^(y|yes)$/i.test(answer.trim());
67
+ }
68
+ function uniqueCommands(commands) {
69
+ const seen = new Set();
70
+ const unique = [];
71
+ commands.forEach((command) => {
72
+ if (!command)
73
+ return;
74
+ if (seen.has(command))
75
+ return;
76
+ seen.add(command);
77
+ unique.push(command);
78
+ });
79
+ return unique;
80
+ }
81
+ function fallbackCommandsFor(degraded, primaryCommand) {
82
+ const issueCommands = degraded.issue?.actions.map((action) => action.command) ?? [];
83
+ return uniqueCommands([
84
+ primaryCommand,
85
+ ...issueCommands,
86
+ extractRepairCommand(degraded.fixHint, "ouro vault replace"),
87
+ extractRepairCommand(degraded.fixHint, "ouro vault recover"),
88
+ extractRepairCommand(degraded.fixHint, "ouro use"),
89
+ ]);
90
+ }
91
+ function renderRepairChoices(prefix, commands) {
92
+ return commands.map((command, index) => ` ${index === 0 ? prefix : "or"}: ${command}`);
93
+ }
94
+ function repairStatusFor(action) {
95
+ return action.kind === "vault-unlock" ? "locked" : "needs credentials";
96
+ }
97
+ function renderRepairQueueSummaryLines(degraded) {
98
+ const repairable = degraded
99
+ .map((entry) => ({ entry, action: runnableRepairActionFor(entry) }))
100
+ .filter((item) => item.action !== undefined);
101
+ if (repairable.length < 2)
102
+ return [];
103
+ const lines = [
104
+ "Repair queue",
105
+ `${repairable.length} agents need attention before startup can finish.`,
106
+ "",
107
+ ];
108
+ repairable.forEach(({ entry, action }, index) => {
109
+ lines.push(`${entry.agent} - ${action.label}`);
110
+ lines.push(` ${action.command}`);
111
+ if (index < repairable.length - 1)
112
+ lines.push("");
113
+ });
114
+ return lines;
115
+ }
116
+ function renderRepairQueueSummary(degraded, deps) {
117
+ const repairable = degraded
118
+ .map((entry) => ({ entry, action: runnableRepairActionFor(entry) }))
119
+ .filter((item) => item.action !== undefined);
120
+ if (!deps.isTTY) {
121
+ return renderRepairQueueSummaryLines(degraded).join("\n");
122
+ }
123
+ return (0, terminal_ui_1.renderTerminalWizard)({
124
+ isTTY: true,
125
+ columns: deps.stdoutColumns,
126
+ masthead: {
127
+ subtitle: "Repair paths ready.",
128
+ },
129
+ title: "Needs attention before startup can finish",
130
+ summary: "Ouro found repair steps it can open right now. It will walk through them one at a time.",
131
+ sections: [{
132
+ title: "Repair queue",
133
+ items: repairable.map(({ entry, action }) => ({
134
+ label: entry.agent,
135
+ status: repairStatusFor(action),
136
+ summary: action.label,
137
+ detailLines: [entry.errorReason],
138
+ command: action.command,
139
+ })),
140
+ }],
141
+ suppressEvent: true,
142
+ }).trimEnd();
143
+ }
144
+ function renderActionPromptLines(agent, action) {
145
+ const lines = [
146
+ `${agent}`,
147
+ ` needs: ${action.label}`,
148
+ ` run: ${action.command}`,
149
+ ];
150
+ if (action.kind === "vault-unlock") {
151
+ lines.push(" note: use the saved vault unlock secret");
152
+ }
153
+ return lines;
154
+ }
155
+ function renderActionPrompt(entry, action, deps) {
156
+ if (!deps.isTTY)
157
+ return renderActionPromptLines(entry.agent, action).join("\n");
158
+ const footer = action.kind === "vault-unlock"
159
+ ? "Only say yes if you have the saved vault unlock secret."
160
+ : "Say yes if you want Ouro to open the auth flow now.";
161
+ return (0, terminal_ui_1.renderTerminalWizard)({
162
+ isTTY: true,
163
+ columns: deps.stdoutColumns,
164
+ masthead: {
165
+ subtitle: "One repair step at a time.",
166
+ },
167
+ title: `Repair ${entry.agent}`,
168
+ summary: "Ouro found one clear next move for this agent.",
169
+ nextStep: {
170
+ label: action.kind === "vault-unlock"
171
+ ? "Unlock the credential vault on this machine."
172
+ : "Refresh provider authentication.",
173
+ detail: action.kind === "vault-unlock"
174
+ ? "Use the saved unlock secret if you have it. If not, leave this for later and choose a replacement or recovery path."
175
+ : "This opens the provider login or refresh flow for the selected provider.",
176
+ command: action.command,
177
+ },
178
+ sections: [{
179
+ title: "Why startup paused",
180
+ items: [{
181
+ label: entry.agent,
182
+ status: repairStatusFor(action),
183
+ summary: entry.errorReason,
184
+ }],
185
+ }],
186
+ footerLines: [footer],
187
+ suppressEvent: true,
188
+ }).trimEnd();
189
+ }
190
+ function renderDeferredRepair(agent, commands, deps) {
191
+ if (!deps.isTTY) {
192
+ return [
193
+ `Leaving ${agent} for later.`,
194
+ ...renderRepairChoices("next", commands),
195
+ ].join("\n");
196
+ }
197
+ return (0, terminal_ui_1.renderTerminalWizard)({
198
+ isTTY: true,
199
+ columns: deps.stdoutColumns,
200
+ masthead: {
201
+ subtitle: "Nothing changed yet.",
202
+ },
203
+ title: `Leaving ${agent} for later`,
204
+ summary: "Ouro did not open this repair flow right now.",
205
+ sections: [{
206
+ title: "Next time",
207
+ items: commands.map((command, index) => ({
208
+ key: String(index + 1),
209
+ label: index === 0 ? "Start here" : "Or try this",
210
+ command,
211
+ })),
212
+ }],
213
+ suppressEvent: true,
214
+ }).trimEnd();
215
+ }
216
+ function renderManualRepairHint(agent, fixHint) {
217
+ return [
218
+ `${agent}`,
219
+ " needs manual attention",
220
+ ` next: ${fixHint}`,
221
+ ].join("\n");
222
+ }
223
+ function renderUnknownRepair(agent, errorReason) {
224
+ return [
225
+ `${agent}`,
226
+ ` ${errorReason}`,
227
+ ].join("\n");
228
+ }
229
+ function writeDeclinedRepair(degraded, command, deps) {
230
+ deps.writeStdout(renderDeferredRepair(degraded.agent, fallbackCommandsFor(degraded, command), deps));
231
+ }
232
+ function runnableRepairActionFor(degraded) {
233
+ const typedAction = degraded.issue?.actions
234
+ .map((action) => typedActionToRunnable(degraded, action))
235
+ .find((action) => action !== undefined);
236
+ if (typedAction)
237
+ return typedAction;
238
+ if (isVaultUnlockIssue(degraded)) {
239
+ return { kind: "vault-unlock", label: "vault unlock", command: vaultUnlockCommandFor(degraded) };
240
+ }
241
+ if (isCredentialIssue(degraded)) {
242
+ return {
243
+ kind: "provider-auth",
244
+ label: "provider auth",
245
+ command: authCommandFor(degraded),
246
+ provider: extractProviderFromFixHint(degraded.fixHint),
247
+ };
248
+ }
249
+ return undefined;
250
+ }
251
+ function typedActionToRunnable(degraded, action) {
252
+ if (action.executable === false || action.command.includes("<"))
253
+ return undefined;
254
+ if (action.kind === "vault-unlock") {
255
+ return { kind: "vault-unlock", label: "vault unlock", command: action.command };
256
+ }
257
+ if (action.kind === "provider-auth") {
258
+ return {
259
+ kind: "provider-auth",
260
+ label: "provider auth",
261
+ command: action.command || `ouro auth --agent ${degraded.agent}`,
262
+ provider: action.provider,
263
+ };
264
+ }
265
+ return undefined;
266
+ }
267
+ function writeRepairQueueSummary(degraded, deps) {
268
+ const lines = renderRepairQueueSummaryLines(degraded);
269
+ if (lines.length > 0)
270
+ deps.writeStdout(renderRepairQueueSummary(degraded, deps));
271
+ }
272
+ async function attemptVaultUnlock(entry, action, deps) {
273
+ deps.writeStdout(renderActionPrompt(entry, action, deps));
274
+ const answer = await deps.promptInput(`Unlock ${entry.agent}'s vault now? [y/N] `);
275
+ if (!isAffirmativeAnswer(answer)) {
276
+ writeDeclinedRepair(entry, action.command, deps);
277
+ return { succeeded: false, attempted: false };
278
+ }
279
+ try {
280
+ if (!deps.runVaultUnlock) {
281
+ deps.writeStdout(renderManualRepairHint(entry.agent, entry.fixHint));
282
+ return { succeeded: false, attempted: false };
283
+ }
284
+ await deps.runVaultUnlock(entry.agent);
285
+ return { succeeded: true, attempted: true };
286
+ }
287
+ catch (error) {
288
+ const msg = error instanceof Error ? error.message : String(error);
289
+ deps.writeStdout(`Vault unlock did not finish for ${entry.agent}.\n ${msg}`);
290
+ (0, runtime_1.emitNervesEvent)({
291
+ level: "error",
292
+ component: "daemon",
293
+ event: "daemon.interactive_repair_vault_unlock_error",
294
+ message: `vault unlock failed for ${entry.agent}`,
295
+ meta: { agent: entry.agent, error: msg },
296
+ });
297
+ return { succeeded: false, attempted: true };
298
+ }
299
+ }
300
+ async function attemptProviderAuth(entry, action, deps) {
301
+ deps.writeStdout(renderActionPrompt(entry, action, deps));
302
+ const answer = await deps.promptInput(`Open the auth flow for ${entry.agent} now? [y/N] `);
303
+ if (!isAffirmativeAnswer(answer)) {
304
+ writeDeclinedRepair(entry, action.command, deps);
305
+ return { succeeded: false, attempted: false };
306
+ }
307
+ try {
308
+ if (action.provider) {
309
+ await deps.runAuthFlow(entry.agent, action.provider);
310
+ }
311
+ else {
312
+ await deps.runAuthFlow(entry.agent);
313
+ }
314
+ return { succeeded: true, attempted: true };
315
+ }
316
+ catch (error) {
317
+ const msg = error instanceof Error ? error.message : String(error);
318
+ deps.writeStdout(`Auth did not finish for ${entry.agent}.\n ${msg}`);
319
+ (0, runtime_1.emitNervesEvent)({
320
+ level: "error",
321
+ component: "daemon",
322
+ event: "daemon.interactive_repair_auth_error",
323
+ message: `auth flow failed for ${entry.agent}`,
324
+ meta: { agent: entry.agent, error: msg },
325
+ });
326
+ return { succeeded: false, attempted: true };
327
+ }
328
+ }
329
+ async function processEntry(entry, deps) {
330
+ let current = entry;
331
+ while (current) {
332
+ const action = runnableRepairActionFor(current);
333
+ let outcome;
334
+ if (action?.kind === "vault-unlock") {
335
+ outcome = await attemptVaultUnlock(current, action, deps);
336
+ }
337
+ else if (action?.kind === "provider-auth") {
338
+ outcome = await attemptProviderAuth(current, action, deps);
339
+ }
340
+ else if (isConfigError(current)) {
341
+ deps.writeStdout(renderManualRepairHint(current.agent, current.fixHint));
342
+ return { attempted: false };
343
+ }
344
+ else {
345
+ deps.writeStdout(renderUnknownRepair(current.agent, current.errorReason));
346
+ return { attempted: false };
347
+ }
348
+ if (!outcome.succeeded || !deps.recheckAgent) {
349
+ return { attempted: outcome.attempted };
350
+ }
351
+ // Re-evaluate the agent after successful repair
352
+ const recheckResult = await deps.recheckAgent(current.agent);
353
+ if (recheckResult === null) {
354
+ deps.writeStdout(`${current.agent} recovered.`);
355
+ return { attempted: true };
356
+ }
357
+ // Agent still degraded with a new error -- loop to present the new action
358
+ current = recheckResult;
359
+ }
360
+ /* v8 ignore next -- unreachable: loop always returns from within @preserve */
361
+ return { attempted: false };
362
+ }
363
+ async function runInteractiveRepair(degraded, deps) {
364
+ (0, runtime_1.emitNervesEvent)({
365
+ level: "info",
366
+ component: "daemon",
367
+ event: "daemon.interactive_repair_start",
368
+ message: "interactive repair flow started",
369
+ meta: { degradedCount: degraded.length },
370
+ });
371
+ if (degraded.length === 0) {
372
+ return { repairsAttempted: false };
373
+ }
374
+ let repairsAttempted = false;
375
+ if (!deps.skipQueueSummary) {
376
+ writeRepairQueueSummary(degraded, deps);
377
+ }
378
+ for (const entry of degraded) {
379
+ const result = await processEntry(entry, deps);
380
+ if (result.attempted)
381
+ repairsAttempted = true;
382
+ }
383
+ if (repairsAttempted) {
384
+ deps.writeStdout("Repair flow complete.");
385
+ }
386
+ (0, runtime_1.emitNervesEvent)({
387
+ level: "info",
388
+ component: "daemon",
389
+ event: "daemon.interactive_repair_end",
390
+ message: "interactive repair flow completed",
391
+ meta: { repairsAttempted },
392
+ });
393
+ return { repairsAttempted };
394
+ }
@@ -34,6 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.DAEMON_PLIST_LABEL = void 0;
37
+ exports.bootoutLaunchAgentByLabel = bootoutLaunchAgentByLabel;
37
38
  exports.generateDaemonPlist = generateDaemonPlist;
38
39
  exports.writeLaunchAgentPlist = writeLaunchAgentPlist;
39
40
  exports.installLaunchAgent = installLaunchAgent;
@@ -48,6 +49,26 @@ function plistFilePath(homeDir) {
48
49
  function userLaunchDomain(userUid) {
49
50
  return `gui/${userUid}`;
50
51
  }
52
+ function bootoutLaunchAgentByLabel(deps) {
53
+ const domain = userLaunchDomain(deps.userUid);
54
+ try {
55
+ deps.exec(`launchctl bootout ${domain}/${exports.DAEMON_PLIST_LABEL}`);
56
+ (0, runtime_1.emitNervesEvent)({
57
+ component: "daemon",
58
+ event: "daemon.launchd_label_bootout",
59
+ message: "booted out daemon launch agent by label",
60
+ meta: { label: exports.DAEMON_PLIST_LABEL, domain },
61
+ });
62
+ }
63
+ catch (error) {
64
+ (0, runtime_1.emitNervesEvent)({
65
+ component: "daemon",
66
+ event: "daemon.launchd_label_bootout_skipped",
67
+ message: "daemon launch agent label bootout skipped",
68
+ meta: { label: exports.DAEMON_PLIST_LABEL, domain, reason: error instanceof Error ? error.message : String(error) },
69
+ });
70
+ }
71
+ }
51
72
  function generateDaemonPlist(options) {
52
73
  (0, runtime_1.emitNervesEvent)({
53
74
  component: "daemon",
@@ -78,7 +99,13 @@ function generateDaemonPlist(options) {
78
99
  lines.push(` <key>EnvironmentVariables</key>`, ` <dict>`, ` <key>PATH</key>`, ` <string>${options.envPath}</string>`, ` </dict>`);
79
100
  }
80
101
  if (options.logDir) {
81
- lines.push(` <key>StandardOutPath</key>`, ` <string>${path.join(options.logDir, "ouro-daemon-stdout.log")}</string>`, ` <key>StandardErrorPath</key>`, ` <string>${path.join(options.logDir, "ouro-daemon-stderr.log")}</string>`);
102
+ // PR 1 decision: we no longer emit `StandardErrorPath` for the daemon.
103
+ // The daemon's structured nerves ndjson pipeline (rotated + gzipped via
104
+ // createNdjsonFileSink) is the source of truth for diagnostics. Writing
105
+ // raw process stderr to an unrotated file grew to 366 MB in the wild;
106
+ // dropping the key lets launchd forward stray stderr to the system log
107
+ // where it gets rotated by the OS.
108
+ lines.push(` <key>StandardOutPath</key>`, ` <string>${path.join(options.logDir, "ouro-daemon-stdout.log")}</string>`);
82
109
  }
83
110
  lines.push(`</dict>`, `</plist>`, ``);
84
111
  return lines.join("\n");
@@ -117,11 +144,17 @@ function installLaunchAgent(deps, options) {
117
144
  catch { /* best effort */ }
118
145
  }
119
146
  writeLaunchAgentPlist(deps, options);
120
- deps.exec(`launchctl bootstrap ${domain} "${fullPath}"`);
147
+ // Bootstrap the plist so launchd manages crash recovery via KeepAlive.
148
+ // This is safe because ouro up calls this AFTER the daemon is already running,
149
+ // so launchd sees the existing process and just registers for KeepAlive.
150
+ try {
151
+ deps.exec(`launchctl bootstrap ${domain} "${fullPath}"`);
152
+ }
153
+ catch { /* already loaded */ }
121
154
  (0, runtime_1.emitNervesEvent)({
122
155
  component: "daemon",
123
156
  event: "daemon.launchd_installed",
124
- message: "launch agent installed",
157
+ message: "launch agent installed with KeepAlive",
125
158
  meta: { plistPath: fullPath },
126
159
  });
127
160
  }
@@ -133,12 +166,8 @@ function uninstallLaunchAgent(deps) {
133
166
  meta: {},
134
167
  });
135
168
  const fullPath = plistFilePath(deps.homeDir);
136
- const domain = userLaunchDomain(deps.userUid);
169
+ bootoutLaunchAgentByLabel(deps);
137
170
  if (deps.existsFile(fullPath)) {
138
- try {
139
- deps.exec(`launchctl bootout ${domain} "${fullPath}"`);
140
- }
141
- catch { /* best effort */ }
142
171
  deps.removeFile(fullPath);
143
172
  }
144
173
  (0, runtime_1.emitNervesEvent)({