@ouro.bot/cli 0.1.0-alpha.8 → 0.1.0-alpha.800

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 (624) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +249 -176
  3. package/RepairGuide.ouro/agent.json +5 -0
  4. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  5. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  6. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  7. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  8. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  9. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  10. package/SerpentGuide.ouro/agent.json +83 -0
  11. package/SerpentGuide.ouro/psyche/SOUL.md +25 -0
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +2 -2
  13. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  14. package/assets/bluebubbles-host +264 -0
  15. package/assets/ouroboros.png +0 -0
  16. package/changelog.json +5563 -0
  17. package/deploy/unraid/Dockerfile +48 -0
  18. package/deploy/unraid/README.txt +3012 -0
  19. package/deploy/unraid/audit-container-spec.sh +4 -0
  20. package/deploy/unraid/container-runtime.json +1 -0
  21. package/deploy/unraid/docker-man-template-transaction.mjs +526 -0
  22. package/deploy/unraid/docker-man-template-xml.cjs +105 -0
  23. package/deploy/unraid/migrate-sanctuary-bundle.mjs +60 -0
  24. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  25. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  26. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  27. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  28. package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
  29. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  30. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
  31. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  32. package/deploy/unraid/sanctuary-deployment-target.mjs +709 -0
  33. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  34. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2030 -0
  35. package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
  36. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  37. package/deploy/unraid/sanctuary.ouro/agent.json +24 -0
  38. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  39. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  40. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  41. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  42. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  43. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
  44. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +11 -0
  45. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +25 -0
  46. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +11 -0
  47. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  48. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +23 -0
  49. package/deploy/unraid/sanctuary.xml +27 -0
  50. package/dist/a2a/card.js +57 -0
  51. package/dist/a2a/client.js +180 -0
  52. package/dist/a2a/config.js +50 -0
  53. package/dist/a2a/delegation-stores.js +56 -0
  54. package/dist/a2a/did-resolution.js +93 -0
  55. package/dist/a2a/identity.js +170 -0
  56. package/dist/a2a/inbound-share.js +107 -0
  57. package/dist/a2a/mission-result-wire.js +196 -0
  58. package/dist/a2a/onboarding.js +115 -0
  59. package/dist/a2a/pin-store.js +132 -0
  60. package/dist/a2a/seen-ledger.js +120 -0
  61. package/dist/a2a/server.js +604 -0
  62. package/dist/a2a/task-store.js +69 -0
  63. package/dist/a2a/transport.js +45 -0
  64. package/dist/a2a/types.js +3 -0
  65. package/dist/arc/attention-types.js +8 -0
  66. package/dist/arc/cares.js +360 -0
  67. package/dist/arc/episodes.js +118 -0
  68. package/dist/arc/evolution.js +490 -0
  69. package/dist/arc/flight-recorder.js +1034 -0
  70. package/dist/arc/intentions.js +134 -0
  71. package/dist/arc/json-store.js +117 -0
  72. package/dist/arc/obligations.js +386 -0
  73. package/dist/arc/packets.js +336 -0
  74. package/dist/arc/presence.js +185 -0
  75. package/dist/arc/task-lifecycle.js +57 -0
  76. package/dist/commerce/store.js +755 -0
  77. package/dist/commerce/types.js +3 -0
  78. package/dist/heart/active-work.js +1009 -0
  79. package/dist/heart/agent-entry.js +252 -3
  80. package/dist/heart/approval-files.js +113 -0
  81. package/dist/heart/approval-store.js +950 -0
  82. package/dist/heart/attachments/image-normalize.js +194 -0
  83. package/dist/heart/attachments/materialize.js +97 -0
  84. package/dist/heart/attachments/originals.js +88 -0
  85. package/dist/heart/attachments/render.js +29 -0
  86. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  87. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  88. package/dist/heart/attachments/sources/index.js +18 -0
  89. package/dist/heart/attachments/sources/telegram.js +71 -0
  90. package/dist/heart/attachments/store.js +132 -0
  91. package/dist/heart/attachments/types.js +93 -0
  92. package/dist/heart/auth/auth-flow.js +495 -0
  93. package/dist/heart/autonomy-budget.js +478 -0
  94. package/dist/heart/awaiting/await-alert.js +148 -0
  95. package/dist/heart/awaiting/await-expiry.js +143 -0
  96. package/dist/heart/awaiting/await-loader.js +91 -0
  97. package/dist/heart/awaiting/await-parser.js +149 -0
  98. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  99. package/dist/heart/awaiting/await-scheduler.js +382 -0
  100. package/dist/heart/background-operations.js +281 -0
  101. package/dist/heart/bridges/manager.js +478 -0
  102. package/dist/heart/bridges/state-machine.js +135 -0
  103. package/dist/heart/bridges/store.js +135 -0
  104. package/dist/heart/bundle-state.js +168 -0
  105. package/dist/heart/commitments.js +135 -0
  106. package/dist/heart/config-registry.js +331 -0
  107. package/dist/heart/config.js +195 -137
  108. package/dist/heart/context-loss-gauntlet.js +387 -0
  109. package/dist/heart/context-loss-sentinel.js +1157 -0
  110. package/dist/heart/core.js +2257 -338
  111. package/dist/heart/cross-chat-delivery.js +133 -0
  112. package/dist/heart/daemon/agent-config-check.js +451 -0
  113. package/dist/heart/daemon/agent-discovery.js +263 -0
  114. package/dist/heart/daemon/agent-service.js +542 -0
  115. package/dist/heart/daemon/agentic-repair.js +547 -0
  116. package/dist/heart/daemon/await-private-wake.js +59 -0
  117. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  118. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  119. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  120. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  121. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  122. package/dist/heart/daemon/cadence.js +180 -0
  123. package/dist/heart/daemon/cli-defaults.js +836 -0
  124. package/dist/heart/daemon/cli-desk.js +322 -0
  125. package/dist/heart/daemon/cli-exec.js +8730 -0
  126. package/dist/heart/daemon/cli-help.js +710 -0
  127. package/dist/heart/daemon/cli-parse.js +2719 -0
  128. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  129. package/dist/heart/daemon/cli-render.js +777 -0
  130. package/dist/heart/daemon/cli-types.js +8 -0
  131. package/dist/heart/daemon/connect-bay.js +323 -0
  132. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  133. package/dist/heart/daemon/container-healthcheck.js +112 -0
  134. package/dist/heart/daemon/container-runtime.js +97 -0
  135. package/dist/heart/daemon/container-spec-auditor-main.js +170 -0
  136. package/dist/heart/daemon/container-spec-auditor.js +236 -0
  137. package/dist/heart/daemon/daemon-bootstrap-startup.js +107 -0
  138. package/dist/heart/daemon/daemon-cli.js +30 -786
  139. package/dist/heart/daemon/daemon-entry.js +971 -13
  140. package/dist/heart/daemon/daemon-health.js +186 -0
  141. package/dist/heart/daemon/daemon-rollup.js +57 -0
  142. package/dist/heart/daemon/daemon-runtime-sync.js +287 -0
  143. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  144. package/dist/heart/daemon/daemon.js +2156 -28
  145. package/dist/heart/daemon/dns-workflow.js +394 -0
  146. package/dist/heart/daemon/doctor-types.js +8 -0
  147. package/dist/heart/daemon/doctor.js +1755 -0
  148. package/dist/heart/daemon/freshness.js +345 -0
  149. package/dist/heart/daemon/habit-private-wake.js +61 -0
  150. package/dist/heart/daemon/health-monitor.js +142 -11
  151. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  152. package/dist/heart/daemon/hooks/bundle-meta.js +226 -0
  153. package/dist/heart/daemon/http-health-probe.js +80 -0
  154. package/dist/heart/daemon/human-command-screens.js +234 -0
  155. package/dist/heart/daemon/human-readiness.js +114 -0
  156. package/dist/heart/daemon/inner-status.js +78 -0
  157. package/dist/heart/daemon/interactive-repair.js +394 -0
  158. package/dist/heart/daemon/launchd.js +188 -0
  159. package/dist/heart/daemon/log-tailer.js +82 -12
  160. package/dist/heart/daemon/logs-prune.js +132 -0
  161. package/dist/heart/daemon/mcp-canary.js +524 -0
  162. package/dist/heart/daemon/message-router.js +80 -11
  163. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  164. package/dist/heart/daemon/os-cron-deps.js +135 -0
  165. package/dist/heart/daemon/os-cron.js +22 -14
  166. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  167. package/dist/heart/daemon/ouro-entry.js +3 -1
  168. package/dist/heart/daemon/plugin-cli.js +432 -0
  169. package/dist/heart/daemon/process-manager.js +739 -54
  170. package/dist/heart/daemon/provider-discovery.js +137 -0
  171. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  172. package/dist/heart/daemon/prunable-bundle.js +144 -0
  173. package/dist/heart/daemon/pulse.js +511 -0
  174. package/dist/heart/daemon/readiness-repair.js +365 -0
  175. package/dist/heart/daemon/run-hooks.js +39 -0
  176. package/dist/heart/daemon/runtime-logging.js +92 -16
  177. package/dist/heart/daemon/runtime-metadata.js +191 -0
  178. package/dist/{repertoire/tasks/lifecycle.js → heart/daemon/runtime-mode.js} +37 -39
  179. package/dist/heart/daemon/safe-mode.js +161 -0
  180. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2609 -0
  181. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1866 -0
  182. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  183. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +976 -0
  184. package/dist/heart/daemon/sanctuary-bundle-migration.js +728 -0
  185. package/dist/heart/daemon/sanctuary-package-management.js +103 -0
  186. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  187. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  188. package/dist/heart/daemon/sense-manager.js +948 -0
  189. package/dist/heart/daemon/session-id-resolver.js +131 -0
  190. package/dist/heart/daemon/skill-management-installer.js +94 -0
  191. package/dist/heart/daemon/socket-client.js +370 -0
  192. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  193. package/dist/heart/daemon/startup-tui.js +339 -0
  194. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  195. package/dist/heart/daemon/task-scheduler.js +117 -39
  196. package/dist/heart/daemon/terminal-ui.js +499 -0
  197. package/dist/heart/daemon/thoughts.js +591 -0
  198. package/dist/heart/daemon/up-progress.js +366 -0
  199. package/dist/heart/daemon/vault-items.js +56 -0
  200. package/dist/heart/delegation.js +59 -0
  201. package/dist/heart/external-events/router.js +1414 -0
  202. package/dist/heart/habits/habit-cancel.js +810 -0
  203. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  204. package/dist/heart/habits/habit-migration.js +194 -0
  205. package/dist/heart/habits/habit-parser.js +278 -0
  206. package/dist/heart/habits/habit-runtime-state.js +93 -0
  207. package/dist/heart/habits/habit-scheduler.js +653 -0
  208. package/dist/heart/habits/habit-session-summary.js +318 -0
  209. package/dist/heart/habits/habit-session.js +636 -0
  210. package/dist/heart/{daemon → hatch}/hatch-animation.js +10 -3
  211. package/dist/heart/{daemon → hatch}/hatch-flow.js +57 -139
  212. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  213. package/dist/heart/hatch/specialist-orchestrator.js +129 -0
  214. package/dist/heart/hatch/specialist-prompt.js +102 -0
  215. package/dist/heart/hatch/specialist-tools.js +318 -0
  216. package/dist/heart/identity.js +297 -67
  217. package/dist/heart/kept-notes.js +289 -0
  218. package/dist/heart/kicks.js +2 -20
  219. package/dist/heart/machine-identity.js +161 -0
  220. package/dist/heart/mail-import-discovery.js +353 -0
  221. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  222. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  223. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  224. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  225. package/dist/heart/mailbox/mailbox-http-transport.js +129 -0
  226. package/dist/heart/mailbox/mailbox-http.js +99 -0
  227. package/dist/heart/mailbox/mailbox-read.js +39 -0
  228. package/dist/heart/mailbox/mailbox-types.js +27 -0
  229. package/dist/heart/mailbox/mailbox-view.js +197 -0
  230. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  231. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  232. package/dist/heart/mailbox/readers/mail.js +375 -0
  233. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  234. package/dist/heart/mailbox/readers/sessions.js +232 -0
  235. package/dist/heart/mailbox/readers/shared.js +111 -0
  236. package/dist/heart/mcp/mcp-server.js +696 -0
  237. package/dist/heart/migrate-config.js +100 -0
  238. package/dist/heart/model-capabilities.js +59 -0
  239. package/dist/heart/orientation-frame.js +345 -0
  240. package/dist/heart/platform.js +81 -0
  241. package/dist/heart/primitives.js +1 -1
  242. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  243. package/dist/heart/private-runtime/index.js +18 -0
  244. package/dist/heart/private-runtime/ledger.js +221 -0
  245. package/dist/heart/private-runtime/policy.js +252 -0
  246. package/dist/heart/private-runtime/types.js +2 -0
  247. package/dist/heart/progress-story.js +42 -0
  248. package/dist/heart/provider-attempt.js +137 -0
  249. package/dist/heart/provider-binding-resolver.js +273 -0
  250. package/dist/heart/provider-credentials.js +449 -0
  251. package/dist/heart/provider-failover.js +311 -0
  252. package/dist/heart/provider-models.js +96 -0
  253. package/dist/heart/provider-ping.js +265 -0
  254. package/dist/heart/provider-readiness-cache.js +119 -0
  255. package/dist/heart/provider-visibility.js +188 -0
  256. package/dist/heart/providers/anthropic-token.js +131 -0
  257. package/dist/heart/providers/anthropic.js +236 -58
  258. package/dist/heart/providers/azure.js +104 -13
  259. package/dist/heart/providers/error-classification.js +127 -0
  260. package/dist/heart/providers/github-copilot.js +145 -0
  261. package/dist/heart/providers/minimax-vlm.js +189 -0
  262. package/dist/heart/providers/minimax.js +29 -7
  263. package/dist/heart/providers/openai-codex-token.js +349 -0
  264. package/dist/heart/providers/openai-codex.js +63 -39
  265. package/dist/heart/providers/openai-compatible.js +177 -0
  266. package/dist/heart/run-ledger.js +247 -0
  267. package/dist/heart/runtime-capability-check.js +170 -0
  268. package/dist/heart/runtime-credentials.js +607 -0
  269. package/dist/heart/runtime-cwd.js +87 -0
  270. package/dist/heart/sense-truth.js +79 -0
  271. package/dist/heart/session-activity.js +235 -0
  272. package/dist/heart/session-events.js +1318 -0
  273. package/dist/heart/session-playback-cli-main.js +5 -0
  274. package/dist/heart/session-playback-cli.js +36 -0
  275. package/dist/heart/session-playback.js +231 -0
  276. package/dist/heart/session-stats-cli-main.js +5 -0
  277. package/dist/heart/session-stats.js +182 -0
  278. package/dist/heart/session-transcript.js +133 -0
  279. package/dist/heart/start-of-turn-packet.js +372 -0
  280. package/dist/heart/steward-policy.js +302 -0
  281. package/dist/heart/streaming.js +682 -207
  282. package/dist/heart/structured-output.js +196 -0
  283. package/dist/heart/sync-classification.js +176 -0
  284. package/dist/heart/sync.js +449 -0
  285. package/dist/heart/target-resolution.js +127 -0
  286. package/dist/heart/tempo.js +93 -0
  287. package/dist/heart/temporal-view.js +41 -0
  288. package/dist/heart/timeouts.js +101 -0
  289. package/dist/heart/tool-activity-callbacks.js +59 -0
  290. package/dist/heart/tool-approval.js +342 -0
  291. package/dist/heart/tool-description.js +155 -0
  292. package/dist/heart/tool-friction.js +55 -0
  293. package/dist/heart/tool-loop.js +200 -0
  294. package/dist/heart/turn-context.js +481 -0
  295. package/dist/heart/turn-coordinator.js +28 -0
  296. package/dist/heart/versioning/ouro-bot-global-installer.js +129 -0
  297. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  298. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  299. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  300. package/dist/heart/{daemon → versioning}/ouro-uti.js +11 -2
  301. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  302. package/dist/heart/versioning/staged-restart.js +146 -0
  303. package/dist/heart/versioning/update-checker.js +116 -0
  304. package/dist/heart/versioning/update-hooks.js +154 -0
  305. package/dist/heart/versioning/version-intent.js +114 -0
  306. package/dist/heart/versioning/wrapper-publish-guard.js +86 -0
  307. package/dist/heart/work-card.js +380 -0
  308. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  309. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  310. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  311. package/dist/mailbox-ui/index.html +16 -0
  312. package/dist/mailroom/attention.js +167 -0
  313. package/dist/mailroom/autonomy.js +209 -0
  314. package/dist/mailroom/blob-store.js +889 -0
  315. package/dist/mailroom/body-cache.js +61 -0
  316. package/dist/mailroom/cache-sync-cli.js +58 -0
  317. package/dist/mailroom/core.js +803 -0
  318. package/dist/mailroom/entry.js +160 -0
  319. package/dist/mailroom/file-store.js +568 -0
  320. package/dist/mailroom/hosted-cache-sync.js +384 -0
  321. package/dist/mailroom/mbox-import.js +393 -0
  322. package/dist/mailroom/migration.js +164 -0
  323. package/dist/mailroom/outbound.js +380 -0
  324. package/dist/mailroom/policy.js +263 -0
  325. package/dist/mailroom/reader.js +292 -0
  326. package/dist/mailroom/search-cache.js +513 -0
  327. package/dist/mailroom/search-relevance.js +319 -0
  328. package/dist/mailroom/smtp-ingress.js +176 -0
  329. package/dist/mailroom/source-state.js +176 -0
  330. package/dist/mailroom/thread.js +109 -0
  331. package/dist/mailroom/travel-extract.js +89 -0
  332. package/dist/mind/bundle-manifest.js +93 -1
  333. package/dist/mind/context.js +287 -104
  334. package/dist/mind/desk-section.js +362 -0
  335. package/dist/mind/diary-integrity.js +60 -0
  336. package/dist/mind/{memory.js → diary.js} +90 -98
  337. package/dist/mind/embedding-provider.js +60 -0
  338. package/dist/mind/file-state.js +179 -0
  339. package/dist/mind/first-impressions.js +16 -2
  340. package/dist/mind/{associative-recall.js → note-search.js} +61 -60
  341. package/dist/mind/obligation-steering.js +227 -0
  342. package/dist/mind/pending.js +102 -9
  343. package/dist/mind/phrases.js +1 -0
  344. package/dist/mind/prompt-budget.js +479 -0
  345. package/dist/mind/prompt-refresh.js +3 -2
  346. package/dist/mind/prompt.js +1377 -140
  347. package/dist/mind/provenance-trust.js +26 -0
  348. package/dist/mind/record-paths.js +312 -0
  349. package/dist/mind/scrutiny.js +173 -0
  350. package/dist/mind/session-transaction.js +415 -0
  351. package/dist/mind/token-estimate.js +8 -12
  352. package/dist/nerves/cli-logging.js +22 -3
  353. package/dist/nerves/coverage/audit-rules.js +15 -6
  354. package/dist/nerves/coverage/audit.js +28 -2
  355. package/dist/nerves/coverage/cli.js +1 -1
  356. package/dist/nerves/coverage/contract.js +5 -5
  357. package/dist/nerves/coverage/file-completeness.js +139 -5
  358. package/dist/nerves/coverage/run-artifacts.js +56 -36
  359. package/dist/nerves/coverage/source-scanner.js +4 -4
  360. package/dist/nerves/event-buffer.js +111 -0
  361. package/dist/nerves/index.js +305 -9
  362. package/dist/nerves/observation.js +20 -0
  363. package/dist/nerves/redact.js +79 -0
  364. package/dist/nerves/review/cli-main.js +5 -0
  365. package/dist/nerves/review/cli.js +156 -0
  366. package/dist/nerves/review/core.js +159 -0
  367. package/dist/nerves/runtime.js +17 -1
  368. package/dist/repertoire/ado-client.js +17 -56
  369. package/dist/repertoire/ado-semantic.js +16 -10
  370. package/dist/repertoire/api-client.js +97 -0
  371. package/dist/repertoire/bitwarden-store.js +1045 -0
  372. package/dist/repertoire/bundle-templates.js +71 -0
  373. package/dist/repertoire/bw-installer.js +180 -0
  374. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  375. package/dist/repertoire/coding/context-pack.js +331 -0
  376. package/dist/repertoire/coding/feedback.js +322 -0
  377. package/dist/repertoire/coding/index.js +18 -3
  378. package/dist/repertoire/coding/manager.js +228 -14
  379. package/dist/repertoire/coding/spawner.js +61 -14
  380. package/dist/repertoire/coding/tools.js +279 -12
  381. package/dist/repertoire/coding/workbench-client.js +272 -0
  382. package/dist/repertoire/coding/workbench-manager.js +346 -0
  383. package/dist/repertoire/commerce-errors.js +109 -0
  384. package/dist/repertoire/commerce-self-test.js +156 -0
  385. package/dist/repertoire/credential-access.js +178 -0
  386. package/dist/repertoire/data/ado-endpoints.json +188 -0
  387. package/dist/repertoire/desk/classifier.js +362 -0
  388. package/dist/repertoire/duffel-client.js +185 -0
  389. package/dist/repertoire/github-client.js +14 -55
  390. package/dist/repertoire/graph-client.js +11 -52
  391. package/dist/repertoire/guardrails.js +1083 -0
  392. package/dist/repertoire/mcp-client.js +295 -0
  393. package/dist/repertoire/mcp-manager.js +434 -0
  394. package/dist/repertoire/mcp-tools.js +83 -0
  395. package/dist/repertoire/plugin-mcp.js +175 -0
  396. package/dist/repertoire/plugins.js +253 -0
  397. package/dist/repertoire/relationship-authorization.js +194 -0
  398. package/dist/repertoire/shell-sessions.js +133 -0
  399. package/dist/repertoire/skills.js +45 -24
  400. package/dist/repertoire/stripe-client.js +131 -0
  401. package/dist/repertoire/tool-arguments.js +148 -0
  402. package/dist/repertoire/tool-results.js +29 -0
  403. package/dist/repertoire/tools-a2a.js +699 -0
  404. package/dist/repertoire/tools-attachments.js +322 -0
  405. package/dist/repertoire/tools-awaiting.js +575 -0
  406. package/dist/repertoire/tools-base.js +85 -707
  407. package/dist/repertoire/tools-bluebubbles.js +95 -0
  408. package/dist/repertoire/tools-bridge.js +144 -0
  409. package/dist/repertoire/tools-bundle.js +993 -0
  410. package/dist/repertoire/tools-commerce.js +253 -0
  411. package/dist/repertoire/tools-config.js +186 -0
  412. package/dist/repertoire/tools-continuity.js +575 -0
  413. package/dist/repertoire/tools-credential.js +383 -0
  414. package/dist/repertoire/tools-evolution.js +527 -0
  415. package/dist/repertoire/tools-files.js +344 -0
  416. package/dist/repertoire/tools-flight.js +290 -0
  417. package/dist/repertoire/tools-flow.js +119 -0
  418. package/dist/repertoire/tools-github.js +3 -8
  419. package/dist/repertoire/tools-habits.js +103 -0
  420. package/dist/repertoire/tools-mail.js +1828 -0
  421. package/dist/repertoire/tools-notes.js +485 -0
  422. package/dist/repertoire/tools-obligations.js +182 -0
  423. package/dist/repertoire/tools-orientation.js +31 -0
  424. package/dist/repertoire/tools-record.js +482 -0
  425. package/dist/repertoire/tools-rsvp.js +139 -0
  426. package/dist/repertoire/tools-runtime.js +150 -0
  427. package/dist/repertoire/tools-session.js +1108 -0
  428. package/dist/repertoire/tools-shell.js +133 -0
  429. package/dist/repertoire/tools-steward-policy.js +95 -0
  430. package/dist/repertoire/tools-stripe.js +224 -0
  431. package/dist/repertoire/tools-surface.js +369 -0
  432. package/dist/repertoire/tools-teams.js +67 -61
  433. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  434. package/dist/repertoire/tools-travel.js +125 -0
  435. package/dist/repertoire/tools-trip.js +982 -0
  436. package/dist/repertoire/tools-unraid.js +484 -0
  437. package/dist/repertoire/tools-user-profile.js +146 -0
  438. package/dist/repertoire/tools-vault.js +40 -0
  439. package/dist/repertoire/tools-voice.js +145 -0
  440. package/dist/repertoire/tools.js +441 -102
  441. package/dist/repertoire/travel-api-client.js +360 -0
  442. package/dist/repertoire/unraid-client.js +155 -0
  443. package/dist/repertoire/unraid-restart.js +212 -0
  444. package/dist/repertoire/user-profile.js +131 -0
  445. package/dist/repertoire/vault-setup.js +246 -0
  446. package/dist/repertoire/vault-unlock.js +628 -0
  447. package/dist/rsvp/aisleplanner-client.js +354 -0
  448. package/dist/rsvp/cli.js +926 -0
  449. package/dist/rsvp/config.js +327 -0
  450. package/dist/rsvp/cutover.js +433 -0
  451. package/dist/rsvp/diagnostics.js +232 -0
  452. package/dist/rsvp/diff-renderer.js +176 -0
  453. package/dist/rsvp/habit-policy.js +110 -0
  454. package/dist/rsvp/habit-stage.js +123 -0
  455. package/dist/rsvp/incident-bundle.js +97 -0
  456. package/dist/rsvp/migration.js +204 -0
  457. package/dist/rsvp/native-habit-runner.js +630 -0
  458. package/dist/rsvp/outbound-state.js +628 -0
  459. package/dist/rsvp/query.js +118 -0
  460. package/dist/rsvp/replay.js +233 -0
  461. package/dist/rsvp/snapshot.js +232 -0
  462. package/dist/rsvp/spend-ledger.js +175 -0
  463. package/dist/scripts/claude-code-hook.js +41 -0
  464. package/dist/scripts/claude-code-stop-hook.js +47 -0
  465. package/dist/senses/a2a-entry.js +115 -0
  466. package/dist/senses/attention-queue.js +186 -0
  467. package/dist/senses/await-turn-message.js +58 -0
  468. package/dist/senses/bluebubbles/active-turns.js +216 -0
  469. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  470. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  471. package/dist/senses/bluebubbles/client.js +799 -0
  472. package/dist/senses/bluebubbles/context-packet.js +207 -0
  473. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  474. package/dist/senses/bluebubbles/entry.js +90 -0
  475. package/dist/senses/bluebubbles/inbound-log.js +127 -0
  476. package/dist/senses/bluebubbles/index.js +3839 -0
  477. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  478. package/dist/senses/bluebubbles/media.js +389 -0
  479. package/dist/senses/bluebubbles/model.js +392 -0
  480. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +57 -6
  481. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  482. package/dist/senses/bluebubbles/processed-log.js +133 -0
  483. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  484. package/dist/senses/bluebubbles/replay.js +284 -0
  485. package/dist/senses/bluebubbles/runtime-state.js +137 -0
  486. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  487. package/dist/senses/bluebubbles/session-cleanup.js +72 -0
  488. package/dist/senses/bluebubbles/webhook-registration.js +228 -0
  489. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  490. package/dist/senses/cli/bracketed-paste.js +82 -0
  491. package/dist/senses/cli/image-paste.js +287 -0
  492. package/dist/senses/cli/image-ref-navigation.js +75 -0
  493. package/dist/senses/cli/ink-app.js +156 -0
  494. package/dist/senses/cli/inline-diff.js +64 -0
  495. package/dist/senses/cli/input-keys.js +174 -0
  496. package/dist/senses/cli/kill-ring.js +86 -0
  497. package/dist/senses/cli/message-list.js +51 -0
  498. package/dist/senses/cli/ouro-tui.js +607 -0
  499. package/dist/senses/cli/spinner-imperative.js +135 -0
  500. package/dist/senses/cli/spinner.js +101 -0
  501. package/dist/senses/cli/status-line.js +60 -0
  502. package/dist/senses/cli/streaming-markdown.js +526 -0
  503. package/dist/senses/cli/tool-display.js +85 -0
  504. package/dist/senses/cli/tool-render.js +85 -0
  505. package/dist/senses/cli/tui-store.js +241 -0
  506. package/dist/senses/cli/virtual-list.js +35 -0
  507. package/dist/senses/cli-entry.js +60 -8
  508. package/dist/senses/cli-layout.js +187 -0
  509. package/dist/senses/cli.js +813 -281
  510. package/dist/senses/commands.js +66 -3
  511. package/dist/senses/context-packet-ledger.js +371 -0
  512. package/dist/senses/context-packets.js +154 -0
  513. package/dist/senses/continuity.js +94 -0
  514. package/dist/senses/habit-lifecycle-guard.js +24 -0
  515. package/dist/senses/habit-turn-message.js +160 -0
  516. package/dist/senses/ingress-evidence.js +2 -0
  517. package/dist/senses/mail-entry.js +66 -0
  518. package/dist/senses/mail.js +524 -0
  519. package/dist/senses/pipeline.js +1213 -0
  520. package/dist/senses/private-runtime-worker.js +859 -0
  521. package/dist/senses/private-runtime.js +1496 -0
  522. package/dist/senses/proactive-content-guard.js +51 -0
  523. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  524. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  525. package/dist/senses/sanctuary-grounding.js +118 -0
  526. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  527. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  528. package/dist/senses/sanctuary-health-runner.js +101 -0
  529. package/dist/senses/sanctuary-health.js +408 -0
  530. package/dist/senses/sanctuary-interactive-control.js +306 -0
  531. package/dist/senses/sanctuary-media-catalog-contract.js +235 -0
  532. package/dist/senses/sanctuary-media-optimization.js +514 -0
  533. package/dist/senses/sanctuary-runtime.js +338 -0
  534. package/dist/senses/sanctuary-sab.js +85 -0
  535. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  536. package/dist/senses/shared-turn.js +571 -0
  537. package/dist/senses/surface-tool.js +109 -0
  538. package/dist/senses/teams-entry.js +60 -8
  539. package/dist/senses/teams.js +953 -211
  540. package/dist/senses/telegram-admission.js +711 -0
  541. package/dist/senses/telegram-approval-runtime.js +566 -0
  542. package/dist/senses/telegram-attachments.js +182 -0
  543. package/dist/senses/telegram-audit-ledger.js +220 -0
  544. package/dist/senses/telegram-client.js +1677 -0
  545. package/dist/senses/telegram-effect-adapter.js +859 -0
  546. package/dist/senses/telegram-entry.js +83 -0
  547. package/dist/senses/telegram.js +2026 -0
  548. package/dist/senses/trust-gate.js +207 -2
  549. package/dist/senses/voice/audio-playback.js +237 -0
  550. package/dist/senses/voice/audio-routing.js +119 -0
  551. package/dist/senses/voice/elevenlabs.js +202 -0
  552. package/dist/senses/voice/floor-control.js +431 -0
  553. package/dist/senses/voice/floor-controller.js +115 -0
  554. package/dist/senses/voice/golden-path.js +116 -0
  555. package/dist/senses/voice/index.js +29 -0
  556. package/dist/senses/voice/meeting.js +113 -0
  557. package/dist/senses/voice/outbound.js +190 -0
  558. package/dist/senses/voice/phone.js +33 -0
  559. package/dist/senses/voice/playback.js +139 -0
  560. package/dist/senses/voice/realtime-eval.js +496 -0
  561. package/dist/senses/voice/realtime-trace.js +531 -0
  562. package/dist/senses/voice/transcript.js +70 -0
  563. package/dist/senses/voice/turn.js +191 -0
  564. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  565. package/dist/senses/voice/twilio-phone.js +5081 -0
  566. package/dist/senses/voice/types.js +2 -0
  567. package/dist/senses/voice/whisper.js +161 -0
  568. package/dist/senses/voice-entry.js +81 -0
  569. package/dist/senses/voice-realtime-eval-command.js +99 -0
  570. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  571. package/dist/senses/voice-twilio-entry.js +87 -0
  572. package/dist/trips/core.js +138 -0
  573. package/dist/trips/store.js +265 -0
  574. package/dist/util/frontmatter.js +69 -0
  575. package/npm-shrinkwrap.json +8144 -0
  576. package/package.json +82 -12
  577. package/skills/agent-commerce.md +113 -0
  578. package/skills/browser-navigation.md +117 -0
  579. package/skills/commerce-setup-guide.md +116 -0
  580. package/skills/commerce-setup.md +84 -0
  581. package/skills/configure-dev-tools.md +99 -0
  582. package/skills/travel-planning.md +138 -0
  583. package/AdoptionSpecialist.ouro/agent.json +0 -20
  584. package/AdoptionSpecialist.ouro/psyche/SOUL.md +0 -22
  585. package/dist/heart/daemon/specialist-orchestrator.js +0 -160
  586. package/dist/heart/daemon/specialist-prompt.js +0 -47
  587. package/dist/heart/daemon/specialist-session.js +0 -142
  588. package/dist/heart/daemon/specialist-tools.js +0 -132
  589. package/dist/heart/daemon/subagent-installer.js +0 -125
  590. package/dist/inner-worker-entry.js +0 -4
  591. package/dist/mind/friends/channel.js +0 -49
  592. package/dist/mind/friends/resolver.js +0 -84
  593. package/dist/mind/friends/store-file.js +0 -171
  594. package/dist/mind/friends/store.js +0 -4
  595. package/dist/mind/friends/tokens.js +0 -26
  596. package/dist/mind/friends/types.js +0 -21
  597. package/dist/repertoire/tasks/board.js +0 -122
  598. package/dist/repertoire/tasks/index.js +0 -210
  599. package/dist/repertoire/tasks/middleware.js +0 -65
  600. package/dist/repertoire/tasks/parser.js +0 -173
  601. package/dist/repertoire/tasks/scanner.js +0 -132
  602. package/dist/repertoire/tasks/transitions.js +0 -145
  603. package/dist/senses/bluebubbles-client.js +0 -279
  604. package/dist/senses/bluebubbles-entry.js +0 -11
  605. package/dist/senses/bluebubbles-model.js +0 -253
  606. package/dist/senses/bluebubbles.js +0 -332
  607. package/dist/senses/inner-dialog-worker.js +0 -61
  608. package/dist/senses/inner-dialog.js +0 -231
  609. package/subagents/README.md +0 -73
  610. package/subagents/work-doer.md +0 -233
  611. package/subagents/work-merger.md +0 -624
  612. package/subagents/work-planner.md +0 -373
  613. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  614. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  615. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  616. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  617. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  618. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  619. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  620. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  621. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  622. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  623. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  624. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +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."));
@@ -72,14 +104,13 @@ function parseToolCallInput(argumentsJson) {
72
104
  }
73
105
  }
74
106
  function toAnthropicMessages(messages) {
75
- let system;
107
+ const systemParts = [];
76
108
  const converted = [];
77
109
  for (const msg of messages) {
78
110
  if (msg.role === "system") {
79
- if (!system) {
80
- const text = toAnthropicTextContent(msg.content);
81
- system = text || undefined;
82
- }
111
+ const text = toAnthropicTextContent(msg.content).trim();
112
+ if (text)
113
+ systemParts.push(text);
83
114
  continue;
84
115
  }
85
116
  if (msg.role === "user") {
@@ -92,6 +123,18 @@ function toAnthropicMessages(messages) {
92
123
  if (msg.role === "assistant") {
93
124
  const assistant = msg;
94
125
  const blocks = [];
126
+ // Restore thinking blocks before text/tool_use blocks
127
+ const thinkingBlocks = assistant._thinking_blocks;
128
+ if (thinkingBlocks) {
129
+ for (const tb of thinkingBlocks) {
130
+ if (tb.type === "thinking") {
131
+ blocks.push({ type: "thinking", thinking: tb.thinking, signature: tb.signature });
132
+ }
133
+ else {
134
+ blocks.push({ type: "redacted_thinking", data: tb.data });
135
+ }
136
+ }
137
+ }
95
138
  const text = toAnthropicTextContent(assistant.content);
96
139
  if (text) {
97
140
  blocks.push({ type: "text", text });
@@ -129,7 +172,7 @@ function toAnthropicMessages(messages) {
129
172
  });
130
173
  }
131
174
  }
132
- return { system, messages: converted };
175
+ return { system: systemParts.length > 0 ? systemParts.join("\n\n") : undefined, messages: converted };
133
176
  }
134
177
  function toAnthropicTools(tools) {
135
178
  return tools.map((tool) => ({
@@ -172,52 +215,87 @@ function mergeAnthropicToolArguments(current, partial) {
172
215
  }
173
216
  return current + partial;
174
217
  }
218
+ function classifyAnthropicError(error) {
219
+ return (0, error_classification_1.classifyHttpError)(error, {
220
+ isAuthFailure: isAnthropicAuthFailure,
221
+ isServerError: (e) => e.status === 529,
222
+ });
223
+ }
175
224
  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
225
  const lower = error.message.toLowerCase();
182
226
  return (lower.includes("oauth authentication") ||
183
227
  lower.includes("authentication failed") ||
184
228
  lower.includes("unauthorized") ||
185
229
  lower.includes("invalid api key"));
186
230
  }
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
231
  async function streamAnthropicMessages(client, model, request) {
195
232
  const { system, messages } = toAnthropicMessages(request.messages);
233
+ const additionalSystemParts = request.messages
234
+ .filter((message) => message.role === "system")
235
+ .slice(1)
236
+ .map((message) => toAnthropicTextContent(message.content).trim())
237
+ .filter((text) => text.length > 0);
196
238
  const anthropicTools = toAnthropicTools(request.activeTools);
239
+ const modelCaps = (0, model_capabilities_1.getModelCapabilities)(model);
240
+ const maxTokens = modelCaps.maxOutputTokens ?? 16384;
197
241
  const params = {
198
242
  model,
199
- max_tokens: 4096,
243
+ max_tokens: maxTokens,
200
244
  messages,
201
245
  stream: true,
246
+ thinking: { type: "adaptive" },
247
+ output_config: { effort: request.reasoningEffort ?? "medium" },
202
248
  };
203
- if (system)
204
- params.system = system;
249
+ // The Anthropic API requires a Claude Code identification block in the system
250
+ // prompt when using OAuth setup tokens (sk-ant-oat01). Without it, Opus/Sonnet
251
+ // 4.6 requests are rejected with 400. This is the API's validation that the
252
+ // token is being used by a Claude Code client.
253
+ const preambleText = "You are Claude Code, Anthropic's official CLI for Claude.";
254
+ if (request.systemPrompt) {
255
+ // Structured SystemPrompt: merge preamble + stable prefix into one cached block,
256
+ // volatile suffix as a separate uncached block.
257
+ const stableBlock = {
258
+ type: "text",
259
+ text: preambleText + "\n\n" + request.systemPrompt.stable,
260
+ cache_control: { type: "ephemeral" },
261
+ };
262
+ params.system = [
263
+ stableBlock,
264
+ ...(request.systemPrompt.volatile
265
+ ? [{ type: "text", text: request.systemPrompt.volatile }]
266
+ : []),
267
+ ...additionalSystemParts.map((text) => ({ type: "text", text })),
268
+ ];
269
+ }
270
+ else if (system) {
271
+ // Fallback: no structured prompt, extract from messages (legacy path)
272
+ params.system = [{ type: "text", text: preambleText }, { type: "text", text: system }];
273
+ }
274
+ else {
275
+ params.system = [{ type: "text", text: preambleText }];
276
+ }
205
277
  if (anthropicTools.length > 0)
206
278
  params.tools = anthropicTools;
207
279
  if (request.toolChoiceRequired && anthropicTools.length > 0) {
208
- params.tool_choice = { type: "any" };
280
+ // Thinking (adaptive or enabled) only supports tool_choice "auto" or "none".
281
+ // "any" forces tool use which is incompatible with extended thinking.
282
+ params.tool_choice = params.thinking ? { type: "auto" } : /* v8 ignore next -- no-thinking path: thinking always set for 4.6 models @preserve */ { type: "any" };
209
283
  }
210
284
  let response;
211
285
  try {
212
286
  response = await client.messages.create(params, request.signal ? { signal: request.signal } : {});
213
287
  }
214
288
  catch (error) {
215
- throw withAnthropicAuthGuidance(error);
289
+ throw error instanceof Error ? error : new Error(String(error));
216
290
  }
217
291
  let content = "";
218
292
  let streamStarted = false;
219
293
  let usage;
220
294
  const toolCalls = new Map();
295
+ const thinkingBlocks = new Map();
296
+ const redactedBlocks = new Map();
297
+ const answerStreamer = new streaming_1.SettleStreamer(request.callbacks, request.eagerSettleStreaming);
298
+ const textOutput = new streaming_1.ProviderTextOutput(request.callbacks);
221
299
  try {
222
300
  for await (const event of response) {
223
301
  if (request.signal?.aborted)
@@ -225,17 +303,30 @@ async function streamAnthropicMessages(client, model, request) {
225
303
  const eventType = String(event.type ?? "");
226
304
  if (eventType === "content_block_start") {
227
305
  const block = event.content_block;
228
- if (block?.type === "tool_use") {
229
- const index = Number(event.index);
306
+ const index = Number(event.index);
307
+ if (block?.type === "thinking") {
308
+ thinkingBlocks.set(index, { type: "thinking", thinking: "", signature: "" });
309
+ }
310
+ else if (block?.type === "redacted_thinking") {
311
+ redactedBlocks.set(index, { type: "redacted_thinking", data: String(block.data ?? "") });
312
+ }
313
+ else if (block?.type === "tool_use") {
230
314
  const rawInput = block.input;
231
315
  const input = rawInput && typeof rawInput === "object"
232
316
  ? JSON.stringify(rawInput)
233
317
  : "";
318
+ const name = String(block.name ?? "");
234
319
  toolCalls.set(index, {
235
320
  id: String(block.id ?? ""),
236
- name: String(block.name ?? ""),
321
+ name,
237
322
  arguments: input,
238
323
  });
324
+ // Activate eager streaming for sole settle tool call
325
+ /* v8 ignore next -- settle streaming activation, tested via SettleStreamer unit tests @preserve */
326
+ if (name === "settle" && toolCalls.size === 1) {
327
+ answerStreamer.activate();
328
+ textOutput.suppress();
329
+ }
239
330
  }
240
331
  continue;
241
332
  }
@@ -249,7 +340,7 @@ async function streamAnthropicMessages(client, model, request) {
249
340
  }
250
341
  const text = String(delta?.text ?? "");
251
342
  content += text;
252
- request.callbacks.onTextChunk(text);
343
+ textOutput.emit(text);
253
344
  continue;
254
345
  }
255
346
  if (deltaType === "thinking_delta") {
@@ -257,14 +348,31 @@ async function streamAnthropicMessages(client, model, request) {
257
348
  request.callbacks.onModelStreamStart();
258
349
  streamStarted = true;
259
350
  }
260
- request.callbacks.onReasoningChunk(String(delta?.thinking ?? ""));
351
+ const thinkingText = String(delta?.thinking ?? "");
352
+ request.callbacks.onReasoningChunk(thinkingText);
353
+ const thinkingIndex = Number(event.index);
354
+ const thinkingBlock = thinkingBlocks.get(thinkingIndex);
355
+ if (thinkingBlock)
356
+ thinkingBlock.thinking += thinkingText;
357
+ continue;
358
+ }
359
+ if (deltaType === "signature_delta") {
360
+ const sigIndex = Number(event.index);
361
+ const sigBlock = thinkingBlocks.get(sigIndex);
362
+ if (sigBlock)
363
+ sigBlock.signature += String(delta?.signature ?? "");
261
364
  continue;
262
365
  }
263
366
  if (deltaType === "input_json_delta") {
264
367
  const index = Number(event.index);
265
368
  const existing = toolCalls.get(index);
266
369
  if (existing) {
267
- existing.arguments = mergeAnthropicToolArguments(existing.arguments, String(delta?.partial_json ?? ""));
370
+ const partialJson = String(delta?.partial_json ?? "");
371
+ existing.arguments = mergeAnthropicToolArguments(existing.arguments, partialJson);
372
+ /* v8 ignore next -- settle delta streaming, tested via SettleStreamer unit tests @preserve */
373
+ if (existing.name === "settle" && toolCalls.size === 1) {
374
+ answerStreamer.processDelta(partialJson);
375
+ }
268
376
  }
269
377
  continue;
270
378
  }
@@ -286,47 +394,117 @@ async function streamAnthropicMessages(client, model, request) {
286
394
  }
287
395
  }
288
396
  catch (error) {
289
- throw withAnthropicAuthGuidance(error);
397
+ textOutput.discard();
398
+ answerStreamer.cancel();
399
+ throw error instanceof Error ? error : /* v8 ignore next -- defensive: stream errors are always Error @preserve */ new Error(String(error));
400
+ }
401
+ const completedToolCalls = [...toolCalls.values()];
402
+ let settleFinalization;
403
+ if (request.signal?.aborted) {
404
+ textOutput.discard();
405
+ answerStreamer.cancel();
290
406
  }
407
+ else if (completedToolCalls.length === 1
408
+ && completedToolCalls[0].name === "settle"
409
+ && answerStreamer.detected) {
410
+ textOutput.discard();
411
+ settleFinalization = (0, streaming_1.finalizeSettleStream)(answerStreamer, completedToolCalls[0].arguments);
412
+ }
413
+ else {
414
+ answerStreamer.cancel();
415
+ textOutput.flush();
416
+ }
417
+ // Collect all thinking blocks (regular + redacted) sorted by index to preserve ordering
418
+ const allThinkingIndices = [...thinkingBlocks.keys(), ...redactedBlocks.keys()].sort((a, b) => a - b);
419
+ const outputItems = allThinkingIndices.map((idx) => {
420
+ const tb = thinkingBlocks.get(idx);
421
+ if (tb)
422
+ return tb;
423
+ return redactedBlocks.get(idx);
424
+ });
291
425
  return {
292
426
  content,
293
- toolCalls: [...toolCalls.values()],
294
- outputItems: [],
427
+ toolCalls: completedToolCalls,
428
+ outputItems,
295
429
  usage,
430
+ settleStreamed: answerStreamer.streamed,
431
+ ...(settleFinalization ? { settleFinalization } : {}),
296
432
  };
297
433
  }
298
- function createAnthropicProviderRuntime() {
434
+ function createAnthropicProviderRuntime(model, anthropicConfig = (0, config_1.getAnthropicConfig)()) {
299
435
  (0, runtime_1.emitNervesEvent)({
300
436
  component: "engine",
301
437
  event: "engine.provider_init",
302
438
  message: "anthropic provider init",
303
439
  meta: { provider: "anthropic" },
304
440
  });
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."));
441
+ if (!anthropicConfig.setupToken) {
442
+ throw new Error(getAnthropicReauthGuidance("provider 'anthropic' is selected but anthropic.setupToken is missing in the agent vault."));
308
443
  }
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
- });
444
+ const modelCaps = (0, model_capabilities_1.getModelCapabilities)(model);
445
+ const capabilities = new Set();
446
+ if (modelCaps.reasoningEffort)
447
+ capabilities.add("reasoning-effort");
448
+ const credential = resolveAnthropicSetupTokenCredential(anthropicConfig);
449
+ const refreshToken = anthropicConfig.refreshToken;
450
+ const expiresAt = anthropicConfig.expiresAt;
451
+ function createClient(token) {
452
+ return new sdk_1.default({
453
+ authToken: token,
454
+ maxRetries: 0,
455
+ defaultHeaders: {
456
+ "anthropic-beta": ANTHROPIC_OAUTH_BETA_HEADER,
457
+ "anthropic-dangerous-direct-browser-access": "true",
458
+ "user-agent": "claude-cli/2.1.2 (external, cli)",
459
+ "x-app": "cli",
460
+ },
461
+ });
462
+ }
463
+ let currentToken = credential.token;
464
+ let client = createClient(currentToken);
465
+ /* v8 ignore start -- token refresh: dynamic import + ensureFreshToken, tested via integration @preserve */
466
+ async function ensureClient() {
467
+ try {
468
+ const { ensureFreshToken } = await Promise.resolve().then(() => __importStar(require("./anthropic-token")));
469
+ const { getAgentName } = await Promise.resolve().then(() => __importStar(require("../identity")));
470
+ const freshToken = await ensureFreshToken(currentToken, refreshToken, expiresAt, getAgentName());
471
+ if (freshToken !== currentToken) {
472
+ currentToken = freshToken;
473
+ client = createClient(freshToken);
474
+ }
475
+ }
476
+ catch {
477
+ // refresh failed — use existing client
478
+ }
479
+ return client;
480
+ }
481
+ /* v8 ignore stop */
318
482
  return {
319
483
  id: "anthropic",
320
- model: anthropicConfig.model,
321
- client,
484
+ model,
485
+ /* v8 ignore next -- getter: returns mutable client ref @preserve */
486
+ get client() { return client; },
487
+ capabilities,
488
+ supportedReasoningEfforts: modelCaps.reasoningEffort,
322
489
  resetTurnState(_messages) {
323
490
  // Anthropic request payload is derived from canonical messages each turn.
324
491
  },
325
492
  appendToolOutput(_callId, _output) {
326
493
  // Anthropic uses canonical messages for tool_result tracking.
327
494
  },
328
- streamTurn(request) {
329
- return streamAnthropicMessages(client, anthropicConfig.model, request);
495
+ async streamTurn(request) {
496
+ const freshClient = await ensureClient();
497
+ return streamAnthropicMessages(freshClient, model, request);
498
+ },
499
+ /* v8 ignore start -- ping: tested via provider-ping.test.ts @preserve */
500
+ async ping(signal) {
501
+ const freshClient = await ensureClient();
502
+ 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" } });
503
+ },
504
+ /* v8 ignore stop */
505
+ /* v8 ignore next 3 -- delegation: classification logic tested via classifyAnthropicError @preserve */
506
+ classifyError(error) {
507
+ return classifyAnthropicError(error);
330
508
  },
331
509
  };
332
510
  }
@@ -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
  }