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

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 +4563 -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 +928 -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 +617 -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 +96 -0
  156. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  157. package/dist/heart/mailbox/mailbox-http-routes.js +375 -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 +37 -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 +815 -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 +322 -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 +101 -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 +2881 -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 +245 -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 +952 -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,433 @@
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.checkRsvpCutover = checkRsvpCutover;
37
+ exports.runRsvpCutover = runRsvpCutover;
38
+ const fs = __importStar(require("node:fs"));
39
+ const os = __importStar(require("node:os"));
40
+ const path = __importStar(require("node:path"));
41
+ const node_child_process_1 = require("node:child_process");
42
+ const machine_identity_1 = require("../heart/machine-identity");
43
+ const runtime_credentials_1 = require("../heart/runtime-credentials");
44
+ const runtime_1 = require("../nerves/runtime");
45
+ const LEGACY_LAUNCH_AGENT_LABEL = "com.arimendelow.rsvp-tracker";
46
+ const EMPTY_ROLLBACK = {
47
+ configBackupPath: "",
48
+ launchAgentBackupPath: "",
49
+ manifestPath: "",
50
+ };
51
+ function normalizeDeps(deps = {}) {
52
+ return {
53
+ existsSync: deps.existsSync ?? fs.existsSync,
54
+ readFileSync: deps.readFileSync ?? ((filePath) => fs.readFileSync(filePath, "utf-8")),
55
+ writeFileSync: deps.writeFileSync ?? ((filePath, contents) => fs.writeFileSync(filePath, contents, "utf-8")),
56
+ mkdirSync: deps.mkdirSync ?? ((dirPath) => fs.mkdirSync(dirPath, { recursive: true })),
57
+ renameSync: deps.renameSync ?? fs.renameSync,
58
+ copyFileSync: deps.copyFileSync ?? fs.copyFileSync,
59
+ now: deps.now ?? (() => new Date()),
60
+ spawnSync: deps.spawnSync ?? node_child_process_1.spawnSync,
61
+ platform: deps.platform ?? process.platform,
62
+ getUid: deps.getUid ?? (() => process.getuid()),
63
+ homeDir: deps.homeDir ?? os.homedir,
64
+ fetchImpl: deps.fetchImpl ?? fetch,
65
+ getLaunchAgentState: deps.getLaunchAgentState,
66
+ getLegacyProcessState: deps.getLegacyProcessState,
67
+ checkNativeBlueBubblesCredential: deps.checkNativeBlueBubblesCredential,
68
+ unloadLaunchAgent: deps.unloadLaunchAgent,
69
+ };
70
+ }
71
+ function asRecord(value) {
72
+ return value && typeof value === "object" && !Array.isArray(value)
73
+ ? value
74
+ : null;
75
+ }
76
+ function text(value) {
77
+ return typeof value === "string" ? value.trim() : "";
78
+ }
79
+ function safeStamp(now) {
80
+ return now.toISOString().replace(/[:.]/g, "-");
81
+ }
82
+ function rollbackDir(legacyRoot, now) {
83
+ return path.join(legacyRoot, ".ouro-cutover", safeStamp(now));
84
+ }
85
+ function buildBlueBubblesHealthUrl(baseUrl, password) {
86
+ const root = baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
87
+ const url = new URL("api/v1/message/count", root);
88
+ url.searchParams.set("password", password);
89
+ return url.toString();
90
+ }
91
+ function readLegacyConfig(legacyRoot, deps) {
92
+ const configPath = path.join(legacyRoot, "config.json");
93
+ if (!deps.existsSync(configPath))
94
+ return { status: "missing" };
95
+ try {
96
+ const parsed = JSON.parse(deps.readFileSync(configPath));
97
+ const config = asRecord(parsed);
98
+ return config ? { status: "ok", config } : { status: "malformed" };
99
+ }
100
+ catch {
101
+ return { status: "malformed" };
102
+ }
103
+ }
104
+ function legacyConfigSendInactive(legacyRoot, deps) {
105
+ const legacy = readLegacyConfig(legacyRoot, deps);
106
+ if (legacy.status === "missing")
107
+ return true;
108
+ if (legacy.status !== "ok")
109
+ return false;
110
+ const bluebubbles = asRecord(legacy.config?.bluebubbles);
111
+ if (!bluebubbles)
112
+ return true;
113
+ if (bluebubbles.disabled === true || bluebubbles.enabled === false || bluebubbles.send_enabled === false || bluebubbles.sendEnabled === false)
114
+ return true;
115
+ const hasLiveCoordinates = !!text(bluebubbles.server_url ?? bluebubbles.serverUrl)
116
+ && !!text(bluebubbles.chat_guid ?? bluebubbles.chatGuid)
117
+ && !!text(bluebubbles.secrets_path ?? bluebubbles.secretsPath);
118
+ return !hasLiveCoordinates;
119
+ }
120
+ async function defaultLaunchAgentState(input, deps) {
121
+ if (deps.platform !== "darwin") {
122
+ return { label: input.label, loaded: false, source: "unavailable" };
123
+ }
124
+ const uid = deps.getUid();
125
+ if (uid === null)
126
+ return { label: input.label, loaded: false, source: "unavailable" };
127
+ const result = deps.spawnSync("launchctl", ["print", `gui/${uid}/${input.label}`], {
128
+ encoding: "utf-8",
129
+ timeout: 5_000,
130
+ });
131
+ return {
132
+ label: input.label,
133
+ loaded: result.status === 0,
134
+ plistPath: firstExistingPath([
135
+ path.join(input.legacyRoot, `${input.label}.plist`),
136
+ path.join(deps.homeDir(), "Library", "LaunchAgents", `${input.label}.plist`),
137
+ ], deps),
138
+ source: "launchctl",
139
+ };
140
+ }
141
+ async function defaultLegacyProcessState(input, deps) {
142
+ const result = deps.spawnSync("ps", ["-axo", "pid=,command="], {
143
+ encoding: "utf-8",
144
+ timeout: 5_000,
145
+ });
146
+ if (result.status !== 0 || typeof result.stdout !== "string") {
147
+ return { running: false, count: 0, source: "unavailable" };
148
+ }
149
+ const legacyRoot = input.legacyRoot;
150
+ const count = result.stdout
151
+ .split("\n")
152
+ .filter((line) => line.includes("rsvp_tracker.py") || line.includes(legacyRoot))
153
+ .filter((line) => !line.includes("vitest") && !line.includes("node "))
154
+ .length;
155
+ return { running: count > 0, count, source: "ps" };
156
+ }
157
+ async function defaultNativeBlueBubblesCredentialHealth(input, deps) {
158
+ if (!input.agent) {
159
+ return { ok: false, detail: "native BlueBubbles credential check requires an agent" };
160
+ }
161
+ const cachedRuntimeConfig = (0, runtime_credentials_1.readMachineRuntimeCredentialConfig)(input.agent);
162
+ const runtimeConfig = cachedRuntimeConfig.ok
163
+ ? cachedRuntimeConfig
164
+ : await (0, runtime_credentials_1.refreshMachineRuntimeCredentialConfig)(input.agent, (0, machine_identity_1.loadOrCreateMachineIdentity)({ homeDir: deps.homeDir() }).machineId, { preserveCachedOnFailure: true });
165
+ if (!runtimeConfig.ok) {
166
+ return { ok: false, detail: "machine runtime/config unavailable" };
167
+ }
168
+ const bluebubbles = asRecord(runtimeConfig.config.bluebubbles);
169
+ const bluebubblesSense = asRecord(runtimeConfig.config.bluebubblesChannel);
170
+ const serverUrl = text(bluebubbles?.serverUrl);
171
+ const password = text(bluebubbles?.password);
172
+ if (!serverUrl || !password) {
173
+ return { ok: false, detail: "machine runtime/config missing bluebubbles serverUrl/password" };
174
+ }
175
+ const requestTimeoutMs = typeof bluebubblesSense?.requestTimeoutMs === "number" && Number.isFinite(bluebubblesSense.requestTimeoutMs)
176
+ ? bluebubblesSense.requestTimeoutMs
177
+ : 30_000;
178
+ try {
179
+ const response = await deps.fetchImpl(buildBlueBubblesHealthUrl(serverUrl, password), {
180
+ method: "GET",
181
+ signal: AbortSignal.timeout(requestTimeoutMs),
182
+ });
183
+ return response.ok
184
+ ? { ok: true, detail: "native BlueBubbles credential healthy" }
185
+ : { ok: false, detail: `native BlueBubbles health probe returned HTTP ${response.status}` };
186
+ }
187
+ catch {
188
+ return { ok: false, detail: "native BlueBubbles health probe failed" };
189
+ }
190
+ }
191
+ async function defaultUnloadLaunchAgent(input, deps) {
192
+ if (deps.platform !== "darwin")
193
+ return { ok: true, detail: "launchd not applicable on this platform" };
194
+ const uid = deps.getUid();
195
+ if (uid === null)
196
+ return { ok: false, detail: "current uid unavailable" };
197
+ const bootout = deps.spawnSync("launchctl", ["bootout", `gui/${uid}/${input.label}`], {
198
+ encoding: "utf-8",
199
+ timeout: 5_000,
200
+ });
201
+ if (bootout.status === 0)
202
+ return { ok: true };
203
+ if (input.plistPath) {
204
+ const unload = deps.spawnSync("launchctl", ["unload", "-w", input.plistPath], {
205
+ encoding: "utf-8",
206
+ timeout: 5_000,
207
+ });
208
+ if (unload.status === 0)
209
+ return { ok: true };
210
+ }
211
+ return { ok: true, detail: "legacy LaunchAgent was not loaded or launchctl did not report it as loaded" };
212
+ }
213
+ function firstExistingPath(candidates, deps) {
214
+ return candidates.find((candidate) => !!candidate && deps.existsSync(candidate));
215
+ }
216
+ function launchAgentPlistCandidates(legacyRoot, state, deps) {
217
+ const candidates = [
218
+ state.plistPath,
219
+ path.join(legacyRoot, `${LEGACY_LAUNCH_AGENT_LABEL}.plist`),
220
+ path.join(deps.homeDir(), "Library", "LaunchAgents", `${LEGACY_LAUNCH_AGENT_LABEL}.plist`),
221
+ ];
222
+ return [...new Set(candidates.filter((candidate) => !!candidate && deps.existsSync(candidate)))];
223
+ }
224
+ function denialReasons(checks) {
225
+ const reasons = [];
226
+ if (!checks.launchAgentInactive)
227
+ reasons.push("legacy LaunchAgent is still loaded");
228
+ if (!checks.legacyProcessInactive)
229
+ reasons.push("legacy RSVP process is still running");
230
+ if (!checks.legacyConfigSendInactive)
231
+ reasons.push("legacy RSVP config can still send BlueBubbles messages");
232
+ if (!checks.legacyLiveSendInactive)
233
+ reasons.push("legacy live-send path is still active");
234
+ if (!checks.nativeBlueBubblesCredentialHealthy)
235
+ reasons.push("native BlueBubbles credential is not healthy");
236
+ return reasons;
237
+ }
238
+ function report(input) {
239
+ const reasons = denialReasons(input.checks);
240
+ const sendAllowed = reasons.length === 0;
241
+ return {
242
+ ok: input.ok ?? true,
243
+ action: input.action,
244
+ sideEffect: input.sideEffect,
245
+ ...(input.agent ? { agent: input.agent } : {}),
246
+ legacyRoot: input.legacyRoot,
247
+ checks: input.checks,
248
+ sendAllowed,
249
+ denialReasons: reasons,
250
+ message: sendAllowed
251
+ ? "native RSVP live send is allowed"
252
+ : "native RSVP live send is blocked until cutover gates pass",
253
+ ...(input.requires ? { requires: input.requires } : {}),
254
+ rollback: {
255
+ ...EMPTY_ROLLBACK,
256
+ ...input.rollback,
257
+ },
258
+ };
259
+ }
260
+ async function buildChecks(input, deps) {
261
+ if (!deps.existsSync(input.legacyRoot)) {
262
+ return {
263
+ launchAgentInactive: true,
264
+ legacyProcessInactive: true,
265
+ legacyConfigSendInactive: true,
266
+ legacyLiveSendInactive: true,
267
+ nativeBlueBubblesCredentialHealthy: false,
268
+ };
269
+ }
270
+ const launchAgentState = deps.getLaunchAgentState
271
+ ? await deps.getLaunchAgentState({
272
+ label: LEGACY_LAUNCH_AGENT_LABEL,
273
+ legacyRoot: input.legacyRoot,
274
+ })
275
+ : await defaultLaunchAgentState({
276
+ label: LEGACY_LAUNCH_AGENT_LABEL,
277
+ legacyRoot: input.legacyRoot,
278
+ }, deps);
279
+ const processState = deps.getLegacyProcessState
280
+ ? await deps.getLegacyProcessState({ legacyRoot: input.legacyRoot })
281
+ : await defaultLegacyProcessState({ legacyRoot: input.legacyRoot }, deps);
282
+ const configInactive = legacyConfigSendInactive(input.legacyRoot, deps);
283
+ const liveInactive = !launchAgentState.loaded && !processState.running && configInactive;
284
+ const nativeCredential = deps.checkNativeBlueBubblesCredential
285
+ ? await deps.checkNativeBlueBubblesCredential({ agent: input.agent })
286
+ : await defaultNativeBlueBubblesCredentialHealth({ agent: input.agent }, deps);
287
+ return {
288
+ launchAgentInactive: !launchAgentState.loaded,
289
+ legacyProcessInactive: !processState.running,
290
+ legacyConfigSendInactive: configInactive,
291
+ legacyLiveSendInactive: liveInactive,
292
+ nativeBlueBubblesCredentialHealthy: nativeCredential.ok,
293
+ };
294
+ }
295
+ async function checkRsvpCutover(input) {
296
+ const deps = normalizeDeps(input.deps);
297
+ const checks = await buildChecks(input, deps);
298
+ const result = report({
299
+ action: "check",
300
+ sideEffect: false,
301
+ agent: input.agent,
302
+ legacyRoot: input.legacyRoot,
303
+ checks,
304
+ });
305
+ (0, runtime_1.emitNervesEvent)({
306
+ component: "rsvp",
307
+ event: "rsvp.cutover_checked",
308
+ message: "checked RSVP legacy cutover gates",
309
+ meta: {
310
+ agent: input.agent,
311
+ sendAllowed: result.sendAllowed,
312
+ denialCount: result.denialReasons.length,
313
+ },
314
+ });
315
+ return result;
316
+ }
317
+ function writeRollbackManifest(input) {
318
+ const manifestPath = path.join(rollbackDir(input.legacyRoot, input.deps.now()), `${input.action}-rollback.json`);
319
+ input.deps.mkdirSync(path.dirname(manifestPath));
320
+ const rollback = {
321
+ ...EMPTY_ROLLBACK,
322
+ ...input.rollback,
323
+ manifestPath,
324
+ };
325
+ input.deps.writeFileSync(manifestPath, `${JSON.stringify({
326
+ action: input.action,
327
+ createdAt: input.deps.now().toISOString(),
328
+ label: LEGACY_LAUNCH_AGENT_LABEL,
329
+ rollback,
330
+ }, null, 2)}\n`);
331
+ return rollback;
332
+ }
333
+ async function retireLegacySendConfig(input, deps) {
334
+ const configPath = path.join(input.legacyRoot, "config.json");
335
+ const backupPath = path.join(rollbackDir(input.legacyRoot, deps.now()), "config.json");
336
+ deps.mkdirSync(path.dirname(backupPath));
337
+ deps.copyFileSync(configPath, backupPath);
338
+ const legacy = readLegacyConfig(input.legacyRoot, deps);
339
+ const config = legacy.status === "ok" ? { ...legacy.config } : {};
340
+ config.bluebubbles = {
341
+ send_enabled: false,
342
+ enabled: false,
343
+ disabled: true,
344
+ disabled_by: "ouro rsvp cutover",
345
+ disabled_at: deps.now().toISOString(),
346
+ };
347
+ deps.writeFileSync(configPath, `${JSON.stringify(config, null, 2)}\n`);
348
+ return writeRollbackManifest({
349
+ legacyRoot: input.legacyRoot,
350
+ action: "retire-legacy-send-config",
351
+ deps,
352
+ rollback: { configBackupPath: backupPath },
353
+ });
354
+ }
355
+ async function quarantineLaunchAgent(input, deps) {
356
+ const state = deps.getLaunchAgentState
357
+ ? await deps.getLaunchAgentState({
358
+ label: LEGACY_LAUNCH_AGENT_LABEL,
359
+ legacyRoot: input.legacyRoot,
360
+ })
361
+ : await defaultLaunchAgentState({
362
+ label: LEGACY_LAUNCH_AGENT_LABEL,
363
+ legacyRoot: input.legacyRoot,
364
+ }, deps);
365
+ const candidates = launchAgentPlistCandidates(input.legacyRoot, state, deps);
366
+ const plistPath = candidates[0];
367
+ if (deps.unloadLaunchAgent) {
368
+ await deps.unloadLaunchAgent({
369
+ label: LEGACY_LAUNCH_AGENT_LABEL,
370
+ legacyRoot: input.legacyRoot,
371
+ ...(plistPath ? { plistPath } : {}),
372
+ });
373
+ }
374
+ else {
375
+ await defaultUnloadLaunchAgent({
376
+ label: LEGACY_LAUNCH_AGENT_LABEL,
377
+ ...(plistPath ? { plistPath } : {}),
378
+ }, deps);
379
+ }
380
+ let backupPath = "";
381
+ if (plistPath) {
382
+ backupPath = path.join(rollbackDir(input.legacyRoot, deps.now()), path.basename(plistPath));
383
+ deps.mkdirSync(path.dirname(backupPath));
384
+ deps.renameSync(plistPath, backupPath);
385
+ }
386
+ return writeRollbackManifest({
387
+ legacyRoot: input.legacyRoot,
388
+ action: "quarantine-launchd",
389
+ deps,
390
+ rollback: { launchAgentBackupPath: backupPath },
391
+ });
392
+ }
393
+ async function runRsvpCutover(input) {
394
+ const deps = normalizeDeps(input.deps);
395
+ if (input.action !== "check" && !input.yes) {
396
+ const checks = await buildChecks(input, deps);
397
+ return report({
398
+ action: input.action,
399
+ sideEffect: false,
400
+ agent: input.agent,
401
+ legacyRoot: input.legacyRoot,
402
+ checks,
403
+ ok: false,
404
+ requires: "--yes",
405
+ });
406
+ }
407
+ if (input.action === "check") {
408
+ return checkRsvpCutover(input);
409
+ }
410
+ const rollback = input.action === "retire-legacy-send-config"
411
+ ? await retireLegacySendConfig(input, deps)
412
+ : await quarantineLaunchAgent(input, deps);
413
+ const checks = await buildChecks(input, deps);
414
+ const result = report({
415
+ action: input.action,
416
+ sideEffect: true,
417
+ agent: input.agent,
418
+ legacyRoot: input.legacyRoot,
419
+ checks,
420
+ rollback,
421
+ });
422
+ (0, runtime_1.emitNervesEvent)({
423
+ component: "rsvp",
424
+ event: "rsvp.cutover_action_executed",
425
+ message: "executed RSVP cutover action",
426
+ meta: {
427
+ agent: input.agent,
428
+ action: input.action,
429
+ sendAllowed: result.sendAllowed,
430
+ },
431
+ });
432
+ return result;
433
+ }
@@ -0,0 +1,222 @@
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.collectRsvpDiagnostics = collectRsvpDiagnostics;
37
+ const path = __importStar(require("node:path"));
38
+ const habit_parser_1 = require("../heart/habits/habit-parser");
39
+ const runtime_1 = require("../nerves/runtime");
40
+ const habit_policy_1 = require("./habit-policy");
41
+ function isRecord(value) {
42
+ return !!value && typeof value === "object" && !Array.isArray(value);
43
+ }
44
+ function readJson(filePath, deps) {
45
+ try {
46
+ return JSON.parse(deps.readFileSync(filePath));
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ }
52
+ function numberField(record, key) {
53
+ const value = record[key];
54
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
55
+ }
56
+ function stringField(record, key) {
57
+ const value = record[key];
58
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
59
+ }
60
+ function countsFrom(value) {
61
+ if (!isRecord(value))
62
+ return null;
63
+ const attending = numberField(value, "attending");
64
+ const declined = numberField(value, "declined");
65
+ const pending = numberField(value, "pending");
66
+ return attending === null || declined === null || pending === null
67
+ ? null
68
+ : { attending, declined, pending };
69
+ }
70
+ function readLedgerRows(filePath, deps) {
71
+ if (!deps.existsSync(filePath))
72
+ return [];
73
+ const lines = deps.readFileSync(filePath).split(/\r?\n/).filter((line) => line.trim().length > 0);
74
+ const rows = [];
75
+ for (const line of lines) {
76
+ try {
77
+ const parsed = JSON.parse(line);
78
+ if (isRecord(parsed))
79
+ rows.push(parsed);
80
+ }
81
+ catch {
82
+ // Ignore malformed rows in this high-level health summary.
83
+ }
84
+ }
85
+ return rows;
86
+ }
87
+ function rowTimestamp(row) {
88
+ const raw = stringField(row, "createdAt") ?? stringField(row, "anchorTimestamp") ?? "";
89
+ const parsed = Date.parse(raw);
90
+ return Number.isFinite(parsed) ? parsed : 0;
91
+ }
92
+ function contextPacketLedgerHealth(agentRoot, deps) {
93
+ const candidates = [
94
+ path.join(agentRoot, "state", "senses", "context-packets", "bluebubbles", "ledger.jsonl"),
95
+ path.join(agentRoot, "state", "senses", "context-packets", "ledger.jsonl"),
96
+ ];
97
+ const rowsByPath = candidates
98
+ .map((ledgerPath) => ({ ledgerPath, rows: readLedgerRows(ledgerPath, deps) }))
99
+ .filter((entry) => entry.rows.length > 0);
100
+ if (rowsByPath.length === 0) {
101
+ return { status: "warn", detail: "no context packet ledger rows found", rows: 0 };
102
+ }
103
+ const selected = rowsByPath[0];
104
+ const latest = [...selected.rows].sort((left, right) => rowTimestamp(right) - rowTimestamp(left))[0];
105
+ const latestPacketId = stringField(latest, "packetId") ?? stringField(latest, "id") ?? undefined;
106
+ return {
107
+ status: latestPacketId ? "pass" : "warn",
108
+ detail: latestPacketId ? `latestPacketId=${latestPacketId}; rows=${selected.rows.length}` : `rows=${selected.rows.length}; latest packet id missing`,
109
+ ...(latestPacketId ? { latestPacketId } : {}),
110
+ ledgerPath: selected.ledgerPath,
111
+ rows: selected.rows.length,
112
+ };
113
+ }
114
+ function habitScheduleHealth(agentRoot, deps) {
115
+ const habitsDir = path.join(agentRoot, "habits");
116
+ if (!deps.existsSync(habitsDir))
117
+ return { status: "warn", detail: "habits directory missing" };
118
+ try {
119
+ const rsvpHabits = deps.readdirSync(habitsDir)
120
+ .filter((name) => name.endsWith(".md") && (0, habit_policy_1.isRsvpHabitName)(name.replace(/\.md$/, "")))
121
+ .map((name) => {
122
+ const filePath = path.join(habitsDir, name);
123
+ return (0, habit_parser_1.parseHabitFile)(deps.readFileSync(filePath), filePath);
124
+ });
125
+ const active = rsvpHabits.find((habit) => habit.status === "active");
126
+ if (!active)
127
+ return { status: "warn", detail: "no active RSVP habit found" };
128
+ if (!active.rsvp)
129
+ return { status: "fail", detail: `activeHabit=${active.name}; typed RSVP habit metadata missing` };
130
+ const cadence = active.cadence ?? "unspecified";
131
+ return {
132
+ status: "pass",
133
+ detail: [
134
+ `activeHabit=${active.name}`,
135
+ `cadence=${cadence}`,
136
+ `sense=${active.rsvp.sense}`,
137
+ `source=${active.rsvp.source}`,
138
+ `snapshotRef=${active.rsvp.snapshotRef}`,
139
+ ].join("; "),
140
+ activeHabit: active.name,
141
+ cadence,
142
+ policyVersion: active.rsvp.policyVersion,
143
+ sense: active.rsvp.sense,
144
+ source: active.rsvp.source,
145
+ routeRef: active.rsvp.routeRef,
146
+ snapshotRef: active.rsvp.snapshotRef,
147
+ outboundStateRef: active.rsvp.outboundStateRef,
148
+ budgetRef: active.rsvp.budgetRef,
149
+ idempotencyRef: active.rsvp.idempotencyRef,
150
+ };
151
+ }
152
+ catch (error) {
153
+ return { status: "fail", detail: `habit schedule unreadable: ${error instanceof Error ? error.message : String(error)}` };
154
+ }
155
+ }
156
+ function latestFetchHealth(agentRoot, deps) {
157
+ const latestPath = path.join(agentRoot, "state", "rsvp", "snapshots", "latest.json");
158
+ if (!deps.existsSync(latestPath))
159
+ return { status: "warn", detail: "latest RSVP snapshot missing" };
160
+ const parsed = readJson(latestPath, deps);
161
+ if (!isRecord(parsed))
162
+ return { status: "fail", detail: "latest RSVP snapshot is malformed" };
163
+ const snapshotId = stringField(parsed, "snapshotId");
164
+ const counts = countsFrom(parsed.counts) ?? countsFrom(parsed.summary);
165
+ if (!snapshotId || !counts)
166
+ return { status: "fail", detail: "latest RSVP snapshot missing id or counts" };
167
+ return {
168
+ status: "pass",
169
+ detail: `snapshotId=${snapshotId}; pending=${counts.pending}`,
170
+ snapshotId,
171
+ counts,
172
+ };
173
+ }
174
+ function deliveryReconciliationHealth(agentRoot, deps) {
175
+ const legacyLedgerPath = path.join(agentRoot, "state", "rsvp", "outbound", "ledger.json");
176
+ if (deps.existsSync(legacyLedgerPath)) {
177
+ const parsed = readJson(legacyLedgerPath, deps);
178
+ const reservations = isRecord(parsed) && Array.isArray(parsed.reservations) ? parsed.reservations : [];
179
+ const accepted = reservations.filter((entry) => isRecord(entry) && entry.status === "accepted").length;
180
+ return { status: "pass", detail: `accepted=${accepted}`, accepted };
181
+ }
182
+ const statePath = path.join(agentRoot, "state", "rsvp", "outbound-state.json");
183
+ if (!deps.existsSync(statePath))
184
+ return { status: "warn", detail: "RSVP outbound state missing", accepted: 0 };
185
+ const parsed = readJson(statePath, deps);
186
+ if (!isRecord(parsed))
187
+ return { status: "fail", detail: "RSVP outbound state is malformed", accepted: 0 };
188
+ const accepted = isRecord(parsed.baseline) ? 1 : 0;
189
+ return { status: "pass", detail: `accepted=${accepted}`, accepted };
190
+ }
191
+ function spendTimelineHealth(agentRoot, deps) {
192
+ const spendPath = path.join(agentRoot, "state", "rsvp", "spend-ledger.json");
193
+ if (!deps.existsSync(spendPath))
194
+ return { status: "warn", detail: "RSVP spend ledger missing", runs: 0 };
195
+ const parsed = readJson(spendPath, deps);
196
+ if (!isRecord(parsed) || !Array.isArray(parsed.runs)) {
197
+ return { status: "fail", detail: "RSVP spend ledger is malformed", runs: 0 };
198
+ }
199
+ return { status: "pass", detail: `runs=${parsed.runs.length}`, runs: parsed.runs.length };
200
+ }
201
+ function collectRsvpDiagnostics(agentRoot, deps) {
202
+ const diagnostics = {
203
+ contextPacketLedger: contextPacketLedgerHealth(agentRoot, deps),
204
+ habitSchedule: habitScheduleHealth(agentRoot, deps),
205
+ latestFetch: latestFetchHealth(agentRoot, deps),
206
+ deliveryReconciliation: deliveryReconciliationHealth(agentRoot, deps),
207
+ spendTimeline: spendTimelineHealth(agentRoot, deps),
208
+ };
209
+ (0, runtime_1.emitNervesEvent)({
210
+ component: "rsvp",
211
+ event: "rsvp.diagnostics_collected",
212
+ message: "collected RSVP diagnostics",
213
+ meta: {
214
+ contextPacketLedger: diagnostics.contextPacketLedger.status,
215
+ habitSchedule: diagnostics.habitSchedule.status,
216
+ latestFetch: diagnostics.latestFetch.status,
217
+ deliveryReconciliation: diagnostics.deliveryReconciliation.status,
218
+ spendTimeline: diagnostics.spendTimeline.status,
219
+ },
220
+ });
221
+ return diagnostics;
222
+ }