@ouro.bot/cli 0.1.0-alpha.96 → 0.1.0-alpha.961

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 (759) 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 +6091 -16
  16. package/deploy/unraid/Dockerfile +58 -0
  17. package/deploy/unraid/README.txt +2997 -0
  18. package/deploy/unraid/audit-container-spec.sh +4 -0
  19. package/deploy/unraid/container-runtime.json +1 -0
  20. package/deploy/unraid/credit-gateway.md +95 -0
  21. package/deploy/unraid/docker-man-template-transaction.mjs +711 -0
  22. package/deploy/unraid/docker-man-template-xml.cjs +105 -0
  23. package/deploy/unraid/migrate-sanctuary-bundle.mjs +60 -0
  24. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  25. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  26. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  27. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  28. package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
  29. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  30. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
  31. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  32. package/deploy/unraid/sanctuary-authority-installation.json +36 -0
  33. package/deploy/unraid/sanctuary-authority-service.sh +30 -0
  34. package/deploy/unraid/sanctuary-butler-upgrade.mjs +1274 -0
  35. package/deploy/unraid/sanctuary-deployment-target.mjs +710 -0
  36. package/deploy/unraid/sanctuary-replay-gate.mjs +1760 -0
  37. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  38. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2086 -0
  39. package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
  40. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  41. package/deploy/unraid/sanctuary.ouro/agent.json +66 -0
  42. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  43. package/deploy/unraid/sanctuary.ouro/awaiting/house-care-sweep.md +17 -0
  44. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  45. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  46. package/deploy/unraid/sanctuary.ouro/mcp/media-mcp.mjs +2245 -0
  47. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  48. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  49. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
  50. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +33 -0
  51. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +27 -0
  52. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +22 -0
  53. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  54. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +232 -0
  55. package/deploy/unraid/sanctuary.xml +30 -0
  56. package/dist/a2a/card.js +57 -0
  57. package/dist/a2a/client.js +250 -0
  58. package/dist/a2a/config.js +50 -0
  59. package/dist/a2a/delegated-command-grants.js +93 -0
  60. package/dist/a2a/delegated-command.js +197 -0
  61. package/dist/a2a/delegation-stores.js +56 -0
  62. package/dist/a2a/did-resolution.js +93 -0
  63. package/dist/a2a/escalation-grants.js +84 -0
  64. package/dist/a2a/escalation-wiring.js +60 -0
  65. package/dist/a2a/identity.js +258 -0
  66. package/dist/a2a/inbound-share.js +110 -0
  67. package/dist/a2a/mission-result-wire.js +196 -0
  68. package/dist/a2a/onboarding.js +133 -0
  69. package/dist/a2a/operator-trust.js +399 -0
  70. package/dist/a2a/outbox-client.js +57 -0
  71. package/dist/a2a/outbox-store.js +188 -0
  72. package/dist/a2a/outbox-wire.js +95 -0
  73. package/dist/a2a/pin-store.js +132 -0
  74. package/dist/a2a/replay-grant-holders.js +33 -0
  75. package/dist/a2a/replay-harness.js +188 -0
  76. package/dist/a2a/resolution-proof.js +53 -0
  77. package/dist/a2a/sealed-chat.js +113 -0
  78. package/dist/a2a/seen-ledger.js +120 -0
  79. package/dist/a2a/server.js +771 -0
  80. package/dist/a2a/task-store.js +69 -0
  81. package/dist/a2a/transport.js +45 -0
  82. package/dist/a2a/trust-commands.js +203 -0
  83. package/dist/a2a/trusted-files.js +185 -0
  84. package/dist/a2a/types.js +3 -0
  85. package/dist/arc/attention-types.js +8 -0
  86. package/dist/arc/cares.js +360 -0
  87. package/dist/arc/episodes.js +118 -0
  88. package/dist/arc/evolution.js +490 -0
  89. package/dist/arc/flight-recorder.js +1034 -0
  90. package/dist/arc/intentions.js +134 -0
  91. package/dist/arc/json-store.js +117 -0
  92. package/dist/arc/obligations.js +386 -0
  93. package/dist/arc/packets.js +336 -0
  94. package/dist/arc/presence.js +185 -0
  95. package/dist/arc/task-lifecycle.js +57 -0
  96. package/dist/commerce/store.js +755 -0
  97. package/dist/commerce/types.js +3 -0
  98. package/dist/gateway/keys.js +117 -0
  99. package/dist/gateway/server.js +429 -0
  100. package/dist/heart/active-work.js +798 -40
  101. package/dist/heart/agent-entry.js +252 -3
  102. package/dist/heart/approval-files.js +113 -0
  103. package/dist/heart/approval-store.js +960 -0
  104. package/dist/heart/attachments/image-normalize.js +201 -0
  105. package/dist/heart/attachments/materialize.js +97 -0
  106. package/dist/heart/attachments/originals.js +88 -0
  107. package/dist/heart/attachments/render.js +29 -0
  108. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  109. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  110. package/dist/heart/attachments/sources/index.js +18 -0
  111. package/dist/heart/attachments/sources/telegram.js +71 -0
  112. package/dist/heart/attachments/store.js +132 -0
  113. package/dist/heart/attachments/types.js +93 -0
  114. package/dist/heart/auth/auth-flow.js +511 -0
  115. package/dist/heart/autonomy-budget.js +478 -0
  116. package/dist/heart/awaiting/a2a-await-delivery.js +109 -0
  117. package/dist/heart/awaiting/await-alert.js +152 -0
  118. package/dist/heart/awaiting/await-expiry.js +143 -0
  119. package/dist/heart/awaiting/await-loader.js +91 -0
  120. package/dist/heart/awaiting/await-parser.js +152 -0
  121. package/dist/heart/awaiting/await-runtime-state.js +111 -0
  122. package/dist/heart/awaiting/await-scheduler.js +391 -0
  123. package/dist/heart/background-operations.js +281 -0
  124. package/dist/heart/bluebubbles-host-account.js +78 -0
  125. package/dist/heart/bridges/manager.js +137 -17
  126. package/dist/heart/bridges/store.js +14 -2
  127. package/dist/heart/bundle-state.js +168 -0
  128. package/dist/heart/commitments.js +44 -18
  129. package/dist/heart/config-registry.js +331 -0
  130. package/dist/heart/config.js +178 -131
  131. package/dist/heart/context-loss-gauntlet.js +387 -0
  132. package/dist/heart/context-loss-sentinel.js +1159 -0
  133. package/dist/heart/core.js +2377 -586
  134. package/dist/heart/cross-chat-delivery.js +9 -22
  135. package/dist/heart/daemon/agent-config-check.js +474 -0
  136. package/dist/heart/daemon/agent-discovery.js +283 -3
  137. package/dist/heart/daemon/agent-home.js +319 -0
  138. package/dist/heart/daemon/agent-service.js +542 -0
  139. package/dist/heart/daemon/agentic-repair.js +547 -0
  140. package/dist/heart/daemon/await-private-wake.js +59 -0
  141. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  142. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  143. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  144. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  145. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  146. package/dist/heart/daemon/cadence.js +180 -0
  147. package/dist/heart/daemon/cli-arg-redaction.js +26 -0
  148. package/dist/heart/daemon/cli-defaults.js +881 -0
  149. package/dist/heart/daemon/cli-desk.js +322 -0
  150. package/dist/heart/daemon/cli-exec.js +9260 -0
  151. package/dist/heart/daemon/cli-help.js +754 -0
  152. package/dist/heart/daemon/cli-parse.js +3319 -0
  153. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  154. package/dist/heart/daemon/cli-render.js +819 -0
  155. package/dist/heart/daemon/cli-types.js +8 -0
  156. package/dist/heart/daemon/connect-bay.js +323 -0
  157. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  158. package/dist/heart/daemon/container-healthcheck.js +112 -0
  159. package/dist/heart/daemon/container-runtime.js +97 -0
  160. package/dist/heart/daemon/container-spec-auditor-main.js +171 -0
  161. package/dist/heart/daemon/container-spec-auditor.js +235 -0
  162. package/dist/heart/daemon/daemon-bootstrap-startup.js +115 -0
  163. package/dist/heart/daemon/daemon-cli.js +29 -2360
  164. package/dist/heart/daemon/daemon-entry.js +953 -11
  165. package/dist/heart/daemon/daemon-health.js +186 -0
  166. package/dist/heart/daemon/daemon-rollup.js +57 -0
  167. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  168. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  169. package/dist/heart/daemon/daemon.js +2110 -104
  170. package/dist/heart/daemon/dns-workflow.js +394 -0
  171. package/dist/heart/daemon/doctor-types.js +8 -0
  172. package/dist/heart/daemon/doctor.js +1766 -0
  173. package/dist/heart/daemon/freshness.js +345 -0
  174. package/dist/heart/daemon/habit-private-wake.js +61 -0
  175. package/dist/heart/daemon/health-monitor.js +154 -11
  176. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  177. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  178. package/dist/heart/daemon/http-health-probe.js +80 -0
  179. package/dist/heart/daemon/human-command-screens.js +234 -0
  180. package/dist/heart/daemon/human-readiness.js +114 -0
  181. package/dist/heart/daemon/inner-status.js +78 -0
  182. package/dist/heart/daemon/interactive-repair.js +394 -0
  183. package/dist/heart/daemon/launchd.js +37 -8
  184. package/dist/heart/daemon/log-tailer.js +79 -10
  185. package/dist/heart/daemon/logs-prune.js +132 -0
  186. package/dist/heart/daemon/mcp-canary.js +524 -0
  187. package/dist/heart/daemon/message-router.js +65 -5
  188. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  189. package/dist/heart/daemon/os-cron-deps.js +135 -0
  190. package/dist/heart/daemon/os-cron.js +22 -14
  191. package/dist/heart/daemon/ouro-bot-entry.js +6 -3
  192. package/dist/heart/daemon/ouro-entry.js +9 -3
  193. package/dist/heart/daemon/plugin-cli.js +432 -0
  194. package/dist/heart/daemon/process-manager.js +760 -61
  195. package/dist/heart/daemon/provider-discovery.js +137 -0
  196. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  197. package/dist/heart/daemon/prunable-bundle.js +144 -0
  198. package/dist/heart/daemon/pulse.js +511 -0
  199. package/dist/heart/daemon/readiness-repair.js +365 -0
  200. package/dist/heart/daemon/run-hooks.js +2 -0
  201. package/dist/heart/daemon/runtime-logging.js +47 -14
  202. package/dist/heart/daemon/runtime-metadata.js +2 -30
  203. package/dist/heart/daemon/runtime-mode.js +13 -2
  204. package/dist/heart/daemon/safe-mode.js +161 -0
  205. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2654 -0
  206. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1830 -0
  207. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  208. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +955 -0
  209. package/dist/heart/daemon/sanctuary-authority-codec.js +86 -0
  210. package/dist/heart/daemon/sanctuary-authority-epoch.js +281 -0
  211. package/dist/heart/daemon/sanctuary-authority-installation.js +161 -0
  212. package/dist/heart/daemon/sanctuary-authority-ledger.js +241 -0
  213. package/dist/heart/daemon/sanctuary-authority-root-lifecycle.js +1282 -0
  214. package/dist/heart/daemon/sanctuary-authority-vault-migration.js +79 -0
  215. package/dist/heart/daemon/sanctuary-bundle-migration.js +730 -0
  216. package/dist/heart/daemon/sanctuary-host-authority.js +1008 -0
  217. package/dist/heart/daemon/sanctuary-host-detached-supervisor.js +493 -0
  218. package/dist/heart/daemon/sanctuary-host-executor.js +670 -0
  219. package/dist/heart/daemon/sanctuary-host-linux-kernel.js +334 -0
  220. package/dist/heart/daemon/sanctuary-host-supervisor-entry.js +207 -0
  221. package/dist/heart/daemon/sanctuary-host-supervisor.js +95 -0
  222. package/dist/heart/daemon/sanctuary-package-management.js +103 -0
  223. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  224. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  225. package/dist/heart/daemon/sanctuary-telegram-authority-entry.js +475 -0
  226. package/dist/heart/daemon/sanctuary-telegram-authority-gateway.js +585 -0
  227. package/dist/heart/daemon/sanctuary-telegram-authority-service.js +676 -0
  228. package/dist/heart/daemon/sense-manager.js +786 -48
  229. package/dist/heart/daemon/session-id-resolver.js +131 -0
  230. package/dist/heart/daemon/skill-management-installer.js +1 -1
  231. package/dist/heart/daemon/socket-client.js +180 -12
  232. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  233. package/dist/heart/daemon/startup-tui.js +339 -0
  234. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  235. package/dist/heart/daemon/task-scheduler.js +117 -39
  236. package/dist/heart/daemon/terminal-ui.js +503 -0
  237. package/dist/heart/daemon/thoughts.js +138 -54
  238. package/dist/heart/daemon/up-progress.js +366 -0
  239. package/dist/heart/daemon/vault-items.js +56 -0
  240. package/dist/heart/delegation.js +1 -4
  241. package/dist/heart/external-events/router.js +1531 -0
  242. package/dist/heart/failure-reports.js +336 -0
  243. package/dist/heart/file-lock.js +109 -0
  244. package/dist/heart/frontend-approval-runtime.js +506 -0
  245. package/dist/heart/frontend-journal.js +215 -0
  246. package/dist/heart/frontend-session-service.js +271 -0
  247. package/dist/heart/frontend-socket-client.js +173 -0
  248. package/dist/heart/frontend-socket.js +434 -0
  249. package/dist/heart/frontend-turn-errors.js +20 -0
  250. package/dist/heart/habits/habit-cancel.js +810 -0
  251. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  252. package/dist/heart/habits/habit-migration.js +194 -0
  253. package/dist/heart/habits/habit-parser.js +278 -0
  254. package/dist/heart/habits/habit-runtime-state.js +93 -0
  255. package/dist/heart/habits/habit-scheduler.js +653 -0
  256. package/dist/heart/habits/habit-session-summary.js +318 -0
  257. package/dist/heart/habits/habit-session.js +636 -0
  258. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  259. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  260. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  261. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  262. package/dist/heart/identity.js +239 -59
  263. package/dist/heart/kept-notes.js +289 -0
  264. package/dist/heart/kicks.js +1 -1
  265. package/dist/heart/machine-identity.js +175 -0
  266. package/dist/heart/mail-import-discovery.js +356 -0
  267. package/dist/heart/mailbox/mailbox-http-hooks.js +99 -0
  268. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  269. package/dist/heart/mailbox/mailbox-http-routes.js +406 -0
  270. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  271. package/dist/heart/mailbox/mailbox-http-transport.js +272 -0
  272. package/dist/heart/mailbox/mailbox-http.js +99 -0
  273. package/dist/heart/mailbox/mailbox-read.js +41 -0
  274. package/dist/heart/mailbox/mailbox-supervision.js +131 -0
  275. package/dist/heart/mailbox/mailbox-types.js +27 -0
  276. package/dist/heart/mailbox/mailbox-view.js +197 -0
  277. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  278. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  279. package/dist/heart/mailbox/readers/mail.js +375 -0
  280. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  281. package/dist/heart/mailbox/readers/sessions.js +231 -0
  282. package/dist/heart/mailbox/readers/shared.js +111 -0
  283. package/dist/heart/mcp/mcp-server.js +760 -0
  284. package/dist/heart/migrate-config.js +100 -0
  285. package/dist/heart/model-capabilities.js +83 -16
  286. package/dist/heart/orientation-frame.js +345 -0
  287. package/dist/heart/platform.js +81 -0
  288. package/dist/heart/primitives.js +1 -1
  289. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  290. package/dist/heart/private-runtime/index.js +18 -0
  291. package/dist/heart/private-runtime/ledger.js +221 -0
  292. package/dist/heart/private-runtime/policy.js +260 -0
  293. package/dist/heart/private-runtime/types.js +2 -0
  294. package/dist/heart/progress-story.js +1 -1
  295. package/dist/heart/provider-attempt.js +137 -0
  296. package/dist/heart/provider-binding-resolver.js +273 -0
  297. package/dist/heart/provider-credentials.js +449 -0
  298. package/dist/heart/provider-failover.js +311 -0
  299. package/dist/heart/provider-models.js +96 -0
  300. package/dist/heart/provider-ping.js +266 -0
  301. package/dist/heart/provider-readiness-cache.js +119 -0
  302. package/dist/heart/provider-visibility.js +188 -0
  303. package/dist/heart/providers/anthropic-token.js +131 -0
  304. package/dist/heart/providers/anthropic.js +248 -67
  305. package/dist/heart/providers/azure.js +23 -11
  306. package/dist/heart/providers/error-classification.js +129 -0
  307. package/dist/heart/providers/github-copilot.js +38 -39
  308. package/dist/heart/providers/minimax-vlm.js +189 -0
  309. package/dist/heart/providers/minimax.js +26 -8
  310. package/dist/heart/providers/openai-codex-token.js +349 -0
  311. package/dist/heart/providers/openai-codex.js +55 -40
  312. package/dist/heart/providers/openai-compatible.js +177 -0
  313. package/dist/heart/reach-channel.js +85 -0
  314. package/dist/heart/reply-style.js +52 -0
  315. package/dist/heart/run-ledger.js +247 -0
  316. package/dist/heart/runtime-capability-check.js +170 -0
  317. package/dist/heart/runtime-credentials.js +608 -0
  318. package/dist/heart/runtime-cwd.js +87 -0
  319. package/dist/heart/sense-truth.js +24 -4
  320. package/dist/heart/session-activity.js +94 -24
  321. package/dist/heart/session-events.js +1521 -0
  322. package/dist/heart/session-playback-cli-main.js +5 -0
  323. package/dist/heart/session-playback-cli.js +36 -0
  324. package/dist/heart/session-playback.js +231 -0
  325. package/dist/heart/session-redaction-repair-cli-main.js +31 -0
  326. package/dist/heart/session-redaction-repair.js +552 -0
  327. package/dist/heart/session-stats-cli-main.js +5 -0
  328. package/dist/heart/session-stats.js +183 -0
  329. package/dist/heart/session-transcript.js +133 -0
  330. package/dist/heart/shelf-claims.js +78 -0
  331. package/dist/heart/shepherd/custody-types.js +2 -0
  332. package/dist/heart/shepherd/mandates.js +352 -0
  333. package/dist/heart/shepherd/operation-commands.js +19 -0
  334. package/dist/heart/shepherd/operations.js +135 -0
  335. package/dist/heart/shepherd/supervision.js +114 -0
  336. package/dist/heart/shepherd/types.js +2 -0
  337. package/dist/heart/shepherd-config.js +123 -0
  338. package/dist/heart/source-grounding.js +302 -0
  339. package/dist/heart/start-of-turn-packet.js +372 -0
  340. package/dist/heart/steward-policy.js +656 -0
  341. package/dist/heart/streaming.js +631 -207
  342. package/dist/heart/structured-output.js +196 -0
  343. package/dist/heart/sync-classification.js +176 -0
  344. package/dist/heart/sync-health.js +152 -0
  345. package/dist/heart/sync.js +726 -0
  346. package/dist/heart/target-resolution.js +11 -7
  347. package/dist/heart/tempo.js +93 -0
  348. package/dist/heart/temporal-view.js +41 -0
  349. package/dist/heart/timeouts.js +101 -0
  350. package/dist/heart/tool-activity-callbacks.js +59 -0
  351. package/dist/heart/tool-approval.js +382 -0
  352. package/dist/heart/tool-description.js +155 -0
  353. package/dist/heart/tool-friction.js +55 -0
  354. package/dist/heart/tool-loop.js +206 -0
  355. package/dist/heart/turn-context.js +496 -0
  356. package/dist/heart/turn-execution-lease.js +30 -0
  357. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  358. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +3 -2
  359. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  360. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  361. package/dist/heart/versioning/ouro-version-manager.js +432 -0
  362. package/dist/heart/versioning/release-sources.js +173 -0
  363. package/dist/heart/versioning/self-update-defaults.js +294 -0
  364. package/dist/heart/versioning/self-update.js +196 -0
  365. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  366. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  367. package/dist/heart/versioning/update-hooks.js +154 -0
  368. package/dist/heart/versioning/update-state.js +126 -0
  369. package/dist/heart/versioning/updater-launchd.js +150 -0
  370. package/dist/heart/versioning/version-intent.js +114 -0
  371. package/dist/heart/work-card.js +380 -0
  372. package/dist/mailbox-ui/assets/index-Dbska1tZ.js +1 -0
  373. package/dist/mailbox-ui/assets/index-DsiKaPyH.css +1 -0
  374. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  375. package/dist/mailbox-ui/index.html +16 -0
  376. package/dist/mailroom/attention.js +167 -0
  377. package/dist/mailroom/autonomy.js +209 -0
  378. package/dist/mailroom/blob-store.js +889 -0
  379. package/dist/mailroom/body-cache.js +61 -0
  380. package/dist/mailroom/cache-sync-cli.js +58 -0
  381. package/dist/mailroom/core.js +803 -0
  382. package/dist/mailroom/entry.js +160 -0
  383. package/dist/mailroom/file-store.js +568 -0
  384. package/dist/mailroom/hosted-cache-sync.js +384 -0
  385. package/dist/mailroom/mbox-import.js +393 -0
  386. package/dist/mailroom/migration.js +164 -0
  387. package/dist/mailroom/outbound.js +380 -0
  388. package/dist/mailroom/policy.js +263 -0
  389. package/dist/mailroom/reader.js +292 -0
  390. package/dist/mailroom/search-cache.js +513 -0
  391. package/dist/mailroom/search-relevance.js +319 -0
  392. package/dist/mailroom/smtp-ingress.js +176 -0
  393. package/dist/mailroom/source-state.js +176 -0
  394. package/dist/mailroom/thread.js +109 -0
  395. package/dist/mailroom/travel-extract.js +89 -0
  396. package/dist/mind/bundle-manifest.js +24 -2
  397. package/dist/mind/context.js +328 -139
  398. package/dist/mind/desk-section.js +362 -0
  399. package/dist/mind/diary-integrity.js +60 -0
  400. package/dist/mind/{memory.js → diary.js} +68 -77
  401. package/dist/mind/embedding-provider.js +60 -0
  402. package/dist/mind/file-state.js +179 -0
  403. package/dist/mind/friend-link-codes.js +209 -0
  404. package/dist/mind/friend-merge.js +336 -0
  405. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  406. package/dist/mind/obligation-steering.js +199 -3
  407. package/dist/mind/outbound-record.js +168 -0
  408. package/dist/mind/pending.js +36 -10
  409. package/dist/mind/prompt-budget.js +479 -0
  410. package/dist/mind/prompt-refresh.js +3 -2
  411. package/dist/mind/prompt.js +1085 -198
  412. package/dist/mind/provenance-trust.js +26 -0
  413. package/dist/mind/record-paths.js +312 -0
  414. package/dist/mind/scrutiny.js +173 -0
  415. package/dist/mind/session-transaction.js +622 -0
  416. package/dist/nerves/cli-logging.js +7 -1
  417. package/dist/nerves/coverage/audit-rules.js +15 -6
  418. package/dist/nerves/coverage/audit.js +28 -2
  419. package/dist/nerves/coverage/cli.js +1 -1
  420. package/dist/nerves/coverage/contract.js +5 -5
  421. package/dist/nerves/coverage/file-completeness.js +143 -5
  422. package/dist/nerves/coverage/run-artifacts.js +55 -35
  423. package/dist/nerves/coverage/source-scanner.js +4 -4
  424. package/dist/nerves/event-buffer.js +111 -0
  425. package/dist/nerves/index.js +293 -9
  426. package/dist/nerves/observation.js +20 -0
  427. package/dist/nerves/redact.js +79 -0
  428. package/dist/nerves/review/cli-main.js +5 -0
  429. package/dist/nerves/review/cli.js +156 -0
  430. package/dist/nerves/review/core.js +159 -0
  431. package/dist/nerves/runtime.js +17 -1
  432. package/dist/repertoire/ado-client.js +15 -56
  433. package/dist/repertoire/ado-semantic.js +16 -10
  434. package/dist/repertoire/api-client.js +97 -0
  435. package/dist/repertoire/bitwarden-store.js +1201 -0
  436. package/dist/repertoire/bundle-templates.js +71 -0
  437. package/dist/repertoire/bw-installer.js +231 -0
  438. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  439. package/dist/repertoire/coding/context-pack.js +331 -0
  440. package/dist/repertoire/coding/feedback.js +174 -32
  441. package/dist/repertoire/coding/index.js +15 -3
  442. package/dist/repertoire/coding/manager.js +159 -10
  443. package/dist/repertoire/coding/spawner.js +40 -11
  444. package/dist/repertoire/coding/tools.js +182 -18
  445. package/dist/repertoire/coding/workbench-client.js +272 -0
  446. package/dist/repertoire/coding/workbench-manager.js +346 -0
  447. package/dist/repertoire/commerce-errors.js +109 -0
  448. package/dist/repertoire/commerce-self-test.js +156 -0
  449. package/dist/repertoire/credential-access.js +183 -0
  450. package/dist/repertoire/desk/classifier.js +362 -0
  451. package/dist/repertoire/duffel-client.js +185 -0
  452. package/dist/repertoire/github-client.js +14 -55
  453. package/dist/repertoire/graph-client.js +11 -52
  454. package/dist/repertoire/guardrails.js +971 -20
  455. package/dist/repertoire/house-sweep.js +471 -0
  456. package/dist/repertoire/mcp-client.js +58 -5
  457. package/dist/repertoire/mcp-manager.js +427 -139
  458. package/dist/repertoire/mcp-tools.js +132 -0
  459. package/dist/repertoire/mcp-write-guard.js +46 -0
  460. package/dist/repertoire/plugin-mcp.js +175 -0
  461. package/dist/repertoire/plugins.js +253 -0
  462. package/dist/repertoire/relationship-authorization.js +322 -0
  463. package/dist/repertoire/sanctuary-container-policy.js +46 -0
  464. package/dist/repertoire/shell-sessions.js +134 -0
  465. package/dist/repertoire/skills.js +48 -4
  466. package/dist/repertoire/stripe-client.js +131 -0
  467. package/dist/repertoire/tool-arguments.js +182 -0
  468. package/dist/repertoire/tool-results.js +29 -0
  469. package/dist/repertoire/tools-a2a.js +699 -0
  470. package/dist/repertoire/tools-attachments.js +322 -0
  471. package/dist/repertoire/tools-awaiting.js +891 -0
  472. package/dist/repertoire/tools-base.js +83 -1168
  473. package/dist/repertoire/tools-bluebubbles.js +2 -0
  474. package/dist/repertoire/tools-bridge.js +144 -0
  475. package/dist/repertoire/tools-bundle.js +995 -0
  476. package/dist/repertoire/tools-commerce.js +253 -0
  477. package/dist/repertoire/tools-config.js +186 -0
  478. package/dist/repertoire/tools-continuity.js +588 -0
  479. package/dist/repertoire/tools-credential.js +383 -0
  480. package/dist/repertoire/tools-escalation.js +84 -0
  481. package/dist/repertoire/tools-evolution.js +527 -0
  482. package/dist/repertoire/tools-files.js +344 -0
  483. package/dist/repertoire/tools-flight.js +290 -0
  484. package/dist/repertoire/tools-flow.js +119 -0
  485. package/dist/repertoire/tools-friend-link.js +57 -0
  486. package/dist/repertoire/tools-github.js +3 -8
  487. package/dist/repertoire/tools-habits.js +103 -0
  488. package/dist/repertoire/tools-house-care.js +174 -0
  489. package/dist/repertoire/tools-mail.js +1828 -0
  490. package/dist/repertoire/tools-notes.js +501 -0
  491. package/dist/repertoire/tools-obligations.js +182 -0
  492. package/dist/repertoire/tools-orientation.js +31 -0
  493. package/dist/repertoire/tools-record.js +482 -0
  494. package/dist/repertoire/tools-rsvp.js +139 -0
  495. package/dist/repertoire/tools-runtime.js +238 -0
  496. package/dist/repertoire/tools-sanctuary-host.js +202 -0
  497. package/dist/repertoire/tools-session.js +1141 -0
  498. package/dist/repertoire/tools-shell.js +154 -0
  499. package/dist/repertoire/tools-shepherd-guidance.js +171 -0
  500. package/dist/repertoire/tools-shepherd.js +325 -0
  501. package/dist/repertoire/tools-steward-policy.js +147 -0
  502. package/dist/repertoire/tools-stripe.js +224 -0
  503. package/dist/repertoire/tools-surface.js +369 -0
  504. package/dist/repertoire/tools-teams.js +50 -39
  505. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  506. package/dist/repertoire/tools-travel.js +125 -0
  507. package/dist/repertoire/tools-trip.js +982 -0
  508. package/dist/repertoire/tools-unraid.js +556 -0
  509. package/dist/repertoire/tools-user-profile.js +146 -0
  510. package/dist/repertoire/tools-vault.js +40 -0
  511. package/dist/repertoire/tools-voice-local.js +198 -0
  512. package/dist/repertoire/tools-voice.js +145 -0
  513. package/dist/repertoire/tools.js +518 -156
  514. package/dist/repertoire/travel-api-client.js +360 -0
  515. package/dist/repertoire/unraid-client.js +155 -0
  516. package/dist/repertoire/unraid-restart.js +339 -0
  517. package/dist/repertoire/user-profile.js +131 -0
  518. package/dist/repertoire/vault-setup.js +246 -0
  519. package/dist/repertoire/vault-unlock.js +686 -0
  520. package/dist/rsvp/aisleplanner-client.js +354 -0
  521. package/dist/rsvp/cli.js +936 -0
  522. package/dist/rsvp/config.js +327 -0
  523. package/dist/rsvp/cutover.js +433 -0
  524. package/dist/rsvp/diagnostics.js +232 -0
  525. package/dist/rsvp/diff-renderer.js +176 -0
  526. package/dist/rsvp/habit-policy.js +110 -0
  527. package/dist/rsvp/habit-stage.js +123 -0
  528. package/dist/rsvp/incident-bundle.js +97 -0
  529. package/dist/rsvp/migration.js +204 -0
  530. package/dist/rsvp/native-habit-runner.js +630 -0
  531. package/dist/rsvp/outbound-state.js +628 -0
  532. package/dist/rsvp/query.js +118 -0
  533. package/dist/rsvp/replay.js +233 -0
  534. package/dist/rsvp/snapshot.js +232 -0
  535. package/dist/rsvp/spend-ledger.js +175 -0
  536. package/dist/scripts/claude-code-hook.js +41 -0
  537. package/dist/scripts/claude-code-stop-hook.js +47 -0
  538. package/dist/senses/a2a-entry.js +132 -0
  539. package/dist/senses/acp-server.js +386 -0
  540. package/dist/senses/attention-queue.js +186 -0
  541. package/dist/senses/await-turn-message.js +65 -0
  542. package/dist/senses/bluebubbles/active-turns.js +216 -0
  543. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  544. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  545. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +385 -43
  546. package/dist/senses/bluebubbles/context-packet.js +207 -0
  547. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  548. package/dist/senses/bluebubbles/entry.js +90 -0
  549. package/dist/senses/bluebubbles/host-account-verifier.js +88 -0
  550. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  551. package/dist/senses/bluebubbles/index.js +4040 -0
  552. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  553. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  554. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  555. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  556. package/dist/senses/bluebubbles/outbound-state.js +335 -0
  557. package/dist/senses/bluebubbles/processed-log.js +133 -0
  558. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  559. package/dist/senses/bluebubbles/replay.js +284 -0
  560. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  561. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  562. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  563. package/dist/senses/bluebubbles/webhook-registration.js +257 -0
  564. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  565. package/dist/senses/cli/bracketed-paste.js +82 -0
  566. package/dist/senses/cli/image-paste.js +287 -0
  567. package/dist/senses/cli/image-ref-navigation.js +75 -0
  568. package/dist/senses/cli/ink-app.js +156 -0
  569. package/dist/senses/cli/inline-diff.js +64 -0
  570. package/dist/senses/cli/input-keys.js +174 -0
  571. package/dist/senses/cli/kill-ring.js +86 -0
  572. package/dist/senses/cli/message-list.js +51 -0
  573. package/dist/senses/cli/ouro-tui.js +607 -0
  574. package/dist/senses/cli/spinner-imperative.js +135 -0
  575. package/dist/senses/cli/spinner.js +101 -0
  576. package/dist/senses/cli/status-line.js +60 -0
  577. package/dist/senses/cli/streaming-markdown.js +526 -0
  578. package/dist/senses/cli/tool-display.js +85 -0
  579. package/dist/senses/cli/tool-render.js +85 -0
  580. package/dist/senses/cli/tui-store.js +241 -0
  581. package/dist/senses/cli/virtual-list.js +35 -0
  582. package/dist/senses/cli-entry.js +60 -8
  583. package/dist/senses/cli.js +570 -309
  584. package/dist/senses/commands.js +66 -3
  585. package/dist/senses/context-packet-ledger.js +371 -0
  586. package/dist/senses/context-packets.js +154 -0
  587. package/dist/senses/habit-lifecycle-guard.js +24 -0
  588. package/dist/senses/habit-turn-message.js +160 -0
  589. package/dist/senses/ingress-evidence.js +2 -0
  590. package/dist/senses/mail-entry.js +66 -0
  591. package/dist/senses/mail.js +524 -0
  592. package/dist/senses/pipeline.js +1158 -204
  593. package/dist/senses/private-runtime-worker.js +857 -0
  594. package/dist/senses/private-runtime.js +1627 -0
  595. package/dist/senses/proactive-content-guard.js +51 -0
  596. package/dist/senses/root-host-approval-port.js +345 -0
  597. package/dist/senses/root-host-approval-runtime.js +393 -0
  598. package/dist/senses/sanctuary-authority-resident.js +102 -0
  599. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  600. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  601. package/dist/senses/sanctuary-grounding.js +118 -0
  602. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  603. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  604. package/dist/senses/sanctuary-health-runner.js +104 -0
  605. package/dist/senses/sanctuary-health.js +448 -0
  606. package/dist/senses/sanctuary-install-state-contract.js +169 -0
  607. package/dist/senses/sanctuary-interactive-control.js +410 -0
  608. package/dist/senses/sanctuary-media-catalog-contract.js +268 -0
  609. package/dist/senses/sanctuary-media-optimization.js +514 -0
  610. package/dist/senses/sanctuary-runtime.js +369 -0
  611. package/dist/senses/sanctuary-sab.js +85 -0
  612. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  613. package/dist/senses/shared-turn.js +804 -0
  614. package/dist/senses/shepherd/agent-presentation.js +88 -0
  615. package/dist/senses/shepherd/attention-page.js +166 -0
  616. package/dist/senses/shepherd/attention-sidebar.js +76 -0
  617. package/dist/senses/shepherd/attention.js +295 -0
  618. package/dist/senses/shepherd/checkin-config.js +76 -0
  619. package/dist/senses/shepherd/checkin-store.js +386 -0
  620. package/dist/senses/shepherd/client.js +196 -0
  621. package/dist/senses/shepherd/cmux.js +483 -0
  622. package/dist/senses/shepherd/composer.js +336 -0
  623. package/dist/senses/shepherd/copilot-app.js +648 -0
  624. package/dist/senses/shepherd/feedback-reply.js +108 -0
  625. package/dist/senses/shepherd/feedback-source.js +20 -0
  626. package/dist/senses/shepherd/feedback-store.js +331 -0
  627. package/dist/senses/shepherd/feedback-submit.js +182 -0
  628. package/dist/senses/shepherd/feedback-worker.js +208 -0
  629. package/dist/senses/shepherd/guidance.js +273 -0
  630. package/dist/senses/shepherd/herdr.js +427 -0
  631. package/dist/senses/shepherd/host.js +17 -0
  632. package/dist/senses/shepherd/human-decision-guard.js +29 -0
  633. package/dist/senses/shepherd/judge-evaluation-command.js +183 -0
  634. package/dist/senses/shepherd/judge-evaluation-entry.js +13 -0
  635. package/dist/senses/shepherd/judge-evaluation.js +155 -0
  636. package/dist/senses/shepherd/judge.js +202 -0
  637. package/dist/senses/shepherd/notice-outbox.js +262 -0
  638. package/dist/senses/shepherd/observation-publisher.js +320 -0
  639. package/dist/senses/shepherd/operations-defaults.js +86 -0
  640. package/dist/senses/shepherd/operations.js +159 -0
  641. package/dist/senses/shepherd/owner-notice.js +467 -0
  642. package/dist/senses/shepherd/prompt-state.js +60 -0
  643. package/dist/senses/shepherd/recovery.js +543 -0
  644. package/dist/senses/shepherd/redact.js +66 -0
  645. package/dist/senses/shepherd/returns.js +79 -0
  646. package/dist/senses/shepherd/sense.js +821 -0
  647. package/dist/senses/shepherd/shepherd-judge-corpus-v1.json +170 -0
  648. package/dist/senses/shepherd/surface.js +123 -0
  649. package/dist/senses/shepherd/target-binding.js +13 -0
  650. package/dist/senses/shepherd/terminal-process.js +147 -0
  651. package/dist/senses/shepherd-entry.js +98 -0
  652. package/dist/senses/surface-tool.js +109 -0
  653. package/dist/senses/teams-entry.js +68 -8
  654. package/dist/senses/teams-image.js +119 -0
  655. package/dist/senses/teams.js +949 -337
  656. package/dist/senses/telegram-admission.js +718 -0
  657. package/dist/senses/telegram-approval-runtime.js +793 -0
  658. package/dist/senses/telegram-attachments.js +186 -0
  659. package/dist/senses/telegram-audit-ledger.js +220 -0
  660. package/dist/senses/telegram-authority-transport.js +231 -0
  661. package/dist/senses/telegram-client.js +1749 -0
  662. package/dist/senses/telegram-effect-adapter.js +904 -0
  663. package/dist/senses/telegram-entry.js +83 -0
  664. package/dist/senses/telegram-handoff.js +154 -0
  665. package/dist/senses/telegram.js +2466 -0
  666. package/dist/senses/trust-gate.js +104 -9
  667. package/dist/senses/voice/audio-playback.js +237 -0
  668. package/dist/senses/voice/audio-routing.js +119 -0
  669. package/dist/senses/voice/call-auth.js +250 -0
  670. package/dist/senses/voice/elevenlabs.js +202 -0
  671. package/dist/senses/voice/floor-control.js +431 -0
  672. package/dist/senses/voice/floor-controller.js +115 -0
  673. package/dist/senses/voice/golden-path.js +116 -0
  674. package/dist/senses/voice/index.js +29 -0
  675. package/dist/senses/voice/local-audio-control.js +344 -0
  676. package/dist/senses/voice/local-audio-devices.js +516 -0
  677. package/dist/senses/voice/local-audio-disclosure.js +174 -0
  678. package/dist/senses/voice/local-audio-identity.js +103 -0
  679. package/dist/senses/voice/local-audio-join.js +325 -0
  680. package/dist/senses/voice/local-audio-mute.js +199 -0
  681. package/dist/senses/voice/local-audio-notify.js +124 -0
  682. package/dist/senses/voice/local-audio-prompts.js +116 -0
  683. package/dist/senses/voice/local-audio-transport.js +427 -0
  684. package/dist/senses/voice/local-audio.js +281 -0
  685. package/dist/senses/voice/local-media-stream.js +145 -0
  686. package/dist/senses/voice/meeting.js +113 -0
  687. package/dist/senses/voice/outbound.js +190 -0
  688. package/dist/senses/voice/phone.js +33 -0
  689. package/dist/senses/voice/playback.js +139 -0
  690. package/dist/senses/voice/process-guards.js +51 -0
  691. package/dist/senses/voice/realtime-eval.js +496 -0
  692. package/dist/senses/voice/realtime-tool-schema.js +195 -0
  693. package/dist/senses/voice/realtime-trace.js +531 -0
  694. package/dist/senses/voice/transcript.js +70 -0
  695. package/dist/senses/voice/turn.js +191 -0
  696. package/dist/senses/voice/twilio-phone-runtime.js +836 -0
  697. package/dist/senses/voice/twilio-phone.js +5454 -0
  698. package/dist/senses/voice/types.js +2 -0
  699. package/dist/senses/voice/whisper.js +161 -0
  700. package/dist/senses/voice-entry.js +83 -0
  701. package/dist/senses/voice-realtime-eval-command.js +99 -0
  702. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  703. package/dist/senses/voice-twilio-entry.js +87 -0
  704. package/dist/trips/core.js +138 -0
  705. package/dist/trips/store.js +265 -0
  706. package/dist/util/frontmatter.js +69 -0
  707. package/npm-shrinkwrap.json +8165 -0
  708. package/package.json +75 -13
  709. package/skills/agent-commerce.md +113 -0
  710. package/skills/browser-navigation.md +117 -0
  711. package/skills/commerce-setup-guide.md +116 -0
  712. package/skills/commerce-setup.md +84 -0
  713. package/skills/configure-dev-tools.md +99 -0
  714. package/skills/travel-planning.md +138 -0
  715. package/dist/heart/daemon/auth-flow.js +0 -430
  716. package/dist/heart/daemon/ouro-path-installer.js +0 -260
  717. package/dist/heart/daemon/ouro-version-manager.js +0 -171
  718. package/dist/heart/daemon/update-hooks.js +0 -138
  719. package/dist/heart/obligations.js +0 -191
  720. package/dist/heart/safe-workspace.js +0 -381
  721. package/dist/heart/session-recall.js +0 -116
  722. package/dist/mind/friends/channel.js +0 -84
  723. package/dist/mind/friends/group-context.js +0 -144
  724. package/dist/mind/friends/resolver.js +0 -84
  725. package/dist/mind/friends/store-file.js +0 -190
  726. package/dist/mind/friends/store.js +0 -4
  727. package/dist/mind/friends/tokens.js +0 -26
  728. package/dist/mind/friends/trust-explanation.js +0 -74
  729. package/dist/mind/friends/types.js +0 -29
  730. package/dist/repertoire/tasks/board.js +0 -134
  731. package/dist/repertoire/tasks/index.js +0 -224
  732. package/dist/repertoire/tasks/lifecycle.js +0 -80
  733. package/dist/repertoire/tasks/middleware.js +0 -65
  734. package/dist/repertoire/tasks/parser.js +0 -173
  735. package/dist/repertoire/tasks/scanner.js +0 -132
  736. package/dist/repertoire/tasks/transitions.js +0 -144
  737. package/dist/senses/bluebubbles-entry.js +0 -13
  738. package/dist/senses/bluebubbles.js +0 -1181
  739. package/dist/senses/debug-activity.js +0 -154
  740. package/dist/senses/inner-dialog-worker.js +0 -90
  741. package/dist/senses/inner-dialog.js +0 -525
  742. package/subagents/README.md +0 -7
  743. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  744. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  745. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  746. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  747. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  748. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  749. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  750. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  751. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  752. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  753. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  754. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  755. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  756. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  757. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  758. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  759. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -1,12 +1,65 @@
1
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
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.BlueBubblesSendError = void 0;
3
37
  exports.createBlueBubblesClient = createBlueBubblesClient;
4
38
  const node_crypto_1 = require("node:crypto");
5
- const config_1 = require("../heart/config");
6
- const identity_1 = require("../heart/identity");
7
- const runtime_1 = require("../nerves/runtime");
8
- const bluebubbles_model_1 = require("./bluebubbles-model");
9
- const bluebubbles_media_1 = require("./bluebubbles-media");
39
+ const config_1 = require("../../heart/config");
40
+ const identity_1 = require("../../heart/identity");
41
+ const bluebubbles_health_diagnostics_1 = require("../../heart/daemon/bluebubbles-health-diagnostics");
42
+ const runtime_1 = require("../../nerves/runtime");
43
+ const minimax_1 = require("../../heart/providers/minimax");
44
+ const minimax_vlm_1 = require("../../heart/providers/minimax-vlm");
45
+ const model_1 = require("./model");
46
+ const media_1 = require("./media");
47
+ const host_account_verifier_1 = require("./host-account-verifier");
48
+ class BlueBubblesSendError extends Error {
49
+ httpStatus;
50
+ status;
51
+ errorCode;
52
+ transportInvoked;
53
+ constructor(input) {
54
+ super(input.message, input.cause === undefined ? undefined : { cause: input.cause });
55
+ this.name = "BlueBubblesSendError";
56
+ this.httpStatus = input.httpStatus;
57
+ this.status = input.httpStatus;
58
+ this.errorCode = input.errorCode;
59
+ this.transportInvoked = input.transportInvoked;
60
+ }
61
+ }
62
+ exports.BlueBubblesSendError = BlueBubblesSendError;
10
63
  function buildBlueBubblesApiUrl(baseUrl, endpoint, password) {
11
64
  const root = baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
12
65
  const url = new URL(endpoint.replace(/^\//, ""), root);
@@ -55,6 +108,31 @@ async function parseJsonBody(response) {
55
108
  return null;
56
109
  }
57
110
  }
111
+ function describeCaughtValue(error) {
112
+ return error instanceof Error ? error.message : String(error);
113
+ }
114
+ function sendTransportErrorCode(error) {
115
+ if (error instanceof Error && error.name === "TimeoutError")
116
+ return "timeout";
117
+ if (error instanceof Error && error.name === "AbortError")
118
+ return "abort";
119
+ if (error instanceof TypeError)
120
+ return "socket";
121
+ return "transport_error";
122
+ }
123
+ function emitBlueBubblesSendError(input) {
124
+ (0, runtime_1.emitNervesEvent)({
125
+ level: "error",
126
+ component: "senses",
127
+ event: "senses.bluebubbles_send_error",
128
+ message: "bluebubbles send failed",
129
+ meta: {
130
+ status: input.status,
131
+ errorCode: input.errorCode,
132
+ reason: input.reason,
133
+ },
134
+ });
135
+ }
58
136
  function buildRepairUrl(baseUrl, messageGuid, password) {
59
137
  const url = buildBlueBubblesApiUrl(baseUrl, `/api/v1/message/${encodeURIComponent(messageGuid)}`, password);
60
138
  const parsed = new URL(url);
@@ -99,6 +177,23 @@ function extractChatQueryRows(payload) {
99
177
  }
100
178
  return data.map((entry) => asRecord(entry)).filter((entry) => entry !== null);
101
179
  }
180
+ function extractMessageQueryRows(payload) {
181
+ const record = asRecord(payload);
182
+ const data = asRecord(record?.data);
183
+ const rows = Array.isArray(record?.data) ? record.data
184
+ : Array.isArray(data?.messages) ? data.messages
185
+ : Array.isArray(data?.results) ? data.results
186
+ : Array.isArray(record?.messages) ? record.messages
187
+ : Array.isArray(payload) ? payload
188
+ : [];
189
+ return rows;
190
+ }
191
+ function hasValidRawMessageCausalTimestamp(row) {
192
+ const record = asRecord(row);
193
+ return typeof record?.dateCreated === "number"
194
+ && Number.isFinite(record.dateCreated)
195
+ && record.dateCreated > 0;
196
+ }
102
197
  async function resolveChatGuidForIdentifier(config, channelConfig, chatIdentifier) {
103
198
  const trimmedIdentifier = chatIdentifier.trim();
104
199
  if (!trimmedIdentifier)
@@ -209,21 +304,39 @@ async function resolveChatGuid(chat, config, channelConfig) {
209
304
  return chat.chatGuid
210
305
  ?? await resolveChatGuidForIdentifier(config, channelConfig, chat.chatIdentifier ?? "");
211
306
  }
212
- function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(), channelConfig = (0, config_1.getBlueBubblesChannelConfig)()) {
307
+ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(), channelConfig = (0, config_1.getBlueBubblesChannelConfig)(), hostOptions = {}) {
308
+ // Everything that acts as the signed-in Apple ID first confirms the server
309
+ // runs under the agent's declared macOS host account.
310
+ // Sends recheck every time; quieter actions may reuse a recent confirmation.
311
+ const assertHostAccount = (options = {}) => (0, host_account_verifier_1.verifyBlueBubblesServerAccount)({
312
+ agent: hostOptions.agent ?? (0, identity_1.getAgentName)(),
313
+ hostUsername: "hostUsername" in hostOptions
314
+ ? hostOptions.hostUsername
315
+ : (0, identity_1.loadAgentConfig)().senses?.bluebubbles.hostUsername,
316
+ serverUrl: config.serverUrl,
317
+ password: config.password,
318
+ requestTimeoutMs: channelConfig.requestTimeoutMs,
319
+ fresh: options.fresh,
320
+ });
213
321
  return {
214
322
  async sendText(params) {
215
323
  const trimmedText = params.text.trim();
216
324
  if (!trimmedText) {
217
325
  throw new Error("BlueBubbles send requires non-empty text.");
218
326
  }
327
+ await assertHostAccount({ fresh: true });
219
328
  const resolvedChatGuid = await resolveChatGuid(params.chat, config, channelConfig);
220
329
  if (!resolvedChatGuid) {
221
- throw new Error("BlueBubbles send currently requires chat.chatGuid from the inbound event.");
330
+ // Nothing reached the server, so a caller may safely send again once the chat exists.
331
+ throw new BlueBubblesSendError({
332
+ message: "BlueBubbles send currently requires chat.chatGuid from the inbound event.",
333
+ httpStatus: null, errorCode: "chat_unresolved", transportInvoked: false,
334
+ });
222
335
  }
223
336
  const url = buildBlueBubblesApiUrl(config.serverUrl, "/api/v1/message/text", config.password);
224
337
  const body = {
225
338
  chatGuid: resolvedChatGuid,
226
- tempGuid: (0, node_crypto_1.randomUUID)(),
339
+ tempGuid: params.tempGuid?.trim() || (0, node_crypto_1.randomUUID)(),
227
340
  message: trimmedText,
228
341
  };
229
342
  if (params.replyToMessageGuid?.trim()) {
@@ -240,27 +353,70 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
240
353
  hasReplyTarget: Boolean(params.replyToMessageGuid?.trim()),
241
354
  },
242
355
  });
243
- const response = await fetch(url, {
244
- method: "POST",
245
- headers: { "Content-Type": "application/json" },
246
- body: JSON.stringify(body),
247
- signal: AbortSignal.timeout(channelConfig.requestTimeoutMs),
248
- });
356
+ const requestTimeoutSignal = AbortSignal.timeout(channelConfig.requestTimeoutMs);
357
+ if (params.beforeTransportInvocation && !params.beforeTransportInvocation()) {
358
+ throw new BlueBubblesSendError({
359
+ message: "BlueBubbles send was not admitted at the transport boundary.",
360
+ httpStatus: null,
361
+ errorCode: "admission_denied",
362
+ transportInvoked: false,
363
+ });
364
+ }
365
+ params.onTransportInvocation?.();
366
+ let response;
367
+ try {
368
+ response = await fetch(url, {
369
+ method: "POST",
370
+ headers: { "Content-Type": "application/json" },
371
+ body: JSON.stringify(body),
372
+ redirect: "manual",
373
+ signal: params.signal
374
+ ? AbortSignal.any([params.signal, requestTimeoutSignal])
375
+ : requestTimeoutSignal,
376
+ });
377
+ }
378
+ catch (error) {
379
+ const errorCode = sendTransportErrorCode(error);
380
+ const reason = describeCaughtValue(error);
381
+ emitBlueBubblesSendError({ status: null, errorCode, reason });
382
+ throw new BlueBubblesSendError({
383
+ message: `BlueBubbles send failed (${errorCode}): ${reason}`,
384
+ httpStatus: null,
385
+ errorCode,
386
+ transportInvoked: true,
387
+ cause: error,
388
+ });
389
+ }
249
390
  if (!response.ok) {
250
391
  const errorText = await response.text().catch(() => "");
251
- (0, runtime_1.emitNervesEvent)({
252
- level: "error",
253
- component: "senses",
254
- event: "senses.bluebubbles_send_error",
255
- message: "bluebubbles send failed",
256
- meta: {
257
- status: response.status,
258
- reason: errorText || "unknown",
259
- },
392
+ const reason = errorText || "unknown";
393
+ const errorCode = `http_${response.status}`;
394
+ emitBlueBubblesSendError({ status: response.status, errorCode, reason });
395
+ throw new BlueBubblesSendError({
396
+ message: `BlueBubbles send failed (${response.status}): ${reason}`,
397
+ httpStatus: response.status,
398
+ errorCode,
399
+ transportInvoked: true,
260
400
  });
261
- throw new Error(`BlueBubbles send failed (${response.status}): ${errorText || "unknown"}`);
262
401
  }
263
- const payload = await parseJsonBody(response);
402
+ const rawPayload = await response.text();
403
+ let payload = null;
404
+ if (rawPayload.trim()) {
405
+ try {
406
+ payload = JSON.parse(rawPayload);
407
+ }
408
+ catch (error) {
409
+ const errorCode = "malformed_response";
410
+ emitBlueBubblesSendError({ status: response.status, errorCode, reason: errorCode });
411
+ throw new BlueBubblesSendError({
412
+ message: `BlueBubbles send failed (${response.status}): malformed response`,
413
+ httpStatus: response.status,
414
+ errorCode,
415
+ transportInvoked: true,
416
+ cause: error,
417
+ });
418
+ }
419
+ }
264
420
  const messageGuid = extractMessageGuid(payload);
265
421
  (0, runtime_1.emitNervesEvent)({
266
422
  component: "senses",
@@ -271,9 +427,10 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
271
427
  messageGuid: messageGuid ?? null,
272
428
  },
273
429
  });
274
- return { messageGuid };
430
+ return { messageGuid, chatGuid: resolvedChatGuid };
275
431
  },
276
432
  async editMessage(params) {
433
+ await assertHostAccount();
277
434
  const messageGuid = params.messageGuid.trim();
278
435
  const text = params.text.trim();
279
436
  if (!messageGuid) {
@@ -299,30 +456,34 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
299
456
  throw new Error(`BlueBubbles edit failed (${response.status}): ${errorText || "unknown"}`);
300
457
  }
301
458
  },
302
- async setTyping(chat, typing) {
459
+ async setTyping(chat, typing, signal) {
460
+ await assertHostAccount();
303
461
  const resolvedChatGuid = await resolveChatGuid(chat, config, channelConfig);
304
462
  if (!resolvedChatGuid) {
305
463
  return;
306
464
  }
307
465
  const url = buildBlueBubblesApiUrl(config.serverUrl, `/api/v1/chat/${encodeURIComponent(resolvedChatGuid)}/typing`, config.password);
466
+ const requestTimeoutSignal = AbortSignal.timeout(channelConfig.requestTimeoutMs);
308
467
  const response = await fetch(url, {
309
468
  method: typing ? "POST" : "DELETE",
310
- signal: AbortSignal.timeout(channelConfig.requestTimeoutMs),
469
+ signal: signal ? AbortSignal.any([signal, requestTimeoutSignal]) : requestTimeoutSignal,
311
470
  });
312
471
  if (!response.ok) {
313
472
  const errorText = await response.text().catch(() => "");
314
473
  throw new Error(`BlueBubbles typing failed (${response.status}): ${errorText || "unknown"}`);
315
474
  }
316
475
  },
317
- async markChatRead(chat) {
476
+ async markChatRead(chat, signal) {
477
+ await assertHostAccount();
318
478
  const resolvedChatGuid = await resolveChatGuid(chat, config, channelConfig);
319
479
  if (!resolvedChatGuid) {
320
480
  return;
321
481
  }
322
482
  const url = buildBlueBubblesApiUrl(config.serverUrl, `/api/v1/chat/${encodeURIComponent(resolvedChatGuid)}/read`, config.password);
483
+ const requestTimeoutSignal = AbortSignal.timeout(channelConfig.requestTimeoutMs);
323
484
  const response = await fetch(url, {
324
485
  method: "POST",
325
- signal: AbortSignal.timeout(channelConfig.requestTimeoutMs),
486
+ signal: signal ? AbortSignal.any([signal, requestTimeoutSignal]) : requestTimeoutSignal,
326
487
  });
327
488
  if (!response.ok) {
328
489
  const errorText = await response.text().catch(() => "");
@@ -330,19 +491,19 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
330
491
  }
331
492
  },
332
493
  async checkHealth() {
333
- const url = buildBlueBubblesApiUrl(config.serverUrl, "/api/v1/message/count", config.password);
334
494
  (0, runtime_1.emitNervesEvent)({
335
495
  component: "senses",
336
496
  event: "senses.bluebubbles_healthcheck_start",
337
497
  message: "probing bluebubbles upstream health",
338
498
  meta: { serverUrl: config.serverUrl },
339
499
  });
340
- const response = await fetch(url, {
341
- method: "GET",
342
- signal: AbortSignal.timeout(channelConfig.requestTimeoutMs),
500
+ const result = await (0, bluebubbles_health_diagnostics_1.probeBlueBubblesHealth)({
501
+ serverUrl: config.serverUrl,
502
+ password: config.password,
503
+ requestTimeoutMs: channelConfig.requestTimeoutMs,
504
+ fetchImpl: fetch,
343
505
  });
344
- if (!response.ok) {
345
- const errorText = await response.text().catch(() => "");
506
+ if (!result.ok) {
346
507
  (0, runtime_1.emitNervesEvent)({
347
508
  level: "warn",
348
509
  component: "senses",
@@ -350,12 +511,15 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
350
511
  message: "bluebubbles upstream health probe failed",
351
512
  meta: {
352
513
  serverUrl: config.serverUrl,
353
- status: response.status,
354
- reason: errorText || "unknown",
514
+ status: result.status,
515
+ reason: result.reason,
516
+ classification: result.classification,
517
+ detail: (0, bluebubbles_health_diagnostics_1.redactBlueBubblesHealthDetailForNerves)(result.detail),
355
518
  },
356
519
  });
357
- throw new Error(`BlueBubbles upstream health check failed (${response.status}): ${errorText || "unknown"}`);
520
+ throw new Error(result.detail);
358
521
  }
522
+ await assertHostAccount();
359
523
  (0, runtime_1.emitNervesEvent)({
360
524
  component: "senses",
361
525
  event: "senses.bluebubbles_healthcheck_end",
@@ -363,6 +527,98 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
363
527
  meta: { serverUrl: config.serverUrl },
364
528
  });
365
529
  },
530
+ async queryRecentMessagesWithMetadata(params = {}) {
531
+ const limit = Math.max(1, Math.min(100, Math.floor(params.limit ?? 50)));
532
+ const offset = Math.max(0, Math.floor(params.offset ?? 0));
533
+ // Reading messages is gated like sending: never read another account's iMessages.
534
+ await assertHostAccount();
535
+ const url = buildBlueBubblesApiUrl(config.serverUrl, "/api/v1/message/query", config.password);
536
+ (0, runtime_1.emitNervesEvent)({
537
+ component: "senses",
538
+ event: "senses.bluebubbles_query_recent_start",
539
+ message: "querying recent bluebubbles messages",
540
+ meta: { limit, offset },
541
+ });
542
+ const request = {
543
+ limit,
544
+ offset,
545
+ sort: "DESC",
546
+ ...(params.chatGuid?.trim() ? { chatGuid: params.chatGuid.trim() } : {}),
547
+ ...(params.chatIdentifier?.trim() ? { chatIdentifier: params.chatIdentifier.trim() } : {}),
548
+ ...(typeof params.beforeTimestamp === "number" && Number.isFinite(params.beforeTimestamp)
549
+ ? { beforeTimestamp: params.beforeTimestamp }
550
+ : {}),
551
+ };
552
+ const { beforeTimestamp, ...wireRequest } = request;
553
+ const body = {
554
+ ...wireRequest,
555
+ // BlueBubbles names its inclusive message-date upper bound `before`.
556
+ ...(beforeTimestamp !== undefined ? { before: beforeTimestamp } : {}),
557
+ with: ["chats", "attachments", "payloadData", "messageSummaryInfo"],
558
+ };
559
+ const response = await fetch(url, {
560
+ method: "POST",
561
+ headers: { "Content-Type": "application/json" },
562
+ body: JSON.stringify(body),
563
+ signal: AbortSignal.timeout(channelConfig.requestTimeoutMs),
564
+ });
565
+ if (!response.ok) {
566
+ const errorText = await response.text().catch(() => "");
567
+ (0, runtime_1.emitNervesEvent)({
568
+ level: "warn",
569
+ component: "senses",
570
+ event: "senses.bluebubbles_query_recent_error",
571
+ message: "bluebubbles recent message query failed",
572
+ meta: {
573
+ status: response.status,
574
+ reason: errorText || "unknown",
575
+ },
576
+ });
577
+ throw new Error(`BlueBubbles recent message query failed (${response.status}): ${errorText || "unknown"}`);
578
+ }
579
+ const payload = await parseJsonBody(response);
580
+ const rows = extractMessageQueryRows(payload);
581
+ const invalidCausalTimestampRowCount = rows.filter((row) => !hasValidRawMessageCausalTimestamp(row)).length;
582
+ const messages = [];
583
+ for (const row of rows) {
584
+ try {
585
+ messages.push((0, model_1.normalizeBlueBubblesEvent)({ type: "new-message", data: row }));
586
+ }
587
+ catch (error) {
588
+ (0, runtime_1.emitNervesEvent)({
589
+ level: "warn",
590
+ component: "senses",
591
+ event: "senses.bluebubbles_query_recent_skip",
592
+ message: "skipped unusable bluebubbles recent message row",
593
+ meta: {
594
+ reason: describeCaughtValue(error),
595
+ },
596
+ });
597
+ }
598
+ }
599
+ (0, runtime_1.emitNervesEvent)({
600
+ component: "senses",
601
+ event: "senses.bluebubbles_query_recent_end",
602
+ message: "queried recent bluebubbles messages",
603
+ meta: {
604
+ rows: rows.length,
605
+ normalized: messages.length,
606
+ skipped: rows.length - messages.length,
607
+ },
608
+ });
609
+ return {
610
+ messages,
611
+ rawRowCount: rows.length,
612
+ normalizedRowCount: messages.length,
613
+ skippedRowCount: rows.length - messages.length,
614
+ invalidCausalTimestampRowCount,
615
+ request,
616
+ };
617
+ },
618
+ async listRecentMessages(params = {}) {
619
+ const result = await this.queryRecentMessagesWithMetadata(params);
620
+ return result.messages;
621
+ },
366
622
  async repairEvent(event) {
367
623
  if (!event.requiresRepair) {
368
624
  (0, runtime_1.emitNervesEvent)({
@@ -377,6 +633,7 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
377
633
  return event;
378
634
  }
379
635
  (0, runtime_1.emitNervesEvent)({
636
+ level: "warn",
380
637
  component: "senses",
381
638
  event: "senses.bluebubbles_repair_start",
382
639
  message: "repairing bluebubbles event by guid",
@@ -386,6 +643,7 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
386
643
  eventType: event.eventType,
387
644
  },
388
645
  });
646
+ await assertHostAccount();
389
647
  const url = buildRepairUrl(config.serverUrl, event.messageGuid, config.password);
390
648
  try {
391
649
  const response = await fetch(url, {
@@ -423,13 +681,13 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
423
681
  });
424
682
  return repaired;
425
683
  }
426
- const normalized = (0, bluebubbles_model_1.normalizeBlueBubblesEvent)({
684
+ const normalized = (0, model_1.normalizeBlueBubblesEvent)({
427
685
  type: event.eventType,
428
686
  data,
429
687
  });
430
688
  const recoveredMessage = event.kind === "mutation"
431
689
  && !event.shouldNotifyAgent
432
- ? (0, bluebubbles_model_1.normalizeBlueBubblesEvent)({
690
+ ? (0, model_1.normalizeBlueBubblesEvent)({
433
691
  type: "new-message",
434
692
  data,
435
693
  })
@@ -440,8 +698,42 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
440
698
  if (hydrated.kind === "message" &&
441
699
  hydrated.balloonBundleId !== "com.apple.messages.URLBalloonProvider" &&
442
700
  hydrated.attachments.length > 0) {
443
- const media = await (0, bluebubbles_media_1.hydrateBlueBubblesAttachments)(hydrated.attachments, config, channelConfig, {
444
- preferAudioInput: providerSupportsAudioInput((0, identity_1.loadAgentConfig)().provider),
701
+ const agentConfig = (0, identity_1.loadAgentConfig)();
702
+ const chatModel = agentConfig.humanFacing.model;
703
+ const chatProvider = agentConfig.humanFacing.provider;
704
+ const vlmDescribe = async (params) => {
705
+ if (chatProvider !== "minimax") {
706
+ throw new Error("VLM fallback requires a minimax credential for this agent — " +
707
+ "configure one or switch to a vision-capable chat model");
708
+ }
709
+ const { readProviderCredentialRecord } = await Promise.resolve().then(() => __importStar(require("../../heart/provider-credentials")));
710
+ const credential = await readProviderCredentialRecord((0, identity_1.getAgentName)(), "minimax");
711
+ const apiKey = credential.ok ? credential.record.credentials.apiKey : undefined;
712
+ if (!apiKey) {
713
+ throw new Error("VLM fallback: minimax API key not found in the agent vault — " +
714
+ "run `ouro auth --agent <agent> --provider minimax`");
715
+ }
716
+ return (0, minimax_vlm_1.minimaxVlmDescribe)({
717
+ apiKey: String(apiKey),
718
+ prompt: params.prompt,
719
+ imageDataUrl: params.imageDataUrl,
720
+ baseURL: minimax_1.MINIMAX_PROVIDER_BASE_URL,
721
+ attachmentGuid: params.attachmentGuid,
722
+ mimeType: params.mimeType,
723
+ chatModel: params.chatModel,
724
+ });
725
+ };
726
+ // VLM prompt context wants the user's raw inbound text — NOT
727
+ // the agent-facing rendering, which now carries the attachment
728
+ // marker after the B2 fix. Pull it from the source payload.
729
+ const rawUserText = typeof data.text === "string"
730
+ ? (data.text).trim()
731
+ : "";
732
+ const media = await (0, media_1.hydrateBlueBubblesAttachments)(hydrated.attachments, config, channelConfig, {
733
+ preferAudioInput: providerSupportsAudioInput(chatProvider),
734
+ chatModel,
735
+ vlmDescribe,
736
+ userText: rawUserText,
445
737
  });
446
738
  const transcriptSuffix = media.transcriptAdditions.map((entry) => `[${entry}]`).join("\n");
447
739
  const noticeSuffix = media.notices.map((entry) => `[${entry}]`).join("\n");
@@ -453,6 +745,7 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
453
745
  };
454
746
  }
455
747
  (0, runtime_1.emitNervesEvent)({
748
+ level: "warn",
456
749
  component: "senses",
457
750
  event: "senses.bluebubbles_repair_end",
458
751
  message: "bluebubbles event repaired",
@@ -480,5 +773,54 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
480
773
  return applyRepairNotice(event, `BlueBubbles repair failed: ${reason}`);
481
774
  }
482
775
  },
776
+ async getMessageText(messageGuid) {
777
+ await assertHostAccount();
778
+ const url = buildRepairUrl(config.serverUrl, messageGuid, config.password);
779
+ try {
780
+ const response = await fetch(url, {
781
+ method: "GET",
782
+ signal: AbortSignal.timeout(channelConfig.requestTimeoutMs),
783
+ });
784
+ if (!response.ok) {
785
+ (0, runtime_1.emitNervesEvent)({
786
+ level: "warn",
787
+ component: "senses",
788
+ event: "senses.bluebubbles_get_message_text_error",
789
+ message: "failed to fetch message text",
790
+ meta: { messageGuid, status: response.status },
791
+ });
792
+ return null;
793
+ }
794
+ const payload = await parseJsonBody(response);
795
+ const data = extractRepairData(payload);
796
+ if (!data || typeof data.text !== "string") {
797
+ (0, runtime_1.emitNervesEvent)({
798
+ level: "warn",
799
+ component: "senses",
800
+ event: "senses.bluebubbles_get_message_text_error",
801
+ message: "message payload missing text field",
802
+ meta: { messageGuid, hasData: !!data, textType: data ? typeof data.text : "n/a" },
803
+ });
804
+ return null;
805
+ }
806
+ (0, runtime_1.emitNervesEvent)({
807
+ component: "senses",
808
+ event: "senses.bluebubbles_get_message_text",
809
+ message: "fetched message text by guid",
810
+ meta: { messageGuid },
811
+ });
812
+ return data.text.trim() || null;
813
+ }
814
+ catch (error) {
815
+ (0, runtime_1.emitNervesEvent)({
816
+ level: "warn",
817
+ component: "senses",
818
+ event: "senses.bluebubbles_get_message_text_error",
819
+ message: "exception fetching message text",
820
+ meta: { messageGuid, reason: error instanceof Error ? error.message : String(error) },
821
+ });
822
+ return null;
823
+ }
824
+ },
483
825
  };
484
826
  }