@ouro.bot/cli 0.1.0-alpha.6 → 0.1.0-alpha.600

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 (440) hide show
  1. package/README.md +229 -183
  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/SerpentGuide.ouro/agent.json +83 -0
  10. package/SerpentGuide.ouro/psyche/SOUL.md +25 -0
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/assets/ouroboros.png +0 -0
  14. package/changelog.json +4182 -0
  15. package/dist/arc/attention-types.js +8 -0
  16. package/dist/arc/cares.js +140 -0
  17. package/dist/arc/episodes.js +117 -0
  18. package/dist/arc/intentions.js +133 -0
  19. package/dist/arc/json-store.js +117 -0
  20. package/dist/arc/obligations.js +254 -0
  21. package/dist/arc/packets.js +193 -0
  22. package/dist/arc/presence.js +185 -0
  23. package/dist/arc/task-lifecycle.js +65 -0
  24. package/dist/heart/active-work.js +989 -0
  25. package/dist/heart/agent-entry.js +69 -3
  26. package/dist/heart/attachments/image-normalize.js +194 -0
  27. package/dist/heart/attachments/materialize.js +97 -0
  28. package/dist/heart/attachments/originals.js +88 -0
  29. package/dist/heart/attachments/render.js +29 -0
  30. package/dist/heart/attachments/sources/adapter.js +2 -0
  31. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  32. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  33. package/dist/heart/attachments/sources/index.js +16 -0
  34. package/dist/heart/attachments/store.js +103 -0
  35. package/dist/heart/attachments/types.js +93 -0
  36. package/dist/heart/auth/auth-flow.js +479 -0
  37. package/dist/heart/awaiting/await-alert.js +146 -0
  38. package/dist/heart/awaiting/await-expiry.js +108 -0
  39. package/dist/heart/awaiting/await-loader.js +91 -0
  40. package/dist/heart/awaiting/await-parser.js +141 -0
  41. package/dist/heart/awaiting/await-runtime-state.js +97 -0
  42. package/dist/heart/awaiting/await-scheduler.js +377 -0
  43. package/dist/heart/background-operations.js +281 -0
  44. package/dist/heart/bridges/manager.js +358 -0
  45. package/dist/heart/bridges/state-machine.js +135 -0
  46. package/dist/heart/bridges/store.js +123 -0
  47. package/dist/heart/bundle-state.js +168 -0
  48. package/dist/heart/commitments.js +142 -0
  49. package/dist/heart/config-registry.js +322 -0
  50. package/dist/heart/config.js +164 -135
  51. package/dist/heart/core.js +1069 -260
  52. package/dist/heart/cross-chat-delivery.js +131 -0
  53. package/dist/heart/daemon/agent-config-check.js +419 -0
  54. package/dist/heart/daemon/agent-discovery.js +180 -0
  55. package/dist/heart/daemon/agent-service.js +522 -0
  56. package/dist/heart/daemon/agentic-repair.js +547 -0
  57. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  58. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  59. package/dist/heart/daemon/cadence.js +70 -0
  60. package/dist/heart/daemon/cli-defaults.js +776 -0
  61. package/dist/heart/daemon/cli-exec.js +7571 -0
  62. package/dist/heart/daemon/cli-help.js +498 -0
  63. package/dist/heart/daemon/cli-parse.js +1599 -0
  64. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  65. package/dist/heart/daemon/cli-render.js +763 -0
  66. package/dist/heart/daemon/cli-types.js +8 -0
  67. package/dist/heart/daemon/connect-bay.js +323 -0
  68. package/dist/heart/daemon/daemon-cli.js +30 -758
  69. package/dist/heart/daemon/daemon-entry.js +540 -8
  70. package/dist/heart/daemon/daemon-health.js +176 -0
  71. package/dist/heart/daemon/daemon-rollup.js +57 -0
  72. package/dist/heart/daemon/daemon-runtime-sync.js +287 -0
  73. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  74. package/dist/heart/daemon/daemon.js +972 -20
  75. package/dist/heart/daemon/dns-workflow.js +394 -0
  76. package/dist/heart/daemon/doctor-types.js +8 -0
  77. package/dist/heart/daemon/doctor.js +873 -0
  78. package/dist/heart/daemon/health-monitor.js +122 -1
  79. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  80. package/dist/heart/daemon/hooks/bundle-meta.js +206 -0
  81. package/dist/heart/daemon/http-health-probe.js +80 -0
  82. package/dist/heart/daemon/human-command-screens.js +234 -0
  83. package/dist/heart/daemon/human-readiness.js +114 -0
  84. package/dist/heart/daemon/inner-status.js +89 -0
  85. package/dist/heart/daemon/interactive-repair.js +394 -0
  86. package/dist/heart/daemon/launchd.js +188 -0
  87. package/dist/heart/daemon/log-tailer.js +82 -12
  88. package/dist/heart/daemon/logs-prune.js +110 -0
  89. package/dist/heart/daemon/mcp-canary.js +297 -0
  90. package/dist/heart/daemon/message-router.js +17 -8
  91. package/dist/heart/daemon/os-cron-deps.js +135 -0
  92. package/dist/heart/daemon/os-cron.js +14 -12
  93. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  94. package/dist/heart/daemon/ouro-entry.js +3 -1
  95. package/dist/heart/daemon/process-manager.js +381 -26
  96. package/dist/heart/daemon/provider-discovery.js +137 -0
  97. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  98. package/dist/heart/daemon/pulse.js +475 -0
  99. package/dist/heart/daemon/readiness-repair.js +365 -0
  100. package/dist/heart/daemon/run-hooks.js +39 -0
  101. package/dist/heart/daemon/runtime-logging.js +67 -16
  102. package/dist/heart/daemon/runtime-metadata.js +191 -0
  103. package/dist/heart/daemon/runtime-mode.js +67 -0
  104. package/dist/heart/daemon/safe-mode.js +161 -0
  105. package/dist/heart/daemon/sense-manager.js +731 -0
  106. package/dist/heart/daemon/session-id-resolver.js +131 -0
  107. package/dist/heart/daemon/skill-management-installer.js +94 -0
  108. package/dist/heart/daemon/socket-client.js +349 -0
  109. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  110. package/dist/heart/daemon/startup-tui.js +330 -0
  111. package/dist/heart/daemon/task-scheduler.js +3 -25
  112. package/dist/heart/daemon/terminal-ui.js +499 -0
  113. package/dist/heart/daemon/thoughts.js +524 -0
  114. package/dist/heart/daemon/up-progress.js +366 -0
  115. package/dist/heart/daemon/vault-items.js +56 -0
  116. package/dist/heart/delegation.js +62 -0
  117. package/dist/heart/habits/habit-migration.js +189 -0
  118. package/dist/heart/habits/habit-parser.js +140 -0
  119. package/dist/heart/habits/habit-runtime-state.js +100 -0
  120. package/dist/heart/habits/habit-scheduler.js +372 -0
  121. package/dist/heart/{daemon → hatch}/hatch-animation.js +10 -3
  122. package/dist/heart/{daemon → hatch}/hatch-flow.js +34 -136
  123. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  124. package/dist/heart/hatch/specialist-orchestrator.js +129 -0
  125. package/dist/heart/hatch/specialist-prompt.js +102 -0
  126. package/dist/heart/hatch/specialist-tools.js +306 -0
  127. package/dist/heart/identity.js +281 -67
  128. package/dist/heart/kept-notes.js +357 -0
  129. package/dist/heart/kicks.js +2 -20
  130. package/dist/heart/machine-identity.js +161 -0
  131. package/dist/heart/mail-import-discovery.js +353 -0
  132. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  133. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  134. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  135. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  136. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  137. package/dist/heart/mailbox/mailbox-http.js +99 -0
  138. package/dist/heart/mailbox/mailbox-read.js +31 -0
  139. package/dist/heart/mailbox/mailbox-types.js +27 -0
  140. package/dist/heart/mailbox/mailbox-view.js +195 -0
  141. package/dist/heart/mailbox/readers/agent-machine.js +382 -0
  142. package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
  143. package/dist/heart/mailbox/readers/mail.js +367 -0
  144. package/dist/heart/mailbox/readers/runtime-readers.js +651 -0
  145. package/dist/heart/mailbox/readers/sessions.js +232 -0
  146. package/dist/heart/mailbox/readers/shared.js +111 -0
  147. package/dist/heart/mcp/mcp-server.js +656 -0
  148. package/dist/heart/migrate-config.js +100 -0
  149. package/dist/heart/model-capabilities.js +59 -0
  150. package/dist/heart/platform.js +81 -0
  151. package/dist/heart/progress-story.js +42 -0
  152. package/dist/heart/provider-attempt.js +134 -0
  153. package/dist/heart/provider-binding-resolver.js +267 -0
  154. package/dist/heart/provider-credentials.js +425 -0
  155. package/dist/heart/provider-failover.js +301 -0
  156. package/dist/heart/provider-models.js +81 -0
  157. package/dist/heart/provider-ping.js +262 -0
  158. package/dist/heart/provider-readiness-cache.js +40 -0
  159. package/dist/heart/provider-visibility.js +188 -0
  160. package/dist/heart/providers/anthropic-token.js +131 -0
  161. package/dist/heart/providers/anthropic.js +202 -50
  162. package/dist/heart/providers/azure.js +104 -13
  163. package/dist/heart/providers/error-classification.js +127 -0
  164. package/dist/heart/providers/github-copilot.js +145 -0
  165. package/dist/heart/providers/minimax-vlm.js +189 -0
  166. package/dist/heart/providers/minimax.js +29 -7
  167. package/dist/heart/providers/openai-codex.js +63 -39
  168. package/dist/heart/runtime-capability-check.js +170 -0
  169. package/dist/heart/runtime-credentials.js +367 -0
  170. package/dist/heart/runtime-cwd.js +87 -0
  171. package/dist/heart/sense-truth.js +70 -0
  172. package/dist/heart/session-activity.js +190 -0
  173. package/dist/heart/session-events.js +1149 -0
  174. package/dist/heart/session-playback-cli-main.js +5 -0
  175. package/dist/heart/session-playback-cli.js +36 -0
  176. package/dist/heart/session-playback.js +231 -0
  177. package/dist/heart/session-stats-cli-main.js +5 -0
  178. package/dist/heart/session-stats.js +182 -0
  179. package/dist/heart/session-transcript.js +243 -0
  180. package/dist/heart/start-of-turn-packet.js +345 -0
  181. package/dist/heart/streaming.js +129 -34
  182. package/dist/heart/sync-classification.js +176 -0
  183. package/dist/heart/sync.js +449 -0
  184. package/dist/heart/target-resolution.js +127 -0
  185. package/dist/heart/tempo.js +93 -0
  186. package/dist/heart/temporal-view.js +41 -0
  187. package/dist/heart/timeouts.js +101 -0
  188. package/dist/heart/tool-activity-callbacks.js +59 -0
  189. package/dist/heart/tool-description.js +143 -0
  190. package/dist/heart/tool-friction.js +55 -0
  191. package/dist/heart/tool-loop.js +200 -0
  192. package/dist/heart/turn-context.js +421 -0
  193. package/dist/heart/turn-coordinator.js +28 -0
  194. package/dist/heart/versioning/ouro-bot-global-installer.js +129 -0
  195. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  196. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  197. package/dist/heart/{daemon → versioning}/ouro-uti.js +11 -2
  198. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  199. package/dist/heart/versioning/staged-restart.js +146 -0
  200. package/dist/heart/versioning/update-checker.js +116 -0
  201. package/dist/heart/versioning/update-hooks.js +142 -0
  202. package/dist/heart/versioning/wrapper-publish-guard.js +86 -0
  203. package/dist/mailbox-ui/assets/index-B-461hes.js +61 -0
  204. package/dist/mailbox-ui/assets/index-BPr5vNuM.css +1 -0
  205. package/dist/mailbox-ui/index.html +15 -0
  206. package/dist/mailroom/attention.js +167 -0
  207. package/dist/mailroom/autonomy.js +209 -0
  208. package/dist/mailroom/blob-store.js +700 -0
  209. package/dist/mailroom/body-cache.js +61 -0
  210. package/dist/mailroom/core.js +788 -0
  211. package/dist/mailroom/entry.js +160 -0
  212. package/dist/mailroom/file-store.js +457 -0
  213. package/dist/mailroom/mbox-import.js +393 -0
  214. package/dist/mailroom/migration.js +164 -0
  215. package/dist/mailroom/outbound.js +380 -0
  216. package/dist/mailroom/policy.js +263 -0
  217. package/dist/mailroom/reader.js +233 -0
  218. package/dist/mailroom/search-cache.js +268 -0
  219. package/dist/mailroom/search-relevance.js +319 -0
  220. package/dist/mailroom/smtp-ingress.js +176 -0
  221. package/dist/mailroom/source-state.js +176 -0
  222. package/dist/mailroom/thread.js +109 -0
  223. package/dist/mailroom/travel-extract.js +89 -0
  224. package/dist/mind/bundle-manifest.js +77 -1
  225. package/dist/mind/context.js +174 -94
  226. package/dist/mind/diary-integrity.js +60 -0
  227. package/dist/mind/{memory.js → diary.js} +84 -96
  228. package/dist/mind/embedding-provider.js +60 -0
  229. package/dist/mind/file-state.js +179 -0
  230. package/dist/mind/first-impressions.js +16 -2
  231. package/dist/mind/friends/channel.js +74 -0
  232. package/dist/mind/friends/group-context.js +144 -0
  233. package/dist/mind/friends/resolver.js +54 -2
  234. package/dist/mind/friends/store-file.js +58 -3
  235. package/dist/mind/friends/trust-explanation.js +74 -0
  236. package/dist/mind/friends/types.js +10 -2
  237. package/dist/mind/journal-index.js +161 -0
  238. package/dist/mind/note-search.js +268 -0
  239. package/dist/mind/obligation-steering.js +221 -0
  240. package/dist/mind/pending.js +76 -9
  241. package/dist/mind/phrases.js +1 -0
  242. package/dist/mind/prompt-refresh.js +3 -2
  243. package/dist/mind/prompt.js +1267 -130
  244. package/dist/mind/provenance-trust.js +26 -0
  245. package/dist/mind/scrutiny.js +173 -0
  246. package/dist/mind/token-estimate.js +8 -12
  247. package/dist/nerves/cli-logging.js +22 -3
  248. package/dist/nerves/coverage/audit-rules.js +15 -6
  249. package/dist/nerves/coverage/audit.js +28 -2
  250. package/dist/nerves/coverage/cli.js +1 -1
  251. package/dist/nerves/coverage/contract.js +5 -5
  252. package/dist/nerves/coverage/file-completeness.js +129 -5
  253. package/dist/nerves/coverage/run-artifacts.js +1 -1
  254. package/dist/nerves/event-buffer.js +111 -0
  255. package/dist/nerves/index.js +224 -4
  256. package/dist/nerves/observation.js +20 -0
  257. package/dist/nerves/redact.js +79 -0
  258. package/dist/nerves/review/cli-main.js +5 -0
  259. package/dist/nerves/review/cli.js +156 -0
  260. package/dist/nerves/review/core.js +152 -0
  261. package/dist/nerves/runtime.js +5 -1
  262. package/dist/repertoire/ado-client.js +17 -56
  263. package/dist/repertoire/ado-semantic.js +11 -10
  264. package/dist/repertoire/api-client.js +97 -0
  265. package/dist/repertoire/bitwarden-store.js +997 -0
  266. package/dist/repertoire/bundle-templates.js +72 -0
  267. package/dist/repertoire/bw-installer.js +180 -0
  268. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  269. package/dist/repertoire/coding/context-pack.js +330 -0
  270. package/dist/repertoire/coding/feedback.js +301 -0
  271. package/dist/repertoire/coding/index.js +4 -1
  272. package/dist/repertoire/coding/manager.js +220 -13
  273. package/dist/repertoire/coding/spawner.js +58 -12
  274. package/dist/repertoire/coding/tools.js +209 -7
  275. package/dist/repertoire/commerce-errors.js +109 -0
  276. package/dist/repertoire/commerce-self-test.js +156 -0
  277. package/dist/repertoire/credential-access.js +178 -0
  278. package/dist/repertoire/data/ado-endpoints.json +188 -0
  279. package/dist/repertoire/duffel-client.js +185 -0
  280. package/dist/repertoire/github-client.js +14 -55
  281. package/dist/repertoire/graph-client.js +11 -52
  282. package/dist/repertoire/guardrails.js +396 -0
  283. package/dist/repertoire/mcp-client.js +295 -0
  284. package/dist/repertoire/mcp-manager.js +362 -0
  285. package/dist/repertoire/mcp-tools.js +63 -0
  286. package/dist/repertoire/shell-sessions.js +133 -0
  287. package/dist/repertoire/skills.js +15 -24
  288. package/dist/repertoire/stripe-client.js +131 -0
  289. package/dist/repertoire/tasks/board.js +43 -5
  290. package/dist/repertoire/tasks/fix.js +182 -0
  291. package/dist/repertoire/tasks/index.js +39 -13
  292. package/dist/repertoire/tasks/lifecycle.js +2 -2
  293. package/dist/repertoire/tasks/parser.js +3 -2
  294. package/dist/repertoire/tasks/scanner.js +194 -37
  295. package/dist/repertoire/tasks/transitions.js +16 -79
  296. package/dist/repertoire/tool-results.js +29 -0
  297. package/dist/repertoire/tools-attachments.js +317 -0
  298. package/dist/repertoire/tools-awaiting.js +360 -0
  299. package/dist/repertoire/tools-base.js +56 -707
  300. package/dist/repertoire/tools-bluebubbles.js +94 -0
  301. package/dist/repertoire/tools-bridge.js +142 -0
  302. package/dist/repertoire/tools-bundle.js +984 -0
  303. package/dist/repertoire/tools-config.js +185 -0
  304. package/dist/repertoire/tools-continuity.js +248 -0
  305. package/dist/repertoire/tools-credential.js +381 -0
  306. package/dist/repertoire/tools-files.js +342 -0
  307. package/dist/repertoire/tools-flight.js +224 -0
  308. package/dist/repertoire/tools-flow.js +119 -0
  309. package/dist/repertoire/tools-github.js +1 -7
  310. package/dist/repertoire/tools-mail.js +1916 -0
  311. package/dist/repertoire/tools-notes.js +421 -0
  312. package/dist/repertoire/tools-obligations.js +142 -0
  313. package/dist/repertoire/tools-runtime.js +61 -0
  314. package/dist/repertoire/tools-session.js +809 -0
  315. package/dist/repertoire/tools-shell.js +120 -0
  316. package/dist/repertoire/tools-stripe.js +180 -0
  317. package/dist/repertoire/tools-surface.js +345 -0
  318. package/dist/repertoire/tools-teams.js +64 -61
  319. package/dist/repertoire/tools-travel.js +125 -0
  320. package/dist/repertoire/tools-trip.js +604 -0
  321. package/dist/repertoire/tools-user-profile.js +144 -0
  322. package/dist/repertoire/tools-vault.js +40 -0
  323. package/dist/repertoire/tools-voice.js +144 -0
  324. package/dist/repertoire/tools.js +154 -98
  325. package/dist/repertoire/travel-api-client.js +360 -0
  326. package/dist/repertoire/user-profile.js +131 -0
  327. package/dist/repertoire/vault-setup.js +246 -0
  328. package/dist/repertoire/vault-unlock.js +594 -0
  329. package/dist/scripts/claude-code-hook.js +41 -0
  330. package/dist/scripts/claude-code-stop-hook.js +47 -0
  331. package/dist/senses/attention-queue.js +116 -0
  332. package/dist/senses/await-turn-message.js +58 -0
  333. package/dist/senses/bluebubbles/active-turns.js +216 -0
  334. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  335. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  336. package/dist/senses/bluebubbles/client.js +685 -0
  337. package/dist/senses/bluebubbles/entry.js +77 -0
  338. package/dist/senses/bluebubbles/inbound-log.js +126 -0
  339. package/dist/senses/bluebubbles/index.js +2548 -0
  340. package/dist/senses/bluebubbles/media.js +389 -0
  341. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +45 -16
  342. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +46 -6
  343. package/dist/senses/bluebubbles/processed-log.js +133 -0
  344. package/dist/senses/bluebubbles/replay.js +137 -0
  345. package/dist/senses/bluebubbles/runtime-state.js +137 -0
  346. package/dist/senses/bluebubbles/session-cleanup.js +72 -0
  347. package/dist/senses/bluebubbles-meta-guard.js +40 -0
  348. package/dist/senses/cli/bracketed-paste.js +82 -0
  349. package/dist/senses/cli/image-paste.js +287 -0
  350. package/dist/senses/cli/image-ref-navigation.js +75 -0
  351. package/dist/senses/cli/ink-app.js +156 -0
  352. package/dist/senses/cli/inline-diff.js +64 -0
  353. package/dist/senses/cli/input-keys.js +174 -0
  354. package/dist/senses/cli/kill-ring.js +86 -0
  355. package/dist/senses/cli/message-list.js +51 -0
  356. package/dist/senses/cli/ouro-tui.js +607 -0
  357. package/dist/senses/cli/spinner-imperative.js +135 -0
  358. package/dist/senses/cli/spinner.js +101 -0
  359. package/dist/senses/cli/status-line.js +60 -0
  360. package/dist/senses/cli/streaming-markdown.js +526 -0
  361. package/dist/senses/cli/tool-display.js +85 -0
  362. package/dist/senses/cli/tool-render.js +85 -0
  363. package/dist/senses/cli/tui-store.js +240 -0
  364. package/dist/senses/cli/virtual-list.js +35 -0
  365. package/dist/senses/cli-entry.js +60 -8
  366. package/dist/senses/cli-layout.js +187 -0
  367. package/dist/senses/cli.js +777 -264
  368. package/dist/senses/commands.js +66 -3
  369. package/dist/senses/continuity.js +94 -0
  370. package/dist/senses/habit-turn-message.js +108 -0
  371. package/dist/senses/inner-dialog-worker.js +209 -16
  372. package/dist/senses/inner-dialog.js +682 -91
  373. package/dist/senses/mail-entry.js +66 -0
  374. package/dist/senses/mail.js +379 -0
  375. package/dist/senses/pipeline.js +751 -0
  376. package/dist/senses/proactive-content-guard.js +51 -0
  377. package/dist/senses/shared-turn.js +392 -0
  378. package/dist/senses/surface-tool.js +70 -0
  379. package/dist/senses/teams-entry.js +60 -8
  380. package/dist/senses/teams.js +925 -195
  381. package/dist/senses/trust-gate.js +207 -2
  382. package/dist/senses/voice/audio-playback.js +237 -0
  383. package/dist/senses/voice/audio-routing.js +119 -0
  384. package/dist/senses/voice/elevenlabs.js +202 -0
  385. package/dist/senses/voice/floor-control.js +431 -0
  386. package/dist/senses/voice/floor-controller.js +115 -0
  387. package/dist/senses/voice/golden-path.js +116 -0
  388. package/dist/senses/voice/index.js +29 -0
  389. package/dist/senses/voice/meeting.js +113 -0
  390. package/dist/senses/voice/outbound.js +190 -0
  391. package/dist/senses/voice/phone.js +33 -0
  392. package/dist/senses/voice/playback.js +139 -0
  393. package/dist/senses/voice/realtime-eval.js +496 -0
  394. package/dist/senses/voice/realtime-trace.js +531 -0
  395. package/dist/senses/voice/transcript.js +70 -0
  396. package/dist/senses/voice/turn.js +191 -0
  397. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  398. package/dist/senses/voice/twilio-phone.js +5077 -0
  399. package/dist/senses/voice/types.js +2 -0
  400. package/dist/senses/voice/whisper.js +161 -0
  401. package/dist/senses/voice-entry.js +81 -0
  402. package/dist/senses/voice-realtime-eval-command.js +99 -0
  403. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  404. package/dist/senses/voice-twilio-entry.js +87 -0
  405. package/dist/trips/core.js +138 -0
  406. package/dist/trips/store.js +265 -0
  407. package/package.json +52 -7
  408. package/skills/agent-commerce.md +106 -0
  409. package/skills/browser-navigation.md +117 -0
  410. package/skills/commerce-setup-guide.md +116 -0
  411. package/skills/commerce-setup.md +84 -0
  412. package/skills/configure-dev-tools.md +99 -0
  413. package/skills/travel-planning.md +138 -0
  414. package/AdoptionSpecialist.ouro/agent.json +0 -20
  415. package/AdoptionSpecialist.ouro/psyche/SOUL.md +0 -22
  416. package/dist/heart/daemon/specialist-orchestrator.js +0 -160
  417. package/dist/heart/daemon/specialist-prompt.js +0 -40
  418. package/dist/heart/daemon/specialist-session.js +0 -142
  419. package/dist/heart/daemon/specialist-tools.js +0 -128
  420. package/dist/heart/daemon/subagent-installer.js +0 -125
  421. package/dist/inner-worker-entry.js +0 -4
  422. package/dist/mind/associative-recall.js +0 -197
  423. package/dist/senses/bluebubbles-client.js +0 -279
  424. package/dist/senses/bluebubbles-entry.js +0 -11
  425. package/dist/senses/bluebubbles.js +0 -332
  426. package/subagents/README.md +0 -73
  427. package/subagents/work-doer.md +0 -233
  428. package/subagents/work-merger.md +0 -624
  429. package/subagents/work-planner.md +0 -373
  430. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  431. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  432. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  433. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  434. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  435. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  436. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  437. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  438. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  439. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  440. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
@@ -1,279 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createBlueBubblesClient = createBlueBubblesClient;
4
- const node_crypto_1 = require("node:crypto");
5
- const config_1 = require("../heart/config");
6
- const runtime_1 = require("../nerves/runtime");
7
- const bluebubbles_model_1 = require("./bluebubbles-model");
8
- function buildBlueBubblesApiUrl(baseUrl, endpoint, password) {
9
- const root = baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
10
- const url = new URL(endpoint.replace(/^\//, ""), root);
11
- url.searchParams.set("password", password);
12
- return url.toString();
13
- }
14
- function asRecord(value) {
15
- return value && typeof value === "object" && !Array.isArray(value)
16
- ? value
17
- : null;
18
- }
19
- function extractMessageGuid(payload) {
20
- if (!payload || typeof payload !== "object")
21
- return undefined;
22
- const record = payload;
23
- const data = record.data && typeof record.data === "object" && !Array.isArray(record.data)
24
- ? record.data
25
- : null;
26
- const candidates = [
27
- record.messageGuid,
28
- record.messageId,
29
- record.guid,
30
- data?.messageGuid,
31
- data?.messageId,
32
- data?.guid,
33
- ];
34
- for (const candidate of candidates) {
35
- if (typeof candidate === "string" && candidate.trim()) {
36
- return candidate.trim();
37
- }
38
- }
39
- return undefined;
40
- }
41
- async function parseJsonBody(response) {
42
- const raw = await response.text();
43
- if (!raw.trim())
44
- return null;
45
- try {
46
- return JSON.parse(raw);
47
- }
48
- catch {
49
- return null;
50
- }
51
- }
52
- function buildRepairUrl(baseUrl, messageGuid, password) {
53
- const url = buildBlueBubblesApiUrl(baseUrl, `/api/v1/message/${encodeURIComponent(messageGuid)}`, password);
54
- const parsed = new URL(url);
55
- parsed.searchParams.set("with", "attachments,payloadData,chats,messageSummaryInfo");
56
- return parsed.toString();
57
- }
58
- function collectPreviewStrings(value, out, depth = 0) {
59
- if (depth > 4 || out.length >= 4)
60
- return;
61
- if (typeof value === "string") {
62
- const trimmed = value.trim();
63
- if (trimmed)
64
- out.push(trimmed);
65
- return;
66
- }
67
- if (Array.isArray(value)) {
68
- for (const entry of value)
69
- collectPreviewStrings(entry, out, depth + 1);
70
- return;
71
- }
72
- const record = asRecord(value);
73
- if (!record)
74
- return;
75
- const preferredKeys = ["title", "summary", "subtitle", "previewText", "siteName", "host", "url"];
76
- for (const key of preferredKeys) {
77
- if (out.length >= 4)
78
- break;
79
- collectPreviewStrings(record[key], out, depth + 1);
80
- }
81
- }
82
- function extractLinkPreviewText(data) {
83
- const values = [];
84
- collectPreviewStrings(data.payloadData, values);
85
- collectPreviewStrings(data.messageSummaryInfo, values);
86
- const unique = [...new Set(values.map((value) => value.trim()).filter(Boolean))];
87
- if (unique.length === 0)
88
- return undefined;
89
- return unique.slice(0, 2).join(" — ");
90
- }
91
- function applyRepairNotice(event, notice) {
92
- return {
93
- ...event,
94
- requiresRepair: false,
95
- repairNotice: notice,
96
- };
97
- }
98
- function hydrateTextForAgent(event, rawData) {
99
- if (event.kind !== "message") {
100
- return { ...event, requiresRepair: false };
101
- }
102
- if (event.balloonBundleId !== "com.apple.messages.URLBalloonProvider") {
103
- return { ...event, requiresRepair: false };
104
- }
105
- const previewText = extractLinkPreviewText(rawData);
106
- if (!previewText) {
107
- return { ...event, requiresRepair: false };
108
- }
109
- const base = event.text.trim();
110
- const textForAgent = base
111
- ? `${base}\n[link preview: ${previewText}]`
112
- : `[link preview: ${previewText}]`;
113
- return {
114
- ...event,
115
- textForAgent,
116
- requiresRepair: false,
117
- };
118
- }
119
- function extractRepairData(payload) {
120
- const record = asRecord(payload);
121
- return asRecord(record?.data) ?? record;
122
- }
123
- function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(), channelConfig = (0, config_1.getBlueBubblesChannelConfig)()) {
124
- return {
125
- async sendText(params) {
126
- const trimmedText = params.text.trim();
127
- if (!trimmedText) {
128
- throw new Error("BlueBubbles send requires non-empty text.");
129
- }
130
- if (!params.chat.chatGuid) {
131
- throw new Error("BlueBubbles send currently requires chat.chatGuid from the inbound event.");
132
- }
133
- const url = buildBlueBubblesApiUrl(config.serverUrl, "/api/v1/message/text", config.password);
134
- const body = {
135
- chatGuid: params.chat.chatGuid,
136
- tempGuid: (0, node_crypto_1.randomUUID)(),
137
- message: trimmedText,
138
- };
139
- if (params.replyToMessageGuid?.trim()) {
140
- body.method = "private-api";
141
- body.selectedMessageGuid = params.replyToMessageGuid.trim();
142
- body.partIndex = 0;
143
- }
144
- (0, runtime_1.emitNervesEvent)({
145
- component: "senses",
146
- event: "senses.bluebubbles_send_start",
147
- message: "sending bluebubbles message",
148
- meta: {
149
- chatGuid: params.chat.chatGuid,
150
- hasReplyTarget: Boolean(params.replyToMessageGuid?.trim()),
151
- },
152
- });
153
- const response = await fetch(url, {
154
- method: "POST",
155
- headers: { "Content-Type": "application/json" },
156
- body: JSON.stringify(body),
157
- signal: AbortSignal.timeout(channelConfig.requestTimeoutMs),
158
- });
159
- if (!response.ok) {
160
- const errorText = await response.text().catch(() => "");
161
- (0, runtime_1.emitNervesEvent)({
162
- level: "error",
163
- component: "senses",
164
- event: "senses.bluebubbles_send_error",
165
- message: "bluebubbles send failed",
166
- meta: {
167
- status: response.status,
168
- reason: errorText || "unknown",
169
- },
170
- });
171
- throw new Error(`BlueBubbles send failed (${response.status}): ${errorText || "unknown"}`);
172
- }
173
- const payload = await parseJsonBody(response);
174
- const messageGuid = extractMessageGuid(payload);
175
- (0, runtime_1.emitNervesEvent)({
176
- component: "senses",
177
- event: "senses.bluebubbles_send_end",
178
- message: "bluebubbles message sent",
179
- meta: {
180
- chatGuid: params.chat.chatGuid,
181
- messageGuid: messageGuid ?? null,
182
- },
183
- });
184
- return { messageGuid };
185
- },
186
- async repairEvent(event) {
187
- if (!event.requiresRepair) {
188
- (0, runtime_1.emitNervesEvent)({
189
- component: "senses",
190
- event: "senses.bluebubbles_repair_skipped",
191
- message: "bluebubbles event repair skipped",
192
- meta: {
193
- kind: event.kind,
194
- messageGuid: event.messageGuid,
195
- },
196
- });
197
- return event;
198
- }
199
- (0, runtime_1.emitNervesEvent)({
200
- component: "senses",
201
- event: "senses.bluebubbles_repair_start",
202
- message: "repairing bluebubbles event by guid",
203
- meta: {
204
- kind: event.kind,
205
- messageGuid: event.messageGuid,
206
- eventType: event.eventType,
207
- },
208
- });
209
- const url = buildRepairUrl(config.serverUrl, event.messageGuid, config.password);
210
- try {
211
- const response = await fetch(url, {
212
- method: "GET",
213
- signal: AbortSignal.timeout(channelConfig.requestTimeoutMs),
214
- });
215
- if (!response.ok) {
216
- const errorText = await response.text().catch(() => "");
217
- const repaired = applyRepairNotice(event, `BlueBubbles repair failed: ${errorText || `HTTP ${response.status}`}`);
218
- (0, runtime_1.emitNervesEvent)({
219
- level: "warn",
220
- component: "senses",
221
- event: "senses.bluebubbles_repair_error",
222
- message: "bluebubbles repair request failed",
223
- meta: {
224
- messageGuid: event.messageGuid,
225
- status: response.status,
226
- reason: errorText || "unknown",
227
- },
228
- });
229
- return repaired;
230
- }
231
- const payload = await parseJsonBody(response);
232
- const data = extractRepairData(payload);
233
- if (!data || typeof data.guid !== "string") {
234
- const repaired = applyRepairNotice(event, "BlueBubbles repair failed: invalid message payload");
235
- (0, runtime_1.emitNervesEvent)({
236
- level: "warn",
237
- component: "senses",
238
- event: "senses.bluebubbles_repair_error",
239
- message: "bluebubbles repair returned unusable payload",
240
- meta: {
241
- messageGuid: event.messageGuid,
242
- },
243
- });
244
- return repaired;
245
- }
246
- const normalized = (0, bluebubbles_model_1.normalizeBlueBubblesEvent)({
247
- type: event.eventType,
248
- data,
249
- });
250
- const hydrated = hydrateTextForAgent(normalized, data);
251
- (0, runtime_1.emitNervesEvent)({
252
- component: "senses",
253
- event: "senses.bluebubbles_repair_end",
254
- message: "bluebubbles event repaired",
255
- meta: {
256
- kind: hydrated.kind,
257
- messageGuid: hydrated.messageGuid,
258
- repairedFrom: event.kind,
259
- },
260
- });
261
- return hydrated;
262
- }
263
- catch (error) {
264
- const reason = error instanceof Error ? error.message : String(error);
265
- (0, runtime_1.emitNervesEvent)({
266
- level: "warn",
267
- component: "senses",
268
- event: "senses.bluebubbles_repair_error",
269
- message: "bluebubbles repair threw",
270
- meta: {
271
- messageGuid: event.messageGuid,
272
- reason,
273
- },
274
- });
275
- return applyRepairNotice(event, `BlueBubbles repair failed: ${reason}`);
276
- }
277
- },
278
- };
279
- }
@@ -1,11 +0,0 @@
1
- "use strict";
2
- // Thin entrypoint for `npm run bluebubbles` / `node dist/senses/bluebubbles-entry.js --agent <name>`.
3
- // Separated from bluebubbles.ts so the BlueBubbles adapter stays testable.
4
- Object.defineProperty(exports, "__esModule", { value: true });
5
- if (!process.argv.includes("--agent")) {
6
- // eslint-disable-next-line no-console -- pre-boot guard: --agent check before imports
7
- console.error("Missing required --agent <name> argument.\nUsage: node dist/senses/bluebubbles-entry.js --agent ouroboros");
8
- process.exit(1);
9
- }
10
- const bluebubbles_1 = require("./bluebubbles");
11
- (0, bluebubbles_1.startBlueBubblesApp)();
@@ -1,332 +0,0 @@
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.handleBlueBubblesEvent = handleBlueBubblesEvent;
37
- exports.createBlueBubblesWebhookHandler = createBlueBubblesWebhookHandler;
38
- exports.startBlueBubblesApp = startBlueBubblesApp;
39
- const http = __importStar(require("node:http"));
40
- const path = __importStar(require("node:path"));
41
- const core_1 = require("../heart/core");
42
- const config_1 = require("../heart/config");
43
- const identity_1 = require("../heart/identity");
44
- const context_1 = require("../mind/context");
45
- const tokens_1 = require("../mind/friends/tokens");
46
- const resolver_1 = require("../mind/friends/resolver");
47
- const store_file_1 = require("../mind/friends/store-file");
48
- const prompt_1 = require("../mind/prompt");
49
- const runtime_1 = require("../nerves/runtime");
50
- const bluebubbles_model_1 = require("./bluebubbles-model");
51
- const bluebubbles_client_1 = require("./bluebubbles-client");
52
- const bluebubbles_mutation_log_1 = require("./bluebubbles-mutation-log");
53
- const defaultDeps = {
54
- getAgentName: identity_1.getAgentName,
55
- buildSystem: prompt_1.buildSystem,
56
- runAgent: core_1.runAgent,
57
- loadSession: context_1.loadSession,
58
- postTurn: context_1.postTurn,
59
- sessionPath: config_1.sessionPath,
60
- accumulateFriendTokens: tokens_1.accumulateFriendTokens,
61
- createClient: () => (0, bluebubbles_client_1.createBlueBubblesClient)(),
62
- recordMutation: bluebubbles_mutation_log_1.recordBlueBubblesMutation,
63
- createFriendStore: () => new store_file_1.FileFriendStore(path.join((0, identity_1.getAgentRoot)(), "friends")),
64
- createFriendResolver: (store, params) => new resolver_1.FriendResolver(store, params),
65
- createServer: http.createServer,
66
- };
67
- function resolveFriendParams(event) {
68
- if (event.chat.isGroup) {
69
- const groupKey = event.chat.chatGuid ?? event.chat.chatIdentifier ?? event.sender.externalId;
70
- return {
71
- provider: "imessage-handle",
72
- externalId: `group:${groupKey}`,
73
- displayName: event.chat.displayName ?? "Unknown Group",
74
- channel: "bluebubbles",
75
- };
76
- }
77
- return {
78
- provider: "imessage-handle",
79
- externalId: event.sender.externalId || event.sender.rawId,
80
- displayName: event.sender.displayName || "Unknown",
81
- channel: "bluebubbles",
82
- };
83
- }
84
- function buildInboundText(event) {
85
- const baseText = event.repairNotice?.trim()
86
- ? `${event.textForAgent}\n[${event.repairNotice.trim()}]`
87
- : event.textForAgent;
88
- if (!event.chat.isGroup)
89
- return baseText;
90
- if (event.kind === "mutation") {
91
- return `${event.sender.displayName} ${baseText}`;
92
- }
93
- return `${event.sender.displayName}: ${baseText}`;
94
- }
95
- function createBlueBubblesCallbacks(client, chat, replyToMessageGuid) {
96
- let textBuffer = "";
97
- return {
98
- onModelStart() {
99
- (0, runtime_1.emitNervesEvent)({
100
- component: "senses",
101
- event: "senses.bluebubbles_turn_start",
102
- message: "bluebubbles turn started",
103
- meta: { chatGuid: chat.chatGuid ?? null },
104
- });
105
- },
106
- onModelStreamStart() {
107
- (0, runtime_1.emitNervesEvent)({
108
- component: "senses",
109
- event: "senses.bluebubbles_stream_start",
110
- message: "bluebubbles non-streaming response started",
111
- meta: {},
112
- });
113
- },
114
- onTextChunk(text) {
115
- textBuffer += text;
116
- },
117
- onReasoningChunk(_text) { },
118
- onToolStart(name, _args) {
119
- (0, runtime_1.emitNervesEvent)({
120
- component: "senses",
121
- event: "senses.bluebubbles_tool_start",
122
- message: "bluebubbles tool execution started",
123
- meta: { name },
124
- });
125
- },
126
- onToolEnd(name, summary, success) {
127
- (0, runtime_1.emitNervesEvent)({
128
- component: "senses",
129
- event: "senses.bluebubbles_tool_end",
130
- message: "bluebubbles tool execution completed",
131
- meta: { name, success, summary },
132
- });
133
- },
134
- onError(error, severity) {
135
- (0, runtime_1.emitNervesEvent)({
136
- level: severity === "terminal" ? "error" : "warn",
137
- component: "senses",
138
- event: "senses.bluebubbles_turn_error",
139
- message: "bluebubbles turn callback error",
140
- meta: { severity, reason: error.message },
141
- });
142
- },
143
- onClearText() {
144
- textBuffer = "";
145
- },
146
- async flush() {
147
- const trimmed = textBuffer.trim();
148
- if (!trimmed) {
149
- return;
150
- }
151
- textBuffer = "";
152
- await client.sendText({
153
- chat,
154
- text: trimmed,
155
- replyToMessageGuid,
156
- });
157
- },
158
- };
159
- }
160
- async function readRequestBody(req) {
161
- let body = "";
162
- for await (const chunk of req) {
163
- body += chunk.toString();
164
- }
165
- return body;
166
- }
167
- function writeJson(res, statusCode, payload) {
168
- res.statusCode = statusCode;
169
- res.setHeader("Content-Type", "application/json; charset=utf-8");
170
- res.end(JSON.stringify(payload));
171
- }
172
- function isWebhookPasswordValid(url, expectedPassword) {
173
- const provided = url.searchParams.get("password");
174
- return !provided || provided === expectedPassword;
175
- }
176
- async function handleBlueBubblesEvent(payload, deps = {}) {
177
- const resolvedDeps = { ...defaultDeps, ...deps };
178
- const client = resolvedDeps.createClient();
179
- const event = await client.repairEvent((0, bluebubbles_model_1.normalizeBlueBubblesEvent)(payload));
180
- if (event.fromMe) {
181
- (0, runtime_1.emitNervesEvent)({
182
- component: "senses",
183
- event: "senses.bluebubbles_from_me_ignored",
184
- message: "ignored from-me bluebubbles event",
185
- meta: {
186
- messageGuid: event.messageGuid,
187
- kind: event.kind,
188
- },
189
- });
190
- return { handled: true, notifiedAgent: false, kind: event.kind, reason: "from_me" };
191
- }
192
- if (event.kind === "mutation") {
193
- try {
194
- resolvedDeps.recordMutation(resolvedDeps.getAgentName(), event);
195
- }
196
- catch (error) {
197
- (0, runtime_1.emitNervesEvent)({
198
- level: "error",
199
- component: "senses",
200
- event: "senses.bluebubbles_mutation_log_error",
201
- message: "failed recording bluebubbles mutation sidecar",
202
- meta: {
203
- messageGuid: event.messageGuid,
204
- mutationType: event.mutationType,
205
- reason: error instanceof Error ? error.message : String(error),
206
- },
207
- });
208
- }
209
- }
210
- if (event.kind === "mutation" && !event.shouldNotifyAgent) {
211
- (0, runtime_1.emitNervesEvent)({
212
- component: "senses",
213
- event: "senses.bluebubbles_state_mutation_recorded",
214
- message: "recorded non-notify bluebubbles mutation",
215
- meta: {
216
- messageGuid: event.messageGuid,
217
- mutationType: event.mutationType,
218
- },
219
- });
220
- return { handled: true, notifiedAgent: false, kind: event.kind, reason: "mutation_state_only" };
221
- }
222
- const store = resolvedDeps.createFriendStore();
223
- const resolver = resolvedDeps.createFriendResolver(store, resolveFriendParams(event));
224
- const context = await resolver.resolve();
225
- const toolContext = {
226
- signin: async () => undefined,
227
- friendStore: store,
228
- summarize: (0, core_1.createSummarize)(),
229
- context,
230
- };
231
- const friendId = context.friend.id;
232
- const sessPath = resolvedDeps.sessionPath(friendId, "bluebubbles", event.chat.sessionKey);
233
- const existing = resolvedDeps.loadSession(sessPath);
234
- const messages = existing?.messages && existing.messages.length > 0
235
- ? existing.messages
236
- : [{ role: "system", content: await resolvedDeps.buildSystem("bluebubbles", undefined, context) }];
237
- messages.push({ role: "user", content: buildInboundText(event) });
238
- const callbacks = createBlueBubblesCallbacks(client, event.chat, event.kind === "message" ? event.messageGuid : undefined);
239
- const controller = new AbortController();
240
- const agentOptions = {
241
- toolContext,
242
- };
243
- const result = await resolvedDeps.runAgent(messages, callbacks, "bluebubbles", controller.signal, agentOptions);
244
- await callbacks.flush();
245
- resolvedDeps.postTurn(messages, sessPath, result.usage);
246
- await resolvedDeps.accumulateFriendTokens(store, friendId, result.usage);
247
- (0, runtime_1.emitNervesEvent)({
248
- component: "senses",
249
- event: "senses.bluebubbles_turn_end",
250
- message: "bluebubbles event handled",
251
- meta: {
252
- messageGuid: event.messageGuid,
253
- kind: event.kind,
254
- sessionKey: event.chat.sessionKey,
255
- },
256
- });
257
- return {
258
- handled: true,
259
- notifiedAgent: true,
260
- kind: event.kind,
261
- };
262
- }
263
- function createBlueBubblesWebhookHandler(deps = {}) {
264
- return async (req, res) => {
265
- const url = new URL(req.url ?? "/", "http://127.0.0.1");
266
- const channelConfig = (0, config_1.getBlueBubblesChannelConfig)();
267
- const runtimeConfig = (0, config_1.getBlueBubblesConfig)();
268
- if (url.pathname !== channelConfig.webhookPath) {
269
- writeJson(res, 404, { error: "Not found" });
270
- return;
271
- }
272
- if (req.method !== "POST") {
273
- writeJson(res, 405, { error: "Method not allowed" });
274
- return;
275
- }
276
- if (!isWebhookPasswordValid(url, runtimeConfig.password)) {
277
- writeJson(res, 401, { error: "Unauthorized" });
278
- return;
279
- }
280
- let payload;
281
- try {
282
- const rawBody = await readRequestBody(req);
283
- payload = JSON.parse(rawBody);
284
- }
285
- catch (error) {
286
- (0, runtime_1.emitNervesEvent)({
287
- level: "warn",
288
- component: "senses",
289
- event: "senses.bluebubbles_webhook_bad_json",
290
- message: "failed to parse bluebubbles webhook body",
291
- meta: {
292
- reason: error instanceof Error ? error.message : String(error),
293
- },
294
- });
295
- writeJson(res, 400, { error: "Invalid JSON body" });
296
- return;
297
- }
298
- try {
299
- const result = await handleBlueBubblesEvent(payload, deps);
300
- writeJson(res, 200, result);
301
- }
302
- catch (error) {
303
- (0, runtime_1.emitNervesEvent)({
304
- level: "error",
305
- component: "senses",
306
- event: "senses.bluebubbles_webhook_error",
307
- message: "bluebubbles webhook handling failed",
308
- meta: {
309
- reason: error instanceof Error ? error.message : String(error),
310
- },
311
- });
312
- writeJson(res, 500, {
313
- error: error instanceof Error ? error.message : String(error),
314
- });
315
- }
316
- };
317
- }
318
- function startBlueBubblesApp(deps = {}) {
319
- const resolvedDeps = { ...defaultDeps, ...deps };
320
- resolvedDeps.createClient();
321
- const channelConfig = (0, config_1.getBlueBubblesChannelConfig)();
322
- const server = resolvedDeps.createServer(createBlueBubblesWebhookHandler(deps));
323
- server.listen(channelConfig.port, () => {
324
- (0, runtime_1.emitNervesEvent)({
325
- component: "channels",
326
- event: "channel.app_started",
327
- message: "BlueBubbles sense started",
328
- meta: { port: channelConfig.port, webhookPath: channelConfig.webhookPath },
329
- });
330
- });
331
- return server;
332
- }