@ouro.bot/cli 0.1.0-alpha.8 → 0.1.0-alpha.800

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 (624) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +249 -176
  3. package/RepairGuide.ouro/agent.json +5 -0
  4. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  5. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  6. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  7. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  8. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  9. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  10. package/SerpentGuide.ouro/agent.json +83 -0
  11. package/SerpentGuide.ouro/psyche/SOUL.md +25 -0
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +2 -2
  13. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  14. package/assets/bluebubbles-host +264 -0
  15. package/assets/ouroboros.png +0 -0
  16. package/changelog.json +5563 -0
  17. package/deploy/unraid/Dockerfile +48 -0
  18. package/deploy/unraid/README.txt +3012 -0
  19. package/deploy/unraid/audit-container-spec.sh +4 -0
  20. package/deploy/unraid/container-runtime.json +1 -0
  21. package/deploy/unraid/docker-man-template-transaction.mjs +526 -0
  22. package/deploy/unraid/docker-man-template-xml.cjs +105 -0
  23. package/deploy/unraid/migrate-sanctuary-bundle.mjs +60 -0
  24. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  25. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  26. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  27. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  28. package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
  29. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  30. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
  31. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  32. package/deploy/unraid/sanctuary-deployment-target.mjs +709 -0
  33. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  34. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2030 -0
  35. package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
  36. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  37. package/deploy/unraid/sanctuary.ouro/agent.json +24 -0
  38. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  39. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  40. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  41. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  42. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  43. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
  44. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +11 -0
  45. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +25 -0
  46. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +11 -0
  47. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  48. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +23 -0
  49. package/deploy/unraid/sanctuary.xml +27 -0
  50. package/dist/a2a/card.js +57 -0
  51. package/dist/a2a/client.js +180 -0
  52. package/dist/a2a/config.js +50 -0
  53. package/dist/a2a/delegation-stores.js +56 -0
  54. package/dist/a2a/did-resolution.js +93 -0
  55. package/dist/a2a/identity.js +170 -0
  56. package/dist/a2a/inbound-share.js +107 -0
  57. package/dist/a2a/mission-result-wire.js +196 -0
  58. package/dist/a2a/onboarding.js +115 -0
  59. package/dist/a2a/pin-store.js +132 -0
  60. package/dist/a2a/seen-ledger.js +120 -0
  61. package/dist/a2a/server.js +604 -0
  62. package/dist/a2a/task-store.js +69 -0
  63. package/dist/a2a/transport.js +45 -0
  64. package/dist/a2a/types.js +3 -0
  65. package/dist/arc/attention-types.js +8 -0
  66. package/dist/arc/cares.js +360 -0
  67. package/dist/arc/episodes.js +118 -0
  68. package/dist/arc/evolution.js +490 -0
  69. package/dist/arc/flight-recorder.js +1034 -0
  70. package/dist/arc/intentions.js +134 -0
  71. package/dist/arc/json-store.js +117 -0
  72. package/dist/arc/obligations.js +386 -0
  73. package/dist/arc/packets.js +336 -0
  74. package/dist/arc/presence.js +185 -0
  75. package/dist/arc/task-lifecycle.js +57 -0
  76. package/dist/commerce/store.js +755 -0
  77. package/dist/commerce/types.js +3 -0
  78. package/dist/heart/active-work.js +1009 -0
  79. package/dist/heart/agent-entry.js +252 -3
  80. package/dist/heart/approval-files.js +113 -0
  81. package/dist/heart/approval-store.js +950 -0
  82. package/dist/heart/attachments/image-normalize.js +194 -0
  83. package/dist/heart/attachments/materialize.js +97 -0
  84. package/dist/heart/attachments/originals.js +88 -0
  85. package/dist/heart/attachments/render.js +29 -0
  86. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  87. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  88. package/dist/heart/attachments/sources/index.js +18 -0
  89. package/dist/heart/attachments/sources/telegram.js +71 -0
  90. package/dist/heart/attachments/store.js +132 -0
  91. package/dist/heart/attachments/types.js +93 -0
  92. package/dist/heart/auth/auth-flow.js +495 -0
  93. package/dist/heart/autonomy-budget.js +478 -0
  94. package/dist/heart/awaiting/await-alert.js +148 -0
  95. package/dist/heart/awaiting/await-expiry.js +143 -0
  96. package/dist/heart/awaiting/await-loader.js +91 -0
  97. package/dist/heart/awaiting/await-parser.js +149 -0
  98. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  99. package/dist/heart/awaiting/await-scheduler.js +382 -0
  100. package/dist/heart/background-operations.js +281 -0
  101. package/dist/heart/bridges/manager.js +478 -0
  102. package/dist/heart/bridges/state-machine.js +135 -0
  103. package/dist/heart/bridges/store.js +135 -0
  104. package/dist/heart/bundle-state.js +168 -0
  105. package/dist/heart/commitments.js +135 -0
  106. package/dist/heart/config-registry.js +331 -0
  107. package/dist/heart/config.js +195 -137
  108. package/dist/heart/context-loss-gauntlet.js +387 -0
  109. package/dist/heart/context-loss-sentinel.js +1157 -0
  110. package/dist/heart/core.js +2257 -338
  111. package/dist/heart/cross-chat-delivery.js +133 -0
  112. package/dist/heart/daemon/agent-config-check.js +451 -0
  113. package/dist/heart/daemon/agent-discovery.js +263 -0
  114. package/dist/heart/daemon/agent-service.js +542 -0
  115. package/dist/heart/daemon/agentic-repair.js +547 -0
  116. package/dist/heart/daemon/await-private-wake.js +59 -0
  117. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  118. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  119. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  120. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  121. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  122. package/dist/heart/daemon/cadence.js +180 -0
  123. package/dist/heart/daemon/cli-defaults.js +836 -0
  124. package/dist/heart/daemon/cli-desk.js +322 -0
  125. package/dist/heart/daemon/cli-exec.js +8730 -0
  126. package/dist/heart/daemon/cli-help.js +710 -0
  127. package/dist/heart/daemon/cli-parse.js +2719 -0
  128. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  129. package/dist/heart/daemon/cli-render.js +777 -0
  130. package/dist/heart/daemon/cli-types.js +8 -0
  131. package/dist/heart/daemon/connect-bay.js +323 -0
  132. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  133. package/dist/heart/daemon/container-healthcheck.js +112 -0
  134. package/dist/heart/daemon/container-runtime.js +97 -0
  135. package/dist/heart/daemon/container-spec-auditor-main.js +170 -0
  136. package/dist/heart/daemon/container-spec-auditor.js +236 -0
  137. package/dist/heart/daemon/daemon-bootstrap-startup.js +107 -0
  138. package/dist/heart/daemon/daemon-cli.js +30 -786
  139. package/dist/heart/daemon/daemon-entry.js +971 -13
  140. package/dist/heart/daemon/daemon-health.js +186 -0
  141. package/dist/heart/daemon/daemon-rollup.js +57 -0
  142. package/dist/heart/daemon/daemon-runtime-sync.js +287 -0
  143. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  144. package/dist/heart/daemon/daemon.js +2156 -28
  145. package/dist/heart/daemon/dns-workflow.js +394 -0
  146. package/dist/heart/daemon/doctor-types.js +8 -0
  147. package/dist/heart/daemon/doctor.js +1755 -0
  148. package/dist/heart/daemon/freshness.js +345 -0
  149. package/dist/heart/daemon/habit-private-wake.js +61 -0
  150. package/dist/heart/daemon/health-monitor.js +142 -11
  151. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  152. package/dist/heart/daemon/hooks/bundle-meta.js +226 -0
  153. package/dist/heart/daemon/http-health-probe.js +80 -0
  154. package/dist/heart/daemon/human-command-screens.js +234 -0
  155. package/dist/heart/daemon/human-readiness.js +114 -0
  156. package/dist/heart/daemon/inner-status.js +78 -0
  157. package/dist/heart/daemon/interactive-repair.js +394 -0
  158. package/dist/heart/daemon/launchd.js +188 -0
  159. package/dist/heart/daemon/log-tailer.js +82 -12
  160. package/dist/heart/daemon/logs-prune.js +132 -0
  161. package/dist/heart/daemon/mcp-canary.js +524 -0
  162. package/dist/heart/daemon/message-router.js +80 -11
  163. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  164. package/dist/heart/daemon/os-cron-deps.js +135 -0
  165. package/dist/heart/daemon/os-cron.js +22 -14
  166. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  167. package/dist/heart/daemon/ouro-entry.js +3 -1
  168. package/dist/heart/daemon/plugin-cli.js +432 -0
  169. package/dist/heart/daemon/process-manager.js +739 -54
  170. package/dist/heart/daemon/provider-discovery.js +137 -0
  171. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  172. package/dist/heart/daemon/prunable-bundle.js +144 -0
  173. package/dist/heart/daemon/pulse.js +511 -0
  174. package/dist/heart/daemon/readiness-repair.js +365 -0
  175. package/dist/heart/daemon/run-hooks.js +39 -0
  176. package/dist/heart/daemon/runtime-logging.js +92 -16
  177. package/dist/heart/daemon/runtime-metadata.js +191 -0
  178. package/dist/{repertoire/tasks/lifecycle.js → heart/daemon/runtime-mode.js} +37 -39
  179. package/dist/heart/daemon/safe-mode.js +161 -0
  180. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2609 -0
  181. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1866 -0
  182. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  183. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +976 -0
  184. package/dist/heart/daemon/sanctuary-bundle-migration.js +728 -0
  185. package/dist/heart/daemon/sanctuary-package-management.js +103 -0
  186. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  187. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  188. package/dist/heart/daemon/sense-manager.js +948 -0
  189. package/dist/heart/daemon/session-id-resolver.js +131 -0
  190. package/dist/heart/daemon/skill-management-installer.js +94 -0
  191. package/dist/heart/daemon/socket-client.js +370 -0
  192. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  193. package/dist/heart/daemon/startup-tui.js +339 -0
  194. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  195. package/dist/heart/daemon/task-scheduler.js +117 -39
  196. package/dist/heart/daemon/terminal-ui.js +499 -0
  197. package/dist/heart/daemon/thoughts.js +591 -0
  198. package/dist/heart/daemon/up-progress.js +366 -0
  199. package/dist/heart/daemon/vault-items.js +56 -0
  200. package/dist/heart/delegation.js +59 -0
  201. package/dist/heart/external-events/router.js +1414 -0
  202. package/dist/heart/habits/habit-cancel.js +810 -0
  203. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  204. package/dist/heart/habits/habit-migration.js +194 -0
  205. package/dist/heart/habits/habit-parser.js +278 -0
  206. package/dist/heart/habits/habit-runtime-state.js +93 -0
  207. package/dist/heart/habits/habit-scheduler.js +653 -0
  208. package/dist/heart/habits/habit-session-summary.js +318 -0
  209. package/dist/heart/habits/habit-session.js +636 -0
  210. package/dist/heart/{daemon → hatch}/hatch-animation.js +10 -3
  211. package/dist/heart/{daemon → hatch}/hatch-flow.js +57 -139
  212. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  213. package/dist/heart/hatch/specialist-orchestrator.js +129 -0
  214. package/dist/heart/hatch/specialist-prompt.js +102 -0
  215. package/dist/heart/hatch/specialist-tools.js +318 -0
  216. package/dist/heart/identity.js +297 -67
  217. package/dist/heart/kept-notes.js +289 -0
  218. package/dist/heart/kicks.js +2 -20
  219. package/dist/heart/machine-identity.js +161 -0
  220. package/dist/heart/mail-import-discovery.js +353 -0
  221. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  222. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  223. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  224. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  225. package/dist/heart/mailbox/mailbox-http-transport.js +129 -0
  226. package/dist/heart/mailbox/mailbox-http.js +99 -0
  227. package/dist/heart/mailbox/mailbox-read.js +39 -0
  228. package/dist/heart/mailbox/mailbox-types.js +27 -0
  229. package/dist/heart/mailbox/mailbox-view.js +197 -0
  230. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  231. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  232. package/dist/heart/mailbox/readers/mail.js +375 -0
  233. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  234. package/dist/heart/mailbox/readers/sessions.js +232 -0
  235. package/dist/heart/mailbox/readers/shared.js +111 -0
  236. package/dist/heart/mcp/mcp-server.js +696 -0
  237. package/dist/heart/migrate-config.js +100 -0
  238. package/dist/heart/model-capabilities.js +59 -0
  239. package/dist/heart/orientation-frame.js +345 -0
  240. package/dist/heart/platform.js +81 -0
  241. package/dist/heart/primitives.js +1 -1
  242. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  243. package/dist/heart/private-runtime/index.js +18 -0
  244. package/dist/heart/private-runtime/ledger.js +221 -0
  245. package/dist/heart/private-runtime/policy.js +252 -0
  246. package/dist/heart/private-runtime/types.js +2 -0
  247. package/dist/heart/progress-story.js +42 -0
  248. package/dist/heart/provider-attempt.js +137 -0
  249. package/dist/heart/provider-binding-resolver.js +273 -0
  250. package/dist/heart/provider-credentials.js +449 -0
  251. package/dist/heart/provider-failover.js +311 -0
  252. package/dist/heart/provider-models.js +96 -0
  253. package/dist/heart/provider-ping.js +265 -0
  254. package/dist/heart/provider-readiness-cache.js +119 -0
  255. package/dist/heart/provider-visibility.js +188 -0
  256. package/dist/heart/providers/anthropic-token.js +131 -0
  257. package/dist/heart/providers/anthropic.js +236 -58
  258. package/dist/heart/providers/azure.js +104 -13
  259. package/dist/heart/providers/error-classification.js +127 -0
  260. package/dist/heart/providers/github-copilot.js +145 -0
  261. package/dist/heart/providers/minimax-vlm.js +189 -0
  262. package/dist/heart/providers/minimax.js +29 -7
  263. package/dist/heart/providers/openai-codex-token.js +349 -0
  264. package/dist/heart/providers/openai-codex.js +63 -39
  265. package/dist/heart/providers/openai-compatible.js +177 -0
  266. package/dist/heart/run-ledger.js +247 -0
  267. package/dist/heart/runtime-capability-check.js +170 -0
  268. package/dist/heart/runtime-credentials.js +607 -0
  269. package/dist/heart/runtime-cwd.js +87 -0
  270. package/dist/heart/sense-truth.js +79 -0
  271. package/dist/heart/session-activity.js +235 -0
  272. package/dist/heart/session-events.js +1318 -0
  273. package/dist/heart/session-playback-cli-main.js +5 -0
  274. package/dist/heart/session-playback-cli.js +36 -0
  275. package/dist/heart/session-playback.js +231 -0
  276. package/dist/heart/session-stats-cli-main.js +5 -0
  277. package/dist/heart/session-stats.js +182 -0
  278. package/dist/heart/session-transcript.js +133 -0
  279. package/dist/heart/start-of-turn-packet.js +372 -0
  280. package/dist/heart/steward-policy.js +302 -0
  281. package/dist/heart/streaming.js +682 -207
  282. package/dist/heart/structured-output.js +196 -0
  283. package/dist/heart/sync-classification.js +176 -0
  284. package/dist/heart/sync.js +449 -0
  285. package/dist/heart/target-resolution.js +127 -0
  286. package/dist/heart/tempo.js +93 -0
  287. package/dist/heart/temporal-view.js +41 -0
  288. package/dist/heart/timeouts.js +101 -0
  289. package/dist/heart/tool-activity-callbacks.js +59 -0
  290. package/dist/heart/tool-approval.js +342 -0
  291. package/dist/heart/tool-description.js +155 -0
  292. package/dist/heart/tool-friction.js +55 -0
  293. package/dist/heart/tool-loop.js +200 -0
  294. package/dist/heart/turn-context.js +481 -0
  295. package/dist/heart/turn-coordinator.js +28 -0
  296. package/dist/heart/versioning/ouro-bot-global-installer.js +129 -0
  297. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  298. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  299. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  300. package/dist/heart/{daemon → versioning}/ouro-uti.js +11 -2
  301. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  302. package/dist/heart/versioning/staged-restart.js +146 -0
  303. package/dist/heart/versioning/update-checker.js +116 -0
  304. package/dist/heart/versioning/update-hooks.js +154 -0
  305. package/dist/heart/versioning/version-intent.js +114 -0
  306. package/dist/heart/versioning/wrapper-publish-guard.js +86 -0
  307. package/dist/heart/work-card.js +380 -0
  308. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  309. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  310. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  311. package/dist/mailbox-ui/index.html +16 -0
  312. package/dist/mailroom/attention.js +167 -0
  313. package/dist/mailroom/autonomy.js +209 -0
  314. package/dist/mailroom/blob-store.js +889 -0
  315. package/dist/mailroom/body-cache.js +61 -0
  316. package/dist/mailroom/cache-sync-cli.js +58 -0
  317. package/dist/mailroom/core.js +803 -0
  318. package/dist/mailroom/entry.js +160 -0
  319. package/dist/mailroom/file-store.js +568 -0
  320. package/dist/mailroom/hosted-cache-sync.js +384 -0
  321. package/dist/mailroom/mbox-import.js +393 -0
  322. package/dist/mailroom/migration.js +164 -0
  323. package/dist/mailroom/outbound.js +380 -0
  324. package/dist/mailroom/policy.js +263 -0
  325. package/dist/mailroom/reader.js +292 -0
  326. package/dist/mailroom/search-cache.js +513 -0
  327. package/dist/mailroom/search-relevance.js +319 -0
  328. package/dist/mailroom/smtp-ingress.js +176 -0
  329. package/dist/mailroom/source-state.js +176 -0
  330. package/dist/mailroom/thread.js +109 -0
  331. package/dist/mailroom/travel-extract.js +89 -0
  332. package/dist/mind/bundle-manifest.js +93 -1
  333. package/dist/mind/context.js +287 -104
  334. package/dist/mind/desk-section.js +362 -0
  335. package/dist/mind/diary-integrity.js +60 -0
  336. package/dist/mind/{memory.js → diary.js} +90 -98
  337. package/dist/mind/embedding-provider.js +60 -0
  338. package/dist/mind/file-state.js +179 -0
  339. package/dist/mind/first-impressions.js +16 -2
  340. package/dist/mind/{associative-recall.js → note-search.js} +61 -60
  341. package/dist/mind/obligation-steering.js +227 -0
  342. package/dist/mind/pending.js +102 -9
  343. package/dist/mind/phrases.js +1 -0
  344. package/dist/mind/prompt-budget.js +479 -0
  345. package/dist/mind/prompt-refresh.js +3 -2
  346. package/dist/mind/prompt.js +1377 -140
  347. package/dist/mind/provenance-trust.js +26 -0
  348. package/dist/mind/record-paths.js +312 -0
  349. package/dist/mind/scrutiny.js +173 -0
  350. package/dist/mind/session-transaction.js +415 -0
  351. package/dist/mind/token-estimate.js +8 -12
  352. package/dist/nerves/cli-logging.js +22 -3
  353. package/dist/nerves/coverage/audit-rules.js +15 -6
  354. package/dist/nerves/coverage/audit.js +28 -2
  355. package/dist/nerves/coverage/cli.js +1 -1
  356. package/dist/nerves/coverage/contract.js +5 -5
  357. package/dist/nerves/coverage/file-completeness.js +139 -5
  358. package/dist/nerves/coverage/run-artifacts.js +56 -36
  359. package/dist/nerves/coverage/source-scanner.js +4 -4
  360. package/dist/nerves/event-buffer.js +111 -0
  361. package/dist/nerves/index.js +305 -9
  362. package/dist/nerves/observation.js +20 -0
  363. package/dist/nerves/redact.js +79 -0
  364. package/dist/nerves/review/cli-main.js +5 -0
  365. package/dist/nerves/review/cli.js +156 -0
  366. package/dist/nerves/review/core.js +159 -0
  367. package/dist/nerves/runtime.js +17 -1
  368. package/dist/repertoire/ado-client.js +17 -56
  369. package/dist/repertoire/ado-semantic.js +16 -10
  370. package/dist/repertoire/api-client.js +97 -0
  371. package/dist/repertoire/bitwarden-store.js +1045 -0
  372. package/dist/repertoire/bundle-templates.js +71 -0
  373. package/dist/repertoire/bw-installer.js +180 -0
  374. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  375. package/dist/repertoire/coding/context-pack.js +331 -0
  376. package/dist/repertoire/coding/feedback.js +322 -0
  377. package/dist/repertoire/coding/index.js +18 -3
  378. package/dist/repertoire/coding/manager.js +228 -14
  379. package/dist/repertoire/coding/spawner.js +61 -14
  380. package/dist/repertoire/coding/tools.js +279 -12
  381. package/dist/repertoire/coding/workbench-client.js +272 -0
  382. package/dist/repertoire/coding/workbench-manager.js +346 -0
  383. package/dist/repertoire/commerce-errors.js +109 -0
  384. package/dist/repertoire/commerce-self-test.js +156 -0
  385. package/dist/repertoire/credential-access.js +178 -0
  386. package/dist/repertoire/data/ado-endpoints.json +188 -0
  387. package/dist/repertoire/desk/classifier.js +362 -0
  388. package/dist/repertoire/duffel-client.js +185 -0
  389. package/dist/repertoire/github-client.js +14 -55
  390. package/dist/repertoire/graph-client.js +11 -52
  391. package/dist/repertoire/guardrails.js +1083 -0
  392. package/dist/repertoire/mcp-client.js +295 -0
  393. package/dist/repertoire/mcp-manager.js +434 -0
  394. package/dist/repertoire/mcp-tools.js +83 -0
  395. package/dist/repertoire/plugin-mcp.js +175 -0
  396. package/dist/repertoire/plugins.js +253 -0
  397. package/dist/repertoire/relationship-authorization.js +194 -0
  398. package/dist/repertoire/shell-sessions.js +133 -0
  399. package/dist/repertoire/skills.js +45 -24
  400. package/dist/repertoire/stripe-client.js +131 -0
  401. package/dist/repertoire/tool-arguments.js +148 -0
  402. package/dist/repertoire/tool-results.js +29 -0
  403. package/dist/repertoire/tools-a2a.js +699 -0
  404. package/dist/repertoire/tools-attachments.js +322 -0
  405. package/dist/repertoire/tools-awaiting.js +575 -0
  406. package/dist/repertoire/tools-base.js +85 -707
  407. package/dist/repertoire/tools-bluebubbles.js +95 -0
  408. package/dist/repertoire/tools-bridge.js +144 -0
  409. package/dist/repertoire/tools-bundle.js +993 -0
  410. package/dist/repertoire/tools-commerce.js +253 -0
  411. package/dist/repertoire/tools-config.js +186 -0
  412. package/dist/repertoire/tools-continuity.js +575 -0
  413. package/dist/repertoire/tools-credential.js +383 -0
  414. package/dist/repertoire/tools-evolution.js +527 -0
  415. package/dist/repertoire/tools-files.js +344 -0
  416. package/dist/repertoire/tools-flight.js +290 -0
  417. package/dist/repertoire/tools-flow.js +119 -0
  418. package/dist/repertoire/tools-github.js +3 -8
  419. package/dist/repertoire/tools-habits.js +103 -0
  420. package/dist/repertoire/tools-mail.js +1828 -0
  421. package/dist/repertoire/tools-notes.js +485 -0
  422. package/dist/repertoire/tools-obligations.js +182 -0
  423. package/dist/repertoire/tools-orientation.js +31 -0
  424. package/dist/repertoire/tools-record.js +482 -0
  425. package/dist/repertoire/tools-rsvp.js +139 -0
  426. package/dist/repertoire/tools-runtime.js +150 -0
  427. package/dist/repertoire/tools-session.js +1108 -0
  428. package/dist/repertoire/tools-shell.js +133 -0
  429. package/dist/repertoire/tools-steward-policy.js +95 -0
  430. package/dist/repertoire/tools-stripe.js +224 -0
  431. package/dist/repertoire/tools-surface.js +369 -0
  432. package/dist/repertoire/tools-teams.js +67 -61
  433. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  434. package/dist/repertoire/tools-travel.js +125 -0
  435. package/dist/repertoire/tools-trip.js +982 -0
  436. package/dist/repertoire/tools-unraid.js +484 -0
  437. package/dist/repertoire/tools-user-profile.js +146 -0
  438. package/dist/repertoire/tools-vault.js +40 -0
  439. package/dist/repertoire/tools-voice.js +145 -0
  440. package/dist/repertoire/tools.js +441 -102
  441. package/dist/repertoire/travel-api-client.js +360 -0
  442. package/dist/repertoire/unraid-client.js +155 -0
  443. package/dist/repertoire/unraid-restart.js +212 -0
  444. package/dist/repertoire/user-profile.js +131 -0
  445. package/dist/repertoire/vault-setup.js +246 -0
  446. package/dist/repertoire/vault-unlock.js +628 -0
  447. package/dist/rsvp/aisleplanner-client.js +354 -0
  448. package/dist/rsvp/cli.js +926 -0
  449. package/dist/rsvp/config.js +327 -0
  450. package/dist/rsvp/cutover.js +433 -0
  451. package/dist/rsvp/diagnostics.js +232 -0
  452. package/dist/rsvp/diff-renderer.js +176 -0
  453. package/dist/rsvp/habit-policy.js +110 -0
  454. package/dist/rsvp/habit-stage.js +123 -0
  455. package/dist/rsvp/incident-bundle.js +97 -0
  456. package/dist/rsvp/migration.js +204 -0
  457. package/dist/rsvp/native-habit-runner.js +630 -0
  458. package/dist/rsvp/outbound-state.js +628 -0
  459. package/dist/rsvp/query.js +118 -0
  460. package/dist/rsvp/replay.js +233 -0
  461. package/dist/rsvp/snapshot.js +232 -0
  462. package/dist/rsvp/spend-ledger.js +175 -0
  463. package/dist/scripts/claude-code-hook.js +41 -0
  464. package/dist/scripts/claude-code-stop-hook.js +47 -0
  465. package/dist/senses/a2a-entry.js +115 -0
  466. package/dist/senses/attention-queue.js +186 -0
  467. package/dist/senses/await-turn-message.js +58 -0
  468. package/dist/senses/bluebubbles/active-turns.js +216 -0
  469. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  470. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  471. package/dist/senses/bluebubbles/client.js +799 -0
  472. package/dist/senses/bluebubbles/context-packet.js +207 -0
  473. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  474. package/dist/senses/bluebubbles/entry.js +90 -0
  475. package/dist/senses/bluebubbles/inbound-log.js +127 -0
  476. package/dist/senses/bluebubbles/index.js +3839 -0
  477. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  478. package/dist/senses/bluebubbles/media.js +389 -0
  479. package/dist/senses/bluebubbles/model.js +392 -0
  480. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +57 -6
  481. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  482. package/dist/senses/bluebubbles/processed-log.js +133 -0
  483. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  484. package/dist/senses/bluebubbles/replay.js +284 -0
  485. package/dist/senses/bluebubbles/runtime-state.js +137 -0
  486. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  487. package/dist/senses/bluebubbles/session-cleanup.js +72 -0
  488. package/dist/senses/bluebubbles/webhook-registration.js +228 -0
  489. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  490. package/dist/senses/cli/bracketed-paste.js +82 -0
  491. package/dist/senses/cli/image-paste.js +287 -0
  492. package/dist/senses/cli/image-ref-navigation.js +75 -0
  493. package/dist/senses/cli/ink-app.js +156 -0
  494. package/dist/senses/cli/inline-diff.js +64 -0
  495. package/dist/senses/cli/input-keys.js +174 -0
  496. package/dist/senses/cli/kill-ring.js +86 -0
  497. package/dist/senses/cli/message-list.js +51 -0
  498. package/dist/senses/cli/ouro-tui.js +607 -0
  499. package/dist/senses/cli/spinner-imperative.js +135 -0
  500. package/dist/senses/cli/spinner.js +101 -0
  501. package/dist/senses/cli/status-line.js +60 -0
  502. package/dist/senses/cli/streaming-markdown.js +526 -0
  503. package/dist/senses/cli/tool-display.js +85 -0
  504. package/dist/senses/cli/tool-render.js +85 -0
  505. package/dist/senses/cli/tui-store.js +241 -0
  506. package/dist/senses/cli/virtual-list.js +35 -0
  507. package/dist/senses/cli-entry.js +60 -8
  508. package/dist/senses/cli-layout.js +187 -0
  509. package/dist/senses/cli.js +813 -281
  510. package/dist/senses/commands.js +66 -3
  511. package/dist/senses/context-packet-ledger.js +371 -0
  512. package/dist/senses/context-packets.js +154 -0
  513. package/dist/senses/continuity.js +94 -0
  514. package/dist/senses/habit-lifecycle-guard.js +24 -0
  515. package/dist/senses/habit-turn-message.js +160 -0
  516. package/dist/senses/ingress-evidence.js +2 -0
  517. package/dist/senses/mail-entry.js +66 -0
  518. package/dist/senses/mail.js +524 -0
  519. package/dist/senses/pipeline.js +1213 -0
  520. package/dist/senses/private-runtime-worker.js +859 -0
  521. package/dist/senses/private-runtime.js +1496 -0
  522. package/dist/senses/proactive-content-guard.js +51 -0
  523. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  524. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  525. package/dist/senses/sanctuary-grounding.js +118 -0
  526. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  527. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  528. package/dist/senses/sanctuary-health-runner.js +101 -0
  529. package/dist/senses/sanctuary-health.js +408 -0
  530. package/dist/senses/sanctuary-interactive-control.js +306 -0
  531. package/dist/senses/sanctuary-media-catalog-contract.js +235 -0
  532. package/dist/senses/sanctuary-media-optimization.js +514 -0
  533. package/dist/senses/sanctuary-runtime.js +338 -0
  534. package/dist/senses/sanctuary-sab.js +85 -0
  535. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  536. package/dist/senses/shared-turn.js +571 -0
  537. package/dist/senses/surface-tool.js +109 -0
  538. package/dist/senses/teams-entry.js +60 -8
  539. package/dist/senses/teams.js +953 -211
  540. package/dist/senses/telegram-admission.js +711 -0
  541. package/dist/senses/telegram-approval-runtime.js +566 -0
  542. package/dist/senses/telegram-attachments.js +182 -0
  543. package/dist/senses/telegram-audit-ledger.js +220 -0
  544. package/dist/senses/telegram-client.js +1677 -0
  545. package/dist/senses/telegram-effect-adapter.js +859 -0
  546. package/dist/senses/telegram-entry.js +83 -0
  547. package/dist/senses/telegram.js +2026 -0
  548. package/dist/senses/trust-gate.js +207 -2
  549. package/dist/senses/voice/audio-playback.js +237 -0
  550. package/dist/senses/voice/audio-routing.js +119 -0
  551. package/dist/senses/voice/elevenlabs.js +202 -0
  552. package/dist/senses/voice/floor-control.js +431 -0
  553. package/dist/senses/voice/floor-controller.js +115 -0
  554. package/dist/senses/voice/golden-path.js +116 -0
  555. package/dist/senses/voice/index.js +29 -0
  556. package/dist/senses/voice/meeting.js +113 -0
  557. package/dist/senses/voice/outbound.js +190 -0
  558. package/dist/senses/voice/phone.js +33 -0
  559. package/dist/senses/voice/playback.js +139 -0
  560. package/dist/senses/voice/realtime-eval.js +496 -0
  561. package/dist/senses/voice/realtime-trace.js +531 -0
  562. package/dist/senses/voice/transcript.js +70 -0
  563. package/dist/senses/voice/turn.js +191 -0
  564. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  565. package/dist/senses/voice/twilio-phone.js +5081 -0
  566. package/dist/senses/voice/types.js +2 -0
  567. package/dist/senses/voice/whisper.js +161 -0
  568. package/dist/senses/voice-entry.js +81 -0
  569. package/dist/senses/voice-realtime-eval-command.js +99 -0
  570. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  571. package/dist/senses/voice-twilio-entry.js +87 -0
  572. package/dist/trips/core.js +138 -0
  573. package/dist/trips/store.js +265 -0
  574. package/dist/util/frontmatter.js +69 -0
  575. package/npm-shrinkwrap.json +8144 -0
  576. package/package.json +82 -12
  577. package/skills/agent-commerce.md +113 -0
  578. package/skills/browser-navigation.md +117 -0
  579. package/skills/commerce-setup-guide.md +116 -0
  580. package/skills/commerce-setup.md +84 -0
  581. package/skills/configure-dev-tools.md +99 -0
  582. package/skills/travel-planning.md +138 -0
  583. package/AdoptionSpecialist.ouro/agent.json +0 -20
  584. package/AdoptionSpecialist.ouro/psyche/SOUL.md +0 -22
  585. package/dist/heart/daemon/specialist-orchestrator.js +0 -160
  586. package/dist/heart/daemon/specialist-prompt.js +0 -47
  587. package/dist/heart/daemon/specialist-session.js +0 -142
  588. package/dist/heart/daemon/specialist-tools.js +0 -132
  589. package/dist/heart/daemon/subagent-installer.js +0 -125
  590. package/dist/inner-worker-entry.js +0 -4
  591. package/dist/mind/friends/channel.js +0 -49
  592. package/dist/mind/friends/resolver.js +0 -84
  593. package/dist/mind/friends/store-file.js +0 -171
  594. package/dist/mind/friends/store.js +0 -4
  595. package/dist/mind/friends/tokens.js +0 -26
  596. package/dist/mind/friends/types.js +0 -21
  597. package/dist/repertoire/tasks/board.js +0 -122
  598. package/dist/repertoire/tasks/index.js +0 -210
  599. package/dist/repertoire/tasks/middleware.js +0 -65
  600. package/dist/repertoire/tasks/parser.js +0 -173
  601. package/dist/repertoire/tasks/scanner.js +0 -132
  602. package/dist/repertoire/tasks/transitions.js +0 -145
  603. package/dist/senses/bluebubbles-client.js +0 -279
  604. package/dist/senses/bluebubbles-entry.js +0 -11
  605. package/dist/senses/bluebubbles-model.js +0 -253
  606. package/dist/senses/bluebubbles.js +0 -332
  607. package/dist/senses/inner-dialog-worker.js +0 -61
  608. package/dist/senses/inner-dialog.js +0 -231
  609. package/subagents/README.md +0 -73
  610. package/subagents/work-doer.md +0 -233
  611. package/subagents/work-merger.md +0 -624
  612. package/subagents/work-planner.md +0 -373
  613. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  614. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  615. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  616. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  617. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  618. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  619. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  620. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  621. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  622. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  623. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  624. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
@@ -0,0 +1,392 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BlueBubblesIgnoredEventError = void 0;
4
+ exports.describeBlueBubblesReaction = describeBlueBubblesReaction;
5
+ exports.renderBlueBubblesReactionText = renderBlueBubblesReactionText;
6
+ exports.normalizeBlueBubblesEvent = normalizeBlueBubblesEvent;
7
+ const runtime_1 = require("../../nerves/runtime");
8
+ const render_1 = require("../../heart/attachments/render");
9
+ const bluebubbles_1 = require("../../heart/attachments/sources/bluebubbles");
10
+ const IGNORABLE_GUIDLESS_EVENT_TYPES = new Set([
11
+ "chat-read-status-changed",
12
+ ]);
13
+ class BlueBubblesIgnoredEventError extends Error {
14
+ eventType;
15
+ constructor(eventType, message) {
16
+ super(message);
17
+ this.name = "BlueBubblesIgnoredEventError";
18
+ this.eventType = eventType;
19
+ }
20
+ }
21
+ exports.BlueBubblesIgnoredEventError = BlueBubblesIgnoredEventError;
22
+ function asRecord(value) {
23
+ return value && typeof value === "object" && !Array.isArray(value)
24
+ ? value
25
+ : null;
26
+ }
27
+ function readString(record, key) {
28
+ if (!record)
29
+ return undefined;
30
+ const value = record[key];
31
+ return typeof value === "string" ? value : undefined;
32
+ }
33
+ function readNumber(record, key) {
34
+ if (!record)
35
+ return undefined;
36
+ const value = record[key];
37
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
38
+ }
39
+ function readBoolean(record, key) {
40
+ const value = record[key];
41
+ return typeof value === "boolean" ? value : undefined;
42
+ }
43
+ function normalizeHandle(raw) {
44
+ const trimmed = raw.trim();
45
+ if (!trimmed)
46
+ return "";
47
+ if (trimmed.includes("@"))
48
+ return trimmed.toLowerCase();
49
+ const compact = trimmed.replace(/[^\d+]/g, "");
50
+ return compact || trimmed;
51
+ }
52
+ function extractChatIdentifierFromGuid(chatGuid) {
53
+ if (!chatGuid)
54
+ return undefined;
55
+ const parts = chatGuid.split(";");
56
+ return parts.length >= 3 ? parts[2]?.trim() || undefined : undefined;
57
+ }
58
+ function buildChatRef(data, threadOriginatorGuid) {
59
+ void threadOriginatorGuid;
60
+ const chats = Array.isArray(data.chats) ? data.chats : [];
61
+ const chat = asRecord(chats[0]) ?? null;
62
+ const chatGuid = readString(chat, "guid");
63
+ const chatIdentifier = readString(chat, "chatIdentifier") ??
64
+ readString(chat, "identifier") ??
65
+ extractChatIdentifierFromGuid(chatGuid);
66
+ const displayName = readString(chat, "displayName")?.trim() || undefined;
67
+ const style = readNumber(chat, "style");
68
+ const isGroup = style === 43 || (chatGuid?.includes(";+;") ?? false) || Boolean(displayName);
69
+ const sessionKey = chatGuid?.trim()
70
+ ? `chat:${chatGuid.trim()}`
71
+ : `chat_identifier:${(chatIdentifier ?? "unknown").trim()}`;
72
+ // Extract participant handles from chat.participants (when available from BB API)
73
+ const rawParticipants = Array.isArray(chat?.participants) ? chat.participants : [];
74
+ const participantHandles = rawParticipants
75
+ .map((p) => {
76
+ const rec = asRecord(p);
77
+ const addr = readString(rec, "address") ?? readString(rec, "id");
78
+ return addr ? normalizeHandle(addr) : "";
79
+ })
80
+ .filter(Boolean);
81
+ return {
82
+ chatGuid: chatGuid?.trim() || undefined,
83
+ chatIdentifier: chatIdentifier?.trim() || undefined,
84
+ displayName,
85
+ isGroup,
86
+ sessionKey,
87
+ sendTarget: chatGuid?.trim()
88
+ ? { kind: "chat_guid", value: chatGuid.trim() }
89
+ : { kind: "chat_identifier", value: (chatIdentifier ?? "unknown").trim() },
90
+ participantHandles,
91
+ };
92
+ }
93
+ function extractSender(data, chat) {
94
+ const handle = asRecord(data.handle) ?? asRecord(data.sender) ?? null;
95
+ const observedRawId = readString(handle, "address") ??
96
+ readString(handle, "id") ??
97
+ readString(data, "senderId");
98
+ const observed = typeof observedRawId === "string" && observedRawId.trim().length > 0;
99
+ const rawId = observedRawId ??
100
+ chat.chatIdentifier ??
101
+ chat.chatGuid ??
102
+ "unknown";
103
+ const externalId = normalizeHandle(rawId);
104
+ const displayName = externalId || rawId || "Unknown";
105
+ return {
106
+ provider: "imessage-handle",
107
+ externalId,
108
+ rawId,
109
+ displayName,
110
+ observed,
111
+ };
112
+ }
113
+ function extractAttachments(data) {
114
+ const raw = Array.isArray(data.attachments) ? data.attachments : [];
115
+ return raw
116
+ .map((entry) => asRecord(entry))
117
+ .filter((entry) => entry !== null)
118
+ .map((entry) => ({
119
+ guid: readString(entry, "guid"),
120
+ mimeType: readString(entry, "mimeType"),
121
+ transferName: readString(entry, "transferName"),
122
+ totalBytes: readNumber(entry, "totalBytes"),
123
+ height: readNumber(entry, "height"),
124
+ width: readNumber(entry, "width"),
125
+ }));
126
+ }
127
+ function formatAttachmentText(attachments) {
128
+ if (attachments.length === 0)
129
+ return "";
130
+ const renderable = attachments
131
+ .filter((attachment) => typeof attachment.guid === "string" && attachment.guid.trim().length > 0)
132
+ .map((attachment) => (0, bluebubbles_1.buildBlueBubblesAttachmentRecord)(attachment));
133
+ if (renderable.length > 0) {
134
+ return (0, render_1.renderAttachmentBlock)(renderable);
135
+ }
136
+ const [first] = attachments;
137
+ return `[attachment: ${first.transferName?.trim() || "unknown"}]`;
138
+ }
139
+ function formatMessageText(data, attachments) {
140
+ const text = readString(data, "text")?.trim() ?? "";
141
+ const balloonBundleId = readString(data, "balloonBundleId")?.trim();
142
+ if (text) {
143
+ if (balloonBundleId === "com.apple.messages.URLBalloonProvider") {
144
+ return `${text}\n[link preview attached]`;
145
+ }
146
+ // B2 fix: when text and attachments both exist, append the attachment
147
+ // marker so downstream senses can see the guid/filename. Previously the
148
+ // marker was dropped whenever text was non-empty, which hid images from
149
+ // the agent when the user captioned a screenshot.
150
+ if (attachments.length > 0) {
151
+ return `${text}\n${formatAttachmentText(attachments)}`;
152
+ }
153
+ return text;
154
+ }
155
+ return formatAttachmentText(attachments);
156
+ }
157
+ function normalizeReactionName(value) {
158
+ // chat.db stores associated_message_type as an integer; BlueBubbles forwards it
159
+ // as either the integer, its decimal string, or a name ("love", "-love").
160
+ if (typeof value === "number") {
161
+ return Number.isFinite(value) && value !== 0 ? String(value) : undefined;
162
+ }
163
+ if (typeof value !== "string")
164
+ return undefined;
165
+ const trimmed = value.trim();
166
+ return trimmed ? trimmed.toLowerCase() : undefined;
167
+ }
168
+ /**
169
+ * iMessage tapbacks: associated_message_type 2000-2006 add a tapback, 3000-3006
170
+ * remove the same tapback. BlueBubbles may send either the code or the name.
171
+ */
172
+ const REACTION_VOCABULARY = [
173
+ { code: 2000, name: "love", verb: "loved", noun: "love" },
174
+ { code: 2001, name: "like", verb: "liked", noun: "like" },
175
+ { code: 2002, name: "dislike", verb: "disliked", noun: "dislike" },
176
+ { code: 2003, name: "laugh", verb: "laughed at", noun: "laugh" },
177
+ { code: 2004, name: "emphasize", verb: "emphasized", noun: "emphasis" },
178
+ { code: 2005, name: "question", verb: "questioned", noun: "question" },
179
+ { code: 2006, name: "custom", verb: "reacted with custom emoji to", noun: "custom emoji" },
180
+ ];
181
+ const REACTION_EXCERPT_MAX_LENGTH = 80;
182
+ function describeBlueBubblesReaction(raw, rawTransportValue = raw) {
183
+ const stripped = raw.startsWith("-") ? raw.slice(1) : raw;
184
+ const code = /^\d+$/.test(stripped) ? Number(stripped) : undefined;
185
+ const removal = raw.startsWith("-") || (code !== undefined && code >= 3000 && code < 4000);
186
+ const action = removal ? "remove" : "add";
187
+ const entry = REACTION_VOCABULARY.find((candidate) => candidate.name === stripped || candidate.code === code || candidate.code + 1000 === code);
188
+ const canonicalValue = entry?.name ?? "unknown";
189
+ if (!entry)
190
+ return { raw, rawTransportValue, canonicalValue, action };
191
+ return {
192
+ raw,
193
+ rawTransportValue,
194
+ canonicalValue,
195
+ action,
196
+ verb: entry.verb,
197
+ noun: entry.noun,
198
+ };
199
+ }
200
+ function reactionExcerpt(text) {
201
+ return text.length > REACTION_EXCERPT_MAX_LENGTH
202
+ ? `${text.slice(0, REACTION_EXCERPT_MAX_LENGTH - 3)}...`
203
+ : text;
204
+ }
205
+ function reactionTargetPhrase(target) {
206
+ const text = target.text?.trim();
207
+ if (text) {
208
+ const owner = target.fromMe === true ? "your" : target.fromMe === false ? "their" : "a";
209
+ return `${owner} message: "${reactionExcerpt(text)}"`;
210
+ }
211
+ // Never hand the agent a bare "reacted with love" stub — say plainly that the
212
+ // referent is missing so it can ask instead of guessing what was approved.
213
+ return target.guid
214
+ ? `an unidentified message (target guid ${target.guid}; its text could not be resolved)`
215
+ : "an unidentified message (the reaction carried no target message reference)";
216
+ }
217
+ /**
218
+ * Render a reaction as speech the agent can act on: what the tapback was, whether
219
+ * it was added or removed, and which message it points at.
220
+ */
221
+ function renderBlueBubblesReactionText(reaction, target) {
222
+ const phrase = reactionTargetPhrase(target);
223
+ if (reaction.action === "remove") {
224
+ const noun = reaction.noun ?? reaction.raw.replace(/^-/, "");
225
+ return `removed their ${noun} reaction from ${phrase}`;
226
+ }
227
+ return reaction.verb
228
+ ? `${reaction.verb} ${phrase}`
229
+ : `reacted with ${reaction.raw} to ${phrase}`;
230
+ }
231
+ function stripPartPrefix(guid) {
232
+ if (!guid)
233
+ return undefined;
234
+ const trimmed = guid.trim();
235
+ const marker = trimmed.lastIndexOf("/");
236
+ return marker >= 0 ? trimmed.slice(marker + 1) : trimmed;
237
+ }
238
+ // Reactions never reach here: `detectMutationType` returns "reaction" only when a
239
+ // reaction name was decoded, and that same name produces the descriptor the caller
240
+ // renders with `renderBlueBubblesReactionText` instead.
241
+ function buildMutationText(mutationType, data) {
242
+ if (mutationType === "edit") {
243
+ const editedText = readString(data, "text")?.trim() ?? "";
244
+ return editedText ? `edited message: ${editedText}` : "edited a message";
245
+ }
246
+ if (mutationType === "unsend") {
247
+ return "unsent a message";
248
+ }
249
+ if (mutationType === "read") {
250
+ return "message marked as read";
251
+ }
252
+ return "message marked as delivered";
253
+ }
254
+ function detectMutationType(eventType, data, reactionName) {
255
+ if (reactionName)
256
+ return "reaction";
257
+ if (eventType === "updated-message") {
258
+ if (readNumber(data, "dateRetracted") !== undefined)
259
+ return "unsend";
260
+ if (readNumber(data, "dateEdited") !== undefined)
261
+ return "edit";
262
+ if (readNumber(data, "dateRead") !== undefined)
263
+ return "read";
264
+ if (readBoolean(data, "isDelivered") || readNumber(data, "dateDelivered") !== undefined)
265
+ return "delivery";
266
+ }
267
+ return null;
268
+ }
269
+ function readProviderRevision(data) {
270
+ const value = data.revision;
271
+ if (typeof value !== "string" && typeof value !== "number")
272
+ return undefined;
273
+ const normalized = String(value).trim();
274
+ return normalized || undefined;
275
+ }
276
+ function mutationEffectiveTimestamp(mutationType, data) {
277
+ if (mutationType === "reaction")
278
+ return readNumber(data, "dateCreated");
279
+ if (mutationType === "edit")
280
+ return readNumber(data, "dateEdited");
281
+ if (mutationType === "unsend")
282
+ return readNumber(data, "dateRetracted");
283
+ if (mutationType === "read")
284
+ return readNumber(data, "dateRead");
285
+ return readNumber(data, "dateDelivered");
286
+ }
287
+ function normalizeBlueBubblesEvent(payload) {
288
+ const envelope = asRecord(payload);
289
+ const eventType = readString(envelope, "type")?.trim() ?? "";
290
+ const data = asRecord(envelope?.data);
291
+ if (!eventType || !data) {
292
+ (0, runtime_1.emitNervesEvent)({
293
+ level: "warn",
294
+ component: "senses",
295
+ event: "senses.bluebubbles_event_ignored",
296
+ message: "ignored invalid bluebubbles payload",
297
+ meta: { hasEnvelope: Boolean(envelope), eventType },
298
+ });
299
+ throw new Error("Invalid BlueBubbles payload");
300
+ }
301
+ const messageGuid = readString(data, "guid")?.trim();
302
+ if (!messageGuid) {
303
+ (0, runtime_1.emitNervesEvent)({
304
+ level: "warn",
305
+ component: "senses",
306
+ event: "senses.bluebubbles_event_ignored",
307
+ message: "ignored bluebubbles payload without guid",
308
+ meta: { eventType },
309
+ });
310
+ if (IGNORABLE_GUIDLESS_EVENT_TYPES.has(eventType)) {
311
+ throw new BlueBubblesIgnoredEventError(eventType, `Ignored BlueBubbles event '${eventType}' without data.guid`);
312
+ }
313
+ throw new Error("BlueBubbles payload is missing data.guid");
314
+ }
315
+ const threadOriginatorGuid = readString(data, "threadOriginatorGuid")?.trim() || undefined;
316
+ const chat = buildChatRef(data, threadOriginatorGuid);
317
+ const sender = extractSender(data, chat);
318
+ const timestamp = readNumber(data, "dateCreated") ?? Date.now();
319
+ const fromMe = readBoolean(data, "isFromMe") ?? null;
320
+ const attachments = extractAttachments(data);
321
+ const reactionName = normalizeReactionName(data.associatedMessageType);
322
+ const reaction = reactionName
323
+ ? describeBlueBubblesReaction(reactionName, String(data.associatedMessageType))
324
+ : undefined;
325
+ const targetMessageGuid = reaction
326
+ ? stripPartPrefix(readString(data, "associatedMessageGuid"))
327
+ : undefined;
328
+ const mutationType = detectMutationType(eventType, data, reactionName);
329
+ const revision = mutationType ? readProviderRevision(data) : undefined;
330
+ const effectiveTimestamp = mutationType
331
+ ? mutationEffectiveTimestamp(mutationType, data)
332
+ : undefined;
333
+ const editedText = mutationType === "edit" ? readString(data, "text") : undefined;
334
+ const retractionTimestamp = mutationType === "unsend"
335
+ ? readNumber(data, "dateRetracted")
336
+ : undefined;
337
+ const requiresRepair = (readBoolean(data, "hasPayloadData") ?? false) ||
338
+ attachments.length > 0 ||
339
+ eventType === "updated-message";
340
+ const result = mutationType
341
+ ? {
342
+ kind: "mutation",
343
+ eventType,
344
+ mutationType,
345
+ messageGuid,
346
+ targetMessageGuid,
347
+ timestamp,
348
+ fromMe,
349
+ sender,
350
+ chat,
351
+ shouldNotifyAgent: mutationType === "reaction" || mutationType === "edit" || mutationType === "unsend",
352
+ textForAgent: reaction
353
+ ? renderBlueBubblesReactionText(reaction, { guid: targetMessageGuid })
354
+ : buildMutationText(mutationType, data),
355
+ requiresRepair,
356
+ ...(reaction ? { reaction } : {}),
357
+ ...(editedText !== undefined ? { editedText } : {}),
358
+ ...(revision ? { revision } : {}),
359
+ ...(effectiveTimestamp !== undefined ? { effectiveTimestamp } : {}),
360
+ ...(retractionTimestamp !== undefined ? { retractionTimestamp } : {}),
361
+ }
362
+ : {
363
+ kind: "message",
364
+ eventType,
365
+ messageGuid,
366
+ timestamp,
367
+ fromMe,
368
+ sender,
369
+ chat,
370
+ text: readString(data, "text") ?? "",
371
+ textForAgent: formatMessageText(data, attachments),
372
+ attachments,
373
+ balloonBundleId: readString(data, "balloonBundleId")?.trim() || undefined,
374
+ hasPayloadData: readBoolean(data, "hasPayloadData") ?? false,
375
+ requiresRepair,
376
+ threadOriginatorGuid,
377
+ replyToGuid: threadOriginatorGuid,
378
+ };
379
+ (0, runtime_1.emitNervesEvent)({
380
+ component: "senses",
381
+ event: "senses.bluebubbles_event_normalized",
382
+ message: "normalized bluebubbles event",
383
+ meta: {
384
+ eventType,
385
+ kind: result.kind,
386
+ mutationType: result.kind === "mutation" ? result.mutationType : null,
387
+ sessionKey: result.chat.sessionKey,
388
+ fromMe,
389
+ },
390
+ });
391
+ return result;
392
+ }
@@ -35,15 +35,15 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.getBlueBubblesMutationLogPath = getBlueBubblesMutationLogPath;
37
37
  exports.recordBlueBubblesMutation = recordBlueBubblesMutation;
38
+ exports.listRecordedBlueBubblesMutations = listRecordedBlueBubblesMutations;
39
+ exports.listBlueBubblesRecoveryCandidates = listBlueBubblesRecoveryCandidates;
38
40
  const fs = __importStar(require("node:fs"));
39
- const os = __importStar(require("node:os"));
40
41
  const path = __importStar(require("node:path"));
41
- const runtime_1 = require("../nerves/runtime");
42
- function sanitizeKey(key) {
43
- return key.replace(/[/:]/g, "_");
44
- }
42
+ const runtime_1 = require("../../nerves/runtime");
43
+ const identity_1 = require("../../heart/identity");
44
+ const config_1 = require("../../heart/config");
45
45
  function getBlueBubblesMutationLogPath(agentName, sessionKey) {
46
- return path.join(os.homedir(), ".agentstate", agentName, "senses", "bluebubbles", "mutations", `${sanitizeKey(sessionKey)}.ndjson`);
46
+ return path.join((0, identity_1.getAgentRoot)(agentName), "state", "senses", "bluebubbles", "mutations", `${(0, config_1.sanitizeKey)(sessionKey)}.ndjson`);
47
47
  }
48
48
  function recordBlueBubblesMutation(agentName, event) {
49
49
  const filePath = getBlueBubblesMutationLogPath(agentName, event.chat.sessionKey);
@@ -74,3 +74,54 @@ function recordBlueBubblesMutation(agentName, event) {
74
74
  });
75
75
  return filePath;
76
76
  }
77
+ function readBlueBubblesMutationRows(agentName) {
78
+ const rootDir = path.join((0, identity_1.getAgentRoot)(agentName), "state", "senses", "bluebubbles", "mutations");
79
+ let files;
80
+ try {
81
+ files = fs.readdirSync(rootDir);
82
+ }
83
+ catch {
84
+ return [];
85
+ }
86
+ const entries = [];
87
+ for (const file of files.filter((entry) => entry.endsWith(".ndjson")).sort()) {
88
+ const filePath = path.join(rootDir, file);
89
+ let raw = "";
90
+ try {
91
+ raw = fs.readFileSync(filePath, "utf-8");
92
+ }
93
+ catch {
94
+ continue;
95
+ }
96
+ for (const line of raw.split("\n")) {
97
+ const trimmed = line.trim();
98
+ if (!trimmed)
99
+ continue;
100
+ try {
101
+ const entry = JSON.parse(trimmed);
102
+ if (typeof entry.messageGuid !== "string" || !entry.messageGuid.trim())
103
+ continue;
104
+ entries.push(entry);
105
+ }
106
+ catch {
107
+ // Keep malformed legacy rows inert while retaining readable audit rows.
108
+ }
109
+ }
110
+ }
111
+ return entries;
112
+ }
113
+ function listRecordedBlueBubblesMutations(agentName) {
114
+ return readBlueBubblesMutationRows(agentName).filter((entry) => (typeof entry.sessionKey === "string" && entry.sessionKey.trim().length > 0));
115
+ }
116
+ function listBlueBubblesRecoveryCandidates(agentName) {
117
+ const deduped = new Map();
118
+ for (const entry of readBlueBubblesMutationRows(agentName)) {
119
+ if (entry.fromMe !== false
120
+ || entry.shouldNotifyAgent
121
+ || (entry.mutationType !== "read" && entry.mutationType !== "delivery")) {
122
+ continue;
123
+ }
124
+ deduped.set(entry.messageGuid, entry);
125
+ }
126
+ return [...deduped.values()].sort((left, right) => left.recordedAt.localeCompare(right.recordedAt));
127
+ }