@ouro.bot/cli 0.1.0-alpha.5 → 0.1.0-alpha.500

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 (380) hide show
  1. package/README.md +226 -183
  2. package/SerpentGuide.ouro/agent.json +82 -0
  3. package/SerpentGuide.ouro/psyche/SOUL.md +25 -0
  4. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +2 -2
  5. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  6. package/assets/ouroboros.png +0 -0
  7. package/changelog.json +3418 -0
  8. package/dist/arc/attention-types.js +8 -0
  9. package/dist/arc/cares.js +140 -0
  10. package/dist/arc/episodes.js +117 -0
  11. package/dist/arc/intentions.js +133 -0
  12. package/dist/arc/json-store.js +117 -0
  13. package/dist/arc/obligations.js +237 -0
  14. package/dist/arc/packets.js +193 -0
  15. package/dist/arc/presence.js +185 -0
  16. package/dist/arc/task-lifecycle.js +65 -0
  17. package/dist/heart/active-work.js +989 -0
  18. package/dist/heart/agent-entry.js +58 -3
  19. package/dist/heart/attachments/image-normalize.js +194 -0
  20. package/dist/heart/attachments/materialize.js +97 -0
  21. package/dist/heart/attachments/originals.js +88 -0
  22. package/dist/heart/attachments/render.js +29 -0
  23. package/dist/heart/attachments/sources/adapter.js +2 -0
  24. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  25. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  26. package/dist/heart/attachments/sources/index.js +16 -0
  27. package/dist/heart/attachments/store.js +103 -0
  28. package/dist/heart/attachments/types.js +93 -0
  29. package/dist/heart/auth/auth-flow.js +426 -0
  30. package/dist/heart/background-operations.js +281 -0
  31. package/dist/heart/bridges/manager.js +358 -0
  32. package/dist/heart/bridges/state-machine.js +135 -0
  33. package/dist/heart/bridges/store.js +123 -0
  34. package/dist/heart/bundle-state.js +168 -0
  35. package/dist/heart/commitments.js +111 -0
  36. package/dist/heart/config-registry.js +304 -0
  37. package/dist/heart/config.js +193 -130
  38. package/dist/heart/core.js +1010 -261
  39. package/dist/heart/cross-chat-delivery.js +131 -0
  40. package/dist/heart/daemon/agent-config-check.js +490 -0
  41. package/dist/heart/daemon/agent-discovery.js +157 -0
  42. package/dist/heart/daemon/agent-service.js +360 -0
  43. package/dist/heart/daemon/agentic-repair.js +216 -0
  44. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  45. package/dist/heart/daemon/cadence.js +70 -0
  46. package/dist/heart/daemon/cli-defaults.js +640 -0
  47. package/dist/heart/daemon/cli-exec.js +7239 -0
  48. package/dist/heart/daemon/cli-help.js +493 -0
  49. package/dist/heart/daemon/cli-parse.js +1533 -0
  50. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  51. package/dist/heart/daemon/cli-render.js +561 -0
  52. package/dist/heart/daemon/cli-types.js +8 -0
  53. package/dist/heart/daemon/connect-bay.js +323 -0
  54. package/dist/heart/daemon/daemon-cli.js +30 -697
  55. package/dist/heart/daemon/daemon-entry.js +359 -8
  56. package/dist/heart/daemon/daemon-health.js +141 -0
  57. package/dist/heart/daemon/daemon-runtime-sync.js +268 -0
  58. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  59. package/dist/heart/daemon/daemon.js +813 -19
  60. package/dist/heart/daemon/dns-workflow.js +394 -0
  61. package/dist/heart/daemon/doctor-types.js +8 -0
  62. package/dist/heart/daemon/doctor.js +615 -0
  63. package/dist/heart/daemon/health-monitor.js +92 -1
  64. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  65. package/dist/heart/daemon/hooks/bundle-meta.js +206 -0
  66. package/dist/heart/daemon/http-health-probe.js +80 -0
  67. package/dist/heart/daemon/human-command-screens.js +234 -0
  68. package/dist/heart/daemon/human-readiness.js +114 -0
  69. package/dist/heart/daemon/inner-status.js +89 -0
  70. package/dist/heart/daemon/interactive-repair.js +394 -0
  71. package/dist/heart/daemon/launchd.js +171 -0
  72. package/dist/heart/daemon/log-tailer.js +82 -12
  73. package/dist/heart/daemon/logs-prune.js +110 -0
  74. package/dist/heart/daemon/message-router.js +17 -8
  75. package/dist/heart/daemon/os-cron-deps.js +134 -0
  76. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  77. package/dist/heart/daemon/ouro-entry.js +3 -1
  78. package/dist/heart/daemon/process-manager.js +215 -1
  79. package/dist/heart/daemon/provider-discovery.js +137 -0
  80. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  81. package/dist/heart/daemon/pulse.js +475 -0
  82. package/dist/heart/daemon/readiness-repair.js +365 -0
  83. package/dist/heart/daemon/run-hooks.js +39 -0
  84. package/dist/heart/daemon/runtime-logging.js +67 -16
  85. package/dist/heart/daemon/runtime-metadata.js +191 -0
  86. package/dist/heart/daemon/runtime-mode.js +67 -0
  87. package/dist/heart/daemon/safe-mode.js +161 -0
  88. package/dist/heart/daemon/sense-manager.js +431 -0
  89. package/dist/heart/daemon/session-id-resolver.js +131 -0
  90. package/dist/heart/daemon/skill-management-installer.js +94 -0
  91. package/dist/heart/daemon/socket-client.js +307 -0
  92. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  93. package/dist/heart/daemon/startup-tui.js +264 -0
  94. package/dist/heart/daemon/task-scheduler.js +3 -25
  95. package/dist/heart/daemon/terminal-ui.js +499 -0
  96. package/dist/heart/daemon/thoughts.js +524 -0
  97. package/dist/heart/daemon/up-progress.js +366 -0
  98. package/dist/heart/daemon/vault-items.js +56 -0
  99. package/dist/heart/delegation.js +62 -0
  100. package/dist/heart/habits/habit-migration.js +189 -0
  101. package/dist/heart/habits/habit-parser.js +140 -0
  102. package/dist/heart/habits/habit-runtime-state.js +100 -0
  103. package/dist/heart/habits/habit-scheduler.js +372 -0
  104. package/dist/heart/{daemon → hatch}/hatch-animation.js +10 -3
  105. package/dist/heart/{daemon → hatch}/hatch-flow.js +54 -136
  106. package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
  107. package/dist/heart/hatch/specialist-orchestrator.js +129 -0
  108. package/dist/heart/hatch/specialist-prompt.js +102 -0
  109. package/dist/heart/hatch/specialist-tools.js +306 -0
  110. package/dist/heart/identity.js +274 -61
  111. package/dist/heart/kept-notes.js +357 -0
  112. package/dist/heart/kicks.js +2 -20
  113. package/dist/heart/machine-identity.js +161 -0
  114. package/dist/heart/mail-import-discovery.js +353 -0
  115. package/dist/heart/mcp/mcp-server.js +653 -0
  116. package/dist/heart/migrate-config.js +100 -0
  117. package/dist/heart/model-capabilities.js +59 -0
  118. package/dist/heart/outlook/outlook-http-hooks.js +66 -0
  119. package/dist/heart/outlook/outlook-http-response.js +7 -0
  120. package/dist/heart/outlook/outlook-http-routes.js +244 -0
  121. package/dist/heart/outlook/outlook-http-static.js +103 -0
  122. package/dist/heart/outlook/outlook-http-transport.js +116 -0
  123. package/dist/heart/outlook/outlook-http.js +99 -0
  124. package/dist/heart/outlook/outlook-read.js +31 -0
  125. package/dist/heart/outlook/outlook-types.js +27 -0
  126. package/dist/heart/outlook/outlook-view.js +195 -0
  127. package/dist/heart/outlook/readers/agent-machine.js +382 -0
  128. package/dist/heart/outlook/readers/continuity-readers.js +336 -0
  129. package/dist/heart/outlook/readers/mail.js +362 -0
  130. package/dist/heart/outlook/readers/runtime-readers.js +644 -0
  131. package/dist/heart/outlook/readers/sessions.js +232 -0
  132. package/dist/heart/outlook/readers/shared.js +111 -0
  133. package/dist/heart/platform.js +81 -0
  134. package/dist/heart/progress-story.js +42 -0
  135. package/dist/heart/provider-attempt.js +134 -0
  136. package/dist/heart/provider-binding-resolver.js +255 -0
  137. package/dist/heart/provider-credentials.js +424 -0
  138. package/dist/heart/provider-failover.js +301 -0
  139. package/dist/heart/provider-models.js +81 -0
  140. package/dist/heart/provider-ping.js +262 -0
  141. package/dist/heart/provider-state.js +216 -0
  142. package/dist/heart/provider-visibility.js +188 -0
  143. package/dist/heart/providers/anthropic-token.js +131 -0
  144. package/dist/heart/providers/anthropic.js +202 -50
  145. package/dist/heart/providers/azure.js +104 -13
  146. package/dist/heart/providers/error-classification.js +63 -0
  147. package/dist/heart/providers/github-copilot.js +145 -0
  148. package/dist/heart/providers/minimax-vlm.js +189 -0
  149. package/dist/heart/providers/minimax.js +29 -7
  150. package/dist/heart/providers/openai-codex.js +63 -39
  151. package/dist/heart/runtime-capability-check.js +170 -0
  152. package/dist/heart/runtime-credentials.js +260 -0
  153. package/dist/heart/sense-truth.js +68 -0
  154. package/dist/heart/session-activity.js +190 -0
  155. package/dist/heart/session-events.js +1089 -0
  156. package/dist/heart/session-playback-cli-main.js +5 -0
  157. package/dist/heart/session-playback-cli.js +36 -0
  158. package/dist/heart/session-playback.js +231 -0
  159. package/dist/heart/session-transcript.js +167 -0
  160. package/dist/heart/start-of-turn-packet.js +345 -0
  161. package/dist/heart/streaming.js +129 -34
  162. package/dist/heart/sync.js +332 -0
  163. package/dist/heart/target-resolution.js +127 -0
  164. package/dist/heart/tempo.js +93 -0
  165. package/dist/heart/temporal-view.js +41 -0
  166. package/dist/heart/tool-activity-callbacks.js +36 -0
  167. package/dist/heart/tool-description.js +135 -0
  168. package/dist/heart/tool-friction.js +55 -0
  169. package/dist/heart/tool-loop.js +200 -0
  170. package/dist/heart/turn-context.js +372 -0
  171. package/dist/heart/turn-coordinator.js +28 -0
  172. package/dist/heart/versioning/ouro-bot-global-installer.js +128 -0
  173. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  174. package/dist/heart/versioning/ouro-path-installer.js +425 -0
  175. package/dist/heart/{daemon → versioning}/ouro-uti.js +11 -2
  176. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  177. package/dist/heart/versioning/staged-restart.js +146 -0
  178. package/dist/heart/versioning/update-checker.js +115 -0
  179. package/dist/heart/versioning/update-hooks.js +142 -0
  180. package/dist/heart/versioning/wrapper-publish-guard.js +86 -0
  181. package/dist/mailroom/attention.js +167 -0
  182. package/dist/mailroom/autonomy.js +209 -0
  183. package/dist/mailroom/blob-store.js +606 -0
  184. package/dist/mailroom/core.js +672 -0
  185. package/dist/mailroom/entry.js +160 -0
  186. package/dist/mailroom/file-store.js +426 -0
  187. package/dist/mailroom/mbox-import.js +382 -0
  188. package/dist/mailroom/outbound.js +380 -0
  189. package/dist/mailroom/policy.js +263 -0
  190. package/dist/mailroom/reader.js +219 -0
  191. package/dist/mailroom/search-cache.js +182 -0
  192. package/dist/mailroom/search-relevance.js +319 -0
  193. package/dist/mailroom/smtp-ingress.js +176 -0
  194. package/dist/mailroom/source-state.js +176 -0
  195. package/dist/mailroom/thread.js +109 -0
  196. package/dist/mailroom/travel-extract.js +89 -0
  197. package/dist/mind/bundle-manifest.js +77 -1
  198. package/dist/mind/context.js +173 -94
  199. package/dist/mind/diary-integrity.js +60 -0
  200. package/dist/mind/{memory.js → diary.js} +84 -96
  201. package/dist/mind/embedding-provider.js +60 -0
  202. package/dist/mind/file-state.js +179 -0
  203. package/dist/mind/first-impressions.js +16 -2
  204. package/dist/mind/friends/channel.js +73 -0
  205. package/dist/mind/friends/group-context.js +144 -0
  206. package/dist/mind/friends/resolver.js +54 -2
  207. package/dist/mind/friends/store-file.js +58 -3
  208. package/dist/mind/friends/trust-explanation.js +74 -0
  209. package/dist/mind/friends/types.js +10 -2
  210. package/dist/mind/journal-index.js +161 -0
  211. package/dist/mind/note-search.js +268 -0
  212. package/dist/mind/obligation-steering.js +221 -0
  213. package/dist/mind/pending.js +76 -9
  214. package/dist/mind/phrases.js +1 -0
  215. package/dist/mind/prompt-refresh.js +3 -2
  216. package/dist/mind/prompt.js +1144 -117
  217. package/dist/mind/provenance-trust.js +26 -0
  218. package/dist/mind/scrutiny.js +173 -0
  219. package/dist/mind/token-estimate.js +8 -12
  220. package/dist/nerves/cli-logging.js +22 -3
  221. package/dist/nerves/coverage/audit-rules.js +15 -6
  222. package/dist/nerves/coverage/audit.js +28 -2
  223. package/dist/nerves/coverage/cli.js +1 -1
  224. package/dist/nerves/coverage/contract.js +5 -5
  225. package/dist/nerves/coverage/file-completeness.js +101 -5
  226. package/dist/nerves/coverage/run-artifacts.js +1 -1
  227. package/dist/nerves/event-buffer.js +111 -0
  228. package/dist/nerves/index.js +224 -4
  229. package/dist/nerves/observation.js +20 -0
  230. package/dist/nerves/redact.js +79 -0
  231. package/dist/nerves/runtime.js +5 -1
  232. package/dist/outlook-ui/assets/index-BPr5vNuM.css +1 -0
  233. package/dist/outlook-ui/assets/index-Cm51CY9W.js +61 -0
  234. package/dist/outlook-ui/index.html +15 -0
  235. package/dist/repertoire/ado-client.js +17 -56
  236. package/dist/repertoire/ado-semantic.js +11 -10
  237. package/dist/repertoire/api-client.js +97 -0
  238. package/dist/repertoire/bitwarden-store.js +774 -0
  239. package/dist/repertoire/bundle-templates.js +72 -0
  240. package/dist/repertoire/bw-installer.js +180 -0
  241. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  242. package/dist/repertoire/coding/context-pack.js +330 -0
  243. package/dist/repertoire/coding/feedback.js +301 -0
  244. package/dist/repertoire/coding/index.js +4 -1
  245. package/dist/repertoire/coding/manager.js +220 -13
  246. package/dist/repertoire/coding/spawner.js +58 -12
  247. package/dist/repertoire/coding/tools.js +209 -7
  248. package/dist/repertoire/commerce-errors.js +109 -0
  249. package/dist/repertoire/commerce-self-test.js +156 -0
  250. package/dist/repertoire/credential-access.js +111 -0
  251. package/dist/repertoire/data/ado-endpoints.json +188 -0
  252. package/dist/repertoire/duffel-client.js +185 -0
  253. package/dist/repertoire/github-client.js +14 -55
  254. package/dist/repertoire/graph-client.js +11 -52
  255. package/dist/repertoire/guardrails.js +396 -0
  256. package/dist/repertoire/mcp-client.js +255 -0
  257. package/dist/repertoire/mcp-manager.js +305 -0
  258. package/dist/repertoire/mcp-tools.js +63 -0
  259. package/dist/repertoire/shell-sessions.js +133 -0
  260. package/dist/repertoire/skills.js +15 -24
  261. package/dist/repertoire/stripe-client.js +131 -0
  262. package/dist/repertoire/tasks/board.js +43 -5
  263. package/dist/repertoire/tasks/fix.js +182 -0
  264. package/dist/repertoire/tasks/index.js +39 -13
  265. package/dist/repertoire/tasks/lifecycle.js +2 -2
  266. package/dist/repertoire/tasks/parser.js +3 -2
  267. package/dist/repertoire/tasks/scanner.js +194 -37
  268. package/dist/repertoire/tasks/transitions.js +16 -79
  269. package/dist/repertoire/tool-results.js +29 -0
  270. package/dist/repertoire/tools-attachments.js +317 -0
  271. package/dist/repertoire/tools-base.js +49 -707
  272. package/dist/repertoire/tools-bluebubbles.js +94 -0
  273. package/dist/repertoire/tools-bridge.js +141 -0
  274. package/dist/repertoire/tools-bundle.js +984 -0
  275. package/dist/repertoire/tools-config.js +185 -0
  276. package/dist/repertoire/tools-continuity.js +248 -0
  277. package/dist/repertoire/tools-credential.js +381 -0
  278. package/dist/repertoire/tools-files.js +342 -0
  279. package/dist/repertoire/tools-flight.js +224 -0
  280. package/dist/repertoire/tools-flow.js +105 -0
  281. package/dist/repertoire/tools-github.js +1 -7
  282. package/dist/repertoire/tools-mail.js +1377 -0
  283. package/dist/repertoire/tools-notes.js +376 -0
  284. package/dist/repertoire/tools-session.js +749 -0
  285. package/dist/repertoire/tools-shell.js +120 -0
  286. package/dist/repertoire/tools-stripe.js +180 -0
  287. package/dist/repertoire/tools-surface.js +243 -0
  288. package/dist/repertoire/tools-teams.js +64 -61
  289. package/dist/repertoire/tools-travel.js +125 -0
  290. package/dist/repertoire/tools-trip.js +356 -0
  291. package/dist/repertoire/tools-user-profile.js +144 -0
  292. package/dist/repertoire/tools-vault.js +40 -0
  293. package/dist/repertoire/tools.js +149 -98
  294. package/dist/repertoire/travel-api-client.js +360 -0
  295. package/dist/repertoire/user-profile.js +131 -0
  296. package/dist/repertoire/vault-setup.js +246 -0
  297. package/dist/repertoire/vault-unlock.js +561 -0
  298. package/dist/scripts/claude-code-hook.js +41 -0
  299. package/dist/scripts/claude-code-stop-hook.js +47 -0
  300. package/dist/senses/attention-queue.js +116 -0
  301. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  302. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  303. package/dist/senses/bluebubbles/client.js +685 -0
  304. package/dist/senses/bluebubbles/entry.js +73 -0
  305. package/dist/senses/bluebubbles/inbound-log.js +126 -0
  306. package/dist/senses/bluebubbles/index.js +1881 -0
  307. package/dist/senses/bluebubbles/media.js +389 -0
  308. package/dist/senses/bluebubbles/model.js +282 -0
  309. package/dist/senses/bluebubbles/mutation-log.js +116 -0
  310. package/dist/senses/bluebubbles/processed-log.js +111 -0
  311. package/dist/senses/bluebubbles/replay.js +129 -0
  312. package/dist/senses/bluebubbles/runtime-state.js +109 -0
  313. package/dist/senses/bluebubbles/session-cleanup.js +72 -0
  314. package/dist/senses/cli/bracketed-paste.js +82 -0
  315. package/dist/senses/cli/image-paste.js +287 -0
  316. package/dist/senses/cli/image-ref-navigation.js +75 -0
  317. package/dist/senses/cli/ink-app.js +156 -0
  318. package/dist/senses/cli/inline-diff.js +64 -0
  319. package/dist/senses/cli/input-keys.js +174 -0
  320. package/dist/senses/cli/kill-ring.js +86 -0
  321. package/dist/senses/cli/message-list.js +51 -0
  322. package/dist/senses/cli/ouro-tui.js +605 -0
  323. package/dist/senses/cli/spinner-imperative.js +135 -0
  324. package/dist/senses/cli/spinner.js +101 -0
  325. package/dist/senses/cli/status-line.js +60 -0
  326. package/dist/senses/cli/streaming-markdown.js +526 -0
  327. package/dist/senses/cli/tool-display.js +83 -0
  328. package/dist/senses/cli/tool-render.js +85 -0
  329. package/dist/senses/cli/tui-store.js +240 -0
  330. package/dist/senses/cli/virtual-list.js +35 -0
  331. package/dist/senses/cli-entry.js +60 -8
  332. package/dist/senses/cli-layout.js +187 -0
  333. package/dist/senses/cli.js +768 -264
  334. package/dist/senses/commands.js +66 -3
  335. package/dist/senses/continuity.js +94 -0
  336. package/dist/senses/habit-turn-message.js +108 -0
  337. package/dist/senses/inner-dialog-worker.js +199 -16
  338. package/dist/senses/inner-dialog.js +640 -91
  339. package/dist/senses/mail-entry.js +66 -0
  340. package/dist/senses/mail.js +379 -0
  341. package/dist/senses/pipeline.js +665 -0
  342. package/dist/senses/proactive-content-guard.js +51 -0
  343. package/dist/senses/shared-turn.js +248 -0
  344. package/dist/senses/surface-tool.js +68 -0
  345. package/dist/senses/teams-entry.js +60 -8
  346. package/dist/senses/teams.js +844 -197
  347. package/dist/senses/trust-gate.js +207 -2
  348. package/dist/trips/core.js +138 -0
  349. package/dist/trips/store.js +146 -0
  350. package/package.json +47 -6
  351. package/skills/agent-commerce.md +106 -0
  352. package/skills/browser-navigation.md +117 -0
  353. package/skills/commerce-setup-guide.md +116 -0
  354. package/skills/commerce-setup.md +84 -0
  355. package/skills/configure-dev-tools.md +101 -0
  356. package/skills/travel-planning.md +138 -0
  357. package/AdoptionSpecialist.ouro/agent.json +0 -20
  358. package/AdoptionSpecialist.ouro/psyche/SOUL.md +0 -22
  359. package/dist/heart/daemon/specialist-orchestrator.js +0 -160
  360. package/dist/heart/daemon/specialist-prompt.js +0 -40
  361. package/dist/heart/daemon/specialist-session.js +0 -142
  362. package/dist/heart/daemon/specialist-tools.js +0 -128
  363. package/dist/heart/daemon/subagent-installer.js +0 -125
  364. package/dist/inner-worker-entry.js +0 -4
  365. package/dist/mind/associative-recall.js +0 -197
  366. package/subagents/README.md +0 -73
  367. package/subagents/work-doer.md +0 -233
  368. package/subagents/work-merger.md +0 -624
  369. package/subagents/work-planner.md +0 -373
  370. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  371. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  372. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  373. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  374. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  375. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  376. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  377. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  378. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  379. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  380. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
@@ -1,19 +1,54 @@
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 });
39
+ exports.toAnthropicMessages = toAnthropicMessages;
40
+ exports.classifyAnthropicError = classifyAnthropicError;
6
41
  exports.createAnthropicProviderRuntime = createAnthropicProviderRuntime;
7
42
  const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
8
43
  const config_1 = require("../config");
9
44
  const identity_1 = require("../identity");
10
45
  const runtime_1 = require("../../nerves/runtime");
46
+ const streaming_1 = require("../streaming");
47
+ const model_capabilities_1 = require("../model-capabilities");
48
+ const error_classification_1 = require("./error-classification");
11
49
  const ANTHROPIC_SETUP_TOKEN_PREFIX = "sk-ant-oat01-";
12
50
  const ANTHROPIC_SETUP_TOKEN_MIN_LENGTH = 80;
13
51
  const ANTHROPIC_OAUTH_BETA_HEADER = "claude-code-20250219,oauth-2025-04-20,fine-grained-tool-streaming-2025-05-14,interleaved-thinking-2025-05-14";
14
- function getAnthropicSecretsPathForGuidance() {
15
- return (0, identity_1.getAgentSecretsPath)();
16
- }
17
52
  function getAnthropicAgentNameForGuidance() {
18
53
  return (0, identity_1.getAgentName)();
19
54
  }
@@ -21,10 +56,8 @@ function getAnthropicSetupTokenInstructions() {
21
56
  const agentName = getAnthropicAgentNameForGuidance();
22
57
  return [
23
58
  "Fix:",
24
- ` 1. Run \`npm run auth:claude-setup-token -- --agent ${agentName}\``,
25
- " (or run `claude setup-token` and paste the token manually)",
26
- ` 2. Open ${getAnthropicSecretsPathForGuidance()}`,
27
- " 3. Confirm providers.anthropic.setupToken is set",
59
+ ` 1. Run \`ouro auth --agent ${agentName} --provider anthropic\``,
60
+ " 2. After reauth, retry the failed ouro command or reconnect this session.",
28
61
  ].join("\n");
29
62
  }
30
63
  function getAnthropicReauthGuidance(reason) {
@@ -34,8 +67,7 @@ function getAnthropicReauthGuidance(reason) {
34
67
  getAnthropicSetupTokenInstructions(),
35
68
  ].join("\n");
36
69
  }
37
- function resolveAnthropicSetupTokenCredential() {
38
- const anthropicConfig = (0, config_1.getAnthropicConfig)();
70
+ function resolveAnthropicSetupTokenCredential(anthropicConfig) {
39
71
  const token = anthropicConfig.setupToken?.trim();
40
72
  if (!token) {
41
73
  throw new Error(getAnthropicReauthGuidance("Anthropic provider is selected but no setup-token credential was found."));
@@ -92,6 +124,18 @@ function toAnthropicMessages(messages) {
92
124
  if (msg.role === "assistant") {
93
125
  const assistant = msg;
94
126
  const blocks = [];
127
+ // Restore thinking blocks before text/tool_use blocks
128
+ const thinkingBlocks = assistant._thinking_blocks;
129
+ if (thinkingBlocks) {
130
+ for (const tb of thinkingBlocks) {
131
+ if (tb.type === "thinking") {
132
+ blocks.push({ type: "thinking", thinking: tb.thinking, signature: tb.signature });
133
+ }
134
+ else {
135
+ blocks.push({ type: "redacted_thinking", data: tb.data });
136
+ }
137
+ }
138
+ }
95
139
  const text = toAnthropicTextContent(assistant.content);
96
140
  if (text) {
97
141
  blocks.push({ type: "text", text });
@@ -172,52 +216,80 @@ function mergeAnthropicToolArguments(current, partial) {
172
216
  }
173
217
  return current + partial;
174
218
  }
219
+ function classifyAnthropicError(error) {
220
+ return (0, error_classification_1.classifyHttpError)(error, {
221
+ isAuthFailure: isAnthropicAuthFailure,
222
+ isServerError: (e) => e.status === 529,
223
+ });
224
+ }
175
225
  function isAnthropicAuthFailure(error) {
176
- if (!(error instanceof Error))
177
- return false;
178
- const status = error.status;
179
- if (status === 401 || status === 403)
180
- return true;
181
226
  const lower = error.message.toLowerCase();
182
227
  return (lower.includes("oauth authentication") ||
183
228
  lower.includes("authentication failed") ||
184
229
  lower.includes("unauthorized") ||
185
230
  lower.includes("invalid api key"));
186
231
  }
187
- function withAnthropicAuthGuidance(error) {
188
- const base = error instanceof Error ? error.message : String(error);
189
- if (isAnthropicAuthFailure(error)) {
190
- return new Error(getAnthropicReauthGuidance(`Anthropic authentication failed (${base}).`));
191
- }
192
- return error instanceof Error ? error : new Error(String(error));
193
- }
194
232
  async function streamAnthropicMessages(client, model, request) {
195
233
  const { system, messages } = toAnthropicMessages(request.messages);
196
234
  const anthropicTools = toAnthropicTools(request.activeTools);
235
+ const modelCaps = (0, model_capabilities_1.getModelCapabilities)(model);
236
+ const maxTokens = modelCaps.maxOutputTokens ?? 16384;
197
237
  const params = {
198
238
  model,
199
- max_tokens: 4096,
239
+ max_tokens: maxTokens,
200
240
  messages,
201
241
  stream: true,
242
+ thinking: { type: "adaptive" },
243
+ output_config: { effort: request.reasoningEffort ?? "medium" },
202
244
  };
203
- if (system)
204
- params.system = system;
245
+ // The Anthropic API requires a Claude Code identification block in the system
246
+ // prompt when using OAuth setup tokens (sk-ant-oat01). Without it, Opus/Sonnet
247
+ // 4.6 requests are rejected with 400. This is the API's validation that the
248
+ // token is being used by a Claude Code client.
249
+ const preambleText = "You are Claude Code, Anthropic's official CLI for Claude.";
250
+ if (request.systemPrompt) {
251
+ // Structured SystemPrompt: merge preamble + stable prefix into one cached block,
252
+ // volatile suffix as a separate uncached block.
253
+ const stableBlock = {
254
+ type: "text",
255
+ text: preambleText + "\n\n" + request.systemPrompt.stable,
256
+ cache_control: { type: "ephemeral" },
257
+ };
258
+ if (request.systemPrompt.volatile) {
259
+ params.system = [stableBlock, { type: "text", text: request.systemPrompt.volatile }];
260
+ }
261
+ else {
262
+ params.system = [stableBlock];
263
+ }
264
+ }
265
+ else if (system) {
266
+ // Fallback: no structured prompt, extract from messages (legacy path)
267
+ params.system = [{ type: "text", text: preambleText }, { type: "text", text: system }];
268
+ }
269
+ else {
270
+ params.system = [{ type: "text", text: preambleText }];
271
+ }
205
272
  if (anthropicTools.length > 0)
206
273
  params.tools = anthropicTools;
207
274
  if (request.toolChoiceRequired && anthropicTools.length > 0) {
208
- params.tool_choice = { type: "any" };
275
+ // Thinking (adaptive or enabled) only supports tool_choice "auto" or "none".
276
+ // "any" forces tool use which is incompatible with extended thinking.
277
+ params.tool_choice = params.thinking ? { type: "auto" } : /* v8 ignore next -- no-thinking path: thinking always set for 4.6 models @preserve */ { type: "any" };
209
278
  }
210
279
  let response;
211
280
  try {
212
281
  response = await client.messages.create(params, request.signal ? { signal: request.signal } : {});
213
282
  }
214
283
  catch (error) {
215
- throw withAnthropicAuthGuidance(error);
284
+ throw error instanceof Error ? error : new Error(String(error));
216
285
  }
217
286
  let content = "";
218
287
  let streamStarted = false;
219
288
  let usage;
220
289
  const toolCalls = new Map();
290
+ const thinkingBlocks = new Map();
291
+ const redactedBlocks = new Map();
292
+ const answerStreamer = new streaming_1.SettleStreamer(request.callbacks, request.eagerSettleStreaming);
221
293
  try {
222
294
  for await (const event of response) {
223
295
  if (request.signal?.aborted)
@@ -225,17 +297,29 @@ async function streamAnthropicMessages(client, model, request) {
225
297
  const eventType = String(event.type ?? "");
226
298
  if (eventType === "content_block_start") {
227
299
  const block = event.content_block;
228
- if (block?.type === "tool_use") {
229
- const index = Number(event.index);
300
+ const index = Number(event.index);
301
+ if (block?.type === "thinking") {
302
+ thinkingBlocks.set(index, { type: "thinking", thinking: "", signature: "" });
303
+ }
304
+ else if (block?.type === "redacted_thinking") {
305
+ redactedBlocks.set(index, { type: "redacted_thinking", data: String(block.data ?? "") });
306
+ }
307
+ else if (block?.type === "tool_use") {
230
308
  const rawInput = block.input;
231
309
  const input = rawInput && typeof rawInput === "object"
232
310
  ? JSON.stringify(rawInput)
233
311
  : "";
312
+ const name = String(block.name ?? "");
234
313
  toolCalls.set(index, {
235
314
  id: String(block.id ?? ""),
236
- name: String(block.name ?? ""),
315
+ name,
237
316
  arguments: input,
238
317
  });
318
+ // Activate eager streaming for sole settle tool call
319
+ /* v8 ignore next -- settle streaming activation, tested via SettleStreamer unit tests @preserve */
320
+ if (name === "settle" && toolCalls.size === 1) {
321
+ answerStreamer.activate();
322
+ }
239
323
  }
240
324
  continue;
241
325
  }
@@ -257,14 +341,31 @@ async function streamAnthropicMessages(client, model, request) {
257
341
  request.callbacks.onModelStreamStart();
258
342
  streamStarted = true;
259
343
  }
260
- request.callbacks.onReasoningChunk(String(delta?.thinking ?? ""));
344
+ const thinkingText = String(delta?.thinking ?? "");
345
+ request.callbacks.onReasoningChunk(thinkingText);
346
+ const thinkingIndex = Number(event.index);
347
+ const thinkingBlock = thinkingBlocks.get(thinkingIndex);
348
+ if (thinkingBlock)
349
+ thinkingBlock.thinking += thinkingText;
350
+ continue;
351
+ }
352
+ if (deltaType === "signature_delta") {
353
+ const sigIndex = Number(event.index);
354
+ const sigBlock = thinkingBlocks.get(sigIndex);
355
+ if (sigBlock)
356
+ sigBlock.signature += String(delta?.signature ?? "");
261
357
  continue;
262
358
  }
263
359
  if (deltaType === "input_json_delta") {
264
360
  const index = Number(event.index);
265
361
  const existing = toolCalls.get(index);
266
362
  if (existing) {
267
- existing.arguments = mergeAnthropicToolArguments(existing.arguments, String(delta?.partial_json ?? ""));
363
+ const partialJson = String(delta?.partial_json ?? "");
364
+ existing.arguments = mergeAnthropicToolArguments(existing.arguments, partialJson);
365
+ /* v8 ignore next -- settle delta streaming, tested via SettleStreamer unit tests @preserve */
366
+ if (existing.name === "settle" && toolCalls.size === 1) {
367
+ answerStreamer.processDelta(partialJson);
368
+ }
268
369
  }
269
370
  continue;
270
371
  }
@@ -286,47 +387,98 @@ async function streamAnthropicMessages(client, model, request) {
286
387
  }
287
388
  }
288
389
  catch (error) {
289
- throw withAnthropicAuthGuidance(error);
390
+ throw error instanceof Error ? error : /* v8 ignore next -- defensive: stream errors are always Error @preserve */ new Error(String(error));
290
391
  }
392
+ // Collect all thinking blocks (regular + redacted) sorted by index to preserve ordering
393
+ const allThinkingIndices = [...thinkingBlocks.keys(), ...redactedBlocks.keys()].sort((a, b) => a - b);
394
+ const outputItems = allThinkingIndices.map((idx) => {
395
+ const tb = thinkingBlocks.get(idx);
396
+ if (tb)
397
+ return tb;
398
+ return redactedBlocks.get(idx);
399
+ });
291
400
  return {
292
401
  content,
293
402
  toolCalls: [...toolCalls.values()],
294
- outputItems: [],
403
+ outputItems,
295
404
  usage,
405
+ settleStreamed: answerStreamer.streamed,
296
406
  };
297
407
  }
298
- function createAnthropicProviderRuntime() {
408
+ function createAnthropicProviderRuntime(model, anthropicConfig = (0, config_1.getAnthropicConfig)()) {
299
409
  (0, runtime_1.emitNervesEvent)({
300
410
  component: "engine",
301
411
  event: "engine.provider_init",
302
412
  message: "anthropic provider init",
303
413
  meta: { provider: "anthropic" },
304
414
  });
305
- const anthropicConfig = (0, config_1.getAnthropicConfig)();
306
- if (!(anthropicConfig.model && anthropicConfig.setupToken)) {
307
- throw new Error(getAnthropicReauthGuidance("provider 'anthropic' is selected in agent.json but providers.anthropic.model/setupToken is incomplete in secrets.json."));
415
+ if (!anthropicConfig.setupToken) {
416
+ throw new Error(getAnthropicReauthGuidance("provider 'anthropic' is selected but anthropic.setupToken is missing in the agent vault."));
308
417
  }
309
- const credential = resolveAnthropicSetupTokenCredential();
310
- const client = new sdk_1.default({
311
- authToken: credential.token,
312
- timeout: 30000,
313
- maxRetries: 0,
314
- defaultHeaders: {
315
- "anthropic-beta": ANTHROPIC_OAUTH_BETA_HEADER,
316
- },
317
- });
418
+ const modelCaps = (0, model_capabilities_1.getModelCapabilities)(model);
419
+ const capabilities = new Set();
420
+ if (modelCaps.reasoningEffort)
421
+ capabilities.add("reasoning-effort");
422
+ const credential = resolveAnthropicSetupTokenCredential(anthropicConfig);
423
+ const refreshToken = anthropicConfig.refreshToken;
424
+ const expiresAt = anthropicConfig.expiresAt;
425
+ function createClient(token) {
426
+ return new sdk_1.default({
427
+ authToken: token,
428
+ maxRetries: 0,
429
+ defaultHeaders: {
430
+ "anthropic-beta": ANTHROPIC_OAUTH_BETA_HEADER,
431
+ "anthropic-dangerous-direct-browser-access": "true",
432
+ "user-agent": "claude-cli/2.1.2 (external, cli)",
433
+ "x-app": "cli",
434
+ },
435
+ });
436
+ }
437
+ let currentToken = credential.token;
438
+ let client = createClient(currentToken);
439
+ /* v8 ignore start -- token refresh: dynamic import + ensureFreshToken, tested via integration @preserve */
440
+ async function ensureClient() {
441
+ try {
442
+ const { ensureFreshToken } = await Promise.resolve().then(() => __importStar(require("./anthropic-token")));
443
+ const { getAgentName } = await Promise.resolve().then(() => __importStar(require("../identity")));
444
+ const freshToken = await ensureFreshToken(currentToken, refreshToken, expiresAt, getAgentName());
445
+ if (freshToken !== currentToken) {
446
+ currentToken = freshToken;
447
+ client = createClient(freshToken);
448
+ }
449
+ }
450
+ catch {
451
+ // refresh failed — use existing client
452
+ }
453
+ return client;
454
+ }
455
+ /* v8 ignore stop */
318
456
  return {
319
457
  id: "anthropic",
320
- model: anthropicConfig.model,
321
- client,
458
+ model,
459
+ /* v8 ignore next -- getter: returns mutable client ref @preserve */
460
+ get client() { return client; },
461
+ capabilities,
462
+ supportedReasoningEfforts: modelCaps.reasoningEffort,
322
463
  resetTurnState(_messages) {
323
464
  // Anthropic request payload is derived from canonical messages each turn.
324
465
  },
325
466
  appendToolOutput(_callId, _output) {
326
467
  // Anthropic uses canonical messages for tool_result tracking.
327
468
  },
328
- streamTurn(request) {
329
- return streamAnthropicMessages(client, anthropicConfig.model, request);
469
+ async streamTurn(request) {
470
+ const freshClient = await ensureClient();
471
+ return streamAnthropicMessages(freshClient, model, request);
472
+ },
473
+ /* v8 ignore start -- ping: tested via provider-ping.test.ts @preserve */
474
+ async ping(signal) {
475
+ const freshClient = await ensureClient();
476
+ 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" } });
477
+ },
478
+ /* v8 ignore stop */
479
+ /* v8 ignore next 3 -- delegation: classification logic tested via classifyAnthropicError @preserve */
480
+ classifyError(error) {
481
+ return classifyAnthropicError(error);
330
482
  },
331
483
  };
332
484
  }
@@ -1,35 +1,117 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.classifyAzureError = classifyAzureError;
37
+ exports.createAzureTokenProvider = createAzureTokenProvider;
3
38
  exports.createAzureProviderRuntime = createAzureProviderRuntime;
4
39
  const openai_1 = require("openai");
5
40
  const config_1 = require("../config");
6
41
  const runtime_1 = require("../../nerves/runtime");
7
42
  const streaming_1 = require("../streaming");
8
- function createAzureProviderRuntime() {
43
+ const model_capabilities_1 = require("../model-capabilities");
44
+ const error_classification_1 = require("./error-classification");
45
+ const COGNITIVE_SERVICES_SCOPE = "https://cognitiveservices.azure.com/.default";
46
+ function classifyAzureError(error) {
47
+ return (0, error_classification_1.classifyHttpError)(error);
48
+ }
49
+ // @azure/identity is imported dynamically (below) rather than at the top level
50
+ // because it's a heavy package (~30+ transitive deps) and we only need it when
51
+ // using the managed-identity auth path. API-key users and other providers
52
+ // shouldn't pay the cold-start cost.
53
+ function createAzureTokenProvider(managedIdentityClientId) {
54
+ let credential = null;
55
+ return async () => {
56
+ try {
57
+ if (!credential) {
58
+ const { DefaultAzureCredential } = await Promise.resolve().then(() => __importStar(require("@azure/identity")));
59
+ const credentialOptions = managedIdentityClientId
60
+ ? { managedIdentityClientId }
61
+ : undefined;
62
+ credential = new DefaultAzureCredential(credentialOptions);
63
+ }
64
+ const tokenResponse = await credential.getToken(COGNITIVE_SERVICES_SCOPE);
65
+ return tokenResponse.token;
66
+ }
67
+ catch (err) {
68
+ const detail = err instanceof Error ? err.message : String(err);
69
+ throw new Error(`Azure OpenAI authentication failed: ${detail}\n` +
70
+ "To fix this, either:\n" +
71
+ " 1. Run `ouro auth --agent <agent> --provider azure`, or\n" +
72
+ " 2. Run 'az login' to authenticate with your Azure account (for local dev), or\n" +
73
+ " 3. Attach a managed identity to your App Service and store azure.managedIdentityClientId in the agent vault.");
74
+ }
75
+ };
76
+ }
77
+ function createAzureProviderRuntime(model, azureConfig = (0, config_1.getAzureConfig)()) {
78
+ const useApiKey = !!azureConfig.apiKey;
79
+ const authMethod = useApiKey ? "key" : "managed-identity";
9
80
  (0, runtime_1.emitNervesEvent)({
10
81
  component: "engine",
11
82
  event: "engine.provider_init",
12
83
  message: "azure provider init",
13
- meta: { provider: "azure" },
84
+ meta: { provider: "azure", authMethod },
14
85
  });
15
- const azureConfig = (0, config_1.getAzureConfig)();
16
- if (!(azureConfig.apiKey && azureConfig.endpoint && azureConfig.deployment && azureConfig.modelName)) {
17
- 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`.");
18
88
  }
19
- const client = new openai_1.AzureOpenAI({
20
- apiKey: azureConfig.apiKey,
89
+ const modelCaps = (0, model_capabilities_1.getModelCapabilities)(model);
90
+ const capabilities = new Set();
91
+ if (modelCaps.reasoningEffort)
92
+ capabilities.add("reasoning-effort");
93
+ const clientOptions = {
21
94
  endpoint: azureConfig.endpoint.replace(/\/openai.*$/, ""),
22
95
  deployment: azureConfig.deployment,
23
96
  apiVersion: azureConfig.apiVersion,
24
- timeout: 30000,
25
97
  maxRetries: 0,
26
- });
98
+ };
99
+ if (useApiKey) {
100
+ clientOptions.apiKey = azureConfig.apiKey;
101
+ }
102
+ else {
103
+ const managedIdentityClientId = azureConfig.managedIdentityClientId || undefined;
104
+ clientOptions.azureADTokenProvider = createAzureTokenProvider(managedIdentityClientId);
105
+ }
106
+ const client = new openai_1.AzureOpenAI(clientOptions);
27
107
  let nativeInput = null;
28
108
  let nativeInstructions = "";
29
109
  return {
30
110
  id: "azure",
31
- model: azureConfig.modelName,
111
+ model,
32
112
  client,
113
+ capabilities,
114
+ supportedReasoningEfforts: modelCaps.reasoningEffort,
33
115
  resetTurnState(messages) {
34
116
  const { instructions, input } = (0, streaming_1.toResponsesInput)(messages);
35
117
  nativeInput = input;
@@ -38,7 +120,7 @@ function createAzureProviderRuntime() {
38
120
  appendToolOutput(callId, output) {
39
121
  if (!nativeInput)
40
122
  return;
41
- 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) });
42
124
  },
43
125
  async streamTurn(request) {
44
126
  if (!nativeInput)
@@ -48,7 +130,7 @@ function createAzureProviderRuntime() {
48
130
  input: nativeInput,
49
131
  instructions: nativeInstructions,
50
132
  tools: (0, streaming_1.toResponsesTools)(request.activeTools),
51
- reasoning: { effort: "medium", summary: "detailed" },
133
+ reasoning: { effort: request.reasoningEffort ?? "medium", summary: "detailed" },
52
134
  stream: true,
53
135
  store: false,
54
136
  include: ["reasoning.encrypted_content"],
@@ -57,10 +139,19 @@ function createAzureProviderRuntime() {
57
139
  params.metadata = { trace_id: request.traceId };
58
140
  if (request.toolChoiceRequired)
59
141
  params.tool_choice = "required";
60
- 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);
61
143
  for (const item of result.outputItems)
62
144
  nativeInput.push(item);
63
145
  return result;
64
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
+ },
65
156
  };
66
157
  }
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isNetworkError = isNetworkError;
4
+ exports.classifyHttpError = classifyHttpError;
5
+ const runtime_1 = require("../../nerves/runtime");
6
+ // Node socket / DNS error codes that indicate a transient network failure.
7
+ const NETWORK_ERROR_CODES = new Set([
8
+ "ECONNRESET",
9
+ "ECONNREFUSED",
10
+ "ENOTFOUND",
11
+ "ETIMEDOUT",
12
+ "EPIPE",
13
+ "EAI_AGAIN",
14
+ "EHOSTUNREACH",
15
+ "ENETUNREACH",
16
+ "ECONNABORTED",
17
+ ]);
18
+ // Substrings the OpenAI/Anthropic SDKs use when wrapping fetch/socket failures
19
+ // into Error.message instead of an err.code.
20
+ const NETWORK_ERROR_MESSAGE_PATTERNS = [
21
+ "fetch failed",
22
+ "socket hang up",
23
+ "getaddrinfo",
24
+ "request timed out", // OpenAI SDK timeout — see SDK source
25
+ "request timeout",
26
+ "connection error",
27
+ ];
28
+ // True if the error looks like a transient network issue (no HTTP status, just
29
+ // a socket/DNS/timeout failure from the underlying transport).
30
+ function isNetworkError(error) {
31
+ const code = error.code || "";
32
+ if (NETWORK_ERROR_CODES.has(code))
33
+ return true;
34
+ const msg = (error.message || "").toLowerCase();
35
+ return NETWORK_ERROR_MESSAGE_PATTERNS.some((pat) => msg.includes(pat));
36
+ }
37
+ // Standard HTTP error → ProviderErrorClassification mapping. Providers wrap
38
+ // this with their own overrides.
39
+ function classifyHttpError(error, overrides) {
40
+ const status = error.status;
41
+ if (overrides?.isAuthFailure?.(error) || status === 401 || status === 403) {
42
+ return "auth-failure";
43
+ }
44
+ if (status === 429) {
45
+ if (overrides?.isUsageLimit?.(error))
46
+ return "usage-limit";
47
+ return "rate-limit";
48
+ }
49
+ if (overrides?.isServerError?.(error) || (status !== undefined && status >= 500)) {
50
+ return "server-error";
51
+ }
52
+ if (isNetworkError(error))
53
+ return "network-error";
54
+ return "unknown";
55
+ }
56
+ /* v8 ignore start — module-level observability event */
57
+ (0, runtime_1.emitNervesEvent)({
58
+ component: "engine",
59
+ event: "engine.error_classification_loaded",
60
+ message: "shared provider error classification loaded",
61
+ meta: {},
62
+ });
63
+ /* v8 ignore stop */