@ouro.bot/cli 0.1.0-alpha.43 → 0.1.0-alpha.430

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 (337) hide show
  1. package/README.md +123 -15
  2. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +3 -2
  3. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  4. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  5. package/changelog.json +2715 -9
  6. package/dist/arc/attention-types.js +8 -0
  7. package/dist/arc/cares.js +140 -0
  8. package/dist/arc/episodes.js +117 -0
  9. package/dist/arc/intentions.js +133 -0
  10. package/dist/arc/json-store.js +117 -0
  11. package/dist/arc/obligations.js +237 -0
  12. package/dist/arc/packets.js +193 -0
  13. package/dist/arc/presence.js +185 -0
  14. package/dist/arc/task-lifecycle.js +65 -0
  15. package/dist/heart/active-work.js +832 -0
  16. package/dist/heart/agent-entry.js +58 -3
  17. package/dist/heart/attachments/image-normalize.js +194 -0
  18. package/dist/heart/attachments/materialize.js +97 -0
  19. package/dist/heart/attachments/originals.js +88 -0
  20. package/dist/heart/attachments/render.js +29 -0
  21. package/dist/heart/attachments/sources/adapter.js +2 -0
  22. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  23. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  24. package/dist/heart/attachments/sources/index.js +16 -0
  25. package/dist/heart/attachments/store.js +103 -0
  26. package/dist/heart/attachments/types.js +93 -0
  27. package/dist/heart/auth/auth-flow.js +426 -0
  28. package/dist/heart/bridges/manager.js +358 -0
  29. package/dist/heart/bridges/state-machine.js +135 -0
  30. package/dist/heart/bridges/store.js +123 -0
  31. package/dist/heart/bundle-state.js +168 -0
  32. package/dist/heart/commitments.js +111 -0
  33. package/dist/heart/config-registry.js +304 -0
  34. package/dist/heart/config.js +110 -128
  35. package/dist/heart/core.js +745 -227
  36. package/dist/heart/cross-chat-delivery.js +131 -0
  37. package/dist/heart/daemon/agent-config-check.js +424 -0
  38. package/dist/heart/daemon/agent-discovery.js +79 -3
  39. package/dist/heart/daemon/agent-service.js +360 -0
  40. package/dist/heart/daemon/agentic-repair.js +214 -0
  41. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  42. package/dist/heart/daemon/cadence.js +70 -0
  43. package/dist/heart/daemon/cli-defaults.js +604 -0
  44. package/dist/heart/daemon/cli-exec.js +5094 -0
  45. package/dist/heart/daemon/cli-help.js +428 -0
  46. package/dist/heart/daemon/cli-parse.js +1156 -0
  47. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  48. package/dist/heart/daemon/cli-render.js +561 -0
  49. package/dist/heart/daemon/cli-types.js +8 -0
  50. package/dist/heart/daemon/connect-bay.js +442 -0
  51. package/dist/heart/daemon/daemon-cli.js +28 -1582
  52. package/dist/heart/daemon/daemon-entry.js +356 -3
  53. package/dist/heart/daemon/daemon-health.js +141 -0
  54. package/dist/heart/daemon/daemon-runtime-sync.js +175 -12
  55. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  56. package/dist/heart/daemon/daemon.js +684 -58
  57. package/dist/heart/daemon/doctor-types.js +8 -0
  58. package/dist/heart/daemon/doctor.js +427 -0
  59. package/dist/heart/daemon/health-monitor.js +79 -1
  60. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  61. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  62. package/dist/heart/daemon/http-health-probe.js +80 -0
  63. package/dist/heart/daemon/human-command-screens.js +140 -0
  64. package/dist/heart/daemon/human-readiness.js +114 -0
  65. package/dist/heart/daemon/inner-status.js +89 -0
  66. package/dist/heart/daemon/interactive-repair.js +307 -0
  67. package/dist/heart/daemon/launchd.js +46 -9
  68. package/dist/heart/daemon/log-tailer.js +82 -12
  69. package/dist/heart/daemon/logs-prune.js +105 -0
  70. package/dist/heart/daemon/message-router.js +2 -2
  71. package/dist/heart/daemon/os-cron-deps.js +134 -0
  72. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  73. package/dist/heart/daemon/ouro-entry.js +3 -1
  74. package/dist/heart/daemon/process-manager.js +214 -0
  75. package/dist/heart/daemon/provider-discovery.js +137 -0
  76. package/dist/heart/daemon/pulse.js +475 -0
  77. package/dist/heart/daemon/readiness-repair.js +275 -0
  78. package/dist/heart/daemon/run-hooks.js +2 -0
  79. package/dist/heart/daemon/runtime-logging.js +67 -16
  80. package/dist/heart/daemon/runtime-metadata.js +73 -0
  81. package/dist/heart/daemon/runtime-mode.js +67 -0
  82. package/dist/heart/daemon/safe-mode.js +161 -0
  83. package/dist/heart/daemon/sense-manager.js +145 -32
  84. package/dist/heart/daemon/session-id-resolver.js +131 -0
  85. package/dist/heart/daemon/skill-management-installer.js +94 -0
  86. package/dist/heart/daemon/socket-client.js +307 -0
  87. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  88. package/dist/heart/daemon/startup-tui.js +259 -0
  89. package/dist/heart/daemon/task-scheduler.js +3 -25
  90. package/dist/heart/daemon/terminal-ui.js +169 -0
  91. package/dist/heart/daemon/thoughts.js +510 -0
  92. package/dist/heart/daemon/up-progress.js +259 -0
  93. package/dist/heart/delegation.js +62 -0
  94. package/dist/heart/habits/habit-migration.js +189 -0
  95. package/dist/heart/habits/habit-parser.js +140 -0
  96. package/dist/heart/habits/habit-runtime-state.js +100 -0
  97. package/dist/heart/habits/habit-scheduler.js +372 -0
  98. package/dist/heart/{daemon → hatch}/hatch-flow.js +52 -117
  99. package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
  100. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  101. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  102. package/dist/heart/identity.js +161 -65
  103. package/dist/heart/kept-notes.js +357 -0
  104. package/dist/heart/kicks.js +1 -1
  105. package/dist/heart/machine-identity.js +161 -0
  106. package/dist/heart/mcp/mcp-server.js +653 -0
  107. package/dist/heart/migrate-config.js +100 -0
  108. package/dist/heart/model-capabilities.js +59 -0
  109. package/dist/heart/outlook/outlook-http-hooks.js +64 -0
  110. package/dist/heart/outlook/outlook-http-response.js +7 -0
  111. package/dist/heart/outlook/outlook-http-routes.js +232 -0
  112. package/dist/heart/outlook/outlook-http-static.js +99 -0
  113. package/dist/heart/outlook/outlook-http-transport.js +116 -0
  114. package/dist/heart/outlook/outlook-http.js +99 -0
  115. package/dist/heart/outlook/outlook-read.js +28 -0
  116. package/dist/heart/outlook/outlook-types.js +27 -0
  117. package/dist/heart/outlook/outlook-view.js +195 -0
  118. package/dist/heart/outlook/readers/agent-machine.js +359 -0
  119. package/dist/heart/outlook/readers/continuity-readers.js +332 -0
  120. package/dist/heart/outlook/readers/runtime-readers.js +644 -0
  121. package/dist/heart/outlook/readers/sessions.js +232 -0
  122. package/dist/heart/outlook/readers/shared.js +111 -0
  123. package/dist/heart/platform.js +81 -0
  124. package/dist/heart/progress-story.js +42 -0
  125. package/dist/heart/provider-attempt.js +133 -0
  126. package/dist/heart/provider-binding-resolver.js +239 -0
  127. package/dist/heart/provider-credentials.js +391 -0
  128. package/dist/heart/provider-failover.js +266 -0
  129. package/dist/heart/provider-models.js +81 -0
  130. package/dist/heart/provider-ping.js +237 -0
  131. package/dist/heart/provider-state.js +216 -0
  132. package/dist/heart/provider-visibility.js +186 -0
  133. package/dist/heart/providers/anthropic-token.js +131 -0
  134. package/dist/heart/providers/anthropic.js +193 -55
  135. package/dist/heart/providers/azure.js +103 -12
  136. package/dist/heart/providers/error-classification.js +63 -0
  137. package/dist/heart/providers/github-copilot.js +145 -0
  138. package/dist/heart/providers/minimax-vlm.js +189 -0
  139. package/dist/heart/providers/minimax.js +29 -7
  140. package/dist/heart/providers/openai-codex.js +62 -38
  141. package/dist/heart/runtime-credentials.js +260 -0
  142. package/dist/heart/sense-truth.js +3 -0
  143. package/dist/heart/session-activity.js +190 -0
  144. package/dist/heart/session-events.js +855 -0
  145. package/dist/heart/session-transcript.js +167 -0
  146. package/dist/heart/start-of-turn-packet.js +345 -0
  147. package/dist/heart/streaming.js +36 -27
  148. package/dist/heart/sync.js +332 -0
  149. package/dist/heart/target-resolution.js +127 -0
  150. package/dist/heart/tempo.js +93 -0
  151. package/dist/heart/temporal-view.js +41 -0
  152. package/dist/heart/tool-activity-callbacks.js +36 -0
  153. package/dist/heart/tool-description.js +135 -0
  154. package/dist/heart/tool-friction.js +55 -0
  155. package/dist/heart/tool-loop.js +200 -0
  156. package/dist/heart/turn-context.js +351 -0
  157. package/dist/heart/turn-coordinator.js +28 -0
  158. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +1 -1
  159. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  160. package/dist/heart/versioning/ouro-path-installer.js +301 -0
  161. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  162. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  163. package/dist/heart/{daemon → versioning}/update-checker.js +3 -1
  164. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  165. package/dist/mind/bundle-manifest.js +7 -1
  166. package/dist/mind/context.js +132 -93
  167. package/dist/mind/diary-integrity.js +60 -0
  168. package/dist/mind/{memory.js → diary.js} +74 -93
  169. package/dist/mind/embedding-provider.js +60 -0
  170. package/dist/mind/file-state.js +179 -0
  171. package/dist/mind/friends/channel.js +21 -0
  172. package/dist/mind/friends/group-context.js +144 -0
  173. package/dist/mind/friends/resolver.js +38 -1
  174. package/dist/mind/friends/store-file.js +39 -3
  175. package/dist/mind/friends/trust-explanation.js +74 -0
  176. package/dist/mind/friends/types.js +1 -1
  177. package/dist/mind/journal-index.js +161 -0
  178. package/dist/mind/note-search.js +268 -0
  179. package/dist/mind/obligation-steering.js +221 -0
  180. package/dist/mind/pending.js +66 -7
  181. package/dist/mind/prompt-refresh.js +3 -2
  182. package/dist/mind/prompt.js +947 -165
  183. package/dist/mind/provenance-trust.js +26 -0
  184. package/dist/mind/scrutiny.js +173 -0
  185. package/dist/nerves/cli-logging.js +7 -1
  186. package/dist/nerves/coverage/audit-rules.js +15 -6
  187. package/dist/nerves/coverage/audit.js +28 -2
  188. package/dist/nerves/coverage/cli.js +1 -1
  189. package/dist/nerves/coverage/contract.js +5 -5
  190. package/dist/nerves/coverage/file-completeness.js +83 -5
  191. package/dist/nerves/coverage/run-artifacts.js +1 -1
  192. package/dist/nerves/event-buffer.js +111 -0
  193. package/dist/nerves/index.js +224 -4
  194. package/dist/nerves/observation.js +20 -0
  195. package/dist/nerves/redact.js +79 -0
  196. package/dist/nerves/runtime.js +5 -1
  197. package/dist/outlook-ui/assets/index-BAcU08c-.css +1 -0
  198. package/dist/outlook-ui/assets/index-D7l3l4vY.js +61 -0
  199. package/dist/outlook-ui/index.html +15 -0
  200. package/dist/repertoire/ado-client.js +15 -56
  201. package/dist/repertoire/ado-semantic.js +11 -10
  202. package/dist/repertoire/api-client.js +97 -0
  203. package/dist/repertoire/bitwarden-store.js +702 -0
  204. package/dist/repertoire/bundle-templates.js +72 -0
  205. package/dist/repertoire/bw-installer.js +79 -0
  206. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  207. package/dist/repertoire/coding/context-pack.js +330 -0
  208. package/dist/repertoire/coding/feedback.js +197 -30
  209. package/dist/repertoire/coding/manager.js +158 -9
  210. package/dist/repertoire/coding/spawner.js +55 -9
  211. package/dist/repertoire/coding/tools.js +170 -7
  212. package/dist/repertoire/commerce-errors.js +109 -0
  213. package/dist/repertoire/commerce-self-test.js +156 -0
  214. package/dist/repertoire/credential-access.js +111 -0
  215. package/dist/repertoire/duffel-client.js +185 -0
  216. package/dist/repertoire/github-client.js +14 -55
  217. package/dist/repertoire/graph-client.js +11 -52
  218. package/dist/repertoire/guardrails.js +371 -0
  219. package/dist/repertoire/mcp-client.js +255 -0
  220. package/dist/repertoire/mcp-manager.js +305 -0
  221. package/dist/repertoire/mcp-tools.js +63 -0
  222. package/dist/repertoire/shell-sessions.js +133 -0
  223. package/dist/repertoire/skills.js +15 -24
  224. package/dist/repertoire/stripe-client.js +131 -0
  225. package/dist/repertoire/tasks/board.js +43 -5
  226. package/dist/repertoire/tasks/fix.js +182 -0
  227. package/dist/repertoire/tasks/index.js +37 -4
  228. package/dist/repertoire/tasks/lifecycle.js +2 -2
  229. package/dist/repertoire/tasks/parser.js +3 -2
  230. package/dist/repertoire/tasks/scanner.js +194 -37
  231. package/dist/repertoire/tasks/transitions.js +16 -78
  232. package/dist/repertoire/tool-results.js +29 -0
  233. package/dist/repertoire/tools-attachments.js +317 -0
  234. package/dist/repertoire/tools-base.js +42 -690
  235. package/dist/repertoire/tools-bluebubbles.js +1 -0
  236. package/dist/repertoire/tools-bridge.js +141 -0
  237. package/dist/repertoire/tools-bundle.js +984 -0
  238. package/dist/repertoire/tools-config.js +185 -0
  239. package/dist/repertoire/tools-continuity.js +248 -0
  240. package/dist/repertoire/tools-credential.js +361 -0
  241. package/dist/repertoire/tools-files.js +342 -0
  242. package/dist/repertoire/tools-flight.js +224 -0
  243. package/dist/repertoire/tools-flow.js +105 -0
  244. package/dist/repertoire/tools-github.js +1 -7
  245. package/dist/repertoire/tools-notes.js +376 -0
  246. package/dist/repertoire/tools-session.js +739 -0
  247. package/dist/repertoire/tools-shell.js +120 -0
  248. package/dist/repertoire/tools-stripe.js +180 -0
  249. package/dist/repertoire/tools-surface.js +243 -0
  250. package/dist/repertoire/tools-teams.js +9 -39
  251. package/dist/repertoire/tools-travel.js +125 -0
  252. package/dist/repertoire/tools-user-profile.js +144 -0
  253. package/dist/repertoire/tools-vault.js +40 -0
  254. package/dist/repertoire/tools.js +144 -113
  255. package/dist/repertoire/travel-api-client.js +360 -0
  256. package/dist/repertoire/user-profile.js +131 -0
  257. package/dist/repertoire/vault-setup.js +246 -0
  258. package/dist/repertoire/vault-unlock.js +421 -0
  259. package/dist/scripts/claude-code-hook.js +41 -0
  260. package/dist/scripts/claude-code-stop-hook.js +47 -0
  261. package/dist/senses/attention-queue.js +116 -0
  262. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  263. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  264. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +260 -9
  265. package/dist/senses/bluebubbles/entry.js +73 -0
  266. package/dist/senses/bluebubbles/inbound-log.js +113 -0
  267. package/dist/senses/bluebubbles/index.js +1620 -0
  268. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  269. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  270. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +45 -3
  271. package/dist/senses/bluebubbles/replay.js +129 -0
  272. package/dist/senses/bluebubbles/runtime-state.js +109 -0
  273. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  274. package/dist/senses/cli/bracketed-paste.js +82 -0
  275. package/dist/senses/cli/image-paste.js +287 -0
  276. package/dist/senses/cli/image-ref-navigation.js +75 -0
  277. package/dist/senses/cli/ink-app.js +156 -0
  278. package/dist/senses/cli/inline-diff.js +64 -0
  279. package/dist/senses/cli/input-keys.js +174 -0
  280. package/dist/senses/cli/kill-ring.js +86 -0
  281. package/dist/senses/cli/message-list.js +51 -0
  282. package/dist/senses/cli/ouro-tui.js +605 -0
  283. package/dist/senses/cli/spinner-imperative.js +135 -0
  284. package/dist/senses/cli/spinner.js +101 -0
  285. package/dist/senses/cli/status-line.js +60 -0
  286. package/dist/senses/cli/streaming-markdown.js +526 -0
  287. package/dist/senses/cli/tool-display.js +83 -0
  288. package/dist/senses/cli/tool-render.js +85 -0
  289. package/dist/senses/cli/tui-store.js +240 -0
  290. package/dist/senses/cli/virtual-list.js +35 -0
  291. package/dist/senses/cli-entry.js +60 -8
  292. package/dist/senses/cli-layout.js +187 -0
  293. package/dist/senses/cli.js +516 -211
  294. package/dist/senses/commands.js +66 -3
  295. package/dist/senses/habit-turn-message.js +108 -0
  296. package/dist/senses/inner-dialog-worker.js +102 -19
  297. package/dist/senses/inner-dialog.js +597 -95
  298. package/dist/senses/pipeline.js +533 -72
  299. package/dist/senses/proactive-content-guard.js +51 -0
  300. package/dist/senses/shared-turn.js +205 -0
  301. package/dist/senses/surface-tool.js +68 -0
  302. package/dist/senses/teams-entry.js +60 -8
  303. package/dist/senses/teams.js +413 -163
  304. package/dist/senses/trust-gate.js +5 -5
  305. package/package.json +29 -7
  306. package/skills/agent-commerce.md +106 -0
  307. package/skills/browser-navigation.md +117 -0
  308. package/skills/commerce-setup-guide.md +116 -0
  309. package/skills/commerce-setup.md +84 -0
  310. package/skills/configure-dev-tools.md +101 -0
  311. package/skills/travel-planning.md +138 -0
  312. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  313. package/dist/heart/daemon/subagent-installer.js +0 -134
  314. package/dist/mind/associative-recall.js +0 -209
  315. package/dist/senses/bluebubbles-entry.js +0 -11
  316. package/dist/senses/bluebubbles.js +0 -854
  317. package/dist/senses/debug-activity.js +0 -127
  318. package/subagents/README.md +0 -60
  319. package/subagents/work-doer.md +0 -235
  320. package/subagents/work-merger.md +0 -618
  321. package/subagents/work-planner.md +0 -382
  322. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  323. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  324. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  325. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  326. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  327. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  328. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  329. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  330. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  331. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  332. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  333. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  334. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  335. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  336. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  337. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -1,12 +1,48 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.createBlueBubblesClient = createBlueBubblesClient;
4
37
  const node_crypto_1 = require("node:crypto");
5
- const config_1 = require("../heart/config");
6
- const identity_1 = require("../heart/identity");
7
- const runtime_1 = require("../nerves/runtime");
8
- const bluebubbles_model_1 = require("./bluebubbles-model");
9
- const bluebubbles_media_1 = require("./bluebubbles-media");
38
+ const config_1 = require("../../heart/config");
39
+ const identity_1 = require("../../heart/identity");
40
+ const bluebubbles_health_diagnostics_1 = require("../../heart/daemon/bluebubbles-health-diagnostics");
41
+ const runtime_1 = require("../../nerves/runtime");
42
+ const minimax_1 = require("../../heart/providers/minimax");
43
+ const minimax_vlm_1 = require("../../heart/providers/minimax-vlm");
44
+ const model_1 = require("./model");
45
+ const media_1 = require("./media");
10
46
  function buildBlueBubblesApiUrl(baseUrl, endpoint, password) {
11
47
  const root = baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
12
48
  const url = new URL(endpoint.replace(/^\//, ""), root);
@@ -55,6 +91,9 @@ async function parseJsonBody(response) {
55
91
  return null;
56
92
  }
57
93
  }
94
+ function describeCaughtValue(error) {
95
+ return error instanceof Error ? error.message : String(error);
96
+ }
58
97
  function buildRepairUrl(baseUrl, messageGuid, password) {
59
98
  const url = buildBlueBubblesApiUrl(baseUrl, `/api/v1/message/${encodeURIComponent(messageGuid)}`, password);
60
99
  const parsed = new URL(url);
@@ -99,6 +138,17 @@ function extractChatQueryRows(payload) {
99
138
  }
100
139
  return data.map((entry) => asRecord(entry)).filter((entry) => entry !== null);
101
140
  }
141
+ function extractMessageQueryRows(payload) {
142
+ const record = asRecord(payload);
143
+ const data = asRecord(record?.data);
144
+ const rows = Array.isArray(record?.data) ? record.data
145
+ : Array.isArray(data?.messages) ? data.messages
146
+ : Array.isArray(data?.results) ? data.results
147
+ : Array.isArray(record?.messages) ? record.messages
148
+ : Array.isArray(payload) ? payload
149
+ : [];
150
+ return rows.map((entry) => asRecord(entry)).filter((entry) => entry !== null);
151
+ }
102
152
  async function resolveChatGuidForIdentifier(config, channelConfig, chatIdentifier) {
103
153
  const trimmedIdentifier = chatIdentifier.trim();
104
154
  if (!trimmedIdentifier)
@@ -170,6 +220,12 @@ function applyRepairNotice(event, notice) {
170
220
  repairNotice: notice,
171
221
  };
172
222
  }
223
+ function hasRecoverableMessageContent(event) {
224
+ return event.kind === "message"
225
+ && (event.textForAgent.trim().length > 0
226
+ || event.attachments.length > 0
227
+ || event.hasPayloadData);
228
+ }
173
229
  function hydrateTextForAgent(event, rawData) {
174
230
  if (event.kind !== "message") {
175
231
  return { ...event, requiresRepair: false };
@@ -323,6 +379,107 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
323
379
  throw new Error(`BlueBubbles read failed (${response.status}): ${errorText || "unknown"}`);
324
380
  }
325
381
  },
382
+ async checkHealth() {
383
+ (0, runtime_1.emitNervesEvent)({
384
+ component: "senses",
385
+ event: "senses.bluebubbles_healthcheck_start",
386
+ message: "probing bluebubbles upstream health",
387
+ meta: { serverUrl: config.serverUrl },
388
+ });
389
+ const result = await (0, bluebubbles_health_diagnostics_1.probeBlueBubblesHealth)({
390
+ serverUrl: config.serverUrl,
391
+ password: config.password,
392
+ requestTimeoutMs: channelConfig.requestTimeoutMs,
393
+ fetchImpl: fetch,
394
+ });
395
+ if (!result.ok) {
396
+ (0, runtime_1.emitNervesEvent)({
397
+ level: "warn",
398
+ component: "senses",
399
+ event: "senses.bluebubbles_healthcheck_error",
400
+ message: "bluebubbles upstream health probe failed",
401
+ meta: {
402
+ serverUrl: config.serverUrl,
403
+ status: result.status,
404
+ reason: result.reason,
405
+ classification: result.classification,
406
+ detail: (0, bluebubbles_health_diagnostics_1.redactBlueBubblesHealthDetailForNerves)(result.detail),
407
+ },
408
+ });
409
+ throw new Error(result.detail);
410
+ }
411
+ (0, runtime_1.emitNervesEvent)({
412
+ component: "senses",
413
+ event: "senses.bluebubbles_healthcheck_end",
414
+ message: "bluebubbles upstream health probe succeeded",
415
+ meta: { serverUrl: config.serverUrl },
416
+ });
417
+ },
418
+ async listRecentMessages(params = {}) {
419
+ const limit = Math.max(1, Math.min(100, Math.floor(params.limit ?? 50)));
420
+ const offset = Math.max(0, Math.floor(params.offset ?? 0));
421
+ const url = buildBlueBubblesApiUrl(config.serverUrl, "/api/v1/message/query", config.password);
422
+ (0, runtime_1.emitNervesEvent)({
423
+ component: "senses",
424
+ event: "senses.bluebubbles_query_recent_start",
425
+ message: "querying recent bluebubbles messages",
426
+ meta: { limit, offset },
427
+ });
428
+ const response = await fetch(url, {
429
+ method: "POST",
430
+ headers: { "Content-Type": "application/json" },
431
+ body: JSON.stringify({
432
+ limit,
433
+ offset,
434
+ sort: "DESC",
435
+ with: ["chats", "attachments", "payloadData", "messageSummaryInfo"],
436
+ }),
437
+ signal: AbortSignal.timeout(channelConfig.requestTimeoutMs),
438
+ });
439
+ if (!response.ok) {
440
+ const errorText = await response.text().catch(() => "");
441
+ (0, runtime_1.emitNervesEvent)({
442
+ level: "warn",
443
+ component: "senses",
444
+ event: "senses.bluebubbles_query_recent_error",
445
+ message: "bluebubbles recent message query failed",
446
+ meta: {
447
+ status: response.status,
448
+ reason: errorText || "unknown",
449
+ },
450
+ });
451
+ throw new Error(`BlueBubbles recent message query failed (${response.status}): ${errorText || "unknown"}`);
452
+ }
453
+ const payload = await parseJsonBody(response);
454
+ const rows = extractMessageQueryRows(payload);
455
+ const messages = [];
456
+ for (const row of rows) {
457
+ try {
458
+ messages.push((0, model_1.normalizeBlueBubblesEvent)({ type: "new-message", data: row }));
459
+ }
460
+ catch (error) {
461
+ (0, runtime_1.emitNervesEvent)({
462
+ level: "warn",
463
+ component: "senses",
464
+ event: "senses.bluebubbles_query_recent_skip",
465
+ message: "skipped unusable bluebubbles recent message row",
466
+ meta: {
467
+ reason: describeCaughtValue(error),
468
+ },
469
+ });
470
+ }
471
+ }
472
+ (0, runtime_1.emitNervesEvent)({
473
+ component: "senses",
474
+ event: "senses.bluebubbles_query_recent_end",
475
+ message: "queried recent bluebubbles messages",
476
+ meta: {
477
+ rows: rows.length,
478
+ normalized: messages.length,
479
+ },
480
+ });
481
+ return messages;
482
+ },
326
483
  async repairEvent(event) {
327
484
  if (!event.requiresRepair) {
328
485
  (0, runtime_1.emitNervesEvent)({
@@ -337,6 +494,7 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
337
494
  return event;
338
495
  }
339
496
  (0, runtime_1.emitNervesEvent)({
497
+ level: "warn",
340
498
  component: "senses",
341
499
  event: "senses.bluebubbles_repair_start",
342
500
  message: "repairing bluebubbles event by guid",
@@ -383,16 +541,59 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
383
541
  });
384
542
  return repaired;
385
543
  }
386
- const normalized = (0, bluebubbles_model_1.normalizeBlueBubblesEvent)({
544
+ const normalized = (0, model_1.normalizeBlueBubblesEvent)({
387
545
  type: event.eventType,
388
546
  data,
389
547
  });
390
- let hydrated = hydrateTextForAgent(normalized, data);
548
+ const recoveredMessage = event.kind === "mutation"
549
+ && !event.shouldNotifyAgent
550
+ ? (0, model_1.normalizeBlueBubblesEvent)({
551
+ type: "new-message",
552
+ data,
553
+ })
554
+ : null;
555
+ let hydrated = recoveredMessage && hasRecoverableMessageContent(recoveredMessage)
556
+ ? hydrateTextForAgent(recoveredMessage, data)
557
+ : hydrateTextForAgent(normalized, data);
391
558
  if (hydrated.kind === "message" &&
392
559
  hydrated.balloonBundleId !== "com.apple.messages.URLBalloonProvider" &&
393
560
  hydrated.attachments.length > 0) {
394
- const media = await (0, bluebubbles_media_1.hydrateBlueBubblesAttachments)(hydrated.attachments, config, channelConfig, {
395
- preferAudioInput: providerSupportsAudioInput((0, identity_1.loadAgentConfig)().provider),
561
+ const agentConfig = (0, identity_1.loadAgentConfig)();
562
+ const chatModel = agentConfig.humanFacing.model;
563
+ const chatProvider = agentConfig.humanFacing.provider;
564
+ const vlmDescribe = async (params) => {
565
+ if (chatProvider !== "minimax") {
566
+ throw new Error("VLM fallback requires a minimax credential for this agent — " +
567
+ "configure one or switch to a vision-capable chat model");
568
+ }
569
+ const { readProviderCredentialRecord } = await Promise.resolve().then(() => __importStar(require("../../heart/provider-credentials")));
570
+ const credential = await readProviderCredentialRecord((0, identity_1.getAgentName)(), "minimax");
571
+ const apiKey = credential.ok ? credential.record.credentials.apiKey : undefined;
572
+ if (!apiKey) {
573
+ throw new Error("VLM fallback: minimax API key not found in the agent vault — " +
574
+ "run `ouro auth --agent <agent> --provider minimax`");
575
+ }
576
+ return (0, minimax_vlm_1.minimaxVlmDescribe)({
577
+ apiKey: String(apiKey),
578
+ prompt: params.prompt,
579
+ imageDataUrl: params.imageDataUrl,
580
+ baseURL: minimax_1.MINIMAX_PROVIDER_BASE_URL,
581
+ attachmentGuid: params.attachmentGuid,
582
+ mimeType: params.mimeType,
583
+ chatModel: params.chatModel,
584
+ });
585
+ };
586
+ // VLM prompt context wants the user's raw inbound text — NOT
587
+ // the agent-facing rendering, which now carries the attachment
588
+ // marker after the B2 fix. Pull it from the source payload.
589
+ const rawUserText = typeof data.text === "string"
590
+ ? (data.text).trim()
591
+ : "";
592
+ const media = await (0, media_1.hydrateBlueBubblesAttachments)(hydrated.attachments, config, channelConfig, {
593
+ preferAudioInput: providerSupportsAudioInput(chatProvider),
594
+ chatModel,
595
+ vlmDescribe,
596
+ userText: rawUserText,
396
597
  });
397
598
  const transcriptSuffix = media.transcriptAdditions.map((entry) => `[${entry}]`).join("\n");
398
599
  const noticeSuffix = media.notices.map((entry) => `[${entry}]`).join("\n");
@@ -404,6 +605,7 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
404
605
  };
405
606
  }
406
607
  (0, runtime_1.emitNervesEvent)({
608
+ level: "warn",
407
609
  component: "senses",
408
610
  event: "senses.bluebubbles_repair_end",
409
611
  message: "bluebubbles event repaired",
@@ -411,6 +613,7 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
411
613
  kind: hydrated.kind,
412
614
  messageGuid: hydrated.messageGuid,
413
615
  repairedFrom: event.kind,
616
+ promotedFromMutation: event.kind === "mutation" && hydrated.kind === "message",
414
617
  },
415
618
  });
416
619
  return hydrated;
@@ -430,5 +633,53 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
430
633
  return applyRepairNotice(event, `BlueBubbles repair failed: ${reason}`);
431
634
  }
432
635
  },
636
+ async getMessageText(messageGuid) {
637
+ const url = buildRepairUrl(config.serverUrl, messageGuid, config.password);
638
+ try {
639
+ const response = await fetch(url, {
640
+ method: "GET",
641
+ signal: AbortSignal.timeout(channelConfig.requestTimeoutMs),
642
+ });
643
+ if (!response.ok) {
644
+ (0, runtime_1.emitNervesEvent)({
645
+ level: "warn",
646
+ component: "senses",
647
+ event: "senses.bluebubbles_get_message_text_error",
648
+ message: "failed to fetch message text",
649
+ meta: { messageGuid, status: response.status },
650
+ });
651
+ return null;
652
+ }
653
+ const payload = await parseJsonBody(response);
654
+ const data = extractRepairData(payload);
655
+ if (!data || typeof data.text !== "string") {
656
+ (0, runtime_1.emitNervesEvent)({
657
+ level: "warn",
658
+ component: "senses",
659
+ event: "senses.bluebubbles_get_message_text_error",
660
+ message: "message payload missing text field",
661
+ meta: { messageGuid, hasData: !!data, textType: data ? typeof data.text : "n/a" },
662
+ });
663
+ return null;
664
+ }
665
+ (0, runtime_1.emitNervesEvent)({
666
+ component: "senses",
667
+ event: "senses.bluebubbles_get_message_text",
668
+ message: "fetched message text by guid",
669
+ meta: { messageGuid },
670
+ });
671
+ return data.text.trim() || null;
672
+ }
673
+ catch (error) {
674
+ (0, runtime_1.emitNervesEvent)({
675
+ level: "warn",
676
+ component: "senses",
677
+ event: "senses.bluebubbles_get_message_text_error",
678
+ message: "exception fetching message text",
679
+ meta: { messageGuid, reason: error instanceof Error ? error.message : String(error) },
680
+ });
681
+ return null;
682
+ }
683
+ },
433
684
  };
434
685
  }
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ // Thin entrypoint for `npm run bluebubbles` / `node dist/senses/bluebubbles/entry.js --agent <name>`.
3
+ // Separated from index.ts so the BlueBubbles adapter stays testable.
4
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
5
+ if (k2 === undefined) k2 = k;
6
+ var desc = Object.getOwnPropertyDescriptor(m, k);
7
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
8
+ desc = { enumerable: true, get: function() { return m[k]; } };
9
+ }
10
+ Object.defineProperty(o, k2, desc);
11
+ }) : (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ o[k2] = m[k];
14
+ }));
15
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
16
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
17
+ }) : function(o, v) {
18
+ o["default"] = v;
19
+ });
20
+ var __importStar = (this && this.__importStar) || (function () {
21
+ var ownKeys = function(o) {
22
+ ownKeys = Object.getOwnPropertyNames || function (o) {
23
+ var ar = [];
24
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
25
+ return ar;
26
+ };
27
+ return ownKeys(o);
28
+ };
29
+ return function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
36
+ })();
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ const agentArgIndex = process.argv.indexOf("--agent");
39
+ const agentName = agentArgIndex >= 0 ? process.argv[agentArgIndex + 1] : undefined;
40
+ if (!agentName) {
41
+ // eslint-disable-next-line no-console -- pre-boot guard: --agent check before imports
42
+ console.error("Missing required --agent <name> argument.\nUsage: node dist/senses/bluebubbles/entry.js --agent ouroboros");
43
+ process.exit(1);
44
+ }
45
+ const runtime_logging_1 = require("../../heart/daemon/runtime-logging");
46
+ const runtime_1 = require("../../nerves/runtime");
47
+ (0, runtime_logging_1.configureDaemonRuntimeLogger)("bluebubbles");
48
+ (0, runtime_1.emitNervesEvent)({
49
+ component: "senses",
50
+ event: "senses.entry_boot",
51
+ message: "booting BlueBubbles entrypoint",
52
+ meta: { entry: "bluebubbles", agentName },
53
+ });
54
+ Promise.resolve().then(() => __importStar(require("../../heart/runtime-credentials"))).then(async ({ refreshMachineRuntimeCredentialConfig, refreshRuntimeCredentialConfig }) => {
55
+ await refreshRuntimeCredentialConfig(agentName, { preserveCachedOnFailure: true }).catch(() => undefined);
56
+ const { loadOrCreateMachineIdentity } = await Promise.resolve().then(() => __importStar(require("../../heart/machine-identity")));
57
+ const machine = loadOrCreateMachineIdentity();
58
+ await refreshMachineRuntimeCredentialConfig(agentName, machine.machineId, { preserveCachedOnFailure: true }).catch(() => undefined);
59
+ const { startBlueBubblesApp } = await Promise.resolve().then(() => __importStar(require("./index")));
60
+ await startBlueBubblesApp();
61
+ })
62
+ .catch((error) => {
63
+ (0, runtime_1.emitNervesEvent)({
64
+ level: "error",
65
+ component: "senses",
66
+ event: "senses.entry_error",
67
+ message: "BlueBubbles entrypoint failed",
68
+ meta: { entry: "bluebubbles", agentName, error: error instanceof Error ? error.message : String(error) },
69
+ });
70
+ // eslint-disable-next-line no-console -- fatal startup guard for sense process
71
+ console.error(error instanceof Error ? error.message : String(error));
72
+ process.exit(1);
73
+ });
@@ -0,0 +1,113 @@
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.getBlueBubblesInboundLogPath = getBlueBubblesInboundLogPath;
37
+ exports.hasRecordedBlueBubblesInbound = hasRecordedBlueBubblesInbound;
38
+ exports.recordBlueBubblesInbound = recordBlueBubblesInbound;
39
+ const fs = __importStar(require("node:fs"));
40
+ const path = __importStar(require("node:path"));
41
+ const config_1 = require("../../heart/config");
42
+ const identity_1 = require("../../heart/identity");
43
+ const runtime_1 = require("../../nerves/runtime");
44
+ function getBlueBubblesInboundLogPath(agentName, sessionKey) {
45
+ return path.join((0, identity_1.getAgentRoot)(agentName), "state", "senses", "bluebubbles", "inbound", `${(0, config_1.sanitizeKey)(sessionKey)}.ndjson`);
46
+ }
47
+ function readEntries(filePath) {
48
+ try {
49
+ const raw = fs.readFileSync(filePath, "utf-8");
50
+ return raw
51
+ .split("\n")
52
+ .map((line) => line.trim())
53
+ .filter(Boolean)
54
+ .map((line) => JSON.parse(line))
55
+ .filter((entry) => typeof entry.messageGuid === "string" && typeof entry.sessionKey === "string");
56
+ }
57
+ catch {
58
+ return [];
59
+ }
60
+ }
61
+ function hasRecordedBlueBubblesInbound(agentName, sessionKey, messageGuid) {
62
+ if (!messageGuid.trim())
63
+ return false;
64
+ const filePath = getBlueBubblesInboundLogPath(agentName, sessionKey);
65
+ return readEntries(filePath).some((entry) => entry.messageGuid === messageGuid);
66
+ }
67
+ function recordBlueBubblesInbound(agentName, event, source) {
68
+ const filePath = getBlueBubblesInboundLogPath(agentName, event.chat.sessionKey);
69
+ try {
70
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
71
+ if (event.messageGuid.trim() && readEntries(filePath).some((entry) => entry.messageGuid === event.messageGuid)) {
72
+ return filePath;
73
+ }
74
+ fs.appendFileSync(filePath, JSON.stringify({
75
+ recordedAt: new Date(event.timestamp).toISOString(),
76
+ messageGuid: event.messageGuid,
77
+ chatGuid: event.chat.chatGuid ?? null,
78
+ chatIdentifier: event.chat.chatIdentifier ?? null,
79
+ sessionKey: event.chat.sessionKey,
80
+ textForAgent: event.textForAgent,
81
+ source,
82
+ }) + "\n", "utf-8");
83
+ }
84
+ catch (error) {
85
+ (0, runtime_1.emitNervesEvent)({
86
+ level: "warn",
87
+ component: "senses",
88
+ event: "senses.bluebubbles_inbound_log_error",
89
+ message: "failed to record bluebubbles inbound sidecar log",
90
+ meta: {
91
+ agentName,
92
+ messageGuid: event.messageGuid,
93
+ sessionKey: event.chat.sessionKey,
94
+ reason: error instanceof Error ? error.message : String(error),
95
+ },
96
+ });
97
+ return filePath;
98
+ }
99
+ (0, runtime_1.emitNervesEvent)({
100
+ level: "warn",
101
+ component: "senses",
102
+ event: "senses.bluebubbles_inbound_logged",
103
+ message: "recorded bluebubbles inbound message to sidecar log",
104
+ meta: {
105
+ agentName,
106
+ messageGuid: event.messageGuid,
107
+ sessionKey: event.chat.sessionKey,
108
+ source,
109
+ path: filePath,
110
+ },
111
+ });
112
+ return filePath;
113
+ }