@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,295 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.DEFAULT_RETAIN_VERSIONS = void 0;
37
+ exports.getOuroCliHome = getOuroCliHome;
38
+ exports.getCurrentVersion = getCurrentVersion;
39
+ exports.getPreviousVersion = getPreviousVersion;
40
+ exports.buildChangelogCommand = buildChangelogCommand;
41
+ exports.listInstalledVersions = listInstalledVersions;
42
+ exports.installVersion = installVersion;
43
+ exports.activateVersion = activateVersion;
44
+ exports.compareCliVersions = compareCliVersions;
45
+ exports.selectVersionsToPrune = selectVersionsToPrune;
46
+ exports.pruneOldVersions = pruneOldVersions;
47
+ exports.ensureLayout = ensureLayout;
48
+ const fs = __importStar(require("fs"));
49
+ const os = __importStar(require("os"));
50
+ const path = __importStar(require("path"));
51
+ const runtime_1 = require("../../nerves/runtime");
52
+ /** Maximum number of installed CLI versions to retain after pruning. */
53
+ exports.DEFAULT_RETAIN_VERSIONS = 5;
54
+ function getOuroCliHome(homeDir) {
55
+ /* v8 ignore next -- dep default: tests always inject @preserve */
56
+ const home = homeDir ?? os.homedir();
57
+ return path.join(home, ".ouro-cli");
58
+ }
59
+ function getCurrentVersion(deps) {
60
+ const cliHome = getOuroCliHome(deps.homeDir);
61
+ /* v8 ignore next -- dep default: tests always inject @preserve */
62
+ const readlinkSync = deps.readlinkSync ?? fs.readlinkSync;
63
+ try {
64
+ const target = readlinkSync(path.join(cliHome, "CurrentVersion"));
65
+ return path.basename(target);
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ }
71
+ function getPreviousVersion(deps) {
72
+ const cliHome = getOuroCliHome(deps.homeDir);
73
+ /* v8 ignore next -- dep default: tests always inject @preserve */
74
+ const readlinkSync = deps.readlinkSync ?? fs.readlinkSync;
75
+ try {
76
+ const target = readlinkSync(path.join(cliHome, "previous"));
77
+ return path.basename(target);
78
+ }
79
+ catch {
80
+ return null;
81
+ }
82
+ }
83
+ function buildChangelogCommand(previousVersion, currentVersion) {
84
+ if (!previousVersion || !currentVersion || previousVersion === currentVersion) {
85
+ return null;
86
+ }
87
+ return `ouro changelog --from ${previousVersion}`;
88
+ }
89
+ function listInstalledVersions(deps) {
90
+ const cliHome = getOuroCliHome(deps.homeDir);
91
+ /* v8 ignore next -- dep default: tests always inject @preserve */
92
+ const readdirSync = deps.readdirSync ?? ((p, opts) => fs.readdirSync(p, opts));
93
+ try {
94
+ const entries = readdirSync(path.join(cliHome, "versions"), { withFileTypes: true });
95
+ return entries.filter((e) => e.isDirectory()).map((e) => e.name);
96
+ }
97
+ catch {
98
+ return [];
99
+ }
100
+ }
101
+ function installVersion(version, deps) {
102
+ const cliHome = getOuroCliHome(deps.homeDir);
103
+ /* v8 ignore start -- dep defaults: tests always inject @preserve */
104
+ const mkdirSync = deps.mkdirSync ?? fs.mkdirSync;
105
+ const execSync = deps.execSync ?? ((cmd, opts) => require("child_process").execSync(cmd, opts));
106
+ /* v8 ignore stop */
107
+ const versionDir = path.join(cliHome, "versions", version);
108
+ (0, runtime_1.emitNervesEvent)({
109
+ component: "daemon",
110
+ event: "daemon.cli_version_install_start",
111
+ message: "installing CLI version",
112
+ meta: { version, versionDir },
113
+ });
114
+ mkdirSync(versionDir, { recursive: true });
115
+ execSync(`npm install --prefix ${versionDir} @ouro.bot/cli@${version}`, { stdio: "pipe" });
116
+ (0, runtime_1.emitNervesEvent)({
117
+ component: "daemon",
118
+ event: "daemon.cli_version_install_end",
119
+ message: "CLI version installed",
120
+ meta: { version, versionDir },
121
+ });
122
+ }
123
+ function activateVersion(version, deps) {
124
+ const cliHome = getOuroCliHome(deps.homeDir);
125
+ /* v8 ignore start -- dep defaults: tests always inject @preserve */
126
+ const readlinkSync = deps.readlinkSync ?? fs.readlinkSync;
127
+ const unlinkSync = deps.unlinkSync ?? fs.unlinkSync;
128
+ const symlinkSync = deps.symlinkSync ?? fs.symlinkSync;
129
+ const existsSync = deps.existsSync ?? fs.existsSync;
130
+ /* v8 ignore stop */
131
+ const currentVersionPath = path.join(cliHome, "CurrentVersion");
132
+ const previousPath = path.join(cliHome, "previous");
133
+ const newTarget = path.join(cliHome, "versions", version);
134
+ (0, runtime_1.emitNervesEvent)({
135
+ component: "daemon",
136
+ event: "daemon.cli_version_activate",
137
+ message: "activating CLI version",
138
+ meta: { version },
139
+ });
140
+ // Read old CurrentVersion target (may not exist)
141
+ let oldTarget = null;
142
+ try {
143
+ oldTarget = readlinkSync(currentVersionPath);
144
+ }
145
+ catch {
146
+ // No current version — first install
147
+ }
148
+ // Update previous symlink to point to old current
149
+ if (oldTarget) {
150
+ try {
151
+ unlinkSync(previousPath);
152
+ }
153
+ catch {
154
+ // previous symlink may not exist yet
155
+ }
156
+ symlinkSync(oldTarget, previousPath);
157
+ }
158
+ // Update CurrentVersion symlink
159
+ if (existsSync(currentVersionPath)) {
160
+ unlinkSync(currentVersionPath);
161
+ }
162
+ symlinkSync(newTarget, currentVersionPath);
163
+ }
164
+ /**
165
+ * Compare two version strings of the form `0.1.0-alpha.{n}`. Returns
166
+ * positive when `a` is newer, negative when `b` is newer, 0 when equal.
167
+ *
168
+ * The harness only ships `0.1.0-alpha.{n}` versions today; this comparator
169
+ * extracts the numeric tail and falls back to a lexicographic compare for
170
+ * any version that doesn't match the pattern (so unexpected version
171
+ * formats sort consistently rather than throwing).
172
+ */
173
+ function compareCliVersions(a, b) {
174
+ const aMatch = /alpha\.(\d+)/.exec(a);
175
+ const bMatch = /alpha\.(\d+)/.exec(b);
176
+ if (aMatch && bMatch) {
177
+ const aN = parseInt(aMatch[1], 10);
178
+ const bN = parseInt(bMatch[1], 10);
179
+ return aN - bN;
180
+ }
181
+ // Fallback: lexicographic. Both-mismatched and one-mismatched cases land
182
+ // here. Predictable, even if not strictly semver-correct.
183
+ if (a < b)
184
+ return -1;
185
+ if (a > b)
186
+ return 1;
187
+ return 0;
188
+ }
189
+ /**
190
+ * Identify which installed CLI versions can be safely deleted, given a
191
+ * retention policy. Pure: takes the full version list and the protected
192
+ * (current/previous) versions, returns the versions to delete.
193
+ *
194
+ * Retention rules:
195
+ * - Always keep the N most recent versions (default 5).
196
+ * - Always keep the currently-active version (CurrentVersion symlink target).
197
+ * - Always keep the previous version (previous symlink target) so rollback
198
+ * stays one command away.
199
+ * - Delete everything else.
200
+ *
201
+ * Exported so tests can pin the policy without shelling out to a real fs.
202
+ */
203
+ function selectVersionsToPrune(installedVersions, protectedVersions, retain = exports.DEFAULT_RETAIN_VERSIONS) {
204
+ if (installedVersions.length <= retain)
205
+ return [];
206
+ const sorted = [...installedVersions].sort(compareCliVersions).reverse();
207
+ const keepers = new Set(sorted.slice(0, retain));
208
+ if (protectedVersions.current)
209
+ keepers.add(protectedVersions.current);
210
+ if (protectedVersions.previous)
211
+ keepers.add(protectedVersions.previous);
212
+ return installedVersions.filter((v) => !keepers.has(v));
213
+ }
214
+ /**
215
+ * Prune installed CLI versions according to the retention policy. Removes
216
+ * `~/.ouro-cli/versions/{version}/` directories for versions outside the
217
+ * retention window. Best-effort: per-version delete failures are logged
218
+ * via nerves but don't propagate.
219
+ *
220
+ * Called from the activate path (cli-defaults.ts) so that every successful
221
+ * `ouro up` self-prunes. The user observed `~/.ouro-cli/versions/` going
222
+ * back to alpha.85 from March 20 — every CLI version they'd ever installed
223
+ * was still on disk because nothing ever GCed.
224
+ */
225
+ function pruneOldVersions(retain = exports.DEFAULT_RETAIN_VERSIONS, deps = {}) {
226
+ const cliHome = getOuroCliHome(deps.homeDir);
227
+ /* v8 ignore start -- dep defaults: tests always inject @preserve */
228
+ const readdirSync = deps.readdirSync ?? ((p, opts) => fs.readdirSync(p, opts));
229
+ const readlinkSync = deps.readlinkSync ?? fs.readlinkSync;
230
+ const rmSync = deps.rmSync ?? fs.rmSync;
231
+ /* v8 ignore stop */
232
+ const versionsDir = path.join(cliHome, "versions");
233
+ let installed;
234
+ try {
235
+ installed = readdirSync(versionsDir, { withFileTypes: true })
236
+ .filter((e) => e.isDirectory())
237
+ .map((e) => e.name);
238
+ }
239
+ catch {
240
+ return { kept: [], deleted: [], failed: [] };
241
+ }
242
+ const current = (() => {
243
+ try {
244
+ return path.basename(readlinkSync(path.join(cliHome, "CurrentVersion")));
245
+ }
246
+ catch {
247
+ return null;
248
+ }
249
+ })();
250
+ const previous = (() => {
251
+ try {
252
+ return path.basename(readlinkSync(path.join(cliHome, "previous")));
253
+ }
254
+ catch {
255
+ return null;
256
+ }
257
+ })();
258
+ const toDelete = selectVersionsToPrune(installed, { current, previous }, retain);
259
+ const deleted = [];
260
+ const failed = [];
261
+ for (const version of toDelete) {
262
+ const versionDir = path.join(versionsDir, version);
263
+ try {
264
+ rmSync(versionDir, { recursive: true, force: true });
265
+ deleted.push(version);
266
+ }
267
+ catch (error) {
268
+ failed.push({
269
+ version,
270
+ error: error instanceof Error ? error.message : /* v8 ignore next -- defensive: non-Error catch branch @preserve */ String(error),
271
+ });
272
+ }
273
+ }
274
+ (0, runtime_1.emitNervesEvent)({
275
+ component: "daemon",
276
+ event: "daemon.cli_versions_pruned",
277
+ message: `pruned ${deleted.length} old CLI versions`,
278
+ meta: { retain, deleted, failed: failed.length, kept: installed.filter((v) => !deleted.includes(v)) },
279
+ });
280
+ return { kept: installed.filter((v) => !deleted.includes(v)), deleted, failed };
281
+ }
282
+ function ensureLayout(deps) {
283
+ const cliHome = getOuroCliHome(deps.homeDir);
284
+ /* v8 ignore next -- dep default: tests always inject @preserve */
285
+ const mkdirSync = deps.mkdirSync ?? fs.mkdirSync;
286
+ mkdirSync(cliHome, { recursive: true });
287
+ mkdirSync(path.join(cliHome, "bin"), { recursive: true });
288
+ mkdirSync(path.join(cliHome, "versions"), { recursive: true });
289
+ (0, runtime_1.emitNervesEvent)({
290
+ component: "daemon",
291
+ event: "daemon.cli_layout_ensured",
292
+ message: "CLI directory layout ensured",
293
+ meta: { cliHome },
294
+ });
295
+ }
@@ -45,14 +45,22 @@ async function performStagedRestart(version, deps) {
45
45
  });
46
46
  // Step 1: Install new version
47
47
  try {
48
- deps.execSync(`npm install -g @ouro.bot/cli@${version}`);
48
+ if (deps.installNewVersion) {
49
+ deps.installNewVersion(version);
50
+ }
51
+ else {
52
+ // Backward-compat fallback for callers that haven't migrated to the
53
+ // version-managed installer. Tests use this path with a mocked
54
+ // execSync; production callers inject installNewVersion.
55
+ deps.execSync(`npm install -g @ouro.bot/cli@${version}`);
56
+ }
49
57
  }
50
58
  catch (err) {
51
59
  const errorMessage = err instanceof Error ? err.message : /* v8 ignore next -- defensive: non-Error catch branch @preserve */ String(err);
52
60
  (0, runtime_1.emitNervesEvent)({
53
61
  component: "daemon",
54
62
  event: "daemon.staged_restart_install_failed",
55
- message: "npm install failed",
63
+ message: "install failed",
56
64
  meta: { version, error: errorMessage },
57
65
  });
58
66
  return { ok: false, error: errorMessage };
@@ -90,25 +98,49 @@ async function performStagedRestart(version, deps) {
90
98
  });
91
99
  return { ok: false, error: `hook runner exited with code ${spawnResult.status}` };
92
100
  }
93
- // Step 4: Graceful shutdown (launchd will restart with new code)
101
+ // Step 4: Graceful shutdown then self-spawn new daemon
102
+ // We can't rely on launchd KeepAlive — the plist may not be loaded.
103
+ // Instead: shut down (releases socket), spawn new daemon from updated code.
94
104
  (0, runtime_1.emitNervesEvent)({
95
105
  component: "daemon",
96
106
  event: "daemon.staged_restart_hooks_passed",
97
- message: "hooks passed, shutting down for restart",
107
+ message: "hooks passed, shutting down and spawning new daemon",
98
108
  meta: { version },
99
109
  });
110
+ let shutdownError;
100
111
  try {
101
112
  await deps.gracefulShutdown();
102
113
  }
103
114
  catch (err) {
104
- const shutdownError = err instanceof Error ? err.message : /* v8 ignore next -- defensive: non-Error catch branch @preserve */ String(err);
115
+ shutdownError = err instanceof Error ? err.message : /* v8 ignore next -- defensive: non-Error catch branch @preserve */ String(err);
105
116
  (0, runtime_1.emitNervesEvent)({
106
117
  component: "daemon",
107
118
  event: "daemon.staged_restart_shutdown_error",
108
- message: "graceful shutdown encountered error",
119
+ message: "graceful shutdown encountered error (continuing with spawn)",
109
120
  meta: { version, error: shutdownError },
110
121
  });
111
- return { ok: true, shutdownError };
112
122
  }
113
- return { ok: true };
123
+ // Spawn new daemon from updated code path
124
+ const newEntry = path.join(newCodePath, "dist", "heart", "daemon", "daemon-entry.js");
125
+ const socketArg = deps.socketPath ?? "/tmp/ouroboros-daemon.sock";
126
+ try {
127
+ const { pid } = deps.spawnNewDaemon(newEntry, socketArg);
128
+ (0, runtime_1.emitNervesEvent)({
129
+ component: "daemon",
130
+ event: "daemon.staged_restart_spawned",
131
+ message: "new daemon spawned successfully",
132
+ meta: { version, pid, entry: newEntry },
133
+ });
134
+ }
135
+ catch (err) {
136
+ const spawnError = err instanceof Error ? err.message : /* v8 ignore next -- defensive: non-Error catch branch @preserve */ String(err);
137
+ (0, runtime_1.emitNervesEvent)({
138
+ component: "daemon",
139
+ event: "daemon.staged_restart_respawn_failed",
140
+ message: "failed to spawn new daemon after shutdown",
141
+ meta: { version, error: spawnError, entry: newEntry },
142
+ });
143
+ return { ok: false, error: `shutdown succeeded but failed to spawn new daemon: ${spawnError}`, shutdownError };
144
+ }
145
+ return { ok: true, shutdownError };
114
146
  }
@@ -33,12 +33,15 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.CLI_UPDATE_DIST_TAG = exports.CLI_UPDATE_CHECK_TIMEOUT_MS = void 0;
36
37
  exports.checkForUpdate = checkForUpdate;
37
38
  exports.startUpdateChecker = startUpdateChecker;
38
39
  exports.stopUpdateChecker = stopUpdateChecker;
39
40
  const semver = __importStar(require("semver"));
40
41
  const runtime_1 = require("../../nerves/runtime");
41
42
  const DEFAULT_INTERVAL_MS = 30 * 60 * 1000; // 30 minutes
43
+ exports.CLI_UPDATE_CHECK_TIMEOUT_MS = 3_000;
44
+ exports.CLI_UPDATE_DIST_TAG = "latest";
42
45
  async function checkForUpdate(currentVersion, deps) {
43
46
  (0, runtime_1.emitNervesEvent)({
44
47
  component: "daemon",
@@ -102,9 +105,11 @@ function stopUpdateChecker() {
102
105
  clearInterval(_intervalId);
103
106
  _intervalId = null;
104
107
  }
108
+ // `_end` (not `_stop`) to satisfy the nerves audit's start/end pairing
109
+ // rule — counterpart to `daemon.update_checker_start` above.
105
110
  (0, runtime_1.emitNervesEvent)({
106
111
  component: "daemon",
107
- event: "daemon.update_checker_stop",
112
+ event: "daemon.update_checker_end",
108
113
  message: "stopping update checker",
109
114
  meta: {},
110
115
  });
@@ -65,74 +65,78 @@ async function applyPendingUpdates(bundlesRoot, currentVersion) {
65
65
  message: "applying pending updates",
66
66
  meta: { bundlesRoot, currentVersion },
67
67
  });
68
- if (!fs.existsSync(bundlesRoot)) {
69
- return summary;
70
- }
71
- let entries;
72
68
  try {
73
- entries = fs.readdirSync(bundlesRoot, { withFileTypes: true });
74
- }
75
- catch {
76
- return summary;
77
- }
78
- for (const entry of entries) {
79
- if (!entry.isDirectory() || !entry.name.endsWith(".ouro"))
80
- continue;
81
- const agentRoot = path.join(bundlesRoot, entry.name);
82
- let previousVersion;
83
- const metaPath = path.join(agentRoot, "bundle-meta.json");
69
+ if (!fs.existsSync(bundlesRoot)) {
70
+ return summary;
71
+ }
72
+ let entries;
84
73
  try {
85
- if (fs.existsSync(metaPath)) {
86
- const raw = fs.readFileSync(metaPath, "utf-8");
87
- const meta = JSON.parse(raw);
88
- previousVersion = meta.runtimeVersion;
89
- if (previousVersion === currentVersion) {
90
- continue;
91
- }
92
- // Skip downgrades — only update forward
93
- if (semver.valid(previousVersion) && semver.valid(currentVersion) && semver.gte(previousVersion, currentVersion)) {
94
- (0, runtime_1.emitNervesEvent)({
95
- component: "daemon",
96
- event: "daemon.update_hook_skip_downgrade",
97
- message: "skipping downgrade",
98
- meta: { agentRoot, previousVersion, currentVersion },
99
- });
100
- continue;
101
- }
102
- }
74
+ entries = fs.readdirSync(bundlesRoot, { withFileTypes: true });
103
75
  }
104
76
  catch {
105
- // Malformed or unreadable bundle-meta.json -- treat as needing update
106
- previousVersion = undefined;
77
+ return summary;
107
78
  }
108
- const ctx = { agentRoot, currentVersion, previousVersion };
109
- for (const hook of _hooks) {
79
+ for (const entry of entries) {
80
+ if (!entry.isDirectory() || !entry.name.endsWith(".ouro"))
81
+ continue;
82
+ const agentRoot = path.join(bundlesRoot, entry.name);
83
+ let previousVersion;
84
+ const metaPath = path.join(agentRoot, "bundle-meta.json");
110
85
  try {
111
- await hook(ctx);
86
+ if (fs.existsSync(metaPath)) {
87
+ const raw = fs.readFileSync(metaPath, "utf-8");
88
+ const meta = JSON.parse(raw);
89
+ previousVersion = meta.runtimeVersion;
90
+ if (previousVersion === currentVersion) {
91
+ continue;
92
+ }
93
+ // Skip downgrades — only update forward
94
+ if (semver.valid(previousVersion) && semver.valid(currentVersion) && semver.gte(previousVersion, currentVersion)) {
95
+ (0, runtime_1.emitNervesEvent)({
96
+ component: "daemon",
97
+ event: "daemon.update_hook_skip_downgrade",
98
+ message: "skipping downgrade",
99
+ meta: { agentRoot, previousVersion, currentVersion },
100
+ });
101
+ continue;
102
+ }
103
+ }
104
+ }
105
+ catch {
106
+ // Malformed or unreadable bundle-meta.json -- treat as needing update
107
+ previousVersion = undefined;
112
108
  }
113
- catch (err) {
114
- (0, runtime_1.emitNervesEvent)({
115
- component: "daemon",
116
- event: "daemon.update_hook_error",
117
- message: "update hook threw",
118
- meta: {
119
- agentRoot,
120
- error: err instanceof Error ? err.message : /* v8 ignore next -- defensive: non-Error catch branch @preserve */ String(err),
121
- },
122
- });
109
+ const ctx = { agentRoot, currentVersion, previousVersion };
110
+ for (const hook of _hooks) {
111
+ try {
112
+ await hook(ctx);
113
+ }
114
+ catch (err) {
115
+ (0, runtime_1.emitNervesEvent)({
116
+ component: "daemon",
117
+ event: "daemon.update_hook_error",
118
+ message: "update hook threw",
119
+ meta: {
120
+ agentRoot,
121
+ error: err instanceof Error ? err.message : /* v8 ignore next -- defensive: non-Error catch branch @preserve */ String(err),
122
+ },
123
+ });
124
+ }
123
125
  }
126
+ summary.updated.push({
127
+ agent: entry.name.replace(/\.ouro$/, ""),
128
+ from: previousVersion,
129
+ to: currentVersion,
130
+ });
124
131
  }
125
- summary.updated.push({
126
- agent: entry.name.replace(/\.ouro$/, ""),
127
- from: previousVersion,
128
- to: currentVersion,
132
+ return summary;
133
+ }
134
+ finally {
135
+ (0, runtime_1.emitNervesEvent)({
136
+ component: "daemon",
137
+ event: "daemon.apply_pending_updates_end",
138
+ message: "pending updates applied",
139
+ meta: { bundlesRoot },
129
140
  });
130
141
  }
131
- (0, runtime_1.emitNervesEvent)({
132
- component: "daemon",
133
- event: "daemon.apply_pending_updates_end",
134
- message: "pending updates applied",
135
- meta: { bundlesRoot },
136
- });
137
- return summary;
138
142
  }