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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (505) hide show
  1. package/README.md +133 -23
  2. package/RepairGuide.ouro/agent.json +5 -0
  3. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  4. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  5. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  6. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  7. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  8. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  9. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  12. package/changelog.json +4569 -14
  13. package/dist/a2a/card.js +57 -0
  14. package/dist/a2a/client.js +180 -0
  15. package/dist/a2a/config.js +50 -0
  16. package/dist/a2a/delegation-stores.js +56 -0
  17. package/dist/a2a/did-resolution.js +93 -0
  18. package/dist/a2a/identity.js +170 -0
  19. package/dist/a2a/inbound-share.js +107 -0
  20. package/dist/a2a/mission-result-wire.js +196 -0
  21. package/dist/a2a/onboarding.js +115 -0
  22. package/dist/a2a/pin-store.js +132 -0
  23. package/dist/a2a/seen-ledger.js +120 -0
  24. package/dist/a2a/server.js +604 -0
  25. package/dist/a2a/task-store.js +69 -0
  26. package/dist/a2a/transport.js +45 -0
  27. package/dist/a2a/types.js +3 -0
  28. package/dist/arc/attention-types.js +8 -0
  29. package/dist/arc/cares.js +144 -0
  30. package/dist/arc/episodes.js +118 -0
  31. package/dist/arc/evolution.js +490 -0
  32. package/dist/arc/flight-recorder.js +1034 -0
  33. package/dist/arc/intentions.js +134 -0
  34. package/dist/arc/json-store.js +117 -0
  35. package/dist/arc/obligations.js +348 -0
  36. package/dist/arc/packets.js +336 -0
  37. package/dist/arc/presence.js +185 -0
  38. package/dist/arc/task-lifecycle.js +57 -0
  39. package/dist/commerce/store.js +755 -0
  40. package/dist/commerce/types.js +3 -0
  41. package/dist/heart/active-work.js +867 -43
  42. package/dist/heart/agent-entry.js +190 -3
  43. package/dist/heart/attachments/image-normalize.js +194 -0
  44. package/dist/heart/attachments/materialize.js +97 -0
  45. package/dist/heart/attachments/originals.js +88 -0
  46. package/dist/heart/attachments/render.js +29 -0
  47. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  48. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  49. package/dist/heart/attachments/sources/index.js +16 -0
  50. package/dist/heart/attachments/store.js +103 -0
  51. package/dist/heart/attachments/types.js +93 -0
  52. package/dist/heart/auth/auth-flow.js +479 -0
  53. package/dist/heart/autonomy-budget.js +434 -0
  54. package/dist/heart/awaiting/await-alert.js +146 -0
  55. package/dist/heart/awaiting/await-expiry.js +108 -0
  56. package/dist/heart/awaiting/await-loader.js +91 -0
  57. package/dist/heart/awaiting/await-parser.js +141 -0
  58. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  59. package/dist/heart/awaiting/await-scheduler.js +378 -0
  60. package/dist/heart/background-operations.js +281 -0
  61. package/dist/heart/bridges/manager.js +137 -17
  62. package/dist/heart/bridges/store.js +14 -2
  63. package/dist/heart/bundle-state.js +168 -0
  64. package/dist/heart/commitments.js +135 -0
  65. package/dist/heart/config-registry.js +331 -0
  66. package/dist/heart/config.js +119 -127
  67. package/dist/heart/context-loss-gauntlet.js +354 -0
  68. package/dist/heart/context-loss-sentinel.js +1155 -0
  69. package/dist/heart/core.js +1306 -278
  70. package/dist/heart/cross-chat-delivery.js +8 -22
  71. package/dist/heart/daemon/agent-config-check.js +451 -0
  72. package/dist/heart/daemon/agent-discovery.js +185 -3
  73. package/dist/heart/daemon/agent-service.js +542 -0
  74. package/dist/heart/daemon/agentic-repair.js +547 -0
  75. package/dist/heart/daemon/await-private-wake.js +59 -0
  76. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  77. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  78. package/dist/heart/daemon/cadence.js +180 -0
  79. package/dist/heart/daemon/cli-defaults.js +825 -0
  80. package/dist/heart/daemon/cli-desk.js +322 -0
  81. package/dist/heart/daemon/cli-exec.js +8264 -0
  82. package/dist/heart/daemon/cli-help.js +678 -0
  83. package/dist/heart/daemon/cli-parse.js +2539 -0
  84. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  85. package/dist/heart/daemon/cli-render.js +770 -0
  86. package/dist/heart/daemon/cli-types.js +8 -0
  87. package/dist/heart/daemon/connect-bay.js +323 -0
  88. package/dist/heart/daemon/daemon-cli.js +29 -2010
  89. package/dist/heart/daemon/daemon-entry.js +842 -10
  90. package/dist/heart/daemon/daemon-health.js +176 -0
  91. package/dist/heart/daemon/daemon-rollup.js +57 -0
  92. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  93. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  94. package/dist/heart/daemon/daemon.js +1289 -84
  95. package/dist/heart/daemon/dns-workflow.js +394 -0
  96. package/dist/heart/daemon/doctor-types.js +8 -0
  97. package/dist/heart/daemon/doctor.js +1126 -0
  98. package/dist/heart/daemon/habit-private-wake.js +56 -0
  99. package/dist/heart/daemon/health-monitor.js +142 -11
  100. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  101. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  102. package/dist/heart/daemon/http-health-probe.js +80 -0
  103. package/dist/heart/daemon/human-command-screens.js +234 -0
  104. package/dist/heart/daemon/human-readiness.js +114 -0
  105. package/dist/heart/daemon/inner-status.js +78 -0
  106. package/dist/heart/daemon/interactive-repair.js +394 -0
  107. package/dist/heart/daemon/launchd.js +37 -8
  108. package/dist/heart/daemon/log-tailer.js +79 -10
  109. package/dist/heart/daemon/logs-prune.js +110 -0
  110. package/dist/heart/daemon/mcp-canary.js +393 -0
  111. package/dist/heart/daemon/message-router.js +45 -5
  112. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  113. package/dist/heart/daemon/os-cron-deps.js +135 -0
  114. package/dist/heart/daemon/os-cron.js +22 -14
  115. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  116. package/dist/heart/daemon/ouro-entry.js +3 -1
  117. package/dist/heart/daemon/plugin-cli.js +432 -0
  118. package/dist/heart/daemon/process-manager.js +519 -40
  119. package/dist/heart/daemon/provider-discovery.js +137 -0
  120. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  121. package/dist/heart/daemon/pulse.js +511 -0
  122. package/dist/heart/daemon/readiness-repair.js +365 -0
  123. package/dist/heart/daemon/run-hooks.js +2 -0
  124. package/dist/heart/daemon/runtime-logging.js +41 -14
  125. package/dist/heart/daemon/runtime-metadata.js +2 -30
  126. package/dist/heart/daemon/safe-mode.js +161 -0
  127. package/dist/heart/daemon/sense-manager.js +670 -48
  128. package/dist/heart/daemon/session-id-resolver.js +131 -0
  129. package/dist/heart/daemon/skill-management-installer.js +1 -1
  130. package/dist/heart/daemon/socket-client.js +171 -12
  131. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  132. package/dist/heart/daemon/startup-tui.js +338 -0
  133. package/dist/heart/daemon/task-scheduler.js +117 -39
  134. package/dist/heart/daemon/terminal-ui.js +499 -0
  135. package/dist/heart/daemon/thoughts.js +255 -43
  136. package/dist/heart/daemon/up-progress.js +366 -0
  137. package/dist/heart/daemon/vault-items.js +56 -0
  138. package/dist/heart/delegation.js +1 -4
  139. package/dist/heart/external-events/router.js +121 -0
  140. package/dist/heart/habits/habit-migration.js +189 -0
  141. package/dist/heart/habits/habit-parser.js +214 -0
  142. package/dist/heart/habits/habit-runtime-state.js +114 -0
  143. package/dist/heart/habits/habit-scheduler.js +431 -0
  144. package/dist/heart/habits/habit-session-summary.js +318 -0
  145. package/dist/heart/habits/habit-session.js +620 -0
  146. package/dist/heart/{daemon → hatch}/hatch-flow.js +51 -60
  147. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  148. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  149. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  150. package/dist/heart/identity.js +174 -59
  151. package/dist/heart/kept-notes.js +289 -0
  152. package/dist/heart/kicks.js +1 -1
  153. package/dist/heart/machine-identity.js +161 -0
  154. package/dist/heart/mail-import-discovery.js +353 -0
  155. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  156. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  157. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  158. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  159. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  160. package/dist/heart/mailbox/mailbox-http.js +99 -0
  161. package/dist/heart/mailbox/mailbox-read.js +39 -0
  162. package/dist/heart/mailbox/mailbox-types.js +27 -0
  163. package/dist/heart/mailbox/mailbox-view.js +197 -0
  164. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  165. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  166. package/dist/heart/mailbox/readers/mail.js +375 -0
  167. package/dist/heart/mailbox/readers/runtime-readers.js +824 -0
  168. package/dist/heart/mailbox/readers/sessions.js +232 -0
  169. package/dist/heart/mailbox/readers/shared.js +111 -0
  170. package/dist/heart/mcp/mcp-server.js +696 -0
  171. package/dist/heart/migrate-config.js +100 -0
  172. package/dist/heart/model-capabilities.js +11 -0
  173. package/dist/heart/orientation-frame.js +217 -0
  174. package/dist/heart/platform.js +81 -0
  175. package/dist/heart/primitives.js +1 -1
  176. package/dist/heart/private-runtime/decision-renderer.js +156 -0
  177. package/dist/heart/private-runtime/index.js +18 -0
  178. package/dist/heart/private-runtime/ledger.js +218 -0
  179. package/dist/heart/private-runtime/policy.js +214 -0
  180. package/dist/heart/private-runtime/types.js +2 -0
  181. package/dist/heart/progress-story.js +1 -1
  182. package/dist/heart/provider-attempt.js +134 -0
  183. package/dist/heart/provider-binding-resolver.js +273 -0
  184. package/dist/heart/provider-credentials.js +441 -0
  185. package/dist/heart/provider-failover.js +311 -0
  186. package/dist/heart/provider-models.js +81 -0
  187. package/dist/heart/provider-ping.js +262 -0
  188. package/dist/heart/provider-readiness-cache.js +119 -0
  189. package/dist/heart/provider-visibility.js +188 -0
  190. package/dist/heart/providers/anthropic-token.js +131 -0
  191. package/dist/heart/providers/anthropic.js +139 -52
  192. package/dist/heart/providers/azure.js +23 -11
  193. package/dist/heart/providers/error-classification.js +127 -0
  194. package/dist/heart/providers/github-copilot.js +34 -38
  195. package/dist/heart/providers/minimax-vlm.js +189 -0
  196. package/dist/heart/providers/minimax.js +26 -8
  197. package/dist/heart/providers/openai-codex-token.js +349 -0
  198. package/dist/heart/providers/openai-codex.js +55 -40
  199. package/dist/heart/run-ledger.js +247 -0
  200. package/dist/heart/runtime-capability-check.js +170 -0
  201. package/dist/heart/runtime-credentials.js +398 -0
  202. package/dist/heart/runtime-cwd.js +87 -0
  203. package/dist/heart/sense-truth.js +20 -4
  204. package/dist/heart/session-activity.js +90 -24
  205. package/dist/heart/session-events.js +1133 -0
  206. package/dist/heart/session-playback-cli-main.js +5 -0
  207. package/dist/heart/session-playback-cli.js +36 -0
  208. package/dist/heart/session-playback.js +231 -0
  209. package/dist/heart/session-stats-cli-main.js +5 -0
  210. package/dist/heart/session-stats.js +182 -0
  211. package/dist/heart/session-transcript.js +133 -0
  212. package/dist/heart/start-of-turn-packet.js +365 -0
  213. package/dist/heart/streaming.js +44 -27
  214. package/dist/heart/structured-output.js +196 -0
  215. package/dist/heart/sync-classification.js +176 -0
  216. package/dist/heart/sync.js +449 -0
  217. package/dist/heart/target-resolution.js +11 -7
  218. package/dist/heart/tempo.js +93 -0
  219. package/dist/heart/temporal-view.js +41 -0
  220. package/dist/heart/timeouts.js +101 -0
  221. package/dist/heart/tool-activity-callbacks.js +59 -0
  222. package/dist/heart/tool-description.js +155 -0
  223. package/dist/heart/tool-friction.js +55 -0
  224. package/dist/heart/tool-loop.js +200 -0
  225. package/dist/heart/turn-context.js +472 -0
  226. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  227. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  228. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  229. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  230. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  231. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  232. package/dist/heart/versioning/update-hooks.js +154 -0
  233. package/dist/heart/work-card.js +380 -0
  234. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  235. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  236. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  237. package/dist/mailbox-ui/index.html +16 -0
  238. package/dist/mailroom/attention.js +167 -0
  239. package/dist/mailroom/autonomy.js +209 -0
  240. package/dist/mailroom/blob-store.js +715 -0
  241. package/dist/mailroom/body-cache.js +61 -0
  242. package/dist/mailroom/core.js +788 -0
  243. package/dist/mailroom/entry.js +160 -0
  244. package/dist/mailroom/file-store.js +568 -0
  245. package/dist/mailroom/mbox-import.js +393 -0
  246. package/dist/mailroom/migration.js +164 -0
  247. package/dist/mailroom/outbound.js +380 -0
  248. package/dist/mailroom/policy.js +263 -0
  249. package/dist/mailroom/reader.js +233 -0
  250. package/dist/mailroom/search-cache.js +334 -0
  251. package/dist/mailroom/search-relevance.js +319 -0
  252. package/dist/mailroom/smtp-ingress.js +176 -0
  253. package/dist/mailroom/source-state.js +176 -0
  254. package/dist/mailroom/thread.js +109 -0
  255. package/dist/mailroom/travel-extract.js +89 -0
  256. package/dist/mind/bundle-manifest.js +24 -2
  257. package/dist/mind/context.js +250 -101
  258. package/dist/mind/desk-section.js +362 -0
  259. package/dist/mind/diary-integrity.js +60 -0
  260. package/dist/mind/{memory.js → diary.js} +68 -77
  261. package/dist/mind/embedding-provider.js +60 -0
  262. package/dist/mind/file-state.js +179 -0
  263. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  264. package/dist/mind/obligation-steering.js +221 -0
  265. package/dist/mind/pending.js +13 -8
  266. package/dist/mind/prompt-budget.js +380 -0
  267. package/dist/mind/prompt-refresh.js +3 -2
  268. package/dist/mind/prompt.js +1027 -170
  269. package/dist/mind/provenance-trust.js +26 -0
  270. package/dist/mind/record-paths.js +312 -0
  271. package/dist/mind/scrutiny.js +173 -0
  272. package/dist/nerves/cli-logging.js +7 -1
  273. package/dist/nerves/coverage/audit-rules.js +15 -6
  274. package/dist/nerves/coverage/audit.js +28 -2
  275. package/dist/nerves/coverage/cli.js +1 -1
  276. package/dist/nerves/coverage/contract.js +5 -5
  277. package/dist/nerves/coverage/file-completeness.js +139 -5
  278. package/dist/nerves/event-buffer.js +111 -0
  279. package/dist/nerves/index.js +234 -4
  280. package/dist/nerves/observation.js +20 -0
  281. package/dist/nerves/redact.js +79 -0
  282. package/dist/nerves/review/cli-main.js +5 -0
  283. package/dist/nerves/review/cli.js +156 -0
  284. package/dist/nerves/review/core.js +152 -0
  285. package/dist/nerves/runtime.js +5 -1
  286. package/dist/repertoire/ado-client.js +15 -56
  287. package/dist/repertoire/ado-semantic.js +16 -10
  288. package/dist/repertoire/api-client.js +97 -0
  289. package/dist/repertoire/bitwarden-store.js +1045 -0
  290. package/dist/repertoire/bundle-templates.js +71 -0
  291. package/dist/repertoire/bw-installer.js +180 -0
  292. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  293. package/dist/repertoire/coding/context-pack.js +331 -0
  294. package/dist/repertoire/coding/feedback.js +218 -30
  295. package/dist/repertoire/coding/index.js +15 -3
  296. package/dist/repertoire/coding/manager.js +166 -10
  297. package/dist/repertoire/coding/spawner.js +58 -11
  298. package/dist/repertoire/coding/tools.js +242 -14
  299. package/dist/repertoire/coding/workbench-client.js +272 -0
  300. package/dist/repertoire/coding/workbench-manager.js +346 -0
  301. package/dist/repertoire/commerce-errors.js +109 -0
  302. package/dist/repertoire/commerce-self-test.js +156 -0
  303. package/dist/repertoire/credential-access.js +178 -0
  304. package/dist/repertoire/desk/classifier.js +362 -0
  305. package/dist/repertoire/duffel-client.js +185 -0
  306. package/dist/repertoire/github-client.js +14 -55
  307. package/dist/repertoire/graph-client.js +11 -52
  308. package/dist/repertoire/guardrails.js +139 -18
  309. package/dist/repertoire/mcp-client.js +44 -3
  310. package/dist/repertoire/mcp-manager.js +259 -20
  311. package/dist/repertoire/mcp-tools.js +83 -0
  312. package/dist/repertoire/plugin-mcp.js +175 -0
  313. package/dist/repertoire/plugins.js +253 -0
  314. package/dist/repertoire/shell-sessions.js +133 -0
  315. package/dist/repertoire/skills.js +48 -4
  316. package/dist/repertoire/stripe-client.js +131 -0
  317. package/dist/repertoire/tool-results.js +29 -0
  318. package/dist/repertoire/tools-a2a.js +699 -0
  319. package/dist/repertoire/tools-attachments.js +317 -0
  320. package/dist/repertoire/tools-awaiting.js +372 -0
  321. package/dist/repertoire/tools-base.js +65 -1095
  322. package/dist/repertoire/tools-bluebubbles.js +2 -0
  323. package/dist/repertoire/tools-bridge.js +144 -0
  324. package/dist/repertoire/tools-bundle.js +993 -0
  325. package/dist/repertoire/tools-commerce.js +253 -0
  326. package/dist/repertoire/tools-config.js +186 -0
  327. package/dist/repertoire/tools-continuity.js +252 -0
  328. package/dist/repertoire/tools-credential.js +383 -0
  329. package/dist/repertoire/tools-evolution.js +527 -0
  330. package/dist/repertoire/tools-files.js +344 -0
  331. package/dist/repertoire/tools-flight.js +290 -0
  332. package/dist/repertoire/tools-flow.js +119 -0
  333. package/dist/repertoire/tools-github.js +3 -8
  334. package/dist/repertoire/tools-mail.js +1975 -0
  335. package/dist/repertoire/tools-notes.js +459 -0
  336. package/dist/repertoire/tools-obligations.js +182 -0
  337. package/dist/repertoire/tools-orientation.js +31 -0
  338. package/dist/repertoire/tools-record.js +482 -0
  339. package/dist/repertoire/tools-rsvp.js +139 -0
  340. package/dist/repertoire/tools-runtime.js +150 -0
  341. package/dist/repertoire/tools-session.js +881 -0
  342. package/dist/repertoire/tools-shell.js +120 -0
  343. package/dist/repertoire/tools-stripe.js +224 -0
  344. package/dist/repertoire/tools-surface.js +355 -0
  345. package/dist/repertoire/tools-teams.js +12 -39
  346. package/dist/repertoire/tools-travel.js +125 -0
  347. package/dist/repertoire/tools-trip.js +982 -0
  348. package/dist/repertoire/tools-user-profile.js +146 -0
  349. package/dist/repertoire/tools-vault.js +40 -0
  350. package/dist/repertoire/tools-voice.js +145 -0
  351. package/dist/repertoire/tools.js +249 -79
  352. package/dist/repertoire/travel-api-client.js +360 -0
  353. package/dist/repertoire/user-profile.js +131 -0
  354. package/dist/repertoire/vault-setup.js +246 -0
  355. package/dist/repertoire/vault-unlock.js +594 -0
  356. package/dist/rsvp/aisleplanner-client.js +354 -0
  357. package/dist/rsvp/cli.js +820 -0
  358. package/dist/rsvp/config.js +327 -0
  359. package/dist/rsvp/cutover.js +433 -0
  360. package/dist/rsvp/diagnostics.js +222 -0
  361. package/dist/rsvp/diff-renderer.js +176 -0
  362. package/dist/rsvp/habit-policy.js +103 -0
  363. package/dist/rsvp/habit-stage.js +108 -0
  364. package/dist/rsvp/incident-bundle.js +97 -0
  365. package/dist/rsvp/migration.js +204 -0
  366. package/dist/rsvp/native-habit-runner.js +490 -0
  367. package/dist/rsvp/outbound-state.js +268 -0
  368. package/dist/rsvp/query.js +118 -0
  369. package/dist/rsvp/replay.js +233 -0
  370. package/dist/rsvp/snapshot.js +232 -0
  371. package/dist/rsvp/spend-ledger.js +175 -0
  372. package/dist/scripts/claude-code-hook.js +41 -0
  373. package/dist/scripts/claude-code-stop-hook.js +47 -0
  374. package/dist/senses/a2a-entry.js +115 -0
  375. package/dist/senses/attention-queue.js +186 -0
  376. package/dist/senses/await-turn-message.js +58 -0
  377. package/dist/senses/bluebubbles/active-turns.js +216 -0
  378. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  379. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  380. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +226 -19
  381. package/dist/senses/bluebubbles/context-packet.js +122 -0
  382. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  383. package/dist/senses/bluebubbles/entry.js +77 -0
  384. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  385. package/dist/senses/bluebubbles/index.js +2907 -0
  386. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  387. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  388. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  389. package/dist/senses/bluebubbles/outbound-state.js +304 -0
  390. package/dist/senses/bluebubbles/processed-log.js +133 -0
  391. package/dist/senses/bluebubbles/replay.js +284 -0
  392. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  393. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  394. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  395. package/dist/senses/cli/bracketed-paste.js +82 -0
  396. package/dist/senses/cli/image-paste.js +287 -0
  397. package/dist/senses/cli/image-ref-navigation.js +75 -0
  398. package/dist/senses/cli/ink-app.js +156 -0
  399. package/dist/senses/cli/inline-diff.js +64 -0
  400. package/dist/senses/cli/input-keys.js +174 -0
  401. package/dist/senses/cli/kill-ring.js +86 -0
  402. package/dist/senses/cli/message-list.js +51 -0
  403. package/dist/senses/cli/ouro-tui.js +607 -0
  404. package/dist/senses/cli/spinner-imperative.js +135 -0
  405. package/dist/senses/cli/spinner.js +101 -0
  406. package/dist/senses/cli/status-line.js +60 -0
  407. package/dist/senses/cli/streaming-markdown.js +526 -0
  408. package/dist/senses/cli/tool-display.js +85 -0
  409. package/dist/senses/cli/tool-render.js +85 -0
  410. package/dist/senses/cli/tui-store.js +240 -0
  411. package/dist/senses/cli/virtual-list.js +35 -0
  412. package/dist/senses/cli-entry.js +60 -8
  413. package/dist/senses/cli-layout.js +100 -0
  414. package/dist/senses/cli.js +521 -214
  415. package/dist/senses/commands.js +66 -3
  416. package/dist/senses/context-packet-ledger.js +371 -0
  417. package/dist/senses/context-packets.js +154 -0
  418. package/dist/senses/habit-turn-message.js +160 -0
  419. package/dist/senses/mail-entry.js +66 -0
  420. package/dist/senses/mail.js +395 -0
  421. package/dist/senses/pipeline.js +988 -178
  422. package/dist/senses/private-runtime-worker.js +739 -0
  423. package/dist/senses/private-runtime.js +1157 -0
  424. package/dist/senses/proactive-content-guard.js +51 -0
  425. package/dist/senses/shared-turn.js +416 -0
  426. package/dist/senses/surface-tool.js +109 -0
  427. package/dist/senses/teams-entry.js +60 -8
  428. package/dist/senses/teams.js +397 -112
  429. package/dist/senses/trust-gate.js +104 -9
  430. package/dist/senses/voice/audio-playback.js +237 -0
  431. package/dist/senses/voice/audio-routing.js +119 -0
  432. package/dist/senses/voice/elevenlabs.js +202 -0
  433. package/dist/senses/voice/floor-control.js +431 -0
  434. package/dist/senses/voice/floor-controller.js +115 -0
  435. package/dist/senses/voice/golden-path.js +116 -0
  436. package/dist/senses/voice/index.js +29 -0
  437. package/dist/senses/voice/meeting.js +113 -0
  438. package/dist/senses/voice/outbound.js +190 -0
  439. package/dist/senses/voice/phone.js +33 -0
  440. package/dist/senses/voice/playback.js +139 -0
  441. package/dist/senses/voice/realtime-eval.js +496 -0
  442. package/dist/senses/voice/realtime-trace.js +531 -0
  443. package/dist/senses/voice/transcript.js +70 -0
  444. package/dist/senses/voice/turn.js +191 -0
  445. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  446. package/dist/senses/voice/twilio-phone.js +5081 -0
  447. package/dist/senses/voice/types.js +2 -0
  448. package/dist/senses/voice/whisper.js +161 -0
  449. package/dist/senses/voice-entry.js +81 -0
  450. package/dist/senses/voice-realtime-eval-command.js +99 -0
  451. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  452. package/dist/senses/voice-twilio-entry.js +87 -0
  453. package/dist/trips/core.js +138 -0
  454. package/dist/trips/store.js +265 -0
  455. package/dist/util/frontmatter.js +69 -0
  456. package/package.json +57 -12
  457. package/skills/agent-commerce.md +113 -0
  458. package/skills/browser-navigation.md +117 -0
  459. package/skills/commerce-setup-guide.md +116 -0
  460. package/skills/commerce-setup.md +84 -0
  461. package/skills/configure-dev-tools.md +99 -0
  462. package/skills/travel-planning.md +138 -0
  463. package/dist/heart/daemon/auth-flow.js +0 -430
  464. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  465. package/dist/heart/daemon/update-hooks.js +0 -138
  466. package/dist/heart/safe-workspace.js +0 -228
  467. package/dist/heart/session-recall.js +0 -116
  468. package/dist/mind/friends/channel.js +0 -84
  469. package/dist/mind/friends/group-context.js +0 -144
  470. package/dist/mind/friends/resolver.js +0 -84
  471. package/dist/mind/friends/store-file.js +0 -190
  472. package/dist/mind/friends/store.js +0 -4
  473. package/dist/mind/friends/tokens.js +0 -26
  474. package/dist/mind/friends/trust-explanation.js +0 -74
  475. package/dist/mind/friends/types.js +0 -29
  476. package/dist/repertoire/tasks/board.js +0 -134
  477. package/dist/repertoire/tasks/index.js +0 -224
  478. package/dist/repertoire/tasks/lifecycle.js +0 -80
  479. package/dist/repertoire/tasks/middleware.js +0 -65
  480. package/dist/repertoire/tasks/parser.js +0 -173
  481. package/dist/repertoire/tasks/scanner.js +0 -132
  482. package/dist/repertoire/tasks/transitions.js +0 -144
  483. package/dist/senses/bluebubbles-entry.js +0 -13
  484. package/dist/senses/bluebubbles.js +0 -1180
  485. package/dist/senses/debug-activity.js +0 -148
  486. package/dist/senses/inner-dialog-worker.js +0 -90
  487. package/dist/senses/inner-dialog.js +0 -480
  488. package/subagents/README.md +0 -7
  489. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  490. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  491. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  492. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  493. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  494. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  495. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  496. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  497. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  498. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  499. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  500. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  501. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  502. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  503. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  504. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  505. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_RSVP_REPORT_COPY = void 0;
4
+ exports.guestDisplayName = guestDisplayName;
5
+ exports.computeRsvpDelta = computeRsvpDelta;
6
+ exports.renderRsvpReport = renderRsvpReport;
7
+ const runtime_1 = require("../nerves/runtime");
8
+ exports.DEFAULT_RSVP_REPORT_COPY = {
9
+ title: "RSVP Update",
10
+ firstRunLabel: "Current RSVP summary:",
11
+ noChangesLabel: "No changes since last check.",
12
+ newRsvpsLabel: "New RSVPs:",
13
+ statusChangesLabel: "Status changes:",
14
+ newGuestsLabel: "New guests added:",
15
+ removedGuestsLabel: "Guests removed:",
16
+ };
17
+ function reportCopy(input = {}) {
18
+ return {
19
+ ...exports.DEFAULT_RSVP_REPORT_COPY,
20
+ ...Object.fromEntries(Object.entries(input).filter(([, value]) => typeof value === "string" && value.trim().length > 0)),
21
+ };
22
+ }
23
+ function byId(left, right) {
24
+ return left.id.localeCompare(right.id);
25
+ }
26
+ function sameGroup(left, right) {
27
+ return left !== null && right !== null && String(left) === String(right);
28
+ }
29
+ function guestDisplayName(guest, peers) {
30
+ if (guest.displayName !== "Unnamed guest")
31
+ return guest.displayName;
32
+ const primary = peers
33
+ .filter((candidate) => candidate.id !== guest.id && candidate.displayName !== "Unnamed guest" && sameGroup(candidate.groupId, guest.groupId))
34
+ .sort(byId)[0];
35
+ return primary ? `Unnamed guest (via ${primary.displayName})` : "Unnamed guest";
36
+ }
37
+ function guestBase(guest, peers) {
38
+ return {
39
+ id: guest.id,
40
+ displayName: guest.displayName,
41
+ contextualDisplayName: guestDisplayName(guest, peers),
42
+ groupId: guest.groupId,
43
+ };
44
+ }
45
+ function mapById(snapshot) {
46
+ return new Map(snapshot.guests.map((guest) => [guest.id, guest]));
47
+ }
48
+ function statusLabel(status) {
49
+ return status;
50
+ }
51
+ function reportName(guest) {
52
+ return guest.contextualDisplayName;
53
+ }
54
+ function summaryLine(summary) {
55
+ const base = `${summary.attending} attending / ${summary.declined} declined / ${summary.pending} pending`;
56
+ return summary.unknown > 0 ? `${base} / ${summary.unknown} unknown` : base;
57
+ }
58
+ function computeRsvpDelta(previous, current) {
59
+ const previousGuests = previous ? mapById(previous) : new Map();
60
+ const currentGuests = mapById(current);
61
+ const newRsvps = [];
62
+ const statusChanges = [];
63
+ const newGuests = [];
64
+ const removedGuests = [];
65
+ for (const currentGuest of current.guests) {
66
+ const previousGuest = previousGuests.get(currentGuest.id);
67
+ if (!previousGuest) {
68
+ newGuests.push({ ...guestBase(currentGuest, current.guests), status: currentGuest.status });
69
+ continue;
70
+ }
71
+ if (previousGuest.status === currentGuest.status)
72
+ continue;
73
+ const changed = {
74
+ ...guestBase(currentGuest, current.guests),
75
+ oldStatus: previousGuest.status,
76
+ newStatus: currentGuest.status,
77
+ };
78
+ if (previousGuest.status === "pending" && (currentGuest.status === "attending" || currentGuest.status === "declined")) {
79
+ newRsvps.push(changed);
80
+ }
81
+ else {
82
+ statusChanges.push(changed);
83
+ }
84
+ }
85
+ if (previous) {
86
+ for (const previousGuest of previous.guests) {
87
+ if (currentGuests.has(previousGuest.id))
88
+ continue;
89
+ removedGuests.push({ ...guestBase(previousGuest, previous.guests), status: previousGuest.status });
90
+ }
91
+ }
92
+ const delta = {
93
+ previousSnapshotId: previous?.snapshotId ?? null,
94
+ currentSnapshotId: current.snapshotId,
95
+ isFirstRun: previous === null,
96
+ newRsvps: newRsvps.sort(byId),
97
+ statusChanges: statusChanges.sort(byId),
98
+ newGuests: newGuests.sort(byId),
99
+ removedGuests: removedGuests.sort(byId),
100
+ summary: current.summary,
101
+ };
102
+ (0, runtime_1.emitNervesEvent)({
103
+ component: "rsvp",
104
+ event: "rsvp.delta_computed",
105
+ message: "computed RSVP snapshot delta",
106
+ meta: {
107
+ currentSnapshotId: current.snapshotId,
108
+ previousSnapshotId: previous?.snapshotId ?? null,
109
+ isFirstRun: previous === null,
110
+ newRsvps: delta.newRsvps.length,
111
+ statusChanges: delta.statusChanges.length,
112
+ newGuests: delta.newGuests.length,
113
+ removedGuests: delta.removedGuests.length,
114
+ },
115
+ });
116
+ return delta;
117
+ }
118
+ function hasChanges(delta) {
119
+ return delta.newRsvps.length > 0
120
+ || delta.statusChanges.length > 0
121
+ || delta.newGuests.length > 0
122
+ || delta.removedGuests.length > 0;
123
+ }
124
+ function renderRsvpReport(delta, copyInput = {}) {
125
+ const copy = reportCopy(copyInput);
126
+ const lines = [copy.title, ""];
127
+ if (delta.isFirstRun) {
128
+ lines.push(copy.firstRunLabel, "");
129
+ }
130
+ else if (!hasChanges(delta)) {
131
+ lines.push(copy.noChangesLabel, "");
132
+ }
133
+ else {
134
+ if (delta.newRsvps.length > 0) {
135
+ lines.push(copy.newRsvpsLabel);
136
+ for (const guest of delta.newRsvps) {
137
+ lines.push(` • ${reportName(guest)} — ${statusLabel(guest.newStatus)}`);
138
+ }
139
+ lines.push("");
140
+ }
141
+ if (delta.statusChanges.length > 0) {
142
+ lines.push(copy.statusChangesLabel);
143
+ for (const guest of delta.statusChanges) {
144
+ lines.push(` • ${reportName(guest)}: ${statusLabel(guest.oldStatus)} → ${statusLabel(guest.newStatus)}`);
145
+ }
146
+ lines.push("");
147
+ }
148
+ if (delta.newGuests.length > 0) {
149
+ lines.push(copy.newGuestsLabel);
150
+ for (const guest of delta.newGuests) {
151
+ lines.push(` • ${reportName(guest)} (${statusLabel(guest.status)})`);
152
+ }
153
+ lines.push("");
154
+ }
155
+ if (delta.removedGuests.length > 0) {
156
+ lines.push(copy.removedGuestsLabel);
157
+ for (const guest of delta.removedGuests) {
158
+ lines.push(` • ${reportName(guest)}`);
159
+ }
160
+ lines.push("");
161
+ }
162
+ }
163
+ lines.push(summaryLine(delta.summary));
164
+ const report = lines.join("\n");
165
+ (0, runtime_1.emitNervesEvent)({
166
+ component: "rsvp",
167
+ event: "rsvp.report_rendered",
168
+ message: "rendered RSVP report",
169
+ meta: {
170
+ currentSnapshotId: delta.currentSnapshotId,
171
+ isFirstRun: delta.isFirstRun,
172
+ characters: report.length,
173
+ },
174
+ });
175
+ return report;
176
+ }
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RSVP_HABIT_ALLOWED_TOOLS = exports.DEFAULT_RSVP_HABIT_NAME = exports.RSVP_HABIT_POLICY_VERSION = void 0;
4
+ exports.isRsvpHabitName = isRsvpHabitName;
5
+ exports.parseRsvpHabitMetadata = parseRsvpHabitMetadata;
6
+ exports.rsvpHabitRuntimePolicy = rsvpHabitRuntimePolicy;
7
+ const runtime_1 = require("../nerves/runtime");
8
+ exports.RSVP_HABIT_POLICY_VERSION = "rsvp-habit/v1";
9
+ exports.DEFAULT_RSVP_HABIT_NAME = "rsvp-updates";
10
+ exports.RSVP_HABIT_ALLOWED_TOOLS = ["rsvp_query", "rsvp_summary"];
11
+ function isRecord(value) {
12
+ return !!value && typeof value === "object" && !Array.isArray(value);
13
+ }
14
+ function requiredString(record, key) {
15
+ const value = record[key];
16
+ if (typeof value !== "string" || value.trim().length === 0) {
17
+ throw new Error(`RSVP habit metadata requires ${key}`);
18
+ }
19
+ return value.trim();
20
+ }
21
+ function requiredBoolean(record, key) {
22
+ const value = record[key];
23
+ if (typeof value === "boolean")
24
+ return value;
25
+ if (value === "true")
26
+ return true;
27
+ if (value === "false")
28
+ return false;
29
+ throw new Error(`RSVP habit metadata requires boolean ${key}`);
30
+ }
31
+ function optionalString(record, key) {
32
+ const value = record[key];
33
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
34
+ }
35
+ function isRsvpHabitName(name) {
36
+ return name.startsWith("rsvp-");
37
+ }
38
+ function parseRsvpHabitMetadata(raw) {
39
+ if (raw === undefined || raw === null)
40
+ return null;
41
+ if (!isRecord(raw))
42
+ throw new Error("RSVP habit metadata must be an object");
43
+ if (raw.channel !== undefined) {
44
+ throw new Error("RSVP habit metadata requires sense, not channel");
45
+ }
46
+ const policyVersion = requiredString(raw, "policyVersion");
47
+ if (policyVersion !== exports.RSVP_HABIT_POLICY_VERSION)
48
+ throw new Error("RSVP habit metadata has unsupported policyVersion");
49
+ const mode = requiredString(raw, "mode");
50
+ if (mode !== "shadow" && mode !== "live")
51
+ throw new Error("RSVP habit metadata mode must be shadow or live");
52
+ const sense = requiredString(raw, "sense");
53
+ if (sense !== "bluebubbles")
54
+ throw new Error("RSVP habit metadata sense must be bluebubbles");
55
+ const source = requiredString(raw, "source");
56
+ if (source !== "aisleplanner")
57
+ throw new Error("RSVP habit metadata source must be aisleplanner");
58
+ const parsed = {
59
+ policyVersion: exports.RSVP_HABIT_POLICY_VERSION,
60
+ mode,
61
+ sense,
62
+ source,
63
+ routeRef: requiredString(raw, "routeRef"),
64
+ snapshotRef: requiredString(raw, "snapshotRef"),
65
+ outboundStateRef: requiredString(raw, "outboundStateRef"),
66
+ budgetRef: requiredString(raw, "budgetRef"),
67
+ idempotencyRef: requiredString(raw, "idempotencyRef"),
68
+ liveSendEligible: requiredBoolean(raw, "liveSendEligible"),
69
+ };
70
+ for (const key of [
71
+ "reportTitle",
72
+ "firstRunLabel",
73
+ "noChangesLabel",
74
+ "newRsvpsLabel",
75
+ "statusChangesLabel",
76
+ "newGuestsLabel",
77
+ "removedGuestsLabel",
78
+ ]) {
79
+ const value = optionalString(raw, key);
80
+ if (value)
81
+ parsed[key] = value;
82
+ }
83
+ return parsed;
84
+ }
85
+ function rsvpHabitRuntimePolicy(metadata) {
86
+ const policy = {
87
+ ...metadata,
88
+ sendAllowed: metadata.mode === "live" && metadata.liveSendEligible,
89
+ };
90
+ (0, runtime_1.emitNervesEvent)({
91
+ component: "rsvp",
92
+ event: "rsvp.habit_policy_resolved",
93
+ message: "resolved RSVP habit runtime policy",
94
+ meta: {
95
+ mode: metadata.mode,
96
+ sense: metadata.sense,
97
+ source: metadata.source,
98
+ sendAllowed: policy.sendAllowed,
99
+ liveSendEligible: metadata.liveSendEligible,
100
+ },
101
+ });
102
+ return policy;
103
+ }
@@ -0,0 +1,108 @@
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.stageRsvpHabit = stageRsvpHabit;
37
+ const fs = __importStar(require("node:fs"));
38
+ const path = __importStar(require("node:path"));
39
+ const habit_parser_1 = require("../heart/habits/habit-parser");
40
+ const runtime_1 = require("../nerves/runtime");
41
+ const outbound_state_1 = require("./outbound-state");
42
+ const spend_ledger_1 = require("./spend-ledger");
43
+ const habit_policy_1 = require("./habit-policy");
44
+ function defaultRsvpHabitMetadata(mode, reportTitle) {
45
+ return {
46
+ policyVersion: habit_policy_1.RSVP_HABIT_POLICY_VERSION,
47
+ mode,
48
+ sense: "bluebubbles",
49
+ source: "aisleplanner",
50
+ routeRef: "rsvp/config.json#bluebubblesRoute",
51
+ snapshotRef: "state/rsvp/snapshots/latest.json",
52
+ outboundStateRef: "state/rsvp/outbound-state.json",
53
+ budgetRef: "state/rsvp/spend-ledger.json",
54
+ idempotencyRef: "state/rsvp/outbound-state.json",
55
+ liveSendEligible: false,
56
+ reportTitle,
57
+ };
58
+ }
59
+ function stagedHabitBody() {
60
+ return [
61
+ "Refresh AislePlanner RSVP state through the native RSVP workflow.",
62
+ "Use the latest native snapshot to answer follow-up questions, and only surface RSVP updates through the guarded outbound policy.",
63
+ ].join("\n\n");
64
+ }
65
+ function normalizeHabitName(name) {
66
+ const normalized = name?.trim() || habit_policy_1.DEFAULT_RSVP_HABIT_NAME;
67
+ if (!/^[A-Za-z0-9][A-Za-z0-9_-]*$/.test(normalized) || !(0, habit_policy_1.isRsvpHabitName)(normalized)) {
68
+ throw new Error("RSVP habit name must start with rsvp- and contain only letters, numbers, underscores, or hyphens");
69
+ }
70
+ return normalized;
71
+ }
72
+ function stageRsvpHabit(input) {
73
+ const habitName = normalizeHabitName(input.habitName);
74
+ const title = input.title?.trim() || "RSVP Updates";
75
+ const rsvp = defaultRsvpHabitMetadata(input.mode, input.reportTitle?.trim() || title);
76
+ const habitPath = path.join(input.agentRoot, "habits", `${habitName}.md`);
77
+ const created = (input.now ?? new Date()).toISOString();
78
+ const content = (0, habit_parser_1.renderHabitFile)({
79
+ title,
80
+ status: "active",
81
+ cadence: input.cadence,
82
+ created,
83
+ tools: [...habit_policy_1.RSVP_HABIT_ALLOWED_TOOLS],
84
+ continuity: { mode: "stateful" },
85
+ rsvp,
86
+ }, stagedHabitBody());
87
+ fs.mkdirSync(path.dirname(habitPath), { recursive: true });
88
+ fs.writeFileSync(habitPath, content, "utf-8");
89
+ (0, outbound_state_1.ensureRsvpOutboundState)(input.agentRoot, created);
90
+ (0, spend_ledger_1.ensureRsvpSpendLedger)(input.agentRoot, created);
91
+ (0, runtime_1.emitNervesEvent)({
92
+ component: "rsvp",
93
+ event: "rsvp.habit_staged",
94
+ message: "staged native RSVP habit",
95
+ meta: { agent: input.agent, habitName, mode: input.mode, cadence: input.cadence },
96
+ });
97
+ return {
98
+ ok: true,
99
+ sideEffect: true,
100
+ agent: input.agent,
101
+ name: habitName,
102
+ habitName,
103
+ habitPath,
104
+ mode: input.mode,
105
+ cadence: input.cadence,
106
+ rsvp,
107
+ };
108
+ }
@@ -0,0 +1,97 @@
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.buildRsvpIncidentBundle = buildRsvpIncidentBundle;
37
+ exports.writeRsvpIncidentBundle = writeRsvpIncidentBundle;
38
+ const fs = __importStar(require("node:fs"));
39
+ const path = __importStar(require("node:path"));
40
+ const doctor_1 = require("../heart/daemon/doctor");
41
+ const runtime_1 = require("../nerves/runtime");
42
+ const diagnostics_1 = require("./diagnostics");
43
+ function nowIso(deps) {
44
+ return (deps.now?.() ?? new Date()).toISOString();
45
+ }
46
+ async function doctorResult(input) {
47
+ if (input.deps.runDoctorChecks)
48
+ return input.deps.runDoctorChecks();
49
+ const bundleRoot = path.dirname(input.agentRoot);
50
+ return (0, doctor_1.runDoctorChecks)({
51
+ existsSync: input.deps.existsSync,
52
+ readFileSync: input.deps.readFileSync,
53
+ readdirSync: input.deps.readdirSync,
54
+ statSync: input.deps.statSync,
55
+ checkSocketAlive: input.deps.checkSocketAlive,
56
+ socketPath: "",
57
+ bundlesRoot: bundleRoot,
58
+ homedir: path.dirname(bundleRoot),
59
+ envPath: "",
60
+ platform: process.platform,
61
+ }, { category: "RSVP" });
62
+ }
63
+ async function buildRsvpIncidentBundle(input) {
64
+ const diagnostics = (0, diagnostics_1.collectRsvpDiagnostics)(input.agentRoot, input.deps);
65
+ const bundle = {
66
+ schemaVersion: 1,
67
+ agent: input.agent,
68
+ generatedAt: nowIso(input.deps),
69
+ sideEffect: false,
70
+ doctor: await doctorResult(input),
71
+ ...diagnostics,
72
+ };
73
+ (0, runtime_1.emitNervesEvent)({
74
+ component: "rsvp",
75
+ event: "rsvp.incident_bundle_built",
76
+ message: "built RSVP incident bundle",
77
+ meta: {
78
+ agent: input.agent,
79
+ doctorFailed: bundle.doctor.summary.failed,
80
+ contextPacketLedger: bundle.contextPacketLedger.status,
81
+ latestFetch: bundle.latestFetch.status,
82
+ },
83
+ });
84
+ return bundle;
85
+ }
86
+ async function writeRsvpIncidentBundle(input) {
87
+ const bundle = await buildRsvpIncidentBundle(input);
88
+ fs.mkdirSync(path.dirname(input.outputPath), { recursive: true });
89
+ fs.writeFileSync(input.outputPath, `${JSON.stringify(bundle, null, 2)}\n`, "utf-8");
90
+ (0, runtime_1.emitNervesEvent)({
91
+ component: "rsvp",
92
+ event: "rsvp.incident_bundle_written",
93
+ message: "wrote RSVP incident bundle",
94
+ meta: { agent: input.agent, outputPath: input.outputPath },
95
+ });
96
+ return { outputPath: input.outputPath, bundle };
97
+ }
@@ -0,0 +1,204 @@
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.RSVP_MIGRATION_POLICY_VERSION = void 0;
37
+ exports.readRsvpBaselineState = readRsvpBaselineState;
38
+ exports.importLegacyRsvpState = importLegacyRsvpState;
39
+ const fs = __importStar(require("node:fs"));
40
+ const path = __importStar(require("node:path"));
41
+ const node_crypto_1 = require("node:crypto");
42
+ const runtime_1 = require("../nerves/runtime");
43
+ const snapshot_1 = require("./snapshot");
44
+ exports.RSVP_MIGRATION_POLICY_VERSION = "rsvp-migration/v1";
45
+ function rsvpRoot(agentRoot) {
46
+ return path.join(agentRoot, "state", "rsvp");
47
+ }
48
+ function snapshotsDir(agentRoot) {
49
+ return path.join(rsvpRoot(agentRoot), "snapshots");
50
+ }
51
+ function baselineStatePath(agentRoot) {
52
+ return path.join(rsvpRoot(agentRoot), "baseline.json");
53
+ }
54
+ function hashBytes(bytes) {
55
+ return `sha256:${(0, node_crypto_1.createHash)("sha256").update(bytes).digest("hex")}`;
56
+ }
57
+ function hashFile(filePath) {
58
+ return hashBytes(fs.readFileSync(filePath));
59
+ }
60
+ function writeJson(filePath, value) {
61
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
62
+ fs.writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\n`, "utf-8");
63
+ }
64
+ function fail(reason, message) {
65
+ return { ok: false, reason, actor: "agent-runnable", message };
66
+ }
67
+ function readJsonFile(filePath) {
68
+ try {
69
+ return JSON.parse(fs.readFileSync(filePath, "utf-8"));
70
+ }
71
+ catch {
72
+ return null;
73
+ }
74
+ }
75
+ function normalizeRelative(root, filePath) {
76
+ const relative = path.relative(path.resolve(root), path.resolve(filePath));
77
+ if (relative.startsWith(".."))
78
+ return null;
79
+ return relative.split(path.sep).join("/");
80
+ }
81
+ function listLegacySnapshotFiles(legacyRoot) {
82
+ const dataDir = path.join(legacyRoot, "data");
83
+ return fs.readdirSync(dataDir)
84
+ .filter((name) => /^snapshot_.*\.json$/.test(name))
85
+ .sort()
86
+ .map((name) => path.join(dataDir, name));
87
+ }
88
+ function readLegacySnapshot(filePath) {
89
+ const parsed = readJsonFile(filePath);
90
+ if (!parsed || !parsed.guests || typeof parsed.guests !== "object" || Array.isArray(parsed.guests))
91
+ return null;
92
+ const allGuests = parsed.all_guests && typeof parsed.all_guests === "object" && !Array.isArray(parsed.all_guests)
93
+ ? parsed.all_guests
94
+ : {};
95
+ return {
96
+ guests: parsed.guests,
97
+ all_guests: allGuests,
98
+ };
99
+ }
100
+ function fetchedAtFromLegacyName(filePath) {
101
+ const basename = path.basename(filePath);
102
+ const match = basename.match(/^snapshot_(\d{4}-\d{2}-\d{2})_(\d{2})(\d{2})(\d{2})\.json$/);
103
+ if (!match)
104
+ return new Date(0).toISOString();
105
+ return `${match[1]}T${match[2]}:${match[3]}:${match[4]}.000Z`;
106
+ }
107
+ function snapshotPath(agentRoot, snapshot) {
108
+ return path.join(snapshotsDir(agentRoot), `${snapshot.snapshotId}.json`);
109
+ }
110
+ function writeSnapshot(agentRoot, snapshot) {
111
+ const filePath = snapshotPath(agentRoot, snapshot);
112
+ writeJson(filePath, snapshot);
113
+ return filePath;
114
+ }
115
+ function buildImportedSnapshot(input, filePath, sentStateHash) {
116
+ const legacy = readLegacySnapshot(filePath);
117
+ const relativePath = normalizeRelative(input.legacyRoot, filePath);
118
+ if (!legacy || !relativePath)
119
+ return null;
120
+ return (0, snapshot_1.buildRsvpSnapshot)({
121
+ agent: input.agent,
122
+ fetchedAt: fetchedAtFromLegacyName(filePath),
123
+ source: {
124
+ kind: "aisleplanner",
125
+ weddingId: input.weddingId,
126
+ eventId: input.eventId,
127
+ adapter: "aisleplanner-api-v1",
128
+ },
129
+ guests: legacy.guests,
130
+ allGuests: legacy.all_guests,
131
+ provenance: {
132
+ kind: "legacy-import",
133
+ importedAt: input.importedAt,
134
+ legacySnapshotRelativePath: relativePath,
135
+ legacySnapshotHash: hashFile(filePath),
136
+ ...(sentStateHash ? { sentStateHash } : {}),
137
+ },
138
+ });
139
+ }
140
+ function readRsvpBaselineState(agentRoot) {
141
+ return readJsonFile(baselineStatePath(agentRoot));
142
+ }
143
+ function importLegacyRsvpState(input) {
144
+ const dataDir = path.join(input.legacyRoot, "data");
145
+ if (!fs.existsSync(dataDir))
146
+ return fail("missing_legacy_data", "legacy RSVP data directory is missing");
147
+ const sentStatePath = path.join(dataDir, "sent_state.json");
148
+ if (!fs.existsSync(sentStatePath))
149
+ return fail("missing_sent_state", "legacy sent_state.json is missing; refusing to bootstrap baseline");
150
+ const sentStateRaw = fs.readFileSync(sentStatePath, "utf-8");
151
+ const sentState = readJsonFile(sentStatePath);
152
+ if (!sentState || typeof sentState.snapshot_path !== "string") {
153
+ return fail("malformed_sent_state", "legacy sent_state.json is malformed; refusing to bootstrap baseline");
154
+ }
155
+ const baselineLegacyPath = path.resolve(sentState.snapshot_path);
156
+ const baselineRelativePath = normalizeRelative(input.legacyRoot, baselineLegacyPath);
157
+ if (!baselineRelativePath)
158
+ return fail("baseline_outside_legacy_root", "legacy sent baseline points outside the legacy root");
159
+ if (!fs.existsSync(baselineLegacyPath))
160
+ return fail("missing_baseline_snapshot", "legacy sent baseline snapshot is missing");
161
+ const legacySnapshots = listLegacySnapshotFiles(input.legacyRoot);
162
+ const latestLegacyPath = legacySnapshots.at(-1);
163
+ if (!latestLegacyPath)
164
+ return fail("missing_legacy_snapshot", "no legacy snapshot_*.json files found");
165
+ const sentStateHash = hashBytes(sentStateRaw);
166
+ const baselineSnapshot = buildImportedSnapshot(input, baselineLegacyPath, sentStateHash);
167
+ const latestSnapshot = buildImportedSnapshot(input, latestLegacyPath);
168
+ if (!baselineSnapshot || !latestSnapshot)
169
+ return fail("malformed_legacy_snapshot", "legacy snapshot file is malformed");
170
+ const baselineSnapshotPath = writeSnapshot(input.agentRoot, baselineSnapshot);
171
+ const latestSnapshotPath = writeSnapshot(input.agentRoot, latestSnapshot);
172
+ const baselineState = {
173
+ schemaVersion: 1,
174
+ policyVersion: exports.RSVP_MIGRATION_POLICY_VERSION,
175
+ agent: input.agent,
176
+ importedAt: input.importedAt,
177
+ baselineSource: typeof sentState.source === "string" ? sentState.source : "sent",
178
+ legacySnapshotRelativePath: baselineRelativePath,
179
+ legacySnapshotHash: hashFile(baselineLegacyPath),
180
+ sentStateHash,
181
+ nativeSnapshotId: baselineSnapshot.snapshotId,
182
+ nativeSnapshotRelativePath: normalizeRelative(input.agentRoot, baselineSnapshotPath),
183
+ };
184
+ writeJson(baselineStatePath(input.agentRoot), baselineState);
185
+ (0, runtime_1.emitNervesEvent)({
186
+ component: "rsvp",
187
+ event: "rsvp.legacy_state_imported",
188
+ message: "imported legacy RSVP snapshots into native state",
189
+ meta: {
190
+ agent: input.agent,
191
+ latestSnapshotId: latestSnapshot.snapshotId,
192
+ baselineSnapshotId: baselineSnapshot.snapshotId,
193
+ baselineSource: baselineState.baselineSource,
194
+ },
195
+ });
196
+ return {
197
+ ok: true,
198
+ latestSnapshotId: latestSnapshot.snapshotId,
199
+ baselineSnapshotId: baselineSnapshot.snapshotId,
200
+ latestSnapshotPath,
201
+ baselineSnapshotPath,
202
+ baselineSource: baselineState.baselineSource,
203
+ };
204
+ }