@ouro.bot/cli 0.1.0-alpha.72 → 0.1.0-alpha.721

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 (505) hide show
  1. package/README.md +133 -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 +4569 -14
  13. package/dist/a2a/card.js +57 -0
  14. package/dist/a2a/client.js +180 -0
  15. package/dist/a2a/config.js +50 -0
  16. package/dist/a2a/delegation-stores.js +56 -0
  17. package/dist/a2a/did-resolution.js +93 -0
  18. package/dist/a2a/identity.js +170 -0
  19. package/dist/a2a/inbound-share.js +107 -0
  20. package/dist/a2a/mission-result-wire.js +196 -0
  21. package/dist/a2a/onboarding.js +115 -0
  22. package/dist/a2a/pin-store.js +132 -0
  23. package/dist/a2a/seen-ledger.js +120 -0
  24. package/dist/a2a/server.js +604 -0
  25. package/dist/a2a/task-store.js +69 -0
  26. package/dist/a2a/transport.js +45 -0
  27. package/dist/a2a/types.js +3 -0
  28. package/dist/arc/attention-types.js +8 -0
  29. package/dist/arc/cares.js +144 -0
  30. package/dist/arc/episodes.js +118 -0
  31. package/dist/arc/evolution.js +490 -0
  32. package/dist/arc/flight-recorder.js +1034 -0
  33. package/dist/arc/intentions.js +134 -0
  34. package/dist/arc/json-store.js +117 -0
  35. package/dist/arc/obligations.js +348 -0
  36. package/dist/arc/packets.js +336 -0
  37. package/dist/arc/presence.js +185 -0
  38. package/dist/arc/task-lifecycle.js +57 -0
  39. package/dist/commerce/store.js +755 -0
  40. package/dist/commerce/types.js +3 -0
  41. package/dist/heart/active-work.js +867 -43
  42. package/dist/heart/agent-entry.js +190 -3
  43. package/dist/heart/attachments/image-normalize.js +194 -0
  44. package/dist/heart/attachments/materialize.js +97 -0
  45. package/dist/heart/attachments/originals.js +88 -0
  46. package/dist/heart/attachments/render.js +29 -0
  47. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  48. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  49. package/dist/heart/attachments/sources/index.js +16 -0
  50. package/dist/heart/attachments/store.js +103 -0
  51. package/dist/heart/attachments/types.js +93 -0
  52. package/dist/heart/auth/auth-flow.js +479 -0
  53. package/dist/heart/autonomy-budget.js +434 -0
  54. package/dist/heart/awaiting/await-alert.js +146 -0
  55. package/dist/heart/awaiting/await-expiry.js +108 -0
  56. package/dist/heart/awaiting/await-loader.js +91 -0
  57. package/dist/heart/awaiting/await-parser.js +141 -0
  58. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  59. package/dist/heart/awaiting/await-scheduler.js +378 -0
  60. package/dist/heart/background-operations.js +281 -0
  61. package/dist/heart/bridges/manager.js +137 -17
  62. package/dist/heart/bridges/store.js +14 -2
  63. package/dist/heart/bundle-state.js +168 -0
  64. package/dist/heart/commitments.js +135 -0
  65. package/dist/heart/config-registry.js +331 -0
  66. package/dist/heart/config.js +119 -127
  67. package/dist/heart/context-loss-gauntlet.js +354 -0
  68. package/dist/heart/context-loss-sentinel.js +1155 -0
  69. package/dist/heart/core.js +1306 -278
  70. package/dist/heart/cross-chat-delivery.js +8 -22
  71. package/dist/heart/daemon/agent-config-check.js +451 -0
  72. package/dist/heart/daemon/agent-discovery.js +185 -3
  73. package/dist/heart/daemon/agent-service.js +542 -0
  74. package/dist/heart/daemon/agentic-repair.js +547 -0
  75. package/dist/heart/daemon/await-private-wake.js +59 -0
  76. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  77. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  78. package/dist/heart/daemon/cadence.js +180 -0
  79. package/dist/heart/daemon/cli-defaults.js +825 -0
  80. package/dist/heart/daemon/cli-desk.js +322 -0
  81. package/dist/heart/daemon/cli-exec.js +8264 -0
  82. package/dist/heart/daemon/cli-help.js +678 -0
  83. package/dist/heart/daemon/cli-parse.js +2539 -0
  84. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  85. package/dist/heart/daemon/cli-render.js +770 -0
  86. package/dist/heart/daemon/cli-types.js +8 -0
  87. package/dist/heart/daemon/connect-bay.js +323 -0
  88. package/dist/heart/daemon/daemon-cli.js +29 -2010
  89. package/dist/heart/daemon/daemon-entry.js +842 -10
  90. package/dist/heart/daemon/daemon-health.js +176 -0
  91. package/dist/heart/daemon/daemon-rollup.js +57 -0
  92. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  93. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  94. package/dist/heart/daemon/daemon.js +1289 -84
  95. package/dist/heart/daemon/dns-workflow.js +394 -0
  96. package/dist/heart/daemon/doctor-types.js +8 -0
  97. package/dist/heart/daemon/doctor.js +1126 -0
  98. package/dist/heart/daemon/habit-private-wake.js +56 -0
  99. package/dist/heart/daemon/health-monitor.js +142 -11
  100. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  101. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  102. package/dist/heart/daemon/http-health-probe.js +80 -0
  103. package/dist/heart/daemon/human-command-screens.js +234 -0
  104. package/dist/heart/daemon/human-readiness.js +114 -0
  105. package/dist/heart/daemon/inner-status.js +78 -0
  106. package/dist/heart/daemon/interactive-repair.js +394 -0
  107. package/dist/heart/daemon/launchd.js +37 -8
  108. package/dist/heart/daemon/log-tailer.js +79 -10
  109. package/dist/heart/daemon/logs-prune.js +110 -0
  110. package/dist/heart/daemon/mcp-canary.js +393 -0
  111. package/dist/heart/daemon/message-router.js +45 -5
  112. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  113. package/dist/heart/daemon/os-cron-deps.js +135 -0
  114. package/dist/heart/daemon/os-cron.js +22 -14
  115. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  116. package/dist/heart/daemon/ouro-entry.js +3 -1
  117. package/dist/heart/daemon/plugin-cli.js +432 -0
  118. package/dist/heart/daemon/process-manager.js +519 -40
  119. package/dist/heart/daemon/provider-discovery.js +137 -0
  120. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  121. package/dist/heart/daemon/pulse.js +511 -0
  122. package/dist/heart/daemon/readiness-repair.js +365 -0
  123. package/dist/heart/daemon/run-hooks.js +2 -0
  124. package/dist/heart/daemon/runtime-logging.js +41 -14
  125. package/dist/heart/daemon/runtime-metadata.js +2 -30
  126. package/dist/heart/daemon/safe-mode.js +161 -0
  127. package/dist/heart/daemon/sense-manager.js +670 -48
  128. package/dist/heart/daemon/session-id-resolver.js +131 -0
  129. package/dist/heart/daemon/skill-management-installer.js +1 -1
  130. package/dist/heart/daemon/socket-client.js +171 -12
  131. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  132. package/dist/heart/daemon/startup-tui.js +338 -0
  133. package/dist/heart/daemon/task-scheduler.js +117 -39
  134. package/dist/heart/daemon/terminal-ui.js +499 -0
  135. package/dist/heart/daemon/thoughts.js +255 -43
  136. package/dist/heart/daemon/up-progress.js +366 -0
  137. package/dist/heart/daemon/vault-items.js +56 -0
  138. package/dist/heart/delegation.js +1 -4
  139. package/dist/heart/external-events/router.js +121 -0
  140. package/dist/heart/habits/habit-migration.js +189 -0
  141. package/dist/heart/habits/habit-parser.js +214 -0
  142. package/dist/heart/habits/habit-runtime-state.js +114 -0
  143. package/dist/heart/habits/habit-scheduler.js +431 -0
  144. package/dist/heart/habits/habit-session-summary.js +318 -0
  145. package/dist/heart/habits/habit-session.js +620 -0
  146. package/dist/heart/{daemon → hatch}/hatch-flow.js +51 -60
  147. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  148. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  149. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  150. package/dist/heart/identity.js +174 -59
  151. package/dist/heart/kept-notes.js +289 -0
  152. package/dist/heart/kicks.js +1 -1
  153. package/dist/heart/machine-identity.js +161 -0
  154. package/dist/heart/mail-import-discovery.js +353 -0
  155. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  156. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  157. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  158. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  159. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  160. package/dist/heart/mailbox/mailbox-http.js +99 -0
  161. package/dist/heart/mailbox/mailbox-read.js +39 -0
  162. package/dist/heart/mailbox/mailbox-types.js +27 -0
  163. package/dist/heart/mailbox/mailbox-view.js +197 -0
  164. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  165. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  166. package/dist/heart/mailbox/readers/mail.js +375 -0
  167. package/dist/heart/mailbox/readers/runtime-readers.js +824 -0
  168. package/dist/heart/mailbox/readers/sessions.js +232 -0
  169. package/dist/heart/mailbox/readers/shared.js +111 -0
  170. package/dist/heart/mcp/mcp-server.js +696 -0
  171. package/dist/heart/migrate-config.js +100 -0
  172. package/dist/heart/model-capabilities.js +11 -0
  173. package/dist/heart/orientation-frame.js +217 -0
  174. package/dist/heart/platform.js +81 -0
  175. package/dist/heart/primitives.js +1 -1
  176. package/dist/heart/private-runtime/decision-renderer.js +156 -0
  177. package/dist/heart/private-runtime/index.js +18 -0
  178. package/dist/heart/private-runtime/ledger.js +218 -0
  179. package/dist/heart/private-runtime/policy.js +214 -0
  180. package/dist/heart/private-runtime/types.js +2 -0
  181. package/dist/heart/progress-story.js +1 -1
  182. package/dist/heart/provider-attempt.js +134 -0
  183. package/dist/heart/provider-binding-resolver.js +273 -0
  184. package/dist/heart/provider-credentials.js +441 -0
  185. package/dist/heart/provider-failover.js +311 -0
  186. package/dist/heart/provider-models.js +81 -0
  187. package/dist/heart/provider-ping.js +262 -0
  188. package/dist/heart/provider-readiness-cache.js +119 -0
  189. package/dist/heart/provider-visibility.js +188 -0
  190. package/dist/heart/providers/anthropic-token.js +131 -0
  191. package/dist/heart/providers/anthropic.js +139 -52
  192. package/dist/heart/providers/azure.js +23 -11
  193. package/dist/heart/providers/error-classification.js +127 -0
  194. package/dist/heart/providers/github-copilot.js +34 -38
  195. package/dist/heart/providers/minimax-vlm.js +189 -0
  196. package/dist/heart/providers/minimax.js +26 -8
  197. package/dist/heart/providers/openai-codex-token.js +349 -0
  198. package/dist/heart/providers/openai-codex.js +55 -40
  199. package/dist/heart/run-ledger.js +247 -0
  200. package/dist/heart/runtime-capability-check.js +170 -0
  201. package/dist/heart/runtime-credentials.js +398 -0
  202. package/dist/heart/runtime-cwd.js +87 -0
  203. package/dist/heart/sense-truth.js +20 -4
  204. package/dist/heart/session-activity.js +90 -24
  205. package/dist/heart/session-events.js +1133 -0
  206. package/dist/heart/session-playback-cli-main.js +5 -0
  207. package/dist/heart/session-playback-cli.js +36 -0
  208. package/dist/heart/session-playback.js +231 -0
  209. package/dist/heart/session-stats-cli-main.js +5 -0
  210. package/dist/heart/session-stats.js +182 -0
  211. package/dist/heart/session-transcript.js +133 -0
  212. package/dist/heart/start-of-turn-packet.js +365 -0
  213. package/dist/heart/streaming.js +44 -27
  214. package/dist/heart/structured-output.js +196 -0
  215. package/dist/heart/sync-classification.js +176 -0
  216. package/dist/heart/sync.js +449 -0
  217. package/dist/heart/target-resolution.js +11 -7
  218. package/dist/heart/tempo.js +93 -0
  219. package/dist/heart/temporal-view.js +41 -0
  220. package/dist/heart/timeouts.js +101 -0
  221. package/dist/heart/tool-activity-callbacks.js +59 -0
  222. package/dist/heart/tool-description.js +155 -0
  223. package/dist/heart/tool-friction.js +55 -0
  224. package/dist/heart/tool-loop.js +200 -0
  225. package/dist/heart/turn-context.js +472 -0
  226. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  227. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  228. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  229. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  230. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  231. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  232. package/dist/heart/versioning/update-hooks.js +154 -0
  233. package/dist/heart/work-card.js +380 -0
  234. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  235. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  236. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  237. package/dist/mailbox-ui/index.html +16 -0
  238. package/dist/mailroom/attention.js +167 -0
  239. package/dist/mailroom/autonomy.js +209 -0
  240. package/dist/mailroom/blob-store.js +715 -0
  241. package/dist/mailroom/body-cache.js +61 -0
  242. package/dist/mailroom/core.js +788 -0
  243. package/dist/mailroom/entry.js +160 -0
  244. package/dist/mailroom/file-store.js +568 -0
  245. package/dist/mailroom/mbox-import.js +393 -0
  246. package/dist/mailroom/migration.js +164 -0
  247. package/dist/mailroom/outbound.js +380 -0
  248. package/dist/mailroom/policy.js +263 -0
  249. package/dist/mailroom/reader.js +233 -0
  250. package/dist/mailroom/search-cache.js +334 -0
  251. package/dist/mailroom/search-relevance.js +319 -0
  252. package/dist/mailroom/smtp-ingress.js +176 -0
  253. package/dist/mailroom/source-state.js +176 -0
  254. package/dist/mailroom/thread.js +109 -0
  255. package/dist/mailroom/travel-extract.js +89 -0
  256. package/dist/mind/bundle-manifest.js +24 -2
  257. package/dist/mind/context.js +250 -101
  258. package/dist/mind/desk-section.js +362 -0
  259. package/dist/mind/diary-integrity.js +60 -0
  260. package/dist/mind/{memory.js → diary.js} +68 -77
  261. package/dist/mind/embedding-provider.js +60 -0
  262. package/dist/mind/file-state.js +179 -0
  263. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  264. package/dist/mind/obligation-steering.js +221 -0
  265. package/dist/mind/pending.js +13 -8
  266. package/dist/mind/prompt-budget.js +380 -0
  267. package/dist/mind/prompt-refresh.js +3 -2
  268. package/dist/mind/prompt.js +1027 -170
  269. package/dist/mind/provenance-trust.js +26 -0
  270. package/dist/mind/record-paths.js +312 -0
  271. package/dist/mind/scrutiny.js +173 -0
  272. package/dist/nerves/cli-logging.js +7 -1
  273. package/dist/nerves/coverage/audit-rules.js +15 -6
  274. package/dist/nerves/coverage/audit.js +28 -2
  275. package/dist/nerves/coverage/cli.js +1 -1
  276. package/dist/nerves/coverage/contract.js +5 -5
  277. package/dist/nerves/coverage/file-completeness.js +139 -5
  278. package/dist/nerves/event-buffer.js +111 -0
  279. package/dist/nerves/index.js +234 -4
  280. package/dist/nerves/observation.js +20 -0
  281. package/dist/nerves/redact.js +79 -0
  282. package/dist/nerves/review/cli-main.js +5 -0
  283. package/dist/nerves/review/cli.js +156 -0
  284. package/dist/nerves/review/core.js +152 -0
  285. package/dist/nerves/runtime.js +5 -1
  286. package/dist/repertoire/ado-client.js +15 -56
  287. package/dist/repertoire/ado-semantic.js +16 -10
  288. package/dist/repertoire/api-client.js +97 -0
  289. package/dist/repertoire/bitwarden-store.js +1045 -0
  290. package/dist/repertoire/bundle-templates.js +71 -0
  291. package/dist/repertoire/bw-installer.js +180 -0
  292. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  293. package/dist/repertoire/coding/context-pack.js +331 -0
  294. package/dist/repertoire/coding/feedback.js +218 -30
  295. package/dist/repertoire/coding/index.js +15 -3
  296. package/dist/repertoire/coding/manager.js +166 -10
  297. package/dist/repertoire/coding/spawner.js +58 -11
  298. package/dist/repertoire/coding/tools.js +242 -14
  299. package/dist/repertoire/coding/workbench-client.js +272 -0
  300. package/dist/repertoire/coding/workbench-manager.js +346 -0
  301. package/dist/repertoire/commerce-errors.js +109 -0
  302. package/dist/repertoire/commerce-self-test.js +156 -0
  303. package/dist/repertoire/credential-access.js +178 -0
  304. package/dist/repertoire/desk/classifier.js +362 -0
  305. package/dist/repertoire/duffel-client.js +185 -0
  306. package/dist/repertoire/github-client.js +14 -55
  307. package/dist/repertoire/graph-client.js +11 -52
  308. package/dist/repertoire/guardrails.js +139 -18
  309. package/dist/repertoire/mcp-client.js +44 -3
  310. package/dist/repertoire/mcp-manager.js +259 -20
  311. package/dist/repertoire/mcp-tools.js +83 -0
  312. package/dist/repertoire/plugin-mcp.js +175 -0
  313. package/dist/repertoire/plugins.js +253 -0
  314. package/dist/repertoire/shell-sessions.js +133 -0
  315. package/dist/repertoire/skills.js +48 -4
  316. package/dist/repertoire/stripe-client.js +131 -0
  317. package/dist/repertoire/tool-results.js +29 -0
  318. package/dist/repertoire/tools-a2a.js +699 -0
  319. package/dist/repertoire/tools-attachments.js +317 -0
  320. package/dist/repertoire/tools-awaiting.js +372 -0
  321. package/dist/repertoire/tools-base.js +65 -1095
  322. package/dist/repertoire/tools-bluebubbles.js +2 -0
  323. package/dist/repertoire/tools-bridge.js +144 -0
  324. package/dist/repertoire/tools-bundle.js +993 -0
  325. package/dist/repertoire/tools-commerce.js +253 -0
  326. package/dist/repertoire/tools-config.js +186 -0
  327. package/dist/repertoire/tools-continuity.js +252 -0
  328. package/dist/repertoire/tools-credential.js +383 -0
  329. package/dist/repertoire/tools-evolution.js +527 -0
  330. package/dist/repertoire/tools-files.js +344 -0
  331. package/dist/repertoire/tools-flight.js +290 -0
  332. package/dist/repertoire/tools-flow.js +119 -0
  333. package/dist/repertoire/tools-github.js +3 -8
  334. package/dist/repertoire/tools-mail.js +1975 -0
  335. package/dist/repertoire/tools-notes.js +459 -0
  336. package/dist/repertoire/tools-obligations.js +182 -0
  337. package/dist/repertoire/tools-orientation.js +31 -0
  338. package/dist/repertoire/tools-record.js +482 -0
  339. package/dist/repertoire/tools-rsvp.js +139 -0
  340. package/dist/repertoire/tools-runtime.js +150 -0
  341. package/dist/repertoire/tools-session.js +881 -0
  342. package/dist/repertoire/tools-shell.js +120 -0
  343. package/dist/repertoire/tools-stripe.js +224 -0
  344. package/dist/repertoire/tools-surface.js +355 -0
  345. package/dist/repertoire/tools-teams.js +12 -39
  346. package/dist/repertoire/tools-travel.js +125 -0
  347. package/dist/repertoire/tools-trip.js +982 -0
  348. package/dist/repertoire/tools-user-profile.js +146 -0
  349. package/dist/repertoire/tools-vault.js +40 -0
  350. package/dist/repertoire/tools-voice.js +145 -0
  351. package/dist/repertoire/tools.js +249 -79
  352. package/dist/repertoire/travel-api-client.js +360 -0
  353. package/dist/repertoire/user-profile.js +131 -0
  354. package/dist/repertoire/vault-setup.js +246 -0
  355. package/dist/repertoire/vault-unlock.js +594 -0
  356. package/dist/rsvp/aisleplanner-client.js +354 -0
  357. package/dist/rsvp/cli.js +820 -0
  358. package/dist/rsvp/config.js +327 -0
  359. package/dist/rsvp/cutover.js +433 -0
  360. package/dist/rsvp/diagnostics.js +222 -0
  361. package/dist/rsvp/diff-renderer.js +176 -0
  362. package/dist/rsvp/habit-policy.js +103 -0
  363. package/dist/rsvp/habit-stage.js +108 -0
  364. package/dist/rsvp/incident-bundle.js +97 -0
  365. package/dist/rsvp/migration.js +204 -0
  366. package/dist/rsvp/native-habit-runner.js +490 -0
  367. package/dist/rsvp/outbound-state.js +268 -0
  368. package/dist/rsvp/query.js +118 -0
  369. package/dist/rsvp/replay.js +233 -0
  370. package/dist/rsvp/snapshot.js +232 -0
  371. package/dist/rsvp/spend-ledger.js +175 -0
  372. package/dist/scripts/claude-code-hook.js +41 -0
  373. package/dist/scripts/claude-code-stop-hook.js +47 -0
  374. package/dist/senses/a2a-entry.js +115 -0
  375. package/dist/senses/attention-queue.js +186 -0
  376. package/dist/senses/await-turn-message.js +58 -0
  377. package/dist/senses/bluebubbles/active-turns.js +216 -0
  378. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  379. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  380. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +226 -19
  381. package/dist/senses/bluebubbles/context-packet.js +122 -0
  382. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  383. package/dist/senses/bluebubbles/entry.js +77 -0
  384. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  385. package/dist/senses/bluebubbles/index.js +2907 -0
  386. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  387. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  388. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  389. package/dist/senses/bluebubbles/outbound-state.js +304 -0
  390. package/dist/senses/bluebubbles/processed-log.js +133 -0
  391. package/dist/senses/bluebubbles/replay.js +284 -0
  392. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  393. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  394. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  395. package/dist/senses/cli/bracketed-paste.js +82 -0
  396. package/dist/senses/cli/image-paste.js +287 -0
  397. package/dist/senses/cli/image-ref-navigation.js +75 -0
  398. package/dist/senses/cli/ink-app.js +156 -0
  399. package/dist/senses/cli/inline-diff.js +64 -0
  400. package/dist/senses/cli/input-keys.js +174 -0
  401. package/dist/senses/cli/kill-ring.js +86 -0
  402. package/dist/senses/cli/message-list.js +51 -0
  403. package/dist/senses/cli/ouro-tui.js +607 -0
  404. package/dist/senses/cli/spinner-imperative.js +135 -0
  405. package/dist/senses/cli/spinner.js +101 -0
  406. package/dist/senses/cli/status-line.js +60 -0
  407. package/dist/senses/cli/streaming-markdown.js +526 -0
  408. package/dist/senses/cli/tool-display.js +85 -0
  409. package/dist/senses/cli/tool-render.js +85 -0
  410. package/dist/senses/cli/tui-store.js +240 -0
  411. package/dist/senses/cli/virtual-list.js +35 -0
  412. package/dist/senses/cli-entry.js +60 -8
  413. package/dist/senses/cli-layout.js +100 -0
  414. package/dist/senses/cli.js +521 -214
  415. package/dist/senses/commands.js +66 -3
  416. package/dist/senses/context-packet-ledger.js +371 -0
  417. package/dist/senses/context-packets.js +154 -0
  418. package/dist/senses/habit-turn-message.js +160 -0
  419. package/dist/senses/mail-entry.js +66 -0
  420. package/dist/senses/mail.js +395 -0
  421. package/dist/senses/pipeline.js +988 -178
  422. package/dist/senses/private-runtime-worker.js +739 -0
  423. package/dist/senses/private-runtime.js +1157 -0
  424. package/dist/senses/proactive-content-guard.js +51 -0
  425. package/dist/senses/shared-turn.js +416 -0
  426. package/dist/senses/surface-tool.js +109 -0
  427. package/dist/senses/teams-entry.js +60 -8
  428. package/dist/senses/teams.js +397 -112
  429. package/dist/senses/trust-gate.js +104 -9
  430. package/dist/senses/voice/audio-playback.js +237 -0
  431. package/dist/senses/voice/audio-routing.js +119 -0
  432. package/dist/senses/voice/elevenlabs.js +202 -0
  433. package/dist/senses/voice/floor-control.js +431 -0
  434. package/dist/senses/voice/floor-controller.js +115 -0
  435. package/dist/senses/voice/golden-path.js +116 -0
  436. package/dist/senses/voice/index.js +29 -0
  437. package/dist/senses/voice/meeting.js +113 -0
  438. package/dist/senses/voice/outbound.js +190 -0
  439. package/dist/senses/voice/phone.js +33 -0
  440. package/dist/senses/voice/playback.js +139 -0
  441. package/dist/senses/voice/realtime-eval.js +496 -0
  442. package/dist/senses/voice/realtime-trace.js +531 -0
  443. package/dist/senses/voice/transcript.js +70 -0
  444. package/dist/senses/voice/turn.js +191 -0
  445. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  446. package/dist/senses/voice/twilio-phone.js +5081 -0
  447. package/dist/senses/voice/types.js +2 -0
  448. package/dist/senses/voice/whisper.js +161 -0
  449. package/dist/senses/voice-entry.js +81 -0
  450. package/dist/senses/voice-realtime-eval-command.js +99 -0
  451. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  452. package/dist/senses/voice-twilio-entry.js +87 -0
  453. package/dist/trips/core.js +138 -0
  454. package/dist/trips/store.js +265 -0
  455. package/dist/util/frontmatter.js +69 -0
  456. package/package.json +57 -12
  457. package/skills/agent-commerce.md +113 -0
  458. package/skills/browser-navigation.md +117 -0
  459. package/skills/commerce-setup-guide.md +116 -0
  460. package/skills/commerce-setup.md +84 -0
  461. package/skills/configure-dev-tools.md +99 -0
  462. package/skills/travel-planning.md +138 -0
  463. package/dist/heart/daemon/auth-flow.js +0 -430
  464. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  465. package/dist/heart/daemon/update-hooks.js +0 -138
  466. package/dist/heart/safe-workspace.js +0 -228
  467. package/dist/heart/session-recall.js +0 -116
  468. package/dist/mind/friends/channel.js +0 -84
  469. package/dist/mind/friends/group-context.js +0 -144
  470. package/dist/mind/friends/resolver.js +0 -84
  471. package/dist/mind/friends/store-file.js +0 -190
  472. package/dist/mind/friends/store.js +0 -4
  473. package/dist/mind/friends/tokens.js +0 -26
  474. package/dist/mind/friends/trust-explanation.js +0 -74
  475. package/dist/mind/friends/types.js +0 -29
  476. package/dist/repertoire/tasks/board.js +0 -134
  477. package/dist/repertoire/tasks/index.js +0 -224
  478. package/dist/repertoire/tasks/lifecycle.js +0 -80
  479. package/dist/repertoire/tasks/middleware.js +0 -65
  480. package/dist/repertoire/tasks/parser.js +0 -173
  481. package/dist/repertoire/tasks/scanner.js +0 -132
  482. package/dist/repertoire/tasks/transitions.js +0 -144
  483. package/dist/senses/bluebubbles-entry.js +0 -13
  484. package/dist/senses/bluebubbles.js +0 -1180
  485. package/dist/senses/debug-activity.js +0 -148
  486. package/dist/senses/inner-dialog-worker.js +0 -90
  487. package/dist/senses/inner-dialog.js +0 -480
  488. package/subagents/README.md +0 -7
  489. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  490. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  491. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  492. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  493. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  494. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  495. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  496. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  497. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  498. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  499. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  500. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  501. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  502. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  503. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  504. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  505. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pruneDaemonLogs = pruneDaemonLogs;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ const crypto_1 = require("crypto");
7
+ const nerves_1 = require("../../nerves");
8
+ const runtime_1 = require("../../nerves/runtime");
9
+ const identity_1 = require("../identity");
10
+ function isActiveLogStream(name) {
11
+ if (name.endsWith(".ndjson")) {
12
+ return !/\.\d+\.ndjson$/.test(name);
13
+ }
14
+ if (name.endsWith(".log")) {
15
+ return !/\.\d+\.log$/.test(name);
16
+ }
17
+ return false;
18
+ }
19
+ function pruneDaemonLogs(options = {}) {
20
+ /* v8 ignore next -- defensive: tests always pass logsDir to avoid prod paths @preserve */
21
+ const logsDir = options.logsDir ?? (0, identity_1.getAgentDaemonLogsDir)(options.agentName);
22
+ const maxSizeBytes = options.maxSizeBytes ?? nerves_1.DEFAULT_MAX_LOG_SIZE_BYTES;
23
+ const maxGenerations = options.maxGenerations ?? nerves_1.DEFAULT_MAX_GENERATIONS;
24
+ const traceId = (0, crypto_1.randomUUID)();
25
+ (0, runtime_1.emitNervesEvent)({
26
+ component: "nerves",
27
+ event: "nerves.logs_prune_start",
28
+ trace_id: traceId,
29
+ message: "pruning daemon logs",
30
+ meta: { logsDir, maxSizeBytes, maxGenerations },
31
+ });
32
+ let completed = false;
33
+ try {
34
+ if (!(0, fs_1.existsSync)(logsDir)) {
35
+ completed = true;
36
+ (0, runtime_1.emitNervesEvent)({
37
+ component: "nerves",
38
+ event: "nerves.logs_prune_end",
39
+ trace_id: traceId,
40
+ message: "daemon logs dir does not exist",
41
+ meta: { logsDir, filesCompacted: 0, bytesFreed: 0 },
42
+ });
43
+ return { filesCompacted: 0, bytesFreed: 0 };
44
+ }
45
+ let filesCompacted = 0;
46
+ let bytesFreed = 0;
47
+ // Enumerate and rotate each active structured stream plus legacy launchd
48
+ // .log streams. We explicitly skip .gz and other files — only the active
49
+ // stream can be a rotation candidate. Legacy generation files are handled
50
+ // inside rotateIfNeeded's generation-shift step, so we skip them here to
51
+ // avoid double-rotating.
52
+ for (const name of (0, fs_1.readdirSync)(logsDir)) {
53
+ if (!isActiveLogStream(name))
54
+ continue;
55
+ const filePath = (0, path_1.join)(logsDir, name);
56
+ let sizeBefore;
57
+ try {
58
+ sizeBefore = (0, fs_1.statSync)(filePath).size;
59
+ /* v8 ignore start -- defensive: file disappears between readdir and stat @preserve */
60
+ }
61
+ catch {
62
+ continue;
63
+ }
64
+ /* v8 ignore stop */
65
+ if (sizeBefore < maxSizeBytes)
66
+ continue;
67
+ // rotateIfNeeded returns true because we pre-checked sizeBefore >=
68
+ // maxSizeBytes above. The false branch of `if (rotated)` is defensive
69
+ // and unreachable under normal flow; we skip it from coverage so a
70
+ // future refactor that weakens the pre-check still reports correct
71
+ // counts without needing a contrived test.
72
+ const rotated = (0, nerves_1.rotateIfNeeded)(filePath, {
73
+ maxSizeBytes,
74
+ maxGenerations,
75
+ compress: true,
76
+ });
77
+ /* v8 ignore next 3 -- defensive: pre-check guarantees rotated=true @preserve */
78
+ if (!rotated) {
79
+ continue;
80
+ }
81
+ filesCompacted += 1;
82
+ bytesFreed += sizeBefore;
83
+ }
84
+ completed = true;
85
+ (0, runtime_1.emitNervesEvent)({
86
+ component: "nerves",
87
+ event: "nerves.logs_prune_end",
88
+ trace_id: traceId,
89
+ message: "daemon logs pruned",
90
+ meta: { logsDir, filesCompacted, bytesFreed },
91
+ });
92
+ return { filesCompacted, bytesFreed };
93
+ }
94
+ catch (err) {
95
+ /* v8 ignore next -- defensive: completed=true only reached after try returns @preserve */
96
+ if (!completed) {
97
+ /* v8 ignore next -- defensive: rotation always throws real Errors @preserve */
98
+ const reason = err instanceof Error ? err.message : String(err);
99
+ (0, runtime_1.emitNervesEvent)({
100
+ component: "nerves",
101
+ event: "nerves.logs_prune_error",
102
+ trace_id: traceId,
103
+ level: "error",
104
+ message: "daemon logs prune failed",
105
+ meta: { logsDir, error: reason },
106
+ });
107
+ }
108
+ throw err;
109
+ }
110
+ }
@@ -0,0 +1,393 @@
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_CANARY_TIMEOUT_MS = void 0;
37
+ exports.buildMcpBridgeRepairGuidance = buildMcpBridgeRepairGuidance;
38
+ exports.formatMcpBridgeRepairDetails = formatMcpBridgeRepairDetails;
39
+ exports.buildMcpDoctorNextSteps = buildMcpDoctorNextSteps;
40
+ exports.formatMcpDoctorNextStepDetails = formatMcpDoctorNextStepDetails;
41
+ exports.parseMcpStatusText = parseMcpStatusText;
42
+ exports.runMcpStatusCanary = runMcpStatusCanary;
43
+ exports.formatMcpStatusCanaryResult = formatMcpStatusCanaryResult;
44
+ exports.formatMcpStatusDoctorResult = formatMcpStatusDoctorResult;
45
+ exports.createMcpStatusCanaryProbe = createMcpStatusCanaryProbe;
46
+ const child_process_1 = require("child_process");
47
+ const path = __importStar(require("path"));
48
+ const runtime_1 = require("../../nerves/runtime");
49
+ exports.DEFAULT_CANARY_TIMEOUT_MS = 60_000;
50
+ const MCP_PROTOCOL_VERSION = "2024-11-05";
51
+ function defaultCommandArgs(agent, socketPath) {
52
+ const entryPath = path.join(__dirname, "ouro-bot-entry.js");
53
+ return [
54
+ entryPath,
55
+ "mcp-serve",
56
+ "--agent",
57
+ agent,
58
+ ...(socketPath ? ["--socket", socketPath] : []),
59
+ ];
60
+ }
61
+ function responseText(response) {
62
+ const result = response.result;
63
+ if (!result || typeof result !== "object" || Array.isArray(result))
64
+ return JSON.stringify(response);
65
+ const content = result.content;
66
+ if (!Array.isArray(content))
67
+ return JSON.stringify(response);
68
+ const first = content[0];
69
+ if (!first || typeof first !== "object" || Array.isArray(first))
70
+ return JSON.stringify(response);
71
+ const text = first.text;
72
+ return typeof text === "string" ? text : JSON.stringify(response);
73
+ }
74
+ function parseFields(line) {
75
+ const parsed = {};
76
+ for (const segment of line.split("\t")) {
77
+ const idx = segment.indexOf("=");
78
+ if (idx <= 0)
79
+ continue;
80
+ parsed[segment.slice(0, idx)] = segment.slice(idx + 1);
81
+ }
82
+ return parsed;
83
+ }
84
+ function shellArg(value) {
85
+ return /^[A-Za-z0-9._/-]+$/.test(value)
86
+ ? value
87
+ : `'${value.replace(/'/g, "'\\''")}'`;
88
+ }
89
+ function buildMcpBridgeRepairGuidance(agent) {
90
+ const agentArg = shellArg(agent);
91
+ return {
92
+ actor: "agent-runnable",
93
+ commands: [
94
+ `ouro setup --tool codex --agent ${agentArg}`,
95
+ `ouro setup --tool claude-code --agent ${agentArg}`,
96
+ ],
97
+ reload: "open a fresh dev-tool session after setup; existing MCP processes keep their old runtime",
98
+ verify: `ouro mcp doctor --agent ${agentArg}`,
99
+ };
100
+ }
101
+ function formatMcpBridgeRepairDetails(repair) {
102
+ return [
103
+ `repair actor=${repair.actor}`,
104
+ ...repair.commands.map((command) => `repair command=${command}`),
105
+ `reload required: ${repair.reload}`,
106
+ `verify command=${repair.verify}`,
107
+ ];
108
+ }
109
+ function buildMcpDoctorNextSteps(result, agent) {
110
+ const agentArg = shellArg(agent);
111
+ const text = [result.summary, ...result.details].join("\n");
112
+ const daemonUnreachable = text.includes("daemon=unreachable")
113
+ || text.includes("ECONNREFUSED")
114
+ || text.includes("ENOENT");
115
+ if (daemonUnreachable) {
116
+ return {
117
+ actor: "agent-runnable",
118
+ commands: [
119
+ "ouro up",
120
+ `ouro mcp doctor --agent ${agentArg}`,
121
+ ],
122
+ note: "start or refresh the daemon before trusting bridge status",
123
+ };
124
+ }
125
+ return {
126
+ actor: "agent-runnable",
127
+ commands: [
128
+ "ouro doctor",
129
+ `ouro status --agent ${agentArg}`,
130
+ `ouro repair --agent ${agentArg}`,
131
+ `ouro mcp doctor --agent ${agentArg}`,
132
+ ],
133
+ note: "fix reported daemon or sense health before rerunning bridge registration repair",
134
+ };
135
+ }
136
+ function formatMcpDoctorNextStepDetails(nextSteps) {
137
+ return [
138
+ `next actor=${nextSteps.actor}`,
139
+ ...nextSteps.commands.map((command) => `next command=${command}`),
140
+ `next note=${nextSteps.note}`,
141
+ ];
142
+ }
143
+ function parseMcpStatusText(text) {
144
+ const daemon = {};
145
+ const senses = {};
146
+ for (const line of text.split(/\r?\n/)) {
147
+ const trimmed = line.trim();
148
+ if (!trimmed)
149
+ continue;
150
+ if (trimmed.startsWith("daemon=")) {
151
+ Object.assign(daemon, parseFields(trimmed));
152
+ continue;
153
+ }
154
+ if (!trimmed.startsWith("sense="))
155
+ continue;
156
+ const fields = parseFields(trimmed);
157
+ const sense = fields.sense;
158
+ if (!sense)
159
+ continue;
160
+ const [name, status = "unknown"] = sense.split(":");
161
+ senses[name] = { ...fields, name, status };
162
+ }
163
+ return { daemon, senses, raw: text };
164
+ }
165
+ function validateMcpStatus(parsed, requiredSenses, options = {}) {
166
+ const failures = [];
167
+ if (parsed.daemon.daemon !== "running") {
168
+ failures.push(`daemon=${parsed.daemon.daemon ?? "missing"}`);
169
+ }
170
+ if (!options.ignoreOverviewHealth && parsed.daemon.health !== "ok") {
171
+ failures.push(`health=${parsed.daemon.health ?? "missing"}`);
172
+ }
173
+ const hasVersionMismatch = !!(parsed.daemon.daemonVersion &&
174
+ parsed.daemon.mcpVersion &&
175
+ parsed.daemon.daemonVersion !== parsed.daemon.mcpVersion);
176
+ if (hasVersionMismatch) {
177
+ failures.push(`version mismatch daemon=${parsed.daemon.daemonVersion} mcp=${parsed.daemon.mcpVersion}`);
178
+ }
179
+ if (!options.ignoreSenseHealth) {
180
+ for (const [sense, row] of Object.entries(parsed.senses)) {
181
+ if (row.status === "disabled")
182
+ continue;
183
+ if (row.status === "running" || row.status === "interactive")
184
+ continue;
185
+ failures.push(`sense=${sense}:${row.status}`);
186
+ }
187
+ }
188
+ for (const sense of requiredSenses) {
189
+ const row = parsed.senses[sense];
190
+ if (!row) {
191
+ failures.push(`required sense missing: ${sense}`);
192
+ continue;
193
+ }
194
+ if (row.status !== "running" && row.status !== "interactive") {
195
+ failures.push(`required sense unhealthy: ${sense}:${row.status}`);
196
+ }
197
+ }
198
+ const senseSummary = Object.values(parsed.senses)
199
+ .map((row) => `${row.name}:${row.status}`)
200
+ .join(",");
201
+ const summary = failures.length === 0
202
+ ? `mcp canary ok: daemon=${parsed.daemon.daemon} health=${parsed.daemon.health}${options.ignoreOverviewHealth ? " (overview ignored)" : ""} senses=${senseSummary}${options.ignoreSenseHealth ? " (sense health reported, not gated)" : ""}`
203
+ : `mcp canary failed: ${failures.join("; ")}`;
204
+ const repair = hasVersionMismatch && options.agent
205
+ ? buildMcpBridgeRepairGuidance(options.agent)
206
+ : undefined;
207
+ const repairDetails = repair ? formatMcpBridgeRepairDetails(repair) : [];
208
+ return {
209
+ ok: failures.length === 0,
210
+ summary,
211
+ details: failures.length === 0 ? [parsed.raw] : [...failures, ...repairDetails, parsed.raw],
212
+ parsed,
213
+ ...(repair ? { repair } : {}),
214
+ };
215
+ }
216
+ async function runMcpStatusCanary(options) {
217
+ const timeoutMs = options.timeoutMs ?? exports.DEFAULT_CANARY_TIMEOUT_MS;
218
+ /* v8 ignore next -- default spawn is exercised by live canaries, while unit tests inject a fake child @preserve */
219
+ const spawnImpl = options.spawnImpl ?? child_process_1.spawn;
220
+ const command = options.command ?? process.execPath;
221
+ const commandArgs = options.commandArgs ?? defaultCommandArgs(options.agent, options.socketPath);
222
+ const requiredSenses = options.requiredSenses ?? [];
223
+ (0, runtime_1.emitNervesEvent)({
224
+ component: "daemon",
225
+ event: "daemon.mcp_canary_start",
226
+ message: "starting MCP status canary",
227
+ meta: {
228
+ agent: options.agent,
229
+ command,
230
+ commandArgs,
231
+ timeoutMs,
232
+ requiredSenses,
233
+ ignoreOverviewHealth: options.ignoreOverviewHealth === true,
234
+ ignoreSenseHealth: options.ignoreSenseHealth === true,
235
+ },
236
+ });
237
+ const child = spawnImpl(command, commandArgs, { stdio: ["pipe", "pipe", "pipe"] });
238
+ let buffer = "";
239
+ let stderr = "";
240
+ const pending = new Map();
241
+ function cleanup() {
242
+ for (const [, request] of pending) {
243
+ clearTimeout(request.timer);
244
+ }
245
+ pending.clear();
246
+ if (!child.killed)
247
+ child.kill();
248
+ }
249
+ function failAll(error) {
250
+ for (const [, request] of pending) {
251
+ clearTimeout(request.timer);
252
+ request.reject(error);
253
+ }
254
+ pending.clear();
255
+ }
256
+ child.stderr?.setEncoding("utf8");
257
+ child.stderr?.on("data", (chunk) => {
258
+ stderr += chunk.toString();
259
+ });
260
+ child.stdout?.setEncoding("utf8");
261
+ child.stdout?.on("data", (chunk) => {
262
+ buffer += chunk.toString();
263
+ for (;;) {
264
+ const idx = buffer.indexOf("\n");
265
+ if (idx === -1)
266
+ break;
267
+ const line = buffer.slice(0, idx).trim();
268
+ buffer = buffer.slice(idx + 1);
269
+ if (!line)
270
+ continue;
271
+ let response;
272
+ try {
273
+ response = JSON.parse(line);
274
+ }
275
+ catch {
276
+ failAll(new Error(`MCP canary received malformed JSON: ${line}`));
277
+ return;
278
+ }
279
+ const id = typeof response.id === "number" ? response.id : null;
280
+ if (id === null)
281
+ continue;
282
+ const request = pending.get(id);
283
+ if (!request)
284
+ continue;
285
+ pending.delete(id);
286
+ clearTimeout(request.timer);
287
+ request.resolve(response);
288
+ }
289
+ });
290
+ child.on("error", (error) => failAll(error));
291
+ child.on("close", (code, signal) => {
292
+ if (pending.size === 0)
293
+ return;
294
+ failAll(new Error(`MCP canary process closed before response code=${code} signal=${signal ?? "none"} stderr=${stderr.trim()}`));
295
+ });
296
+ let nextId = 1;
297
+ function request(method, params) {
298
+ return new Promise((resolve, reject) => {
299
+ if (!child.stdin?.writable) {
300
+ reject(new Error("MCP canary stdin is not writable"));
301
+ return;
302
+ }
303
+ const id = nextId++;
304
+ const timer = setTimeout(() => {
305
+ pending.delete(id);
306
+ reject(new Error(`MCP canary timed out waiting for ${method}; stderr=${stderr.trim()}`));
307
+ }, timeoutMs);
308
+ pending.set(id, { resolve, reject, timer });
309
+ child.stdin.write(JSON.stringify({ jsonrpc: "2.0", id, method, params }) + "\n");
310
+ });
311
+ }
312
+ try {
313
+ await request("initialize", {
314
+ protocolVersion: MCP_PROTOCOL_VERSION,
315
+ capabilities: {},
316
+ clientInfo: { name: "ouro-mcp-canary", version: "1.0" },
317
+ });
318
+ child.stdin?.write(JSON.stringify({ jsonrpc: "2.0", method: "initialized" }) + "\n");
319
+ const statusResponse = await request("tools/call", {
320
+ name: "status",
321
+ arguments: {},
322
+ });
323
+ const result = statusResponse.result;
324
+ if (result && typeof result === "object" && !Array.isArray(result) && result.isError === true) {
325
+ throw new Error(responseText(statusResponse));
326
+ }
327
+ const parsed = parseMcpStatusText(responseText(statusResponse));
328
+ const canary = validateMcpStatus(parsed, requiredSenses, {
329
+ agent: options.agent,
330
+ ignoreOverviewHealth: options.ignoreOverviewHealth,
331
+ ignoreSenseHealth: options.ignoreSenseHealth,
332
+ });
333
+ (0, runtime_1.emitNervesEvent)({
334
+ component: "daemon",
335
+ event: canary.ok ? "daemon.mcp_canary_end" : "daemon.mcp_canary_error",
336
+ level: canary.ok ? "info" : "error",
337
+ message: canary.summary,
338
+ meta: { agent: options.agent, ok: canary.ok },
339
+ });
340
+ return canary;
341
+ }
342
+ catch (error) {
343
+ const reason = error instanceof Error ? error.message : String(error);
344
+ (0, runtime_1.emitNervesEvent)({
345
+ component: "daemon",
346
+ event: "daemon.mcp_canary_error",
347
+ level: "error",
348
+ message: "MCP status canary failed",
349
+ meta: { agent: options.agent, reason },
350
+ });
351
+ return { ok: false, summary: `mcp canary failed: ${reason}`, details: [reason] };
352
+ }
353
+ finally {
354
+ child.stdin?.end();
355
+ cleanup();
356
+ }
357
+ }
358
+ function formatMcpStatusCanaryResult(result) {
359
+ return [
360
+ result.ok ? "mcp canary: ok" : "mcp canary: failed",
361
+ result.summary,
362
+ ...result.details.map((line) => ` ${line}`),
363
+ ].join("\n");
364
+ }
365
+ function formatMcpStatusDoctorResult(result, agent) {
366
+ const rawDetails = result.details.filter((line) => !line.startsWith("repair ")
367
+ && !line.startsWith("reload required:")
368
+ && !line.startsWith("verify command="));
369
+ const lines = [
370
+ result.ok ? "mcp doctor: ok" : "mcp doctor: failed",
371
+ result.summary,
372
+ ...rawDetails.map((line) => ` ${line}`),
373
+ ];
374
+ if (result.ok || result.repair) {
375
+ const repair = result.repair ?? buildMcpBridgeRepairGuidance(agent);
376
+ lines.push("bridge registration path:");
377
+ lines.push(...formatMcpBridgeRepairDetails(repair).map((line) => ` ${line}`));
378
+ }
379
+ else {
380
+ lines.push("next checks:");
381
+ lines.push(...formatMcpDoctorNextStepDetails(buildMcpDoctorNextSteps(result, agent)).map((line) => ` ${line}`));
382
+ }
383
+ return lines.join("\n");
384
+ }
385
+ function createMcpStatusCanaryProbe(options) {
386
+ return {
387
+ name: `mcp-canary:${options.agent}`,
388
+ check: async () => {
389
+ const result = await runMcpStatusCanary(options);
390
+ return { ok: result.ok, detail: result.summary };
391
+ },
392
+ };
393
+ }
@@ -34,24 +34,34 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.FileMessageRouter = void 0;
37
+ exports.getDaemonMessageRouterDir = getDaemonMessageRouterDir;
37
38
  const fs = __importStar(require("fs"));
38
39
  const path = __importStar(require("path"));
39
40
  const runtime_1 = require("../../nerves/runtime");
40
- const identity_1 = require("../identity");
41
- function messageId(nowIso) {
42
- return `msg-${nowIso.replace(/[^0-9]/g, "")}`;
41
+ const ouro_version_manager_1 = require("../versioning/ouro-version-manager");
42
+ function getDaemonMessageRouterDir(homeDir) {
43
+ return path.join((0, ouro_version_manager_1.getOuroCliHome)(homeDir), "daemon", "messages");
44
+ }
45
+ function messageId(nowIso, sequence) {
46
+ const base = `msg-${nowIso.replace(/[^0-9]/g, "")}`;
47
+ return sequence === 1 ? base : `${base}-${sequence}`;
43
48
  }
44
49
  class FileMessageRouter {
45
50
  baseDir;
46
51
  now;
52
+ maxMessagesPerInbox;
53
+ messageIdSequences = new Map();
47
54
  constructor(options = {}) {
48
- this.baseDir = options.baseDir ?? (0, identity_1.getAgentMessagesRoot)();
55
+ this.baseDir = options.baseDir ?? getDaemonMessageRouterDir(options.homeDir);
49
56
  this.now = options.now ?? (() => new Date().toISOString());
57
+ this.maxMessagesPerInbox = Math.max(1, Math.floor(options.maxMessagesPerInbox ?? 1000));
50
58
  fs.mkdirSync(this.baseDir, { recursive: true });
51
59
  }
52
60
  async send(input) {
53
61
  const queuedAt = this.now();
54
- const id = messageId(queuedAt);
62
+ const sequence = (this.messageIdSequences.get(queuedAt) ?? 0) + 1;
63
+ this.messageIdSequences.set(queuedAt, sequence);
64
+ const id = messageId(queuedAt, sequence);
55
65
  const message = {
56
66
  id,
57
67
  from: input.from,
@@ -64,6 +74,7 @@ class FileMessageRouter {
64
74
  };
65
75
  const inboxPath = this.inboxPath(input.to);
66
76
  fs.appendFileSync(inboxPath, `${JSON.stringify(message)}\n`, "utf-8");
77
+ this.trimInbox(inboxPath);
67
78
  (0, runtime_1.emitNervesEvent)({
68
79
  component: "daemon",
69
80
  event: "daemon.message_queued",
@@ -103,5 +114,34 @@ class FileMessageRouter {
103
114
  inboxPath(agent) {
104
115
  return path.join(this.baseDir, `${agent}-inbox.jsonl`);
105
116
  }
117
+ trimInbox(inboxPath) {
118
+ const raw = fs.readFileSync(inboxPath, "utf-8");
119
+ const entries = raw
120
+ .split("\n")
121
+ .filter((line) => line.trim().length > 0)
122
+ .map((line) => {
123
+ try {
124
+ JSON.parse(line);
125
+ return { line, valid: true };
126
+ }
127
+ catch {
128
+ return { line, valid: false };
129
+ }
130
+ });
131
+ const validCount = entries.filter((entry) => entry.valid).length;
132
+ if (validCount <= this.maxMessagesPerInbox)
133
+ return;
134
+ let validSeen = 0;
135
+ const keepAfterValidIndex = validCount - this.maxMessagesPerInbox;
136
+ const kept = entries
137
+ .filter((entry) => {
138
+ if (!entry.valid)
139
+ return true;
140
+ validSeen += 1;
141
+ return validSeen > keepAfterValidIndex;
142
+ })
143
+ .map((entry) => entry.line);
144
+ fs.writeFileSync(inboxPath, `${kept.join("\n")}\n`, "utf-8");
145
+ }
106
146
  }
107
147
  exports.FileMessageRouter = FileMessageRouter;