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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (647) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -23
  3. package/RepairGuide.ouro/agent.json +5 -0
  4. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  5. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  6. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  7. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  8. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  9. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/assets/bluebubbles-host +264 -0
  14. package/assets/sanctuary-host-launcher.sh +16 -0
  15. package/changelog.json +5308 -16
  16. package/deploy/unraid/Dockerfile +54 -0
  17. package/deploy/unraid/README.txt +2983 -0
  18. package/deploy/unraid/audit-container-spec.sh +4 -0
  19. package/deploy/unraid/container-runtime.json +1 -0
  20. package/deploy/unraid/docker-man-template-transaction.mjs +711 -0
  21. package/deploy/unraid/docker-man-template-xml.cjs +105 -0
  22. package/deploy/unraid/migrate-sanctuary-bundle.mjs +60 -0
  23. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  24. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  25. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  26. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  27. package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
  28. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  29. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
  30. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  31. package/deploy/unraid/sanctuary-authority-installation.json +36 -0
  32. package/deploy/unraid/sanctuary-authority-service.sh +30 -0
  33. package/deploy/unraid/sanctuary-deployment-target.mjs +710 -0
  34. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  35. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2084 -0
  36. package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
  37. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  38. package/deploy/unraid/sanctuary.ouro/agent.json +66 -0
  39. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  40. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  41. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  42. package/deploy/unraid/sanctuary.ouro/mcp/media-mcp.mjs +795 -0
  43. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  44. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  45. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
  46. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +15 -0
  47. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +25 -0
  48. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +15 -0
  49. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  50. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +135 -0
  51. package/deploy/unraid/sanctuary.xml +28 -0
  52. package/dist/a2a/card.js +57 -0
  53. package/dist/a2a/client.js +180 -0
  54. package/dist/a2a/config.js +50 -0
  55. package/dist/a2a/delegation-stores.js +56 -0
  56. package/dist/a2a/did-resolution.js +93 -0
  57. package/dist/a2a/identity.js +170 -0
  58. package/dist/a2a/inbound-share.js +107 -0
  59. package/dist/a2a/mission-result-wire.js +196 -0
  60. package/dist/a2a/onboarding.js +115 -0
  61. package/dist/a2a/pin-store.js +132 -0
  62. package/dist/a2a/seen-ledger.js +120 -0
  63. package/dist/a2a/server.js +604 -0
  64. package/dist/a2a/task-store.js +69 -0
  65. package/dist/a2a/transport.js +45 -0
  66. package/dist/a2a/types.js +3 -0
  67. package/dist/arc/attention-types.js +8 -0
  68. package/dist/arc/cares.js +360 -0
  69. package/dist/arc/episodes.js +118 -0
  70. package/dist/arc/evolution.js +490 -0
  71. package/dist/arc/flight-recorder.js +1034 -0
  72. package/dist/arc/intentions.js +134 -0
  73. package/dist/arc/json-store.js +117 -0
  74. package/dist/arc/obligations.js +386 -0
  75. package/dist/arc/packets.js +336 -0
  76. package/dist/arc/presence.js +185 -0
  77. package/dist/arc/task-lifecycle.js +57 -0
  78. package/dist/commerce/store.js +755 -0
  79. package/dist/commerce/types.js +3 -0
  80. package/dist/heart/active-work.js +798 -40
  81. package/dist/heart/agent-entry.js +252 -3
  82. package/dist/heart/approval-files.js +113 -0
  83. package/dist/heart/approval-store.js +960 -0
  84. package/dist/heart/attachments/image-normalize.js +194 -0
  85. package/dist/heart/attachments/materialize.js +97 -0
  86. package/dist/heart/attachments/originals.js +88 -0
  87. package/dist/heart/attachments/render.js +29 -0
  88. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  89. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  90. package/dist/heart/attachments/sources/index.js +18 -0
  91. package/dist/heart/attachments/sources/telegram.js +71 -0
  92. package/dist/heart/attachments/store.js +132 -0
  93. package/dist/heart/attachments/types.js +93 -0
  94. package/dist/heart/auth/auth-flow.js +495 -0
  95. package/dist/heart/autonomy-budget.js +478 -0
  96. package/dist/heart/awaiting/await-alert.js +148 -0
  97. package/dist/heart/awaiting/await-expiry.js +143 -0
  98. package/dist/heart/awaiting/await-loader.js +91 -0
  99. package/dist/heart/awaiting/await-parser.js +149 -0
  100. package/dist/heart/awaiting/await-runtime-state.js +111 -0
  101. package/dist/heart/awaiting/await-scheduler.js +382 -0
  102. package/dist/heart/background-operations.js +281 -0
  103. package/dist/heart/bridges/manager.js +137 -17
  104. package/dist/heart/bridges/store.js +14 -2
  105. package/dist/heart/bundle-state.js +168 -0
  106. package/dist/heart/commitments.js +44 -18
  107. package/dist/heart/config-registry.js +331 -0
  108. package/dist/heart/config.js +174 -131
  109. package/dist/heart/context-loss-gauntlet.js +387 -0
  110. package/dist/heart/context-loss-sentinel.js +1157 -0
  111. package/dist/heart/core.js +2169 -581
  112. package/dist/heart/cross-chat-delivery.js +9 -22
  113. package/dist/heart/daemon/agent-config-check.js +451 -0
  114. package/dist/heart/daemon/agent-discovery.js +185 -3
  115. package/dist/heart/daemon/agent-service.js +542 -0
  116. package/dist/heart/daemon/agentic-repair.js +547 -0
  117. package/dist/heart/daemon/await-private-wake.js +59 -0
  118. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  119. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  120. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  121. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  122. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  123. package/dist/heart/daemon/cadence.js +180 -0
  124. package/dist/heart/daemon/cli-defaults.js +854 -0
  125. package/dist/heart/daemon/cli-desk.js +322 -0
  126. package/dist/heart/daemon/cli-exec.js +8822 -0
  127. package/dist/heart/daemon/cli-help.js +716 -0
  128. package/dist/heart/daemon/cli-parse.js +2771 -0
  129. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  130. package/dist/heart/daemon/cli-render.js +777 -0
  131. package/dist/heart/daemon/cli-types.js +8 -0
  132. package/dist/heart/daemon/connect-bay.js +323 -0
  133. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  134. package/dist/heart/daemon/container-healthcheck.js +112 -0
  135. package/dist/heart/daemon/container-runtime.js +97 -0
  136. package/dist/heart/daemon/container-spec-auditor-main.js +171 -0
  137. package/dist/heart/daemon/container-spec-auditor.js +229 -0
  138. package/dist/heart/daemon/daemon-bootstrap-startup.js +115 -0
  139. package/dist/heart/daemon/daemon-cli.js +29 -2349
  140. package/dist/heart/daemon/daemon-entry.js +930 -11
  141. package/dist/heart/daemon/daemon-health.js +186 -0
  142. package/dist/heart/daemon/daemon-rollup.js +57 -0
  143. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  144. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  145. package/dist/heart/daemon/daemon.js +2084 -105
  146. package/dist/heart/daemon/dns-workflow.js +394 -0
  147. package/dist/heart/daemon/doctor-types.js +8 -0
  148. package/dist/heart/daemon/doctor.js +1755 -0
  149. package/dist/heart/daemon/freshness.js +345 -0
  150. package/dist/heart/daemon/habit-private-wake.js +61 -0
  151. package/dist/heart/daemon/health-monitor.js +142 -11
  152. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  153. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  154. package/dist/heart/daemon/http-health-probe.js +80 -0
  155. package/dist/heart/daemon/human-command-screens.js +234 -0
  156. package/dist/heart/daemon/human-readiness.js +114 -0
  157. package/dist/heart/daemon/inner-status.js +78 -0
  158. package/dist/heart/daemon/interactive-repair.js +394 -0
  159. package/dist/heart/daemon/launchd.js +37 -8
  160. package/dist/heart/daemon/log-tailer.js +79 -10
  161. package/dist/heart/daemon/logs-prune.js +132 -0
  162. package/dist/heart/daemon/mcp-canary.js +524 -0
  163. package/dist/heart/daemon/message-router.js +65 -5
  164. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  165. package/dist/heart/daemon/os-cron-deps.js +135 -0
  166. package/dist/heart/daemon/os-cron.js +22 -14
  167. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  168. package/dist/heart/daemon/ouro-entry.js +3 -1
  169. package/dist/heart/daemon/plugin-cli.js +432 -0
  170. package/dist/heart/daemon/process-manager.js +733 -61
  171. package/dist/heart/daemon/provider-discovery.js +137 -0
  172. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  173. package/dist/heart/daemon/prunable-bundle.js +144 -0
  174. package/dist/heart/daemon/pulse.js +511 -0
  175. package/dist/heart/daemon/readiness-repair.js +365 -0
  176. package/dist/heart/daemon/run-hooks.js +2 -0
  177. package/dist/heart/daemon/runtime-logging.js +47 -14
  178. package/dist/heart/daemon/runtime-metadata.js +2 -30
  179. package/dist/heart/daemon/runtime-mode.js +13 -2
  180. package/dist/heart/daemon/safe-mode.js +161 -0
  181. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2654 -0
  182. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1830 -0
  183. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  184. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +955 -0
  185. package/dist/heart/daemon/sanctuary-authority-codec.js +86 -0
  186. package/dist/heart/daemon/sanctuary-authority-epoch.js +256 -0
  187. package/dist/heart/daemon/sanctuary-authority-installation.js +140 -0
  188. package/dist/heart/daemon/sanctuary-authority-ledger.js +241 -0
  189. package/dist/heart/daemon/sanctuary-authority-root-lifecycle.js +819 -0
  190. package/dist/heart/daemon/sanctuary-authority-vault-migration.js +79 -0
  191. package/dist/heart/daemon/sanctuary-bundle-migration.js +729 -0
  192. package/dist/heart/daemon/sanctuary-host-authority.js +1008 -0
  193. package/dist/heart/daemon/sanctuary-host-detached-supervisor.js +494 -0
  194. package/dist/heart/daemon/sanctuary-host-executor.js +670 -0
  195. package/dist/heart/daemon/sanctuary-host-linux-kernel.js +334 -0
  196. package/dist/heart/daemon/sanctuary-host-supervisor-entry.js +207 -0
  197. package/dist/heart/daemon/sanctuary-host-supervisor.js +95 -0
  198. package/dist/heart/daemon/sanctuary-package-management.js +103 -0
  199. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  200. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  201. package/dist/heart/daemon/sanctuary-telegram-authority-entry.js +445 -0
  202. package/dist/heart/daemon/sanctuary-telegram-authority-gateway.js +585 -0
  203. package/dist/heart/daemon/sanctuary-telegram-authority-service.js +630 -0
  204. package/dist/heart/daemon/sense-manager.js +699 -48
  205. package/dist/heart/daemon/session-id-resolver.js +131 -0
  206. package/dist/heart/daemon/skill-management-installer.js +1 -1
  207. package/dist/heart/daemon/socket-client.js +180 -12
  208. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  209. package/dist/heart/daemon/startup-tui.js +339 -0
  210. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  211. package/dist/heart/daemon/task-scheduler.js +117 -39
  212. package/dist/heart/daemon/terminal-ui.js +499 -0
  213. package/dist/heart/daemon/thoughts.js +138 -54
  214. package/dist/heart/daemon/up-progress.js +366 -0
  215. package/dist/heart/daemon/vault-items.js +56 -0
  216. package/dist/heart/delegation.js +1 -4
  217. package/dist/heart/external-events/router.js +1430 -0
  218. package/dist/heart/frontend-approval-runtime.js +506 -0
  219. package/dist/heart/frontend-journal.js +215 -0
  220. package/dist/heart/frontend-session-service.js +237 -0
  221. package/dist/heart/frontend-socket-client.js +164 -0
  222. package/dist/heart/frontend-socket.js +400 -0
  223. package/dist/heart/habits/habit-cancel.js +810 -0
  224. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  225. package/dist/heart/habits/habit-migration.js +194 -0
  226. package/dist/heart/habits/habit-parser.js +278 -0
  227. package/dist/heart/habits/habit-runtime-state.js +93 -0
  228. package/dist/heart/habits/habit-scheduler.js +653 -0
  229. package/dist/heart/habits/habit-session-summary.js +318 -0
  230. package/dist/heart/habits/habit-session.js +636 -0
  231. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  232. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  233. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  234. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  235. package/dist/heart/identity.js +196 -59
  236. package/dist/heart/kept-notes.js +289 -0
  237. package/dist/heart/kicks.js +1 -1
  238. package/dist/heart/machine-identity.js +161 -0
  239. package/dist/heart/mail-import-discovery.js +356 -0
  240. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  241. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  242. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  243. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  244. package/dist/heart/mailbox/mailbox-http-transport.js +129 -0
  245. package/dist/heart/mailbox/mailbox-http.js +99 -0
  246. package/dist/heart/mailbox/mailbox-read.js +39 -0
  247. package/dist/heart/mailbox/mailbox-types.js +27 -0
  248. package/dist/heart/mailbox/mailbox-view.js +197 -0
  249. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  250. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  251. package/dist/heart/mailbox/readers/mail.js +375 -0
  252. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  253. package/dist/heart/mailbox/readers/sessions.js +231 -0
  254. package/dist/heart/mailbox/readers/shared.js +111 -0
  255. package/dist/heart/mcp/mcp-server.js +696 -0
  256. package/dist/heart/migrate-config.js +100 -0
  257. package/dist/heart/model-capabilities.js +11 -0
  258. package/dist/heart/orientation-frame.js +345 -0
  259. package/dist/heart/platform.js +81 -0
  260. package/dist/heart/primitives.js +1 -1
  261. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  262. package/dist/heart/private-runtime/index.js +18 -0
  263. package/dist/heart/private-runtime/ledger.js +221 -0
  264. package/dist/heart/private-runtime/policy.js +252 -0
  265. package/dist/heart/private-runtime/types.js +2 -0
  266. package/dist/heart/progress-story.js +1 -1
  267. package/dist/heart/provider-attempt.js +137 -0
  268. package/dist/heart/provider-binding-resolver.js +273 -0
  269. package/dist/heart/provider-credentials.js +449 -0
  270. package/dist/heart/provider-failover.js +311 -0
  271. package/dist/heart/provider-models.js +96 -0
  272. package/dist/heart/provider-ping.js +265 -0
  273. package/dist/heart/provider-readiness-cache.js +119 -0
  274. package/dist/heart/provider-visibility.js +188 -0
  275. package/dist/heart/providers/anthropic-token.js +131 -0
  276. package/dist/heart/providers/anthropic.js +173 -60
  277. package/dist/heart/providers/azure.js +23 -11
  278. package/dist/heart/providers/error-classification.js +127 -0
  279. package/dist/heart/providers/github-copilot.js +34 -38
  280. package/dist/heart/providers/minimax-vlm.js +189 -0
  281. package/dist/heart/providers/minimax.js +26 -8
  282. package/dist/heart/providers/openai-codex-token.js +349 -0
  283. package/dist/heart/providers/openai-codex.js +55 -40
  284. package/dist/heart/providers/openai-compatible.js +177 -0
  285. package/dist/heart/run-ledger.js +247 -0
  286. package/dist/heart/runtime-capability-check.js +170 -0
  287. package/dist/heart/runtime-credentials.js +607 -0
  288. package/dist/heart/runtime-cwd.js +87 -0
  289. package/dist/heart/sense-truth.js +22 -4
  290. package/dist/heart/session-activity.js +92 -24
  291. package/dist/heart/session-events.js +1504 -0
  292. package/dist/heart/session-playback-cli-main.js +5 -0
  293. package/dist/heart/session-playback-cli.js +36 -0
  294. package/dist/heart/session-playback.js +231 -0
  295. package/dist/heart/session-redaction-repair-cli-main.js +31 -0
  296. package/dist/heart/session-redaction-repair.js +552 -0
  297. package/dist/heart/session-stats-cli-main.js +5 -0
  298. package/dist/heart/session-stats.js +183 -0
  299. package/dist/heart/session-transcript.js +133 -0
  300. package/dist/heart/start-of-turn-packet.js +372 -0
  301. package/dist/heart/steward-policy.js +618 -0
  302. package/dist/heart/streaming.js +604 -207
  303. package/dist/heart/structured-output.js +196 -0
  304. package/dist/heart/sync-classification.js +176 -0
  305. package/dist/heart/sync.js +449 -0
  306. package/dist/heart/target-resolution.js +11 -7
  307. package/dist/heart/tempo.js +93 -0
  308. package/dist/heart/temporal-view.js +41 -0
  309. package/dist/heart/timeouts.js +101 -0
  310. package/dist/heart/tool-activity-callbacks.js +59 -0
  311. package/dist/heart/tool-approval.js +382 -0
  312. package/dist/heart/tool-description.js +155 -0
  313. package/dist/heart/tool-friction.js +55 -0
  314. package/dist/heart/tool-loop.js +200 -0
  315. package/dist/heart/turn-context.js +482 -0
  316. package/dist/heart/turn-execution-lease.js +30 -0
  317. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  318. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  319. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  320. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  321. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  322. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  323. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  324. package/dist/heart/versioning/update-hooks.js +154 -0
  325. package/dist/heart/versioning/version-intent.js +114 -0
  326. package/dist/heart/work-card.js +380 -0
  327. package/dist/mailbox-ui/assets/index-Cyv4mw3Y.js +1 -0
  328. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  329. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  330. package/dist/mailbox-ui/index.html +16 -0
  331. package/dist/mailroom/attention.js +167 -0
  332. package/dist/mailroom/autonomy.js +209 -0
  333. package/dist/mailroom/blob-store.js +889 -0
  334. package/dist/mailroom/body-cache.js +61 -0
  335. package/dist/mailroom/cache-sync-cli.js +58 -0
  336. package/dist/mailroom/core.js +803 -0
  337. package/dist/mailroom/entry.js +160 -0
  338. package/dist/mailroom/file-store.js +568 -0
  339. package/dist/mailroom/hosted-cache-sync.js +384 -0
  340. package/dist/mailroom/mbox-import.js +393 -0
  341. package/dist/mailroom/migration.js +164 -0
  342. package/dist/mailroom/outbound.js +380 -0
  343. package/dist/mailroom/policy.js +263 -0
  344. package/dist/mailroom/reader.js +292 -0
  345. package/dist/mailroom/search-cache.js +513 -0
  346. package/dist/mailroom/search-relevance.js +319 -0
  347. package/dist/mailroom/smtp-ingress.js +176 -0
  348. package/dist/mailroom/source-state.js +176 -0
  349. package/dist/mailroom/thread.js +109 -0
  350. package/dist/mailroom/travel-extract.js +89 -0
  351. package/dist/mind/bundle-manifest.js +24 -2
  352. package/dist/mind/context.js +309 -111
  353. package/dist/mind/desk-section.js +362 -0
  354. package/dist/mind/diary-integrity.js +60 -0
  355. package/dist/mind/{memory.js → diary.js} +68 -77
  356. package/dist/mind/embedding-provider.js +60 -0
  357. package/dist/mind/file-state.js +179 -0
  358. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  359. package/dist/mind/obligation-steering.js +199 -3
  360. package/dist/mind/pending.js +36 -10
  361. package/dist/mind/prompt-budget.js +479 -0
  362. package/dist/mind/prompt-refresh.js +3 -2
  363. package/dist/mind/prompt.js +1050 -189
  364. package/dist/mind/provenance-trust.js +26 -0
  365. package/dist/mind/record-paths.js +312 -0
  366. package/dist/mind/scrutiny.js +173 -0
  367. package/dist/mind/session-transaction.js +564 -0
  368. package/dist/nerves/cli-logging.js +7 -1
  369. package/dist/nerves/coverage/audit-rules.js +15 -6
  370. package/dist/nerves/coverage/audit.js +28 -2
  371. package/dist/nerves/coverage/cli.js +1 -1
  372. package/dist/nerves/coverage/contract.js +5 -5
  373. package/dist/nerves/coverage/file-completeness.js +139 -5
  374. package/dist/nerves/coverage/run-artifacts.js +55 -35
  375. package/dist/nerves/coverage/source-scanner.js +4 -4
  376. package/dist/nerves/event-buffer.js +111 -0
  377. package/dist/nerves/index.js +293 -9
  378. package/dist/nerves/observation.js +20 -0
  379. package/dist/nerves/redact.js +79 -0
  380. package/dist/nerves/review/cli-main.js +5 -0
  381. package/dist/nerves/review/cli.js +156 -0
  382. package/dist/nerves/review/core.js +159 -0
  383. package/dist/nerves/runtime.js +17 -1
  384. package/dist/repertoire/ado-client.js +15 -56
  385. package/dist/repertoire/ado-semantic.js +16 -10
  386. package/dist/repertoire/api-client.js +97 -0
  387. package/dist/repertoire/bitwarden-store.js +1045 -0
  388. package/dist/repertoire/bundle-templates.js +71 -0
  389. package/dist/repertoire/bw-installer.js +180 -0
  390. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  391. package/dist/repertoire/coding/context-pack.js +331 -0
  392. package/dist/repertoire/coding/feedback.js +174 -32
  393. package/dist/repertoire/coding/index.js +15 -3
  394. package/dist/repertoire/coding/manager.js +159 -10
  395. package/dist/repertoire/coding/spawner.js +58 -11
  396. package/dist/repertoire/coding/tools.js +221 -15
  397. package/dist/repertoire/coding/workbench-client.js +272 -0
  398. package/dist/repertoire/coding/workbench-manager.js +346 -0
  399. package/dist/repertoire/commerce-errors.js +109 -0
  400. package/dist/repertoire/commerce-self-test.js +156 -0
  401. package/dist/repertoire/credential-access.js +178 -0
  402. package/dist/repertoire/desk/classifier.js +362 -0
  403. package/dist/repertoire/duffel-client.js +185 -0
  404. package/dist/repertoire/github-client.js +14 -55
  405. package/dist/repertoire/graph-client.js +11 -52
  406. package/dist/repertoire/guardrails.js +811 -18
  407. package/dist/repertoire/mcp-client.js +44 -3
  408. package/dist/repertoire/mcp-manager.js +427 -139
  409. package/dist/repertoire/mcp-tools.js +124 -0
  410. package/dist/repertoire/plugin-mcp.js +175 -0
  411. package/dist/repertoire/plugins.js +253 -0
  412. package/dist/repertoire/relationship-authorization.js +322 -0
  413. package/dist/repertoire/shell-sessions.js +134 -0
  414. package/dist/repertoire/skills.js +48 -4
  415. package/dist/repertoire/stripe-client.js +131 -0
  416. package/dist/repertoire/tool-arguments.js +170 -0
  417. package/dist/repertoire/tool-results.js +29 -0
  418. package/dist/repertoire/tools-a2a.js +699 -0
  419. package/dist/repertoire/tools-attachments.js +322 -0
  420. package/dist/repertoire/tools-awaiting.js +575 -0
  421. package/dist/repertoire/tools-base.js +77 -1138
  422. package/dist/repertoire/tools-bluebubbles.js +2 -0
  423. package/dist/repertoire/tools-bridge.js +144 -0
  424. package/dist/repertoire/tools-bundle.js +993 -0
  425. package/dist/repertoire/tools-commerce.js +253 -0
  426. package/dist/repertoire/tools-config.js +186 -0
  427. package/dist/repertoire/tools-continuity.js +575 -0
  428. package/dist/repertoire/tools-credential.js +383 -0
  429. package/dist/repertoire/tools-evolution.js +527 -0
  430. package/dist/repertoire/tools-files.js +344 -0
  431. package/dist/repertoire/tools-flight.js +290 -0
  432. package/dist/repertoire/tools-flow.js +119 -0
  433. package/dist/repertoire/tools-github.js +3 -8
  434. package/dist/repertoire/tools-habits.js +103 -0
  435. package/dist/repertoire/tools-mail.js +1828 -0
  436. package/dist/repertoire/tools-notes.js +485 -0
  437. package/dist/repertoire/tools-obligations.js +182 -0
  438. package/dist/repertoire/tools-orientation.js +31 -0
  439. package/dist/repertoire/tools-record.js +482 -0
  440. package/dist/repertoire/tools-rsvp.js +139 -0
  441. package/dist/repertoire/tools-runtime.js +150 -0
  442. package/dist/repertoire/tools-sanctuary-host.js +202 -0
  443. package/dist/repertoire/tools-session.js +1133 -0
  444. package/dist/repertoire/tools-shell.js +149 -0
  445. package/dist/repertoire/tools-steward-policy.js +119 -0
  446. package/dist/repertoire/tools-stripe.js +224 -0
  447. package/dist/repertoire/tools-surface.js +369 -0
  448. package/dist/repertoire/tools-teams.js +12 -39
  449. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  450. package/dist/repertoire/tools-travel.js +125 -0
  451. package/dist/repertoire/tools-trip.js +982 -0
  452. package/dist/repertoire/tools-unraid.js +531 -0
  453. package/dist/repertoire/tools-user-profile.js +146 -0
  454. package/dist/repertoire/tools-vault.js +40 -0
  455. package/dist/repertoire/tools-voice.js +145 -0
  456. package/dist/repertoire/tools.js +494 -148
  457. package/dist/repertoire/travel-api-client.js +360 -0
  458. package/dist/repertoire/unraid-client.js +155 -0
  459. package/dist/repertoire/unraid-restart.js +339 -0
  460. package/dist/repertoire/user-profile.js +131 -0
  461. package/dist/repertoire/vault-setup.js +246 -0
  462. package/dist/repertoire/vault-unlock.js +628 -0
  463. package/dist/rsvp/aisleplanner-client.js +354 -0
  464. package/dist/rsvp/cli.js +926 -0
  465. package/dist/rsvp/config.js +327 -0
  466. package/dist/rsvp/cutover.js +433 -0
  467. package/dist/rsvp/diagnostics.js +232 -0
  468. package/dist/rsvp/diff-renderer.js +176 -0
  469. package/dist/rsvp/habit-policy.js +110 -0
  470. package/dist/rsvp/habit-stage.js +123 -0
  471. package/dist/rsvp/incident-bundle.js +97 -0
  472. package/dist/rsvp/migration.js +204 -0
  473. package/dist/rsvp/native-habit-runner.js +630 -0
  474. package/dist/rsvp/outbound-state.js +628 -0
  475. package/dist/rsvp/query.js +118 -0
  476. package/dist/rsvp/replay.js +233 -0
  477. package/dist/rsvp/snapshot.js +232 -0
  478. package/dist/rsvp/spend-ledger.js +175 -0
  479. package/dist/scripts/claude-code-hook.js +41 -0
  480. package/dist/scripts/claude-code-stop-hook.js +47 -0
  481. package/dist/senses/a2a-entry.js +115 -0
  482. package/dist/senses/acp-server.js +386 -0
  483. package/dist/senses/attention-queue.js +186 -0
  484. package/dist/senses/await-turn-message.js +58 -0
  485. package/dist/senses/bluebubbles/active-turns.js +216 -0
  486. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  487. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  488. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +355 -40
  489. package/dist/senses/bluebubbles/context-packet.js +207 -0
  490. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  491. package/dist/senses/bluebubbles/entry.js +90 -0
  492. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  493. package/dist/senses/bluebubbles/index.js +3841 -0
  494. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  495. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  496. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  497. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  498. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  499. package/dist/senses/bluebubbles/processed-log.js +133 -0
  500. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  501. package/dist/senses/bluebubbles/replay.js +284 -0
  502. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  503. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  504. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  505. package/dist/senses/bluebubbles/webhook-registration.js +228 -0
  506. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  507. package/dist/senses/cli/bracketed-paste.js +82 -0
  508. package/dist/senses/cli/image-paste.js +287 -0
  509. package/dist/senses/cli/image-ref-navigation.js +75 -0
  510. package/dist/senses/cli/ink-app.js +156 -0
  511. package/dist/senses/cli/inline-diff.js +64 -0
  512. package/dist/senses/cli/input-keys.js +174 -0
  513. package/dist/senses/cli/kill-ring.js +86 -0
  514. package/dist/senses/cli/message-list.js +51 -0
  515. package/dist/senses/cli/ouro-tui.js +607 -0
  516. package/dist/senses/cli/spinner-imperative.js +135 -0
  517. package/dist/senses/cli/spinner.js +101 -0
  518. package/dist/senses/cli/status-line.js +60 -0
  519. package/dist/senses/cli/streaming-markdown.js +526 -0
  520. package/dist/senses/cli/tool-display.js +85 -0
  521. package/dist/senses/cli/tool-render.js +85 -0
  522. package/dist/senses/cli/tui-store.js +241 -0
  523. package/dist/senses/cli/virtual-list.js +35 -0
  524. package/dist/senses/cli-entry.js +60 -8
  525. package/dist/senses/cli.js +604 -320
  526. package/dist/senses/commands.js +66 -3
  527. package/dist/senses/context-packet-ledger.js +371 -0
  528. package/dist/senses/context-packets.js +154 -0
  529. package/dist/senses/habit-lifecycle-guard.js +24 -0
  530. package/dist/senses/habit-turn-message.js +160 -0
  531. package/dist/senses/ingress-evidence.js +2 -0
  532. package/dist/senses/mail-entry.js +66 -0
  533. package/dist/senses/mail.js +524 -0
  534. package/dist/senses/pipeline.js +1115 -204
  535. package/dist/senses/private-runtime-worker.js +859 -0
  536. package/dist/senses/private-runtime.js +1517 -0
  537. package/dist/senses/proactive-content-guard.js +51 -0
  538. package/dist/senses/root-host-approval-port.js +345 -0
  539. package/dist/senses/root-host-approval-runtime.js +393 -0
  540. package/dist/senses/sanctuary-authority-resident.js +102 -0
  541. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  542. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  543. package/dist/senses/sanctuary-grounding.js +118 -0
  544. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  545. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  546. package/dist/senses/sanctuary-health-runner.js +100 -0
  547. package/dist/senses/sanctuary-health.js +408 -0
  548. package/dist/senses/sanctuary-install-state-contract.js +126 -0
  549. package/dist/senses/sanctuary-interactive-control.js +410 -0
  550. package/dist/senses/sanctuary-media-catalog-contract.js +297 -0
  551. package/dist/senses/sanctuary-media-optimization.js +514 -0
  552. package/dist/senses/sanctuary-runtime.js +340 -0
  553. package/dist/senses/sanctuary-sab.js +85 -0
  554. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  555. package/dist/senses/shared-turn.js +772 -0
  556. package/dist/senses/surface-tool.js +109 -0
  557. package/dist/senses/teams-entry.js +60 -8
  558. package/dist/senses/teams.js +519 -218
  559. package/dist/senses/telegram-admission.js +718 -0
  560. package/dist/senses/telegram-approval-runtime.js +793 -0
  561. package/dist/senses/telegram-attachments.js +186 -0
  562. package/dist/senses/telegram-audit-ledger.js +220 -0
  563. package/dist/senses/telegram-authority-transport.js +231 -0
  564. package/dist/senses/telegram-client.js +1749 -0
  565. package/dist/senses/telegram-effect-adapter.js +896 -0
  566. package/dist/senses/telegram-entry.js +83 -0
  567. package/dist/senses/telegram.js +2324 -0
  568. package/dist/senses/trust-gate.js +104 -9
  569. package/dist/senses/voice/audio-playback.js +237 -0
  570. package/dist/senses/voice/audio-routing.js +119 -0
  571. package/dist/senses/voice/elevenlabs.js +202 -0
  572. package/dist/senses/voice/floor-control.js +431 -0
  573. package/dist/senses/voice/floor-controller.js +115 -0
  574. package/dist/senses/voice/golden-path.js +116 -0
  575. package/dist/senses/voice/index.js +29 -0
  576. package/dist/senses/voice/meeting.js +113 -0
  577. package/dist/senses/voice/outbound.js +190 -0
  578. package/dist/senses/voice/phone.js +33 -0
  579. package/dist/senses/voice/playback.js +139 -0
  580. package/dist/senses/voice/realtime-eval.js +496 -0
  581. package/dist/senses/voice/realtime-trace.js +531 -0
  582. package/dist/senses/voice/transcript.js +70 -0
  583. package/dist/senses/voice/turn.js +191 -0
  584. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  585. package/dist/senses/voice/twilio-phone.js +5031 -0
  586. package/dist/senses/voice/types.js +2 -0
  587. package/dist/senses/voice/whisper.js +161 -0
  588. package/dist/senses/voice-entry.js +81 -0
  589. package/dist/senses/voice-realtime-eval-command.js +99 -0
  590. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  591. package/dist/senses/voice-twilio-entry.js +87 -0
  592. package/dist/trips/core.js +138 -0
  593. package/dist/trips/store.js +265 -0
  594. package/dist/util/frontmatter.js +69 -0
  595. package/npm-shrinkwrap.json +8138 -0
  596. package/package.json +72 -13
  597. package/skills/agent-commerce.md +113 -0
  598. package/skills/browser-navigation.md +117 -0
  599. package/skills/commerce-setup-guide.md +116 -0
  600. package/skills/commerce-setup.md +84 -0
  601. package/skills/configure-dev-tools.md +99 -0
  602. package/skills/travel-planning.md +138 -0
  603. package/dist/heart/daemon/auth-flow.js +0 -430
  604. package/dist/heart/daemon/ouro-path-installer.js +0 -260
  605. package/dist/heart/daemon/ouro-version-manager.js +0 -171
  606. package/dist/heart/daemon/update-hooks.js +0 -138
  607. package/dist/heart/obligations.js +0 -191
  608. package/dist/heart/safe-workspace.js +0 -228
  609. package/dist/heart/session-recall.js +0 -116
  610. package/dist/mind/friends/channel.js +0 -84
  611. package/dist/mind/friends/group-context.js +0 -144
  612. package/dist/mind/friends/resolver.js +0 -84
  613. package/dist/mind/friends/store-file.js +0 -190
  614. package/dist/mind/friends/store.js +0 -4
  615. package/dist/mind/friends/tokens.js +0 -26
  616. package/dist/mind/friends/trust-explanation.js +0 -74
  617. package/dist/mind/friends/types.js +0 -29
  618. package/dist/repertoire/tasks/board.js +0 -134
  619. package/dist/repertoire/tasks/index.js +0 -224
  620. package/dist/repertoire/tasks/lifecycle.js +0 -80
  621. package/dist/repertoire/tasks/middleware.js +0 -65
  622. package/dist/repertoire/tasks/parser.js +0 -173
  623. package/dist/repertoire/tasks/scanner.js +0 -132
  624. package/dist/repertoire/tasks/transitions.js +0 -144
  625. package/dist/senses/bluebubbles-entry.js +0 -13
  626. package/dist/senses/bluebubbles.js +0 -1181
  627. package/dist/senses/debug-activity.js +0 -154
  628. package/dist/senses/inner-dialog-worker.js +0 -90
  629. package/dist/senses/inner-dialog.js +0 -525
  630. package/subagents/README.md +0 -7
  631. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  632. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  633. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  634. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  635. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  636. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  637. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  638. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  639. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  640. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  641. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  642. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  643. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  644. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  645. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  646. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  647. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,926 @@
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.runRsvpCliCommand = runRsvpCliCommand;
37
+ const fs = __importStar(require("node:fs"));
38
+ const os = __importStar(require("node:os"));
39
+ const path = __importStar(require("node:path"));
40
+ const doctor_1 = require("../heart/daemon/doctor");
41
+ const habit_parser_1 = require("../heart/habits/habit-parser");
42
+ const identity_1 = require("../heart/identity");
43
+ const machine_identity_1 = require("../heart/machine-identity");
44
+ const runtime_credentials_1 = require("../heart/runtime-credentials");
45
+ const runtime_1 = require("../nerves/runtime");
46
+ const client_1 = require("../senses/bluebubbles/client");
47
+ const aisleplanner_client_1 = require("./aisleplanner-client");
48
+ const config_1 = require("./config");
49
+ const cutover_1 = require("./cutover");
50
+ const diff_renderer_1 = require("./diff-renderer");
51
+ const habit_policy_1 = require("./habit-policy");
52
+ const habit_stage_1 = require("./habit-stage");
53
+ const incident_bundle_1 = require("./incident-bundle");
54
+ const migration_1 = require("./migration");
55
+ const outbound_state_1 = require("./outbound-state");
56
+ const query_1 = require("./query");
57
+ const replay_1 = require("./replay");
58
+ const snapshot_1 = require("./snapshot");
59
+ function commandJson(command) {
60
+ return "json" in command && command.json === true;
61
+ }
62
+ function commandOutputPath(command) {
63
+ return "outputPath" in command ? command.outputPath : undefined;
64
+ }
65
+ function commandAgent(command) {
66
+ return "agent" in command ? command.agent : undefined;
67
+ }
68
+ function commandMode(command) {
69
+ return "mode" in command ? command.mode : undefined;
70
+ }
71
+ function maybeAgentRoot(command, deps) {
72
+ const agent = commandAgent(command);
73
+ if (!agent)
74
+ return undefined;
75
+ return deps.agentBundleRoot ?? path.join(deps.bundlesRoot ?? (0, identity_1.getAgentBundlesRoot)(), `${agent}.ouro`);
76
+ }
77
+ function writeJsonFile(filePath, payload) {
78
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
79
+ fs.writeFileSync(filePath, `${JSON.stringify(payload, null, 2)}\n`, "utf-8");
80
+ }
81
+ function readJsonFile(filePath) {
82
+ return JSON.parse(fs.readFileSync(filePath, "utf-8"));
83
+ }
84
+ function fallbackReadRsvpConfig(agentRoot) {
85
+ const configPath = path.join(agentRoot, "rsvp", "config.json");
86
+ if (!fs.existsSync(configPath)) {
87
+ return { ok: false, reason: "missing", path: configPath, message: "missing native RSVP config" };
88
+ }
89
+ try {
90
+ return { ok: true, config: readJsonFile(configPath), path: configPath };
91
+ }
92
+ catch {
93
+ return { ok: false, reason: "malformed", path: configPath, message: "native RSVP config is not valid JSON" };
94
+ }
95
+ }
96
+ function resolveRsvpConfig(agentRoot) {
97
+ return (0, config_1.readRsvpConfig)(agentRoot) ?? fallbackReadRsvpConfig(agentRoot);
98
+ }
99
+ function localText(value) {
100
+ return typeof value === "string" ? value.trim() : "";
101
+ }
102
+ function defaultLegacyRoot(deps) {
103
+ return path.join(deps.homeDir ?? os.homedir(), "Projects", "rsvp-tracker");
104
+ }
105
+ function resolveCutoverLegacyRoot(config, deps) {
106
+ const configured = localText(config.cutover?.legacyRoot);
107
+ if (configured)
108
+ return configured;
109
+ const fallback = defaultLegacyRoot(deps);
110
+ return fs.existsSync(path.join(fallback, "config.json")) ? fallback : null;
111
+ }
112
+ async function checkLiveSendCutover(input) {
113
+ const legacyRoot = resolveCutoverLegacyRoot(input.config, input.deps);
114
+ if (!legacyRoot)
115
+ return null;
116
+ return (0, cutover_1.checkRsvpCutover)({
117
+ agent: input.agent,
118
+ legacyRoot,
119
+ ...(input.deps.rsvpCutoverDeps ? { deps: input.deps.rsvpCutoverDeps } : {}),
120
+ });
121
+ }
122
+ function blockedLiveSendPayload(command, message, extra = {}) {
123
+ return basePayload(command, false, message, {
124
+ ok: false,
125
+ allowSend: command.allowSend === true,
126
+ sendAllowed: false,
127
+ requires: "passing RSVP cutover check",
128
+ ...extra,
129
+ });
130
+ }
131
+ function cutoverPayload(cutover) {
132
+ if (!cutover) {
133
+ return {
134
+ cutover: {
135
+ ok: false,
136
+ sendAllowed: false,
137
+ denialReasons: ["no RSVP legacy root found for live-send cutover proof"],
138
+ },
139
+ };
140
+ }
141
+ return {
142
+ legacyRoot: cutover.legacyRoot,
143
+ cutover: {
144
+ ok: cutover.ok,
145
+ sendAllowed: cutover.sendAllowed,
146
+ checks: cutover.checks,
147
+ denialReasons: cutover.denialReasons,
148
+ },
149
+ };
150
+ }
151
+ function rsvpStateRoot(agentRoot) {
152
+ return path.join(agentRoot, "state", "rsvp");
153
+ }
154
+ function latestSnapshotPath(agentRoot) {
155
+ return path.join(rsvpStateRoot(agentRoot), "snapshots", "latest.json");
156
+ }
157
+ function snapshotFilePath(agentRoot, snapshotId) {
158
+ return path.join(rsvpStateRoot(agentRoot), "snapshots", `${snapshotId}.json`);
159
+ }
160
+ function writeSnapshotFiles(agentRoot, snapshot) {
161
+ fs.mkdirSync(path.join(rsvpStateRoot(agentRoot), "snapshots"), { recursive: true });
162
+ fs.writeFileSync(snapshotFilePath(agentRoot, snapshot.snapshotId), `${JSON.stringify(snapshot, null, 2)}\n`, "utf-8");
163
+ fs.writeFileSync(latestSnapshotPath(agentRoot), `${JSON.stringify(snapshot, null, 2)}\n`, "utf-8");
164
+ }
165
+ const RSVP_HABIT_REPORT_LABEL_KEYS = [
166
+ "firstRunLabel",
167
+ "noChangesLabel",
168
+ "newRsvpsLabel",
169
+ "statusChangesLabel",
170
+ "newGuestsLabel",
171
+ "removedGuestsLabel",
172
+ ];
173
+ function reportCopyFromHabit(title, rsvp) {
174
+ const copy = { title: rsvp.reportTitle ?? title };
175
+ for (const key of RSVP_HABIT_REPORT_LABEL_KEYS) {
176
+ const value = rsvp[key];
177
+ if (value)
178
+ copy[key] = value;
179
+ }
180
+ return copy;
181
+ }
182
+ function explicitHabitLifecycleError(habitName, habit, prefix) {
183
+ const degradedReason = habit.status === "degraded" ? habit.degradedReason : null;
184
+ const degradedDetail = habit.status === "degraded" ? habit.degradedDetail : null;
185
+ const reasonText = degradedReason ? ` reason=${degradedReason}` : "";
186
+ const detailText = degradedDetail ? ` detail=${degradedDetail}` : "";
187
+ const message = prefix
188
+ ? `${prefix}; status=${habit.status}${reasonText}${detailText}`
189
+ : `RSVP habit ${habitName} lifecycle rejected: status=${habit.status}${reasonText}${detailText}`;
190
+ (0, runtime_1.emitNervesEvent)({
191
+ level: "warn",
192
+ component: "rsvp",
193
+ event: "rsvp.habit_lifecycle_rejected",
194
+ message,
195
+ meta: {
196
+ entryPoint: "explicit_refresh",
197
+ habitName,
198
+ status: habit.status,
199
+ degradedReason,
200
+ degradedDetail,
201
+ },
202
+ });
203
+ return new Error(message);
204
+ }
205
+ function requireRsvpHabitReportCopy(agentRoot, habitName) {
206
+ const habitPath = path.join(agentRoot, "habits", `${habitName}.md`);
207
+ if (!fs.existsSync(habitPath)) {
208
+ const missing = (0, habit_parser_1.createDegradedHabitFile)(habitPath, "read_error", "", "habit file not found");
209
+ throw explicitHabitLifecycleError(habitName, missing, `RSVP habit ${habitName} not found at ${habitPath}`);
210
+ }
211
+ let habit;
212
+ try {
213
+ habit = (0, habit_parser_1.parseHabitFile)(fs.readFileSync(habitPath, "utf-8"), habitPath);
214
+ }
215
+ catch (error) {
216
+ const unreadable = (0, habit_parser_1.createDegradedHabitFile)(habitPath, "read_error", "", String(error));
217
+ throw explicitHabitLifecycleError(habitName, unreadable);
218
+ }
219
+ if (habit.status !== "active")
220
+ throw explicitHabitLifecycleError(habitName, habit);
221
+ if (!habit.rsvp) {
222
+ const untyped = (0, habit_parser_1.createDegradedHabitFile)(habitPath, "invalid_metadata", habit.body, "RSVP habit metadata is required");
223
+ throw explicitHabitLifecycleError(habitName, untyped, `RSVP habit ${habitName} metadata is required before explicit refresh`);
224
+ }
225
+ return reportCopyFromHabit(habit.title, habit.rsvp);
226
+ }
227
+ function activeRsvpHabitReportCopy(agentRoot) {
228
+ const habitsDir = path.join(agentRoot, "habits");
229
+ if (!fs.existsSync(habitsDir))
230
+ return null;
231
+ for (const entry of fs.readdirSync(habitsDir).filter((name) => name.endsWith(".md")).sort()) {
232
+ const habitPath = path.join(habitsDir, entry);
233
+ try {
234
+ const habit = (0, habit_parser_1.parseHabitFile)(fs.readFileSync(habitPath, "utf-8"), habitPath);
235
+ if (habit.status === "active" && habit.rsvp && (0, habit_policy_1.isRsvpHabitName)(habit.name)) {
236
+ return reportCopyFromHabit(habit.title, habit.rsvp);
237
+ }
238
+ }
239
+ catch (error) {
240
+ (0, runtime_1.emitNervesEvent)({
241
+ level: "error",
242
+ component: "rsvp",
243
+ event: "rsvp.habit_report_copy_error",
244
+ message: "failed to read RSVP habit report copy",
245
+ meta: { habitPath, error: String(error) },
246
+ });
247
+ }
248
+ }
249
+ return null;
250
+ }
251
+ function resolveRsvpReportCopy(agentRoot, habitName) {
252
+ if (habitName)
253
+ return requireRsvpHabitReportCopy(agentRoot, habitName);
254
+ return activeRsvpHabitReportCopy(agentRoot) ?? {};
255
+ }
256
+ function parseSnapshotFromFile(filePath) {
257
+ const result = (0, snapshot_1.parseRsvpSnapshot)(readJsonFile(filePath));
258
+ if (!result.ok)
259
+ throw new Error(`invalid RSVP snapshot at ${filePath}: ${result.reason}`);
260
+ return result.snapshot;
261
+ }
262
+ function readBaselineSnapshot(agentRoot) {
263
+ const rsvpRoot = rsvpStateRoot(agentRoot);
264
+ const baselinePath = path.join(rsvpRoot, "baseline.json");
265
+ const legacyBaseline = fs.existsSync(baselinePath) ? readJsonFile(baselinePath) : null;
266
+ const legacySnapshotId = legacyBaseline && typeof legacyBaseline === "object" && !Array.isArray(legacyBaseline)
267
+ ? legacyBaseline.nativeSnapshotId
268
+ : null;
269
+ const outboundSnapshotId = (0, outbound_state_1.readRsvpOutboundState)(agentRoot).baseline?.snapshotId;
270
+ const snapshotId = outboundSnapshotId ?? (typeof legacySnapshotId === "string" ? legacySnapshotId : undefined);
271
+ return typeof snapshotId === "string" && fs.existsSync(snapshotFilePath(agentRoot, snapshotId))
272
+ ? parseSnapshotFromFile(snapshotFilePath(agentRoot, snapshotId))
273
+ : null;
274
+ }
275
+ function resolveLatestSnapshot(agentRoot) {
276
+ const filePath = latestSnapshotPath(agentRoot);
277
+ if (!fs.existsSync(filePath)) {
278
+ return { ok: false, path: filePath, message: "latest RSVP snapshot missing; run `ouro rsvp refresh --mode shadow --no-send` first" };
279
+ }
280
+ try {
281
+ return { ok: true, snapshot: parseSnapshotFromFile(filePath) };
282
+ }
283
+ catch (error) {
284
+ return {
285
+ ok: false,
286
+ path: filePath,
287
+ message: error instanceof Error ? error.message : /* v8 ignore next -- fs and snapshot parsing failures are Error instances. @preserve */ String(error),
288
+ };
289
+ }
290
+ }
291
+ function machineIdForCli() {
292
+ return (0, machine_identity_1.loadOrCreateMachineIdentity)().machineId;
293
+ }
294
+ async function resolveRsvpRuntimeCredentialConfig(agent) {
295
+ const cached = (0, runtime_credentials_1.readRuntimeCredentialConfig)(agent);
296
+ return cached.ok ? cached : (0, runtime_credentials_1.refreshRuntimeCredentialConfig)(agent, { preserveCachedOnFailure: true });
297
+ }
298
+ async function resolveRsvpMachineRuntimeCredentialConfig(agent) {
299
+ const cached = (0, runtime_credentials_1.readMachineRuntimeCredentialConfig)(agent);
300
+ return cached.ok ? cached : (0, runtime_credentials_1.refreshMachineRuntimeCredentialConfig)(agent, machineIdForCli(), { preserveCachedOnFailure: true });
301
+ }
302
+ function blueBubblesChatFor(config) {
303
+ const sendTarget = config.bluebubblesRoute.chatIdentifier
304
+ ? { kind: "chat_identifier", value: config.bluebubblesRoute.chatIdentifier }
305
+ : { kind: "chat_guid", value: config.bluebubblesRoute.chatGuid };
306
+ return {
307
+ chatGuid: config.bluebubblesRoute.chatGuid,
308
+ ...(config.bluebubblesRoute.chatIdentifier ? { chatIdentifier: config.bluebubblesRoute.chatIdentifier } : {}),
309
+ displayName: "RSVP",
310
+ isGroup: true,
311
+ sessionKey: `bluebubbles:rsvp:${config.bluebubblesRoute.chatIdentifier ?? config.bluebubblesRoute.chatGuid}`,
312
+ sendTarget,
313
+ participantHandles: [],
314
+ };
315
+ }
316
+ function numberField(record, key, fallback) {
317
+ const value = record?.[key];
318
+ return typeof value === "number" && Number.isFinite(value) ? value : fallback;
319
+ }
320
+ function stringArrayField(record, key) {
321
+ const value = record?.[key];
322
+ if (!Array.isArray(value))
323
+ return [];
324
+ return value.map((entry) => typeof entry === "string" ? entry.trim() : "").filter(Boolean);
325
+ }
326
+ function recordField(record, key) {
327
+ const value = record[key];
328
+ return value && typeof value === "object" && !Array.isArray(value)
329
+ ? value
330
+ : null;
331
+ }
332
+ function rsvpBlueBubblesClientConfig(nativeConfig, machineRuntimeConfig) {
333
+ if (!machineRuntimeConfig.ok) {
334
+ throw new Error(`BlueBubbles runtime config unavailable at ${machineRuntimeConfig.itemPath}: ${machineRuntimeConfig.error}`);
335
+ }
336
+ const bluebubbles = recordField(machineRuntimeConfig.config, "bluebubbles");
337
+ const bluebubblesChannel = recordField(machineRuntimeConfig.config, "bluebubblesChannel");
338
+ const serverUrl = localText(bluebubbles?.serverUrl);
339
+ const password = localText(bluebubbles?.password);
340
+ if (!serverUrl) {
341
+ throw new Error("bluebubbles.serverUrl is required in this machine's agent-vault runtime config. Run `ouro connect bluebubbles --agent <agent>`.");
342
+ }
343
+ if (!password) {
344
+ throw new Error("bluebubbles.password is required in this machine's agent-vault runtime config. Run `ouro connect bluebubbles --agent <agent>`.");
345
+ }
346
+ return {
347
+ config: {
348
+ serverUrl,
349
+ password,
350
+ accountId: localText(bluebubbles?.accountId) || localText(nativeConfig.bluebubblesRoute.accountId) || "default",
351
+ ownHandles: stringArrayField(bluebubbles, "ownHandles"),
352
+ },
353
+ channelConfig: {
354
+ port: numberField(bluebubblesChannel, "port", 18790),
355
+ webhookPath: localText(bluebubblesChannel?.webhookPath) || "/bluebubbles-webhook",
356
+ requestTimeoutMs: numberField(bluebubblesChannel, "requestTimeoutMs", 30_000),
357
+ },
358
+ };
359
+ }
360
+ function normalizeDelivery(value) {
361
+ const record = value && typeof value === "object" && !Array.isArray(value) ? value : {};
362
+ return {
363
+ ...(typeof record.guid === "string" ? { guid: record.guid } : {}),
364
+ ...(typeof record.messageGuid === "string" ? { guid: record.messageGuid, messageGuid: record.messageGuid } : {}),
365
+ };
366
+ }
367
+ function textSummary(payload) {
368
+ const effect = payload.sideEffect ? "explicit side effects enabled" : "dry run";
369
+ const agent = payload.agent ? ` agent=${payload.agent}` : "";
370
+ const requires = payload.requires ? ` requires=${payload.requires}` : "";
371
+ return `${payload.command}: ${effect}${agent}${requires}`;
372
+ }
373
+ function writePayload(command, deps, payload) {
374
+ const outputPath = commandOutputPath(command);
375
+ if (outputPath)
376
+ writeJsonFile(outputPath, payload);
377
+ const text = commandJson(command) ? JSON.stringify(payload, null, 2) : textSummary(payload);
378
+ deps.writeStdout(text);
379
+ (0, runtime_1.emitNervesEvent)({
380
+ component: "rsvp",
381
+ event: "rsvp.cli_command_executed",
382
+ message: "executed RSVP CLI command",
383
+ meta: {
384
+ command: payload.command,
385
+ sideEffect: payload.sideEffect,
386
+ outputPath,
387
+ agent: payload.agent,
388
+ },
389
+ });
390
+ return text;
391
+ }
392
+ function writeIncidentText(deps, command, agent, bundle, outputPath) {
393
+ const text = command.json === true
394
+ ? JSON.stringify({
395
+ ok: bundle.doctor.summary.failed === 0,
396
+ command: command.kind,
397
+ agent,
398
+ sideEffect: false,
399
+ incidentBundle: bundle,
400
+ }, null, 2)
401
+ : `rsvp.incident: wrote side-effect-free bundle agent=${agent}${outputPath ? ` output=${outputPath}` : ""}`;
402
+ deps.writeStdout(text);
403
+ (0, runtime_1.emitNervesEvent)({
404
+ component: "rsvp",
405
+ event: "rsvp.cli_command_executed",
406
+ message: "executed RSVP CLI command",
407
+ meta: {
408
+ command: command.kind,
409
+ sideEffect: false,
410
+ outputPath,
411
+ agent,
412
+ },
413
+ });
414
+ return text;
415
+ }
416
+ function basePayload(command, sideEffect, message, extra = {}) {
417
+ return {
418
+ ok: true,
419
+ command: command.kind,
420
+ sideEffect,
421
+ ...(commandAgent(command) ? { agent: commandAgent(command) } : {}),
422
+ ...(commandMode(command) ? { mode: commandMode(command) } : {}),
423
+ message,
424
+ ...extra,
425
+ };
426
+ }
427
+ async function executeImportLegacy(command, deps) {
428
+ if (!command.yes) {
429
+ return basePayload(command, false, "legacy RSVP import preview only; pass --yes to write native config and runtime/config", {
430
+ requires: "--yes",
431
+ inputs: {
432
+ legacyRoot: command.legacyRoot,
433
+ mode: command.mode,
434
+ },
435
+ });
436
+ }
437
+ const agentRoot = maybeAgentRoot(command, deps);
438
+ if (!command.agent || !agentRoot) {
439
+ return {
440
+ ok: false,
441
+ command: command.kind,
442
+ sideEffect: false,
443
+ message: "legacy RSVP import requires --agent <name>",
444
+ requires: "--agent",
445
+ };
446
+ }
447
+ if (command.kind === "rsvp.import-legacy") {
448
+ const configResult = resolveRsvpConfig(agentRoot);
449
+ if (!configResult.ok) {
450
+ return {
451
+ ok: false,
452
+ command: command.kind,
453
+ sideEffect: false,
454
+ agent: command.agent,
455
+ message: configResult.message,
456
+ requires: "native RSVP config",
457
+ };
458
+ }
459
+ const result = (0, migration_1.importLegacyRsvpState)({
460
+ agent: command.agent,
461
+ agentRoot,
462
+ legacyRoot: command.legacyRoot,
463
+ weddingId: configResult.config.source.weddingId,
464
+ eventId: configResult.config.source.eventId,
465
+ importedAt: new Date().toISOString(),
466
+ });
467
+ return basePayload(command, true, result.ok ? "legacy RSVP state imported" : result.message, {
468
+ migration: result,
469
+ });
470
+ }
471
+ const result = await (0, config_1.importLegacyRsvpConfig)({
472
+ agent: command.agent,
473
+ agentRoot,
474
+ legacyRoot: command.legacyRoot,
475
+ mode: command.mode,
476
+ confirm: true,
477
+ });
478
+ return basePayload(command, true, result.ok ? "legacy RSVP config imported" : result.message, {
479
+ result: result,
480
+ });
481
+ }
482
+ async function executeCutover(command, deps) {
483
+ const result = await (0, cutover_1.runRsvpCutover)({
484
+ ...(command.agent ? { agent: command.agent } : {}),
485
+ legacyRoot: command.legacyRoot,
486
+ action: command.action,
487
+ yes: command.yes === true,
488
+ ...(deps.rsvpCutoverDeps ? { deps: deps.rsvpCutoverDeps } : {}),
489
+ });
490
+ return {
491
+ ok: result.ok,
492
+ command: command.kind,
493
+ sideEffect: result.sideEffect,
494
+ ...(command.agent ? { agent: command.agent } : {}),
495
+ action: result.action,
496
+ legacyRoot: result.legacyRoot,
497
+ message: result.message,
498
+ ...(result.requires ? { requires: result.requires } : {}),
499
+ checks: result.checks,
500
+ sendAllowed: result.sendAllowed,
501
+ denialReasons: result.denialReasons,
502
+ rollback: result.rollback,
503
+ };
504
+ }
505
+ function doctorDepsFor(deps) {
506
+ const bundlesRoot = deps.bundlesRoot ?? (0, identity_1.getAgentBundlesRoot)();
507
+ return {
508
+ existsSync: (filePath) => fs.existsSync(filePath),
509
+ readFileSync: (filePath) => fs.readFileSync(filePath, "utf-8"),
510
+ readdirSync: (dirPath) => fs.readdirSync(dirPath),
511
+ statSync: fs.statSync,
512
+ checkSocketAlive: deps.checkSocketAlive,
513
+ fetchImpl: deps.fetchImpl ?? fetch,
514
+ socketPath: deps.socketPath,
515
+ bundlesRoot,
516
+ daemonLogsDir: path.join(deps.homeDir ?? os.homedir(), ".ouro-cli", "daemon", "logs"),
517
+ homedir: deps.homeDir ?? os.homedir(),
518
+ envPath: process.env.PATH ?? "",
519
+ platform: process.platform,
520
+ ...(deps.rsvpCutoverDeps ? { rsvpCutoverDeps: deps.rsvpCutoverDeps } : {}),
521
+ };
522
+ }
523
+ async function executeDoctor(command, deps) {
524
+ const doctor = await (0, doctor_1.runDoctorChecks)(doctorDepsFor(deps), { category: "RSVP" });
525
+ const ok = doctor.summary.warnings === 0 && doctor.summary.failed === 0;
526
+ if (command.strict && !ok)
527
+ deps.setExitCode?.(1);
528
+ return basePayload(command, false, ok ? "RSVP doctor checks passed" : "RSVP doctor checks found issues", {
529
+ ok,
530
+ inputs: { strict: command.strict === true },
531
+ doctor: doctor,
532
+ strict: command.strict === true,
533
+ });
534
+ }
535
+ async function executeIncident(command, deps) {
536
+ const agentRoot = maybeAgentRoot(command, deps);
537
+ if (!command.agent || !agentRoot) {
538
+ return writePayload(command, deps, {
539
+ ok: false,
540
+ command: command.kind,
541
+ sideEffect: false,
542
+ message: "RSVP incident bundle requires --agent <name>",
543
+ requires: "--agent",
544
+ });
545
+ }
546
+ const diagnosticsDeps = {
547
+ existsSync: (filePath) => fs.existsSync(filePath),
548
+ readFileSync: (filePath) => fs.readFileSync(filePath, "utf-8"),
549
+ readdirSync: (dirPath) => fs.readdirSync(dirPath),
550
+ statSync: fs.statSync,
551
+ checkSocketAlive: deps.checkSocketAlive,
552
+ runDoctorChecks: () => (0, doctor_1.runDoctorChecks)(doctorDepsFor(deps), { category: "RSVP" }),
553
+ };
554
+ const outputPath = commandOutputPath(command);
555
+ const bundle = outputPath
556
+ ? (await (0, incident_bundle_1.writeRsvpIncidentBundle)({ agent: command.agent, agentRoot, outputPath, deps: diagnosticsDeps })).bundle
557
+ : await (0, incident_bundle_1.buildRsvpIncidentBundle)({ agent: command.agent, agentRoot, deps: diagnosticsDeps });
558
+ return writeIncidentText(deps, command, command.agent, bundle, outputPath);
559
+ }
560
+ async function executeLegacyRender(command, deps) {
561
+ const outputPath = command.outputPath ?? path.join(os.tmpdir(), `ouro-rsvp-legacy-render-${process.pid}-${Date.now()}.json`);
562
+ const result = await (0, replay_1.renderLegacyRsvpSnapshotOffline)({ legacyRoot: command.legacyRoot, outputPath });
563
+ const text = command.json
564
+ ? JSON.stringify({ ok: true, command: command.kind, sideEffect: false, result }, null, 2)
565
+ : `rsvp.legacy-render: wrote side-effect-free render output=${outputPath}`;
566
+ deps.writeStdout(text);
567
+ (0, runtime_1.emitNervesEvent)({
568
+ component: "rsvp",
569
+ event: "rsvp.cli_command_executed",
570
+ message: "executed RSVP CLI command",
571
+ meta: { command: command.kind, sideEffect: false, outputPath, agent: command.agent },
572
+ });
573
+ return text;
574
+ }
575
+ async function executeReplay(command) {
576
+ const replay = await (0, replay_1.replayRsvpFixture)({ fixturePath: command.fixturePath });
577
+ return basePayload(command, false, "RSVP replay fixture executed offline", {
578
+ replay: replay,
579
+ });
580
+ }
581
+ async function executeHabitStage(command, deps) {
582
+ const agentRoot = maybeAgentRoot(command, deps);
583
+ if (!command.agent || !agentRoot) {
584
+ return {
585
+ ok: false,
586
+ command: command.kind,
587
+ sideEffect: false,
588
+ message: "RSVP habit staging requires --agent <name>",
589
+ requires: "--agent",
590
+ };
591
+ }
592
+ const result = await (0, habit_stage_1.stageRsvpHabit)({
593
+ agent: command.agent,
594
+ agentRoot,
595
+ ...(command.habitName ? { habitName: command.habitName } : {}),
596
+ ...(command.title ? { title: command.title } : {}),
597
+ ...(command.reportTitle ? { reportTitle: command.reportTitle } : {}),
598
+ mode: command.mode,
599
+ cadence: command.cadence,
600
+ });
601
+ return basePayload(command, true, "native RSVP habit staged", {
602
+ habit: result,
603
+ });
604
+ }
605
+ async function executeRefreshInner(command, deps, transportCounter, hardNoSend) {
606
+ const agentRoot = maybeAgentRoot(command, deps);
607
+ if (!command.agent || !agentRoot) {
608
+ return {
609
+ ok: false,
610
+ command: command.kind,
611
+ sideEffect: false,
612
+ message: "RSVP refresh requires --agent <name>",
613
+ requires: "--agent",
614
+ };
615
+ }
616
+ const reportCopy = resolveRsvpReportCopy(agentRoot, command.habitName);
617
+ const configResult = resolveRsvpConfig(agentRoot);
618
+ if (!configResult.ok) {
619
+ return basePayload(command, false, "RSVP refresh requires native RSVP config before live work can run", {
620
+ requires: "native RSVP config",
621
+ result: configResult,
622
+ });
623
+ }
624
+ const runtimeConfig = await resolveRsvpRuntimeCredentialConfig(command.agent);
625
+ const machineRuntimeConfig = await resolveRsvpMachineRuntimeCredentialConfig(command.agent);
626
+ const readiness = (0, config_1.validateRsvpReadiness)({
627
+ agent: command.agent,
628
+ agentRoot,
629
+ config: configResult,
630
+ runtimeConfig,
631
+ machineRuntimeConfig,
632
+ });
633
+ const readinessOk = readiness.ok === true || readiness.status === "ready";
634
+ if (!readinessOk) {
635
+ return {
636
+ ok: false,
637
+ command: command.kind,
638
+ sideEffect: false,
639
+ agent: command.agent,
640
+ mode: command.mode,
641
+ message: "RSVP refresh blocked by readiness checks",
642
+ checks: { readiness: readiness },
643
+ };
644
+ }
645
+ const credentials = "credentials" in readiness
646
+ ? readiness.credentials
647
+ : { username: "", password: "" };
648
+ const fetched = await (0, aisleplanner_client_1.fetchAislePlannerRsvps)({
649
+ agent: command.agent,
650
+ weddingId: configResult.config.source.weddingId,
651
+ eventId: configResult.config.source.eventId,
652
+ credentials,
653
+ ...(deps.fetchImpl ? { fetchFn: deps.fetchImpl } : {}),
654
+ });
655
+ if (!fetched.ok) {
656
+ return {
657
+ ok: false,
658
+ command: command.kind,
659
+ sideEffect: false,
660
+ agent: command.agent,
661
+ mode: command.mode,
662
+ message: fetched.message,
663
+ result: fetched,
664
+ };
665
+ }
666
+ const previousSnapshot = readBaselineSnapshot(agentRoot);
667
+ const currentSnapshot = (0, snapshot_1.buildRsvpSnapshot)({
668
+ agent: command.agent,
669
+ fetchedAt: fetched.fetchedAt,
670
+ source: {
671
+ kind: "aisleplanner",
672
+ weddingId: configResult.config.source.weddingId,
673
+ eventId: configResult.config.source.eventId,
674
+ adapter: "aisleplanner-api-v1",
675
+ },
676
+ guests: fetched.guests,
677
+ allGuests: fetched.allGuests,
678
+ provenance: { kind: "live-fetch", fetchedBy: "ouro rsvp refresh" },
679
+ });
680
+ writeSnapshotFiles(agentRoot, currentSnapshot);
681
+ const delta = (0, diff_renderer_1.computeRsvpDelta)(previousSnapshot, currentSnapshot);
682
+ const reportText = (0, diff_renderer_1.renderRsvpReport)(delta, reportCopy);
683
+ const outboundDecision = (0, outbound_state_1.decideRsvpOutboundReport)({ agentRoot, currentSnapshot, reportText });
684
+ const requestedLiveSend = command.mode === "live" && command.allowSend === true && outboundDecision.action === "send";
685
+ const sendAllowedBeforeCutover = requestedLiveSend && !hardNoSend;
686
+ if (sendAllowedBeforeCutover) {
687
+ const cutover = await checkLiveSendCutover({
688
+ agent: command.agent,
689
+ config: configResult.config,
690
+ deps,
691
+ });
692
+ if (cutover?.sendAllowed !== true) {
693
+ return blockedLiveSendPayload(command, "RSVP live refresh send blocked by cutover gates", {
694
+ ...cutoverPayload(cutover),
695
+ refresh: {
696
+ snapshotId: currentSnapshot.snapshotId,
697
+ reportText,
698
+ outboundDecision: outboundDecision,
699
+ },
700
+ });
701
+ }
702
+ }
703
+ const sendAllowed = requestedLiveSend && !hardNoSend;
704
+ let delivery;
705
+ let sendBoundary;
706
+ let sendBoundaryMessage;
707
+ if (sendAllowed) {
708
+ if (!command.habitName) {
709
+ return {
710
+ ...basePayload(command, false, "RSVP live refresh send requires --habit <name>", {
711
+ allowSend: true,
712
+ sendAllowed: false,
713
+ requires: "--habit <name>",
714
+ refresh: {
715
+ snapshotId: currentSnapshot.snapshotId,
716
+ reportText,
717
+ outboundDecision: outboundDecision,
718
+ },
719
+ }),
720
+ ok: false,
721
+ };
722
+ }
723
+ const bluebubbles = rsvpBlueBubblesClientConfig(configResult.config, machineRuntimeConfig);
724
+ const client = (0, client_1.createBlueBubblesClient)(bluebubbles.config, bluebubbles.channelConfig);
725
+ sendBoundary = await (0, outbound_state_1.executeRsvpSendBoundary)({
726
+ agentRoot,
727
+ habitId: command.habitName,
728
+ outboundIdempotencyKey: outboundDecision.idempotencyKey,
729
+ noSend: hardNoSend,
730
+ invokeTransport: async (markTransportInvoked) => client.sendText({
731
+ chat: blueBubblesChatFor(configResult.config),
732
+ text: reportText,
733
+ tempGuid: outboundDecision.idempotencyKey,
734
+ onTransportInvocation: () => {
735
+ transportCounter.count += 1;
736
+ markTransportInvoked();
737
+ },
738
+ }),
739
+ }, deps.rsvpSendBoundaryDeps);
740
+ const cleanupFailed = sendBoundary.errorCode === "lifecycle_lock_release_failed";
741
+ const acceptedProof = sendBoundary.boundaryState === "crossed" && !cleanupFailed;
742
+ sendBoundaryMessage = cleanupFailed
743
+ ? "RSVP transport crossed but lifecycle lock cleanup failed"
744
+ : sendBoundary.boundaryState === "crossed"
745
+ ? "RSVP refresh completed"
746
+ : sendBoundary.boundaryState === "not_crossed"
747
+ ? "RSVP transport was definitively rejected"
748
+ : "RSVP transport delivery is unknown";
749
+ delivery = acceptedProof
750
+ ? {
751
+ status: "accepted",
752
+ ...normalizeDelivery({ messageGuid: sendBoundary.transportResult.messageGuid }),
753
+ }
754
+ : cleanupFailed
755
+ ? {
756
+ status: "failed",
757
+ error: sendBoundaryMessage,
758
+ ...normalizeDelivery({ messageGuid: sendBoundary.transportResult.messageGuid }),
759
+ }
760
+ : sendBoundary.boundaryState === "not_crossed"
761
+ ? { status: "failed", error: sendBoundaryMessage }
762
+ : { status: "pending-manual-verification", error: sendBoundaryMessage };
763
+ (0, outbound_state_1.recordRsvpOutboundAttempt)({
764
+ agentRoot,
765
+ currentSnapshot,
766
+ reportText,
767
+ bluebubblesRecord: {
768
+ recordId: outboundDecision.idempotencyKey,
769
+ status: acceptedProof
770
+ ? "accepted"
771
+ : sendBoundary.boundaryState === "not_crossed" || cleanupFailed
772
+ ? "failed"
773
+ : "pending-manual-verification",
774
+ tempGuid: outboundDecision.idempotencyKey,
775
+ ...(sendBoundary.transportResult.messageGuid
776
+ ? { messageGuid: sendBoundary.transportResult.messageGuid }
777
+ : {}),
778
+ },
779
+ recordedAt: new Date().toISOString(),
780
+ });
781
+ }
782
+ const message = sendBoundaryMessage ?? "RSVP refresh completed";
783
+ const payload = basePayload(command, sendBoundary?.transportInvoked === true && sendBoundary.replayed === false, message, {
784
+ allowSend: command.mode === "live" && command.allowSend === true,
785
+ sendAllowed,
786
+ ...(sendBoundary ? { sendBoundary: sendBoundary } : {}),
787
+ refresh: {
788
+ snapshotId: currentSnapshot.snapshotId,
789
+ reportText,
790
+ outboundDecision: outboundDecision,
791
+ ...(delivery ? { delivery } : {}),
792
+ },
793
+ });
794
+ return sendBoundary && !sendBoundary.ok ? { ...payload, ok: false } : payload;
795
+ }
796
+ async function executeRefresh(command, deps) {
797
+ const transportCounter = { count: 0 };
798
+ const hardNoSend = command.noSend === true;
799
+ const payload = await executeRefreshInner(command, deps, transportCounter, hardNoSend);
800
+ return {
801
+ ...payload,
802
+ ...(hardNoSend ? { noSend: true } : {}),
803
+ transportInvocationCount: transportCounter.count,
804
+ };
805
+ }
806
+ async function executeCompare(command) {
807
+ if (!fs.existsSync(command.nativePath) || !fs.existsSync(command.legacyPath)) {
808
+ return basePayload(command, false, "RSVP compare requires readable native and legacy snapshot files", {
809
+ requires: "readable snapshots",
810
+ inputs: { nativePath: command.nativePath, legacyPath: command.legacyPath },
811
+ });
812
+ }
813
+ const nativeSnapshot = parseSnapshotFromFile(command.nativePath);
814
+ const legacySnapshot = parseSnapshotFromFile(command.legacyPath);
815
+ const delta = (0, diff_renderer_1.computeRsvpDelta)(legacySnapshot, nativeSnapshot);
816
+ const reportText = (0, diff_renderer_1.renderRsvpReport)(delta);
817
+ return basePayload(command, false, "RSVP native/legacy comparison completed", {
818
+ compare: {
819
+ nativeSnapshotId: nativeSnapshot.snapshotId,
820
+ legacySnapshotId: legacySnapshot.snapshotId,
821
+ reportText,
822
+ delta: delta,
823
+ },
824
+ });
825
+ }
826
+ async function executeSmoke(command, deps) {
827
+ const agentRoot = maybeAgentRoot(command, deps);
828
+ if (!command.agent || !agentRoot) {
829
+ return {
830
+ ok: false,
831
+ command: command.kind,
832
+ sideEffect: false,
833
+ message: "RSVP smoke requires --agent <name>",
834
+ requires: "--agent",
835
+ };
836
+ }
837
+ const configResult = resolveRsvpConfig(agentRoot);
838
+ if (!configResult.ok) {
839
+ return basePayload(command, command.allowSend === true, "RSVP smoke requires native RSVP config before follow-up can run", {
840
+ allowSend: command.allowSend === true,
841
+ sendAllowed: false,
842
+ requires: "native RSVP config",
843
+ result: configResult,
844
+ });
845
+ }
846
+ const snapshotResult = resolveLatestSnapshot(agentRoot);
847
+ if (!snapshotResult.ok) {
848
+ return {
849
+ ...basePayload(command, false, "RSVP smoke requires latest RSVP snapshot before follow-up can run", {
850
+ allowSend: command.allowSend === true,
851
+ sendAllowed: false,
852
+ requires: "latest RSVP snapshot",
853
+ result: snapshotResult,
854
+ }),
855
+ ok: false,
856
+ };
857
+ }
858
+ const snapshot = snapshotResult.snapshot;
859
+ const question = command.question ?? "who is pending?";
860
+ const answer = (0, query_1.queryRsvpSnapshot)(snapshot, { query: question });
861
+ const wantsLiveSend = command.mode === "live" && command.allowSend === true;
862
+ if (wantsLiveSend) {
863
+ const cutover = await checkLiveSendCutover({
864
+ agent: command.agent,
865
+ config: configResult.config,
866
+ deps,
867
+ });
868
+ if (cutover?.sendAllowed !== true) {
869
+ const blocked = blockedLiveSendPayload(command, "RSVP live smoke send blocked by cutover gates", {
870
+ ...cutoverPayload(cutover),
871
+ answer: answer.text,
872
+ result: answer,
873
+ });
874
+ if (command.replayOutputPath)
875
+ writeJsonFile(command.replayOutputPath, blocked);
876
+ return blocked;
877
+ }
878
+ }
879
+ const sendAllowed = wantsLiveSend;
880
+ let delivery;
881
+ if (sendAllowed) {
882
+ const bluebubbles = rsvpBlueBubblesClientConfig(configResult.config, await resolveRsvpMachineRuntimeCredentialConfig(command.agent));
883
+ const sent = await (0, client_1.createBlueBubblesClient)(bluebubbles.config, bluebubbles.channelConfig).sendText({
884
+ chat: blueBubblesChatFor(configResult.config),
885
+ text: answer.text,
886
+ });
887
+ delivery = normalizeDelivery(sent);
888
+ }
889
+ const payload = basePayload(command, sendAllowed, sendAllowed ? "RSVP live smoke completed" : "RSVP smoke preflight completed", {
890
+ allowSend: sendAllowed,
891
+ sendAllowed,
892
+ answer: answer.text,
893
+ result: answer,
894
+ ...(delivery ? { delivery } : {}),
895
+ });
896
+ if (command.replayOutputPath)
897
+ writeJsonFile(command.replayOutputPath, payload);
898
+ return payload;
899
+ }
900
+ function plannedPayload(command) {
901
+ throw new Error(`unsupported RSVP CLI command: ${String(command.kind)}`);
902
+ }
903
+ async function runRsvpCliCommand(command, deps) {
904
+ if (command.kind === "rsvp.incident")
905
+ return executeIncident(command, deps);
906
+ if (command.kind === "rsvp.legacy-render")
907
+ return executeLegacyRender(command, deps);
908
+ const payload = command.kind === "rsvp.config.import-legacy" || command.kind === "rsvp.import-legacy"
909
+ ? await executeImportLegacy(command, deps)
910
+ : command.kind === "rsvp.cutover"
911
+ ? await executeCutover(command, deps)
912
+ : command.kind === "rsvp.doctor"
913
+ ? await executeDoctor(command, deps)
914
+ : command.kind === "rsvp.replay"
915
+ ? await executeReplay(command)
916
+ : command.kind === "rsvp.habit.stage"
917
+ ? await executeHabitStage(command, deps)
918
+ : command.kind === "rsvp.refresh"
919
+ ? await executeRefresh(command, deps)
920
+ : command.kind === "rsvp.compare"
921
+ ? await executeCompare(command)
922
+ : command.kind === "rsvp.smoke"
923
+ ? await executeSmoke(command, deps)
924
+ : plannedPayload(command);
925
+ return writePayload(command, deps, payload);
926
+ }