@ouro.bot/cli 0.1.0-alpha.56 → 0.1.0-alpha.560

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 (392) hide show
  1. package/README.md +127 -23
  2. package/RepairGuide.ouro/agent.json +5 -0
  3. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  4. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  5. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  6. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  7. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  8. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  9. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  12. package/changelog.json +3596 -0
  13. package/dist/arc/attention-types.js +8 -0
  14. package/dist/arc/cares.js +140 -0
  15. package/dist/arc/episodes.js +117 -0
  16. package/dist/arc/intentions.js +133 -0
  17. package/dist/arc/json-store.js +117 -0
  18. package/dist/arc/obligations.js +237 -0
  19. package/dist/arc/packets.js +193 -0
  20. package/dist/arc/presence.js +185 -0
  21. package/dist/arc/task-lifecycle.js +65 -0
  22. package/dist/heart/active-work.js +837 -26
  23. package/dist/heart/agent-entry.js +58 -3
  24. package/dist/heart/attachments/image-normalize.js +194 -0
  25. package/dist/heart/attachments/materialize.js +97 -0
  26. package/dist/heart/attachments/originals.js +88 -0
  27. package/dist/heart/attachments/render.js +29 -0
  28. package/dist/heart/attachments/sources/adapter.js +2 -0
  29. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  30. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  31. package/dist/heart/attachments/sources/index.js +16 -0
  32. package/dist/heart/attachments/store.js +103 -0
  33. package/dist/heart/attachments/types.js +93 -0
  34. package/dist/heart/auth/auth-flow.js +479 -0
  35. package/dist/heart/background-operations.js +281 -0
  36. package/dist/heart/bundle-state.js +168 -0
  37. package/dist/heart/commitments.js +111 -0
  38. package/dist/heart/config-registry.js +322 -0
  39. package/dist/heart/config.js +114 -118
  40. package/dist/heart/core.js +913 -246
  41. package/dist/heart/cross-chat-delivery.js +3 -18
  42. package/dist/heart/daemon/agent-config-check.js +419 -0
  43. package/dist/heart/daemon/agent-discovery.js +102 -3
  44. package/dist/heart/daemon/agent-service.js +522 -0
  45. package/dist/heart/daemon/agentic-repair.js +547 -0
  46. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  47. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  48. package/dist/heart/daemon/cadence.js +70 -0
  49. package/dist/heart/daemon/cli-defaults.js +776 -0
  50. package/dist/heart/daemon/cli-exec.js +7457 -0
  51. package/dist/heart/daemon/cli-help.js +498 -0
  52. package/dist/heart/daemon/cli-parse.js +1592 -0
  53. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  54. package/dist/heart/daemon/cli-render.js +763 -0
  55. package/dist/heart/daemon/cli-types.js +8 -0
  56. package/dist/heart/daemon/connect-bay.js +323 -0
  57. package/dist/heart/daemon/daemon-cli.js +29 -1698
  58. package/dist/heart/daemon/daemon-entry.js +387 -2
  59. package/dist/heart/daemon/daemon-health.js +176 -0
  60. package/dist/heart/daemon/daemon-rollup.js +57 -0
  61. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  62. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  63. package/dist/heart/daemon/daemon.js +796 -71
  64. package/dist/heart/daemon/dns-workflow.js +394 -0
  65. package/dist/heart/daemon/doctor-types.js +8 -0
  66. package/dist/heart/daemon/doctor.js +826 -0
  67. package/dist/heart/daemon/health-monitor.js +122 -1
  68. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  69. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  70. package/dist/heart/daemon/http-health-probe.js +80 -0
  71. package/dist/heart/daemon/human-command-screens.js +234 -0
  72. package/dist/heart/daemon/human-readiness.js +114 -0
  73. package/dist/heart/daemon/inner-status.js +89 -0
  74. package/dist/heart/daemon/interactive-repair.js +394 -0
  75. package/dist/heart/daemon/launchd.js +37 -8
  76. package/dist/heart/daemon/log-tailer.js +82 -12
  77. package/dist/heart/daemon/logs-prune.js +110 -0
  78. package/dist/heart/daemon/mcp-canary.js +297 -0
  79. package/dist/heart/daemon/message-router.js +2 -2
  80. package/dist/heart/daemon/os-cron-deps.js +135 -0
  81. package/dist/heart/daemon/os-cron.js +14 -12
  82. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  83. package/dist/heart/daemon/ouro-entry.js +3 -1
  84. package/dist/heart/daemon/process-manager.js +375 -33
  85. package/dist/heart/daemon/provider-discovery.js +137 -0
  86. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  87. package/dist/heart/daemon/pulse.js +475 -0
  88. package/dist/heart/daemon/readiness-repair.js +365 -0
  89. package/dist/heart/daemon/run-hooks.js +2 -0
  90. package/dist/heart/daemon/runtime-logging.js +67 -16
  91. package/dist/heart/daemon/runtime-metadata.js +3 -31
  92. package/dist/heart/daemon/safe-mode.js +161 -0
  93. package/dist/heart/daemon/sense-manager.js +389 -38
  94. package/dist/heart/daemon/session-id-resolver.js +131 -0
  95. package/dist/heart/daemon/skill-management-installer.js +94 -0
  96. package/dist/heart/daemon/socket-client.js +158 -11
  97. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  98. package/dist/heart/daemon/startup-tui.js +330 -0
  99. package/dist/heart/daemon/task-scheduler.js +3 -25
  100. package/dist/heart/daemon/terminal-ui.js +499 -0
  101. package/dist/heart/daemon/thoughts.js +162 -17
  102. package/dist/heart/daemon/up-progress.js +366 -0
  103. package/dist/heart/daemon/vault-items.js +56 -0
  104. package/dist/heart/delegation.js +1 -1
  105. package/dist/heart/habits/habit-migration.js +189 -0
  106. package/dist/heart/habits/habit-parser.js +140 -0
  107. package/dist/heart/habits/habit-runtime-state.js +100 -0
  108. package/dist/heart/habits/habit-scheduler.js +372 -0
  109. package/dist/heart/{daemon → hatch}/hatch-flow.js +32 -56
  110. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  111. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  112. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  113. package/dist/heart/identity.js +203 -57
  114. package/dist/heart/kept-notes.js +357 -0
  115. package/dist/heart/kicks.js +1 -1
  116. package/dist/heart/machine-identity.js +161 -0
  117. package/dist/heart/mail-import-discovery.js +353 -0
  118. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  119. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  120. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  121. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  122. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  123. package/dist/heart/mailbox/mailbox-http.js +99 -0
  124. package/dist/heart/mailbox/mailbox-read.js +31 -0
  125. package/dist/heart/mailbox/mailbox-types.js +27 -0
  126. package/dist/heart/mailbox/mailbox-view.js +195 -0
  127. package/dist/heart/mailbox/readers/agent-machine.js +382 -0
  128. package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
  129. package/dist/heart/mailbox/readers/mail.js +362 -0
  130. package/dist/heart/mailbox/readers/runtime-readers.js +651 -0
  131. package/dist/heart/mailbox/readers/sessions.js +232 -0
  132. package/dist/heart/mailbox/readers/shared.js +111 -0
  133. package/dist/heart/mcp/mcp-server.js +683 -0
  134. package/dist/heart/migrate-config.js +100 -0
  135. package/dist/heart/model-capabilities.js +19 -0
  136. package/dist/heart/platform.js +81 -0
  137. package/dist/heart/provider-attempt.js +134 -0
  138. package/dist/heart/provider-binding-resolver.js +267 -0
  139. package/dist/heart/provider-credentials.js +425 -0
  140. package/dist/heart/provider-failover.js +301 -0
  141. package/dist/heart/provider-models.js +81 -0
  142. package/dist/heart/provider-ping.js +262 -0
  143. package/dist/heart/provider-readiness-cache.js +40 -0
  144. package/dist/heart/provider-visibility.js +188 -0
  145. package/dist/heart/providers/anthropic-token.js +131 -0
  146. package/dist/heart/providers/anthropic.js +139 -52
  147. package/dist/heart/providers/azure.js +97 -13
  148. package/dist/heart/providers/error-classification.js +127 -0
  149. package/dist/heart/providers/github-copilot.js +145 -0
  150. package/dist/heart/providers/minimax-vlm.js +189 -0
  151. package/dist/heart/providers/minimax.js +26 -8
  152. package/dist/heart/providers/openai-codex.js +55 -40
  153. package/dist/heart/runtime-capability-check.js +170 -0
  154. package/dist/heart/runtime-credentials.js +367 -0
  155. package/dist/heart/runtime-cwd.js +87 -0
  156. package/dist/heart/sense-truth.js +13 -4
  157. package/dist/heart/session-activity.js +43 -22
  158. package/dist/heart/session-events.js +1149 -0
  159. package/dist/heart/session-playback-cli-main.js +5 -0
  160. package/dist/heart/session-playback-cli.js +36 -0
  161. package/dist/heart/session-playback.js +231 -0
  162. package/dist/heart/session-stats-cli-main.js +5 -0
  163. package/dist/heart/session-stats.js +182 -0
  164. package/dist/heart/session-transcript.js +243 -0
  165. package/dist/heart/start-of-turn-packet.js +345 -0
  166. package/dist/heart/streaming.js +44 -27
  167. package/dist/heart/sync-classification.js +176 -0
  168. package/dist/heart/sync.js +449 -0
  169. package/dist/heart/target-resolution.js +9 -5
  170. package/dist/heart/tempo.js +93 -0
  171. package/dist/heart/temporal-view.js +41 -0
  172. package/dist/heart/timeouts.js +101 -0
  173. package/dist/heart/tool-activity-callbacks.js +59 -0
  174. package/dist/heart/tool-description.js +139 -0
  175. package/dist/heart/tool-friction.js +55 -0
  176. package/dist/heart/tool-loop.js +200 -0
  177. package/dist/heart/turn-context.js +389 -0
  178. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  179. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  180. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  181. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  182. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  183. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  184. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  185. package/dist/mailbox-ui/assets/index-B-461hes.js +61 -0
  186. package/dist/mailbox-ui/assets/index-BPr5vNuM.css +1 -0
  187. package/dist/mailbox-ui/index.html +15 -0
  188. package/dist/mailroom/attention.js +167 -0
  189. package/dist/mailroom/autonomy.js +209 -0
  190. package/dist/mailroom/blob-store.js +674 -0
  191. package/dist/mailroom/body-cache.js +61 -0
  192. package/dist/mailroom/core.js +720 -0
  193. package/dist/mailroom/entry.js +160 -0
  194. package/dist/mailroom/file-store.js +430 -0
  195. package/dist/mailroom/mbox-import.js +383 -0
  196. package/dist/mailroom/outbound.js +380 -0
  197. package/dist/mailroom/policy.js +263 -0
  198. package/dist/mailroom/reader.js +233 -0
  199. package/dist/mailroom/search-cache.js +256 -0
  200. package/dist/mailroom/search-relevance.js +319 -0
  201. package/dist/mailroom/smtp-ingress.js +176 -0
  202. package/dist/mailroom/source-state.js +176 -0
  203. package/dist/mailroom/thread.js +109 -0
  204. package/dist/mailroom/travel-extract.js +89 -0
  205. package/dist/mind/bundle-manifest.js +7 -1
  206. package/dist/mind/context.js +165 -101
  207. package/dist/mind/diary-integrity.js +60 -0
  208. package/dist/mind/{memory.js → diary.js} +62 -75
  209. package/dist/mind/embedding-provider.js +60 -0
  210. package/dist/mind/file-state.js +179 -0
  211. package/dist/mind/friends/channel.js +39 -0
  212. package/dist/mind/friends/resolver.js +54 -2
  213. package/dist/mind/friends/store-file.js +39 -3
  214. package/dist/mind/friends/types.js +2 -2
  215. package/dist/mind/journal-index.js +161 -0
  216. package/dist/mind/note-search.js +268 -0
  217. package/dist/mind/obligation-steering.js +221 -0
  218. package/dist/mind/pending.js +4 -0
  219. package/dist/mind/prompt-refresh.js +3 -2
  220. package/dist/mind/prompt.js +1011 -123
  221. package/dist/mind/provenance-trust.js +26 -0
  222. package/dist/mind/scrutiny.js +173 -0
  223. package/dist/nerves/cli-logging.js +7 -1
  224. package/dist/nerves/coverage/audit-rules.js +15 -6
  225. package/dist/nerves/coverage/audit.js +28 -2
  226. package/dist/nerves/coverage/cli.js +1 -1
  227. package/dist/nerves/coverage/contract.js +5 -5
  228. package/dist/nerves/coverage/file-completeness.js +129 -5
  229. package/dist/nerves/coverage/run-artifacts.js +1 -1
  230. package/dist/nerves/event-buffer.js +111 -0
  231. package/dist/nerves/index.js +224 -4
  232. package/dist/nerves/observation.js +20 -0
  233. package/dist/nerves/redact.js +79 -0
  234. package/dist/nerves/review/cli-main.js +5 -0
  235. package/dist/nerves/review/cli.js +156 -0
  236. package/dist/nerves/review/core.js +152 -0
  237. package/dist/nerves/runtime.js +5 -1
  238. package/dist/repertoire/ado-client.js +15 -56
  239. package/dist/repertoire/ado-semantic.js +11 -10
  240. package/dist/repertoire/api-client.js +97 -0
  241. package/dist/repertoire/bitwarden-store.js +963 -0
  242. package/dist/repertoire/bundle-templates.js +72 -0
  243. package/dist/repertoire/bw-installer.js +180 -0
  244. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  245. package/dist/repertoire/coding/context-pack.js +330 -0
  246. package/dist/repertoire/coding/feedback.js +197 -30
  247. package/dist/repertoire/coding/manager.js +158 -9
  248. package/dist/repertoire/coding/spawner.js +55 -9
  249. package/dist/repertoire/coding/tools.js +170 -7
  250. package/dist/repertoire/commerce-errors.js +109 -0
  251. package/dist/repertoire/commerce-self-test.js +156 -0
  252. package/dist/repertoire/credential-access.js +178 -0
  253. package/dist/repertoire/duffel-client.js +185 -0
  254. package/dist/repertoire/github-client.js +14 -55
  255. package/dist/repertoire/graph-client.js +11 -52
  256. package/dist/repertoire/guardrails.js +396 -0
  257. package/dist/repertoire/mcp-client.js +295 -0
  258. package/dist/repertoire/mcp-manager.js +362 -0
  259. package/dist/repertoire/mcp-tools.js +63 -0
  260. package/dist/repertoire/shell-sessions.js +133 -0
  261. package/dist/repertoire/skills.js +15 -24
  262. package/dist/repertoire/stripe-client.js +131 -0
  263. package/dist/repertoire/tasks/board.js +31 -5
  264. package/dist/repertoire/tasks/fix.js +182 -0
  265. package/dist/repertoire/tasks/index.js +16 -4
  266. package/dist/repertoire/tasks/lifecycle.js +2 -2
  267. package/dist/repertoire/tasks/parser.js +3 -2
  268. package/dist/repertoire/tasks/scanner.js +194 -37
  269. package/dist/repertoire/tasks/transitions.js +16 -78
  270. package/dist/repertoire/tool-results.js +29 -0
  271. package/dist/repertoire/tools-attachments.js +317 -0
  272. package/dist/repertoire/tools-base.js +47 -1075
  273. package/dist/repertoire/tools-bluebubbles.js +1 -0
  274. package/dist/repertoire/tools-bridge.js +142 -0
  275. package/dist/repertoire/tools-bundle.js +984 -0
  276. package/dist/repertoire/tools-config.js +185 -0
  277. package/dist/repertoire/tools-continuity.js +248 -0
  278. package/dist/repertoire/tools-credential.js +381 -0
  279. package/dist/repertoire/tools-files.js +342 -0
  280. package/dist/repertoire/tools-flight.js +224 -0
  281. package/dist/repertoire/tools-flow.js +119 -0
  282. package/dist/repertoire/tools-github.js +1 -7
  283. package/dist/repertoire/tools-mail.js +1857 -0
  284. package/dist/repertoire/tools-notes.js +421 -0
  285. package/dist/repertoire/tools-session.js +750 -0
  286. package/dist/repertoire/tools-shell.js +120 -0
  287. package/dist/repertoire/tools-stripe.js +180 -0
  288. package/dist/repertoire/tools-surface.js +243 -0
  289. package/dist/repertoire/tools-teams.js +9 -39
  290. package/dist/repertoire/tools-travel.js +125 -0
  291. package/dist/repertoire/tools-trip.js +604 -0
  292. package/dist/repertoire/tools-user-profile.js +144 -0
  293. package/dist/repertoire/tools-vault.js +40 -0
  294. package/dist/repertoire/tools.js +108 -100
  295. package/dist/repertoire/travel-api-client.js +360 -0
  296. package/dist/repertoire/user-profile.js +131 -0
  297. package/dist/repertoire/vault-setup.js +246 -0
  298. package/dist/repertoire/vault-unlock.js +594 -0
  299. package/dist/scripts/claude-code-hook.js +41 -0
  300. package/dist/scripts/claude-code-stop-hook.js +47 -0
  301. package/dist/senses/attention-queue.js +116 -0
  302. package/dist/senses/bluebubbles/active-turns.js +216 -0
  303. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  304. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  305. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  306. package/dist/senses/bluebubbles/entry.js +77 -0
  307. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  308. package/dist/senses/bluebubbles/index.js +2305 -0
  309. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  310. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  311. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  312. package/dist/senses/bluebubbles/processed-log.js +133 -0
  313. package/dist/senses/bluebubbles/replay.js +137 -0
  314. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  315. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  316. package/dist/senses/cli/bracketed-paste.js +82 -0
  317. package/dist/senses/cli/image-paste.js +287 -0
  318. package/dist/senses/cli/image-ref-navigation.js +75 -0
  319. package/dist/senses/cli/ink-app.js +156 -0
  320. package/dist/senses/cli/inline-diff.js +64 -0
  321. package/dist/senses/cli/input-keys.js +174 -0
  322. package/dist/senses/cli/kill-ring.js +86 -0
  323. package/dist/senses/cli/message-list.js +51 -0
  324. package/dist/senses/cli/ouro-tui.js +607 -0
  325. package/dist/senses/cli/spinner-imperative.js +135 -0
  326. package/dist/senses/cli/spinner.js +101 -0
  327. package/dist/senses/cli/status-line.js +60 -0
  328. package/dist/senses/cli/streaming-markdown.js +526 -0
  329. package/dist/senses/cli/tool-display.js +85 -0
  330. package/dist/senses/cli/tool-render.js +85 -0
  331. package/dist/senses/cli/tui-store.js +240 -0
  332. package/dist/senses/cli/virtual-list.js +35 -0
  333. package/dist/senses/cli-entry.js +60 -8
  334. package/dist/senses/cli-layout.js +187 -0
  335. package/dist/senses/cli.js +520 -209
  336. package/dist/senses/commands.js +66 -3
  337. package/dist/senses/habit-turn-message.js +108 -0
  338. package/dist/senses/inner-dialog-worker.js +175 -21
  339. package/dist/senses/inner-dialog.js +330 -27
  340. package/dist/senses/mail-entry.js +66 -0
  341. package/dist/senses/mail.js +379 -0
  342. package/dist/senses/pipeline.js +549 -181
  343. package/dist/senses/proactive-content-guard.js +51 -0
  344. package/dist/senses/shared-turn.js +248 -0
  345. package/dist/senses/surface-tool.js +68 -0
  346. package/dist/senses/teams-entry.js +60 -8
  347. package/dist/senses/teams.js +387 -98
  348. package/dist/senses/trust-gate.js +100 -5
  349. package/dist/senses/voice/elevenlabs.js +125 -0
  350. package/dist/senses/voice/index.js +22 -0
  351. package/dist/senses/voice/transcript.js +70 -0
  352. package/dist/senses/voice/turn.js +85 -0
  353. package/dist/senses/voice/types.js +2 -0
  354. package/dist/senses/voice/whisper.js +133 -0
  355. package/dist/senses/voice-entry.js +80 -0
  356. package/dist/trips/core.js +138 -0
  357. package/dist/trips/store.js +146 -0
  358. package/package.json +38 -7
  359. package/skills/agent-commerce.md +106 -0
  360. package/skills/browser-navigation.md +117 -0
  361. package/skills/commerce-setup-guide.md +116 -0
  362. package/skills/commerce-setup.md +84 -0
  363. package/skills/configure-dev-tools.md +101 -0
  364. package/skills/travel-planning.md +138 -0
  365. package/dist/heart/daemon/auth-flow.js +0 -351
  366. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  367. package/dist/heart/daemon/subagent-installer.js +0 -166
  368. package/dist/heart/session-recall.js +0 -116
  369. package/dist/mind/associative-recall.js +0 -209
  370. package/dist/senses/bluebubbles-entry.js +0 -13
  371. package/dist/senses/bluebubbles.js +0 -1177
  372. package/dist/senses/debug-activity.js +0 -148
  373. package/subagents/README.md +0 -86
  374. package/subagents/work-doer.md +0 -237
  375. package/subagents/work-merger.md +0 -618
  376. package/subagents/work-planner.md +0 -390
  377. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  378. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  379. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  380. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  381. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  382. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  383. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  384. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  385. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  386. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  387. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  388. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  389. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  390. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  391. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  392. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -1,16 +1,71 @@
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
  // Unified agent runtime entrypoint.
4
37
  // Requires --agent before importing runtime modules that rely on identity.
5
- if (!process.argv.includes("--agent")) {
38
+ const agentArgIndex = process.argv.indexOf("--agent");
39
+ const agentName = agentArgIndex >= 0 ? process.argv[agentArgIndex + 1] : undefined;
40
+ if (!agentName) {
6
41
  // eslint-disable-next-line no-console -- pre-boot guard
7
42
  console.error("Missing required --agent <name> argument.\nUsage: node dist/heart/agent-entry.js --agent ouroboros");
8
43
  process.exit(1);
9
44
  }
10
- const inner_dialog_worker_1 = require("../senses/inner-dialog-worker");
11
45
  const cli_logging_1 = require("../nerves/cli-logging");
46
+ const runtime_1 = require("../nerves/runtime");
12
47
  (0, cli_logging_1.configureCliRuntimeLogger)("self");
13
- (0, inner_dialog_worker_1.startInnerDialogWorker)().catch((error) => {
48
+ (0, runtime_1.emitNervesEvent)({
49
+ component: "senses",
50
+ event: "senses.entry_boot",
51
+ message: "booting inner-dialog entrypoint",
52
+ meta: { entry: "inner-dialog", agentName },
53
+ });
54
+ // Dynamic import: agent-entry is boot-time wiring that starts a sense process.
55
+ // Using dynamic import avoids a static heart/ -> senses/ dependency.
56
+ Promise.resolve().then(() => __importStar(require("./runtime-credentials"))).then(async ({ refreshRuntimeCredentialConfig }) => {
57
+ void refreshRuntimeCredentialConfig(agentName, { preserveCachedOnFailure: true }).catch(() => undefined);
58
+ const { startInnerDialogWorker } = await Promise.resolve().then(() => __importStar(require("../senses/inner-dialog-worker")));
59
+ await startInnerDialogWorker();
60
+ })
61
+ .catch((error) => {
62
+ (0, runtime_1.emitNervesEvent)({
63
+ level: "error",
64
+ component: "senses",
65
+ event: "senses.entry_error",
66
+ message: "inner-dialog entrypoint failed",
67
+ meta: { entry: "inner-dialog", agentName, error: error instanceof Error ? error.message : String(error) },
68
+ });
14
69
  // eslint-disable-next-line no-console -- fatal startup guard for worker process
15
70
  console.error(error instanceof Error ? error.message : String(error));
16
71
  process.exit(1);
@@ -0,0 +1,194 @@
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.MAX_VLM_IMAGE_BYTES = exports.MAX_ATTACHMENT_DOWNLOAD_BYTES_IMAGE = void 0;
37
+ exports.normalizeImageForVision = normalizeImageForVision;
38
+ const node_child_process_1 = require("node:child_process");
39
+ const fs = __importStar(require("node:fs/promises"));
40
+ const path = __importStar(require("node:path"));
41
+ const runtime_1 = require("../../nerves/runtime");
42
+ exports.MAX_ATTACHMENT_DOWNLOAD_BYTES_IMAGE = 32 * 1024 * 1024;
43
+ exports.MAX_VLM_IMAGE_BYTES = 5 * 1024 * 1024;
44
+ const SAFE_VLM_MIME_TYPES = new Set(["image/png", "image/jpeg", "image/webp"]);
45
+ const SIZE_STEPS = [3072, 2560, 2048, 1600, 1280, 1024, 768];
46
+ const JPEG_QUALITIES = ["best", "90", "80", "70", "60"];
47
+ function materializedOutputDir(agentRoot, attachmentId) {
48
+ return path.join(agentRoot, "state", "attachments", "materialized", attachmentId.replace(/[:/]/g, "_"));
49
+ }
50
+ function execFileText(file, args) {
51
+ return new Promise((resolve, reject) => {
52
+ (0, node_child_process_1.execFile)(file, args, (error, stdout = "", stderr = "") => {
53
+ if (error) {
54
+ reject(new Error(stderr.trim() || stdout.trim() || error.message));
55
+ return;
56
+ }
57
+ resolve(stdout);
58
+ });
59
+ });
60
+ }
61
+ async function defaultProbeImage(input) {
62
+ const output = await execFileText("/usr/bin/sips", ["-g", "hasAlpha", input.sourcePath]);
63
+ const hasAlpha = /hasAlpha:\s+(yes|1|true)/i.test(output);
64
+ return { hasAlpha };
65
+ }
66
+ async function defaultRasterizeWithQuickLook(input) {
67
+ await fs.mkdir(input.outputDir, { recursive: true });
68
+ await execFileText("/usr/bin/qlmanage", ["-t", "-s", "4096", "-o", input.outputDir, input.sourcePath]);
69
+ const entries = await fs.readdir(input.outputDir);
70
+ const candidate = entries
71
+ .filter((entry) => entry.startsWith(path.basename(input.sourcePath, path.extname(input.sourcePath))))
72
+ .sort()[0];
73
+ if (!candidate) {
74
+ throw new Error("Quick Look did not produce a rasterized image");
75
+ }
76
+ return path.join(input.outputDir, candidate);
77
+ }
78
+ async function defaultEncodeVariant(input) {
79
+ await fs.mkdir(input.outputDir, { recursive: true });
80
+ const extension = input.targetFormat === "png" ? ".png" : ".jpg";
81
+ const basename = path.basename(input.sourcePath, path.extname(input.sourcePath));
82
+ const outputPath = path.join(input.outputDir, `${basename}-${input.maxEdge}-${input.targetFormat}${input.quality ? `-${input.quality}` : ""}${extension}`);
83
+ const args = [
84
+ "-s",
85
+ "format",
86
+ input.targetFormat,
87
+ ...(input.targetFormat === "jpeg" && input.quality ? ["-s", "formatOptions", input.quality] : []),
88
+ "-Z",
89
+ String(input.maxEdge),
90
+ input.sourcePath,
91
+ "--out",
92
+ outputPath,
93
+ ];
94
+ await execFileText("/usr/bin/sips", args);
95
+ const stats = await fs.stat(outputPath);
96
+ return {
97
+ path: outputPath,
98
+ mimeType: input.targetFormat === "png" ? "image/png" : "image/jpeg",
99
+ byteCount: stats.size,
100
+ };
101
+ }
102
+ async function normalizeImageForVision(params) {
103
+ const maxVlmBytes = params.maxVlmBytes ?? exports.MAX_VLM_IMAGE_BYTES;
104
+ const originalMimeType = params.attachment.mimeType?.trim().toLowerCase();
105
+ const originalByteCount = params.attachment.byteCount;
106
+ const outputDir = materializedOutputDir(params.agentRoot, params.attachment.id);
107
+ if (originalMimeType
108
+ && SAFE_VLM_MIME_TYPES.has(originalMimeType)
109
+ && typeof originalByteCount === "number"
110
+ && originalByteCount <= maxVlmBytes) {
111
+ (0, runtime_1.emitNervesEvent)({
112
+ component: "engine",
113
+ event: "engine.attachment_normalization_passthrough",
114
+ message: "attachment image normalization updated",
115
+ meta: {
116
+ attachmentId: params.attachment.id,
117
+ mimeType: originalMimeType,
118
+ byteCount: originalByteCount,
119
+ },
120
+ });
121
+ return {
122
+ path: path.resolve(params.sourcePath),
123
+ mimeType: originalMimeType,
124
+ byteCount: originalByteCount,
125
+ };
126
+ }
127
+ const probeImage = params.probeImage ?? defaultProbeImage;
128
+ const rasterizeWithQuickLook = params.rasterizeWithQuickLook ?? defaultRasterizeWithQuickLook;
129
+ const encodeVariant = params.encodeVariant ?? defaultEncodeVariant;
130
+ let workingSourcePath = path.resolve(params.sourcePath);
131
+ let probe;
132
+ try {
133
+ probe = await probeImage({ sourcePath: workingSourcePath });
134
+ }
135
+ catch {
136
+ (0, runtime_1.emitNervesEvent)({
137
+ component: "engine",
138
+ event: "engine.attachment_normalization_rasterize",
139
+ message: "attachment image normalization updated",
140
+ meta: {
141
+ attachmentId: params.attachment.id,
142
+ sourcePath: workingSourcePath,
143
+ },
144
+ });
145
+ workingSourcePath = await rasterizeWithQuickLook({
146
+ sourcePath: workingSourcePath,
147
+ outputDir,
148
+ });
149
+ probe = await probeImage({ sourcePath: workingSourcePath });
150
+ }
151
+ const targetFormats = probe.hasAlpha ? ["png", "jpeg"] : ["jpeg"];
152
+ for (const targetFormat of targetFormats) {
153
+ for (const maxEdge of SIZE_STEPS) {
154
+ const qualities = targetFormat === "jpeg" ? JPEG_QUALITIES : [undefined];
155
+ for (const quality of qualities) {
156
+ const variant = await encodeVariant({
157
+ sourcePath: workingSourcePath,
158
+ outputDir,
159
+ targetFormat,
160
+ maxEdge,
161
+ ...(quality ? { quality } : {}),
162
+ });
163
+ if ((variant.byteCount ?? Number.POSITIVE_INFINITY) <= maxVlmBytes) {
164
+ (0, runtime_1.emitNervesEvent)({
165
+ component: "engine",
166
+ event: "engine.attachment_normalization_succeeded",
167
+ message: "attachment image normalization updated",
168
+ meta: {
169
+ attachmentId: params.attachment.id,
170
+ sourceMimeType: originalMimeType ?? "unknown",
171
+ outputMimeType: variant.mimeType ?? `image/${targetFormat}`,
172
+ byteCount: variant.byteCount,
173
+ maxEdge,
174
+ quality: quality ?? null,
175
+ },
176
+ });
177
+ return variant;
178
+ }
179
+ }
180
+ }
181
+ }
182
+ (0, runtime_1.emitNervesEvent)({
183
+ component: "engine",
184
+ event: "engine.attachment_normalization_failed",
185
+ message: "attachment image normalization updated",
186
+ meta: {
187
+ attachmentId: params.attachment.id,
188
+ sourceMimeType: originalMimeType ?? "unknown",
189
+ sourceByteCount: originalByteCount ?? null,
190
+ maxVlmBytes,
191
+ },
192
+ });
193
+ throw new Error(`Attachment ${params.attachment.id} could not be normalized under the VLM byte budget`);
194
+ }
@@ -0,0 +1,97 @@
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.materializeAttachment = materializeAttachment;
37
+ const path = __importStar(require("node:path"));
38
+ const runtime_1 = require("../../nerves/runtime");
39
+ const identity_1 = require("../identity");
40
+ const image_normalize_1 = require("./image-normalize");
41
+ const store_1 = require("./store");
42
+ const sources_1 = require("./sources");
43
+ async function materializeOriginalAttachment(agentName, attachment, agentRoot) {
44
+ const adapter = (0, sources_1.getAttachmentSourceAdapter)(attachment.source);
45
+ const materialized = await adapter.materializeOriginal({ agentName, attachment, agentRoot });
46
+ (0, runtime_1.emitNervesEvent)({
47
+ component: "engine",
48
+ event: "engine.attachment_materialized",
49
+ message: "attachment materialization updated",
50
+ meta: {
51
+ attachmentId: attachment.id,
52
+ variant: "original",
53
+ source: attachment.source,
54
+ },
55
+ });
56
+ return materialized;
57
+ }
58
+ async function materializeAttachment(agentName, attachmentId, options = {}) {
59
+ const agentRoot = options.agentRoot ?? (0, identity_1.getAgentRoot)(agentName);
60
+ const variant = options.variant ?? "original";
61
+ const attachment = (0, store_1.getRecentAttachment)(agentName, attachmentId, agentRoot);
62
+ if (!attachment) {
63
+ throw new Error(`Attachment not found: ${attachmentId}`);
64
+ }
65
+ if (variant === "original") {
66
+ return await materializeOriginalAttachment(agentName, attachment, agentRoot);
67
+ }
68
+ if (attachment.kind !== "image") {
69
+ throw new Error(`Attachment ${attachmentId} is not an image and cannot produce a vision_safe variant`);
70
+ }
71
+ const original = await materializeOriginalAttachment(agentName, attachment, agentRoot);
72
+ const normalizeImage = options.normalizeImage ?? image_normalize_1.normalizeImageForVision;
73
+ const normalized = await normalizeImage({
74
+ attachment,
75
+ sourcePath: original.path,
76
+ agentName,
77
+ agentRoot,
78
+ });
79
+ (0, runtime_1.emitNervesEvent)({
80
+ component: "engine",
81
+ event: "engine.attachment_materialized",
82
+ message: "attachment materialization updated",
83
+ meta: {
84
+ attachmentId: attachment.id,
85
+ variant: "vision_safe",
86
+ source: attachment.source,
87
+ },
88
+ });
89
+ return {
90
+ attachmentId: attachment.id,
91
+ variant: "vision_safe",
92
+ path: path.resolve(normalized.path),
93
+ displayName: attachment.displayName,
94
+ mimeType: normalized.mimeType ?? attachment.mimeType,
95
+ byteCount: normalized.byteCount,
96
+ };
97
+ }
@@ -0,0 +1,88 @@
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.ensureReadableFile = ensureReadableFile;
37
+ exports.extensionForAttachment = extensionForAttachment;
38
+ exports.originalStoragePath = originalStoragePath;
39
+ exports.buildOriginalMaterializedAttachment = buildOriginalMaterializedAttachment;
40
+ const fs = __importStar(require("node:fs/promises"));
41
+ const path = __importStar(require("node:path"));
42
+ async function ensureReadableFile(filePath) {
43
+ await fs.access(filePath);
44
+ }
45
+ function extensionForAttachment(displayName, mimeType) {
46
+ const explicit = path.extname(displayName).trim();
47
+ if (explicit)
48
+ return explicit;
49
+ switch (mimeType?.trim().toLowerCase()) {
50
+ case "image/jpeg":
51
+ return ".jpg";
52
+ case "image/png":
53
+ return ".png";
54
+ case "image/webp":
55
+ return ".webp";
56
+ case "image/gif":
57
+ return ".gif";
58
+ case "image/tiff":
59
+ return ".tiff";
60
+ case "image/bmp":
61
+ return ".bmp";
62
+ case "image/heic":
63
+ return ".heic";
64
+ case "application/pdf":
65
+ return ".pdf";
66
+ case "audio/mp3":
67
+ case "audio/mpeg":
68
+ return ".mp3";
69
+ case "audio/mp4":
70
+ return ".m4a";
71
+ default:
72
+ return "";
73
+ }
74
+ }
75
+ function originalStoragePath(agentRoot, attachment, mimeType) {
76
+ const extension = extensionForAttachment(attachment.displayName, mimeType ?? attachment.mimeType);
77
+ return path.join(agentRoot, "state", "attachments", "materialized", attachment.source, attachment.sourceId, `original${extension}`);
78
+ }
79
+ function buildOriginalMaterializedAttachment(attachment, filePath, mimeType, byteCount) {
80
+ return {
81
+ attachmentId: attachment.id,
82
+ variant: "original",
83
+ path: filePath,
84
+ displayName: attachment.displayName,
85
+ mimeType: mimeType ?? attachment.mimeType,
86
+ byteCount: byteCount ?? attachment.byteCount,
87
+ };
88
+ }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderAttachmentBlock = renderAttachmentBlock;
4
+ const runtime_1 = require("../../nerves/runtime");
5
+ function formatBytes(byteCount) {
6
+ if (typeof byteCount !== "number" || !Number.isFinite(byteCount) || byteCount < 0) {
7
+ return "unknown size";
8
+ }
9
+ if (byteCount >= 1024 * 1024) {
10
+ return `${(byteCount / (1024 * 1024)).toFixed(1)} MB`;
11
+ }
12
+ if (byteCount >= 1024) {
13
+ return `${Math.round(byteCount / 1024)} KB`;
14
+ }
15
+ return `${byteCount} B`;
16
+ }
17
+ function renderAttachmentBlock(attachments) {
18
+ if (attachments.length === 0)
19
+ return "";
20
+ const body = attachments.map((attachment) => `- ${attachment.id} | ${attachment.kind} | ${attachment.displayName} | ${attachment.mimeType ?? "unknown mime"} | ${formatBytes(attachment.byteCount)}`);
21
+ const rendered = ["[attachments]", ...body].join("\n");
22
+ (0, runtime_1.emitNervesEvent)({
23
+ component: "engine",
24
+ event: "engine.attachment_block_rendered",
25
+ message: "attachment transcript block rendered",
26
+ meta: { count: attachments.length },
27
+ });
28
+ return rendered;
29
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,156 @@
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.blueBubblesAttachmentSourceAdapter = void 0;
37
+ exports.buildBlueBubblesAttachmentRecord = buildBlueBubblesAttachmentRecord;
38
+ exports.persistBlueBubblesAttachmentSource = persistBlueBubblesAttachmentSource;
39
+ const fs = __importStar(require("node:fs/promises"));
40
+ const path = __importStar(require("node:path"));
41
+ const runtime_1 = require("../../../nerves/runtime");
42
+ const attachment_download_1 = require("../../../senses/bluebubbles/attachment-download");
43
+ const config_1 = require("../../config");
44
+ const identity_1 = require("../../identity");
45
+ const originals_1 = require("../originals");
46
+ const store_1 = require("../store");
47
+ const types_1 = require("../types");
48
+ function normalizeBlueBubblesRecord(attachment) {
49
+ if (attachment.source !== "bluebubbles") {
50
+ throw new Error(`bluebubbles adapter cannot materialize ${attachment.source} attachments`);
51
+ }
52
+ const sourceData = attachment.sourceData;
53
+ const guid = typeof sourceData?.guid === "string" && sourceData.guid.trim().length > 0
54
+ ? sourceData.guid.trim()
55
+ : attachment.sourceId.trim();
56
+ if (!guid) {
57
+ throw new Error("BlueBubbles attachment guid is required");
58
+ }
59
+ const localPath = typeof sourceData?.localPath === "string" && sourceData.localPath.trim().length > 0
60
+ ? path.resolve(sourceData.localPath)
61
+ : undefined;
62
+ return {
63
+ ...attachment,
64
+ source: "bluebubbles",
65
+ sourceId: guid,
66
+ sourceData: {
67
+ guid,
68
+ mimeType: typeof sourceData?.mimeType === "string" ? sourceData.mimeType : attachment.mimeType,
69
+ transferName: typeof sourceData?.transferName === "string" ? sourceData.transferName : attachment.displayName,
70
+ totalBytes: typeof sourceData?.totalBytes === "number" ? sourceData.totalBytes : attachment.byteCount,
71
+ height: typeof sourceData?.height === "number" ? sourceData.height : undefined,
72
+ width: typeof sourceData?.width === "number" ? sourceData.width : undefined,
73
+ ...(localPath ? { localPath } : {}),
74
+ },
75
+ };
76
+ }
77
+ function buildBlueBubblesAttachmentRecord(summary, now = Date.now(), options = {}) {
78
+ const guid = summary.guid?.trim();
79
+ if (!guid) {
80
+ throw new Error("BlueBubbles attachment guid is required");
81
+ }
82
+ const displayName = summary.transferName?.trim() || guid;
83
+ const mimeType = options.mimeType?.trim().toLowerCase() || summary.mimeType?.trim().toLowerCase() || undefined;
84
+ return (0, types_1.createAttachmentRecord)({
85
+ source: "bluebubbles",
86
+ sourceId: guid,
87
+ displayName,
88
+ mimeType,
89
+ byteCount: options.byteCount ?? summary.totalBytes,
90
+ sourceData: {
91
+ ...summary,
92
+ guid,
93
+ ...(options.localPath ? { localPath: path.resolve(options.localPath) } : {}),
94
+ },
95
+ }, now);
96
+ }
97
+ async function persistBlueBubblesAttachmentSource(agentName, attachment, input, agentRoot = (0, identity_1.getAgentRoot)(agentName)) {
98
+ const normalizedAttachment = normalizeBlueBubblesRecord(attachment);
99
+ const targetPath = (0, originals_1.originalStoragePath)(agentRoot, normalizedAttachment, input.mimeType);
100
+ await fs.mkdir(path.dirname(targetPath), { recursive: true });
101
+ await fs.writeFile(targetPath, input.buffer);
102
+ const updated = buildBlueBubblesAttachmentRecord({
103
+ ...normalizedAttachment.sourceData,
104
+ mimeType: input.mimeType ?? normalizedAttachment.sourceData.mimeType,
105
+ totalBytes: input.byteCount ?? normalizedAttachment.byteCount,
106
+ }, normalizedAttachment.createdAt, {
107
+ localPath: targetPath,
108
+ mimeType: input.mimeType ?? normalizedAttachment.mimeType,
109
+ byteCount: input.byteCount ?? normalizedAttachment.byteCount,
110
+ });
111
+ updated.lastSeenAt = Date.now();
112
+ (0, store_1.cacheRecentAttachment)(agentName, updated, agentRoot);
113
+ (0, runtime_1.emitNervesEvent)({
114
+ component: "engine",
115
+ event: "engine.attachment_source_persisted",
116
+ message: "attachment materialization updated",
117
+ meta: {
118
+ attachmentId: normalizedAttachment.id,
119
+ source: normalizedAttachment.source,
120
+ mimeType: updated.mimeType,
121
+ },
122
+ });
123
+ return updated;
124
+ }
125
+ exports.blueBubblesAttachmentSourceAdapter = {
126
+ source: "bluebubbles",
127
+ async materializeOriginal({ agentName, attachment, agentRoot }) {
128
+ const normalizedAttachment = normalizeBlueBubblesRecord(attachment);
129
+ const localPath = normalizedAttachment.sourceData.localPath?.trim();
130
+ if (localPath) {
131
+ await (0, originals_1.ensureReadableFile)(localPath);
132
+ return (0, originals_1.buildOriginalMaterializedAttachment)(normalizedAttachment, localPath);
133
+ }
134
+ const fallbackPath = (0, originals_1.originalStoragePath)(agentRoot, normalizedAttachment);
135
+ try {
136
+ await (0, originals_1.ensureReadableFile)(fallbackPath);
137
+ return (0, originals_1.buildOriginalMaterializedAttachment)(normalizedAttachment, fallbackPath);
138
+ }
139
+ catch {
140
+ const config = (0, config_1.getBlueBubblesConfig)();
141
+ const channelConfig = (0, config_1.getBlueBubblesChannelConfig)();
142
+ const downloaded = await (0, attachment_download_1.downloadBlueBubblesAttachment)(normalizedAttachment.sourceData, config, channelConfig);
143
+ const updated = await persistBlueBubblesAttachmentSource(agentName, normalizedAttachment, {
144
+ buffer: downloaded.buffer,
145
+ mimeType: downloaded.contentType,
146
+ byteCount: downloaded.buffer.length,
147
+ }, agentRoot);
148
+ const persistedPath = updated.sourceData.localPath;
149
+ /* v8 ignore next -- persistBlueBubblesAttachmentSource always writes localPath before returning @preserve */
150
+ if (!persistedPath) {
151
+ throw new Error("BlueBubbles attachment persistence did not yield a local path");
152
+ }
153
+ return (0, originals_1.buildOriginalMaterializedAttachment)(updated, persistedPath, downloaded.contentType ?? updated.mimeType, downloaded.buffer.length);
154
+ }
155
+ },
156
+ };