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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (392) hide show
  1. package/README.md +127 -23
  2. package/RepairGuide.ouro/agent.json +5 -0
  3. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  4. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  5. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  6. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  7. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  8. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  9. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  12. package/changelog.json +3596 -0
  13. package/dist/arc/attention-types.js +8 -0
  14. package/dist/arc/cares.js +140 -0
  15. package/dist/arc/episodes.js +117 -0
  16. package/dist/arc/intentions.js +133 -0
  17. package/dist/arc/json-store.js +117 -0
  18. package/dist/arc/obligations.js +237 -0
  19. package/dist/arc/packets.js +193 -0
  20. package/dist/arc/presence.js +185 -0
  21. package/dist/arc/task-lifecycle.js +65 -0
  22. package/dist/heart/active-work.js +837 -26
  23. package/dist/heart/agent-entry.js +58 -3
  24. package/dist/heart/attachments/image-normalize.js +194 -0
  25. package/dist/heart/attachments/materialize.js +97 -0
  26. package/dist/heart/attachments/originals.js +88 -0
  27. package/dist/heart/attachments/render.js +29 -0
  28. package/dist/heart/attachments/sources/adapter.js +2 -0
  29. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  30. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  31. package/dist/heart/attachments/sources/index.js +16 -0
  32. package/dist/heart/attachments/store.js +103 -0
  33. package/dist/heart/attachments/types.js +93 -0
  34. package/dist/heart/auth/auth-flow.js +479 -0
  35. package/dist/heart/background-operations.js +281 -0
  36. package/dist/heart/bundle-state.js +168 -0
  37. package/dist/heart/commitments.js +111 -0
  38. package/dist/heart/config-registry.js +322 -0
  39. package/dist/heart/config.js +114 -118
  40. package/dist/heart/core.js +913 -246
  41. package/dist/heart/cross-chat-delivery.js +3 -18
  42. package/dist/heart/daemon/agent-config-check.js +419 -0
  43. package/dist/heart/daemon/agent-discovery.js +102 -3
  44. package/dist/heart/daemon/agent-service.js +522 -0
  45. package/dist/heart/daemon/agentic-repair.js +547 -0
  46. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  47. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  48. package/dist/heart/daemon/cadence.js +70 -0
  49. package/dist/heart/daemon/cli-defaults.js +776 -0
  50. package/dist/heart/daemon/cli-exec.js +7457 -0
  51. package/dist/heart/daemon/cli-help.js +498 -0
  52. package/dist/heart/daemon/cli-parse.js +1592 -0
  53. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  54. package/dist/heart/daemon/cli-render.js +763 -0
  55. package/dist/heart/daemon/cli-types.js +8 -0
  56. package/dist/heart/daemon/connect-bay.js +323 -0
  57. package/dist/heart/daemon/daemon-cli.js +29 -1698
  58. package/dist/heart/daemon/daemon-entry.js +387 -2
  59. package/dist/heart/daemon/daemon-health.js +176 -0
  60. package/dist/heart/daemon/daemon-rollup.js +57 -0
  61. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  62. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  63. package/dist/heart/daemon/daemon.js +796 -71
  64. package/dist/heart/daemon/dns-workflow.js +394 -0
  65. package/dist/heart/daemon/doctor-types.js +8 -0
  66. package/dist/heart/daemon/doctor.js +826 -0
  67. package/dist/heart/daemon/health-monitor.js +122 -1
  68. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  69. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  70. package/dist/heart/daemon/http-health-probe.js +80 -0
  71. package/dist/heart/daemon/human-command-screens.js +234 -0
  72. package/dist/heart/daemon/human-readiness.js +114 -0
  73. package/dist/heart/daemon/inner-status.js +89 -0
  74. package/dist/heart/daemon/interactive-repair.js +394 -0
  75. package/dist/heart/daemon/launchd.js +37 -8
  76. package/dist/heart/daemon/log-tailer.js +82 -12
  77. package/dist/heart/daemon/logs-prune.js +110 -0
  78. package/dist/heart/daemon/mcp-canary.js +297 -0
  79. package/dist/heart/daemon/message-router.js +2 -2
  80. package/dist/heart/daemon/os-cron-deps.js +135 -0
  81. package/dist/heart/daemon/os-cron.js +14 -12
  82. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  83. package/dist/heart/daemon/ouro-entry.js +3 -1
  84. package/dist/heart/daemon/process-manager.js +375 -33
  85. package/dist/heart/daemon/provider-discovery.js +137 -0
  86. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  87. package/dist/heart/daemon/pulse.js +475 -0
  88. package/dist/heart/daemon/readiness-repair.js +365 -0
  89. package/dist/heart/daemon/run-hooks.js +2 -0
  90. package/dist/heart/daemon/runtime-logging.js +67 -16
  91. package/dist/heart/daemon/runtime-metadata.js +3 -31
  92. package/dist/heart/daemon/safe-mode.js +161 -0
  93. package/dist/heart/daemon/sense-manager.js +389 -38
  94. package/dist/heart/daemon/session-id-resolver.js +131 -0
  95. package/dist/heart/daemon/skill-management-installer.js +94 -0
  96. package/dist/heart/daemon/socket-client.js +158 -11
  97. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  98. package/dist/heart/daemon/startup-tui.js +330 -0
  99. package/dist/heart/daemon/task-scheduler.js +3 -25
  100. package/dist/heart/daemon/terminal-ui.js +499 -0
  101. package/dist/heart/daemon/thoughts.js +162 -17
  102. package/dist/heart/daemon/up-progress.js +366 -0
  103. package/dist/heart/daemon/vault-items.js +56 -0
  104. package/dist/heart/delegation.js +1 -1
  105. package/dist/heart/habits/habit-migration.js +189 -0
  106. package/dist/heart/habits/habit-parser.js +140 -0
  107. package/dist/heart/habits/habit-runtime-state.js +100 -0
  108. package/dist/heart/habits/habit-scheduler.js +372 -0
  109. package/dist/heart/{daemon → hatch}/hatch-flow.js +32 -56
  110. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  111. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  112. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  113. package/dist/heart/identity.js +203 -57
  114. package/dist/heart/kept-notes.js +357 -0
  115. package/dist/heart/kicks.js +1 -1
  116. package/dist/heart/machine-identity.js +161 -0
  117. package/dist/heart/mail-import-discovery.js +353 -0
  118. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  119. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  120. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  121. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  122. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  123. package/dist/heart/mailbox/mailbox-http.js +99 -0
  124. package/dist/heart/mailbox/mailbox-read.js +31 -0
  125. package/dist/heart/mailbox/mailbox-types.js +27 -0
  126. package/dist/heart/mailbox/mailbox-view.js +195 -0
  127. package/dist/heart/mailbox/readers/agent-machine.js +382 -0
  128. package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
  129. package/dist/heart/mailbox/readers/mail.js +362 -0
  130. package/dist/heart/mailbox/readers/runtime-readers.js +651 -0
  131. package/dist/heart/mailbox/readers/sessions.js +232 -0
  132. package/dist/heart/mailbox/readers/shared.js +111 -0
  133. package/dist/heart/mcp/mcp-server.js +683 -0
  134. package/dist/heart/migrate-config.js +100 -0
  135. package/dist/heart/model-capabilities.js +19 -0
  136. package/dist/heart/platform.js +81 -0
  137. package/dist/heart/provider-attempt.js +134 -0
  138. package/dist/heart/provider-binding-resolver.js +267 -0
  139. package/dist/heart/provider-credentials.js +425 -0
  140. package/dist/heart/provider-failover.js +301 -0
  141. package/dist/heart/provider-models.js +81 -0
  142. package/dist/heart/provider-ping.js +262 -0
  143. package/dist/heart/provider-readiness-cache.js +40 -0
  144. package/dist/heart/provider-visibility.js +188 -0
  145. package/dist/heart/providers/anthropic-token.js +131 -0
  146. package/dist/heart/providers/anthropic.js +139 -52
  147. package/dist/heart/providers/azure.js +97 -13
  148. package/dist/heart/providers/error-classification.js +127 -0
  149. package/dist/heart/providers/github-copilot.js +145 -0
  150. package/dist/heart/providers/minimax-vlm.js +189 -0
  151. package/dist/heart/providers/minimax.js +26 -8
  152. package/dist/heart/providers/openai-codex.js +55 -40
  153. package/dist/heart/runtime-capability-check.js +170 -0
  154. package/dist/heart/runtime-credentials.js +367 -0
  155. package/dist/heart/runtime-cwd.js +87 -0
  156. package/dist/heart/sense-truth.js +13 -4
  157. package/dist/heart/session-activity.js +43 -22
  158. package/dist/heart/session-events.js +1149 -0
  159. package/dist/heart/session-playback-cli-main.js +5 -0
  160. package/dist/heart/session-playback-cli.js +36 -0
  161. package/dist/heart/session-playback.js +231 -0
  162. package/dist/heart/session-stats-cli-main.js +5 -0
  163. package/dist/heart/session-stats.js +182 -0
  164. package/dist/heart/session-transcript.js +243 -0
  165. package/dist/heart/start-of-turn-packet.js +345 -0
  166. package/dist/heart/streaming.js +44 -27
  167. package/dist/heart/sync-classification.js +176 -0
  168. package/dist/heart/sync.js +449 -0
  169. package/dist/heart/target-resolution.js +9 -5
  170. package/dist/heart/tempo.js +93 -0
  171. package/dist/heart/temporal-view.js +41 -0
  172. package/dist/heart/timeouts.js +101 -0
  173. package/dist/heart/tool-activity-callbacks.js +59 -0
  174. package/dist/heart/tool-description.js +139 -0
  175. package/dist/heart/tool-friction.js +55 -0
  176. package/dist/heart/tool-loop.js +200 -0
  177. package/dist/heart/turn-context.js +389 -0
  178. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  179. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  180. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  181. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  182. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  183. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  184. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  185. package/dist/mailbox-ui/assets/index-B-461hes.js +61 -0
  186. package/dist/mailbox-ui/assets/index-BPr5vNuM.css +1 -0
  187. package/dist/mailbox-ui/index.html +15 -0
  188. package/dist/mailroom/attention.js +167 -0
  189. package/dist/mailroom/autonomy.js +209 -0
  190. package/dist/mailroom/blob-store.js +674 -0
  191. package/dist/mailroom/body-cache.js +61 -0
  192. package/dist/mailroom/core.js +720 -0
  193. package/dist/mailroom/entry.js +160 -0
  194. package/dist/mailroom/file-store.js +430 -0
  195. package/dist/mailroom/mbox-import.js +383 -0
  196. package/dist/mailroom/outbound.js +380 -0
  197. package/dist/mailroom/policy.js +263 -0
  198. package/dist/mailroom/reader.js +233 -0
  199. package/dist/mailroom/search-cache.js +256 -0
  200. package/dist/mailroom/search-relevance.js +319 -0
  201. package/dist/mailroom/smtp-ingress.js +176 -0
  202. package/dist/mailroom/source-state.js +176 -0
  203. package/dist/mailroom/thread.js +109 -0
  204. package/dist/mailroom/travel-extract.js +89 -0
  205. package/dist/mind/bundle-manifest.js +7 -1
  206. package/dist/mind/context.js +165 -101
  207. package/dist/mind/diary-integrity.js +60 -0
  208. package/dist/mind/{memory.js → diary.js} +62 -75
  209. package/dist/mind/embedding-provider.js +60 -0
  210. package/dist/mind/file-state.js +179 -0
  211. package/dist/mind/friends/channel.js +39 -0
  212. package/dist/mind/friends/resolver.js +54 -2
  213. package/dist/mind/friends/store-file.js +39 -3
  214. package/dist/mind/friends/types.js +2 -2
  215. package/dist/mind/journal-index.js +161 -0
  216. package/dist/mind/note-search.js +268 -0
  217. package/dist/mind/obligation-steering.js +221 -0
  218. package/dist/mind/pending.js +4 -0
  219. package/dist/mind/prompt-refresh.js +3 -2
  220. package/dist/mind/prompt.js +1011 -123
  221. package/dist/mind/provenance-trust.js +26 -0
  222. package/dist/mind/scrutiny.js +173 -0
  223. package/dist/nerves/cli-logging.js +7 -1
  224. package/dist/nerves/coverage/audit-rules.js +15 -6
  225. package/dist/nerves/coverage/audit.js +28 -2
  226. package/dist/nerves/coverage/cli.js +1 -1
  227. package/dist/nerves/coverage/contract.js +5 -5
  228. package/dist/nerves/coverage/file-completeness.js +129 -5
  229. package/dist/nerves/coverage/run-artifacts.js +1 -1
  230. package/dist/nerves/event-buffer.js +111 -0
  231. package/dist/nerves/index.js +224 -4
  232. package/dist/nerves/observation.js +20 -0
  233. package/dist/nerves/redact.js +79 -0
  234. package/dist/nerves/review/cli-main.js +5 -0
  235. package/dist/nerves/review/cli.js +156 -0
  236. package/dist/nerves/review/core.js +152 -0
  237. package/dist/nerves/runtime.js +5 -1
  238. package/dist/repertoire/ado-client.js +15 -56
  239. package/dist/repertoire/ado-semantic.js +11 -10
  240. package/dist/repertoire/api-client.js +97 -0
  241. package/dist/repertoire/bitwarden-store.js +963 -0
  242. package/dist/repertoire/bundle-templates.js +72 -0
  243. package/dist/repertoire/bw-installer.js +180 -0
  244. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  245. package/dist/repertoire/coding/context-pack.js +330 -0
  246. package/dist/repertoire/coding/feedback.js +197 -30
  247. package/dist/repertoire/coding/manager.js +158 -9
  248. package/dist/repertoire/coding/spawner.js +55 -9
  249. package/dist/repertoire/coding/tools.js +170 -7
  250. package/dist/repertoire/commerce-errors.js +109 -0
  251. package/dist/repertoire/commerce-self-test.js +156 -0
  252. package/dist/repertoire/credential-access.js +178 -0
  253. package/dist/repertoire/duffel-client.js +185 -0
  254. package/dist/repertoire/github-client.js +14 -55
  255. package/dist/repertoire/graph-client.js +11 -52
  256. package/dist/repertoire/guardrails.js +396 -0
  257. package/dist/repertoire/mcp-client.js +295 -0
  258. package/dist/repertoire/mcp-manager.js +362 -0
  259. package/dist/repertoire/mcp-tools.js +63 -0
  260. package/dist/repertoire/shell-sessions.js +133 -0
  261. package/dist/repertoire/skills.js +15 -24
  262. package/dist/repertoire/stripe-client.js +131 -0
  263. package/dist/repertoire/tasks/board.js +31 -5
  264. package/dist/repertoire/tasks/fix.js +182 -0
  265. package/dist/repertoire/tasks/index.js +16 -4
  266. package/dist/repertoire/tasks/lifecycle.js +2 -2
  267. package/dist/repertoire/tasks/parser.js +3 -2
  268. package/dist/repertoire/tasks/scanner.js +194 -37
  269. package/dist/repertoire/tasks/transitions.js +16 -78
  270. package/dist/repertoire/tool-results.js +29 -0
  271. package/dist/repertoire/tools-attachments.js +317 -0
  272. package/dist/repertoire/tools-base.js +47 -1075
  273. package/dist/repertoire/tools-bluebubbles.js +1 -0
  274. package/dist/repertoire/tools-bridge.js +142 -0
  275. package/dist/repertoire/tools-bundle.js +984 -0
  276. package/dist/repertoire/tools-config.js +185 -0
  277. package/dist/repertoire/tools-continuity.js +248 -0
  278. package/dist/repertoire/tools-credential.js +381 -0
  279. package/dist/repertoire/tools-files.js +342 -0
  280. package/dist/repertoire/tools-flight.js +224 -0
  281. package/dist/repertoire/tools-flow.js +119 -0
  282. package/dist/repertoire/tools-github.js +1 -7
  283. package/dist/repertoire/tools-mail.js +1857 -0
  284. package/dist/repertoire/tools-notes.js +421 -0
  285. package/dist/repertoire/tools-session.js +750 -0
  286. package/dist/repertoire/tools-shell.js +120 -0
  287. package/dist/repertoire/tools-stripe.js +180 -0
  288. package/dist/repertoire/tools-surface.js +243 -0
  289. package/dist/repertoire/tools-teams.js +9 -39
  290. package/dist/repertoire/tools-travel.js +125 -0
  291. package/dist/repertoire/tools-trip.js +604 -0
  292. package/dist/repertoire/tools-user-profile.js +144 -0
  293. package/dist/repertoire/tools-vault.js +40 -0
  294. package/dist/repertoire/tools.js +108 -100
  295. package/dist/repertoire/travel-api-client.js +360 -0
  296. package/dist/repertoire/user-profile.js +131 -0
  297. package/dist/repertoire/vault-setup.js +246 -0
  298. package/dist/repertoire/vault-unlock.js +594 -0
  299. package/dist/scripts/claude-code-hook.js +41 -0
  300. package/dist/scripts/claude-code-stop-hook.js +47 -0
  301. package/dist/senses/attention-queue.js +116 -0
  302. package/dist/senses/bluebubbles/active-turns.js +216 -0
  303. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  304. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  305. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  306. package/dist/senses/bluebubbles/entry.js +77 -0
  307. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  308. package/dist/senses/bluebubbles/index.js +2305 -0
  309. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  310. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  311. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  312. package/dist/senses/bluebubbles/processed-log.js +133 -0
  313. package/dist/senses/bluebubbles/replay.js +137 -0
  314. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  315. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  316. package/dist/senses/cli/bracketed-paste.js +82 -0
  317. package/dist/senses/cli/image-paste.js +287 -0
  318. package/dist/senses/cli/image-ref-navigation.js +75 -0
  319. package/dist/senses/cli/ink-app.js +156 -0
  320. package/dist/senses/cli/inline-diff.js +64 -0
  321. package/dist/senses/cli/input-keys.js +174 -0
  322. package/dist/senses/cli/kill-ring.js +86 -0
  323. package/dist/senses/cli/message-list.js +51 -0
  324. package/dist/senses/cli/ouro-tui.js +607 -0
  325. package/dist/senses/cli/spinner-imperative.js +135 -0
  326. package/dist/senses/cli/spinner.js +101 -0
  327. package/dist/senses/cli/status-line.js +60 -0
  328. package/dist/senses/cli/streaming-markdown.js +526 -0
  329. package/dist/senses/cli/tool-display.js +85 -0
  330. package/dist/senses/cli/tool-render.js +85 -0
  331. package/dist/senses/cli/tui-store.js +240 -0
  332. package/dist/senses/cli/virtual-list.js +35 -0
  333. package/dist/senses/cli-entry.js +60 -8
  334. package/dist/senses/cli-layout.js +187 -0
  335. package/dist/senses/cli.js +520 -209
  336. package/dist/senses/commands.js +66 -3
  337. package/dist/senses/habit-turn-message.js +108 -0
  338. package/dist/senses/inner-dialog-worker.js +175 -21
  339. package/dist/senses/inner-dialog.js +330 -27
  340. package/dist/senses/mail-entry.js +66 -0
  341. package/dist/senses/mail.js +379 -0
  342. package/dist/senses/pipeline.js +549 -181
  343. package/dist/senses/proactive-content-guard.js +51 -0
  344. package/dist/senses/shared-turn.js +248 -0
  345. package/dist/senses/surface-tool.js +68 -0
  346. package/dist/senses/teams-entry.js +60 -8
  347. package/dist/senses/teams.js +387 -98
  348. package/dist/senses/trust-gate.js +100 -5
  349. package/dist/senses/voice/elevenlabs.js +125 -0
  350. package/dist/senses/voice/index.js +22 -0
  351. package/dist/senses/voice/transcript.js +70 -0
  352. package/dist/senses/voice/turn.js +85 -0
  353. package/dist/senses/voice/types.js +2 -0
  354. package/dist/senses/voice/whisper.js +133 -0
  355. package/dist/senses/voice-entry.js +80 -0
  356. package/dist/trips/core.js +138 -0
  357. package/dist/trips/store.js +146 -0
  358. package/package.json +38 -7
  359. package/skills/agent-commerce.md +106 -0
  360. package/skills/browser-navigation.md +117 -0
  361. package/skills/commerce-setup-guide.md +116 -0
  362. package/skills/commerce-setup.md +84 -0
  363. package/skills/configure-dev-tools.md +101 -0
  364. package/skills/travel-planning.md +138 -0
  365. package/dist/heart/daemon/auth-flow.js +0 -351
  366. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  367. package/dist/heart/daemon/subagent-installer.js +0 -166
  368. package/dist/heart/session-recall.js +0 -116
  369. package/dist/mind/associative-recall.js +0 -209
  370. package/dist/senses/bluebubbles-entry.js +0 -13
  371. package/dist/senses/bluebubbles.js +0 -1177
  372. package/dist/senses/debug-activity.js +0 -148
  373. package/subagents/README.md +0 -86
  374. package/subagents/work-doer.md +0 -237
  375. package/subagents/work-merger.md +0 -618
  376. package/subagents/work-planner.md +0 -390
  377. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  378. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  379. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  380. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  381. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  382. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  383. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  384. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  385. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  386. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  387. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  388. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  389. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  390. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  391. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  392. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildAgentProviderVisibility = buildAgentProviderVisibility;
4
+ exports.formatProviderVisibilityLine = formatProviderVisibilityLine;
5
+ exports.formatAgentProviderVisibilityForPrompt = formatAgentProviderVisibilityForPrompt;
6
+ exports.formatAgentProviderVisibilityForStartOfTurn = formatAgentProviderVisibilityForStartOfTurn;
7
+ exports.formatAgentProviderVisibilityForPulse = formatAgentProviderVisibilityForPulse;
8
+ exports.providerVisibilityStatusRows = providerVisibilityStatusRows;
9
+ exports.isAgentProviderVisibility = isAgentProviderVisibility;
10
+ const runtime_1 = require("../nerves/runtime");
11
+ const provider_binding_resolver_1 = require("./provider-binding-resolver");
12
+ const LANES = ["outward", "inner"];
13
+ function credentialVisibility(binding) {
14
+ const credential = binding.credential;
15
+ if (credential.status === "present") {
16
+ return {
17
+ status: "present",
18
+ source: credential.source,
19
+ revision: credential.revision,
20
+ };
21
+ }
22
+ return {
23
+ status: credential.status,
24
+ ...("repair" in credential ? { repairCommand: credential.repair.command } : {}),
25
+ };
26
+ }
27
+ function readinessVisibility(binding) {
28
+ return {
29
+ status: binding.readiness.status,
30
+ ...(binding.readiness.checkedAt ? { checkedAt: binding.readiness.checkedAt } : {}),
31
+ ...(binding.readiness.error ? { error: binding.readiness.error } : {}),
32
+ ...(binding.readiness.reason ? { reason: binding.readiness.reason } : {}),
33
+ ...(binding.readiness.attempts !== undefined ? { attempts: binding.readiness.attempts } : {}),
34
+ };
35
+ }
36
+ function visibilityForLane(input, lane) {
37
+ const resolved = (0, provider_binding_resolver_1.resolveEffectiveProviderBinding)({ ...input, lane });
38
+ if (!resolved.ok) {
39
+ return {
40
+ lane,
41
+ status: "unconfigured",
42
+ provider: "unconfigured",
43
+ model: "-",
44
+ source: "missing",
45
+ readiness: {
46
+ status: "unknown",
47
+ reason: resolved.reason,
48
+ },
49
+ credential: {
50
+ status: "missing",
51
+ repairCommand: resolved.repair.command,
52
+ },
53
+ repairCommand: resolved.repair.command,
54
+ reason: resolved.reason,
55
+ warnings: resolved.warnings.map((warning) => warning.message),
56
+ };
57
+ }
58
+ return {
59
+ lane,
60
+ status: "configured",
61
+ provider: resolved.binding.provider,
62
+ model: resolved.binding.model,
63
+ source: resolved.binding.source,
64
+ readiness: readinessVisibility(resolved.binding),
65
+ credential: credentialVisibility(resolved.binding),
66
+ warnings: resolved.binding.warnings.map((warning) => warning.message),
67
+ };
68
+ }
69
+ function buildAgentProviderVisibility(input) {
70
+ const visibility = {
71
+ agentName: input.agentName,
72
+ lanes: LANES.map((lane) => visibilityForLane(input, lane)),
73
+ };
74
+ (0, runtime_1.emitNervesEvent)({
75
+ component: "config/identity",
76
+ event: "config.provider_visibility_built",
77
+ message: "built provider visibility summary",
78
+ meta: {
79
+ agentName: input.agentName,
80
+ laneStatuses: visibility.lanes.map((lane) => `${lane.lane}:${lane.status}`).join(","),
81
+ },
82
+ });
83
+ return visibility;
84
+ }
85
+ function credentialLabel(credential) {
86
+ if (credential.status === "present")
87
+ return credential.source ?? "vault";
88
+ if (credential.status === "invalid-pool")
89
+ return "vault unavailable";
90
+ if (credential.status === "not-loaded")
91
+ return "checked previously";
92
+ return "missing";
93
+ }
94
+ function readinessLabel(readiness) {
95
+ if (readiness.status === "failed") {
96
+ return readiness.error ? `failed: ${readiness.error}` : "failed";
97
+ }
98
+ if (readiness.status === "stale") {
99
+ return readiness.reason ? `stale: ${readiness.reason}` : "stale";
100
+ }
101
+ if (readiness.status === "unknown") {
102
+ return readiness.reason ? `unknown: ${readiness.reason}` : "unknown";
103
+ }
104
+ return readiness.status;
105
+ }
106
+ function providerStatusDetail(lane) {
107
+ if (lane.credential.status === "missing" || lane.credential.status === "invalid-pool")
108
+ return undefined;
109
+ return lane.readiness.error;
110
+ }
111
+ function formatProviderVisibilityLine(lane) {
112
+ if (lane.status === "unconfigured") {
113
+ return `${lane.lane}: unconfigured (${lane.reason}); repair: ${lane.repairCommand}`;
114
+ }
115
+ const parts = [
116
+ readinessLabel(lane.readiness),
117
+ `source: ${lane.source}`,
118
+ `credentials: ${credentialLabel(lane.credential)}`,
119
+ ];
120
+ if (lane.credential.revision)
121
+ parts.push(`revision: ${lane.credential.revision}`);
122
+ if (lane.credential.repairCommand)
123
+ parts.push(`repair: ${lane.credential.repairCommand}`);
124
+ if (lane.warnings.length > 0)
125
+ parts.push(`warnings: ${lane.warnings.join("; ")}`);
126
+ return `${lane.lane}: ${lane.provider} / ${lane.model} [${parts.join("; ")}]`;
127
+ }
128
+ function formatAgentProviderVisibilityForPrompt(visibility) {
129
+ if (visibility.lanes.every((lane) => lane.status === "unconfigured")) {
130
+ return [
131
+ "provider bindings are not configured in agent.json.",
132
+ ...visibility.lanes.map((lane) => `- ${formatProviderVisibilityLine(lane)}`),
133
+ ].join("\n");
134
+ }
135
+ return [
136
+ "runtime uses provider bindings from agent.json:",
137
+ ...visibility.lanes.map((lane) => `- ${formatProviderVisibilityLine(lane)}`),
138
+ ].join("\n");
139
+ }
140
+ function formatAgentProviderVisibilityForStartOfTurn(visibility) {
141
+ return visibility.lanes.map((lane) => `- ${formatProviderVisibilityLine(lane)}`).join("\n");
142
+ }
143
+ function formatAgentProviderVisibilityForPulse(visibility) {
144
+ return visibility.lanes.map((lane) => formatProviderVisibilityLine(lane)).join("; ");
145
+ }
146
+ function providerVisibilityStatusRows(visibility) {
147
+ return visibility.lanes.map((lane) => {
148
+ if (lane.status === "unconfigured") {
149
+ return {
150
+ agent: visibility.agentName,
151
+ lane: lane.lane,
152
+ provider: "unconfigured",
153
+ model: "-",
154
+ source: "missing",
155
+ readiness: "unknown",
156
+ detail: lane.repairCommand,
157
+ credential: "missing",
158
+ };
159
+ }
160
+ const detail = providerStatusDetail(lane);
161
+ return {
162
+ agent: visibility.agentName,
163
+ lane: lane.lane,
164
+ provider: lane.provider,
165
+ model: lane.model,
166
+ source: lane.source,
167
+ readiness: lane.readiness.status,
168
+ ...(detail ? { detail } : {}),
169
+ credential: credentialLabel(lane.credential),
170
+ };
171
+ });
172
+ }
173
+ function isAgentProviderVisibility(value) {
174
+ if (!value || typeof value !== "object" || Array.isArray(value))
175
+ return false;
176
+ const record = value;
177
+ if (typeof record.agentName !== "string")
178
+ return false;
179
+ if (!Array.isArray(record.lanes))
180
+ return false;
181
+ return record.lanes.every((lane) => {
182
+ if (!lane || typeof lane !== "object" || Array.isArray(lane))
183
+ return false;
184
+ const laneRecord = lane;
185
+ return (laneRecord.lane === "outward" || laneRecord.lane === "inner")
186
+ && (laneRecord.status === "configured" || laneRecord.status === "unconfigured");
187
+ });
188
+ }
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.needsRefresh = needsRefresh;
4
+ exports.refreshAnthropicToken = refreshAnthropicToken;
5
+ exports.persistTokenState = persistTokenState;
6
+ exports.ensureFreshToken = ensureFreshToken;
7
+ /* v8 ignore start -- OAuth token lifecycle: requires live API calls, tested via integration @preserve */
8
+ const runtime_1 = require("../../nerves/runtime");
9
+ const provider_credentials_1 = require("../provider-credentials");
10
+ const OAUTH_TOKEN_ENDPOINT = "https://console.anthropic.com/v1/oauth/token";
11
+ const OAUTH_CLIENT_ID = "9d1c250a-e61b-44d9-88ed-5944d1962f5e";
12
+ const REFRESH_MARGIN_MS = 5 * 60 * 1000; // refresh 5 minutes before expiry
13
+ /**
14
+ * Check if the Anthropic OAuth token needs refreshing.
15
+ * Returns true if no expiresAt is set (legacy token) or if within 5 min of expiry.
16
+ */
17
+ function needsRefresh(expiresAt) {
18
+ if (!expiresAt)
19
+ return true; // legacy token with no expiry — always try refresh
20
+ return Date.now() > expiresAt - REFRESH_MARGIN_MS;
21
+ }
22
+ /**
23
+ * Refresh an Anthropic OAuth access token using the refresh token.
24
+ * Returns the new token state or null if refresh fails.
25
+ */
26
+ async function refreshAnthropicToken(refreshToken, fetchImpl = fetch) {
27
+ try {
28
+ const response = await fetchImpl(OAUTH_TOKEN_ENDPOINT, {
29
+ method: "POST",
30
+ headers: { "Content-Type": "application/json" },
31
+ body: JSON.stringify({
32
+ grant_type: "refresh_token",
33
+ refresh_token: refreshToken,
34
+ client_id: OAUTH_CLIENT_ID,
35
+ }),
36
+ });
37
+ if (!response.ok) {
38
+ (0, runtime_1.emitNervesEvent)({
39
+ level: "warn",
40
+ component: "engine",
41
+ event: "engine.anthropic_token_refresh_failed",
42
+ message: `token refresh failed: ${response.status}`,
43
+ meta: { status: response.status },
44
+ });
45
+ return null;
46
+ }
47
+ const json = await response.json();
48
+ if (!json.access_token) {
49
+ (0, runtime_1.emitNervesEvent)({
50
+ level: "warn",
51
+ component: "engine",
52
+ event: "engine.anthropic_token_refresh_failed",
53
+ message: "token refresh returned no access_token",
54
+ meta: {},
55
+ });
56
+ return null;
57
+ }
58
+ const state = {
59
+ accessToken: json.access_token,
60
+ refreshToken: json.refresh_token ?? refreshToken, // keep old if not returned
61
+ expiresAt: Date.now() + (json.expires_in ?? 28800) * 1000, // default 8h
62
+ };
63
+ (0, runtime_1.emitNervesEvent)({
64
+ component: "engine",
65
+ event: "engine.anthropic_token_refreshed",
66
+ message: "anthropic OAuth token refreshed",
67
+ meta: { expiresAt: new Date(state.expiresAt).toISOString() },
68
+ });
69
+ return state;
70
+ }
71
+ catch (error) {
72
+ (0, runtime_1.emitNervesEvent)({
73
+ level: "warn",
74
+ component: "engine",
75
+ event: "engine.anthropic_token_refresh_error",
76
+ message: "token refresh threw",
77
+ meta: { error: error instanceof Error ? error.message : String(error) },
78
+ });
79
+ return null;
80
+ }
81
+ }
82
+ /**
83
+ * Persist refreshed token state back to the agent vault.
84
+ */
85
+ async function persistTokenState(agentName, state) {
86
+ try {
87
+ await (0, provider_credentials_1.upsertProviderCredential)({
88
+ agentName,
89
+ provider: "anthropic",
90
+ credentials: {
91
+ setupToken: state.accessToken,
92
+ refreshToken: state.refreshToken,
93
+ expiresAt: state.expiresAt,
94
+ },
95
+ config: {},
96
+ provenance: { source: "auth-flow" },
97
+ });
98
+ /* v8 ignore start -- defensive: persistence failure must not crash the provider @preserve */
99
+ }
100
+ catch (error) {
101
+ (0, runtime_1.emitNervesEvent)({
102
+ level: "warn",
103
+ component: "engine",
104
+ event: "engine.anthropic_token_persist_error",
105
+ message: "failed to persist refreshed token",
106
+ meta: { error: error instanceof Error ? error.message : String(error) },
107
+ });
108
+ }
109
+ /* v8 ignore stop */
110
+ }
111
+ /**
112
+ * Ensure the Anthropic token is fresh. If expired, refresh and persist.
113
+ * Returns the current valid access token, or null if refresh failed and
114
+ * the existing token is expired.
115
+ */
116
+ async function ensureFreshToken(currentToken, refreshToken, expiresAt, agentName, fetchImpl) {
117
+ if (!needsRefresh(expiresAt)) {
118
+ return currentToken; // still fresh
119
+ }
120
+ if (!refreshToken) {
121
+ // No refresh token — use the current token as-is (may be expired)
122
+ return currentToken;
123
+ }
124
+ const newState = await refreshAnthropicToken(refreshToken, fetchImpl);
125
+ if (!newState) {
126
+ return currentToken; // refresh failed — try the old token
127
+ }
128
+ await persistTokenState(agentName, newState);
129
+ return newState.accessToken;
130
+ }
131
+ /* v8 ignore stop */
@@ -1,9 +1,43 @@
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.classifyAnthropicError = classifyAnthropicError;
7
41
  exports.createAnthropicProviderRuntime = createAnthropicProviderRuntime;
8
42
  const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
9
43
  const config_1 = require("../config");
@@ -11,12 +45,10 @@ const identity_1 = require("../identity");
11
45
  const runtime_1 = require("../../nerves/runtime");
12
46
  const streaming_1 = require("../streaming");
13
47
  const model_capabilities_1 = require("../model-capabilities");
48
+ const error_classification_1 = require("./error-classification");
14
49
  const ANTHROPIC_SETUP_TOKEN_PREFIX = "sk-ant-oat01-";
15
50
  const ANTHROPIC_SETUP_TOKEN_MIN_LENGTH = 80;
16
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";
17
- function getAnthropicSecretsPathForGuidance() {
18
- return (0, identity_1.getAgentSecretsPath)();
19
- }
20
52
  function getAnthropicAgentNameForGuidance() {
21
53
  return (0, identity_1.getAgentName)();
22
54
  }
@@ -24,10 +56,8 @@ function getAnthropicSetupTokenInstructions() {
24
56
  const agentName = getAnthropicAgentNameForGuidance();
25
57
  return [
26
58
  "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.",
59
+ ` 1. Run \`ouro auth --agent ${agentName} --provider anthropic\``,
60
+ " 2. After reauth, retry the failed ouro command or reconnect this session.",
31
61
  ].join("\n");
32
62
  }
33
63
  function getAnthropicReauthGuidance(reason) {
@@ -37,8 +67,7 @@ function getAnthropicReauthGuidance(reason) {
37
67
  getAnthropicSetupTokenInstructions(),
38
68
  ].join("\n");
39
69
  }
40
- function resolveAnthropicSetupTokenCredential() {
41
- const anthropicConfig = (0, config_1.getAnthropicConfig)();
70
+ function resolveAnthropicSetupTokenCredential(anthropicConfig) {
42
71
  const token = anthropicConfig.setupToken?.trim();
43
72
  if (!token) {
44
73
  throw new Error(getAnthropicReauthGuidance("Anthropic provider is selected but no setup-token credential was found."));
@@ -187,25 +216,19 @@ function mergeAnthropicToolArguments(current, partial) {
187
216
  }
188
217
  return current + partial;
189
218
  }
219
+ function classifyAnthropicError(error) {
220
+ return (0, error_classification_1.classifyHttpError)(error, {
221
+ isAuthFailure: isAnthropicAuthFailure,
222
+ isServerError: (e) => e.status === 529,
223
+ });
224
+ }
190
225
  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
226
  const lower = error.message.toLowerCase();
197
227
  return (lower.includes("oauth authentication") ||
198
228
  lower.includes("authentication failed") ||
199
229
  lower.includes("unauthorized") ||
200
230
  lower.includes("invalid api key"));
201
231
  }
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
232
  async function streamAnthropicMessages(client, model, request) {
210
233
  const { system, messages } = toAnthropicMessages(request.messages);
211
234
  const anthropicTools = toAnthropicTools(request.activeTools);
@@ -216,21 +239,49 @@ async function streamAnthropicMessages(client, model, request) {
216
239
  max_tokens: maxTokens,
217
240
  messages,
218
241
  stream: true,
219
- thinking: { type: "adaptive", effort: request.reasoningEffort ?? "medium" },
242
+ thinking: { type: "adaptive" },
243
+ output_config: { effort: request.reasoningEffort ?? "medium" },
220
244
  };
221
- if (system)
222
- 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
+ }
223
272
  if (anthropicTools.length > 0)
224
273
  params.tools = anthropicTools;
225
274
  if (request.toolChoiceRequired && anthropicTools.length > 0) {
226
- 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" };
227
278
  }
228
279
  let response;
229
280
  try {
230
281
  response = await client.messages.create(params, request.signal ? { signal: request.signal } : {});
231
282
  }
232
283
  catch (error) {
233
- throw withAnthropicAuthGuidance(error);
284
+ throw error instanceof Error ? error : new Error(String(error));
234
285
  }
235
286
  let content = "";
236
287
  let streamStarted = false;
@@ -238,7 +289,7 @@ async function streamAnthropicMessages(client, model, request) {
238
289
  const toolCalls = new Map();
239
290
  const thinkingBlocks = new Map();
240
291
  const redactedBlocks = new Map();
241
- const answerStreamer = new streaming_1.FinalAnswerStreamer(request.callbacks);
292
+ const answerStreamer = new streaming_1.SettleStreamer(request.callbacks, request.eagerSettleStreaming);
242
293
  try {
243
294
  for await (const event of response) {
244
295
  if (request.signal?.aborted)
@@ -264,9 +315,9 @@ async function streamAnthropicMessages(client, model, request) {
264
315
  name,
265
316
  arguments: input,
266
317
  });
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) {
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) {
270
321
  answerStreamer.activate();
271
322
  }
272
323
  }
@@ -311,8 +362,8 @@ async function streamAnthropicMessages(client, model, request) {
311
362
  if (existing) {
312
363
  const partialJson = String(delta?.partial_json ?? "");
313
364
  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) {
365
+ /* v8 ignore next -- settle delta streaming, tested via SettleStreamer unit tests @preserve */
366
+ if (existing.name === "settle" && toolCalls.size === 1) {
316
367
  answerStreamer.processDelta(partialJson);
317
368
  }
318
369
  }
@@ -336,7 +387,7 @@ async function streamAnthropicMessages(client, model, request) {
336
387
  }
337
388
  }
338
389
  catch (error) {
339
- throw withAnthropicAuthGuidance(error);
390
+ throw error instanceof Error ? error : /* v8 ignore next -- defensive: stream errors are always Error @preserve */ new Error(String(error));
340
391
  }
341
392
  // Collect all thinking blocks (regular + redacted) sorted by index to preserve ordering
342
393
  const allThinkingIndices = [...thinkingBlocks.keys(), ...redactedBlocks.keys()].sort((a, b) => a - b);
@@ -351,37 +402,62 @@ async function streamAnthropicMessages(client, model, request) {
351
402
  toolCalls: [...toolCalls.values()],
352
403
  outputItems,
353
404
  usage,
354
- finalAnswerStreamed: answerStreamer.streamed,
405
+ settleStreamed: answerStreamer.streamed,
355
406
  };
356
407
  }
357
- function createAnthropicProviderRuntime() {
408
+ function createAnthropicProviderRuntime(model, anthropicConfig = (0, config_1.getAnthropicConfig)()) {
358
409
  (0, runtime_1.emitNervesEvent)({
359
410
  component: "engine",
360
411
  event: "engine.provider_init",
361
412
  message: "anthropic provider init",
362
413
  meta: { provider: "anthropic" },
363
414
  });
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."));
415
+ if (!anthropicConfig.setupToken) {
416
+ throw new Error(getAnthropicReauthGuidance("provider 'anthropic' is selected but anthropic.setupToken is missing in the agent vault."));
367
417
  }
368
- const modelCaps = (0, model_capabilities_1.getModelCapabilities)(anthropicConfig.model);
418
+ const modelCaps = (0, model_capabilities_1.getModelCapabilities)(model);
369
419
  const capabilities = new Set();
370
420
  if (modelCaps.reasoningEffort)
371
421
  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
- });
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 */
381
456
  return {
382
457
  id: "anthropic",
383
- model: anthropicConfig.model,
384
- client,
458
+ model,
459
+ /* v8 ignore next -- getter: returns mutable client ref @preserve */
460
+ get client() { return client; },
385
461
  capabilities,
386
462
  supportedReasoningEfforts: modelCaps.reasoningEffort,
387
463
  resetTurnState(_messages) {
@@ -390,8 +466,19 @@ function createAnthropicProviderRuntime() {
390
466
  appendToolOutput(_callId, _output) {
391
467
  // Anthropic uses canonical messages for tool_result tracking.
392
468
  },
393
- streamTurn(request) {
394
- 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);
395
482
  },
396
483
  };
397
484
  }