@ouro.bot/cli 0.1.0-alpha.71 → 0.1.0-alpha.711

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 +4516 -14
  13. package/dist/a2a/card.js +57 -0
  14. package/dist/a2a/client.js +180 -0
  15. package/dist/a2a/config.js +50 -0
  16. package/dist/a2a/delegation-stores.js +56 -0
  17. package/dist/a2a/did-resolution.js +93 -0
  18. package/dist/a2a/identity.js +170 -0
  19. package/dist/a2a/inbound-share.js +107 -0
  20. package/dist/a2a/mission-result-wire.js +196 -0
  21. package/dist/a2a/onboarding.js +115 -0
  22. package/dist/a2a/pin-store.js +132 -0
  23. package/dist/a2a/seen-ledger.js +120 -0
  24. package/dist/a2a/server.js +604 -0
  25. package/dist/a2a/task-store.js +69 -0
  26. package/dist/a2a/transport.js +45 -0
  27. package/dist/a2a/types.js +3 -0
  28. package/dist/arc/attention-types.js +8 -0
  29. package/dist/arc/cares.js +144 -0
  30. package/dist/arc/episodes.js +118 -0
  31. package/dist/arc/evolution.js +490 -0
  32. package/dist/arc/flight-recorder.js +928 -0
  33. package/dist/arc/intentions.js +134 -0
  34. package/dist/arc/json-store.js +117 -0
  35. package/dist/arc/obligations.js +348 -0
  36. package/dist/arc/packets.js +336 -0
  37. package/dist/arc/presence.js +185 -0
  38. package/dist/arc/task-lifecycle.js +57 -0
  39. package/dist/commerce/store.js +755 -0
  40. package/dist/commerce/types.js +3 -0
  41. package/dist/heart/active-work.js +867 -43
  42. package/dist/heart/agent-entry.js +190 -3
  43. package/dist/heart/attachments/image-normalize.js +194 -0
  44. package/dist/heart/attachments/materialize.js +97 -0
  45. package/dist/heart/attachments/originals.js +88 -0
  46. package/dist/heart/attachments/render.js +29 -0
  47. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  48. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  49. package/dist/heart/attachments/sources/index.js +16 -0
  50. package/dist/heart/attachments/store.js +103 -0
  51. package/dist/heart/attachments/types.js +93 -0
  52. package/dist/heart/auth/auth-flow.js +479 -0
  53. package/dist/heart/autonomy-budget.js +434 -0
  54. package/dist/heart/awaiting/await-alert.js +146 -0
  55. package/dist/heart/awaiting/await-expiry.js +108 -0
  56. package/dist/heart/awaiting/await-loader.js +91 -0
  57. package/dist/heart/awaiting/await-parser.js +141 -0
  58. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  59. package/dist/heart/awaiting/await-scheduler.js +378 -0
  60. package/dist/heart/background-operations.js +281 -0
  61. package/dist/heart/bridges/manager.js +137 -17
  62. package/dist/heart/bridges/store.js +14 -2
  63. package/dist/heart/bundle-state.js +168 -0
  64. package/dist/heart/commitments.js +135 -0
  65. package/dist/heart/config-registry.js +331 -0
  66. package/dist/heart/config.js +119 -127
  67. package/dist/heart/context-loss-gauntlet.js +354 -0
  68. package/dist/heart/context-loss-sentinel.js +1155 -0
  69. package/dist/heart/core.js +1306 -278
  70. package/dist/heart/cross-chat-delivery.js +8 -22
  71. package/dist/heart/daemon/agent-config-check.js +451 -0
  72. package/dist/heart/daemon/agent-discovery.js +185 -3
  73. package/dist/heart/daemon/agent-service.js +523 -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 +8194 -0
  82. package/dist/heart/daemon/cli-help.js +678 -0
  83. package/dist/heart/daemon/cli-parse.js +2476 -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 -1943
  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 +297 -0
  111. package/dist/heart/daemon/message-router.js +45 -5
  112. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  113. package/dist/heart/daemon/os-cron-deps.js +135 -0
  114. package/dist/heart/daemon/os-cron.js +22 -14
  115. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  116. package/dist/heart/daemon/ouro-entry.js +3 -1
  117. package/dist/heart/daemon/plugin-cli.js +432 -0
  118. package/dist/heart/daemon/process-manager.js +519 -40
  119. package/dist/heart/daemon/provider-discovery.js +137 -0
  120. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  121. package/dist/heart/daemon/pulse.js +511 -0
  122. package/dist/heart/daemon/readiness-repair.js +365 -0
  123. package/dist/heart/daemon/run-hooks.js +2 -0
  124. package/dist/heart/daemon/runtime-logging.js +41 -14
  125. package/dist/heart/daemon/runtime-metadata.js +2 -30
  126. package/dist/heart/daemon/safe-mode.js +161 -0
  127. package/dist/heart/daemon/sense-manager.js +670 -48
  128. package/dist/heart/daemon/session-id-resolver.js +131 -0
  129. package/dist/heart/daemon/skill-management-installer.js +1 -1
  130. package/dist/heart/daemon/socket-client.js +171 -12
  131. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  132. package/dist/heart/daemon/startup-tui.js +338 -0
  133. package/dist/heart/daemon/task-scheduler.js +117 -39
  134. package/dist/heart/daemon/terminal-ui.js +499 -0
  135. package/dist/heart/daemon/thoughts.js +255 -43
  136. package/dist/heart/daemon/up-progress.js +366 -0
  137. package/dist/heart/daemon/vault-items.js +56 -0
  138. package/dist/heart/delegation.js +1 -4
  139. package/dist/heart/external-events/router.js +121 -0
  140. package/dist/heart/habits/habit-migration.js +189 -0
  141. package/dist/heart/habits/habit-parser.js +214 -0
  142. package/dist/heart/habits/habit-runtime-state.js +114 -0
  143. package/dist/heart/habits/habit-scheduler.js +431 -0
  144. package/dist/heart/habits/habit-session-summary.js +318 -0
  145. package/dist/heart/habits/habit-session.js +617 -0
  146. package/dist/heart/{daemon → hatch}/hatch-flow.js +51 -60
  147. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  148. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  149. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  150. package/dist/heart/identity.js +174 -59
  151. package/dist/heart/kept-notes.js +289 -0
  152. package/dist/heart/kicks.js +1 -1
  153. package/dist/heart/machine-identity.js +161 -0
  154. package/dist/heart/mail-import-discovery.js +353 -0
  155. package/dist/heart/mailbox/mailbox-http-hooks.js +96 -0
  156. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  157. package/dist/heart/mailbox/mailbox-http-routes.js +375 -0
  158. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  159. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  160. package/dist/heart/mailbox/mailbox-http.js +99 -0
  161. package/dist/heart/mailbox/mailbox-read.js +37 -0
  162. package/dist/heart/mailbox/mailbox-types.js +27 -0
  163. package/dist/heart/mailbox/mailbox-view.js +197 -0
  164. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  165. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  166. package/dist/heart/mailbox/readers/mail.js +375 -0
  167. package/dist/heart/mailbox/readers/runtime-readers.js +815 -0
  168. package/dist/heart/mailbox/readers/sessions.js +232 -0
  169. package/dist/heart/mailbox/readers/shared.js +111 -0
  170. package/dist/heart/mcp/mcp-server.js +696 -0
  171. package/dist/heart/migrate-config.js +100 -0
  172. package/dist/heart/model-capabilities.js +11 -0
  173. package/dist/heart/orientation-frame.js +217 -0
  174. package/dist/heart/platform.js +81 -0
  175. package/dist/heart/primitives.js +1 -1
  176. package/dist/heart/private-runtime/decision-renderer.js +156 -0
  177. package/dist/heart/private-runtime/index.js +18 -0
  178. package/dist/heart/private-runtime/ledger.js +218 -0
  179. package/dist/heart/private-runtime/policy.js +214 -0
  180. package/dist/heart/private-runtime/types.js +2 -0
  181. package/dist/heart/progress-story.js +1 -1
  182. package/dist/heart/provider-attempt.js +134 -0
  183. package/dist/heart/provider-binding-resolver.js +273 -0
  184. package/dist/heart/provider-credentials.js +441 -0
  185. package/dist/heart/provider-failover.js +311 -0
  186. package/dist/heart/provider-models.js +81 -0
  187. package/dist/heart/provider-ping.js +262 -0
  188. package/dist/heart/provider-readiness-cache.js +119 -0
  189. package/dist/heart/provider-visibility.js +188 -0
  190. package/dist/heart/providers/anthropic-token.js +131 -0
  191. package/dist/heart/providers/anthropic.js +139 -52
  192. package/dist/heart/providers/azure.js +23 -11
  193. package/dist/heart/providers/error-classification.js +127 -0
  194. package/dist/heart/providers/github-copilot.js +34 -38
  195. package/dist/heart/providers/minimax-vlm.js +189 -0
  196. package/dist/heart/providers/minimax.js +26 -8
  197. package/dist/heart/providers/openai-codex-token.js +349 -0
  198. package/dist/heart/providers/openai-codex.js +55 -40
  199. package/dist/heart/run-ledger.js +247 -0
  200. package/dist/heart/runtime-capability-check.js +170 -0
  201. package/dist/heart/runtime-credentials.js +398 -0
  202. package/dist/heart/runtime-cwd.js +87 -0
  203. package/dist/heart/sense-truth.js +20 -4
  204. package/dist/heart/session-activity.js +90 -24
  205. package/dist/heart/session-events.js +1133 -0
  206. package/dist/heart/session-playback-cli-main.js +5 -0
  207. package/dist/heart/session-playback-cli.js +36 -0
  208. package/dist/heart/session-playback.js +231 -0
  209. package/dist/heart/session-stats-cli-main.js +5 -0
  210. package/dist/heart/session-stats.js +182 -0
  211. package/dist/heart/session-transcript.js +133 -0
  212. package/dist/heart/start-of-turn-packet.js +365 -0
  213. package/dist/heart/streaming.js +44 -27
  214. package/dist/heart/structured-output.js +196 -0
  215. package/dist/heart/sync-classification.js +176 -0
  216. package/dist/heart/sync.js +449 -0
  217. package/dist/heart/target-resolution.js +11 -7
  218. package/dist/heart/tempo.js +93 -0
  219. package/dist/heart/temporal-view.js +41 -0
  220. package/dist/heart/timeouts.js +101 -0
  221. package/dist/heart/tool-activity-callbacks.js +59 -0
  222. package/dist/heart/tool-description.js +155 -0
  223. package/dist/heart/tool-friction.js +55 -0
  224. package/dist/heart/tool-loop.js +200 -0
  225. package/dist/heart/turn-context.js +472 -0
  226. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  227. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  228. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  229. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  230. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  231. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  232. package/dist/heart/versioning/update-hooks.js +154 -0
  233. package/dist/heart/work-card.js +380 -0
  234. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  235. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  236. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  237. package/dist/mailbox-ui/index.html +16 -0
  238. package/dist/mailroom/attention.js +167 -0
  239. package/dist/mailroom/autonomy.js +209 -0
  240. package/dist/mailroom/blob-store.js +715 -0
  241. package/dist/mailroom/body-cache.js +61 -0
  242. package/dist/mailroom/core.js +788 -0
  243. package/dist/mailroom/entry.js +160 -0
  244. package/dist/mailroom/file-store.js +568 -0
  245. package/dist/mailroom/mbox-import.js +393 -0
  246. package/dist/mailroom/migration.js +164 -0
  247. package/dist/mailroom/outbound.js +380 -0
  248. package/dist/mailroom/policy.js +263 -0
  249. package/dist/mailroom/reader.js +233 -0
  250. package/dist/mailroom/search-cache.js +334 -0
  251. package/dist/mailroom/search-relevance.js +319 -0
  252. package/dist/mailroom/smtp-ingress.js +176 -0
  253. package/dist/mailroom/source-state.js +176 -0
  254. package/dist/mailroom/thread.js +109 -0
  255. package/dist/mailroom/travel-extract.js +89 -0
  256. package/dist/mind/bundle-manifest.js +24 -2
  257. package/dist/mind/context.js +250 -101
  258. package/dist/mind/desk-section.js +362 -0
  259. package/dist/mind/diary-integrity.js +60 -0
  260. package/dist/mind/{memory.js → diary.js} +68 -77
  261. package/dist/mind/embedding-provider.js +60 -0
  262. package/dist/mind/file-state.js +179 -0
  263. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  264. package/dist/mind/obligation-steering.js +221 -0
  265. package/dist/mind/pending.js +13 -8
  266. package/dist/mind/prompt-budget.js +380 -0
  267. package/dist/mind/prompt-refresh.js +3 -2
  268. package/dist/mind/prompt.js +1028 -169
  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 +156 -27
  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 +250 -80
  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 +758 -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 +161 -0
  362. package/dist/rsvp/habit-policy.js +85 -0
  363. package/dist/rsvp/habit-stage.js +98 -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 +321 -0
  367. package/dist/rsvp/outbound-state.js +268 -0
  368. package/dist/rsvp/query.js +118 -0
  369. package/dist/rsvp/replay.js +233 -0
  370. package/dist/rsvp/snapshot.js +232 -0
  371. package/dist/rsvp/spend-ledger.js +175 -0
  372. package/dist/scripts/claude-code-hook.js +41 -0
  373. package/dist/scripts/claude-code-stop-hook.js +47 -0
  374. package/dist/senses/a2a-entry.js +115 -0
  375. package/dist/senses/attention-queue.js +186 -0
  376. package/dist/senses/await-turn-message.js +58 -0
  377. package/dist/senses/bluebubbles/active-turns.js +216 -0
  378. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  379. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  380. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +226 -19
  381. package/dist/senses/bluebubbles/context-packet.js +101 -0
  382. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  383. package/dist/senses/bluebubbles/entry.js +77 -0
  384. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  385. package/dist/senses/bluebubbles/index.js +2881 -0
  386. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  387. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  388. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  389. package/dist/senses/bluebubbles/outbound-state.js +304 -0
  390. package/dist/senses/bluebubbles/processed-log.js +133 -0
  391. package/dist/senses/bluebubbles/replay.js +284 -0
  392. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  393. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  394. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  395. package/dist/senses/cli/bracketed-paste.js +82 -0
  396. package/dist/senses/cli/image-paste.js +287 -0
  397. package/dist/senses/cli/image-ref-navigation.js +75 -0
  398. package/dist/senses/cli/ink-app.js +156 -0
  399. package/dist/senses/cli/inline-diff.js +64 -0
  400. package/dist/senses/cli/input-keys.js +174 -0
  401. package/dist/senses/cli/kill-ring.js +86 -0
  402. package/dist/senses/cli/message-list.js +51 -0
  403. package/dist/senses/cli/ouro-tui.js +607 -0
  404. package/dist/senses/cli/spinner-imperative.js +135 -0
  405. package/dist/senses/cli/spinner.js +101 -0
  406. package/dist/senses/cli/status-line.js +60 -0
  407. package/dist/senses/cli/streaming-markdown.js +526 -0
  408. package/dist/senses/cli/tool-display.js +85 -0
  409. package/dist/senses/cli/tool-render.js +85 -0
  410. package/dist/senses/cli/tui-store.js +240 -0
  411. package/dist/senses/cli/virtual-list.js +35 -0
  412. package/dist/senses/cli-entry.js +60 -8
  413. package/dist/senses/cli-layout.js +100 -0
  414. package/dist/senses/cli.js +521 -214
  415. package/dist/senses/commands.js +66 -3
  416. package/dist/senses/context-packet-ledger.js +245 -0
  417. package/dist/senses/context-packets.js +154 -0
  418. package/dist/senses/habit-turn-message.js +160 -0
  419. package/dist/senses/mail-entry.js +66 -0
  420. package/dist/senses/mail.js +395 -0
  421. package/dist/senses/pipeline.js +952 -178
  422. package/dist/senses/private-runtime-worker.js +739 -0
  423. package/dist/senses/private-runtime.js +1157 -0
  424. package/dist/senses/proactive-content-guard.js +51 -0
  425. package/dist/senses/shared-turn.js +416 -0
  426. package/dist/senses/surface-tool.js +109 -0
  427. package/dist/senses/teams-entry.js +60 -8
  428. package/dist/senses/teams.js +397 -112
  429. package/dist/senses/trust-gate.js +104 -9
  430. package/dist/senses/voice/audio-playback.js +237 -0
  431. package/dist/senses/voice/audio-routing.js +119 -0
  432. package/dist/senses/voice/elevenlabs.js +202 -0
  433. package/dist/senses/voice/floor-control.js +431 -0
  434. package/dist/senses/voice/floor-controller.js +115 -0
  435. package/dist/senses/voice/golden-path.js +116 -0
  436. package/dist/senses/voice/index.js +29 -0
  437. package/dist/senses/voice/meeting.js +113 -0
  438. package/dist/senses/voice/outbound.js +190 -0
  439. package/dist/senses/voice/phone.js +33 -0
  440. package/dist/senses/voice/playback.js +139 -0
  441. package/dist/senses/voice/realtime-eval.js +496 -0
  442. package/dist/senses/voice/realtime-trace.js +531 -0
  443. package/dist/senses/voice/transcript.js +70 -0
  444. package/dist/senses/voice/turn.js +191 -0
  445. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  446. package/dist/senses/voice/twilio-phone.js +5081 -0
  447. package/dist/senses/voice/types.js +2 -0
  448. package/dist/senses/voice/whisper.js +161 -0
  449. package/dist/senses/voice-entry.js +81 -0
  450. package/dist/senses/voice-realtime-eval-command.js +99 -0
  451. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  452. package/dist/senses/voice-twilio-entry.js +87 -0
  453. package/dist/trips/core.js +138 -0
  454. package/dist/trips/store.js +265 -0
  455. package/dist/util/frontmatter.js +69 -0
  456. package/package.json +57 -12
  457. package/skills/agent-commerce.md +113 -0
  458. package/skills/browser-navigation.md +117 -0
  459. package/skills/commerce-setup-guide.md +116 -0
  460. package/skills/commerce-setup.md +84 -0
  461. package/skills/configure-dev-tools.md +99 -0
  462. package/skills/travel-planning.md +138 -0
  463. package/dist/heart/daemon/auth-flow.js +0 -409
  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
@@ -1,12 +1,48 @@
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 });
3
36
  exports.createBlueBubblesClient = createBlueBubblesClient;
4
37
  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");
38
+ const config_1 = require("../../heart/config");
39
+ const identity_1 = require("../../heart/identity");
40
+ const bluebubbles_health_diagnostics_1 = require("../../heart/daemon/bluebubbles-health-diagnostics");
41
+ const runtime_1 = require("../../nerves/runtime");
42
+ const minimax_1 = require("../../heart/providers/minimax");
43
+ const minimax_vlm_1 = require("../../heart/providers/minimax-vlm");
44
+ const model_1 = require("./model");
45
+ const media_1 = require("./media");
10
46
  function buildBlueBubblesApiUrl(baseUrl, endpoint, password) {
11
47
  const root = baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
12
48
  const url = new URL(endpoint.replace(/^\//, ""), root);
@@ -55,6 +91,9 @@ async function parseJsonBody(response) {
55
91
  return null;
56
92
  }
57
93
  }
94
+ function describeCaughtValue(error) {
95
+ return error instanceof Error ? error.message : String(error);
96
+ }
58
97
  function buildRepairUrl(baseUrl, messageGuid, password) {
59
98
  const url = buildBlueBubblesApiUrl(baseUrl, `/api/v1/message/${encodeURIComponent(messageGuid)}`, password);
60
99
  const parsed = new URL(url);
@@ -99,6 +138,17 @@ function extractChatQueryRows(payload) {
99
138
  }
100
139
  return data.map((entry) => asRecord(entry)).filter((entry) => entry !== null);
101
140
  }
141
+ function extractMessageQueryRows(payload) {
142
+ const record = asRecord(payload);
143
+ const data = asRecord(record?.data);
144
+ const rows = Array.isArray(record?.data) ? record.data
145
+ : Array.isArray(data?.messages) ? data.messages
146
+ : Array.isArray(data?.results) ? data.results
147
+ : Array.isArray(record?.messages) ? record.messages
148
+ : Array.isArray(payload) ? payload
149
+ : [];
150
+ return rows.map((entry) => asRecord(entry)).filter((entry) => entry !== null);
151
+ }
102
152
  async function resolveChatGuidForIdentifier(config, channelConfig, chatIdentifier) {
103
153
  const trimmedIdentifier = chatIdentifier.trim();
104
154
  if (!trimmedIdentifier)
@@ -223,7 +273,7 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
223
273
  const url = buildBlueBubblesApiUrl(config.serverUrl, "/api/v1/message/text", config.password);
224
274
  const body = {
225
275
  chatGuid: resolvedChatGuid,
226
- tempGuid: (0, node_crypto_1.randomUUID)(),
276
+ tempGuid: params.tempGuid?.trim() || (0, node_crypto_1.randomUUID)(),
227
277
  message: trimmedText,
228
278
  };
229
279
  if (params.replyToMessageGuid?.trim()) {
@@ -330,19 +380,19 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
330
380
  }
331
381
  },
332
382
  async checkHealth() {
333
- const url = buildBlueBubblesApiUrl(config.serverUrl, "/api/v1/message/count", config.password);
334
383
  (0, runtime_1.emitNervesEvent)({
335
384
  component: "senses",
336
385
  event: "senses.bluebubbles_healthcheck_start",
337
386
  message: "probing bluebubbles upstream health",
338
387
  meta: { serverUrl: config.serverUrl },
339
388
  });
340
- const response = await fetch(url, {
341
- method: "GET",
342
- signal: AbortSignal.timeout(channelConfig.requestTimeoutMs),
389
+ const result = await (0, bluebubbles_health_diagnostics_1.probeBlueBubblesHealth)({
390
+ serverUrl: config.serverUrl,
391
+ password: config.password,
392
+ requestTimeoutMs: channelConfig.requestTimeoutMs,
393
+ fetchImpl: fetch,
343
394
  });
344
- if (!response.ok) {
345
- const errorText = await response.text().catch(() => "");
395
+ if (!result.ok) {
346
396
  (0, runtime_1.emitNervesEvent)({
347
397
  level: "warn",
348
398
  component: "senses",
@@ -350,11 +400,13 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
350
400
  message: "bluebubbles upstream health probe failed",
351
401
  meta: {
352
402
  serverUrl: config.serverUrl,
353
- status: response.status,
354
- reason: errorText || "unknown",
403
+ status: result.status,
404
+ reason: result.reason,
405
+ classification: result.classification,
406
+ detail: (0, bluebubbles_health_diagnostics_1.redactBlueBubblesHealthDetailForNerves)(result.detail),
355
407
  },
356
408
  });
357
- throw new Error(`BlueBubbles upstream health check failed (${response.status}): ${errorText || "unknown"}`);
409
+ throw new Error(result.detail);
358
410
  }
359
411
  (0, runtime_1.emitNervesEvent)({
360
412
  component: "senses",
@@ -363,6 +415,77 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
363
415
  meta: { serverUrl: config.serverUrl },
364
416
  });
365
417
  },
418
+ async listRecentMessages(params = {}) {
419
+ const limit = Math.max(1, Math.min(100, Math.floor(params.limit ?? 50)));
420
+ const offset = Math.max(0, Math.floor(params.offset ?? 0));
421
+ const url = buildBlueBubblesApiUrl(config.serverUrl, "/api/v1/message/query", config.password);
422
+ (0, runtime_1.emitNervesEvent)({
423
+ component: "senses",
424
+ event: "senses.bluebubbles_query_recent_start",
425
+ message: "querying recent bluebubbles messages",
426
+ meta: { limit, offset },
427
+ });
428
+ const body = {
429
+ limit,
430
+ offset,
431
+ sort: "DESC",
432
+ ...(params.chatGuid?.trim() ? { chatGuid: params.chatGuid.trim() } : {}),
433
+ ...(params.chatIdentifier?.trim() ? { chatIdentifier: params.chatIdentifier.trim() } : {}),
434
+ ...(typeof params.beforeTimestamp === "number" && Number.isFinite(params.beforeTimestamp)
435
+ ? { beforeTimestamp: params.beforeTimestamp }
436
+ : {}),
437
+ with: ["chats", "attachments", "payloadData", "messageSummaryInfo"],
438
+ };
439
+ const response = await fetch(url, {
440
+ method: "POST",
441
+ headers: { "Content-Type": "application/json" },
442
+ body: JSON.stringify(body),
443
+ signal: AbortSignal.timeout(channelConfig.requestTimeoutMs),
444
+ });
445
+ if (!response.ok) {
446
+ const errorText = await response.text().catch(() => "");
447
+ (0, runtime_1.emitNervesEvent)({
448
+ level: "warn",
449
+ component: "senses",
450
+ event: "senses.bluebubbles_query_recent_error",
451
+ message: "bluebubbles recent message query failed",
452
+ meta: {
453
+ status: response.status,
454
+ reason: errorText || "unknown",
455
+ },
456
+ });
457
+ throw new Error(`BlueBubbles recent message query failed (${response.status}): ${errorText || "unknown"}`);
458
+ }
459
+ const payload = await parseJsonBody(response);
460
+ const rows = extractMessageQueryRows(payload);
461
+ const messages = [];
462
+ for (const row of rows) {
463
+ try {
464
+ messages.push((0, model_1.normalizeBlueBubblesEvent)({ type: "new-message", data: row }));
465
+ }
466
+ catch (error) {
467
+ (0, runtime_1.emitNervesEvent)({
468
+ level: "warn",
469
+ component: "senses",
470
+ event: "senses.bluebubbles_query_recent_skip",
471
+ message: "skipped unusable bluebubbles recent message row",
472
+ meta: {
473
+ reason: describeCaughtValue(error),
474
+ },
475
+ });
476
+ }
477
+ }
478
+ (0, runtime_1.emitNervesEvent)({
479
+ component: "senses",
480
+ event: "senses.bluebubbles_query_recent_end",
481
+ message: "queried recent bluebubbles messages",
482
+ meta: {
483
+ rows: rows.length,
484
+ normalized: messages.length,
485
+ },
486
+ });
487
+ return messages;
488
+ },
366
489
  async repairEvent(event) {
367
490
  if (!event.requiresRepair) {
368
491
  (0, runtime_1.emitNervesEvent)({
@@ -377,6 +500,7 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
377
500
  return event;
378
501
  }
379
502
  (0, runtime_1.emitNervesEvent)({
503
+ level: "warn",
380
504
  component: "senses",
381
505
  event: "senses.bluebubbles_repair_start",
382
506
  message: "repairing bluebubbles event by guid",
@@ -423,13 +547,13 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
423
547
  });
424
548
  return repaired;
425
549
  }
426
- const normalized = (0, bluebubbles_model_1.normalizeBlueBubblesEvent)({
550
+ const normalized = (0, model_1.normalizeBlueBubblesEvent)({
427
551
  type: event.eventType,
428
552
  data,
429
553
  });
430
554
  const recoveredMessage = event.kind === "mutation"
431
555
  && !event.shouldNotifyAgent
432
- ? (0, bluebubbles_model_1.normalizeBlueBubblesEvent)({
556
+ ? (0, model_1.normalizeBlueBubblesEvent)({
433
557
  type: "new-message",
434
558
  data,
435
559
  })
@@ -440,8 +564,42 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
440
564
  if (hydrated.kind === "message" &&
441
565
  hydrated.balloonBundleId !== "com.apple.messages.URLBalloonProvider" &&
442
566
  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),
567
+ const agentConfig = (0, identity_1.loadAgentConfig)();
568
+ const chatModel = agentConfig.humanFacing.model;
569
+ const chatProvider = agentConfig.humanFacing.provider;
570
+ const vlmDescribe = async (params) => {
571
+ if (chatProvider !== "minimax") {
572
+ throw new Error("VLM fallback requires a minimax credential for this agent — " +
573
+ "configure one or switch to a vision-capable chat model");
574
+ }
575
+ const { readProviderCredentialRecord } = await Promise.resolve().then(() => __importStar(require("../../heart/provider-credentials")));
576
+ const credential = await readProviderCredentialRecord((0, identity_1.getAgentName)(), "minimax");
577
+ const apiKey = credential.ok ? credential.record.credentials.apiKey : undefined;
578
+ if (!apiKey) {
579
+ throw new Error("VLM fallback: minimax API key not found in the agent vault — " +
580
+ "run `ouro auth --agent <agent> --provider minimax`");
581
+ }
582
+ return (0, minimax_vlm_1.minimaxVlmDescribe)({
583
+ apiKey: String(apiKey),
584
+ prompt: params.prompt,
585
+ imageDataUrl: params.imageDataUrl,
586
+ baseURL: minimax_1.MINIMAX_PROVIDER_BASE_URL,
587
+ attachmentGuid: params.attachmentGuid,
588
+ mimeType: params.mimeType,
589
+ chatModel: params.chatModel,
590
+ });
591
+ };
592
+ // VLM prompt context wants the user's raw inbound text — NOT
593
+ // the agent-facing rendering, which now carries the attachment
594
+ // marker after the B2 fix. Pull it from the source payload.
595
+ const rawUserText = typeof data.text === "string"
596
+ ? (data.text).trim()
597
+ : "";
598
+ const media = await (0, media_1.hydrateBlueBubblesAttachments)(hydrated.attachments, config, channelConfig, {
599
+ preferAudioInput: providerSupportsAudioInput(chatProvider),
600
+ chatModel,
601
+ vlmDescribe,
602
+ userText: rawUserText,
445
603
  });
446
604
  const transcriptSuffix = media.transcriptAdditions.map((entry) => `[${entry}]`).join("\n");
447
605
  const noticeSuffix = media.notices.map((entry) => `[${entry}]`).join("\n");
@@ -453,6 +611,7 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
453
611
  };
454
612
  }
455
613
  (0, runtime_1.emitNervesEvent)({
614
+ level: "warn",
456
615
  component: "senses",
457
616
  event: "senses.bluebubbles_repair_end",
458
617
  message: "bluebubbles event repaired",
@@ -480,5 +639,53 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
480
639
  return applyRepairNotice(event, `BlueBubbles repair failed: ${reason}`);
481
640
  }
482
641
  },
642
+ async getMessageText(messageGuid) {
643
+ const url = buildRepairUrl(config.serverUrl, messageGuid, config.password);
644
+ try {
645
+ const response = await fetch(url, {
646
+ method: "GET",
647
+ signal: AbortSignal.timeout(channelConfig.requestTimeoutMs),
648
+ });
649
+ if (!response.ok) {
650
+ (0, runtime_1.emitNervesEvent)({
651
+ level: "warn",
652
+ component: "senses",
653
+ event: "senses.bluebubbles_get_message_text_error",
654
+ message: "failed to fetch message text",
655
+ meta: { messageGuid, status: response.status },
656
+ });
657
+ return null;
658
+ }
659
+ const payload = await parseJsonBody(response);
660
+ const data = extractRepairData(payload);
661
+ if (!data || typeof data.text !== "string") {
662
+ (0, runtime_1.emitNervesEvent)({
663
+ level: "warn",
664
+ component: "senses",
665
+ event: "senses.bluebubbles_get_message_text_error",
666
+ message: "message payload missing text field",
667
+ meta: { messageGuid, hasData: !!data, textType: data ? typeof data.text : "n/a" },
668
+ });
669
+ return null;
670
+ }
671
+ (0, runtime_1.emitNervesEvent)({
672
+ component: "senses",
673
+ event: "senses.bluebubbles_get_message_text",
674
+ message: "fetched message text by guid",
675
+ meta: { messageGuid },
676
+ });
677
+ return data.text.trim() || null;
678
+ }
679
+ catch (error) {
680
+ (0, runtime_1.emitNervesEvent)({
681
+ level: "warn",
682
+ component: "senses",
683
+ event: "senses.bluebubbles_get_message_text_error",
684
+ message: "exception fetching message text",
685
+ meta: { messageGuid, reason: error instanceof Error ? error.message : String(error) },
686
+ });
687
+ return null;
688
+ }
689
+ },
483
690
  };
484
691
  }
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BLUEBUBBLES_CONTEXT_PACKET_MAX_AGE_MS = exports.BLUEBUBBLES_CONTEXT_PACKET_LIMIT = void 0;
4
+ exports.blueBubblesContextChatKey = blueBubblesContextChatKey;
5
+ exports.blueBubblesContextChatKeyHash = blueBubblesContextChatKeyHash;
6
+ exports.buildBlueBubblesContextPacket = buildBlueBubblesContextPacket;
7
+ const node_crypto_1 = require("node:crypto");
8
+ const runtime_1 = require("../../nerves/runtime");
9
+ const context_packets_1 = require("../context-packets");
10
+ exports.BLUEBUBBLES_CONTEXT_PACKET_LIMIT = 40;
11
+ exports.BLUEBUBBLES_CONTEXT_PACKET_MAX_AGE_MS = 48 * 60 * 60 * 1000;
12
+ function sha256Hex(input) {
13
+ return (0, node_crypto_1.createHash)("sha256").update(input).digest("hex");
14
+ }
15
+ function blueBubblesContextChatKey(event) {
16
+ return event.chat.chatGuid ?? event.chat.chatIdentifier ?? event.chat.sessionKey;
17
+ }
18
+ function blueBubblesContextChatKeyHash(event) {
19
+ return sha256Hex(blueBubblesContextChatKey(event));
20
+ }
21
+ function isSameBlueBubblesChat(candidate, anchor) {
22
+ return candidate.chat.sessionKey === anchor.chat.sessionKey
23
+ || (!!candidate.chat.chatGuid && candidate.chat.chatGuid === anchor.chat.chatGuid)
24
+ || (!!candidate.chat.chatIdentifier && candidate.chat.chatIdentifier === anchor.chat.chatIdentifier);
25
+ }
26
+ function contextAuthorLabel(event) {
27
+ if (event.fromMe)
28
+ return "Slugger";
29
+ return event.sender.displayName || event.sender.externalId || "Unknown";
30
+ }
31
+ function messageToContextInput(event, chatGuidHash) {
32
+ return {
33
+ timestamp: new Date(event.timestamp).toISOString(),
34
+ authorLabel: contextAuthorLabel(event),
35
+ body: event.textForAgent || event.text,
36
+ sourceRef: {
37
+ sense: "bluebubbles",
38
+ adapter: "bluebubbles-api-v1",
39
+ service: "imessage",
40
+ chatGuid: event.chat.chatGuid,
41
+ chatGuidHash,
42
+ messageGuid: event.messageGuid,
43
+ senderExternalIdHash: sha256Hex(event.sender.externalId || event.sender.rawId || "unknown"),
44
+ observedAt: new Date(event.timestamp).toISOString(),
45
+ },
46
+ };
47
+ }
48
+ async function buildBlueBubblesContextPacket(input) {
49
+ if (!Number.isFinite(input.event.timestamp))
50
+ return null;
51
+ if (!input.client.listRecentMessages)
52
+ return null;
53
+ const event = input.event;
54
+ const chatGuidHash = blueBubblesContextChatKeyHash(event);
55
+ const anchorTimestamp = new Date(event.timestamp).toISOString();
56
+ const candidates = await input.client.listRecentMessages({
57
+ beforeTimestamp: event.timestamp,
58
+ limit: exports.BLUEBUBBLES_CONTEXT_PACKET_LIMIT,
59
+ offset: 0,
60
+ ...(event.chat.chatGuid ? { chatGuid: event.chat.chatGuid } : {}),
61
+ ...(!event.chat.chatGuid && event.chat.chatIdentifier ? { chatIdentifier: event.chat.chatIdentifier } : {}),
62
+ });
63
+ const history = candidates
64
+ .filter((candidate) => candidate.kind === "message")
65
+ .filter((candidate) => isSameBlueBubblesChat(candidate, event))
66
+ .filter((candidate) => candidate.messageGuid !== event.messageGuid)
67
+ .filter((candidate) => candidate.timestamp <= event.timestamp)
68
+ .filter((candidate) => event.timestamp - candidate.timestamp <= exports.BLUEBUBBLES_CONTEXT_PACKET_MAX_AGE_MS);
69
+ if (history.length === 0)
70
+ return null;
71
+ const packet = (0, context_packets_1.buildSenseContextPacket)({
72
+ agent: input.agentName,
73
+ sense: "bluebubbles",
74
+ sessionKey: event.chat.sessionKey,
75
+ chatKeyHash: chatGuidHash,
76
+ anchorMessageGuid: event.messageGuid,
77
+ anchorTimestamp,
78
+ windowBeforeMessages: exports.BLUEBUBBLES_CONTEXT_PACKET_LIMIT,
79
+ windowBeforeMs: exports.BLUEBUBBLES_CONTEXT_PACKET_MAX_AGE_MS,
80
+ messages: history.map((candidate) => messageToContextInput(candidate, chatGuidHash)),
81
+ });
82
+ const rendered = (0, context_packets_1.renderSenseContextPacketForPrompt)(packet, {
83
+ redactionPatterns: [/password=[^\s]+/gi],
84
+ });
85
+ (0, runtime_1.emitNervesEvent)({
86
+ component: "senses",
87
+ event: "senses.bluebubbles_context_packet_built",
88
+ message: "built bluebubbles same-chat context packet",
89
+ meta: {
90
+ packetId: packet.packetId,
91
+ messageGuid: event.messageGuid,
92
+ contextMessages: history.length,
93
+ renderedMessages: rendered.stats.renderedMessages,
94
+ },
95
+ });
96
+ return {
97
+ packet,
98
+ rendered,
99
+ historyCount: history.length,
100
+ };
101
+ }
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.smokeBlueBubblesContext = smokeBlueBubblesContext;
4
+ exports.formatBlueBubblesContextSmokeText = formatBlueBubblesContextSmokeText;
5
+ const machine_identity_1 = require("../../heart/machine-identity");
6
+ const identity_1 = require("../../heart/identity");
7
+ const runtime_credentials_1 = require("../../heart/runtime-credentials");
8
+ const runtime_1 = require("../../nerves/runtime");
9
+ const context_packet_ledger_1 = require("../context-packet-ledger");
10
+ const client_1 = require("./client");
11
+ const context_packet_1 = require("./context-packet");
12
+ const model_1 = require("./model");
13
+ function requireMessageEvent(event, messageGuid) {
14
+ if (event.kind !== "message") {
15
+ throw new Error(`BlueBubbles context smoke requires a message event; ${messageGuid} repaired to ${event.kind}`);
16
+ }
17
+ }
18
+ function smokeResult(params, writeResult) {
19
+ return {
20
+ ok: true,
21
+ sideEffect: writeResult ? "private-runtime-ledger-write" : false,
22
+ ...params,
23
+ ...(writeResult ? {
24
+ ledgerPath: writeResult.ledgerPath,
25
+ packetPath: writeResult.packetPath,
26
+ receiptPath: writeResult.receiptPath,
27
+ } : {}),
28
+ };
29
+ }
30
+ async function smokeBlueBubblesContext(params, deps = {}) {
31
+ const agentName = params.agentName.trim();
32
+ const messageGuid = params.messageGuid.trim();
33
+ if (!agentName)
34
+ throw new Error("bluebubbles context-smoke requires agentName");
35
+ if (!messageGuid)
36
+ throw new Error("bluebubbles context-smoke requires messageGuid");
37
+ const setSmokeAgentName = deps.setAgentName ?? identity_1.setAgentName;
38
+ const resetSmokeIdentity = deps.resetIdentity ?? identity_1.resetIdentity;
39
+ const normalizeEvent = deps.normalizeEvent ?? model_1.normalizeBlueBubblesEvent;
40
+ const loadMachineId = deps.loadMachineId ?? (() => (0, machine_identity_1.loadOrCreateMachineIdentity)().machineId);
41
+ const refreshMachineRuntimeConfig = deps.refreshMachineRuntimeConfig ?? runtime_credentials_1.refreshMachineRuntimeCredentialConfig;
42
+ const resolveAgentRoot = deps.getAgentRoot ?? identity_1.getAgentRoot;
43
+ const writePacket = deps.writePacket ?? context_packet_ledger_1.writeSenseContextPacket;
44
+ const createDefaultClient = deps.createDefaultClient ?? client_1.createBlueBubblesClient;
45
+ (0, runtime_1.emitNervesEvent)({
46
+ component: "senses",
47
+ event: "senses.bluebubbles_context_smoke_start",
48
+ message: "starting bluebubbles context smoke",
49
+ meta: {
50
+ agentName,
51
+ messageGuid,
52
+ persist: params.persist === true,
53
+ },
54
+ });
55
+ setSmokeAgentName(agentName);
56
+ try {
57
+ if (!deps.createClient) {
58
+ const machineId = loadMachineId();
59
+ await refreshMachineRuntimeConfig(agentName, machineId, { preserveCachedOnFailure: true });
60
+ }
61
+ const client = deps.createClient ? deps.createClient() : createDefaultClient();
62
+ const probe = normalizeEvent({
63
+ type: "new-message",
64
+ data: {
65
+ guid: messageGuid,
66
+ hasPayloadData: true,
67
+ },
68
+ });
69
+ const event = await client.repairEvent(probe);
70
+ requireMessageEvent(event, messageGuid);
71
+ const built = await (0, context_packet_1.buildBlueBubblesContextPacket)({
72
+ agentName,
73
+ client,
74
+ event,
75
+ });
76
+ if (!built) {
77
+ throw new Error(`BlueBubbles context smoke found no same-thread history before ${messageGuid}`);
78
+ }
79
+ const writeResult = params.persist
80
+ ? writePacket(resolveAgentRoot(agentName), built.packet)
81
+ : undefined;
82
+ const result = smokeResult({
83
+ agentName,
84
+ messageGuid,
85
+ packetId: built.packet.packetId,
86
+ contextMessages: built.historyCount,
87
+ renderedMessages: built.rendered.stats.renderedMessages,
88
+ renderedCharacters: built.rendered.stats.outputCharacters,
89
+ omittedMessages: built.rendered.stats.omittedMessages,
90
+ truncatedMessages: built.rendered.stats.truncatedMessages,
91
+ }, writeResult);
92
+ (0, runtime_1.emitNervesEvent)({
93
+ component: "senses",
94
+ event: "senses.bluebubbles_context_smoke_end",
95
+ message: "completed bluebubbles context smoke",
96
+ meta: {
97
+ agentName,
98
+ messageGuid,
99
+ packetId: result.packetId,
100
+ contextMessages: result.contextMessages,
101
+ sideEffect: result.sideEffect,
102
+ },
103
+ });
104
+ return result;
105
+ }
106
+ catch (error) {
107
+ (0, runtime_1.emitNervesEvent)({
108
+ level: "warn",
109
+ component: "senses",
110
+ event: "senses.bluebubbles_context_smoke_error",
111
+ message: "bluebubbles context smoke failed",
112
+ meta: {
113
+ agentName,
114
+ messageGuid,
115
+ reason: error instanceof Error ? error.message : String(error),
116
+ },
117
+ });
118
+ throw error;
119
+ }
120
+ finally {
121
+ resetSmokeIdentity();
122
+ }
123
+ }
124
+ function formatBlueBubblesContextSmokeText(result) {
125
+ const lines = [
126
+ "bluebubbles context smoke passed",
127
+ `agent: ${result.agentName}`,
128
+ `message_guid: ${result.messageGuid}`,
129
+ `context_messages: ${result.contextMessages}`,
130
+ `packet_id: ${result.packetId}`,
131
+ `rendered_messages: ${result.renderedMessages}`,
132
+ `rendered_characters: ${result.renderedCharacters}`,
133
+ `truncated_messages: ${result.truncatedMessages}`,
134
+ `omitted_messages: ${result.omittedMessages}`,
135
+ `side_effect: ${result.sideEffect}`,
136
+ ];
137
+ if (result.ledgerPath)
138
+ lines.push(`ledger_path: ${result.ledgerPath}`);
139
+ if (result.packetPath)
140
+ lines.push(`packet_path: ${result.packetPath}`);
141
+ if (result.receiptPath)
142
+ lines.push(`receipt_path: ${result.receiptPath}`);
143
+ return lines.join("\n");
144
+ }
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ // Thin entrypoint for `npm run bluebubbles` / `node dist/senses/bluebubbles/entry.js --agent <name>`.
3
+ // Separated from index.ts so the BlueBubbles adapter stays testable.
4
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
5
+ if (k2 === undefined) k2 = k;
6
+ var desc = Object.getOwnPropertyDescriptor(m, k);
7
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
8
+ desc = { enumerable: true, get: function() { return m[k]; } };
9
+ }
10
+ Object.defineProperty(o, k2, desc);
11
+ }) : (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ o[k2] = m[k];
14
+ }));
15
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
16
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
17
+ }) : function(o, v) {
18
+ o["default"] = v;
19
+ });
20
+ var __importStar = (this && this.__importStar) || (function () {
21
+ var ownKeys = function(o) {
22
+ ownKeys = Object.getOwnPropertyNames || function (o) {
23
+ var ar = [];
24
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
25
+ return ar;
26
+ };
27
+ return ownKeys(o);
28
+ };
29
+ return function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
36
+ })();
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ const agentArgIndex = process.argv.indexOf("--agent");
39
+ const agentName = agentArgIndex >= 0 ? process.argv[agentArgIndex + 1] : undefined;
40
+ if (!agentName) {
41
+ // eslint-disable-next-line no-console -- pre-boot guard: --agent check before imports
42
+ console.error("Missing required --agent <name> argument.\nUsage: node dist/senses/bluebubbles/entry.js --agent ouroboros");
43
+ process.exit(1);
44
+ }
45
+ const runtime_logging_1 = require("../../heart/daemon/runtime-logging");
46
+ const runtime_1 = require("../../nerves/runtime");
47
+ (0, runtime_logging_1.configureDaemonRuntimeLogger)("bluebubbles");
48
+ (0, runtime_1.emitNervesEvent)({
49
+ component: "senses",
50
+ event: "senses.entry_boot",
51
+ message: "booting BlueBubbles entrypoint",
52
+ meta: { entry: "bluebubbles", agentName },
53
+ });
54
+ Promise.resolve().then(() => __importStar(require("../../heart/runtime-credentials"))).then(async ({ readMachineRuntimeCredentialConfig, refreshMachineRuntimeCredentialConfig, refreshRuntimeCredentialConfig, waitForRuntimeCredentialBootstrap, }) => {
55
+ await waitForRuntimeCredentialBootstrap(agentName);
56
+ const { loadOrCreateMachineIdentity } = await Promise.resolve().then(() => __importStar(require("../../heart/machine-identity")));
57
+ const machine = loadOrCreateMachineIdentity();
58
+ const machineConfig = readMachineRuntimeCredentialConfig(agentName);
59
+ if (!machineConfig.ok) {
60
+ await refreshMachineRuntimeCredentialConfig(agentName, machine.machineId, { preserveCachedOnFailure: true }).catch(() => undefined);
61
+ }
62
+ const { startBlueBubblesApp } = await Promise.resolve().then(() => __importStar(require("./index")));
63
+ await startBlueBubblesApp();
64
+ void refreshRuntimeCredentialConfig(agentName, { preserveCachedOnFailure: true }).catch(() => undefined);
65
+ })
66
+ .catch((error) => {
67
+ (0, runtime_1.emitNervesEvent)({
68
+ level: "error",
69
+ component: "senses",
70
+ event: "senses.entry_error",
71
+ message: "BlueBubbles entrypoint failed",
72
+ meta: { entry: "bluebubbles", agentName, error: error instanceof Error ? error.message : String(error) },
73
+ });
74
+ // eslint-disable-next-line no-console -- fatal startup guard for sense process
75
+ console.error(error instanceof Error ? error.message : String(error));
76
+ process.exit(1);
77
+ });