@ouro.bot/cli 0.1.0-alpha.95 → 0.1.0-alpha.951

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 (755) 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/assets/sanctuary-host-launcher.sh +16 -0
  15. package/changelog.json +6021 -16
  16. package/deploy/unraid/Dockerfile +58 -0
  17. package/deploy/unraid/README.txt +2997 -0
  18. package/deploy/unraid/audit-container-spec.sh +4 -0
  19. package/deploy/unraid/container-runtime.json +1 -0
  20. package/deploy/unraid/docker-man-template-transaction.mjs +711 -0
  21. package/deploy/unraid/docker-man-template-xml.cjs +105 -0
  22. package/deploy/unraid/migrate-sanctuary-bundle.mjs +60 -0
  23. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  24. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  25. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  26. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  27. package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
  28. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  29. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
  30. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  31. package/deploy/unraid/sanctuary-authority-installation.json +36 -0
  32. package/deploy/unraid/sanctuary-authority-service.sh +30 -0
  33. package/deploy/unraid/sanctuary-butler-upgrade.mjs +1274 -0
  34. package/deploy/unraid/sanctuary-deployment-target.mjs +710 -0
  35. package/deploy/unraid/sanctuary-replay-gate.mjs +1586 -0
  36. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  37. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2086 -0
  38. package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
  39. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  40. package/deploy/unraid/sanctuary.ouro/agent.json +66 -0
  41. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  42. package/deploy/unraid/sanctuary.ouro/awaiting/house-care-sweep.md +17 -0
  43. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  44. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  45. package/deploy/unraid/sanctuary.ouro/mcp/media-mcp.mjs +2231 -0
  46. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  47. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  48. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
  49. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +33 -0
  50. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +27 -0
  51. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +22 -0
  52. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  53. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +232 -0
  54. package/deploy/unraid/sanctuary.xml +30 -0
  55. package/dist/a2a/card.js +57 -0
  56. package/dist/a2a/client.js +250 -0
  57. package/dist/a2a/config.js +50 -0
  58. package/dist/a2a/delegated-command-grants.js +93 -0
  59. package/dist/a2a/delegated-command.js +197 -0
  60. package/dist/a2a/delegation-stores.js +56 -0
  61. package/dist/a2a/did-resolution.js +93 -0
  62. package/dist/a2a/escalation-grants.js +84 -0
  63. package/dist/a2a/escalation-wiring.js +60 -0
  64. package/dist/a2a/identity.js +258 -0
  65. package/dist/a2a/inbound-share.js +110 -0
  66. package/dist/a2a/mission-result-wire.js +196 -0
  67. package/dist/a2a/onboarding.js +133 -0
  68. package/dist/a2a/operator-trust.js +399 -0
  69. package/dist/a2a/outbox-client.js +57 -0
  70. package/dist/a2a/outbox-store.js +188 -0
  71. package/dist/a2a/outbox-wire.js +95 -0
  72. package/dist/a2a/pin-store.js +132 -0
  73. package/dist/a2a/replay-grant-holders.js +33 -0
  74. package/dist/a2a/replay-harness.js +188 -0
  75. package/dist/a2a/resolution-proof.js +53 -0
  76. package/dist/a2a/sealed-chat.js +113 -0
  77. package/dist/a2a/seen-ledger.js +120 -0
  78. package/dist/a2a/server.js +771 -0
  79. package/dist/a2a/task-store.js +69 -0
  80. package/dist/a2a/transport.js +45 -0
  81. package/dist/a2a/trust-commands.js +203 -0
  82. package/dist/a2a/trusted-files.js +185 -0
  83. package/dist/a2a/types.js +3 -0
  84. package/dist/arc/attention-types.js +8 -0
  85. package/dist/arc/cares.js +360 -0
  86. package/dist/arc/episodes.js +118 -0
  87. package/dist/arc/evolution.js +490 -0
  88. package/dist/arc/flight-recorder.js +1034 -0
  89. package/dist/arc/intentions.js +134 -0
  90. package/dist/arc/json-store.js +117 -0
  91. package/dist/arc/obligations.js +386 -0
  92. package/dist/arc/packets.js +336 -0
  93. package/dist/arc/presence.js +185 -0
  94. package/dist/arc/task-lifecycle.js +57 -0
  95. package/dist/commerce/store.js +755 -0
  96. package/dist/commerce/types.js +3 -0
  97. package/dist/heart/active-work.js +798 -40
  98. package/dist/heart/agent-entry.js +252 -3
  99. package/dist/heart/approval-files.js +113 -0
  100. package/dist/heart/approval-store.js +960 -0
  101. package/dist/heart/attachments/image-normalize.js +201 -0
  102. package/dist/heart/attachments/materialize.js +97 -0
  103. package/dist/heart/attachments/originals.js +88 -0
  104. package/dist/heart/attachments/render.js +29 -0
  105. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  106. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  107. package/dist/heart/attachments/sources/index.js +18 -0
  108. package/dist/heart/attachments/sources/telegram.js +71 -0
  109. package/dist/heart/attachments/store.js +132 -0
  110. package/dist/heart/attachments/types.js +93 -0
  111. package/dist/heart/auth/auth-flow.js +497 -0
  112. package/dist/heart/autonomy-budget.js +478 -0
  113. package/dist/heart/awaiting/a2a-await-delivery.js +109 -0
  114. package/dist/heart/awaiting/await-alert.js +152 -0
  115. package/dist/heart/awaiting/await-expiry.js +143 -0
  116. package/dist/heart/awaiting/await-loader.js +91 -0
  117. package/dist/heart/awaiting/await-parser.js +152 -0
  118. package/dist/heart/awaiting/await-runtime-state.js +111 -0
  119. package/dist/heart/awaiting/await-scheduler.js +391 -0
  120. package/dist/heart/background-operations.js +281 -0
  121. package/dist/heart/bluebubbles-host-account.js +78 -0
  122. package/dist/heart/bridges/manager.js +137 -17
  123. package/dist/heart/bridges/store.js +14 -2
  124. package/dist/heart/bundle-state.js +168 -0
  125. package/dist/heart/commitments.js +44 -18
  126. package/dist/heart/config-registry.js +331 -0
  127. package/dist/heart/config.js +174 -131
  128. package/dist/heart/context-loss-gauntlet.js +387 -0
  129. package/dist/heart/context-loss-sentinel.js +1159 -0
  130. package/dist/heart/core.js +2356 -586
  131. package/dist/heart/cross-chat-delivery.js +9 -22
  132. package/dist/heart/daemon/agent-config-check.js +474 -0
  133. package/dist/heart/daemon/agent-discovery.js +283 -3
  134. package/dist/heart/daemon/agent-home.js +319 -0
  135. package/dist/heart/daemon/agent-service.js +542 -0
  136. package/dist/heart/daemon/agentic-repair.js +547 -0
  137. package/dist/heart/daemon/await-private-wake.js +59 -0
  138. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  139. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  140. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  141. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  142. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  143. package/dist/heart/daemon/cadence.js +180 -0
  144. package/dist/heart/daemon/cli-arg-redaction.js +26 -0
  145. package/dist/heart/daemon/cli-defaults.js +881 -0
  146. package/dist/heart/daemon/cli-desk.js +322 -0
  147. package/dist/heart/daemon/cli-exec.js +9235 -0
  148. package/dist/heart/daemon/cli-help.js +742 -0
  149. package/dist/heart/daemon/cli-parse.js +3236 -0
  150. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  151. package/dist/heart/daemon/cli-render.js +819 -0
  152. package/dist/heart/daemon/cli-types.js +8 -0
  153. package/dist/heart/daemon/connect-bay.js +323 -0
  154. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  155. package/dist/heart/daemon/container-healthcheck.js +112 -0
  156. package/dist/heart/daemon/container-runtime.js +97 -0
  157. package/dist/heart/daemon/container-spec-auditor-main.js +171 -0
  158. package/dist/heart/daemon/container-spec-auditor.js +235 -0
  159. package/dist/heart/daemon/daemon-bootstrap-startup.js +115 -0
  160. package/dist/heart/daemon/daemon-cli.js +29 -2360
  161. package/dist/heart/daemon/daemon-entry.js +953 -11
  162. package/dist/heart/daemon/daemon-health.js +186 -0
  163. package/dist/heart/daemon/daemon-rollup.js +57 -0
  164. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  165. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  166. package/dist/heart/daemon/daemon.js +2110 -104
  167. package/dist/heart/daemon/dns-workflow.js +394 -0
  168. package/dist/heart/daemon/doctor-types.js +8 -0
  169. package/dist/heart/daemon/doctor.js +1766 -0
  170. package/dist/heart/daemon/freshness.js +345 -0
  171. package/dist/heart/daemon/habit-private-wake.js +61 -0
  172. package/dist/heart/daemon/health-monitor.js +154 -11
  173. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  174. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  175. package/dist/heart/daemon/http-health-probe.js +80 -0
  176. package/dist/heart/daemon/human-command-screens.js +234 -0
  177. package/dist/heart/daemon/human-readiness.js +114 -0
  178. package/dist/heart/daemon/inner-status.js +78 -0
  179. package/dist/heart/daemon/interactive-repair.js +394 -0
  180. package/dist/heart/daemon/launchd.js +37 -8
  181. package/dist/heart/daemon/log-tailer.js +79 -10
  182. package/dist/heart/daemon/logs-prune.js +132 -0
  183. package/dist/heart/daemon/mcp-canary.js +524 -0
  184. package/dist/heart/daemon/message-router.js +65 -5
  185. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  186. package/dist/heart/daemon/os-cron-deps.js +135 -0
  187. package/dist/heart/daemon/os-cron.js +22 -14
  188. package/dist/heart/daemon/ouro-bot-entry.js +6 -3
  189. package/dist/heart/daemon/ouro-entry.js +9 -3
  190. package/dist/heart/daemon/plugin-cli.js +432 -0
  191. package/dist/heart/daemon/process-manager.js +760 -61
  192. package/dist/heart/daemon/provider-discovery.js +137 -0
  193. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  194. package/dist/heart/daemon/prunable-bundle.js +144 -0
  195. package/dist/heart/daemon/pulse.js +511 -0
  196. package/dist/heart/daemon/readiness-repair.js +365 -0
  197. package/dist/heart/daemon/run-hooks.js +2 -0
  198. package/dist/heart/daemon/runtime-logging.js +47 -14
  199. package/dist/heart/daemon/runtime-metadata.js +2 -30
  200. package/dist/heart/daemon/runtime-mode.js +13 -2
  201. package/dist/heart/daemon/safe-mode.js +161 -0
  202. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2654 -0
  203. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1830 -0
  204. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  205. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +955 -0
  206. package/dist/heart/daemon/sanctuary-authority-codec.js +86 -0
  207. package/dist/heart/daemon/sanctuary-authority-epoch.js +281 -0
  208. package/dist/heart/daemon/sanctuary-authority-installation.js +161 -0
  209. package/dist/heart/daemon/sanctuary-authority-ledger.js +241 -0
  210. package/dist/heart/daemon/sanctuary-authority-root-lifecycle.js +1282 -0
  211. package/dist/heart/daemon/sanctuary-authority-vault-migration.js +79 -0
  212. package/dist/heart/daemon/sanctuary-bundle-migration.js +730 -0
  213. package/dist/heart/daemon/sanctuary-host-authority.js +1008 -0
  214. package/dist/heart/daemon/sanctuary-host-detached-supervisor.js +493 -0
  215. package/dist/heart/daemon/sanctuary-host-executor.js +670 -0
  216. package/dist/heart/daemon/sanctuary-host-linux-kernel.js +334 -0
  217. package/dist/heart/daemon/sanctuary-host-supervisor-entry.js +207 -0
  218. package/dist/heart/daemon/sanctuary-host-supervisor.js +95 -0
  219. package/dist/heart/daemon/sanctuary-package-management.js +103 -0
  220. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  221. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  222. package/dist/heart/daemon/sanctuary-telegram-authority-entry.js +475 -0
  223. package/dist/heart/daemon/sanctuary-telegram-authority-gateway.js +585 -0
  224. package/dist/heart/daemon/sanctuary-telegram-authority-service.js +676 -0
  225. package/dist/heart/daemon/sense-manager.js +786 -48
  226. package/dist/heart/daemon/session-id-resolver.js +131 -0
  227. package/dist/heart/daemon/skill-management-installer.js +1 -1
  228. package/dist/heart/daemon/socket-client.js +180 -12
  229. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  230. package/dist/heart/daemon/startup-tui.js +339 -0
  231. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  232. package/dist/heart/daemon/task-scheduler.js +117 -39
  233. package/dist/heart/daemon/terminal-ui.js +503 -0
  234. package/dist/heart/daemon/thoughts.js +138 -54
  235. package/dist/heart/daemon/up-progress.js +366 -0
  236. package/dist/heart/daemon/vault-items.js +56 -0
  237. package/dist/heart/delegation.js +1 -4
  238. package/dist/heart/external-events/router.js +1523 -0
  239. package/dist/heart/failure-reports.js +336 -0
  240. package/dist/heart/file-lock.js +109 -0
  241. package/dist/heart/frontend-approval-runtime.js +506 -0
  242. package/dist/heart/frontend-journal.js +215 -0
  243. package/dist/heart/frontend-session-service.js +271 -0
  244. package/dist/heart/frontend-socket-client.js +173 -0
  245. package/dist/heart/frontend-socket.js +434 -0
  246. package/dist/heart/frontend-turn-errors.js +20 -0
  247. package/dist/heart/habits/habit-cancel.js +810 -0
  248. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  249. package/dist/heart/habits/habit-migration.js +194 -0
  250. package/dist/heart/habits/habit-parser.js +278 -0
  251. package/dist/heart/habits/habit-runtime-state.js +93 -0
  252. package/dist/heart/habits/habit-scheduler.js +653 -0
  253. package/dist/heart/habits/habit-session-summary.js +318 -0
  254. package/dist/heart/habits/habit-session.js +636 -0
  255. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  256. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  257. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  258. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  259. package/dist/heart/identity.js +239 -59
  260. package/dist/heart/kept-notes.js +289 -0
  261. package/dist/heart/kicks.js +1 -1
  262. package/dist/heart/machine-identity.js +175 -0
  263. package/dist/heart/mail-import-discovery.js +356 -0
  264. package/dist/heart/mailbox/mailbox-http-hooks.js +99 -0
  265. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  266. package/dist/heart/mailbox/mailbox-http-routes.js +406 -0
  267. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  268. package/dist/heart/mailbox/mailbox-http-transport.js +272 -0
  269. package/dist/heart/mailbox/mailbox-http.js +99 -0
  270. package/dist/heart/mailbox/mailbox-read.js +41 -0
  271. package/dist/heart/mailbox/mailbox-supervision.js +131 -0
  272. package/dist/heart/mailbox/mailbox-types.js +27 -0
  273. package/dist/heart/mailbox/mailbox-view.js +197 -0
  274. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  275. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  276. package/dist/heart/mailbox/readers/mail.js +375 -0
  277. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  278. package/dist/heart/mailbox/readers/sessions.js +231 -0
  279. package/dist/heart/mailbox/readers/shared.js +111 -0
  280. package/dist/heart/mcp/mcp-server.js +760 -0
  281. package/dist/heart/migrate-config.js +100 -0
  282. package/dist/heart/model-capabilities.js +83 -16
  283. package/dist/heart/orientation-frame.js +345 -0
  284. package/dist/heart/platform.js +81 -0
  285. package/dist/heart/primitives.js +1 -1
  286. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  287. package/dist/heart/private-runtime/index.js +18 -0
  288. package/dist/heart/private-runtime/ledger.js +221 -0
  289. package/dist/heart/private-runtime/policy.js +260 -0
  290. package/dist/heart/private-runtime/types.js +2 -0
  291. package/dist/heart/progress-story.js +1 -1
  292. package/dist/heart/provider-attempt.js +137 -0
  293. package/dist/heart/provider-binding-resolver.js +273 -0
  294. package/dist/heart/provider-credentials.js +449 -0
  295. package/dist/heart/provider-failover.js +311 -0
  296. package/dist/heart/provider-models.js +96 -0
  297. package/dist/heart/provider-ping.js +265 -0
  298. package/dist/heart/provider-readiness-cache.js +119 -0
  299. package/dist/heart/provider-visibility.js +188 -0
  300. package/dist/heart/providers/anthropic-token.js +131 -0
  301. package/dist/heart/providers/anthropic.js +188 -65
  302. package/dist/heart/providers/azure.js +23 -11
  303. package/dist/heart/providers/error-classification.js +129 -0
  304. package/dist/heart/providers/github-copilot.js +38 -39
  305. package/dist/heart/providers/minimax-vlm.js +189 -0
  306. package/dist/heart/providers/minimax.js +26 -8
  307. package/dist/heart/providers/openai-codex-token.js +349 -0
  308. package/dist/heart/providers/openai-codex.js +55 -40
  309. package/dist/heart/providers/openai-compatible.js +177 -0
  310. package/dist/heart/reach-channel.js +85 -0
  311. package/dist/heart/reply-style.js +52 -0
  312. package/dist/heart/run-ledger.js +247 -0
  313. package/dist/heart/runtime-capability-check.js +170 -0
  314. package/dist/heart/runtime-credentials.js +607 -0
  315. package/dist/heart/runtime-cwd.js +87 -0
  316. package/dist/heart/sense-truth.js +24 -4
  317. package/dist/heart/session-activity.js +94 -24
  318. package/dist/heart/session-events.js +1521 -0
  319. package/dist/heart/session-playback-cli-main.js +5 -0
  320. package/dist/heart/session-playback-cli.js +36 -0
  321. package/dist/heart/session-playback.js +231 -0
  322. package/dist/heart/session-redaction-repair-cli-main.js +31 -0
  323. package/dist/heart/session-redaction-repair.js +552 -0
  324. package/dist/heart/session-stats-cli-main.js +5 -0
  325. package/dist/heart/session-stats.js +183 -0
  326. package/dist/heart/session-transcript.js +133 -0
  327. package/dist/heart/shelf-claims.js +78 -0
  328. package/dist/heart/shepherd/custody-types.js +2 -0
  329. package/dist/heart/shepherd/mandates.js +352 -0
  330. package/dist/heart/shepherd/operation-commands.js +19 -0
  331. package/dist/heart/shepherd/operations.js +135 -0
  332. package/dist/heart/shepherd/supervision.js +114 -0
  333. package/dist/heart/shepherd/types.js +2 -0
  334. package/dist/heart/shepherd-config.js +113 -0
  335. package/dist/heart/source-grounding.js +297 -0
  336. package/dist/heart/start-of-turn-packet.js +372 -0
  337. package/dist/heart/steward-policy.js +656 -0
  338. package/dist/heart/streaming.js +631 -207
  339. package/dist/heart/structured-output.js +196 -0
  340. package/dist/heart/sync-classification.js +176 -0
  341. package/dist/heart/sync-health.js +152 -0
  342. package/dist/heart/sync.js +726 -0
  343. package/dist/heart/target-resolution.js +11 -7
  344. package/dist/heart/tempo.js +93 -0
  345. package/dist/heart/temporal-view.js +41 -0
  346. package/dist/heart/timeouts.js +101 -0
  347. package/dist/heart/tool-activity-callbacks.js +59 -0
  348. package/dist/heart/tool-approval.js +382 -0
  349. package/dist/heart/tool-description.js +155 -0
  350. package/dist/heart/tool-friction.js +55 -0
  351. package/dist/heart/tool-loop.js +206 -0
  352. package/dist/heart/turn-context.js +496 -0
  353. package/dist/heart/turn-execution-lease.js +30 -0
  354. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  355. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +3 -2
  356. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  357. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  358. package/dist/heart/versioning/ouro-version-manager.js +432 -0
  359. package/dist/heart/versioning/release-sources.js +173 -0
  360. package/dist/heart/versioning/self-update-defaults.js +294 -0
  361. package/dist/heart/versioning/self-update.js +196 -0
  362. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  363. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  364. package/dist/heart/versioning/update-hooks.js +154 -0
  365. package/dist/heart/versioning/update-state.js +126 -0
  366. package/dist/heart/versioning/updater-launchd.js +150 -0
  367. package/dist/heart/versioning/version-intent.js +114 -0
  368. package/dist/heart/work-card.js +380 -0
  369. package/dist/mailbox-ui/assets/index-Dbska1tZ.js +1 -0
  370. package/dist/mailbox-ui/assets/index-DsiKaPyH.css +1 -0
  371. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  372. package/dist/mailbox-ui/index.html +16 -0
  373. package/dist/mailroom/attention.js +167 -0
  374. package/dist/mailroom/autonomy.js +209 -0
  375. package/dist/mailroom/blob-store.js +889 -0
  376. package/dist/mailroom/body-cache.js +61 -0
  377. package/dist/mailroom/cache-sync-cli.js +58 -0
  378. package/dist/mailroom/core.js +803 -0
  379. package/dist/mailroom/entry.js +160 -0
  380. package/dist/mailroom/file-store.js +568 -0
  381. package/dist/mailroom/hosted-cache-sync.js +384 -0
  382. package/dist/mailroom/mbox-import.js +393 -0
  383. package/dist/mailroom/migration.js +164 -0
  384. package/dist/mailroom/outbound.js +380 -0
  385. package/dist/mailroom/policy.js +263 -0
  386. package/dist/mailroom/reader.js +292 -0
  387. package/dist/mailroom/search-cache.js +513 -0
  388. package/dist/mailroom/search-relevance.js +319 -0
  389. package/dist/mailroom/smtp-ingress.js +176 -0
  390. package/dist/mailroom/source-state.js +176 -0
  391. package/dist/mailroom/thread.js +109 -0
  392. package/dist/mailroom/travel-extract.js +89 -0
  393. package/dist/mind/bundle-manifest.js +24 -2
  394. package/dist/mind/context.js +328 -139
  395. package/dist/mind/desk-section.js +362 -0
  396. package/dist/mind/diary-integrity.js +60 -0
  397. package/dist/mind/{memory.js → diary.js} +68 -77
  398. package/dist/mind/embedding-provider.js +60 -0
  399. package/dist/mind/file-state.js +179 -0
  400. package/dist/mind/friend-link-codes.js +209 -0
  401. package/dist/mind/friend-merge.js +330 -0
  402. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  403. package/dist/mind/obligation-steering.js +199 -3
  404. package/dist/mind/outbound-record.js +165 -0
  405. package/dist/mind/pending.js +36 -10
  406. package/dist/mind/prompt-budget.js +479 -0
  407. package/dist/mind/prompt-refresh.js +3 -2
  408. package/dist/mind/prompt.js +1085 -198
  409. package/dist/mind/provenance-trust.js +26 -0
  410. package/dist/mind/record-paths.js +312 -0
  411. package/dist/mind/scrutiny.js +173 -0
  412. package/dist/mind/session-transaction.js +622 -0
  413. package/dist/nerves/cli-logging.js +7 -1
  414. package/dist/nerves/coverage/audit-rules.js +15 -6
  415. package/dist/nerves/coverage/audit.js +28 -2
  416. package/dist/nerves/coverage/cli.js +1 -1
  417. package/dist/nerves/coverage/contract.js +5 -5
  418. package/dist/nerves/coverage/file-completeness.js +143 -5
  419. package/dist/nerves/coverage/run-artifacts.js +55 -35
  420. package/dist/nerves/coverage/source-scanner.js +4 -4
  421. package/dist/nerves/event-buffer.js +111 -0
  422. package/dist/nerves/index.js +293 -9
  423. package/dist/nerves/observation.js +20 -0
  424. package/dist/nerves/redact.js +79 -0
  425. package/dist/nerves/review/cli-main.js +5 -0
  426. package/dist/nerves/review/cli.js +156 -0
  427. package/dist/nerves/review/core.js +159 -0
  428. package/dist/nerves/runtime.js +17 -1
  429. package/dist/repertoire/ado-client.js +15 -56
  430. package/dist/repertoire/ado-semantic.js +16 -10
  431. package/dist/repertoire/api-client.js +97 -0
  432. package/dist/repertoire/bitwarden-store.js +1201 -0
  433. package/dist/repertoire/bundle-templates.js +71 -0
  434. package/dist/repertoire/bw-installer.js +231 -0
  435. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  436. package/dist/repertoire/coding/context-pack.js +331 -0
  437. package/dist/repertoire/coding/feedback.js +174 -32
  438. package/dist/repertoire/coding/index.js +15 -3
  439. package/dist/repertoire/coding/manager.js +159 -10
  440. package/dist/repertoire/coding/spawner.js +40 -11
  441. package/dist/repertoire/coding/tools.js +182 -18
  442. package/dist/repertoire/coding/workbench-client.js +272 -0
  443. package/dist/repertoire/coding/workbench-manager.js +346 -0
  444. package/dist/repertoire/commerce-errors.js +109 -0
  445. package/dist/repertoire/commerce-self-test.js +156 -0
  446. package/dist/repertoire/credential-access.js +183 -0
  447. package/dist/repertoire/desk/classifier.js +362 -0
  448. package/dist/repertoire/duffel-client.js +185 -0
  449. package/dist/repertoire/github-client.js +14 -55
  450. package/dist/repertoire/graph-client.js +11 -52
  451. package/dist/repertoire/guardrails.js +971 -20
  452. package/dist/repertoire/house-sweep.js +469 -0
  453. package/dist/repertoire/mcp-client.js +58 -5
  454. package/dist/repertoire/mcp-manager.js +427 -139
  455. package/dist/repertoire/mcp-tools.js +132 -0
  456. package/dist/repertoire/mcp-write-guard.js +46 -0
  457. package/dist/repertoire/plugin-mcp.js +175 -0
  458. package/dist/repertoire/plugins.js +253 -0
  459. package/dist/repertoire/relationship-authorization.js +322 -0
  460. package/dist/repertoire/sanctuary-container-policy.js +46 -0
  461. package/dist/repertoire/shell-sessions.js +134 -0
  462. package/dist/repertoire/skills.js +48 -4
  463. package/dist/repertoire/stripe-client.js +131 -0
  464. package/dist/repertoire/tool-arguments.js +182 -0
  465. package/dist/repertoire/tool-results.js +29 -0
  466. package/dist/repertoire/tools-a2a.js +699 -0
  467. package/dist/repertoire/tools-attachments.js +322 -0
  468. package/dist/repertoire/tools-awaiting.js +872 -0
  469. package/dist/repertoire/tools-base.js +83 -1168
  470. package/dist/repertoire/tools-bluebubbles.js +2 -0
  471. package/dist/repertoire/tools-bridge.js +144 -0
  472. package/dist/repertoire/tools-bundle.js +995 -0
  473. package/dist/repertoire/tools-commerce.js +253 -0
  474. package/dist/repertoire/tools-config.js +186 -0
  475. package/dist/repertoire/tools-continuity.js +582 -0
  476. package/dist/repertoire/tools-credential.js +383 -0
  477. package/dist/repertoire/tools-escalation.js +84 -0
  478. package/dist/repertoire/tools-evolution.js +527 -0
  479. package/dist/repertoire/tools-files.js +344 -0
  480. package/dist/repertoire/tools-flight.js +290 -0
  481. package/dist/repertoire/tools-flow.js +119 -0
  482. package/dist/repertoire/tools-friend-link.js +57 -0
  483. package/dist/repertoire/tools-github.js +3 -8
  484. package/dist/repertoire/tools-habits.js +103 -0
  485. package/dist/repertoire/tools-house-care.js +174 -0
  486. package/dist/repertoire/tools-mail.js +1828 -0
  487. package/dist/repertoire/tools-notes.js +501 -0
  488. package/dist/repertoire/tools-obligations.js +182 -0
  489. package/dist/repertoire/tools-orientation.js +31 -0
  490. package/dist/repertoire/tools-record.js +482 -0
  491. package/dist/repertoire/tools-rsvp.js +139 -0
  492. package/dist/repertoire/tools-runtime.js +238 -0
  493. package/dist/repertoire/tools-sanctuary-host.js +202 -0
  494. package/dist/repertoire/tools-session.js +1141 -0
  495. package/dist/repertoire/tools-shell.js +154 -0
  496. package/dist/repertoire/tools-shepherd-guidance.js +171 -0
  497. package/dist/repertoire/tools-shepherd.js +323 -0
  498. package/dist/repertoire/tools-steward-policy.js +147 -0
  499. package/dist/repertoire/tools-stripe.js +224 -0
  500. package/dist/repertoire/tools-surface.js +369 -0
  501. package/dist/repertoire/tools-teams.js +50 -39
  502. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  503. package/dist/repertoire/tools-travel.js +125 -0
  504. package/dist/repertoire/tools-trip.js +982 -0
  505. package/dist/repertoire/tools-unraid.js +556 -0
  506. package/dist/repertoire/tools-user-profile.js +146 -0
  507. package/dist/repertoire/tools-vault.js +40 -0
  508. package/dist/repertoire/tools-voice-local.js +198 -0
  509. package/dist/repertoire/tools-voice.js +145 -0
  510. package/dist/repertoire/tools.js +518 -156
  511. package/dist/repertoire/travel-api-client.js +360 -0
  512. package/dist/repertoire/unraid-client.js +155 -0
  513. package/dist/repertoire/unraid-restart.js +339 -0
  514. package/dist/repertoire/user-profile.js +131 -0
  515. package/dist/repertoire/vault-setup.js +246 -0
  516. package/dist/repertoire/vault-unlock.js +686 -0
  517. package/dist/rsvp/aisleplanner-client.js +354 -0
  518. package/dist/rsvp/cli.js +936 -0
  519. package/dist/rsvp/config.js +327 -0
  520. package/dist/rsvp/cutover.js +433 -0
  521. package/dist/rsvp/diagnostics.js +232 -0
  522. package/dist/rsvp/diff-renderer.js +176 -0
  523. package/dist/rsvp/habit-policy.js +110 -0
  524. package/dist/rsvp/habit-stage.js +123 -0
  525. package/dist/rsvp/incident-bundle.js +97 -0
  526. package/dist/rsvp/migration.js +204 -0
  527. package/dist/rsvp/native-habit-runner.js +630 -0
  528. package/dist/rsvp/outbound-state.js +628 -0
  529. package/dist/rsvp/query.js +118 -0
  530. package/dist/rsvp/replay.js +233 -0
  531. package/dist/rsvp/snapshot.js +232 -0
  532. package/dist/rsvp/spend-ledger.js +175 -0
  533. package/dist/scripts/claude-code-hook.js +41 -0
  534. package/dist/scripts/claude-code-stop-hook.js +47 -0
  535. package/dist/senses/a2a-entry.js +132 -0
  536. package/dist/senses/acp-server.js +386 -0
  537. package/dist/senses/attention-queue.js +186 -0
  538. package/dist/senses/await-turn-message.js +65 -0
  539. package/dist/senses/bluebubbles/active-turns.js +216 -0
  540. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  541. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  542. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +385 -43
  543. package/dist/senses/bluebubbles/context-packet.js +207 -0
  544. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  545. package/dist/senses/bluebubbles/entry.js +90 -0
  546. package/dist/senses/bluebubbles/host-account-verifier.js +88 -0
  547. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  548. package/dist/senses/bluebubbles/index.js +3940 -0
  549. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  550. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  551. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  552. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  553. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  554. package/dist/senses/bluebubbles/processed-log.js +133 -0
  555. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  556. package/dist/senses/bluebubbles/replay.js +284 -0
  557. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  558. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  559. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  560. package/dist/senses/bluebubbles/webhook-registration.js +257 -0
  561. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  562. package/dist/senses/cli/bracketed-paste.js +82 -0
  563. package/dist/senses/cli/image-paste.js +287 -0
  564. package/dist/senses/cli/image-ref-navigation.js +75 -0
  565. package/dist/senses/cli/ink-app.js +156 -0
  566. package/dist/senses/cli/inline-diff.js +64 -0
  567. package/dist/senses/cli/input-keys.js +174 -0
  568. package/dist/senses/cli/kill-ring.js +86 -0
  569. package/dist/senses/cli/message-list.js +51 -0
  570. package/dist/senses/cli/ouro-tui.js +607 -0
  571. package/dist/senses/cli/spinner-imperative.js +135 -0
  572. package/dist/senses/cli/spinner.js +101 -0
  573. package/dist/senses/cli/status-line.js +60 -0
  574. package/dist/senses/cli/streaming-markdown.js +526 -0
  575. package/dist/senses/cli/tool-display.js +85 -0
  576. package/dist/senses/cli/tool-render.js +85 -0
  577. package/dist/senses/cli/tui-store.js +241 -0
  578. package/dist/senses/cli/virtual-list.js +35 -0
  579. package/dist/senses/cli-entry.js +60 -8
  580. package/dist/senses/cli.js +570 -309
  581. package/dist/senses/commands.js +66 -3
  582. package/dist/senses/context-packet-ledger.js +371 -0
  583. package/dist/senses/context-packets.js +154 -0
  584. package/dist/senses/habit-lifecycle-guard.js +24 -0
  585. package/dist/senses/habit-turn-message.js +160 -0
  586. package/dist/senses/ingress-evidence.js +2 -0
  587. package/dist/senses/mail-entry.js +66 -0
  588. package/dist/senses/mail.js +524 -0
  589. package/dist/senses/pipeline.js +1158 -204
  590. package/dist/senses/private-runtime-worker.js +805 -0
  591. package/dist/senses/private-runtime.js +1627 -0
  592. package/dist/senses/proactive-content-guard.js +51 -0
  593. package/dist/senses/root-host-approval-port.js +345 -0
  594. package/dist/senses/root-host-approval-runtime.js +393 -0
  595. package/dist/senses/sanctuary-authority-resident.js +102 -0
  596. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  597. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  598. package/dist/senses/sanctuary-grounding.js +118 -0
  599. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  600. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  601. package/dist/senses/sanctuary-health-runner.js +104 -0
  602. package/dist/senses/sanctuary-health.js +422 -0
  603. package/dist/senses/sanctuary-install-state-contract.js +169 -0
  604. package/dist/senses/sanctuary-interactive-control.js +410 -0
  605. package/dist/senses/sanctuary-media-catalog-contract.js +268 -0
  606. package/dist/senses/sanctuary-media-optimization.js +514 -0
  607. package/dist/senses/sanctuary-runtime.js +369 -0
  608. package/dist/senses/sanctuary-sab.js +85 -0
  609. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  610. package/dist/senses/shared-turn.js +804 -0
  611. package/dist/senses/shepherd/agent-presentation.js +88 -0
  612. package/dist/senses/shepherd/attention-page.js +166 -0
  613. package/dist/senses/shepherd/attention-sidebar.js +76 -0
  614. package/dist/senses/shepherd/attention.js +295 -0
  615. package/dist/senses/shepherd/checkin-config.js +76 -0
  616. package/dist/senses/shepherd/checkin-store.js +386 -0
  617. package/dist/senses/shepherd/client.js +196 -0
  618. package/dist/senses/shepherd/cmux.js +483 -0
  619. package/dist/senses/shepherd/composer.js +336 -0
  620. package/dist/senses/shepherd/feedback-reply.js +108 -0
  621. package/dist/senses/shepherd/feedback-source.js +20 -0
  622. package/dist/senses/shepherd/feedback-store.js +331 -0
  623. package/dist/senses/shepherd/feedback-submit.js +182 -0
  624. package/dist/senses/shepherd/feedback-worker.js +208 -0
  625. package/dist/senses/shepherd/guidance.js +273 -0
  626. package/dist/senses/shepherd/herdr.js +427 -0
  627. package/dist/senses/shepherd/host.js +14 -0
  628. package/dist/senses/shepherd/human-decision-guard.js +29 -0
  629. package/dist/senses/shepherd/judge-evaluation-command.js +183 -0
  630. package/dist/senses/shepherd/judge-evaluation-entry.js +13 -0
  631. package/dist/senses/shepherd/judge-evaluation.js +155 -0
  632. package/dist/senses/shepherd/judge.js +202 -0
  633. package/dist/senses/shepherd/notice-outbox.js +262 -0
  634. package/dist/senses/shepherd/observation-publisher.js +320 -0
  635. package/dist/senses/shepherd/operations-defaults.js +86 -0
  636. package/dist/senses/shepherd/operations.js +159 -0
  637. package/dist/senses/shepherd/owner-notice.js +465 -0
  638. package/dist/senses/shepherd/prompt-state.js +60 -0
  639. package/dist/senses/shepherd/recovery.js +543 -0
  640. package/dist/senses/shepherd/redact.js +66 -0
  641. package/dist/senses/shepherd/returns.js +79 -0
  642. package/dist/senses/shepherd/sense.js +821 -0
  643. package/dist/senses/shepherd/shepherd-judge-corpus-v1.json +170 -0
  644. package/dist/senses/shepherd/surface.js +123 -0
  645. package/dist/senses/shepherd/target-binding.js +13 -0
  646. package/dist/senses/shepherd/terminal-process.js +147 -0
  647. package/dist/senses/shepherd-entry.js +98 -0
  648. package/dist/senses/surface-tool.js +109 -0
  649. package/dist/senses/teams-entry.js +68 -8
  650. package/dist/senses/teams-image.js +119 -0
  651. package/dist/senses/teams.js +949 -337
  652. package/dist/senses/telegram-admission.js +718 -0
  653. package/dist/senses/telegram-approval-runtime.js +793 -0
  654. package/dist/senses/telegram-attachments.js +186 -0
  655. package/dist/senses/telegram-audit-ledger.js +220 -0
  656. package/dist/senses/telegram-authority-transport.js +231 -0
  657. package/dist/senses/telegram-client.js +1749 -0
  658. package/dist/senses/telegram-effect-adapter.js +904 -0
  659. package/dist/senses/telegram-entry.js +83 -0
  660. package/dist/senses/telegram-handoff.js +80 -0
  661. package/dist/senses/telegram.js +2435 -0
  662. package/dist/senses/trust-gate.js +104 -9
  663. package/dist/senses/voice/audio-playback.js +237 -0
  664. package/dist/senses/voice/audio-routing.js +119 -0
  665. package/dist/senses/voice/call-auth.js +250 -0
  666. package/dist/senses/voice/elevenlabs.js +202 -0
  667. package/dist/senses/voice/floor-control.js +431 -0
  668. package/dist/senses/voice/floor-controller.js +115 -0
  669. package/dist/senses/voice/golden-path.js +116 -0
  670. package/dist/senses/voice/index.js +29 -0
  671. package/dist/senses/voice/local-audio-control.js +344 -0
  672. package/dist/senses/voice/local-audio-devices.js +516 -0
  673. package/dist/senses/voice/local-audio-disclosure.js +174 -0
  674. package/dist/senses/voice/local-audio-identity.js +103 -0
  675. package/dist/senses/voice/local-audio-join.js +325 -0
  676. package/dist/senses/voice/local-audio-mute.js +199 -0
  677. package/dist/senses/voice/local-audio-notify.js +124 -0
  678. package/dist/senses/voice/local-audio-prompts.js +116 -0
  679. package/dist/senses/voice/local-audio-transport.js +427 -0
  680. package/dist/senses/voice/local-audio.js +281 -0
  681. package/dist/senses/voice/local-media-stream.js +145 -0
  682. package/dist/senses/voice/meeting.js +113 -0
  683. package/dist/senses/voice/outbound.js +190 -0
  684. package/dist/senses/voice/phone.js +33 -0
  685. package/dist/senses/voice/playback.js +139 -0
  686. package/dist/senses/voice/process-guards.js +51 -0
  687. package/dist/senses/voice/realtime-eval.js +496 -0
  688. package/dist/senses/voice/realtime-tool-schema.js +195 -0
  689. package/dist/senses/voice/realtime-trace.js +531 -0
  690. package/dist/senses/voice/transcript.js +70 -0
  691. package/dist/senses/voice/turn.js +191 -0
  692. package/dist/senses/voice/twilio-phone-runtime.js +836 -0
  693. package/dist/senses/voice/twilio-phone.js +5454 -0
  694. package/dist/senses/voice/types.js +2 -0
  695. package/dist/senses/voice/whisper.js +161 -0
  696. package/dist/senses/voice-entry.js +83 -0
  697. package/dist/senses/voice-realtime-eval-command.js +99 -0
  698. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  699. package/dist/senses/voice-twilio-entry.js +87 -0
  700. package/dist/trips/core.js +138 -0
  701. package/dist/trips/store.js +265 -0
  702. package/dist/util/frontmatter.js +69 -0
  703. package/npm-shrinkwrap.json +8165 -0
  704. package/package.json +75 -13
  705. package/skills/agent-commerce.md +113 -0
  706. package/skills/browser-navigation.md +117 -0
  707. package/skills/commerce-setup-guide.md +116 -0
  708. package/skills/commerce-setup.md +84 -0
  709. package/skills/configure-dev-tools.md +99 -0
  710. package/skills/travel-planning.md +138 -0
  711. package/dist/heart/daemon/auth-flow.js +0 -430
  712. package/dist/heart/daemon/ouro-path-installer.js +0 -260
  713. package/dist/heart/daemon/ouro-version-manager.js +0 -171
  714. package/dist/heart/daemon/update-hooks.js +0 -138
  715. package/dist/heart/obligations.js +0 -191
  716. package/dist/heart/safe-workspace.js +0 -362
  717. package/dist/heart/session-recall.js +0 -116
  718. package/dist/mind/friends/channel.js +0 -84
  719. package/dist/mind/friends/group-context.js +0 -144
  720. package/dist/mind/friends/resolver.js +0 -84
  721. package/dist/mind/friends/store-file.js +0 -190
  722. package/dist/mind/friends/store.js +0 -4
  723. package/dist/mind/friends/tokens.js +0 -26
  724. package/dist/mind/friends/trust-explanation.js +0 -74
  725. package/dist/mind/friends/types.js +0 -29
  726. package/dist/repertoire/tasks/board.js +0 -134
  727. package/dist/repertoire/tasks/index.js +0 -224
  728. package/dist/repertoire/tasks/lifecycle.js +0 -80
  729. package/dist/repertoire/tasks/middleware.js +0 -65
  730. package/dist/repertoire/tasks/parser.js +0 -173
  731. package/dist/repertoire/tasks/scanner.js +0 -132
  732. package/dist/repertoire/tasks/transitions.js +0 -144
  733. package/dist/senses/bluebubbles-entry.js +0 -13
  734. package/dist/senses/bluebubbles.js +0 -1181
  735. package/dist/senses/debug-activity.js +0 -154
  736. package/dist/senses/inner-dialog-worker.js +0 -90
  737. package/dist/senses/inner-dialog.js +0 -525
  738. package/subagents/README.md +0 -7
  739. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  740. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  741. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  742. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  743. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  744. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  745. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  746. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  747. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  748. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  749. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  750. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  751. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  752. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  753. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  754. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  755. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -1,9 +1,44 @@
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
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
37
  };
5
38
  Object.defineProperty(exports, "__esModule", { value: true });
6
39
  exports.toAnthropicMessages = toAnthropicMessages;
40
+ exports.toAnthropicTools = toAnthropicTools;
41
+ exports.classifyAnthropicError = classifyAnthropicError;
7
42
  exports.createAnthropicProviderRuntime = createAnthropicProviderRuntime;
8
43
  const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
9
44
  const config_1 = require("../config");
@@ -11,12 +46,13 @@ const identity_1 = require("../identity");
11
46
  const runtime_1 = require("../../nerves/runtime");
12
47
  const streaming_1 = require("../streaming");
13
48
  const model_capabilities_1 = require("../model-capabilities");
49
+ const error_classification_1 = require("./error-classification");
14
50
  const ANTHROPIC_SETUP_TOKEN_PREFIX = "sk-ant-oat01-";
15
51
  const ANTHROPIC_SETUP_TOKEN_MIN_LENGTH = 80;
16
52
  const ANTHROPIC_OAUTH_BETA_HEADER = "claude-code-20250219,oauth-2025-04-20,fine-grained-tool-streaming-2025-05-14,interleaved-thinking-2025-05-14";
17
- function getAnthropicSecretsPathForGuidance() {
18
- return (0, identity_1.getAgentSecretsPath)();
19
- }
53
+ // The API refuses newer models to Claude Code versions it considers too old (claude-opus-5-5 needs 2.1.280 or newer),
54
+ // so this names a current release. Raise it when the API asks for a newer one.
55
+ const CLAUDE_CLI_USER_AGENT = "claude-cli/2.1.310 (external, cli)";
20
56
  function getAnthropicAgentNameForGuidance() {
21
57
  return (0, identity_1.getAgentName)();
22
58
  }
@@ -24,10 +60,8 @@ function getAnthropicSetupTokenInstructions() {
24
60
  const agentName = getAnthropicAgentNameForGuidance();
25
61
  return [
26
62
  "Fix:",
27
- ` 1. Run \`ouro auth --agent ${agentName}\``,
28
- ` 2. Open ${getAnthropicSecretsPathForGuidance()}`,
29
- " 3. Confirm providers.anthropic.setupToken is set",
30
- " 4. After reauth, retry the failed ouro command or reconnect this session.",
63
+ ` 1. Run \`ouro auth --agent ${agentName} --provider anthropic\``,
64
+ " 2. After reauth, retry the failed ouro command or reconnect this session.",
31
65
  ].join("\n");
32
66
  }
33
67
  function getAnthropicReauthGuidance(reason) {
@@ -37,8 +71,7 @@ function getAnthropicReauthGuidance(reason) {
37
71
  getAnthropicSetupTokenInstructions(),
38
72
  ].join("\n");
39
73
  }
40
- function resolveAnthropicSetupTokenCredential() {
41
- const anthropicConfig = (0, config_1.getAnthropicConfig)();
74
+ function resolveAnthropicSetupTokenCredential(anthropicConfig) {
42
75
  const token = anthropicConfig.setupToken?.trim();
43
76
  if (!token) {
44
77
  throw new Error(getAnthropicReauthGuidance("Anthropic provider is selected but no setup-token credential was found."));
@@ -75,14 +108,13 @@ function parseToolCallInput(argumentsJson) {
75
108
  }
76
109
  }
77
110
  function toAnthropicMessages(messages) {
78
- let system;
111
+ const systemParts = [];
79
112
  const converted = [];
80
113
  for (const msg of messages) {
81
114
  if (msg.role === "system") {
82
- if (!system) {
83
- const text = toAnthropicTextContent(msg.content);
84
- system = text || undefined;
85
- }
115
+ const text = toAnthropicTextContent(msg.content).trim();
116
+ if (text)
117
+ systemParts.push(text);
86
118
  continue;
87
119
  }
88
120
  if (msg.role === "user") {
@@ -144,14 +176,20 @@ function toAnthropicMessages(messages) {
144
176
  });
145
177
  }
146
178
  }
147
- return { system, messages: converted };
179
+ return { system: systemParts.length > 0 ? systemParts.join("\n\n") : undefined, messages: converted };
148
180
  }
181
+ // The Anthropic API rejects the whole request when any tool's input_schema has
182
+ // oneOf, allOf or anyOf at the top level, so those keys are dropped here. Each
183
+ // tool's handler still enforces its own either/or rules.
149
184
  function toAnthropicTools(tools) {
150
- return tools.map((tool) => ({
151
- name: tool.function.name,
152
- description: tool.function.description ?? "",
153
- input_schema: tool.function.parameters ?? { type: "object", properties: {} },
154
- }));
185
+ return tools.map((tool) => {
186
+ const { oneOf: _oneOf, allOf: _allOf, anyOf: _anyOf, ...schema } = tool.function.parameters ?? { type: "object", properties: {} };
187
+ return {
188
+ name: tool.function.name,
189
+ description: tool.function.description ?? "",
190
+ input_schema: schema,
191
+ };
192
+ });
155
193
  }
156
194
  function toAnthropicUsage(raw) {
157
195
  const inputTokens = Number(raw.input_tokens ?? 0) || 0;
@@ -187,27 +225,26 @@ function mergeAnthropicToolArguments(current, partial) {
187
225
  }
188
226
  return current + partial;
189
227
  }
228
+ function classifyAnthropicError(error) {
229
+ return (0, error_classification_1.classifyHttpError)(error, {
230
+ isAuthFailure: isAnthropicAuthFailure,
231
+ isServerError: (e) => e.status === 529,
232
+ });
233
+ }
190
234
  function isAnthropicAuthFailure(error) {
191
- if (!(error instanceof Error))
192
- return false;
193
- const status = error.status;
194
- if (status === 401 || status === 403)
195
- return true;
196
235
  const lower = error.message.toLowerCase();
197
236
  return (lower.includes("oauth authentication") ||
198
237
  lower.includes("authentication failed") ||
199
238
  lower.includes("unauthorized") ||
200
239
  lower.includes("invalid api key"));
201
240
  }
202
- function withAnthropicAuthGuidance(error) {
203
- const base = error instanceof Error ? error.message : String(error);
204
- if (isAnthropicAuthFailure(error)) {
205
- return new Error(getAnthropicReauthGuidance(`Anthropic authentication failed (${base}).`));
206
- }
207
- return error instanceof Error ? error : new Error(String(error));
208
- }
209
241
  async function streamAnthropicMessages(client, model, request) {
210
242
  const { system, messages } = toAnthropicMessages(request.messages);
243
+ const additionalSystemParts = request.messages
244
+ .filter((message) => message.role === "system")
245
+ .slice(1)
246
+ .map((message) => toAnthropicTextContent(message.content).trim())
247
+ .filter((text) => text.length > 0);
211
248
  const anthropicTools = toAnthropicTools(request.activeTools);
212
249
  const modelCaps = (0, model_capabilities_1.getModelCapabilities)(model);
213
250
  const maxTokens = modelCaps.maxOutputTokens ?? 16384;
@@ -216,21 +253,50 @@ async function streamAnthropicMessages(client, model, request) {
216
253
  max_tokens: maxTokens,
217
254
  messages,
218
255
  stream: true,
219
- thinking: { type: "adaptive", effort: request.reasoningEffort ?? "medium" },
256
+ thinking: { type: "adaptive" },
257
+ output_config: { effort: request.reasoningEffort ?? "medium" },
220
258
  };
221
- if (system)
222
- params.system = system;
259
+ // The Anthropic API requires a Claude Code identification block in the system
260
+ // prompt when using OAuth setup tokens (sk-ant-oat01). Without it, Opus/Sonnet
261
+ // 4.6 requests are rejected with 400. This is the API's validation that the
262
+ // token is being used by a Claude Code client.
263
+ const preambleText = "You are Claude Code, Anthropic's official CLI for Claude.";
264
+ if (request.systemPrompt) {
265
+ // Structured SystemPrompt: merge preamble + stable prefix into one cached block,
266
+ // volatile suffix as a separate uncached block.
267
+ const stableBlock = {
268
+ type: "text",
269
+ text: preambleText + "\n\n" + request.systemPrompt.stable,
270
+ cache_control: { type: "ephemeral" },
271
+ };
272
+ params.system = [
273
+ stableBlock,
274
+ ...(request.systemPrompt.volatile
275
+ ? [{ type: "text", text: request.systemPrompt.volatile }]
276
+ : []),
277
+ ...additionalSystemParts.map((text) => ({ type: "text", text })),
278
+ ];
279
+ }
280
+ else if (system) {
281
+ // Fallback: no structured prompt, extract from messages (legacy path)
282
+ params.system = [{ type: "text", text: preambleText }, { type: "text", text: system }];
283
+ }
284
+ else {
285
+ params.system = [{ type: "text", text: preambleText }];
286
+ }
223
287
  if (anthropicTools.length > 0)
224
288
  params.tools = anthropicTools;
225
289
  if (request.toolChoiceRequired && anthropicTools.length > 0) {
226
- params.tool_choice = { type: "any" };
290
+ // Thinking (adaptive or enabled) only supports tool_choice "auto" or "none".
291
+ // "any" forces tool use which is incompatible with extended thinking.
292
+ params.tool_choice = params.thinking ? { type: "auto" } : /* v8 ignore next -- no-thinking path: thinking always set for 4.6 models @preserve */ { type: "any" };
227
293
  }
228
294
  let response;
229
295
  try {
230
296
  response = await client.messages.create(params, request.signal ? { signal: request.signal } : {});
231
297
  }
232
298
  catch (error) {
233
- throw withAnthropicAuthGuidance(error);
299
+ throw error instanceof Error ? error : new Error(String(error));
234
300
  }
235
301
  let content = "";
236
302
  let streamStarted = false;
@@ -238,7 +304,8 @@ async function streamAnthropicMessages(client, model, request) {
238
304
  const toolCalls = new Map();
239
305
  const thinkingBlocks = new Map();
240
306
  const redactedBlocks = new Map();
241
- const answerStreamer = new streaming_1.FinalAnswerStreamer(request.callbacks);
307
+ const answerStreamer = new streaming_1.SettleStreamer(request.callbacks, request.eagerSettleStreaming);
308
+ const textOutput = new streaming_1.ProviderTextOutput(request.callbacks);
242
309
  try {
243
310
  for await (const event of response) {
244
311
  if (request.signal?.aborted)
@@ -264,10 +331,11 @@ async function streamAnthropicMessages(client, model, request) {
264
331
  name,
265
332
  arguments: input,
266
333
  });
267
- // Activate eager streaming for sole final_answer tool call
268
- /* v8 ignore next -- final_answer streaming activation, tested via FinalAnswerStreamer unit tests @preserve */
269
- if (name === "final_answer" && toolCalls.size === 1) {
334
+ // Activate eager streaming for sole settle tool call
335
+ /* v8 ignore next -- settle streaming activation, tested via SettleStreamer unit tests @preserve */
336
+ if (name === "settle" && toolCalls.size === 1) {
270
337
  answerStreamer.activate();
338
+ textOutput.suppress();
271
339
  }
272
340
  }
273
341
  continue;
@@ -282,7 +350,7 @@ async function streamAnthropicMessages(client, model, request) {
282
350
  }
283
351
  const text = String(delta?.text ?? "");
284
352
  content += text;
285
- request.callbacks.onTextChunk(text);
353
+ textOutput.emit(text);
286
354
  continue;
287
355
  }
288
356
  if (deltaType === "thinking_delta") {
@@ -311,8 +379,8 @@ async function streamAnthropicMessages(client, model, request) {
311
379
  if (existing) {
312
380
  const partialJson = String(delta?.partial_json ?? "");
313
381
  existing.arguments = mergeAnthropicToolArguments(existing.arguments, partialJson);
314
- /* v8 ignore next -- final_answer delta streaming, tested via FinalAnswerStreamer unit tests @preserve */
315
- if (existing.name === "final_answer" && toolCalls.size === 1) {
382
+ /* v8 ignore next -- settle delta streaming, tested via SettleStreamer unit tests @preserve */
383
+ if (existing.name === "settle" && toolCalls.size === 1) {
316
384
  answerStreamer.processDelta(partialJson);
317
385
  }
318
386
  }
@@ -336,7 +404,25 @@ async function streamAnthropicMessages(client, model, request) {
336
404
  }
337
405
  }
338
406
  catch (error) {
339
- throw withAnthropicAuthGuidance(error);
407
+ textOutput.discard();
408
+ answerStreamer.cancel();
409
+ throw error instanceof Error ? error : /* v8 ignore next -- defensive: stream errors are always Error @preserve */ new Error(String(error));
410
+ }
411
+ const completedToolCalls = [...toolCalls.values()];
412
+ let settleFinalization;
413
+ if (request.signal?.aborted) {
414
+ textOutput.discard();
415
+ answerStreamer.cancel();
416
+ }
417
+ else if (completedToolCalls.length === 1
418
+ && completedToolCalls[0].name === "settle"
419
+ && answerStreamer.detected) {
420
+ textOutput.discard();
421
+ settleFinalization = (0, streaming_1.finalizeSettleStream)(answerStreamer, completedToolCalls[0].arguments);
422
+ }
423
+ else {
424
+ answerStreamer.cancel();
425
+ textOutput.flush();
340
426
  }
341
427
  // Collect all thinking blocks (regular + redacted) sorted by index to preserve ordering
342
428
  const allThinkingIndices = [...thinkingBlocks.keys(), ...redactedBlocks.keys()].sort((a, b) => a - b);
@@ -348,40 +434,66 @@ async function streamAnthropicMessages(client, model, request) {
348
434
  });
349
435
  return {
350
436
  content,
351
- toolCalls: [...toolCalls.values()],
437
+ toolCalls: completedToolCalls,
352
438
  outputItems,
353
439
  usage,
354
- finalAnswerStreamed: answerStreamer.streamed,
440
+ settleStreamed: answerStreamer.streamed,
441
+ ...(settleFinalization ? { settleFinalization } : {}),
355
442
  };
356
443
  }
357
- function createAnthropicProviderRuntime() {
444
+ function createAnthropicProviderRuntime(model, anthropicConfig = (0, config_1.getAnthropicConfig)()) {
358
445
  (0, runtime_1.emitNervesEvent)({
359
446
  component: "engine",
360
447
  event: "engine.provider_init",
361
448
  message: "anthropic provider init",
362
449
  meta: { provider: "anthropic" },
363
450
  });
364
- const anthropicConfig = (0, config_1.getAnthropicConfig)();
365
- if (!(anthropicConfig.model && anthropicConfig.setupToken)) {
366
- throw new Error(getAnthropicReauthGuidance("provider 'anthropic' is selected in agent.json but providers.anthropic.model/setupToken is incomplete in secrets.json."));
451
+ if (!anthropicConfig.setupToken) {
452
+ throw new Error(getAnthropicReauthGuidance("provider 'anthropic' is selected but anthropic.setupToken is missing in the agent vault."));
367
453
  }
368
- const modelCaps = (0, model_capabilities_1.getModelCapabilities)(anthropicConfig.model);
454
+ const modelCaps = (0, model_capabilities_1.getModelCapabilities)(model);
369
455
  const capabilities = new Set();
370
456
  if (modelCaps.reasoningEffort)
371
457
  capabilities.add("reasoning-effort");
372
- const credential = resolveAnthropicSetupTokenCredential();
373
- const client = new sdk_1.default({
374
- authToken: credential.token,
375
- timeout: 30000,
376
- maxRetries: 0,
377
- defaultHeaders: {
378
- "anthropic-beta": ANTHROPIC_OAUTH_BETA_HEADER,
379
- },
380
- });
458
+ const credential = resolveAnthropicSetupTokenCredential(anthropicConfig);
459
+ const refreshToken = anthropicConfig.refreshToken;
460
+ const expiresAt = anthropicConfig.expiresAt;
461
+ function createClient(token) {
462
+ return new sdk_1.default({
463
+ authToken: token,
464
+ maxRetries: 0,
465
+ defaultHeaders: {
466
+ "anthropic-beta": ANTHROPIC_OAUTH_BETA_HEADER,
467
+ "anthropic-dangerous-direct-browser-access": "true",
468
+ "user-agent": CLAUDE_CLI_USER_AGENT,
469
+ "x-app": "cli",
470
+ },
471
+ });
472
+ }
473
+ let currentToken = credential.token;
474
+ let client = createClient(currentToken);
475
+ /* v8 ignore start -- token refresh: dynamic import + ensureFreshToken, tested via integration @preserve */
476
+ async function ensureClient() {
477
+ try {
478
+ const { ensureFreshToken } = await Promise.resolve().then(() => __importStar(require("./anthropic-token")));
479
+ const { getAgentName } = await Promise.resolve().then(() => __importStar(require("../identity")));
480
+ const freshToken = await ensureFreshToken(currentToken, refreshToken, expiresAt, getAgentName());
481
+ if (freshToken !== currentToken) {
482
+ currentToken = freshToken;
483
+ client = createClient(freshToken);
484
+ }
485
+ }
486
+ catch {
487
+ // refresh failed — use existing client
488
+ }
489
+ return client;
490
+ }
491
+ /* v8 ignore stop */
381
492
  return {
382
493
  id: "anthropic",
383
- model: anthropicConfig.model,
384
- client,
494
+ model,
495
+ /* v8 ignore next -- getter: returns mutable client ref @preserve */
496
+ get client() { return client; },
385
497
  capabilities,
386
498
  supportedReasoningEfforts: modelCaps.reasoningEffort,
387
499
  resetTurnState(_messages) {
@@ -390,8 +502,19 @@ function createAnthropicProviderRuntime() {
390
502
  appendToolOutput(_callId, _output) {
391
503
  // Anthropic uses canonical messages for tool_result tracking.
392
504
  },
393
- streamTurn(request) {
394
- return streamAnthropicMessages(client, anthropicConfig.model, request);
505
+ async streamTurn(request) {
506
+ const freshClient = await ensureClient();
507
+ return streamAnthropicMessages(freshClient, model, request);
508
+ },
509
+ /* v8 ignore start -- ping: tested via provider-ping.test.ts @preserve */
510
+ async ping(signal) {
511
+ const freshClient = await ensureClient();
512
+ await freshClient.messages.create({ model: "claude-haiku-4-5-20251001", max_tokens: 1, messages: [{ role: "user", content: "ping" }] }, { signal, headers: { "anthropic-beta": "claude-code-20250219,oauth-2025-04-20" } });
513
+ },
514
+ /* v8 ignore stop */
515
+ /* v8 ignore next 3 -- delegation: classification logic tested via classifyAnthropicError @preserve */
516
+ classifyError(error) {
517
+ return classifyAnthropicError(error);
395
518
  },
396
519
  };
397
520
  }
@@ -33,6 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.classifyAzureError = classifyAzureError;
36
37
  exports.createAzureTokenProvider = createAzureTokenProvider;
37
38
  exports.createAzureProviderRuntime = createAzureProviderRuntime;
38
39
  const openai_1 = require("openai");
@@ -40,7 +41,11 @@ const config_1 = require("../config");
40
41
  const runtime_1 = require("../../nerves/runtime");
41
42
  const streaming_1 = require("../streaming");
42
43
  const model_capabilities_1 = require("../model-capabilities");
44
+ const error_classification_1 = require("./error-classification");
43
45
  const COGNITIVE_SERVICES_SCOPE = "https://cognitiveservices.azure.com/.default";
46
+ function classifyAzureError(error) {
47
+ return (0, error_classification_1.classifyHttpError)(error);
48
+ }
44
49
  // @azure/identity is imported dynamically (below) rather than at the top level
45
50
  // because it's a heavy package (~30+ transitive deps) and we only need it when
46
51
  // using the managed-identity auth path. API-key users and other providers
@@ -63,14 +68,13 @@ function createAzureTokenProvider(managedIdentityClientId) {
63
68
  const detail = err instanceof Error ? err.message : String(err);
64
69
  throw new Error(`Azure OpenAI authentication failed: ${detail}\n` +
65
70
  "To fix this, either:\n" +
66
- " 1. Set providers.azure.apiKey in secrets.json, or\n" +
71
+ " 1. Run `ouro auth --agent <agent> --provider azure`, or\n" +
67
72
  " 2. Run 'az login' to authenticate with your Azure account (for local dev), or\n" +
68
- " 3. Attach a managed identity to your App Service and set providers.azure.managedIdentityClientId in secrets.json (for deployed environments)");
73
+ " 3. Attach a managed identity to your App Service and store azure.managedIdentityClientId in the agent vault.");
69
74
  }
70
75
  };
71
76
  }
72
- function createAzureProviderRuntime() {
73
- const azureConfig = (0, config_1.getAzureConfig)();
77
+ function createAzureProviderRuntime(model, azureConfig = (0, config_1.getAzureConfig)()) {
74
78
  const useApiKey = !!azureConfig.apiKey;
75
79
  const authMethod = useApiKey ? "key" : "managed-identity";
76
80
  (0, runtime_1.emitNervesEvent)({
@@ -79,10 +83,10 @@ function createAzureProviderRuntime() {
79
83
  message: "azure provider init",
80
84
  meta: { provider: "azure", authMethod },
81
85
  });
82
- if (!(azureConfig.endpoint && azureConfig.deployment && azureConfig.modelName)) {
83
- throw new Error("provider 'azure' is selected in agent.json but providers.azure is incomplete in secrets.json.");
86
+ if (!(azureConfig.endpoint && azureConfig.deployment)) {
87
+ throw new Error("provider 'azure' is selected but azure endpoint/deployment is incomplete in the agent vault. Run `ouro auth --agent <agent> --provider azure`.");
84
88
  }
85
- const modelCaps = (0, model_capabilities_1.getModelCapabilities)(azureConfig.modelName);
89
+ const modelCaps = (0, model_capabilities_1.getModelCapabilities)(model);
86
90
  const capabilities = new Set();
87
91
  if (modelCaps.reasoningEffort)
88
92
  capabilities.add("reasoning-effort");
@@ -90,7 +94,6 @@ function createAzureProviderRuntime() {
90
94
  endpoint: azureConfig.endpoint.replace(/\/openai.*$/, ""),
91
95
  deployment: azureConfig.deployment,
92
96
  apiVersion: azureConfig.apiVersion,
93
- timeout: 30000,
94
97
  maxRetries: 0,
95
98
  };
96
99
  if (useApiKey) {
@@ -105,7 +108,7 @@ function createAzureProviderRuntime() {
105
108
  let nativeInstructions = "";
106
109
  return {
107
110
  id: "azure",
108
- model: azureConfig.modelName,
111
+ model,
109
112
  client,
110
113
  capabilities,
111
114
  supportedReasoningEfforts: modelCaps.reasoningEffort,
@@ -117,7 +120,7 @@ function createAzureProviderRuntime() {
117
120
  appendToolOutput(callId, output) {
118
121
  if (!nativeInput)
119
122
  return;
120
- nativeInput.push({ type: "function_call_output", call_id: callId, output });
123
+ nativeInput.push({ type: "function_call_output", call_id: callId, output: (0, streaming_1.truncateResponsesFunctionCallOutput)(output) });
121
124
  },
122
125
  async streamTurn(request) {
123
126
  if (!nativeInput)
@@ -136,10 +139,19 @@ function createAzureProviderRuntime() {
136
139
  params.metadata = { trace_id: request.traceId };
137
140
  if (request.toolChoiceRequired)
138
141
  params.tool_choice = "required";
139
- const result = await (0, streaming_1.streamResponsesApi)(this.client, params, request.callbacks, request.signal);
142
+ const result = await (0, streaming_1.streamResponsesApi)(this.client, params, request.callbacks, request.signal, request.eagerSettleStreaming);
140
143
  for (const item of result.outputItems)
141
144
  nativeInput.push(item);
142
145
  return result;
143
146
  },
147
+ /* v8 ignore start -- ping: tested via provider-ping.test.ts @preserve */
148
+ async ping(signal) {
149
+ await this.client.responses.create({ model: this.model, input: "ping", max_output_tokens: 16 }, { signal });
150
+ },
151
+ /* v8 ignore stop */
152
+ /* v8 ignore next 3 -- delegation: classification logic tested via classifyAzureError @preserve */
153
+ classifyError(error) {
154
+ return classifyAzureError(error);
155
+ },
144
156
  };
145
157
  }
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isNetworkError = isNetworkError;
4
+ exports.classifyHttpError = classifyHttpError;
5
+ exports.extractProviderErrorDetails = extractProviderErrorDetails;
6
+ exports.summarizeProviderError = summarizeProviderError;
7
+ const runtime_1 = require("../../nerves/runtime");
8
+ // Node socket / DNS error codes that indicate a transient network failure.
9
+ const NETWORK_ERROR_CODES = new Set([
10
+ "ECONNRESET",
11
+ "ECONNREFUSED",
12
+ "ENOTFOUND",
13
+ "ETIMEDOUT",
14
+ "EPIPE",
15
+ "EAI_AGAIN",
16
+ "EHOSTUNREACH",
17
+ "ENETUNREACH",
18
+ "ECONNABORTED",
19
+ ]);
20
+ // Substrings the OpenAI/Anthropic SDKs use when wrapping fetch/socket failures
21
+ // into Error.message instead of an err.code.
22
+ const NETWORK_ERROR_MESSAGE_PATTERNS = [
23
+ "fetch failed",
24
+ "socket hang up",
25
+ "getaddrinfo",
26
+ "request timed out", // OpenAI SDK timeout — see SDK source
27
+ "request timeout",
28
+ "connection error",
29
+ ];
30
+ // True if the error looks like a transient network issue (no HTTP status, just
31
+ // a socket/DNS/timeout failure from the underlying transport).
32
+ function isNetworkError(error) {
33
+ if (error.status !== undefined)
34
+ return false;
35
+ const code = error.code || "";
36
+ if (NETWORK_ERROR_CODES.has(code))
37
+ return true;
38
+ const msg = (error.message || "").toLowerCase();
39
+ return NETWORK_ERROR_MESSAGE_PATTERNS.some((pat) => msg.includes(pat));
40
+ }
41
+ // Standard HTTP error → ProviderErrorClassification mapping. Providers wrap
42
+ // this with their own overrides.
43
+ function classifyHttpError(error, overrides) {
44
+ const status = error.status;
45
+ if (overrides?.isAuthFailure?.(error) || status === 401 || status === 403) {
46
+ return "auth-failure";
47
+ }
48
+ if (status === 429) {
49
+ if (overrides?.isUsageLimit?.(error))
50
+ return "usage-limit";
51
+ return "rate-limit";
52
+ }
53
+ if (overrides?.isServerError?.(error) || (status !== undefined && status >= 500)) {
54
+ return "server-error";
55
+ }
56
+ if (isNetworkError(error))
57
+ return "network-error";
58
+ return "unknown";
59
+ }
60
+ // Pull HTTP status and a redacted body excerpt off a provider error if
61
+ // either is present. SDK shapes: OpenAI puts `status` on the error, body
62
+ // often on `error.error` or `error.response`. Keep this purely defensive —
63
+ // any missing field returns undefined so callers can decide whether to
64
+ // include it. The body excerpt is capped to 240 chars and stripped of
65
+ // known auth-token-looking substrings.
66
+ const ERROR_BODY_EXCERPT_MAX = 240;
67
+ const TOKEN_PATTERN = /[A-Za-z0-9_\-]{32,}/g;
68
+ function shorten(value) {
69
+ const collapsed = value.replace(/\s+/g, " ").trim();
70
+ if (collapsed.length === 0)
71
+ return "";
72
+ const redacted = collapsed.replace(TOKEN_PATTERN, "[redacted]");
73
+ return redacted.length > ERROR_BODY_EXCERPT_MAX
74
+ ? `${redacted.slice(0, ERROR_BODY_EXCERPT_MAX - 3)}...`
75
+ : redacted;
76
+ }
77
+ function extractProviderErrorDetails(error) {
78
+ const details = {};
79
+ const status = error.status;
80
+ if (typeof status === "number" && Number.isFinite(status))
81
+ details.status = status;
82
+ const errorAsRecord = error;
83
+ const candidates = [
84
+ errorAsRecord.error,
85
+ errorAsRecord.response,
86
+ errorAsRecord.body,
87
+ error.message,
88
+ ];
89
+ /* v8 ignore start -- candidate-shape branches: production provider errors expose string messages; object-shaped error.body and the string-false fall-through are fallbacks for non-OpenAI SDK shapes @preserve */
90
+ for (const candidate of candidates) {
91
+ if (!candidate)
92
+ continue;
93
+ if (typeof candidate === "string") {
94
+ const excerpt = shorten(candidate);
95
+ if (excerpt) {
96
+ details.bodyExcerpt = excerpt;
97
+ break;
98
+ }
99
+ }
100
+ else if (typeof candidate === "object") {
101
+ try {
102
+ const excerpt = shorten(JSON.stringify(candidate));
103
+ if (excerpt) {
104
+ details.bodyExcerpt = excerpt;
105
+ break;
106
+ }
107
+ }
108
+ catch {
109
+ // Circular structure or otherwise unstringifyable; skip.
110
+ }
111
+ }
112
+ }
113
+ /* v8 ignore stop */
114
+ return details;
115
+ }
116
+ function summarizeProviderError(error, classification, providerId, model) {
117
+ const details = extractProviderErrorDetails(error);
118
+ const statusPart = details.status !== undefined ? ` HTTP ${details.status}` : "";
119
+ const excerptPart = details.bodyExcerpt ? ` — ${details.bodyExcerpt}` : "";
120
+ return `provider ${providerId}/${model}: ${classification}${statusPart}${excerptPart}`;
121
+ }
122
+ /* v8 ignore start — module-level observability event */
123
+ (0, runtime_1.emitNervesEvent)({
124
+ component: "engine",
125
+ event: "engine.error_classification_loaded",
126
+ message: "shared provider error classification loaded",
127
+ meta: {},
128
+ });
129
+ /* v8 ignore stop */