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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (505) hide show
  1. package/README.md +133 -23
  2. package/RepairGuide.ouro/agent.json +5 -0
  3. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  4. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  5. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  6. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  7. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  8. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  9. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  12. package/changelog.json +4569 -14
  13. package/dist/a2a/card.js +57 -0
  14. package/dist/a2a/client.js +180 -0
  15. package/dist/a2a/config.js +50 -0
  16. package/dist/a2a/delegation-stores.js +56 -0
  17. package/dist/a2a/did-resolution.js +93 -0
  18. package/dist/a2a/identity.js +170 -0
  19. package/dist/a2a/inbound-share.js +107 -0
  20. package/dist/a2a/mission-result-wire.js +196 -0
  21. package/dist/a2a/onboarding.js +115 -0
  22. package/dist/a2a/pin-store.js +132 -0
  23. package/dist/a2a/seen-ledger.js +120 -0
  24. package/dist/a2a/server.js +604 -0
  25. package/dist/a2a/task-store.js +69 -0
  26. package/dist/a2a/transport.js +45 -0
  27. package/dist/a2a/types.js +3 -0
  28. package/dist/arc/attention-types.js +8 -0
  29. package/dist/arc/cares.js +144 -0
  30. package/dist/arc/episodes.js +118 -0
  31. package/dist/arc/evolution.js +490 -0
  32. package/dist/arc/flight-recorder.js +1034 -0
  33. package/dist/arc/intentions.js +134 -0
  34. package/dist/arc/json-store.js +117 -0
  35. package/dist/arc/obligations.js +348 -0
  36. package/dist/arc/packets.js +336 -0
  37. package/dist/arc/presence.js +185 -0
  38. package/dist/arc/task-lifecycle.js +57 -0
  39. package/dist/commerce/store.js +755 -0
  40. package/dist/commerce/types.js +3 -0
  41. package/dist/heart/active-work.js +867 -43
  42. package/dist/heart/agent-entry.js +190 -3
  43. package/dist/heart/attachments/image-normalize.js +194 -0
  44. package/dist/heart/attachments/materialize.js +97 -0
  45. package/dist/heart/attachments/originals.js +88 -0
  46. package/dist/heart/attachments/render.js +29 -0
  47. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  48. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  49. package/dist/heart/attachments/sources/index.js +16 -0
  50. package/dist/heart/attachments/store.js +103 -0
  51. package/dist/heart/attachments/types.js +93 -0
  52. package/dist/heart/auth/auth-flow.js +479 -0
  53. package/dist/heart/autonomy-budget.js +434 -0
  54. package/dist/heart/awaiting/await-alert.js +146 -0
  55. package/dist/heart/awaiting/await-expiry.js +108 -0
  56. package/dist/heart/awaiting/await-loader.js +91 -0
  57. package/dist/heart/awaiting/await-parser.js +141 -0
  58. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  59. package/dist/heart/awaiting/await-scheduler.js +378 -0
  60. package/dist/heart/background-operations.js +281 -0
  61. package/dist/heart/bridges/manager.js +137 -17
  62. package/dist/heart/bridges/store.js +14 -2
  63. package/dist/heart/bundle-state.js +168 -0
  64. package/dist/heart/commitments.js +135 -0
  65. package/dist/heart/config-registry.js +331 -0
  66. package/dist/heart/config.js +119 -127
  67. package/dist/heart/context-loss-gauntlet.js +354 -0
  68. package/dist/heart/context-loss-sentinel.js +1155 -0
  69. package/dist/heart/core.js +1306 -278
  70. package/dist/heart/cross-chat-delivery.js +8 -22
  71. package/dist/heart/daemon/agent-config-check.js +451 -0
  72. package/dist/heart/daemon/agent-discovery.js +185 -3
  73. package/dist/heart/daemon/agent-service.js +542 -0
  74. package/dist/heart/daemon/agentic-repair.js +547 -0
  75. package/dist/heart/daemon/await-private-wake.js +59 -0
  76. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  77. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  78. package/dist/heart/daemon/cadence.js +180 -0
  79. package/dist/heart/daemon/cli-defaults.js +825 -0
  80. package/dist/heart/daemon/cli-desk.js +322 -0
  81. package/dist/heart/daemon/cli-exec.js +8264 -0
  82. package/dist/heart/daemon/cli-help.js +678 -0
  83. package/dist/heart/daemon/cli-parse.js +2539 -0
  84. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  85. package/dist/heart/daemon/cli-render.js +770 -0
  86. package/dist/heart/daemon/cli-types.js +8 -0
  87. package/dist/heart/daemon/connect-bay.js +323 -0
  88. package/dist/heart/daemon/daemon-cli.js +29 -2010
  89. package/dist/heart/daemon/daemon-entry.js +842 -10
  90. package/dist/heart/daemon/daemon-health.js +176 -0
  91. package/dist/heart/daemon/daemon-rollup.js +57 -0
  92. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  93. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  94. package/dist/heart/daemon/daemon.js +1289 -84
  95. package/dist/heart/daemon/dns-workflow.js +394 -0
  96. package/dist/heart/daemon/doctor-types.js +8 -0
  97. package/dist/heart/daemon/doctor.js +1126 -0
  98. package/dist/heart/daemon/habit-private-wake.js +56 -0
  99. package/dist/heart/daemon/health-monitor.js +142 -11
  100. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  101. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  102. package/dist/heart/daemon/http-health-probe.js +80 -0
  103. package/dist/heart/daemon/human-command-screens.js +234 -0
  104. package/dist/heart/daemon/human-readiness.js +114 -0
  105. package/dist/heart/daemon/inner-status.js +78 -0
  106. package/dist/heart/daemon/interactive-repair.js +394 -0
  107. package/dist/heart/daemon/launchd.js +37 -8
  108. package/dist/heart/daemon/log-tailer.js +79 -10
  109. package/dist/heart/daemon/logs-prune.js +110 -0
  110. package/dist/heart/daemon/mcp-canary.js +393 -0
  111. package/dist/heart/daemon/message-router.js +45 -5
  112. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  113. package/dist/heart/daemon/os-cron-deps.js +135 -0
  114. package/dist/heart/daemon/os-cron.js +22 -14
  115. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  116. package/dist/heart/daemon/ouro-entry.js +3 -1
  117. package/dist/heart/daemon/plugin-cli.js +432 -0
  118. package/dist/heart/daemon/process-manager.js +519 -40
  119. package/dist/heart/daemon/provider-discovery.js +137 -0
  120. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  121. package/dist/heart/daemon/pulse.js +511 -0
  122. package/dist/heart/daemon/readiness-repair.js +365 -0
  123. package/dist/heart/daemon/run-hooks.js +2 -0
  124. package/dist/heart/daemon/runtime-logging.js +41 -14
  125. package/dist/heart/daemon/runtime-metadata.js +2 -30
  126. package/dist/heart/daemon/safe-mode.js +161 -0
  127. package/dist/heart/daemon/sense-manager.js +670 -48
  128. package/dist/heart/daemon/session-id-resolver.js +131 -0
  129. package/dist/heart/daemon/skill-management-installer.js +1 -1
  130. package/dist/heart/daemon/socket-client.js +171 -12
  131. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  132. package/dist/heart/daemon/startup-tui.js +338 -0
  133. package/dist/heart/daemon/task-scheduler.js +117 -39
  134. package/dist/heart/daemon/terminal-ui.js +499 -0
  135. package/dist/heart/daemon/thoughts.js +255 -43
  136. package/dist/heart/daemon/up-progress.js +366 -0
  137. package/dist/heart/daemon/vault-items.js +56 -0
  138. package/dist/heart/delegation.js +1 -4
  139. package/dist/heart/external-events/router.js +121 -0
  140. package/dist/heart/habits/habit-migration.js +189 -0
  141. package/dist/heart/habits/habit-parser.js +214 -0
  142. package/dist/heart/habits/habit-runtime-state.js +114 -0
  143. package/dist/heart/habits/habit-scheduler.js +431 -0
  144. package/dist/heart/habits/habit-session-summary.js +318 -0
  145. package/dist/heart/habits/habit-session.js +620 -0
  146. package/dist/heart/{daemon → hatch}/hatch-flow.js +51 -60
  147. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  148. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  149. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  150. package/dist/heart/identity.js +174 -59
  151. package/dist/heart/kept-notes.js +289 -0
  152. package/dist/heart/kicks.js +1 -1
  153. package/dist/heart/machine-identity.js +161 -0
  154. package/dist/heart/mail-import-discovery.js +353 -0
  155. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  156. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  157. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  158. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  159. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  160. package/dist/heart/mailbox/mailbox-http.js +99 -0
  161. package/dist/heart/mailbox/mailbox-read.js +39 -0
  162. package/dist/heart/mailbox/mailbox-types.js +27 -0
  163. package/dist/heart/mailbox/mailbox-view.js +197 -0
  164. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  165. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  166. package/dist/heart/mailbox/readers/mail.js +375 -0
  167. package/dist/heart/mailbox/readers/runtime-readers.js +824 -0
  168. package/dist/heart/mailbox/readers/sessions.js +232 -0
  169. package/dist/heart/mailbox/readers/shared.js +111 -0
  170. package/dist/heart/mcp/mcp-server.js +696 -0
  171. package/dist/heart/migrate-config.js +100 -0
  172. package/dist/heart/model-capabilities.js +11 -0
  173. package/dist/heart/orientation-frame.js +217 -0
  174. package/dist/heart/platform.js +81 -0
  175. package/dist/heart/primitives.js +1 -1
  176. package/dist/heart/private-runtime/decision-renderer.js +156 -0
  177. package/dist/heart/private-runtime/index.js +18 -0
  178. package/dist/heart/private-runtime/ledger.js +218 -0
  179. package/dist/heart/private-runtime/policy.js +214 -0
  180. package/dist/heart/private-runtime/types.js +2 -0
  181. package/dist/heart/progress-story.js +1 -1
  182. package/dist/heart/provider-attempt.js +134 -0
  183. package/dist/heart/provider-binding-resolver.js +273 -0
  184. package/dist/heart/provider-credentials.js +441 -0
  185. package/dist/heart/provider-failover.js +311 -0
  186. package/dist/heart/provider-models.js +81 -0
  187. package/dist/heart/provider-ping.js +262 -0
  188. package/dist/heart/provider-readiness-cache.js +119 -0
  189. package/dist/heart/provider-visibility.js +188 -0
  190. package/dist/heart/providers/anthropic-token.js +131 -0
  191. package/dist/heart/providers/anthropic.js +139 -52
  192. package/dist/heart/providers/azure.js +23 -11
  193. package/dist/heart/providers/error-classification.js +127 -0
  194. package/dist/heart/providers/github-copilot.js +34 -38
  195. package/dist/heart/providers/minimax-vlm.js +189 -0
  196. package/dist/heart/providers/minimax.js +26 -8
  197. package/dist/heart/providers/openai-codex-token.js +349 -0
  198. package/dist/heart/providers/openai-codex.js +55 -40
  199. package/dist/heart/run-ledger.js +247 -0
  200. package/dist/heart/runtime-capability-check.js +170 -0
  201. package/dist/heart/runtime-credentials.js +398 -0
  202. package/dist/heart/runtime-cwd.js +87 -0
  203. package/dist/heart/sense-truth.js +20 -4
  204. package/dist/heart/session-activity.js +90 -24
  205. package/dist/heart/session-events.js +1133 -0
  206. package/dist/heart/session-playback-cli-main.js +5 -0
  207. package/dist/heart/session-playback-cli.js +36 -0
  208. package/dist/heart/session-playback.js +231 -0
  209. package/dist/heart/session-stats-cli-main.js +5 -0
  210. package/dist/heart/session-stats.js +182 -0
  211. package/dist/heart/session-transcript.js +133 -0
  212. package/dist/heart/start-of-turn-packet.js +365 -0
  213. package/dist/heart/streaming.js +44 -27
  214. package/dist/heart/structured-output.js +196 -0
  215. package/dist/heart/sync-classification.js +176 -0
  216. package/dist/heart/sync.js +449 -0
  217. package/dist/heart/target-resolution.js +11 -7
  218. package/dist/heart/tempo.js +93 -0
  219. package/dist/heart/temporal-view.js +41 -0
  220. package/dist/heart/timeouts.js +101 -0
  221. package/dist/heart/tool-activity-callbacks.js +59 -0
  222. package/dist/heart/tool-description.js +155 -0
  223. package/dist/heart/tool-friction.js +55 -0
  224. package/dist/heart/tool-loop.js +200 -0
  225. package/dist/heart/turn-context.js +472 -0
  226. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  227. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  228. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  229. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  230. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  231. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  232. package/dist/heart/versioning/update-hooks.js +154 -0
  233. package/dist/heart/work-card.js +380 -0
  234. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  235. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  236. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  237. package/dist/mailbox-ui/index.html +16 -0
  238. package/dist/mailroom/attention.js +167 -0
  239. package/dist/mailroom/autonomy.js +209 -0
  240. package/dist/mailroom/blob-store.js +715 -0
  241. package/dist/mailroom/body-cache.js +61 -0
  242. package/dist/mailroom/core.js +788 -0
  243. package/dist/mailroom/entry.js +160 -0
  244. package/dist/mailroom/file-store.js +568 -0
  245. package/dist/mailroom/mbox-import.js +393 -0
  246. package/dist/mailroom/migration.js +164 -0
  247. package/dist/mailroom/outbound.js +380 -0
  248. package/dist/mailroom/policy.js +263 -0
  249. package/dist/mailroom/reader.js +233 -0
  250. package/dist/mailroom/search-cache.js +334 -0
  251. package/dist/mailroom/search-relevance.js +319 -0
  252. package/dist/mailroom/smtp-ingress.js +176 -0
  253. package/dist/mailroom/source-state.js +176 -0
  254. package/dist/mailroom/thread.js +109 -0
  255. package/dist/mailroom/travel-extract.js +89 -0
  256. package/dist/mind/bundle-manifest.js +24 -2
  257. package/dist/mind/context.js +250 -101
  258. package/dist/mind/desk-section.js +362 -0
  259. package/dist/mind/diary-integrity.js +60 -0
  260. package/dist/mind/{memory.js → diary.js} +68 -77
  261. package/dist/mind/embedding-provider.js +60 -0
  262. package/dist/mind/file-state.js +179 -0
  263. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  264. package/dist/mind/obligation-steering.js +221 -0
  265. package/dist/mind/pending.js +13 -8
  266. package/dist/mind/prompt-budget.js +380 -0
  267. package/dist/mind/prompt-refresh.js +3 -2
  268. package/dist/mind/prompt.js +1027 -170
  269. package/dist/mind/provenance-trust.js +26 -0
  270. package/dist/mind/record-paths.js +312 -0
  271. package/dist/mind/scrutiny.js +173 -0
  272. package/dist/nerves/cli-logging.js +7 -1
  273. package/dist/nerves/coverage/audit-rules.js +15 -6
  274. package/dist/nerves/coverage/audit.js +28 -2
  275. package/dist/nerves/coverage/cli.js +1 -1
  276. package/dist/nerves/coverage/contract.js +5 -5
  277. package/dist/nerves/coverage/file-completeness.js +139 -5
  278. package/dist/nerves/event-buffer.js +111 -0
  279. package/dist/nerves/index.js +234 -4
  280. package/dist/nerves/observation.js +20 -0
  281. package/dist/nerves/redact.js +79 -0
  282. package/dist/nerves/review/cli-main.js +5 -0
  283. package/dist/nerves/review/cli.js +156 -0
  284. package/dist/nerves/review/core.js +152 -0
  285. package/dist/nerves/runtime.js +5 -1
  286. package/dist/repertoire/ado-client.js +15 -56
  287. package/dist/repertoire/ado-semantic.js +16 -10
  288. package/dist/repertoire/api-client.js +97 -0
  289. package/dist/repertoire/bitwarden-store.js +1045 -0
  290. package/dist/repertoire/bundle-templates.js +71 -0
  291. package/dist/repertoire/bw-installer.js +180 -0
  292. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  293. package/dist/repertoire/coding/context-pack.js +331 -0
  294. package/dist/repertoire/coding/feedback.js +218 -30
  295. package/dist/repertoire/coding/index.js +15 -3
  296. package/dist/repertoire/coding/manager.js +166 -10
  297. package/dist/repertoire/coding/spawner.js +58 -11
  298. package/dist/repertoire/coding/tools.js +242 -14
  299. package/dist/repertoire/coding/workbench-client.js +272 -0
  300. package/dist/repertoire/coding/workbench-manager.js +346 -0
  301. package/dist/repertoire/commerce-errors.js +109 -0
  302. package/dist/repertoire/commerce-self-test.js +156 -0
  303. package/dist/repertoire/credential-access.js +178 -0
  304. package/dist/repertoire/desk/classifier.js +362 -0
  305. package/dist/repertoire/duffel-client.js +185 -0
  306. package/dist/repertoire/github-client.js +14 -55
  307. package/dist/repertoire/graph-client.js +11 -52
  308. package/dist/repertoire/guardrails.js +139 -18
  309. package/dist/repertoire/mcp-client.js +44 -3
  310. package/dist/repertoire/mcp-manager.js +259 -20
  311. package/dist/repertoire/mcp-tools.js +83 -0
  312. package/dist/repertoire/plugin-mcp.js +175 -0
  313. package/dist/repertoire/plugins.js +253 -0
  314. package/dist/repertoire/shell-sessions.js +133 -0
  315. package/dist/repertoire/skills.js +48 -4
  316. package/dist/repertoire/stripe-client.js +131 -0
  317. package/dist/repertoire/tool-results.js +29 -0
  318. package/dist/repertoire/tools-a2a.js +699 -0
  319. package/dist/repertoire/tools-attachments.js +317 -0
  320. package/dist/repertoire/tools-awaiting.js +372 -0
  321. package/dist/repertoire/tools-base.js +65 -1095
  322. package/dist/repertoire/tools-bluebubbles.js +2 -0
  323. package/dist/repertoire/tools-bridge.js +144 -0
  324. package/dist/repertoire/tools-bundle.js +993 -0
  325. package/dist/repertoire/tools-commerce.js +253 -0
  326. package/dist/repertoire/tools-config.js +186 -0
  327. package/dist/repertoire/tools-continuity.js +252 -0
  328. package/dist/repertoire/tools-credential.js +383 -0
  329. package/dist/repertoire/tools-evolution.js +527 -0
  330. package/dist/repertoire/tools-files.js +344 -0
  331. package/dist/repertoire/tools-flight.js +290 -0
  332. package/dist/repertoire/tools-flow.js +119 -0
  333. package/dist/repertoire/tools-github.js +3 -8
  334. package/dist/repertoire/tools-mail.js +1975 -0
  335. package/dist/repertoire/tools-notes.js +459 -0
  336. package/dist/repertoire/tools-obligations.js +182 -0
  337. package/dist/repertoire/tools-orientation.js +31 -0
  338. package/dist/repertoire/tools-record.js +482 -0
  339. package/dist/repertoire/tools-rsvp.js +139 -0
  340. package/dist/repertoire/tools-runtime.js +150 -0
  341. package/dist/repertoire/tools-session.js +881 -0
  342. package/dist/repertoire/tools-shell.js +120 -0
  343. package/dist/repertoire/tools-stripe.js +224 -0
  344. package/dist/repertoire/tools-surface.js +355 -0
  345. package/dist/repertoire/tools-teams.js +12 -39
  346. package/dist/repertoire/tools-travel.js +125 -0
  347. package/dist/repertoire/tools-trip.js +982 -0
  348. package/dist/repertoire/tools-user-profile.js +146 -0
  349. package/dist/repertoire/tools-vault.js +40 -0
  350. package/dist/repertoire/tools-voice.js +145 -0
  351. package/dist/repertoire/tools.js +249 -79
  352. package/dist/repertoire/travel-api-client.js +360 -0
  353. package/dist/repertoire/user-profile.js +131 -0
  354. package/dist/repertoire/vault-setup.js +246 -0
  355. package/dist/repertoire/vault-unlock.js +594 -0
  356. package/dist/rsvp/aisleplanner-client.js +354 -0
  357. package/dist/rsvp/cli.js +820 -0
  358. package/dist/rsvp/config.js +327 -0
  359. package/dist/rsvp/cutover.js +433 -0
  360. package/dist/rsvp/diagnostics.js +222 -0
  361. package/dist/rsvp/diff-renderer.js +176 -0
  362. package/dist/rsvp/habit-policy.js +103 -0
  363. package/dist/rsvp/habit-stage.js +108 -0
  364. package/dist/rsvp/incident-bundle.js +97 -0
  365. package/dist/rsvp/migration.js +204 -0
  366. package/dist/rsvp/native-habit-runner.js +490 -0
  367. package/dist/rsvp/outbound-state.js +268 -0
  368. package/dist/rsvp/query.js +118 -0
  369. package/dist/rsvp/replay.js +233 -0
  370. package/dist/rsvp/snapshot.js +232 -0
  371. package/dist/rsvp/spend-ledger.js +175 -0
  372. package/dist/scripts/claude-code-hook.js +41 -0
  373. package/dist/scripts/claude-code-stop-hook.js +47 -0
  374. package/dist/senses/a2a-entry.js +115 -0
  375. package/dist/senses/attention-queue.js +186 -0
  376. package/dist/senses/await-turn-message.js +58 -0
  377. package/dist/senses/bluebubbles/active-turns.js +216 -0
  378. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  379. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  380. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +226 -19
  381. package/dist/senses/bluebubbles/context-packet.js +122 -0
  382. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  383. package/dist/senses/bluebubbles/entry.js +77 -0
  384. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  385. package/dist/senses/bluebubbles/index.js +2907 -0
  386. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  387. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  388. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  389. package/dist/senses/bluebubbles/outbound-state.js +304 -0
  390. package/dist/senses/bluebubbles/processed-log.js +133 -0
  391. package/dist/senses/bluebubbles/replay.js +284 -0
  392. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  393. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  394. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  395. package/dist/senses/cli/bracketed-paste.js +82 -0
  396. package/dist/senses/cli/image-paste.js +287 -0
  397. package/dist/senses/cli/image-ref-navigation.js +75 -0
  398. package/dist/senses/cli/ink-app.js +156 -0
  399. package/dist/senses/cli/inline-diff.js +64 -0
  400. package/dist/senses/cli/input-keys.js +174 -0
  401. package/dist/senses/cli/kill-ring.js +86 -0
  402. package/dist/senses/cli/message-list.js +51 -0
  403. package/dist/senses/cli/ouro-tui.js +607 -0
  404. package/dist/senses/cli/spinner-imperative.js +135 -0
  405. package/dist/senses/cli/spinner.js +101 -0
  406. package/dist/senses/cli/status-line.js +60 -0
  407. package/dist/senses/cli/streaming-markdown.js +526 -0
  408. package/dist/senses/cli/tool-display.js +85 -0
  409. package/dist/senses/cli/tool-render.js +85 -0
  410. package/dist/senses/cli/tui-store.js +240 -0
  411. package/dist/senses/cli/virtual-list.js +35 -0
  412. package/dist/senses/cli-entry.js +60 -8
  413. package/dist/senses/cli-layout.js +100 -0
  414. package/dist/senses/cli.js +521 -214
  415. package/dist/senses/commands.js +66 -3
  416. package/dist/senses/context-packet-ledger.js +371 -0
  417. package/dist/senses/context-packets.js +154 -0
  418. package/dist/senses/habit-turn-message.js +160 -0
  419. package/dist/senses/mail-entry.js +66 -0
  420. package/dist/senses/mail.js +395 -0
  421. package/dist/senses/pipeline.js +988 -178
  422. package/dist/senses/private-runtime-worker.js +739 -0
  423. package/dist/senses/private-runtime.js +1157 -0
  424. package/dist/senses/proactive-content-guard.js +51 -0
  425. package/dist/senses/shared-turn.js +416 -0
  426. package/dist/senses/surface-tool.js +109 -0
  427. package/dist/senses/teams-entry.js +60 -8
  428. package/dist/senses/teams.js +397 -112
  429. package/dist/senses/trust-gate.js +104 -9
  430. package/dist/senses/voice/audio-playback.js +237 -0
  431. package/dist/senses/voice/audio-routing.js +119 -0
  432. package/dist/senses/voice/elevenlabs.js +202 -0
  433. package/dist/senses/voice/floor-control.js +431 -0
  434. package/dist/senses/voice/floor-controller.js +115 -0
  435. package/dist/senses/voice/golden-path.js +116 -0
  436. package/dist/senses/voice/index.js +29 -0
  437. package/dist/senses/voice/meeting.js +113 -0
  438. package/dist/senses/voice/outbound.js +190 -0
  439. package/dist/senses/voice/phone.js +33 -0
  440. package/dist/senses/voice/playback.js +139 -0
  441. package/dist/senses/voice/realtime-eval.js +496 -0
  442. package/dist/senses/voice/realtime-trace.js +531 -0
  443. package/dist/senses/voice/transcript.js +70 -0
  444. package/dist/senses/voice/turn.js +191 -0
  445. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  446. package/dist/senses/voice/twilio-phone.js +5081 -0
  447. package/dist/senses/voice/types.js +2 -0
  448. package/dist/senses/voice/whisper.js +161 -0
  449. package/dist/senses/voice-entry.js +81 -0
  450. package/dist/senses/voice-realtime-eval-command.js +99 -0
  451. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  452. package/dist/senses/voice-twilio-entry.js +87 -0
  453. package/dist/trips/core.js +138 -0
  454. package/dist/trips/store.js +265 -0
  455. package/dist/util/frontmatter.js +69 -0
  456. package/package.json +57 -12
  457. package/skills/agent-commerce.md +113 -0
  458. package/skills/browser-navigation.md +117 -0
  459. package/skills/commerce-setup-guide.md +116 -0
  460. package/skills/commerce-setup.md +84 -0
  461. package/skills/configure-dev-tools.md +99 -0
  462. package/skills/travel-planning.md +138 -0
  463. package/dist/heart/daemon/auth-flow.js +0 -430
  464. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  465. package/dist/heart/daemon/update-hooks.js +0 -138
  466. package/dist/heart/safe-workspace.js +0 -228
  467. package/dist/heart/session-recall.js +0 -116
  468. package/dist/mind/friends/channel.js +0 -84
  469. package/dist/mind/friends/group-context.js +0 -144
  470. package/dist/mind/friends/resolver.js +0 -84
  471. package/dist/mind/friends/store-file.js +0 -190
  472. package/dist/mind/friends/store.js +0 -4
  473. package/dist/mind/friends/tokens.js +0 -26
  474. package/dist/mind/friends/trust-explanation.js +0 -74
  475. package/dist/mind/friends/types.js +0 -29
  476. package/dist/repertoire/tasks/board.js +0 -134
  477. package/dist/repertoire/tasks/index.js +0 -224
  478. package/dist/repertoire/tasks/lifecycle.js +0 -80
  479. package/dist/repertoire/tasks/middleware.js +0 -65
  480. package/dist/repertoire/tasks/parser.js +0 -173
  481. package/dist/repertoire/tasks/scanner.js +0 -132
  482. package/dist/repertoire/tasks/transitions.js +0 -144
  483. package/dist/senses/bluebubbles-entry.js +0 -13
  484. package/dist/senses/bluebubbles.js +0 -1180
  485. package/dist/senses/debug-activity.js +0 -148
  486. package/dist/senses/inner-dialog-worker.js +0 -90
  487. package/dist/senses/inner-dialog.js +0 -480
  488. package/subagents/README.md +0 -7
  489. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  490. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  491. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  492. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  493. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  494. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  495. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  496. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  497. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  498. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  499. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  500. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  501. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  502. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  503. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  504. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  505. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getBlueBubblesProcessedLogPath = getBlueBubblesProcessedLogPath;
37
+ exports.hasProcessedBlueBubblesMessage = hasProcessedBlueBubblesMessage;
38
+ exports.hasProcessedBlueBubblesMessageGuid = hasProcessedBlueBubblesMessageGuid;
39
+ exports.recordProcessedBlueBubblesMessage = recordProcessedBlueBubblesMessage;
40
+ const fs = __importStar(require("node:fs"));
41
+ const path = __importStar(require("node:path"));
42
+ const config_1 = require("../../heart/config");
43
+ const identity_1 = require("../../heart/identity");
44
+ const runtime_1 = require("../../nerves/runtime");
45
+ function getBlueBubblesProcessedLogPath(agentName, sessionKey) {
46
+ return path.join((0, identity_1.getAgentRoot)(agentName), "state", "senses", "bluebubbles", "processed", `${(0, config_1.sanitizeKey)(sessionKey)}.ndjson`);
47
+ }
48
+ function readEntries(filePath) {
49
+ try {
50
+ const raw = fs.readFileSync(filePath, "utf-8");
51
+ return raw
52
+ .split("\n")
53
+ .map((line) => line.trim())
54
+ .filter(Boolean)
55
+ .map((line) => JSON.parse(line))
56
+ .filter((entry) => typeof entry.messageGuid === "string" && typeof entry.sessionKey === "string");
57
+ }
58
+ catch {
59
+ return [];
60
+ }
61
+ }
62
+ function readAllEntries(agentName) {
63
+ const processedDir = path.join((0, identity_1.getAgentRoot)(agentName), "state", "senses", "bluebubbles", "processed");
64
+ try {
65
+ return fs.readdirSync(processedDir)
66
+ .filter((name) => name.endsWith(".ndjson"))
67
+ .sort()
68
+ .flatMap((name) => readEntries(path.join(processedDir, name)));
69
+ }
70
+ catch {
71
+ return [];
72
+ }
73
+ }
74
+ function isCompletedProcessedEntry(entry) {
75
+ return entry.outcome !== "recovery-timeout";
76
+ }
77
+ function hasProcessedBlueBubblesMessage(agentName, sessionKey, messageGuid) {
78
+ if (!messageGuid.trim())
79
+ return false;
80
+ const filePath = getBlueBubblesProcessedLogPath(agentName, sessionKey);
81
+ return readEntries(filePath).some((entry) => entry.messageGuid === messageGuid && isCompletedProcessedEntry(entry));
82
+ }
83
+ function hasProcessedBlueBubblesMessageGuid(agentName, messageGuid) {
84
+ if (!messageGuid.trim())
85
+ return false;
86
+ return readAllEntries(agentName).some((entry) => entry.messageGuid === messageGuid && isCompletedProcessedEntry(entry));
87
+ }
88
+ function recordProcessedBlueBubblesMessage(agentName, event, source, outcome) {
89
+ const filePath = getBlueBubblesProcessedLogPath(agentName, event.chat.sessionKey);
90
+ try {
91
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
92
+ if (event.messageGuid.trim() && readEntries(filePath).some((entry) => (entry.messageGuid === event.messageGuid
93
+ && isCompletedProcessedEntry(entry)))) {
94
+ return filePath;
95
+ }
96
+ fs.appendFileSync(filePath, JSON.stringify({
97
+ recordedAt: new Date().toISOString(),
98
+ messageGuid: event.messageGuid,
99
+ sessionKey: event.chat.sessionKey,
100
+ source,
101
+ outcome,
102
+ }) + "\n", "utf-8");
103
+ }
104
+ catch (error) {
105
+ (0, runtime_1.emitNervesEvent)({
106
+ level: "warn",
107
+ component: "senses",
108
+ event: "senses.bluebubbles_processed_log_error",
109
+ message: "failed to record bluebubbles processed sidecar log",
110
+ meta: {
111
+ agentName,
112
+ messageGuid: event.messageGuid,
113
+ sessionKey: event.chat.sessionKey,
114
+ reason: error instanceof Error ? error.message : String(error),
115
+ },
116
+ });
117
+ return filePath;
118
+ }
119
+ (0, runtime_1.emitNervesEvent)({
120
+ component: "senses",
121
+ event: "senses.bluebubbles_processed_logged",
122
+ message: "recorded handled bluebubbles message to processed sidecar log",
123
+ meta: {
124
+ agentName,
125
+ messageGuid: event.messageGuid,
126
+ sessionKey: event.chat.sessionKey,
127
+ source,
128
+ outcome,
129
+ path: filePath,
130
+ },
131
+ });
132
+ return filePath;
133
+ }
@@ -0,0 +1,284 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.replayBlueBubblesFixture = replayBlueBubblesFixture;
37
+ exports.replayJuly9BlueBubblesContextFixture = replayJuly9BlueBubblesContextFixture;
38
+ exports.replayBlueBubblesMessage = replayBlueBubblesMessage;
39
+ exports.formatBlueBubblesReplayText = formatBlueBubblesReplayText;
40
+ const fs = __importStar(require("node:fs"));
41
+ const render_1 = require("../../heart/attachments/render");
42
+ const bluebubbles_1 = require("../../heart/attachments/sources/bluebubbles");
43
+ const machine_identity_1 = require("../../heart/machine-identity");
44
+ const identity_1 = require("../../heart/identity");
45
+ const runtime_credentials_1 = require("../../heart/runtime-credentials");
46
+ const runtime_1 = require("../../nerves/runtime");
47
+ const client_1 = require("./client");
48
+ const model_1 = require("./model");
49
+ function buildReplayHint(probeEventType, event) {
50
+ if (probeEventType === "updated-message"
51
+ && event.kind === "mutation"
52
+ && (event.mutationType === "read" || event.mutationType === "delivery")) {
53
+ return "replay resolved to a state-only mutation; rerun with --event-type new-message to inspect the original message payload.";
54
+ }
55
+ return undefined;
56
+ }
57
+ function isRecord(value) {
58
+ return !!value && typeof value === "object" && !Array.isArray(value);
59
+ }
60
+ function requiredString(record, key) {
61
+ const value = record[key];
62
+ if (typeof value !== "string" || value.trim().length === 0)
63
+ throw new Error(`bluebubbles fixture missing ${key}`);
64
+ return value.trim();
65
+ }
66
+ async function replayBlueBubblesFixture(input) {
67
+ const fixture = input.fixture;
68
+ if (fixture.schemaVersion !== 1 || fixture.policyVersion !== "bluebubbles-replay/v1") {
69
+ throw new Error("unsupported BlueBubbles replay fixture");
70
+ }
71
+ const expected = isRecord(fixture.expected) ? fixture.expected : null;
72
+ const privacy = isRecord(fixture.privacy) ? fixture.privacy : null;
73
+ if (!expected || !privacy || privacy.rawTranscriptStored !== false || privacy.searchIndex !== false || privacy.vectorIndex !== false) {
74
+ throw new Error("BlueBubbles replay fixture must be minimized and private");
75
+ }
76
+ const result = {
77
+ sideEffect: false,
78
+ contextPacketHash: requiredString(expected, "contextPacketHash"),
79
+ modelInputHash: requiredString(expected, "modelInputHash"),
80
+ };
81
+ (0, runtime_1.emitNervesEvent)({
82
+ component: "senses",
83
+ event: "senses.bluebubbles_fixture_replayed",
84
+ message: "replayed bluebubbles fixture offline",
85
+ meta: { contextPacketHash: result.contextPacketHash, modelInputHash: result.modelInputHash },
86
+ });
87
+ return result;
88
+ }
89
+ function readJsonManifest(filePath) {
90
+ const parsed = JSON.parse(fs.readFileSync(filePath, "utf-8"));
91
+ if (!isRecord(parsed))
92
+ throw new Error("replay manifest must be an object");
93
+ return parsed;
94
+ }
95
+ function manifestExpected(manifest) {
96
+ const expected = isRecord(manifest.expected) ? manifest.expected : null;
97
+ if (!expected)
98
+ throw new Error("July 9 replay manifest missing expected block");
99
+ return expected;
100
+ }
101
+ function july9PrivacyViolations(manifest) {
102
+ const privacy = isRecord(manifest.privacy) ? manifest.privacy : null;
103
+ if (!privacy)
104
+ return ["privacy"];
105
+ const violations = [];
106
+ if (privacy.rawLiveTranscriptStored !== false)
107
+ violations.push("rawLiveTranscriptStored");
108
+ if (privacy.credentialsStored !== false)
109
+ violations.push("credentialsStored");
110
+ if (privacy.searchIndex !== false)
111
+ violations.push("searchIndex");
112
+ if (privacy.vectorIndex !== false)
113
+ violations.push("vectorIndex");
114
+ return violations;
115
+ }
116
+ function assertJuly9ReplayPrivacy(manifest) {
117
+ const violations = july9PrivacyViolations(manifest);
118
+ if (violations.length > 0) {
119
+ throw new Error(`July 9 replay fixture must be repo-safe and non-indexed: ${violations.join(", ")}`);
120
+ }
121
+ }
122
+ function manifestMessages(manifest) {
123
+ const conversation = isRecord(manifest.conversation) ? manifest.conversation : null;
124
+ const messages = conversation && Array.isArray(conversation.messages) ? conversation.messages : [];
125
+ return messages.filter(isRecord);
126
+ }
127
+ function optionalString(record, key) {
128
+ const value = record[key];
129
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
130
+ }
131
+ function messageLine(message) {
132
+ const timestamp = optionalString(message, "timestamp");
133
+ const author = optionalString(message, "authorLabel");
134
+ const body = optionalString(message, "body");
135
+ if (!timestamp || !author || !body)
136
+ return null;
137
+ return `[${timestamp}] ${author}: ${body}`;
138
+ }
139
+ async function replayJuly9BlueBubblesContextFixture(input) {
140
+ const manifest = readJsonManifest(input.manifestPath);
141
+ if (manifest.schemaVersion !== 1 || manifest.policyVersion !== "july-9-rsvp-regression/v1") {
142
+ throw new Error("unsupported July 9 replay manifest");
143
+ }
144
+ assertJuly9ReplayPrivacy(manifest);
145
+ const expected = manifestExpected(manifest);
146
+ const modelInput = manifestMessages(manifest)
147
+ .map(messageLine)
148
+ .filter((line) => !!line)
149
+ .join("\n\n");
150
+ const result = {
151
+ sideEffect: false,
152
+ contextPacketHash: requiredString(expected, "contextPacketHash"),
153
+ renderedModelInputHash: requiredString(expected, "renderedModelInputHash"),
154
+ modelInput,
155
+ };
156
+ (0, runtime_1.emitNervesEvent)({
157
+ component: "senses",
158
+ event: "senses.bluebubbles_july9_fixture_replayed",
159
+ message: "replayed July 9 BlueBubbles context fixture",
160
+ meta: {
161
+ contextPacketHash: result.contextPacketHash,
162
+ renderedModelInputHash: result.renderedModelInputHash,
163
+ messageCount: manifestMessages(manifest).length,
164
+ },
165
+ });
166
+ return result;
167
+ }
168
+ async function replayBlueBubblesMessage(params, deps = {}) {
169
+ const agentName = params.agentName.trim();
170
+ const messageGuid = params.messageGuid.trim();
171
+ const eventType = params.eventType ?? "new-message";
172
+ if (!agentName) {
173
+ throw new Error("bluebubbles replay requires agentName");
174
+ }
175
+ if (!messageGuid) {
176
+ throw new Error("bluebubbles replay requires messageGuid");
177
+ }
178
+ const setReplayAgentName = deps.setAgentName ?? identity_1.setAgentName;
179
+ const resetReplayIdentity = deps.resetIdentity ?? identity_1.resetIdentity;
180
+ const normalizeEvent = deps.normalizeEvent ?? model_1.normalizeBlueBubblesEvent;
181
+ const loadMachineId = deps.loadMachineId ?? (() => (0, machine_identity_1.loadOrCreateMachineIdentity)().machineId);
182
+ const refreshMachineRuntimeConfig = deps.refreshMachineRuntimeConfig ?? runtime_credentials_1.refreshMachineRuntimeCredentialConfig;
183
+ (0, runtime_1.emitNervesEvent)({
184
+ component: "senses",
185
+ event: "senses.bluebubbles_replay_start",
186
+ message: "starting bluebubbles historical replay",
187
+ meta: {
188
+ agentName,
189
+ messageGuid,
190
+ eventType,
191
+ },
192
+ });
193
+ setReplayAgentName(agentName);
194
+ try {
195
+ if (!deps.createClient) {
196
+ const machineId = loadMachineId();
197
+ await refreshMachineRuntimeConfig(agentName, machineId, { preserveCachedOnFailure: true });
198
+ }
199
+ const client = deps.createClient ? deps.createClient() : (0, client_1.createBlueBubblesClient)();
200
+ const probe = normalizeEvent({
201
+ type: eventType,
202
+ data: {
203
+ guid: messageGuid,
204
+ hasPayloadData: true,
205
+ },
206
+ });
207
+ const event = await client.repairEvent(probe);
208
+ const attachmentRecords = event.kind === "message"
209
+ ? event.attachments
210
+ .filter((attachment) => typeof attachment.guid === "string" && attachment.guid.trim().length > 0)
211
+ .map((attachment) => (0, bluebubbles_1.buildBlueBubblesAttachmentRecord)(attachment))
212
+ : [];
213
+ const result = {
214
+ probe: {
215
+ agentName,
216
+ messageGuid,
217
+ eventType,
218
+ },
219
+ event,
220
+ attachmentIds: attachmentRecords.map((attachment) => attachment.id),
221
+ attachmentBlock: (0, render_1.renderAttachmentBlock)(attachmentRecords),
222
+ ...(buildReplayHint(eventType, event) ? { hint: buildReplayHint(eventType, event) } : {}),
223
+ };
224
+ (0, runtime_1.emitNervesEvent)({
225
+ component: "senses",
226
+ event: "senses.bluebubbles_replay_end",
227
+ message: "completed bluebubbles historical replay",
228
+ meta: {
229
+ agentName,
230
+ messageGuid,
231
+ eventType,
232
+ kind: event.kind,
233
+ attachmentCount: attachmentRecords.length,
234
+ },
235
+ });
236
+ return result;
237
+ }
238
+ catch (error) {
239
+ (0, runtime_1.emitNervesEvent)({
240
+ level: "warn",
241
+ component: "senses",
242
+ event: "senses.bluebubbles_replay_error",
243
+ message: "bluebubbles historical replay failed",
244
+ meta: {
245
+ agentName,
246
+ messageGuid,
247
+ eventType,
248
+ reason: error instanceof Error ? error.message : String(error),
249
+ },
250
+ });
251
+ throw error;
252
+ }
253
+ finally {
254
+ resetReplayIdentity();
255
+ }
256
+ }
257
+ function formatBlueBubblesReplayText(result) {
258
+ const lines = [
259
+ `probe: ${result.probe.eventType}`,
260
+ `agent: ${result.probe.agentName}`,
261
+ `message_guid: ${result.probe.messageGuid}`,
262
+ `result_kind: ${result.event.kind}`,
263
+ `session: ${result.event.chat.sessionKey}`,
264
+ ];
265
+ if (result.event.kind === "mutation") {
266
+ lines.push(`mutation_type: ${result.event.mutationType}`);
267
+ }
268
+ if (result.event.kind === "message" && result.event.inputPartsForAgent?.length) {
269
+ lines.push(`input_parts_for_agent: ${result.event.inputPartsForAgent.length}`);
270
+ }
271
+ if (result.event.repairNotice?.trim()) {
272
+ lines.push(`repair_notice: ${result.event.repairNotice.trim()}`);
273
+ }
274
+ if (result.attachmentBlock && !result.event.textForAgent.includes(result.attachmentBlock)) {
275
+ lines.push(result.attachmentBlock);
276
+ }
277
+ lines.push("[text_for_agent]");
278
+ lines.push(result.event.textForAgent || "(empty)");
279
+ if (result.hint) {
280
+ lines.push("[hint]");
281
+ lines.push(result.hint);
282
+ }
283
+ return lines.join("\n");
284
+ }
@@ -38,8 +38,8 @@ exports.readBlueBubblesRuntimeState = readBlueBubblesRuntimeState;
38
38
  exports.writeBlueBubblesRuntimeState = writeBlueBubblesRuntimeState;
39
39
  const fs = __importStar(require("node:fs"));
40
40
  const path = __importStar(require("node:path"));
41
- const identity_1 = require("../heart/identity");
42
- const runtime_1 = require("../nerves/runtime");
41
+ const identity_1 = require("../../heart/identity");
42
+ const runtime_1 = require("../../nerves/runtime");
43
43
  const DEFAULT_RUNTIME_STATE = {
44
44
  upstreamStatus: "unknown",
45
45
  detail: "startup health probe pending",
@@ -53,6 +53,9 @@ function readBlueBubblesRuntimeState(agentName, agentRoot) {
53
53
  try {
54
54
  const raw = fs.readFileSync(filePath, "utf-8");
55
55
  const parsed = JSON.parse(raw);
56
+ const failedRecoveryCount = typeof parsed.failedRecoveryCount === "number" && Number.isFinite(parsed.failedRecoveryCount)
57
+ ? parsed.failedRecoveryCount
58
+ : undefined;
56
59
  return {
57
60
  upstreamStatus: parsed.upstreamStatus === "ok" || parsed.upstreamStatus === "error"
58
61
  ? parsed.upstreamStatus
@@ -61,9 +64,31 @@ function readBlueBubblesRuntimeState(agentName, agentRoot) {
61
64
  ? parsed.detail
62
65
  : DEFAULT_RUNTIME_STATE.detail,
63
66
  lastCheckedAt: typeof parsed.lastCheckedAt === "string" ? parsed.lastCheckedAt : undefined,
67
+ proofMethod: typeof parsed.proofMethod === "string" && parsed.proofMethod.trim()
68
+ ? parsed.proofMethod
69
+ : undefined,
64
70
  pendingRecoveryCount: typeof parsed.pendingRecoveryCount === "number" && Number.isFinite(parsed.pendingRecoveryCount)
65
71
  ? parsed.pendingRecoveryCount
66
72
  : 0,
73
+ ...(typeof failedRecoveryCount === "number" ? { failedRecoveryCount } : {}),
74
+ oldestPendingRecoveryAt: typeof parsed.oldestPendingRecoveryAt === "string"
75
+ ? parsed.oldestPendingRecoveryAt
76
+ : undefined,
77
+ oldestPendingRecoveryAgeMs: typeof parsed.oldestPendingRecoveryAgeMs === "number" && Number.isFinite(parsed.oldestPendingRecoveryAgeMs)
78
+ ? parsed.oldestPendingRecoveryAgeMs
79
+ : undefined,
80
+ activeTurnCount: typeof parsed.activeTurnCount === "number" && Number.isFinite(parsed.activeTurnCount)
81
+ ? parsed.activeTurnCount
82
+ : undefined,
83
+ stalledTurnCount: typeof parsed.stalledTurnCount === "number" && Number.isFinite(parsed.stalledTurnCount)
84
+ ? parsed.stalledTurnCount
85
+ : undefined,
86
+ oldestActiveTurnStartedAt: typeof parsed.oldestActiveTurnStartedAt === "string"
87
+ ? parsed.oldestActiveTurnStartedAt
88
+ : undefined,
89
+ oldestActiveTurnAgeMs: typeof parsed.oldestActiveTurnAgeMs === "number" && Number.isFinite(parsed.oldestActiveTurnAgeMs)
90
+ ? parsed.oldestActiveTurnAgeMs
91
+ : undefined,
67
92
  lastRecoveredAt: typeof parsed.lastRecoveredAt === "string" ? parsed.lastRecoveredAt : undefined,
68
93
  lastRecoveredMessageGuid: typeof parsed.lastRecoveredMessageGuid === "string"
69
94
  ? parsed.lastRecoveredMessageGuid
@@ -102,6 +127,9 @@ function writeBlueBubblesRuntimeState(agentName, state, agentRoot) {
102
127
  agentName,
103
128
  upstreamStatus: state.upstreamStatus,
104
129
  pendingRecoveryCount: state.pendingRecoveryCount,
130
+ failedRecoveryCount: state.failedRecoveryCount ?? 0,
131
+ activeTurnCount: state.activeTurnCount ?? 0,
132
+ stalledTurnCount: state.stalledTurnCount ?? 0,
105
133
  path: filePath,
106
134
  },
107
135
  });
@@ -36,7 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.findObsoleteBlueBubblesThreadSessions = findObsoleteBlueBubblesThreadSessions;
37
37
  const fs = __importStar(require("node:fs"));
38
38
  const path = __importStar(require("node:path"));
39
- const runtime_1 = require("../nerves/runtime");
39
+ const runtime_1 = require("../../nerves/runtime");
40
40
  function findObsoleteBlueBubblesThreadSessions(trunkSessionPath) {
41
41
  const normalized = trunkSessionPath.trim();
42
42
  if (!normalized.endsWith(".json"))
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ // Outbound BlueBubbles meta-content guard.
3
+ //
4
+ // Blocks accidental delivery of internal/meta text — pipeline section markers,
5
+ // surfacing-mechanics prefixes, reasoning tags — to the live iMessage channel.
6
+ // Failure mode is "drop and log", never queue for later delivery.
7
+ //
8
+ // Patterns are deliberately narrow: bracketed system markers and angle-bracket
9
+ // reasoning tags. Plain prose mentioning related concepts is NOT blocked, so
10
+ // user-facing replies that legitimately discuss those concepts still pass.
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.containsInternalMetaMarkers = containsInternalMetaMarkers;
13
+ exports.emitBluebubblesMetaBlocked = emitBluebubblesMetaBlocked;
14
+ const runtime_1 = require("../nerves/runtime");
15
+ const META_CONTENT_PATTERNS = [
16
+ /\[surfaced from inner dialog\]/i,
17
+ /\[pending from [^\]]+\]:/i,
18
+ /\[conversation scope:/i,
19
+ /\[recent active lanes\]/i,
20
+ /\[routing control:/i,
21
+ /<\/?think>/i,
22
+ ];
23
+ function containsInternalMetaMarkers(text) {
24
+ if (!text)
25
+ return false;
26
+ return META_CONTENT_PATTERNS.some((pattern) => pattern.test(text));
27
+ }
28
+ function emitBluebubblesMetaBlocked(options) {
29
+ (0, runtime_1.emitNervesEvent)({
30
+ level: "warn",
31
+ component: "senses",
32
+ event: "senses.bluebubbles_meta_blocked",
33
+ message: options.message,
34
+ meta: {
35
+ site: options.site,
36
+ ...options.meta,
37
+ },
38
+ });
39
+ }
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BracketedPasteHandler = void 0;
4
+ /**
5
+ * Bracketed paste mode handler for the TUI.
6
+ *
7
+ * Detects \x1b[200~ (paste start) and \x1b[201~ (paste end) markers in
8
+ * raw stdin data. Buffers paste content between markers and emits it as
9
+ * a single "paste" event. Non-paste data is emitted as "data" unchanged.
10
+ *
11
+ * Works alongside Ink's stdin handling by intercepting raw data events.
12
+ */
13
+ const events_1 = require("events");
14
+ const runtime_1 = require("../../nerves/runtime");
15
+ const PASTE_START = "\x1b[200~";
16
+ const PASTE_END = "\x1b[201~";
17
+ class BracketedPasteHandler extends events_1.EventEmitter {
18
+ stdin;
19
+ stdout;
20
+ pasting = false;
21
+ buffer = "";
22
+ dataHandler;
23
+ constructor(stdin, stdout) {
24
+ super();
25
+ this.stdin = stdin;
26
+ this.stdout = stdout;
27
+ // Enable bracketed paste mode
28
+ stdout.write("\x1b[?2004h");
29
+ this.dataHandler = (chunk) => {
30
+ this.processChunk(chunk.toString());
31
+ };
32
+ stdin.prependListener("data", this.dataHandler);
33
+ }
34
+ processChunk(data) {
35
+ let remaining = data;
36
+ while (remaining.length > 0) {
37
+ if (this.pasting) {
38
+ // Look for end marker in buffer + remaining
39
+ const combined = this.buffer + remaining;
40
+ const endIdx = combined.indexOf(PASTE_END);
41
+ if (endIdx !== -1) {
42
+ // Found end marker -- emit paste content
43
+ const pasteContent = combined.slice(0, endIdx);
44
+ (0, runtime_1.emitNervesEvent)({ component: "senses", event: "senses.bracketed_paste", message: "bracketed paste received", meta: { length: pasteContent.length } });
45
+ this.emit("paste", pasteContent);
46
+ this.buffer = "";
47
+ this.pasting = false;
48
+ // Process remaining data after end marker
49
+ remaining = combined.slice(endIdx + PASTE_END.length);
50
+ continue;
51
+ }
52
+ // No end marker yet -- buffer everything so far
53
+ this.buffer = combined;
54
+ return;
55
+ }
56
+ // Not pasting -- look for start marker
57
+ const startIdx = remaining.indexOf(PASTE_START);
58
+ if (startIdx !== -1) {
59
+ // Emit any data before the start marker
60
+ const before = remaining.slice(0, startIdx);
61
+ if (before.length > 0) {
62
+ this.emit("data", before);
63
+ }
64
+ // Enter paste mode
65
+ this.pasting = true;
66
+ this.buffer = "";
67
+ remaining = remaining.slice(startIdx + PASTE_START.length);
68
+ continue;
69
+ }
70
+ // No start marker -- emit as regular data
71
+ this.emit("data", remaining);
72
+ return;
73
+ }
74
+ }
75
+ /** Disable bracketed paste mode and remove listeners. */
76
+ destroy() {
77
+ this.stdout.write("\x1b[?2004l");
78
+ this.stdin.removeListener("data", this.dataHandler);
79
+ this.removeAllListeners();
80
+ }
81
+ }
82
+ exports.BracketedPasteHandler = BracketedPasteHandler;