@ouro.bot/cli 0.1.0-alpha.69 → 0.1.0-alpha.691

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 (480) hide show
  1. package/README.md +133 -23
  2. package/RepairGuide.ouro/agent.json +5 -0
  3. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  4. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  5. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  6. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  7. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  8. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  9. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  12. package/changelog.json +4398 -14
  13. package/dist/a2a/card.js +57 -0
  14. package/dist/a2a/client.js +180 -0
  15. package/dist/a2a/config.js +50 -0
  16. package/dist/a2a/delegation-stores.js +56 -0
  17. package/dist/a2a/did-resolution.js +93 -0
  18. package/dist/a2a/identity.js +170 -0
  19. package/dist/a2a/inbound-share.js +107 -0
  20. package/dist/a2a/mission-result-wire.js +196 -0
  21. package/dist/a2a/onboarding.js +115 -0
  22. package/dist/a2a/pin-store.js +132 -0
  23. package/dist/a2a/seen-ledger.js +120 -0
  24. package/dist/a2a/server.js +604 -0
  25. package/dist/a2a/task-store.js +69 -0
  26. package/dist/a2a/transport.js +45 -0
  27. package/dist/a2a/types.js +3 -0
  28. package/dist/arc/attention-types.js +8 -0
  29. package/dist/arc/cares.js +144 -0
  30. package/dist/arc/episodes.js +118 -0
  31. package/dist/arc/evolution.js +490 -0
  32. package/dist/arc/flight-recorder.js +810 -0
  33. package/dist/arc/intentions.js +134 -0
  34. package/dist/arc/json-store.js +117 -0
  35. package/dist/arc/obligations.js +326 -0
  36. package/dist/arc/packets.js +288 -0
  37. package/dist/arc/presence.js +185 -0
  38. package/dist/arc/task-lifecycle.js +57 -0
  39. package/dist/commerce/store.js +755 -0
  40. package/dist/commerce/types.js +3 -0
  41. package/dist/heart/active-work.js +867 -43
  42. package/dist/heart/agent-entry.js +160 -3
  43. package/dist/heart/attachments/image-normalize.js +194 -0
  44. package/dist/heart/attachments/materialize.js +97 -0
  45. package/dist/heart/attachments/originals.js +88 -0
  46. package/dist/heart/attachments/render.js +29 -0
  47. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  48. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  49. package/dist/heart/attachments/sources/index.js +16 -0
  50. package/dist/heart/attachments/store.js +103 -0
  51. package/dist/heart/attachments/types.js +93 -0
  52. package/dist/heart/auth/auth-flow.js +479 -0
  53. package/dist/heart/awaiting/await-alert.js +146 -0
  54. package/dist/heart/awaiting/await-expiry.js +108 -0
  55. package/dist/heart/awaiting/await-loader.js +91 -0
  56. package/dist/heart/awaiting/await-parser.js +141 -0
  57. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  58. package/dist/heart/awaiting/await-scheduler.js +378 -0
  59. package/dist/heart/background-operations.js +281 -0
  60. package/dist/heart/bridges/manager.js +137 -17
  61. package/dist/heart/bridges/store.js +14 -2
  62. package/dist/heart/bundle-state.js +168 -0
  63. package/dist/heart/commitments.js +135 -0
  64. package/dist/heart/config-registry.js +331 -0
  65. package/dist/heart/config.js +122 -119
  66. package/dist/heart/context-loss-gauntlet.js +354 -0
  67. package/dist/heart/context-loss-sentinel.js +993 -0
  68. package/dist/heart/core.js +1297 -269
  69. package/dist/heart/cross-chat-delivery.js +8 -22
  70. package/dist/heart/daemon/agent-config-check.js +451 -0
  71. package/dist/heart/daemon/agent-discovery.js +185 -3
  72. package/dist/heart/daemon/agent-service.js +523 -0
  73. package/dist/heart/daemon/agentic-repair.js +547 -0
  74. package/dist/heart/daemon/await-private-wake.js +59 -0
  75. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  76. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  77. package/dist/heart/daemon/cadence.js +70 -0
  78. package/dist/heart/daemon/cli-defaults.js +780 -0
  79. package/dist/heart/daemon/cli-desk.js +322 -0
  80. package/dist/heart/daemon/cli-exec.js +8100 -0
  81. package/dist/heart/daemon/cli-help.js +601 -0
  82. package/dist/heart/daemon/cli-parse.js +1995 -0
  83. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  84. package/dist/heart/daemon/cli-render.js +770 -0
  85. package/dist/heart/daemon/cli-types.js +8 -0
  86. package/dist/heart/daemon/connect-bay.js +323 -0
  87. package/dist/heart/daemon/daemon-cli.js +29 -1814
  88. package/dist/heart/daemon/daemon-entry.js +668 -6
  89. package/dist/heart/daemon/daemon-health.js +176 -0
  90. package/dist/heart/daemon/daemon-rollup.js +57 -0
  91. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  92. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  93. package/dist/heart/daemon/daemon.js +1222 -84
  94. package/dist/heart/daemon/dns-workflow.js +394 -0
  95. package/dist/heart/daemon/doctor-types.js +8 -0
  96. package/dist/heart/daemon/doctor.js +873 -0
  97. package/dist/heart/daemon/habit-private-wake.js +56 -0
  98. package/dist/heart/daemon/health-monitor.js +131 -3
  99. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  100. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  101. package/dist/heart/daemon/http-health-probe.js +80 -0
  102. package/dist/heart/daemon/human-command-screens.js +234 -0
  103. package/dist/heart/daemon/human-readiness.js +114 -0
  104. package/dist/heart/daemon/inner-status.js +78 -0
  105. package/dist/heart/daemon/interactive-repair.js +394 -0
  106. package/dist/heart/daemon/launchd.js +37 -8
  107. package/dist/heart/daemon/log-tailer.js +79 -10
  108. package/dist/heart/daemon/logs-prune.js +110 -0
  109. package/dist/heart/daemon/mcp-canary.js +297 -0
  110. package/dist/heart/daemon/message-router.js +45 -5
  111. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  112. package/dist/heart/daemon/os-cron-deps.js +135 -0
  113. package/dist/heart/daemon/os-cron.js +14 -12
  114. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  115. package/dist/heart/daemon/ouro-entry.js +3 -1
  116. package/dist/heart/daemon/plugin-cli.js +432 -0
  117. package/dist/heart/daemon/process-manager.js +519 -40
  118. package/dist/heart/daemon/provider-discovery.js +137 -0
  119. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  120. package/dist/heart/daemon/pulse.js +511 -0
  121. package/dist/heart/daemon/readiness-repair.js +365 -0
  122. package/dist/heart/daemon/run-hooks.js +2 -0
  123. package/dist/heart/daemon/runtime-logging.js +41 -14
  124. package/dist/heart/daemon/runtime-metadata.js +2 -30
  125. package/dist/heart/daemon/safe-mode.js +161 -0
  126. package/dist/heart/daemon/sense-manager.js +583 -43
  127. package/dist/heart/daemon/session-id-resolver.js +131 -0
  128. package/dist/heart/daemon/skill-management-installer.js +1 -1
  129. package/dist/heart/daemon/socket-client.js +171 -12
  130. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  131. package/dist/heart/daemon/startup-tui.js +338 -0
  132. package/dist/heart/daemon/task-scheduler.js +117 -39
  133. package/dist/heart/daemon/terminal-ui.js +499 -0
  134. package/dist/heart/daemon/thoughts.js +255 -43
  135. package/dist/heart/daemon/up-progress.js +366 -0
  136. package/dist/heart/daemon/vault-items.js +56 -0
  137. package/dist/heart/delegation.js +1 -4
  138. package/dist/heart/external-events/router.js +121 -0
  139. package/dist/heart/habits/habit-migration.js +189 -0
  140. package/dist/heart/habits/habit-parser.js +211 -0
  141. package/dist/heart/habits/habit-runtime-state.js +114 -0
  142. package/dist/heart/habits/habit-scheduler.js +411 -0
  143. package/dist/heart/habits/habit-session-summary.js +318 -0
  144. package/dist/heart/habits/habit-session.js +618 -0
  145. package/dist/heart/{daemon → hatch}/hatch-flow.js +51 -57
  146. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  147. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  148. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  149. package/dist/heart/identity.js +174 -58
  150. package/dist/heart/kept-notes.js +289 -0
  151. package/dist/heart/kicks.js +1 -1
  152. package/dist/heart/machine-identity.js +161 -0
  153. package/dist/heart/mail-import-discovery.js +353 -0
  154. package/dist/heart/mailbox/mailbox-http-hooks.js +96 -0
  155. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  156. package/dist/heart/mailbox/mailbox-http-routes.js +375 -0
  157. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  158. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  159. package/dist/heart/mailbox/mailbox-http.js +99 -0
  160. package/dist/heart/mailbox/mailbox-read.js +37 -0
  161. package/dist/heart/mailbox/mailbox-types.js +27 -0
  162. package/dist/heart/mailbox/mailbox-view.js +197 -0
  163. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  164. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  165. package/dist/heart/mailbox/readers/mail.js +375 -0
  166. package/dist/heart/mailbox/readers/runtime-readers.js +815 -0
  167. package/dist/heart/mailbox/readers/sessions.js +232 -0
  168. package/dist/heart/mailbox/readers/shared.js +111 -0
  169. package/dist/heart/mcp/mcp-server.js +696 -0
  170. package/dist/heart/migrate-config.js +100 -0
  171. package/dist/heart/model-capabilities.js +19 -0
  172. package/dist/heart/orientation-frame.js +217 -0
  173. package/dist/heart/platform.js +81 -0
  174. package/dist/heart/primitives.js +1 -1
  175. package/dist/heart/private-runtime/decision-renderer.js +156 -0
  176. package/dist/heart/private-runtime/index.js +18 -0
  177. package/dist/heart/private-runtime/ledger.js +218 -0
  178. package/dist/heart/private-runtime/policy.js +214 -0
  179. package/dist/heart/private-runtime/types.js +2 -0
  180. package/dist/heart/progress-story.js +1 -1
  181. package/dist/heart/provider-attempt.js +134 -0
  182. package/dist/heart/provider-binding-resolver.js +273 -0
  183. package/dist/heart/provider-credentials.js +425 -0
  184. package/dist/heart/provider-failover.js +311 -0
  185. package/dist/heart/provider-models.js +81 -0
  186. package/dist/heart/provider-ping.js +262 -0
  187. package/dist/heart/provider-readiness-cache.js +119 -0
  188. package/dist/heart/provider-visibility.js +188 -0
  189. package/dist/heart/providers/anthropic-token.js +131 -0
  190. package/dist/heart/providers/anthropic.js +139 -52
  191. package/dist/heart/providers/azure.js +23 -11
  192. package/dist/heart/providers/error-classification.js +127 -0
  193. package/dist/heart/providers/github-copilot.js +145 -0
  194. package/dist/heart/providers/minimax-vlm.js +189 -0
  195. package/dist/heart/providers/minimax.js +26 -8
  196. package/dist/heart/providers/openai-codex-token.js +349 -0
  197. package/dist/heart/providers/openai-codex.js +55 -40
  198. package/dist/heart/runtime-capability-check.js +170 -0
  199. package/dist/heart/runtime-credentials.js +389 -0
  200. package/dist/heart/runtime-cwd.js +87 -0
  201. package/dist/heart/sense-truth.js +17 -4
  202. package/dist/heart/session-activity.js +90 -24
  203. package/dist/heart/session-events.js +1133 -0
  204. package/dist/heart/session-playback-cli-main.js +5 -0
  205. package/dist/heart/session-playback-cli.js +36 -0
  206. package/dist/heart/session-playback.js +231 -0
  207. package/dist/heart/session-stats-cli-main.js +5 -0
  208. package/dist/heart/session-stats.js +182 -0
  209. package/dist/heart/session-transcript.js +133 -0
  210. package/dist/heart/start-of-turn-packet.js +365 -0
  211. package/dist/heart/streaming.js +44 -27
  212. package/dist/heart/structured-output.js +196 -0
  213. package/dist/heart/sync-classification.js +176 -0
  214. package/dist/heart/sync.js +449 -0
  215. package/dist/heart/target-resolution.js +11 -7
  216. package/dist/heart/tempo.js +93 -0
  217. package/dist/heart/temporal-view.js +41 -0
  218. package/dist/heart/timeouts.js +101 -0
  219. package/dist/heart/tool-activity-callbacks.js +59 -0
  220. package/dist/heart/tool-description.js +155 -0
  221. package/dist/heart/tool-friction.js +55 -0
  222. package/dist/heart/tool-loop.js +200 -0
  223. package/dist/heart/turn-context.js +450 -0
  224. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  225. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  226. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  227. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  228. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  229. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  230. package/dist/heart/versioning/update-hooks.js +154 -0
  231. package/dist/heart/work-card.js +390 -0
  232. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  233. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  234. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  235. package/dist/mailbox-ui/index.html +16 -0
  236. package/dist/mailroom/attention.js +167 -0
  237. package/dist/mailroom/autonomy.js +209 -0
  238. package/dist/mailroom/blob-store.js +715 -0
  239. package/dist/mailroom/body-cache.js +61 -0
  240. package/dist/mailroom/core.js +788 -0
  241. package/dist/mailroom/entry.js +160 -0
  242. package/dist/mailroom/file-store.js +568 -0
  243. package/dist/mailroom/mbox-import.js +393 -0
  244. package/dist/mailroom/migration.js +164 -0
  245. package/dist/mailroom/outbound.js +380 -0
  246. package/dist/mailroom/policy.js +263 -0
  247. package/dist/mailroom/reader.js +233 -0
  248. package/dist/mailroom/search-cache.js +334 -0
  249. package/dist/mailroom/search-relevance.js +319 -0
  250. package/dist/mailroom/smtp-ingress.js +176 -0
  251. package/dist/mailroom/source-state.js +176 -0
  252. package/dist/mailroom/thread.js +109 -0
  253. package/dist/mailroom/travel-extract.js +89 -0
  254. package/dist/mind/bundle-manifest.js +24 -2
  255. package/dist/mind/context.js +250 -101
  256. package/dist/mind/desk-section.js +362 -0
  257. package/dist/mind/diary-integrity.js +60 -0
  258. package/dist/mind/{memory.js → diary.js} +68 -77
  259. package/dist/mind/embedding-provider.js +60 -0
  260. package/dist/mind/file-state.js +179 -0
  261. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  262. package/dist/mind/obligation-steering.js +221 -0
  263. package/dist/mind/pending.js +13 -8
  264. package/dist/mind/prompt-refresh.js +3 -2
  265. package/dist/mind/prompt.js +1009 -169
  266. package/dist/mind/provenance-trust.js +26 -0
  267. package/dist/mind/record-paths.js +312 -0
  268. package/dist/mind/scrutiny.js +173 -0
  269. package/dist/nerves/cli-logging.js +7 -1
  270. package/dist/nerves/coverage/audit-rules.js +15 -6
  271. package/dist/nerves/coverage/audit.js +28 -2
  272. package/dist/nerves/coverage/cli.js +1 -1
  273. package/dist/nerves/coverage/contract.js +5 -5
  274. package/dist/nerves/coverage/file-completeness.js +139 -5
  275. package/dist/nerves/event-buffer.js +111 -0
  276. package/dist/nerves/index.js +224 -4
  277. package/dist/nerves/observation.js +20 -0
  278. package/dist/nerves/redact.js +79 -0
  279. package/dist/nerves/review/cli-main.js +5 -0
  280. package/dist/nerves/review/cli.js +156 -0
  281. package/dist/nerves/review/core.js +152 -0
  282. package/dist/nerves/runtime.js +5 -1
  283. package/dist/repertoire/ado-client.js +15 -56
  284. package/dist/repertoire/ado-semantic.js +16 -10
  285. package/dist/repertoire/api-client.js +97 -0
  286. package/dist/repertoire/bitwarden-store.js +1042 -0
  287. package/dist/repertoire/bundle-templates.js +71 -0
  288. package/dist/repertoire/bw-installer.js +180 -0
  289. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  290. package/dist/repertoire/coding/context-pack.js +331 -0
  291. package/dist/repertoire/coding/feedback.js +218 -30
  292. package/dist/repertoire/coding/index.js +15 -3
  293. package/dist/repertoire/coding/manager.js +166 -10
  294. package/dist/repertoire/coding/spawner.js +58 -11
  295. package/dist/repertoire/coding/tools.js +242 -14
  296. package/dist/repertoire/coding/workbench-client.js +272 -0
  297. package/dist/repertoire/coding/workbench-manager.js +346 -0
  298. package/dist/repertoire/commerce-errors.js +109 -0
  299. package/dist/repertoire/commerce-self-test.js +156 -0
  300. package/dist/repertoire/credential-access.js +178 -0
  301. package/dist/repertoire/desk/classifier.js +362 -0
  302. package/dist/repertoire/duffel-client.js +185 -0
  303. package/dist/repertoire/github-client.js +14 -55
  304. package/dist/repertoire/graph-client.js +11 -52
  305. package/dist/repertoire/guardrails.js +159 -27
  306. package/dist/repertoire/mcp-client.js +44 -3
  307. package/dist/repertoire/mcp-manager.js +259 -20
  308. package/dist/repertoire/mcp-tools.js +83 -0
  309. package/dist/repertoire/plugin-mcp.js +175 -0
  310. package/dist/repertoire/plugins.js +253 -0
  311. package/dist/repertoire/shell-sessions.js +133 -0
  312. package/dist/repertoire/skills.js +48 -4
  313. package/dist/repertoire/stripe-client.js +131 -0
  314. package/dist/repertoire/tool-results.js +29 -0
  315. package/dist/repertoire/tools-a2a.js +699 -0
  316. package/dist/repertoire/tools-attachments.js +317 -0
  317. package/dist/repertoire/tools-awaiting.js +372 -0
  318. package/dist/repertoire/tools-base.js +63 -1095
  319. package/dist/repertoire/tools-bluebubbles.js +2 -0
  320. package/dist/repertoire/tools-bridge.js +144 -0
  321. package/dist/repertoire/tools-bundle.js +993 -0
  322. package/dist/repertoire/tools-commerce.js +253 -0
  323. package/dist/repertoire/tools-config.js +186 -0
  324. package/dist/repertoire/tools-continuity.js +252 -0
  325. package/dist/repertoire/tools-credential.js +383 -0
  326. package/dist/repertoire/tools-evolution.js +527 -0
  327. package/dist/repertoire/tools-files.js +344 -0
  328. package/dist/repertoire/tools-flight.js +290 -0
  329. package/dist/repertoire/tools-flow.js +119 -0
  330. package/dist/repertoire/tools-github.js +3 -8
  331. package/dist/repertoire/tools-mail.js +1975 -0
  332. package/dist/repertoire/tools-notes.js +459 -0
  333. package/dist/repertoire/tools-obligations.js +143 -0
  334. package/dist/repertoire/tools-orientation.js +31 -0
  335. package/dist/repertoire/tools-record.js +482 -0
  336. package/dist/repertoire/tools-runtime.js +150 -0
  337. package/dist/repertoire/tools-session.js +881 -0
  338. package/dist/repertoire/tools-shell.js +120 -0
  339. package/dist/repertoire/tools-stripe.js +224 -0
  340. package/dist/repertoire/tools-surface.js +355 -0
  341. package/dist/repertoire/tools-teams.js +12 -39
  342. package/dist/repertoire/tools-travel.js +125 -0
  343. package/dist/repertoire/tools-trip.js +982 -0
  344. package/dist/repertoire/tools-user-profile.js +146 -0
  345. package/dist/repertoire/tools-vault.js +40 -0
  346. package/dist/repertoire/tools-voice.js +145 -0
  347. package/dist/repertoire/tools.js +250 -80
  348. package/dist/repertoire/travel-api-client.js +360 -0
  349. package/dist/repertoire/user-profile.js +131 -0
  350. package/dist/repertoire/vault-setup.js +246 -0
  351. package/dist/repertoire/vault-unlock.js +594 -0
  352. package/dist/scripts/claude-code-hook.js +41 -0
  353. package/dist/scripts/claude-code-stop-hook.js +47 -0
  354. package/dist/senses/a2a-entry.js +115 -0
  355. package/dist/senses/attention-queue.js +186 -0
  356. package/dist/senses/await-turn-message.js +58 -0
  357. package/dist/senses/bluebubbles/active-turns.js +216 -0
  358. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  359. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  360. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  361. package/dist/senses/bluebubbles/entry.js +77 -0
  362. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  363. package/dist/senses/bluebubbles/index.js +2732 -0
  364. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  365. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  366. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  367. package/dist/senses/bluebubbles/processed-log.js +133 -0
  368. package/dist/senses/bluebubbles/replay.js +137 -0
  369. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  370. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  371. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  372. package/dist/senses/cli/bracketed-paste.js +82 -0
  373. package/dist/senses/cli/image-paste.js +287 -0
  374. package/dist/senses/cli/image-ref-navigation.js +75 -0
  375. package/dist/senses/cli/ink-app.js +156 -0
  376. package/dist/senses/cli/inline-diff.js +64 -0
  377. package/dist/senses/cli/input-keys.js +174 -0
  378. package/dist/senses/cli/kill-ring.js +86 -0
  379. package/dist/senses/cli/message-list.js +51 -0
  380. package/dist/senses/cli/ouro-tui.js +607 -0
  381. package/dist/senses/cli/spinner-imperative.js +135 -0
  382. package/dist/senses/cli/spinner.js +101 -0
  383. package/dist/senses/cli/status-line.js +60 -0
  384. package/dist/senses/cli/streaming-markdown.js +526 -0
  385. package/dist/senses/cli/tool-display.js +85 -0
  386. package/dist/senses/cli/tool-render.js +85 -0
  387. package/dist/senses/cli/tui-store.js +240 -0
  388. package/dist/senses/cli/virtual-list.js +35 -0
  389. package/dist/senses/cli-entry.js +60 -8
  390. package/dist/senses/cli-layout.js +100 -0
  391. package/dist/senses/cli.js +521 -214
  392. package/dist/senses/commands.js +66 -3
  393. package/dist/senses/habit-turn-message.js +160 -0
  394. package/dist/senses/mail-entry.js +66 -0
  395. package/dist/senses/mail.js +395 -0
  396. package/dist/senses/pipeline.js +873 -179
  397. package/dist/senses/private-runtime-worker.js +584 -0
  398. package/dist/senses/private-runtime.js +1145 -0
  399. package/dist/senses/proactive-content-guard.js +51 -0
  400. package/dist/senses/shared-turn.js +416 -0
  401. package/dist/senses/surface-tool.js +109 -0
  402. package/dist/senses/teams-entry.js +60 -8
  403. package/dist/senses/teams.js +397 -112
  404. package/dist/senses/trust-gate.js +104 -9
  405. package/dist/senses/voice/audio-playback.js +237 -0
  406. package/dist/senses/voice/audio-routing.js +119 -0
  407. package/dist/senses/voice/elevenlabs.js +202 -0
  408. package/dist/senses/voice/floor-control.js +431 -0
  409. package/dist/senses/voice/floor-controller.js +115 -0
  410. package/dist/senses/voice/golden-path.js +116 -0
  411. package/dist/senses/voice/index.js +29 -0
  412. package/dist/senses/voice/meeting.js +113 -0
  413. package/dist/senses/voice/outbound.js +190 -0
  414. package/dist/senses/voice/phone.js +33 -0
  415. package/dist/senses/voice/playback.js +139 -0
  416. package/dist/senses/voice/realtime-eval.js +496 -0
  417. package/dist/senses/voice/realtime-trace.js +531 -0
  418. package/dist/senses/voice/transcript.js +70 -0
  419. package/dist/senses/voice/turn.js +191 -0
  420. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  421. package/dist/senses/voice/twilio-phone.js +5077 -0
  422. package/dist/senses/voice/types.js +2 -0
  423. package/dist/senses/voice/whisper.js +161 -0
  424. package/dist/senses/voice-entry.js +81 -0
  425. package/dist/senses/voice-realtime-eval-command.js +99 -0
  426. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  427. package/dist/senses/voice-twilio-entry.js +87 -0
  428. package/dist/trips/core.js +138 -0
  429. package/dist/trips/store.js +265 -0
  430. package/dist/util/frontmatter.js +69 -0
  431. package/package.json +57 -12
  432. package/skills/agent-commerce.md +113 -0
  433. package/skills/browser-navigation.md +117 -0
  434. package/skills/commerce-setup-guide.md +116 -0
  435. package/skills/commerce-setup.md +84 -0
  436. package/skills/configure-dev-tools.md +99 -0
  437. package/skills/travel-planning.md +138 -0
  438. package/dist/heart/daemon/auth-flow.js +0 -351
  439. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  440. package/dist/heart/daemon/update-hooks.js +0 -138
  441. package/dist/heart/safe-workspace.js +0 -228
  442. package/dist/heart/session-recall.js +0 -116
  443. package/dist/mind/friends/channel.js +0 -84
  444. package/dist/mind/friends/group-context.js +0 -144
  445. package/dist/mind/friends/resolver.js +0 -84
  446. package/dist/mind/friends/store-file.js +0 -190
  447. package/dist/mind/friends/store.js +0 -4
  448. package/dist/mind/friends/tokens.js +0 -26
  449. package/dist/mind/friends/trust-explanation.js +0 -74
  450. package/dist/mind/friends/types.js +0 -29
  451. package/dist/repertoire/tasks/board.js +0 -134
  452. package/dist/repertoire/tasks/index.js +0 -224
  453. package/dist/repertoire/tasks/lifecycle.js +0 -80
  454. package/dist/repertoire/tasks/middleware.js +0 -65
  455. package/dist/repertoire/tasks/parser.js +0 -173
  456. package/dist/repertoire/tasks/scanner.js +0 -132
  457. package/dist/repertoire/tasks/transitions.js +0 -144
  458. package/dist/senses/bluebubbles-entry.js +0 -13
  459. package/dist/senses/bluebubbles.js +0 -1180
  460. package/dist/senses/debug-activity.js +0 -148
  461. package/dist/senses/inner-dialog-worker.js +0 -90
  462. package/dist/senses/inner-dialog.js +0 -480
  463. package/subagents/README.md +0 -7
  464. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  465. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  466. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  467. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  468. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  469. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  470. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  471. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  472. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  473. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  474. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  475. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  476. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  477. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  478. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  479. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  480. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -1,16 +1,173 @@
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 parsedAgentName = agentArgIndex >= 0 ? process.argv[agentArgIndex + 1] : undefined;
40
+ if (!parsedAgentName) {
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");
45
+ const agentName = parsedAgentName;
11
46
  const cli_logging_1 = require("../nerves/cli-logging");
47
+ const runtime_1 = require("../nerves/runtime");
12
48
  (0, cli_logging_1.configureCliRuntimeLogger)("self");
13
- (0, inner_dialog_worker_1.startInnerDialogWorker)().catch((error) => {
49
+ const ipcStateKey = Symbol.for("ouro.agentEntry.ipcState");
50
+ const ipcState = (globalThis[ipcStateKey] ??= {
51
+ bufferedRuntimeCredentialMessages: [],
52
+ bufferedMessages: [],
53
+ installed: false,
54
+ workerMessageHandler: null,
55
+ });
56
+ ipcState.bufferedRuntimeCredentialMessages = [];
57
+ ipcState.bufferedMessages = [];
58
+ ipcState.workerMessageHandler = null;
59
+ function isRuntimeCredentialBootstrapMessage(message) {
60
+ return !!message
61
+ && typeof message === "object"
62
+ && !Array.isArray(message)
63
+ && message.type === "ouro.runtimeCredentialBootstrap";
64
+ }
65
+ function isRuntimeCredentialBootstrapForAgent(message, expectedAgentName) {
66
+ return isRuntimeCredentialBootstrapMessage(message)
67
+ && message.agentName === expectedAgentName;
68
+ }
69
+ function drainBufferedRuntimeCredentialBootstrap(applyRuntimeCredentialBootstrapMessage) {
70
+ let bootstrapped = false;
71
+ const remainingMessages = [];
72
+ for (const message of ipcState.bufferedRuntimeCredentialMessages.splice(0)) {
73
+ if (isRuntimeCredentialBootstrapForAgent(message, agentName)) {
74
+ bootstrapped = applyRuntimeCredentialBootstrapMessage(message) || bootstrapped;
75
+ }
76
+ else {
77
+ remainingMessages.push(message);
78
+ }
79
+ }
80
+ ipcState.bufferedRuntimeCredentialMessages.push(...remainingMessages);
81
+ return bootstrapped;
82
+ }
83
+ function isPrivateRuntimeWorkMessage(message) {
84
+ if (!message || typeof message !== "object" || Array.isArray(message))
85
+ return false;
86
+ const type = message.type;
87
+ return type === "heartbeat"
88
+ || type === "habit"
89
+ || type === "await"
90
+ || type === "shutdown"
91
+ || type === "poke"
92
+ || type === "chat"
93
+ || type === "message";
94
+ }
95
+ function forwardOrBufferRuntimeMessage(message) {
96
+ if (isRuntimeCredentialBootstrapMessage(message)) {
97
+ ipcState.bufferedRuntimeCredentialMessages.push(message);
98
+ return;
99
+ }
100
+ if (!isPrivateRuntimeWorkMessage(message))
101
+ return;
102
+ if (ipcState.workerMessageHandler) {
103
+ ipcState.workerMessageHandler(message);
104
+ return;
105
+ }
106
+ ipcState.bufferedMessages.push(message);
107
+ }
108
+ if (!ipcState.installed) {
109
+ process.on("message", forwardOrBufferRuntimeMessage);
110
+ /* v8 ignore next 3 -- child-process disconnect exits the live worker; default worker listener covers this behavior in process-listener tests @preserve */
111
+ process.on("disconnect", () => {
112
+ process.exit(0);
113
+ });
114
+ ipcState.installed = true;
115
+ }
116
+ (0, runtime_1.emitNervesEvent)({
117
+ component: "senses",
118
+ event: "senses.entry_boot",
119
+ message: "starting private-runtime process entrypoint",
120
+ meta: { entry: "private-runtime", agentName },
121
+ });
122
+ // Dynamic import: agent-entry is process-start wiring that starts a sense process.
123
+ // Using dynamic import avoids a static heart/ -> senses/ dependency.
124
+ Promise.resolve().then(() => __importStar(require("./runtime-credentials"))).then(async ({ readMachineRuntimeCredentialConfig, readRuntimeCredentialConfig, refreshMachineRuntimeCredentialConfig, refreshRuntimeCredentialConfig, applyRuntimeCredentialBootstrapMessage, waitForRuntimeCredentialBootstrap, }) => {
125
+ const { readProviderCredentialPool, refreshProviderCredentialPool } = await Promise.resolve().then(() => __importStar(require("./provider-credentials")));
126
+ const bootstrappedBeforeWait = drainBufferedRuntimeCredentialBootstrap(applyRuntimeCredentialBootstrapMessage);
127
+ const bootstrappedDuringWait = bootstrappedBeforeWait ? true : await waitForRuntimeCredentialBootstrap(agentName);
128
+ if (bootstrappedDuringWait) {
129
+ ipcState.bufferedRuntimeCredentialMessages = ipcState.bufferedRuntimeCredentialMessages.filter((message) => !isRuntimeCredentialBootstrapForAgent(message, agentName));
130
+ }
131
+ else {
132
+ drainBufferedRuntimeCredentialBootstrap(applyRuntimeCredentialBootstrapMessage);
133
+ }
134
+ if (!readRuntimeCredentialConfig(agentName).ok) {
135
+ void refreshRuntimeCredentialConfig(agentName, { preserveCachedOnFailure: true }).catch(() => undefined);
136
+ }
137
+ const providerPool = readProviderCredentialPool(agentName);
138
+ if (!providerPool.ok || Object.keys(providerPool.pool.providers).length === 0) {
139
+ await refreshProviderCredentialPool(agentName, { preserveCachedOnFailure: true }).catch(() => undefined);
140
+ }
141
+ /* v8 ignore next 7 -- process-start best-effort machine credential refresh runs in a child entrypoint and is covered operationally by daemon startup tests @preserve */
142
+ if (!readMachineRuntimeCredentialConfig(agentName).ok) {
143
+ void Promise.resolve().then(() => __importStar(require("./machine-identity"))).then(({ loadOrCreateMachineIdentity }) => {
144
+ const machine = loadOrCreateMachineIdentity();
145
+ return refreshMachineRuntimeCredentialConfig(agentName, machine.machineId, { preserveCachedOnFailure: true });
146
+ })
147
+ .catch(() => undefined);
148
+ }
149
+ const { startPrivateRuntimeWorker } = await Promise.resolve().then(() => __importStar(require("../senses/private-runtime-worker")));
150
+ const bufferedMessages = ipcState.bufferedMessages.splice(0);
151
+ const worker = await startPrivateRuntimeWorker({
152
+ attachProcessListeners: false,
153
+ bufferedMessages,
154
+ });
155
+ ipcState.workerMessageHandler = (message) => {
156
+ void worker.handleMessage(message);
157
+ };
158
+ const messagesBufferedDuringStart = ipcState.bufferedMessages.splice(0);
159
+ for (const message of messagesBufferedDuringStart) {
160
+ ipcState.workerMessageHandler(message);
161
+ }
162
+ })
163
+ .catch((error) => {
164
+ (0, runtime_1.emitNervesEvent)({
165
+ level: "error",
166
+ component: "senses",
167
+ event: "senses.entry_error",
168
+ message: "private-runtime entrypoint failed",
169
+ meta: { entry: "private-runtime", agentName, error: error instanceof Error ? error.message : String(error) },
170
+ });
14
171
  // eslint-disable-next-line no-console -- fatal startup guard for worker process
15
172
  console.error(error instanceof Error ? error.message : String(error));
16
173
  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
+ }