@ouro.bot/cli 0.1.0-alpha.73 → 0.1.0-alpha.731

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 (530) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -23
  3. package/RepairGuide.ouro/agent.json +5 -0
  4. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  5. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  6. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  7. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  8. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  9. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/assets/bluebubbles-host +264 -0
  14. package/changelog.json +4645 -14
  15. package/dist/a2a/card.js +57 -0
  16. package/dist/a2a/client.js +180 -0
  17. package/dist/a2a/config.js +50 -0
  18. package/dist/a2a/delegation-stores.js +56 -0
  19. package/dist/a2a/did-resolution.js +93 -0
  20. package/dist/a2a/identity.js +170 -0
  21. package/dist/a2a/inbound-share.js +107 -0
  22. package/dist/a2a/mission-result-wire.js +196 -0
  23. package/dist/a2a/onboarding.js +115 -0
  24. package/dist/a2a/pin-store.js +132 -0
  25. package/dist/a2a/seen-ledger.js +120 -0
  26. package/dist/a2a/server.js +604 -0
  27. package/dist/a2a/task-store.js +69 -0
  28. package/dist/a2a/transport.js +45 -0
  29. package/dist/a2a/types.js +3 -0
  30. package/dist/arc/attention-types.js +8 -0
  31. package/dist/arc/cares.js +144 -0
  32. package/dist/arc/episodes.js +118 -0
  33. package/dist/arc/evolution.js +490 -0
  34. package/dist/arc/flight-recorder.js +1034 -0
  35. package/dist/arc/intentions.js +134 -0
  36. package/dist/arc/json-store.js +117 -0
  37. package/dist/arc/obligations.js +348 -0
  38. package/dist/arc/packets.js +336 -0
  39. package/dist/arc/presence.js +185 -0
  40. package/dist/arc/task-lifecycle.js +57 -0
  41. package/dist/commerce/store.js +755 -0
  42. package/dist/commerce/types.js +3 -0
  43. package/dist/heart/active-work.js +874 -43
  44. package/dist/heart/agent-entry.js +190 -3
  45. package/dist/heart/approval-store.js +791 -0
  46. package/dist/heart/attachments/image-normalize.js +194 -0
  47. package/dist/heart/attachments/materialize.js +97 -0
  48. package/dist/heart/attachments/originals.js +88 -0
  49. package/dist/heart/attachments/render.js +29 -0
  50. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  51. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  52. package/dist/heart/attachments/sources/index.js +16 -0
  53. package/dist/heart/attachments/store.js +103 -0
  54. package/dist/heart/attachments/types.js +93 -0
  55. package/dist/heart/auth/auth-flow.js +479 -0
  56. package/dist/heart/autonomy-budget.js +434 -0
  57. package/dist/heart/awaiting/await-alert.js +146 -0
  58. package/dist/heart/awaiting/await-expiry.js +108 -0
  59. package/dist/heart/awaiting/await-loader.js +91 -0
  60. package/dist/heart/awaiting/await-parser.js +141 -0
  61. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  62. package/dist/heart/awaiting/await-scheduler.js +378 -0
  63. package/dist/heart/background-operations.js +281 -0
  64. package/dist/heart/bridges/manager.js +137 -17
  65. package/dist/heart/bridges/store.js +14 -2
  66. package/dist/heart/bundle-state.js +168 -0
  67. package/dist/heart/commitments.js +135 -0
  68. package/dist/heart/config-registry.js +331 -0
  69. package/dist/heart/config.js +120 -129
  70. package/dist/heart/context-loss-gauntlet.js +354 -0
  71. package/dist/heart/context-loss-sentinel.js +1155 -0
  72. package/dist/heart/core.js +1763 -320
  73. package/dist/heart/cross-chat-delivery.js +8 -22
  74. package/dist/heart/daemon/agent-config-check.js +451 -0
  75. package/dist/heart/daemon/agent-discovery.js +185 -3
  76. package/dist/heart/daemon/agent-service.js +542 -0
  77. package/dist/heart/daemon/agentic-repair.js +547 -0
  78. package/dist/heart/daemon/await-private-wake.js +59 -0
  79. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  80. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  81. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  82. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  83. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  84. package/dist/heart/daemon/cadence.js +180 -0
  85. package/dist/heart/daemon/cli-defaults.js +832 -0
  86. package/dist/heart/daemon/cli-desk.js +322 -0
  87. package/dist/heart/daemon/cli-exec.js +8620 -0
  88. package/dist/heart/daemon/cli-help.js +705 -0
  89. package/dist/heart/daemon/cli-parse.js +2712 -0
  90. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  91. package/dist/heart/daemon/cli-render.js +777 -0
  92. package/dist/heart/daemon/cli-types.js +8 -0
  93. package/dist/heart/daemon/connect-bay.js +323 -0
  94. package/dist/heart/daemon/daemon-cli.js +29 -2093
  95. package/dist/heart/daemon/daemon-entry.js +842 -10
  96. package/dist/heart/daemon/daemon-health.js +176 -0
  97. package/dist/heart/daemon/daemon-rollup.js +57 -0
  98. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  99. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  100. package/dist/heart/daemon/daemon.js +1610 -87
  101. package/dist/heart/daemon/dns-workflow.js +394 -0
  102. package/dist/heart/daemon/doctor-types.js +8 -0
  103. package/dist/heart/daemon/doctor.js +1689 -0
  104. package/dist/heart/daemon/freshness.js +345 -0
  105. package/dist/heart/daemon/habit-private-wake.js +61 -0
  106. package/dist/heart/daemon/health-monitor.js +142 -11
  107. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  108. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  109. package/dist/heart/daemon/http-health-probe.js +80 -0
  110. package/dist/heart/daemon/human-command-screens.js +234 -0
  111. package/dist/heart/daemon/human-readiness.js +114 -0
  112. package/dist/heart/daemon/inner-status.js +78 -0
  113. package/dist/heart/daemon/interactive-repair.js +394 -0
  114. package/dist/heart/daemon/launchd.js +37 -8
  115. package/dist/heart/daemon/log-tailer.js +79 -10
  116. package/dist/heart/daemon/logs-prune.js +132 -0
  117. package/dist/heart/daemon/mcp-canary.js +524 -0
  118. package/dist/heart/daemon/message-router.js +45 -5
  119. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  120. package/dist/heart/daemon/os-cron-deps.js +135 -0
  121. package/dist/heart/daemon/os-cron.js +22 -14
  122. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  123. package/dist/heart/daemon/ouro-entry.js +3 -1
  124. package/dist/heart/daemon/plugin-cli.js +432 -0
  125. package/dist/heart/daemon/process-manager.js +624 -61
  126. package/dist/heart/daemon/provider-discovery.js +137 -0
  127. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  128. package/dist/heart/daemon/prunable-bundle.js +144 -0
  129. package/dist/heart/daemon/pulse.js +511 -0
  130. package/dist/heart/daemon/readiness-repair.js +365 -0
  131. package/dist/heart/daemon/run-hooks.js +2 -0
  132. package/dist/heart/daemon/runtime-logging.js +41 -14
  133. package/dist/heart/daemon/runtime-metadata.js +2 -30
  134. package/dist/heart/daemon/safe-mode.js +161 -0
  135. package/dist/heart/daemon/sense-manager.js +670 -48
  136. package/dist/heart/daemon/session-id-resolver.js +131 -0
  137. package/dist/heart/daemon/skill-management-installer.js +1 -1
  138. package/dist/heart/daemon/socket-client.js +180 -12
  139. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  140. package/dist/heart/daemon/startup-tui.js +338 -0
  141. package/dist/heart/daemon/task-scheduler.js +117 -39
  142. package/dist/heart/daemon/terminal-ui.js +499 -0
  143. package/dist/heart/daemon/thoughts.js +255 -43
  144. package/dist/heart/daemon/up-progress.js +366 -0
  145. package/dist/heart/daemon/vault-items.js +56 -0
  146. package/dist/heart/delegation.js +1 -4
  147. package/dist/heart/external-events/router.js +121 -0
  148. package/dist/heart/habits/habit-cancel.js +810 -0
  149. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  150. package/dist/heart/habits/habit-migration.js +194 -0
  151. package/dist/heart/habits/habit-parser.js +278 -0
  152. package/dist/heart/habits/habit-runtime-state.js +93 -0
  153. package/dist/heart/habits/habit-scheduler.js +649 -0
  154. package/dist/heart/habits/habit-session-summary.js +318 -0
  155. package/dist/heart/habits/habit-session.js +636 -0
  156. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  157. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  158. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  159. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  160. package/dist/heart/identity.js +174 -59
  161. package/dist/heart/kept-notes.js +289 -0
  162. package/dist/heart/kicks.js +1 -1
  163. package/dist/heart/machine-identity.js +161 -0
  164. package/dist/heart/mail-import-discovery.js +353 -0
  165. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  166. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  167. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  168. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  169. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  170. package/dist/heart/mailbox/mailbox-http.js +99 -0
  171. package/dist/heart/mailbox/mailbox-read.js +39 -0
  172. package/dist/heart/mailbox/mailbox-types.js +27 -0
  173. package/dist/heart/mailbox/mailbox-view.js +197 -0
  174. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  175. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  176. package/dist/heart/mailbox/readers/mail.js +375 -0
  177. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  178. package/dist/heart/mailbox/readers/sessions.js +232 -0
  179. package/dist/heart/mailbox/readers/shared.js +111 -0
  180. package/dist/heart/mcp/mcp-server.js +696 -0
  181. package/dist/heart/migrate-config.js +100 -0
  182. package/dist/heart/model-capabilities.js +11 -0
  183. package/dist/heart/orientation-frame.js +345 -0
  184. package/dist/heart/platform.js +81 -0
  185. package/dist/heart/primitives.js +1 -1
  186. package/dist/heart/private-runtime/decision-renderer.js +156 -0
  187. package/dist/heart/private-runtime/index.js +18 -0
  188. package/dist/heart/private-runtime/ledger.js +218 -0
  189. package/dist/heart/private-runtime/policy.js +214 -0
  190. package/dist/heart/private-runtime/types.js +2 -0
  191. package/dist/heart/progress-story.js +1 -1
  192. package/dist/heart/provider-attempt.js +137 -0
  193. package/dist/heart/provider-binding-resolver.js +273 -0
  194. package/dist/heart/provider-credentials.js +441 -0
  195. package/dist/heart/provider-failover.js +311 -0
  196. package/dist/heart/provider-models.js +81 -0
  197. package/dist/heart/provider-ping.js +262 -0
  198. package/dist/heart/provider-readiness-cache.js +119 -0
  199. package/dist/heart/provider-visibility.js +188 -0
  200. package/dist/heart/providers/anthropic-token.js +131 -0
  201. package/dist/heart/providers/anthropic.js +173 -60
  202. package/dist/heart/providers/azure.js +23 -11
  203. package/dist/heart/providers/error-classification.js +127 -0
  204. package/dist/heart/providers/github-copilot.js +34 -38
  205. package/dist/heart/providers/minimax-vlm.js +189 -0
  206. package/dist/heart/providers/minimax.js +26 -8
  207. package/dist/heart/providers/openai-codex-token.js +349 -0
  208. package/dist/heart/providers/openai-codex.js +55 -40
  209. package/dist/heart/run-ledger.js +247 -0
  210. package/dist/heart/runtime-capability-check.js +170 -0
  211. package/dist/heart/runtime-credentials.js +398 -0
  212. package/dist/heart/runtime-cwd.js +87 -0
  213. package/dist/heart/sense-truth.js +20 -4
  214. package/dist/heart/session-activity.js +90 -24
  215. package/dist/heart/session-events.js +1300 -0
  216. package/dist/heart/session-playback-cli-main.js +5 -0
  217. package/dist/heart/session-playback-cli.js +36 -0
  218. package/dist/heart/session-playback.js +231 -0
  219. package/dist/heart/session-stats-cli-main.js +5 -0
  220. package/dist/heart/session-stats.js +182 -0
  221. package/dist/heart/session-transcript.js +133 -0
  222. package/dist/heart/start-of-turn-packet.js +368 -0
  223. package/dist/heart/streaming.js +604 -207
  224. package/dist/heart/structured-output.js +196 -0
  225. package/dist/heart/sync-classification.js +176 -0
  226. package/dist/heart/sync.js +449 -0
  227. package/dist/heart/target-resolution.js +11 -7
  228. package/dist/heart/tempo.js +93 -0
  229. package/dist/heart/temporal-view.js +41 -0
  230. package/dist/heart/timeouts.js +101 -0
  231. package/dist/heart/tool-activity-callbacks.js +59 -0
  232. package/dist/heart/tool-approval.js +339 -0
  233. package/dist/heart/tool-description.js +155 -0
  234. package/dist/heart/tool-friction.js +55 -0
  235. package/dist/heart/tool-loop.js +200 -0
  236. package/dist/heart/turn-context.js +472 -0
  237. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  238. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  239. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  240. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  241. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  242. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  243. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  244. package/dist/heart/versioning/update-hooks.js +154 -0
  245. package/dist/heart/versioning/version-intent.js +114 -0
  246. package/dist/heart/work-card.js +380 -0
  247. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  248. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  249. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  250. package/dist/mailbox-ui/index.html +16 -0
  251. package/dist/mailroom/attention.js +167 -0
  252. package/dist/mailroom/autonomy.js +209 -0
  253. package/dist/mailroom/blob-store.js +811 -0
  254. package/dist/mailroom/body-cache.js +61 -0
  255. package/dist/mailroom/cache-sync-cli.js +54 -0
  256. package/dist/mailroom/core.js +788 -0
  257. package/dist/mailroom/entry.js +160 -0
  258. package/dist/mailroom/file-store.js +568 -0
  259. package/dist/mailroom/hosted-cache-sync.js +249 -0
  260. package/dist/mailroom/mbox-import.js +393 -0
  261. package/dist/mailroom/migration.js +164 -0
  262. package/dist/mailroom/outbound.js +380 -0
  263. package/dist/mailroom/policy.js +263 -0
  264. package/dist/mailroom/reader.js +292 -0
  265. package/dist/mailroom/search-cache.js +404 -0
  266. package/dist/mailroom/search-relevance.js +319 -0
  267. package/dist/mailroom/smtp-ingress.js +176 -0
  268. package/dist/mailroom/source-state.js +176 -0
  269. package/dist/mailroom/thread.js +109 -0
  270. package/dist/mailroom/travel-extract.js +89 -0
  271. package/dist/mind/bundle-manifest.js +24 -2
  272. package/dist/mind/context.js +273 -111
  273. package/dist/mind/desk-section.js +362 -0
  274. package/dist/mind/diary-integrity.js +60 -0
  275. package/dist/mind/{memory.js → diary.js} +68 -77
  276. package/dist/mind/embedding-provider.js +60 -0
  277. package/dist/mind/file-state.js +179 -0
  278. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  279. package/dist/mind/obligation-steering.js +227 -0
  280. package/dist/mind/pending.js +13 -8
  281. package/dist/mind/prompt-budget.js +479 -0
  282. package/dist/mind/prompt-refresh.js +3 -2
  283. package/dist/mind/prompt.js +1058 -172
  284. package/dist/mind/provenance-trust.js +26 -0
  285. package/dist/mind/record-paths.js +312 -0
  286. package/dist/mind/scrutiny.js +173 -0
  287. package/dist/mind/session-transaction.js +379 -0
  288. package/dist/nerves/cli-logging.js +7 -1
  289. package/dist/nerves/coverage/audit-rules.js +15 -6
  290. package/dist/nerves/coverage/audit.js +28 -2
  291. package/dist/nerves/coverage/cli.js +1 -1
  292. package/dist/nerves/coverage/contract.js +5 -5
  293. package/dist/nerves/coverage/file-completeness.js +139 -5
  294. package/dist/nerves/coverage/run-artifacts.js +55 -35
  295. package/dist/nerves/event-buffer.js +111 -0
  296. package/dist/nerves/index.js +234 -4
  297. package/dist/nerves/observation.js +20 -0
  298. package/dist/nerves/redact.js +79 -0
  299. package/dist/nerves/review/cli-main.js +5 -0
  300. package/dist/nerves/review/cli.js +156 -0
  301. package/dist/nerves/review/core.js +159 -0
  302. package/dist/nerves/runtime.js +5 -1
  303. package/dist/repertoire/ado-client.js +15 -56
  304. package/dist/repertoire/ado-semantic.js +16 -10
  305. package/dist/repertoire/api-client.js +97 -0
  306. package/dist/repertoire/bitwarden-store.js +1045 -0
  307. package/dist/repertoire/bundle-templates.js +71 -0
  308. package/dist/repertoire/bw-installer.js +180 -0
  309. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  310. package/dist/repertoire/coding/context-pack.js +331 -0
  311. package/dist/repertoire/coding/feedback.js +218 -30
  312. package/dist/repertoire/coding/index.js +15 -3
  313. package/dist/repertoire/coding/manager.js +166 -10
  314. package/dist/repertoire/coding/spawner.js +58 -11
  315. package/dist/repertoire/coding/tools.js +242 -14
  316. package/dist/repertoire/coding/workbench-client.js +272 -0
  317. package/dist/repertoire/coding/workbench-manager.js +346 -0
  318. package/dist/repertoire/commerce-errors.js +109 -0
  319. package/dist/repertoire/commerce-self-test.js +156 -0
  320. package/dist/repertoire/credential-access.js +178 -0
  321. package/dist/repertoire/desk/classifier.js +362 -0
  322. package/dist/repertoire/duffel-client.js +185 -0
  323. package/dist/repertoire/github-client.js +14 -55
  324. package/dist/repertoire/graph-client.js +11 -52
  325. package/dist/repertoire/guardrails.js +812 -18
  326. package/dist/repertoire/mcp-client.js +44 -3
  327. package/dist/repertoire/mcp-manager.js +259 -20
  328. package/dist/repertoire/mcp-tools.js +83 -0
  329. package/dist/repertoire/plugin-mcp.js +175 -0
  330. package/dist/repertoire/plugins.js +253 -0
  331. package/dist/repertoire/shell-sessions.js +133 -0
  332. package/dist/repertoire/skills.js +48 -4
  333. package/dist/repertoire/stripe-client.js +131 -0
  334. package/dist/repertoire/tool-arguments.js +104 -0
  335. package/dist/repertoire/tool-results.js +29 -0
  336. package/dist/repertoire/tools-a2a.js +699 -0
  337. package/dist/repertoire/tools-attachments.js +317 -0
  338. package/dist/repertoire/tools-awaiting.js +372 -0
  339. package/dist/repertoire/tools-base.js +67 -1095
  340. package/dist/repertoire/tools-bluebubbles.js +2 -0
  341. package/dist/repertoire/tools-bridge.js +144 -0
  342. package/dist/repertoire/tools-bundle.js +993 -0
  343. package/dist/repertoire/tools-commerce.js +253 -0
  344. package/dist/repertoire/tools-config.js +186 -0
  345. package/dist/repertoire/tools-continuity.js +252 -0
  346. package/dist/repertoire/tools-credential.js +383 -0
  347. package/dist/repertoire/tools-evolution.js +527 -0
  348. package/dist/repertoire/tools-files.js +344 -0
  349. package/dist/repertoire/tools-flight.js +290 -0
  350. package/dist/repertoire/tools-flow.js +119 -0
  351. package/dist/repertoire/tools-github.js +3 -8
  352. package/dist/repertoire/tools-habits.js +103 -0
  353. package/dist/repertoire/tools-mail.js +1828 -0
  354. package/dist/repertoire/tools-notes.js +459 -0
  355. package/dist/repertoire/tools-obligations.js +182 -0
  356. package/dist/repertoire/tools-orientation.js +31 -0
  357. package/dist/repertoire/tools-record.js +482 -0
  358. package/dist/repertoire/tools-rsvp.js +139 -0
  359. package/dist/repertoire/tools-runtime.js +150 -0
  360. package/dist/repertoire/tools-session.js +881 -0
  361. package/dist/repertoire/tools-shell.js +133 -0
  362. package/dist/repertoire/tools-stripe.js +224 -0
  363. package/dist/repertoire/tools-surface.js +355 -0
  364. package/dist/repertoire/tools-teams.js +12 -39
  365. package/dist/repertoire/tools-travel.js +125 -0
  366. package/dist/repertoire/tools-trip.js +982 -0
  367. package/dist/repertoire/tools-user-profile.js +146 -0
  368. package/dist/repertoire/tools-vault.js +40 -0
  369. package/dist/repertoire/tools-voice.js +145 -0
  370. package/dist/repertoire/tools.js +258 -79
  371. package/dist/repertoire/travel-api-client.js +360 -0
  372. package/dist/repertoire/user-profile.js +131 -0
  373. package/dist/repertoire/vault-setup.js +246 -0
  374. package/dist/repertoire/vault-unlock.js +594 -0
  375. package/dist/rsvp/aisleplanner-client.js +354 -0
  376. package/dist/rsvp/cli.js +926 -0
  377. package/dist/rsvp/config.js +327 -0
  378. package/dist/rsvp/cutover.js +433 -0
  379. package/dist/rsvp/diagnostics.js +232 -0
  380. package/dist/rsvp/diff-renderer.js +176 -0
  381. package/dist/rsvp/habit-policy.js +110 -0
  382. package/dist/rsvp/habit-stage.js +123 -0
  383. package/dist/rsvp/incident-bundle.js +97 -0
  384. package/dist/rsvp/migration.js +204 -0
  385. package/dist/rsvp/native-habit-runner.js +630 -0
  386. package/dist/rsvp/outbound-state.js +628 -0
  387. package/dist/rsvp/query.js +118 -0
  388. package/dist/rsvp/replay.js +233 -0
  389. package/dist/rsvp/snapshot.js +232 -0
  390. package/dist/rsvp/spend-ledger.js +175 -0
  391. package/dist/scripts/claude-code-hook.js +41 -0
  392. package/dist/scripts/claude-code-stop-hook.js +47 -0
  393. package/dist/senses/a2a-entry.js +115 -0
  394. package/dist/senses/attention-queue.js +186 -0
  395. package/dist/senses/await-turn-message.js +58 -0
  396. package/dist/senses/bluebubbles/active-turns.js +216 -0
  397. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  398. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  399. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +355 -40
  400. package/dist/senses/bluebubbles/context-packet.js +207 -0
  401. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  402. package/dist/senses/bluebubbles/entry.js +90 -0
  403. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  404. package/dist/senses/bluebubbles/index.js +3839 -0
  405. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  406. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  407. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  408. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  409. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  410. package/dist/senses/bluebubbles/processed-log.js +133 -0
  411. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  412. package/dist/senses/bluebubbles/replay.js +284 -0
  413. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  414. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  415. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  416. package/dist/senses/bluebubbles/webhook-registration.js +228 -0
  417. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  418. package/dist/senses/cli/bracketed-paste.js +82 -0
  419. package/dist/senses/cli/image-paste.js +287 -0
  420. package/dist/senses/cli/image-ref-navigation.js +75 -0
  421. package/dist/senses/cli/ink-app.js +156 -0
  422. package/dist/senses/cli/inline-diff.js +64 -0
  423. package/dist/senses/cli/input-keys.js +174 -0
  424. package/dist/senses/cli/kill-ring.js +86 -0
  425. package/dist/senses/cli/message-list.js +51 -0
  426. package/dist/senses/cli/ouro-tui.js +607 -0
  427. package/dist/senses/cli/spinner-imperative.js +135 -0
  428. package/dist/senses/cli/spinner.js +101 -0
  429. package/dist/senses/cli/status-line.js +60 -0
  430. package/dist/senses/cli/streaming-markdown.js +526 -0
  431. package/dist/senses/cli/tool-display.js +85 -0
  432. package/dist/senses/cli/tool-render.js +85 -0
  433. package/dist/senses/cli/tui-store.js +241 -0
  434. package/dist/senses/cli/virtual-list.js +35 -0
  435. package/dist/senses/cli-entry.js +60 -8
  436. package/dist/senses/cli-layout.js +100 -0
  437. package/dist/senses/cli.js +640 -312
  438. package/dist/senses/commands.js +66 -3
  439. package/dist/senses/context-packet-ledger.js +371 -0
  440. package/dist/senses/context-packets.js +154 -0
  441. package/dist/senses/habit-lifecycle-guard.js +24 -0
  442. package/dist/senses/habit-turn-message.js +160 -0
  443. package/dist/senses/ingress-evidence.js +2 -0
  444. package/dist/senses/mail-entry.js +66 -0
  445. package/dist/senses/mail.js +524 -0
  446. package/dist/senses/pipeline.js +1075 -176
  447. package/dist/senses/private-runtime-worker.js +740 -0
  448. package/dist/senses/private-runtime.js +1212 -0
  449. package/dist/senses/proactive-content-guard.js +51 -0
  450. package/dist/senses/shared-turn.js +424 -0
  451. package/dist/senses/surface-tool.js +109 -0
  452. package/dist/senses/teams-entry.js +60 -8
  453. package/dist/senses/teams.js +515 -217
  454. package/dist/senses/trust-gate.js +104 -9
  455. package/dist/senses/voice/audio-playback.js +237 -0
  456. package/dist/senses/voice/audio-routing.js +119 -0
  457. package/dist/senses/voice/elevenlabs.js +202 -0
  458. package/dist/senses/voice/floor-control.js +431 -0
  459. package/dist/senses/voice/floor-controller.js +115 -0
  460. package/dist/senses/voice/golden-path.js +116 -0
  461. package/dist/senses/voice/index.js +29 -0
  462. package/dist/senses/voice/meeting.js +113 -0
  463. package/dist/senses/voice/outbound.js +190 -0
  464. package/dist/senses/voice/phone.js +33 -0
  465. package/dist/senses/voice/playback.js +139 -0
  466. package/dist/senses/voice/realtime-eval.js +496 -0
  467. package/dist/senses/voice/realtime-trace.js +531 -0
  468. package/dist/senses/voice/transcript.js +70 -0
  469. package/dist/senses/voice/turn.js +191 -0
  470. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  471. package/dist/senses/voice/twilio-phone.js +5081 -0
  472. package/dist/senses/voice/types.js +2 -0
  473. package/dist/senses/voice/whisper.js +161 -0
  474. package/dist/senses/voice-entry.js +81 -0
  475. package/dist/senses/voice-realtime-eval-command.js +99 -0
  476. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  477. package/dist/senses/voice-twilio-entry.js +87 -0
  478. package/dist/trips/core.js +138 -0
  479. package/dist/trips/store.js +265 -0
  480. package/dist/util/frontmatter.js +69 -0
  481. package/package.json +65 -12
  482. package/skills/agent-commerce.md +113 -0
  483. package/skills/browser-navigation.md +117 -0
  484. package/skills/commerce-setup-guide.md +116 -0
  485. package/skills/commerce-setup.md +84 -0
  486. package/skills/configure-dev-tools.md +99 -0
  487. package/skills/travel-planning.md +138 -0
  488. package/dist/heart/daemon/auth-flow.js +0 -430
  489. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  490. package/dist/heart/daemon/update-hooks.js +0 -138
  491. package/dist/heart/safe-workspace.js +0 -228
  492. package/dist/heart/session-recall.js +0 -116
  493. package/dist/mind/friends/channel.js +0 -84
  494. package/dist/mind/friends/group-context.js +0 -144
  495. package/dist/mind/friends/resolver.js +0 -84
  496. package/dist/mind/friends/store-file.js +0 -190
  497. package/dist/mind/friends/store.js +0 -4
  498. package/dist/mind/friends/tokens.js +0 -26
  499. package/dist/mind/friends/trust-explanation.js +0 -74
  500. package/dist/mind/friends/types.js +0 -29
  501. package/dist/repertoire/tasks/board.js +0 -134
  502. package/dist/repertoire/tasks/index.js +0 -224
  503. package/dist/repertoire/tasks/lifecycle.js +0 -80
  504. package/dist/repertoire/tasks/middleware.js +0 -65
  505. package/dist/repertoire/tasks/parser.js +0 -173
  506. package/dist/repertoire/tasks/scanner.js +0 -132
  507. package/dist/repertoire/tasks/transitions.js +0 -144
  508. package/dist/senses/bluebubbles-entry.js +0 -13
  509. package/dist/senses/bluebubbles.js +0 -1180
  510. package/dist/senses/debug-activity.js +0 -148
  511. package/dist/senses/inner-dialog-worker.js +0 -90
  512. package/dist/senses/inner-dialog.js +0 -480
  513. package/subagents/README.md +0 -7
  514. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  515. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  516. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  517. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  518. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  519. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  520. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  521. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  522. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  523. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  524. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  525. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  526. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  527. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  528. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  529. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  530. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,164 @@
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.migrateLocalMailroomToPlaintext = migrateLocalMailroomToPlaintext;
37
+ const fs = __importStar(require("node:fs"));
38
+ const path = __importStar(require("node:path"));
39
+ const runtime_1 = require("../nerves/runtime");
40
+ function readJson(filePath) {
41
+ try {
42
+ return JSON.parse(fs.readFileSync(filePath, "utf-8"));
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ }
48
+ function listJsonEntries(dir) {
49
+ if (!fs.existsSync(dir))
50
+ return [];
51
+ return fs.readdirSync(dir).filter((name) => name.endsWith(".json"));
52
+ }
53
+ /**
54
+ * One-time, idempotent cleanup of pre-plaintext residue.
55
+ *
56
+ * Wipes:
57
+ * - `messages/*.json` for this agent that are not already in the new plaintext
58
+ * shape (no `bodyForm: "plaintext"` AND no `private` field). Unparseable JSON
59
+ * also goes — we cannot safely keep ambiguous bytes.
60
+ * - `raw/*.json` files that look like an `EncryptedPayload` JSON wrapper (the
61
+ * pre-change raw-storage shape). Plaintext `.eml` files are preserved.
62
+ * Non-EncryptedPayload JSON in `raw/` is left alone.
63
+ * - Coverage records in `searchCacheRoot/coverage/` whose `storeKind` is no
64
+ * longer reachable (`azure-blob` from a previous hosted attachment) or whose
65
+ * JSON is unreadable. `file` coverage records are preserved.
66
+ * - Orphan search-cache docs in `searchCacheRoot/*.json` that belong to this
67
+ * agent but reference a `messageId` no longer present in `messages/`.
68
+ *
69
+ * Idempotent: a second run finds nothing to wipe and returns zeroed counts.
70
+ */
71
+ function migrateLocalMailroomToPlaintext(input) {
72
+ const messagesDir = path.join(input.mailroomRoot, "messages");
73
+ const rawDir = path.join(input.mailroomRoot, "raw");
74
+ const coverageDir = path.join(input.searchCacheRoot, "coverage");
75
+ let wipedEnvelopes = 0;
76
+ let wipedRaw = 0;
77
+ let wipedCoverageRecords = 0;
78
+ let wipedOrphanSearchDocs = 0;
79
+ // 1. Messages: drop pre-plaintext or malformed shapes for this agent.
80
+ const surviving = new Set();
81
+ for (const entry of listJsonEntries(messagesDir)) {
82
+ const filePath = path.join(messagesDir, entry);
83
+ const value = readJson(filePath);
84
+ if (value === null) {
85
+ // Unparseable JSON — we cannot tell whose it is or what shape, but the
86
+ // pre-change codebase wrote message JSON here; treat as wipeable.
87
+ fs.unlinkSync(filePath);
88
+ wipedEnvelopes += 1;
89
+ continue;
90
+ }
91
+ const isCurrentShape = value.bodyForm === "plaintext" && value.private !== undefined && value.private !== null;
92
+ if (isCurrentShape) {
93
+ const stem = entry.slice(0, -".json".length);
94
+ surviving.add(stem);
95
+ continue;
96
+ }
97
+ // We don't restrict to a specific agentId here because the file store is
98
+ // single-agent: the bundle owns this directory and the migration is
99
+ // initiated from inside that bundle.
100
+ fs.unlinkSync(filePath);
101
+ wipedEnvelopes += 1;
102
+ }
103
+ // 2. Raw artifacts: drop pre-change encrypted JSON wrappers.
104
+ if (fs.existsSync(rawDir)) {
105
+ for (const entry of fs.readdirSync(rawDir)) {
106
+ if (!entry.endsWith(".json"))
107
+ continue;
108
+ const filePath = path.join(rawDir, entry);
109
+ const value = readJson(filePath);
110
+ const isEncryptedPayload = value !== null
111
+ && typeof value.algorithm === "string"
112
+ && value.algorithm.startsWith("RSA-OAEP")
113
+ && typeof value.ciphertext === "string";
114
+ if (!isEncryptedPayload)
115
+ continue;
116
+ fs.unlinkSync(filePath);
117
+ wipedRaw += 1;
118
+ }
119
+ }
120
+ // 3. Coverage records: drop azure-blob (no longer reachable) and malformed.
121
+ for (const entry of listJsonEntries(coverageDir)) {
122
+ const filePath = path.join(coverageDir, entry);
123
+ const value = readJson(filePath);
124
+ if (value === null) {
125
+ fs.unlinkSync(filePath);
126
+ wipedCoverageRecords += 1;
127
+ continue;
128
+ }
129
+ if (value.agentId !== input.agentId)
130
+ continue;
131
+ if (value.storeKind === "file")
132
+ continue;
133
+ fs.unlinkSync(filePath);
134
+ wipedCoverageRecords += 1;
135
+ }
136
+ // 4. Orphan search-cache docs.
137
+ for (const entry of listJsonEntries(input.searchCacheRoot)) {
138
+ const filePath = path.join(input.searchCacheRoot, entry);
139
+ const value = readJson(filePath);
140
+ if (value === null)
141
+ continue;
142
+ if (value.agentId !== input.agentId)
143
+ continue;
144
+ if (typeof value.messageId !== "string")
145
+ continue;
146
+ if (surviving.has(value.messageId))
147
+ continue;
148
+ fs.unlinkSync(filePath);
149
+ wipedOrphanSearchDocs += 1;
150
+ }
151
+ (0, runtime_1.emitNervesEvent)({
152
+ component: "senses",
153
+ event: "senses.mail_local_migration_executed",
154
+ message: "local mailroom plaintext migration executed",
155
+ meta: {
156
+ agentId: input.agentId,
157
+ wipedEnvelopes,
158
+ wipedRaw,
159
+ wipedCoverageRecords,
160
+ wipedOrphanSearchDocs,
161
+ },
162
+ });
163
+ return { wipedEnvelopes, wipedRaw, wipedCoverageRecords, wipedOrphanSearchDocs };
164
+ }
@@ -0,0 +1,380 @@
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.parseAcsEmailDeliveryReportEvent = void 0;
37
+ exports.createAcsEmailProviderClient = createAcsEmailProviderClient;
38
+ exports.resolveOutboundProviderClient = resolveOutboundProviderClient;
39
+ exports.resolveOutboundTransport = resolveOutboundTransport;
40
+ exports.createMailDraft = createMailDraft;
41
+ exports.confirmMailDraftSend = confirmMailDraftSend;
42
+ exports.listMailOutboundRecords = listMailOutboundRecords;
43
+ exports.reconcileOutboundDeliveryEvent = reconcileOutboundDeliveryEvent;
44
+ const crypto = __importStar(require("node:crypto"));
45
+ const fs = __importStar(require("node:fs"));
46
+ const path = __importStar(require("node:path"));
47
+ const runtime_1 = require("../nerves/runtime");
48
+ const autonomy_1 = require("./autonomy");
49
+ const core_1 = require("./core");
50
+ Object.defineProperty(exports, "parseAcsEmailDeliveryReportEvent", { enumerable: true, get: function () { return core_1.parseAcsEmailDeliveryReportEvent; } });
51
+ function isRecord(value) {
52
+ return !!value && typeof value === "object" && !Array.isArray(value);
53
+ }
54
+ function textField(value, key) {
55
+ const raw = value[key];
56
+ return typeof raw === "string" ? raw.trim() : "";
57
+ }
58
+ function credentialFields(value) {
59
+ if (!isRecord(value))
60
+ return undefined;
61
+ const accessKey = textField(value, "accessKey");
62
+ const connectionString = textField(value, "connectionString");
63
+ const fields = {
64
+ ...(accessKey ? { accessKey } : {}),
65
+ ...(connectionString ? { connectionString } : {}),
66
+ };
67
+ return Object.keys(fields).length > 0 ? fields : undefined;
68
+ }
69
+ function normalizeList(values) {
70
+ return values
71
+ .map((value) => value.trim())
72
+ .filter(Boolean)
73
+ .map(core_1.normalizeMailAddress);
74
+ }
75
+ function contentHash(body) {
76
+ return crypto.createHash("sha256").update(body, "utf-8").digest("base64");
77
+ }
78
+ function hmacSignature(input) {
79
+ const stringToSign = `${input.method}\n${input.pathAndQuery}\n${input.date};${input.host};${input.contentHash}`;
80
+ return crypto.createHmac("sha256", Buffer.from(input.accessKey, "base64")).update(stringToSign, "utf-8").digest("base64");
81
+ }
82
+ function recipientObjects(addresses) {
83
+ return addresses.map((address) => ({ address }));
84
+ }
85
+ function providerMessageIdFromOperationLocation(operationLocation) {
86
+ const match = operationLocation.match(/\/operations\/([^?/#]+)/);
87
+ return match?.[1] ?? "";
88
+ }
89
+ function createAcsEmailProviderClient(input) {
90
+ const endpoint = input.endpoint.replace(/\/+$/, "");
91
+ const fetchImpl = input.fetch ?? fetch;
92
+ return {
93
+ async submit(submitInput) {
94
+ const url = new URL(`${endpoint}/emails:send?api-version=2025-09-01`);
95
+ const senderAddress = submitInput.transport.senderAddress ?? submitInput.draft.from;
96
+ const body = JSON.stringify({
97
+ senderAddress,
98
+ recipients: {
99
+ to: recipientObjects(submitInput.draft.to),
100
+ cc: recipientObjects(submitInput.draft.cc),
101
+ bcc: recipientObjects(submitInput.draft.bcc),
102
+ },
103
+ content: {
104
+ subject: submitInput.draft.subject,
105
+ plainText: submitInput.draft.text,
106
+ },
107
+ });
108
+ const date = (input.now ?? (() => new Date()))().toUTCString();
109
+ const hash = contentHash(body);
110
+ const signature = hmacSignature({
111
+ method: "POST",
112
+ pathAndQuery: `${url.pathname}${url.search}`,
113
+ date,
114
+ host: url.host,
115
+ contentHash: hash,
116
+ accessKey: input.accessKey,
117
+ });
118
+ const response = await fetchImpl(url.toString(), {
119
+ method: "POST",
120
+ headers: {
121
+ "content-type": "application/json",
122
+ "x-ms-date": date,
123
+ "x-ms-content-sha256": hash,
124
+ authorization: `HMAC-SHA256 SignedHeaders=x-ms-date;host;x-ms-content-sha256&Signature=${signature}`,
125
+ },
126
+ body,
127
+ });
128
+ const operationLocation = response.headers.get("operation-location") ?? undefined;
129
+ const providerRequestId = response.headers.get("x-ms-request-id") ?? undefined;
130
+ const payload = await response.json().catch(() => ({}));
131
+ if (!response.ok) {
132
+ const reason = typeof payload.error?.message === "string" ? payload.error.message : `HTTP ${response.status}`;
133
+ throw new Error(`ACS outbound send failed: ${reason}`);
134
+ }
135
+ const providerMessageId = typeof payload.id === "string"
136
+ ? payload.id
137
+ : operationLocation
138
+ ? providerMessageIdFromOperationLocation(operationLocation)
139
+ : "";
140
+ if (!providerMessageId)
141
+ throw new Error("ACS outbound send did not return an operation id");
142
+ return {
143
+ provider: "azure-communication-services",
144
+ providerMessageId,
145
+ ...(operationLocation ? { operationLocation } : {}),
146
+ ...(providerRequestId ? { providerRequestId } : {}),
147
+ submittedAt: submitInput.submittedAt,
148
+ };
149
+ },
150
+ };
151
+ }
152
+ async function resolveOutboundProviderClient(transport, reader, options = {}) {
153
+ if (transport.kind !== "azure-communication-services")
154
+ return undefined;
155
+ const credentialItem = transport.credentialItem?.trim();
156
+ if (!credentialItem) {
157
+ throw new Error("outbound Azure Communication Services transport is missing credentialItem");
158
+ }
159
+ const accessKeyField = transport.credentialFields?.accessKey?.trim() || "accessKey";
160
+ const accessKey = (await reader.readSecretField(credentialItem, accessKeyField)).trim();
161
+ if (!accessKey) {
162
+ throw new Error(`outbound Azure Communication Services required secret field ${accessKeyField} is blank`);
163
+ }
164
+ return createAcsEmailProviderClient({
165
+ endpoint: transport.endpoint,
166
+ accessKey,
167
+ ...(options.fetch ? { fetch: options.fetch } : {}),
168
+ ...(options.now ? { now: options.now } : {}),
169
+ });
170
+ }
171
+ function draftId() {
172
+ return `draft_${crypto.randomBytes(12).toString("hex")}`;
173
+ }
174
+ function ensureRecipients(to) {
175
+ if (to.length === 0)
176
+ throw new Error("at least one recipient is required");
177
+ }
178
+ function resolveOutboundTransport(config) {
179
+ const outbound = isRecord(config) && isRecord(config.outbound) ? config.outbound : null;
180
+ if (!outbound) {
181
+ throw new Error("outbound mail transport is not configured; human-required: set mailroom.outbound before confirmed sends");
182
+ }
183
+ const transport = textField(outbound, "transport");
184
+ if (transport === "local-sink") {
185
+ const sinkPath = textField(outbound, "sinkPath");
186
+ if (!sinkPath)
187
+ throw new Error("outbound local-sink transport is missing sinkPath");
188
+ return { kind: "local-sink", sinkPath };
189
+ }
190
+ if (transport === "azure-communication-services") {
191
+ if ("credentialItemNoteQuery" in outbound || "noteQuery" in outbound || "notes" in outbound) {
192
+ throw new Error("outbound provider binding must not infer credentials from vault notes");
193
+ }
194
+ const endpoint = textField(outbound, "endpoint");
195
+ if (!endpoint)
196
+ throw new Error("outbound Azure Communication Services transport is missing endpoint");
197
+ const senderAddress = textField(outbound, "senderAddress");
198
+ const credentialItem = textField(outbound, "credentialItem");
199
+ const fields = credentialFields(outbound.credentialFields);
200
+ return {
201
+ kind: "azure-communication-services",
202
+ endpoint,
203
+ ...(senderAddress ? { senderAddress } : {}),
204
+ ...(credentialItem ? { credentialItem } : {}),
205
+ ...(fields ? { credentialFields: fields } : {}),
206
+ };
207
+ }
208
+ throw new Error("outbound mail transport is not configured; human-required: choose local-sink or azure-communication-services");
209
+ }
210
+ async function createMailDraft(input) {
211
+ const now = (input.now ?? (() => new Date()))().toISOString();
212
+ const to = normalizeList(input.to);
213
+ ensureRecipients(to);
214
+ const record = {
215
+ schemaVersion: 1,
216
+ id: draftId(),
217
+ agentId: input.agentId,
218
+ status: "draft",
219
+ mailboxRole: "agent-native-mailbox",
220
+ sendAuthority: "agent-native",
221
+ ownerEmail: null,
222
+ source: null,
223
+ from: (0, core_1.normalizeMailAddress)(input.from),
224
+ to,
225
+ cc: normalizeList(input.cc ?? []),
226
+ bcc: normalizeList(input.bcc ?? []),
227
+ subject: input.subject.trim(),
228
+ text: input.text,
229
+ actor: input.actor,
230
+ reason: input.reason,
231
+ createdAt: now,
232
+ updatedAt: now,
233
+ };
234
+ await input.store.upsertMailOutbound(record);
235
+ (0, runtime_1.emitNervesEvent)({
236
+ component: "senses",
237
+ event: "senses.mail_draft_created",
238
+ message: "mail draft created",
239
+ meta: { agentId: record.agentId, id: record.id, toCount: record.to.length },
240
+ });
241
+ return record;
242
+ }
243
+ function appendLocalSink(transport, record, sentAt) {
244
+ fs.mkdirSync(path.dirname(transport.sinkPath), { recursive: true });
245
+ const transportMessageId = `local_${crypto.randomBytes(10).toString("hex")}`;
246
+ fs.appendFileSync(transport.sinkPath, `${JSON.stringify({
247
+ schemaVersion: 1,
248
+ transportMessageId,
249
+ draftId: record.id,
250
+ agentId: record.agentId,
251
+ from: record.from,
252
+ to: record.to,
253
+ cc: record.cc,
254
+ bcc: record.bcc,
255
+ subject: record.subject,
256
+ text: record.text,
257
+ sendMode: record.sendMode,
258
+ policyId: record.policyDecision?.policyId ?? null,
259
+ sentAt,
260
+ })}\n`, "utf-8");
261
+ return transportMessageId;
262
+ }
263
+ function transportSend(transport, record, sentAt) {
264
+ return appendLocalSink(transport, record, sentAt);
265
+ }
266
+ async function confirmMailDraftSend(input) {
267
+ const draft = await input.store.getMailOutbound(input.draftId);
268
+ if (!draft || draft.agentId !== input.agentId)
269
+ throw new Error(`No draft found for ${input.draftId}`);
270
+ if (draft.status !== "draft")
271
+ throw new Error(`Draft ${input.draftId} is already ${draft.status}`);
272
+ const sentAt = (input.now ?? (() => new Date()))().toISOString();
273
+ const recentOutbound = await input.store.listMailOutbound(input.agentId);
274
+ const policyDecision = input.autonomous
275
+ ? (() => {
276
+ if (!input.autonomyPolicy) {
277
+ throw new Error("Autonomous mail sending requires an enabled native-agent policy");
278
+ }
279
+ const decision = (0, autonomy_1.evaluateNativeMailSendPolicy)({
280
+ policy: input.autonomyPolicy,
281
+ draft,
282
+ recentOutbound,
283
+ now: new Date(sentAt),
284
+ });
285
+ if (!decision.allowed) {
286
+ if (decision.mode === "confirmation-required") {
287
+ throw new Error(`Autonomous mail send ${decision.code} requires confirmation=CONFIRM_SEND: ${decision.reason}`);
288
+ }
289
+ throw new Error(`${decision.code}: ${decision.reason}`);
290
+ }
291
+ return decision;
292
+ })()
293
+ : (() => {
294
+ if (input.confirmation !== "CONFIRM_SEND") {
295
+ throw new Error("mail_send requires confirmation=CONFIRM_SEND before any outbound mail leaves the agent");
296
+ }
297
+ return (0, autonomy_1.buildConfirmedMailSendDecision)({
298
+ draft,
299
+ policy: input.autonomyPolicy,
300
+ now: new Date(sentAt),
301
+ });
302
+ })();
303
+ const pendingSent = {
304
+ ...draft,
305
+ status: input.transport.kind === "local-sink" ? "sent" : "submitted",
306
+ actor: input.actor,
307
+ reason: input.reason,
308
+ updatedAt: sentAt,
309
+ sendMode: input.autonomous ? "autonomous" : "confirmed",
310
+ policyDecision,
311
+ sentAt,
312
+ };
313
+ if (input.transport.kind === "azure-communication-services") {
314
+ if (!input.providerClient) {
315
+ throw new Error("Azure Communication Services outbound send is configured but not enabled on this machine; human-required setup is still needed");
316
+ }
317
+ const submission = await input.providerClient.submit({
318
+ draft: pendingSent,
319
+ transport: input.transport,
320
+ submittedAt: sentAt,
321
+ });
322
+ const submitted = {
323
+ ...(0, core_1.buildMailProviderSubmission)({
324
+ draft: pendingSent,
325
+ provider: submission.provider,
326
+ providerMessageId: submission.providerMessageId,
327
+ submittedAt: submission.submittedAt ?? sentAt,
328
+ ...(submission.operationLocation ? { operationLocation: submission.operationLocation } : {}),
329
+ ...(submission.providerRequestId ? { providerRequestId: submission.providerRequestId } : {}),
330
+ }),
331
+ transport: input.transport.kind,
332
+ };
333
+ await input.store.upsertMailOutbound(submitted);
334
+ (0, runtime_1.emitNervesEvent)({
335
+ component: "senses",
336
+ event: "senses.mail_draft_submitted",
337
+ message: "mail draft submitted to outbound provider",
338
+ meta: { agentId: submitted.agentId, id: submitted.id, provider: submitted.provider, providerMessageId: submitted.providerMessageId },
339
+ });
340
+ return submitted;
341
+ }
342
+ const transportMessageId = transportSend(input.transport, pendingSent, sentAt);
343
+ const sent = {
344
+ ...pendingSent,
345
+ transport: input.transport.kind,
346
+ transportMessageId,
347
+ };
348
+ await input.store.upsertMailOutbound(sent);
349
+ (0, runtime_1.emitNervesEvent)({
350
+ component: "senses",
351
+ event: "senses.mail_draft_sent",
352
+ message: "mail draft sent",
353
+ meta: { agentId: sent.agentId, id: sent.id, transport: sent.transport },
354
+ });
355
+ return sent;
356
+ }
357
+ function listMailOutboundRecords(store, agentId) {
358
+ return store.listMailOutbound(agentId);
359
+ }
360
+ async function reconcileOutboundDeliveryEvent(input) {
361
+ const records = await input.store.listMailOutbound(input.agentId);
362
+ const outbound = records.find((record) => record.providerMessageId === input.event.providerMessageId);
363
+ if (!outbound)
364
+ throw new Error(`No outbound record found for provider message ${input.event.providerMessageId}`);
365
+ const updated = (0, core_1.reconcileMailDeliveryEvent)({ outbound, event: input.event });
366
+ await input.store.upsertMailOutbound(updated);
367
+ (0, runtime_1.emitNervesEvent)({
368
+ component: "senses",
369
+ event: "senses.mail_delivery_event_reconciled",
370
+ message: "mail delivery event reconciled",
371
+ meta: {
372
+ agentId: updated.agentId,
373
+ id: updated.id,
374
+ provider: input.event.provider,
375
+ providerEventId: input.event.providerEventId,
376
+ outcome: input.event.outcome,
377
+ },
378
+ });
379
+ return updated;
380
+ }