@ouro.bot/cli 0.1.0-alpha.55 → 0.1.0-alpha.550

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 (386) hide show
  1. package/README.md +133 -19
  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-bootstrap-drift.md +54 -0
  6. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  7. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  8. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  9. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/changelog.json +3555 -0
  14. package/dist/arc/attention-types.js +8 -0
  15. package/dist/arc/cares.js +140 -0
  16. package/dist/arc/episodes.js +117 -0
  17. package/dist/arc/intentions.js +133 -0
  18. package/dist/arc/json-store.js +117 -0
  19. package/dist/arc/obligations.js +237 -0
  20. package/dist/arc/packets.js +193 -0
  21. package/dist/arc/presence.js +185 -0
  22. package/dist/arc/task-lifecycle.js +65 -0
  23. package/dist/heart/active-work.js +837 -26
  24. package/dist/heart/agent-entry.js +58 -3
  25. package/dist/heart/attachments/image-normalize.js +194 -0
  26. package/dist/heart/attachments/materialize.js +97 -0
  27. package/dist/heart/attachments/originals.js +88 -0
  28. package/dist/heart/attachments/render.js +29 -0
  29. package/dist/heart/attachments/sources/adapter.js +2 -0
  30. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  31. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  32. package/dist/heart/attachments/sources/index.js +16 -0
  33. package/dist/heart/attachments/store.js +103 -0
  34. package/dist/heart/attachments/types.js +93 -0
  35. package/dist/heart/auth/auth-flow.js +479 -0
  36. package/dist/heart/background-operations.js +281 -0
  37. package/dist/heart/bundle-state.js +168 -0
  38. package/dist/heart/commitments.js +111 -0
  39. package/dist/heart/config-registry.js +304 -0
  40. package/dist/heart/config.js +114 -118
  41. package/dist/heart/core.js +925 -246
  42. package/dist/heart/cross-chat-delivery.js +3 -18
  43. package/dist/heart/daemon/agent-config-check.js +512 -0
  44. package/dist/heart/daemon/agent-discovery.js +102 -3
  45. package/dist/heart/daemon/agent-service.js +522 -0
  46. package/dist/heart/daemon/agentic-repair.js +554 -0
  47. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  48. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  49. package/dist/heart/daemon/cadence.js +70 -0
  50. package/dist/heart/daemon/cli-defaults.js +665 -0
  51. package/dist/heart/daemon/cli-exec.js +7565 -0
  52. package/dist/heart/daemon/cli-help.js +498 -0
  53. package/dist/heart/daemon/cli-parse.js +1590 -0
  54. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  55. package/dist/heart/daemon/cli-render.js +775 -0
  56. package/dist/heart/daemon/cli-types.js +8 -0
  57. package/dist/heart/daemon/connect-bay.js +323 -0
  58. package/dist/heart/daemon/daemon-cli.js +29 -1672
  59. package/dist/heart/daemon/daemon-entry.js +417 -2
  60. package/dist/heart/daemon/daemon-health.js +183 -0
  61. package/dist/heart/daemon/daemon-rollup.js +58 -0
  62. package/dist/heart/daemon/daemon-runtime-sync.js +87 -13
  63. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  64. package/dist/heart/daemon/daemon.js +758 -71
  65. package/dist/heart/daemon/dns-workflow.js +394 -0
  66. package/dist/heart/daemon/doctor-types.js +8 -0
  67. package/dist/heart/daemon/doctor.js +844 -0
  68. package/dist/heart/daemon/drift-detection.js +146 -0
  69. package/dist/heart/daemon/health-monitor.js +122 -1
  70. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  71. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  72. package/dist/heart/daemon/http-health-probe.js +80 -0
  73. package/dist/heart/daemon/human-command-screens.js +234 -0
  74. package/dist/heart/daemon/human-readiness.js +114 -0
  75. package/dist/heart/daemon/inner-status.js +102 -0
  76. package/dist/heart/daemon/interactive-repair.js +394 -0
  77. package/dist/heart/daemon/launchd.js +37 -8
  78. package/dist/heart/daemon/log-tailer.js +82 -12
  79. package/dist/heart/daemon/logs-prune.js +110 -0
  80. package/dist/heart/daemon/mcp-canary.js +297 -0
  81. package/dist/heart/daemon/message-router.js +2 -2
  82. package/dist/heart/daemon/os-cron-deps.js +135 -0
  83. package/dist/heart/daemon/os-cron.js +14 -12
  84. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  85. package/dist/heart/daemon/ouro-entry.js +3 -1
  86. package/dist/heart/daemon/process-manager.js +375 -33
  87. package/dist/heart/daemon/provider-discovery.js +137 -0
  88. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  89. package/dist/heart/daemon/pulse.js +475 -0
  90. package/dist/heart/daemon/readiness-repair.js +365 -0
  91. package/dist/heart/daemon/run-hooks.js +2 -0
  92. package/dist/heart/daemon/runtime-logging.js +67 -16
  93. package/dist/heart/daemon/runtime-metadata.js +3 -31
  94. package/dist/heart/daemon/safe-mode.js +161 -0
  95. package/dist/heart/daemon/sense-manager.js +353 -38
  96. package/dist/heart/daemon/session-id-resolver.js +131 -0
  97. package/dist/heart/daemon/skill-management-installer.js +94 -0
  98. package/dist/heart/daemon/socket-client.js +158 -11
  99. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  100. package/dist/heart/daemon/startup-tui.js +330 -0
  101. package/dist/heart/daemon/task-scheduler.js +3 -25
  102. package/dist/heart/daemon/terminal-ui.js +499 -0
  103. package/dist/heart/daemon/thoughts.js +162 -17
  104. package/dist/heart/daemon/up-progress.js +366 -0
  105. package/dist/heart/daemon/vault-items.js +56 -0
  106. package/dist/heart/delegation.js +1 -1
  107. package/dist/heart/habits/habit-migration.js +189 -0
  108. package/dist/heart/habits/habit-parser.js +140 -0
  109. package/dist/heart/habits/habit-runtime-state.js +100 -0
  110. package/dist/heart/habits/habit-scheduler.js +372 -0
  111. package/dist/heart/{daemon → hatch}/hatch-flow.js +52 -117
  112. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  113. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  114. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  115. package/dist/heart/identity.js +200 -51
  116. package/dist/heart/kept-notes.js +357 -0
  117. package/dist/heart/kicks.js +1 -1
  118. package/dist/heart/machine-identity.js +161 -0
  119. package/dist/heart/mail-import-discovery.js +353 -0
  120. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  121. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  122. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  123. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  124. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  125. package/dist/heart/mailbox/mailbox-http.js +99 -0
  126. package/dist/heart/mailbox/mailbox-read.js +31 -0
  127. package/dist/heart/mailbox/mailbox-types.js +27 -0
  128. package/dist/heart/mailbox/mailbox-view.js +195 -0
  129. package/dist/heart/mailbox/readers/agent-machine.js +382 -0
  130. package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
  131. package/dist/heart/mailbox/readers/mail.js +362 -0
  132. package/dist/heart/mailbox/readers/runtime-readers.js +651 -0
  133. package/dist/heart/mailbox/readers/sessions.js +232 -0
  134. package/dist/heart/mailbox/readers/shared.js +111 -0
  135. package/dist/heart/mcp/mcp-server.js +683 -0
  136. package/dist/heart/migrate-config.js +100 -0
  137. package/dist/heart/model-capabilities.js +19 -0
  138. package/dist/heart/platform.js +81 -0
  139. package/dist/heart/provider-attempt.js +134 -0
  140. package/dist/heart/provider-binding-resolver.js +255 -0
  141. package/dist/heart/provider-credentials.js +425 -0
  142. package/dist/heart/provider-failover.js +301 -0
  143. package/dist/heart/provider-models.js +81 -0
  144. package/dist/heart/provider-ping.js +262 -0
  145. package/dist/heart/provider-state.js +216 -0
  146. package/dist/heart/provider-visibility.js +188 -0
  147. package/dist/heart/providers/anthropic-token.js +131 -0
  148. package/dist/heart/providers/anthropic.js +139 -52
  149. package/dist/heart/providers/azure.js +97 -13
  150. package/dist/heart/providers/error-classification.js +127 -0
  151. package/dist/heart/providers/github-copilot.js +145 -0
  152. package/dist/heart/providers/minimax-vlm.js +189 -0
  153. package/dist/heart/providers/minimax.js +26 -8
  154. package/dist/heart/providers/openai-codex.js +55 -40
  155. package/dist/heart/runtime-capability-check.js +170 -0
  156. package/dist/heart/runtime-credentials.js +367 -0
  157. package/dist/heart/runtime-cwd.js +87 -0
  158. package/dist/heart/sense-truth.js +11 -4
  159. package/dist/heart/session-activity.js +43 -22
  160. package/dist/heart/session-events.js +1149 -0
  161. package/dist/heart/session-playback-cli-main.js +5 -0
  162. package/dist/heart/session-playback-cli.js +36 -0
  163. package/dist/heart/session-playback.js +231 -0
  164. package/dist/heart/session-stats-cli-main.js +5 -0
  165. package/dist/heart/session-stats.js +182 -0
  166. package/dist/heart/session-transcript.js +243 -0
  167. package/dist/heart/start-of-turn-packet.js +345 -0
  168. package/dist/heart/streaming.js +44 -27
  169. package/dist/heart/sync-classification.js +176 -0
  170. package/dist/heart/sync.js +449 -0
  171. package/dist/heart/target-resolution.js +9 -5
  172. package/dist/heart/tempo.js +93 -0
  173. package/dist/heart/temporal-view.js +41 -0
  174. package/dist/heart/timeouts.js +101 -0
  175. package/dist/heart/tool-activity-callbacks.js +59 -0
  176. package/dist/heart/tool-description.js +139 -0
  177. package/dist/heart/tool-friction.js +55 -0
  178. package/dist/heart/tool-loop.js +200 -0
  179. package/dist/heart/turn-context.js +381 -0
  180. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  181. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  182. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  183. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  184. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  185. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  186. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  187. package/dist/mailbox-ui/assets/index-BPr5vNuM.css +1 -0
  188. package/dist/mailbox-ui/assets/index-Cm51CY9W.js +61 -0
  189. package/dist/mailbox-ui/index.html +15 -0
  190. package/dist/mailroom/attention.js +167 -0
  191. package/dist/mailroom/autonomy.js +209 -0
  192. package/dist/mailroom/blob-store.js +674 -0
  193. package/dist/mailroom/body-cache.js +61 -0
  194. package/dist/mailroom/core.js +720 -0
  195. package/dist/mailroom/entry.js +160 -0
  196. package/dist/mailroom/file-store.js +430 -0
  197. package/dist/mailroom/mbox-import.js +383 -0
  198. package/dist/mailroom/outbound.js +380 -0
  199. package/dist/mailroom/policy.js +263 -0
  200. package/dist/mailroom/reader.js +233 -0
  201. package/dist/mailroom/search-cache.js +256 -0
  202. package/dist/mailroom/search-relevance.js +319 -0
  203. package/dist/mailroom/smtp-ingress.js +176 -0
  204. package/dist/mailroom/source-state.js +176 -0
  205. package/dist/mailroom/thread.js +109 -0
  206. package/dist/mailroom/travel-extract.js +89 -0
  207. package/dist/mind/bundle-manifest.js +7 -1
  208. package/dist/mind/context.js +165 -101
  209. package/dist/mind/diary-integrity.js +60 -0
  210. package/dist/mind/{memory.js → diary.js} +62 -75
  211. package/dist/mind/embedding-provider.js +60 -0
  212. package/dist/mind/file-state.js +179 -0
  213. package/dist/mind/friends/channel.js +30 -0
  214. package/dist/mind/friends/resolver.js +54 -2
  215. package/dist/mind/friends/store-file.js +39 -3
  216. package/dist/mind/friends/types.js +2 -2
  217. package/dist/mind/journal-index.js +161 -0
  218. package/dist/mind/note-search.js +268 -0
  219. package/dist/mind/obligation-steering.js +221 -0
  220. package/dist/mind/pending.js +4 -0
  221. package/dist/mind/prompt-refresh.js +3 -2
  222. package/dist/mind/prompt.js +995 -123
  223. package/dist/mind/provenance-trust.js +26 -0
  224. package/dist/mind/scrutiny.js +173 -0
  225. package/dist/nerves/cli-logging.js +7 -1
  226. package/dist/nerves/coverage/audit-rules.js +15 -6
  227. package/dist/nerves/coverage/audit.js +28 -2
  228. package/dist/nerves/coverage/cli.js +1 -1
  229. package/dist/nerves/coverage/contract.js +5 -5
  230. package/dist/nerves/coverage/file-completeness.js +139 -5
  231. package/dist/nerves/coverage/run-artifacts.js +1 -1
  232. package/dist/nerves/event-buffer.js +111 -0
  233. package/dist/nerves/index.js +224 -4
  234. package/dist/nerves/observation.js +20 -0
  235. package/dist/nerves/redact.js +79 -0
  236. package/dist/nerves/review/cli-main.js +5 -0
  237. package/dist/nerves/review/cli.js +156 -0
  238. package/dist/nerves/review/core.js +152 -0
  239. package/dist/nerves/runtime.js +5 -1
  240. package/dist/repertoire/ado-client.js +15 -56
  241. package/dist/repertoire/ado-semantic.js +11 -10
  242. package/dist/repertoire/api-client.js +97 -0
  243. package/dist/repertoire/bitwarden-store.js +816 -0
  244. package/dist/repertoire/bundle-templates.js +72 -0
  245. package/dist/repertoire/bw-installer.js +180 -0
  246. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  247. package/dist/repertoire/coding/context-pack.js +330 -0
  248. package/dist/repertoire/coding/feedback.js +197 -30
  249. package/dist/repertoire/coding/manager.js +158 -9
  250. package/dist/repertoire/coding/spawner.js +55 -9
  251. package/dist/repertoire/coding/tools.js +170 -7
  252. package/dist/repertoire/commerce-errors.js +109 -0
  253. package/dist/repertoire/commerce-self-test.js +156 -0
  254. package/dist/repertoire/credential-access.js +111 -0
  255. package/dist/repertoire/duffel-client.js +185 -0
  256. package/dist/repertoire/github-client.js +14 -55
  257. package/dist/repertoire/graph-client.js +11 -52
  258. package/dist/repertoire/guardrails.js +396 -0
  259. package/dist/repertoire/mcp-client.js +295 -0
  260. package/dist/repertoire/mcp-manager.js +362 -0
  261. package/dist/repertoire/mcp-tools.js +63 -0
  262. package/dist/repertoire/shell-sessions.js +133 -0
  263. package/dist/repertoire/skills.js +15 -24
  264. package/dist/repertoire/stripe-client.js +131 -0
  265. package/dist/repertoire/tasks/board.js +31 -5
  266. package/dist/repertoire/tasks/fix.js +182 -0
  267. package/dist/repertoire/tasks/index.js +16 -4
  268. package/dist/repertoire/tasks/lifecycle.js +2 -2
  269. package/dist/repertoire/tasks/parser.js +3 -2
  270. package/dist/repertoire/tasks/scanner.js +194 -37
  271. package/dist/repertoire/tasks/transitions.js +16 -78
  272. package/dist/repertoire/tool-results.js +29 -0
  273. package/dist/repertoire/tools-attachments.js +317 -0
  274. package/dist/repertoire/tools-base.js +47 -1075
  275. package/dist/repertoire/tools-bluebubbles.js +1 -0
  276. package/dist/repertoire/tools-bridge.js +142 -0
  277. package/dist/repertoire/tools-bundle.js +984 -0
  278. package/dist/repertoire/tools-config.js +185 -0
  279. package/dist/repertoire/tools-continuity.js +248 -0
  280. package/dist/repertoire/tools-credential.js +381 -0
  281. package/dist/repertoire/tools-files.js +342 -0
  282. package/dist/repertoire/tools-flight.js +224 -0
  283. package/dist/repertoire/tools-flow.js +119 -0
  284. package/dist/repertoire/tools-github.js +1 -7
  285. package/dist/repertoire/tools-mail.js +1857 -0
  286. package/dist/repertoire/tools-notes.js +421 -0
  287. package/dist/repertoire/tools-session.js +750 -0
  288. package/dist/repertoire/tools-shell.js +120 -0
  289. package/dist/repertoire/tools-stripe.js +180 -0
  290. package/dist/repertoire/tools-surface.js +243 -0
  291. package/dist/repertoire/tools-teams.js +9 -39
  292. package/dist/repertoire/tools-travel.js +125 -0
  293. package/dist/repertoire/tools-trip.js +604 -0
  294. package/dist/repertoire/tools-user-profile.js +144 -0
  295. package/dist/repertoire/tools-vault.js +40 -0
  296. package/dist/repertoire/tools.js +108 -100
  297. package/dist/repertoire/travel-api-client.js +360 -0
  298. package/dist/repertoire/user-profile.js +131 -0
  299. package/dist/repertoire/vault-setup.js +246 -0
  300. package/dist/repertoire/vault-unlock.js +561 -0
  301. package/dist/scripts/claude-code-hook.js +41 -0
  302. package/dist/scripts/claude-code-stop-hook.js +47 -0
  303. package/dist/senses/attention-queue.js +116 -0
  304. package/dist/senses/bluebubbles/active-turns.js +216 -0
  305. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  306. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  307. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  308. package/dist/senses/bluebubbles/entry.js +77 -0
  309. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  310. package/dist/senses/bluebubbles/index.js +2305 -0
  311. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  312. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  313. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  314. package/dist/senses/bluebubbles/processed-log.js +133 -0
  315. package/dist/senses/bluebubbles/replay.js +137 -0
  316. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  317. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  318. package/dist/senses/cli/bracketed-paste.js +82 -0
  319. package/dist/senses/cli/image-paste.js +287 -0
  320. package/dist/senses/cli/image-ref-navigation.js +75 -0
  321. package/dist/senses/cli/ink-app.js +156 -0
  322. package/dist/senses/cli/inline-diff.js +64 -0
  323. package/dist/senses/cli/input-keys.js +174 -0
  324. package/dist/senses/cli/kill-ring.js +86 -0
  325. package/dist/senses/cli/message-list.js +51 -0
  326. package/dist/senses/cli/ouro-tui.js +607 -0
  327. package/dist/senses/cli/spinner-imperative.js +135 -0
  328. package/dist/senses/cli/spinner.js +101 -0
  329. package/dist/senses/cli/status-line.js +60 -0
  330. package/dist/senses/cli/streaming-markdown.js +526 -0
  331. package/dist/senses/cli/tool-display.js +85 -0
  332. package/dist/senses/cli/tool-render.js +85 -0
  333. package/dist/senses/cli/tui-store.js +240 -0
  334. package/dist/senses/cli/virtual-list.js +35 -0
  335. package/dist/senses/cli-entry.js +60 -8
  336. package/dist/senses/cli-layout.js +187 -0
  337. package/dist/senses/cli.js +520 -209
  338. package/dist/senses/commands.js +66 -3
  339. package/dist/senses/habit-turn-message.js +108 -0
  340. package/dist/senses/inner-dialog-worker.js +175 -21
  341. package/dist/senses/inner-dialog.js +330 -27
  342. package/dist/senses/mail-entry.js +66 -0
  343. package/dist/senses/mail.js +379 -0
  344. package/dist/senses/pipeline.js +569 -182
  345. package/dist/senses/proactive-content-guard.js +51 -0
  346. package/dist/senses/shared-turn.js +248 -0
  347. package/dist/senses/surface-tool.js +68 -0
  348. package/dist/senses/teams-entry.js +60 -8
  349. package/dist/senses/teams.js +387 -98
  350. package/dist/senses/trust-gate.js +100 -5
  351. package/dist/trips/core.js +138 -0
  352. package/dist/trips/store.js +146 -0
  353. package/package.json +38 -7
  354. package/skills/agent-commerce.md +106 -0
  355. package/skills/browser-navigation.md +117 -0
  356. package/skills/commerce-setup-guide.md +116 -0
  357. package/skills/commerce-setup.md +84 -0
  358. package/skills/configure-dev-tools.md +101 -0
  359. package/skills/travel-planning.md +138 -0
  360. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  361. package/dist/heart/daemon/subagent-installer.js +0 -166
  362. package/dist/heart/session-recall.js +0 -116
  363. package/dist/mind/associative-recall.js +0 -209
  364. package/dist/senses/bluebubbles-entry.js +0 -13
  365. package/dist/senses/bluebubbles.js +0 -1177
  366. package/dist/senses/debug-activity.js +0 -148
  367. package/subagents/README.md +0 -86
  368. package/subagents/work-doer.md +0 -237
  369. package/subagents/work-merger.md +0 -618
  370. package/subagents/work-planner.md +0 -390
  371. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  372. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  373. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  374. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  375. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  376. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  377. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  378. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  379. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  380. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  381. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  382. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  383. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  384. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  385. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  386. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.classifyGithubCopilotError = classifyGithubCopilotError;
7
+ exports.createGithubCopilotProviderRuntime = createGithubCopilotProviderRuntime;
8
+ const openai_1 = __importDefault(require("openai"));
9
+ const config_1 = require("../config");
10
+ const runtime_1 = require("../../nerves/runtime");
11
+ const streaming_1 = require("../streaming");
12
+ const model_capabilities_1 = require("../model-capabilities");
13
+ const error_classification_1 = require("./error-classification");
14
+ function classifyGithubCopilotError(error) {
15
+ return (0, error_classification_1.classifyHttpError)(error);
16
+ }
17
+ function createGithubCopilotProviderRuntime(model, config = (0, config_1.getGithubCopilotConfig)()) {
18
+ (0, runtime_1.emitNervesEvent)({
19
+ component: "engine",
20
+ event: "engine.provider_init",
21
+ message: "github-copilot provider init",
22
+ meta: { provider: "github-copilot" },
23
+ });
24
+ if (!config.githubToken) {
25
+ throw new Error("provider 'github-copilot' is selected but github-copilot.githubToken is missing in the agent vault. Run `ouro auth --agent <agent> --provider github-copilot`.");
26
+ }
27
+ if (!config.baseUrl) {
28
+ throw new Error("provider 'github-copilot' is selected but github-copilot.baseUrl is missing in the agent vault. Run `ouro auth --agent <agent> --provider github-copilot`.");
29
+ }
30
+ const isCompletionsModel = model.startsWith("claude");
31
+ const modelCaps = (0, model_capabilities_1.getModelCapabilities)(model);
32
+ const capabilities = new Set();
33
+ /* v8 ignore next -- branch: capability detection tested via unit test @preserve */
34
+ if (modelCaps.reasoningEffort)
35
+ capabilities.add("reasoning-effort");
36
+ const client = new openai_1.default({
37
+ apiKey: config.githubToken,
38
+ baseURL: config.baseUrl,
39
+ maxRetries: 0,
40
+ });
41
+ if (isCompletionsModel) {
42
+ // Chat completions path (Claude models via Copilot)
43
+ return {
44
+ id: "github-copilot",
45
+ model,
46
+ client,
47
+ capabilities,
48
+ supportedReasoningEfforts: modelCaps.reasoningEffort,
49
+ resetTurnState(_messages) {
50
+ // No provider-owned turn state for chat-completions path.
51
+ },
52
+ appendToolOutput(_callId, _output) {
53
+ // Chat-completions providers rely on canonical messages only.
54
+ },
55
+ /* v8 ignore start -- streamTurn: tested via mock assertions in github-copilot.test.ts @preserve */
56
+ async streamTurn(request) {
57
+ const params = {
58
+ messages: request.messages,
59
+ tools: request.activeTools,
60
+ stream: true,
61
+ };
62
+ if (this.model)
63
+ params.model = this.model;
64
+ if (request.traceId)
65
+ params.metadata = { trace_id: request.traceId };
66
+ if (request.toolChoiceRequired)
67
+ params.tool_choice = "required";
68
+ try {
69
+ return await (0, streaming_1.streamChatCompletion)(this.client, params, request.callbacks, request.signal, request.eagerSettleStreaming);
70
+ }
71
+ catch (error) {
72
+ throw error instanceof Error ? error : new Error(String(error));
73
+ }
74
+ },
75
+ /* v8 ignore stop */
76
+ /* v8 ignore start -- ping: tested via provider-ping.test.ts @preserve */
77
+ async ping(signal) {
78
+ await this.client.chat.completions.create({ model: this.model, max_tokens: 1, messages: [{ role: "user", content: "ping" }] }, { signal });
79
+ },
80
+ /* v8 ignore stop */
81
+ /* v8 ignore next 3 -- delegation: classification logic tested via classifyGithubCopilotError @preserve */
82
+ classifyError(error) {
83
+ return classifyGithubCopilotError(error);
84
+ },
85
+ };
86
+ }
87
+ // Responses API path (GPT models via Copilot)
88
+ let nativeInput = null;
89
+ let nativeInstructions = "";
90
+ return {
91
+ id: "github-copilot",
92
+ model,
93
+ client,
94
+ capabilities,
95
+ supportedReasoningEfforts: modelCaps.reasoningEffort,
96
+ /* v8 ignore start -- responses path: tested via mock assertions in github-copilot.test.ts @preserve */
97
+ resetTurnState(messages) {
98
+ const { instructions, input } = (0, streaming_1.toResponsesInput)(messages);
99
+ nativeInput = input;
100
+ nativeInstructions = instructions;
101
+ },
102
+ appendToolOutput(callId, output) {
103
+ if (!nativeInput)
104
+ return;
105
+ nativeInput.push({ type: "function_call_output", call_id: callId, output: (0, streaming_1.truncateResponsesFunctionCallOutput)(output) });
106
+ },
107
+ async streamTurn(request) {
108
+ if (!nativeInput)
109
+ this.resetTurnState(request.messages);
110
+ const params = {
111
+ model: this.model,
112
+ input: nativeInput,
113
+ instructions: nativeInstructions,
114
+ tools: (0, streaming_1.toResponsesTools)(request.activeTools),
115
+ reasoning: { effort: request.reasoningEffort ?? "medium", summary: "detailed" },
116
+ stream: true,
117
+ store: false,
118
+ include: ["reasoning.encrypted_content"],
119
+ };
120
+ if (request.traceId)
121
+ params.metadata = { trace_id: request.traceId };
122
+ if (request.toolChoiceRequired)
123
+ params.tool_choice = "required";
124
+ try {
125
+ const result = await (0, streaming_1.streamResponsesApi)(this.client, params, request.callbacks, request.signal, request.eagerSettleStreaming);
126
+ for (const item of result.outputItems)
127
+ nativeInput.push(item);
128
+ return result;
129
+ }
130
+ catch (error) {
131
+ throw error instanceof Error ? error : new Error(String(error));
132
+ }
133
+ },
134
+ /* v8 ignore stop */
135
+ /* v8 ignore start -- ping: tested via provider-ping.test.ts @preserve */
136
+ async ping(signal) {
137
+ await this.client.responses.create({ model: this.model, input: "ping", max_output_tokens: 16 }, { signal });
138
+ },
139
+ /* v8 ignore stop */
140
+ /* v8 ignore next 3 -- delegation: classification logic tested via classifyGithubCopilotError @preserve */
141
+ classifyError(error) {
142
+ return classifyGithubCopilotError(error);
143
+ },
144
+ };
145
+ }
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.minimaxVlmDescribe = minimaxVlmDescribe;
4
+ const runtime_1 = require("../../nerves/runtime");
5
+ const error_classification_1 = require("./error-classification");
6
+ // No default timeout — if the caller doesn't pass `timeoutMs`, we don't
7
+ // layer an AbortSignal on top of fetch, which means undici's own defaults
8
+ // (headersTimeout and bodyTimeout, both 5 minutes in the current Node) are
9
+ // the ceiling. That's the right ceiling: long enough to tolerate any
10
+ // legitimate MiniMax VLM slow window, short enough to eventually give up on
11
+ // a dead endpoint, and — unlike a number we picked — it's the stack's
12
+ // actual default rather than a harness-imposed fiction.
13
+ //
14
+ // Tests that want to exercise the timeout branch pass an explicit
15
+ // `timeoutMs`; production callers omit it and get undici's behavior.
16
+ //
17
+ // Same reasoning as PR #322 (dropped the 30s SDK timeout from the LLM
18
+ // providers): the harness shouldn't impose artificially tight request
19
+ // ceilings when the underlying stack already has correct defaults.
20
+ const MODEL_NAME = "minimax-vlm";
21
+ const SUPPORTED_DATA_URL_PATTERN = /^data:image\/(png|jpeg|webp);base64,/i;
22
+ function buildVlmUrl(baseURL) {
23
+ const stripped = baseURL.replace(/\/v1\/?$/, "").replace(/\/$/, "");
24
+ return `${stripped}/v1/coding_plan/vlm`;
25
+ }
26
+ function extractMimeType(imageDataUrl) {
27
+ const match = /^data:([^;,]+)[;,]/.exec(imageDataUrl);
28
+ return match?.[1]?.toLowerCase();
29
+ }
30
+ function emitStart(params) {
31
+ (0, runtime_1.emitNervesEvent)({
32
+ level: "warn",
33
+ component: "senses",
34
+ event: "senses.bluebubbles_vlm_describe_start",
35
+ message: "minimax vlm describe start",
36
+ meta: {
37
+ attachmentGuid: params.attachmentGuid,
38
+ mimeType: params.mimeType,
39
+ promptLength: params.prompt.length,
40
+ model: MODEL_NAME,
41
+ chatModel: params.chatModel,
42
+ },
43
+ });
44
+ }
45
+ function emitEnd(params, descriptionLength, latencyMs) {
46
+ (0, runtime_1.emitNervesEvent)({
47
+ level: "warn",
48
+ component: "senses",
49
+ event: "senses.bluebubbles_vlm_describe_end",
50
+ message: "minimax vlm describe end",
51
+ meta: {
52
+ attachmentGuid: params.attachmentGuid,
53
+ descriptionLength,
54
+ latencyMs,
55
+ model: MODEL_NAME,
56
+ },
57
+ });
58
+ }
59
+ function emitError(params, reason, status, traceId) {
60
+ (0, runtime_1.emitNervesEvent)({
61
+ level: "warn",
62
+ component: "senses",
63
+ event: "senses.bluebubbles_vlm_describe_error",
64
+ message: "minimax vlm describe error",
65
+ meta: {
66
+ attachmentGuid: params.attachmentGuid,
67
+ mimeType: params.mimeType,
68
+ model: MODEL_NAME,
69
+ reason,
70
+ status,
71
+ traceId,
72
+ },
73
+ });
74
+ }
75
+ function throwAndEmit(params, message, status, traceId) {
76
+ emitError(params, message, status, traceId);
77
+ const err = new Error(message);
78
+ if (status !== undefined)
79
+ err.status = status;
80
+ if (traceId)
81
+ err.traceId = traceId;
82
+ throw err;
83
+ }
84
+ async function minimaxVlmDescribe(params) {
85
+ if (!params.apiKey) {
86
+ // We deliberately do NOT emit _start for param-validation errors — there's
87
+ // no meaningful "started a request" to pair with. Only the _error fires.
88
+ emitError(params, "minimax VLM: API key is empty — run `ouro auth --agent <agent> --provider minimax`");
89
+ throw new Error("minimax VLM: API key is empty — run `ouro auth --agent <agent> --provider minimax`");
90
+ }
91
+ if (!params.prompt) {
92
+ emitError(params, "minimax VLM: missing prompt — supply a targeted question (e.g. 'what's the flight number in the bottom-right?') and retry");
93
+ throw new Error("minimax VLM: missing prompt — supply a targeted question (e.g. 'what's the flight number in the bottom-right?') and retry");
94
+ }
95
+ if (!params.imageDataUrl) {
96
+ emitError(params, "minimax VLM: missing image data URL — verify the attachment downloaded OK or ask the user to resend the image");
97
+ throw new Error("minimax VLM: missing image data URL — verify the attachment downloaded OK or ask the user to resend the image");
98
+ }
99
+ if (!SUPPORTED_DATA_URL_PATTERN.test(params.imageDataUrl)) {
100
+ const mime = extractMimeType(params.imageDataUrl) ?? "unknown";
101
+ const msg = `minimax VLM: image must be a data:image/(png|jpeg|webp);base64,... URL but got ${mime} — ask the user to resend as a screenshot (png or jpeg)`;
102
+ emitError({ ...params, mimeType: params.mimeType ?? mime }, msg);
103
+ throw new Error(msg);
104
+ }
105
+ const fetchImpl = params.fetchImpl ?? fetch;
106
+ const url = buildVlmUrl(params.baseURL);
107
+ emitStart(params);
108
+ const startTs = Date.now();
109
+ // Only layer an AbortSignal if the caller explicitly asked for one.
110
+ // Omitting it lets undici's defaults (headersTimeout + bodyTimeout = 5min
111
+ // each in current Node) act as the ceiling — see the long comment on
112
+ // DEFAULT_TIMEOUT_MS above for the rationale.
113
+ const fetchOptions = {
114
+ method: "POST",
115
+ headers: {
116
+ "Authorization": `Bearer ${params.apiKey}`,
117
+ "Content-Type": "application/json",
118
+ "MM-API-Source": "Ouroboros",
119
+ },
120
+ body: JSON.stringify({
121
+ prompt: params.prompt,
122
+ image_url: params.imageDataUrl,
123
+ }),
124
+ };
125
+ if (typeof params.timeoutMs === "number" && params.timeoutMs > 0) {
126
+ fetchOptions.signal = AbortSignal.timeout(params.timeoutMs);
127
+ }
128
+ let response;
129
+ try {
130
+ response = await fetchImpl(url, fetchOptions);
131
+ }
132
+ catch (error) {
133
+ const err = (error instanceof Error ? error : new Error(String(error)));
134
+ if (err.name === "AbortError" || err.name === "TimeoutError") {
135
+ const seconds = typeof params.timeoutMs === "number" ? Math.round(params.timeoutMs / 1000) : null;
136
+ const hint = seconds !== null
137
+ ? `request timed out after ${seconds}s — retry or ask the user to resend the image`
138
+ : `request timed out (underlying stack default) — retry or ask the user to resend the image`;
139
+ throwAndEmit(params, `minimax VLM: ${hint}`);
140
+ }
141
+ if ((0, error_classification_1.isNetworkError)(err)) {
142
+ throwAndEmit(params, `minimax VLM: network error talking to the vlm endpoint (${err.message}) — retry in a moment`);
143
+ }
144
+ throwAndEmit(params, `minimax VLM: unexpected transport error (${err.message}) — retry, and if it persists surface 'image understanding is unavailable' to the user`);
145
+ }
146
+ const traceId = response.headers.get("Trace-Id") ?? response.headers.get("trace-id") ?? undefined;
147
+ const status = response.status;
148
+ if (status === 401 || status === 403) {
149
+ throwAndEmit(params, `minimax VLM: rejected credentials (HTTP ${status}) — the minimax key for this agent is invalid, re-run credential setup or rotate the key`, status, traceId);
150
+ }
151
+ if (status === 429) {
152
+ throwAndEmit(params, `minimax VLM: rate limited (HTTP 429) — wait and retry in a moment`, status, traceId);
153
+ }
154
+ if (status >= 500) {
155
+ throwAndEmit(params, `minimax VLM: server error (HTTP ${status}) — retry, and if it persists surface 'image understanding is unavailable' to the user`, status, traceId);
156
+ }
157
+ if (!response.ok) {
158
+ throwAndEmit(params, `minimax VLM: unexpected HTTP ${status} — retry, and if it persists surface 'image understanding is unavailable' to the user`, status, traceId);
159
+ }
160
+ let body;
161
+ try {
162
+ body = await response.json();
163
+ }
164
+ catch (error) {
165
+ const err = error;
166
+ throwAndEmit(params, `minimax VLM: malformed response (not JSON: ${err.message}) — this is a provider bug, retry or surface 'image understanding is unavailable' to the user`, status, traceId);
167
+ }
168
+ const parsed = body;
169
+ const providerStatus = parsed?.base_resp?.status_code ?? 0;
170
+ if (providerStatus !== 0) {
171
+ const providerMsg = parsed?.base_resp?.status_msg ?? "unknown";
172
+ throwAndEmit(params, `minimax VLM: provider returned status_code=${providerStatus} (${providerMsg}) — check the minimax account or retry, and if it persists surface 'image understanding is unavailable' to the user`, status, traceId);
173
+ }
174
+ const content = parsed?.content;
175
+ if (typeof content !== "string" || content.length === 0) {
176
+ throwAndEmit(params, `minimax VLM: returned no description (empty content field) — this is a provider bug, retry or surface 'image understanding is unavailable' to the user`, status, traceId);
177
+ }
178
+ const latencyMs = Date.now() - startTs;
179
+ emitEnd(params, content.length, latencyMs);
180
+ return content;
181
+ }
182
+ /* v8 ignore start — module-level observability event */
183
+ (0, runtime_1.emitNervesEvent)({
184
+ component: "engine",
185
+ event: "engine.minimax_vlm_loaded",
186
+ message: "minimax vlm client loaded",
187
+ meta: {},
188
+ });
189
+ /* v8 ignore stop */
@@ -3,34 +3,44 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MINIMAX_PROVIDER_BASE_URL = void 0;
7
+ exports.classifyMinimaxError = classifyMinimaxError;
6
8
  exports.createMinimaxProviderRuntime = createMinimaxProviderRuntime;
7
9
  const openai_1 = __importDefault(require("openai"));
8
10
  const config_1 = require("../config");
9
11
  const runtime_1 = require("../../nerves/runtime");
12
+ const error_classification_1 = require("./error-classification");
13
+ /**
14
+ * Canonical MiniMax chat-completions base URL. Exported so the BlueBubbles
15
+ * VLM fallback (which targets a sibling endpoint under the same host) can
16
+ * derive its URL from one source of truth instead of hard-coding.
17
+ */
18
+ exports.MINIMAX_PROVIDER_BASE_URL = "https://api.minimaxi.chat/v1";
19
+ function classifyMinimaxError(error) {
20
+ return (0, error_classification_1.classifyHttpError)(error);
21
+ }
10
22
  const streaming_1 = require("../streaming");
11
23
  const model_capabilities_1 = require("../model-capabilities");
12
- function createMinimaxProviderRuntime() {
24
+ function createMinimaxProviderRuntime(model, minimaxConfig = (0, config_1.getMinimaxConfig)()) {
13
25
  (0, runtime_1.emitNervesEvent)({
14
26
  component: "engine",
15
27
  event: "engine.provider_init",
16
28
  message: "minimax provider init",
17
29
  meta: { provider: "minimax" },
18
30
  });
19
- const minimaxConfig = (0, config_1.getMinimaxConfig)();
20
31
  if (!minimaxConfig.apiKey) {
21
- throw new Error("provider 'minimax' is selected in agent.json but providers.minimax.apiKey is missing in secrets.json.");
32
+ throw new Error("provider 'minimax' is selected but minimax.apiKey is missing in the agent vault. Run `ouro auth --agent <agent> --provider minimax`.");
22
33
  }
23
34
  // Registry consulted; MiniMax models return empty defaults (no capabilities to derive)
24
- (0, model_capabilities_1.getModelCapabilities)(minimaxConfig.model);
35
+ (0, model_capabilities_1.getModelCapabilities)(model);
25
36
  const client = new openai_1.default({
26
37
  apiKey: minimaxConfig.apiKey,
27
- baseURL: "https://api.minimaxi.chat/v1",
28
- timeout: 30000,
38
+ baseURL: exports.MINIMAX_PROVIDER_BASE_URL,
29
39
  maxRetries: 0,
30
40
  });
31
41
  return {
32
42
  id: "minimax",
33
- model: minimaxConfig.model,
43
+ model,
34
44
  client,
35
45
  capabilities: new Set(),
36
46
  resetTurnState(_messages) {
@@ -51,7 +61,15 @@ function createMinimaxProviderRuntime() {
51
61
  params.metadata = { trace_id: request.traceId };
52
62
  if (request.toolChoiceRequired)
53
63
  params.tool_choice = "required";
54
- return (0, streaming_1.streamChatCompletion)(this.client, params, request.callbacks, request.signal);
64
+ return (0, streaming_1.streamChatCompletion)(this.client, params, request.callbacks, request.signal, request.eagerSettleStreaming);
65
+ },
66
+ /* v8 ignore start -- ping: tested via provider-ping.test.ts @preserve */
67
+ async ping(signal) {
68
+ await this.client.chat.completions.create({ model: this.model, max_tokens: 1, messages: [{ role: "user", content: "ping" }] }, { signal });
69
+ },
70
+ /* v8 ignore stop */
71
+ classifyError(error) {
72
+ return classifyMinimaxError(error);
55
73
  },
56
74
  };
57
75
  }
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.classifyOpenAICodexError = classifyOpenAICodexError;
6
7
  exports.createOpenAICodexProviderRuntime = createOpenAICodexProviderRuntime;
7
8
  const openai_1 = __importDefault(require("openai"));
8
9
  const config_1 = require("../config");
@@ -10,6 +11,7 @@ const identity_1 = require("../identity");
10
11
  const runtime_1 = require("../../nerves/runtime");
11
12
  const streaming_1 = require("../streaming");
12
13
  const model_capabilities_1 = require("../model-capabilities");
14
+ const error_classification_1 = require("./error-classification");
13
15
  const OPENAI_CODEX_AUTH_FAILURE_MARKERS = [
14
16
  "authentication failed",
15
17
  "unauthorized",
@@ -18,9 +20,16 @@ const OPENAI_CODEX_AUTH_FAILURE_MARKERS = [
18
20
  "invalid bearer token",
19
21
  ];
20
22
  const OPENAI_CODEX_BACKEND_BASE_URL = "https://chatgpt.com/backend-api/codex";
21
- function getOpenAICodexSecretsPathForGuidance() {
22
- return (0, identity_1.getAgentSecretsPath)();
23
- }
23
+ const OPENAI_CODEX_PING_INPUT = [{ role: "user", content: "ping" }];
24
+ const OPENAI_CODEX_PING_CALLBACKS = {
25
+ onModelStart() { },
26
+ onModelStreamStart() { },
27
+ onTextChunk() { },
28
+ onReasoningChunk() { },
29
+ onToolStart() { },
30
+ onToolEnd() { },
31
+ onError() { },
32
+ };
24
33
  function getOpenAICodexAgentNameForGuidance() {
25
34
  return (0, identity_1.getAgentName)();
26
35
  }
@@ -28,11 +37,9 @@ function getOpenAICodexOAuthInstructions() {
28
37
  const agentName = getOpenAICodexAgentNameForGuidance();
29
38
  return [
30
39
  "Fix:",
31
- ` 1. Run \`npm run auth:openai-codex -- --agent ${agentName}\``,
32
- " (or run `codex login` and set the OAuth token manually)",
33
- ` 2. Open ${getOpenAICodexSecretsPathForGuidance()}`,
34
- " 3. Confirm providers.openai-codex.oauthAccessToken is set",
35
- " 4. This provider uses chatgpt.com/backend-api/codex/responses (not api.openai.com/responses).",
40
+ ` 1. Run \`ouro auth --agent ${agentName} --provider openai-codex\``,
41
+ " 2. This provider uses chatgpt.com/backend-api/codex/responses (not api.openai.com/responses).",
42
+ " 3. After reauth, retry the failed ouro command or reconnect this session.",
36
43
  ].join("\n");
37
44
  }
38
45
  function getOpenAICodexReauthGuidance(reason) {
@@ -42,22 +49,19 @@ function getOpenAICodexReauthGuidance(reason) {
42
49
  getOpenAICodexOAuthInstructions(),
43
50
  ].join("\n");
44
51
  }
52
+ function classifyOpenAICodexError(error) {
53
+ return (0, error_classification_1.classifyHttpError)(error, {
54
+ isAuthFailure: isOpenAICodexAuthFailure,
55
+ isUsageLimit: (e) => {
56
+ const lower = e.message.toLowerCase();
57
+ return lower.includes("usage") || lower.includes("quota") || lower.includes("exceeded your");
58
+ },
59
+ });
60
+ }
45
61
  function isOpenAICodexAuthFailure(error) {
46
- if (!(error instanceof Error))
47
- return false;
48
- const status = error.status;
49
- if (status === 401 || status === 403)
50
- return true;
51
62
  const lower = error.message.toLowerCase();
52
63
  return OPENAI_CODEX_AUTH_FAILURE_MARKERS.some((marker) => lower.includes(marker));
53
64
  }
54
- function withOpenAICodexAuthGuidance(error) {
55
- const base = error instanceof Error ? error.message : String(error);
56
- if (isOpenAICodexAuthFailure(error)) {
57
- return new Error(getOpenAICodexReauthGuidance(`OpenAI Codex authentication failed (${base}).`));
58
- }
59
- return error instanceof Error ? error : new Error(String(error));
60
- }
61
65
  function decodeJwtPayload(token) {
62
66
  const parts = token.split(".");
63
67
  if (parts.length < 2)
@@ -88,16 +92,27 @@ function getChatGPTAccountIdFromToken(token) {
88
92
  return "";
89
93
  return accountId.trim();
90
94
  }
91
- function createOpenAICodexProviderRuntime() {
95
+ function createOpenAICodexResponsesParams(input, instructions, model, reasoningEffort) {
96
+ return {
97
+ model,
98
+ input,
99
+ instructions,
100
+ tools: [],
101
+ reasoning: { effort: reasoningEffort, summary: "detailed" },
102
+ stream: true,
103
+ store: false,
104
+ include: ["reasoning.encrypted_content"],
105
+ };
106
+ }
107
+ function createOpenAICodexProviderRuntime(model, codexConfig = (0, config_1.getOpenAICodexConfig)()) {
92
108
  (0, runtime_1.emitNervesEvent)({
93
109
  component: "engine",
94
110
  event: "engine.provider_init",
95
111
  message: "openai-codex provider init",
96
112
  meta: { provider: "openai-codex" },
97
113
  });
98
- const codexConfig = (0, config_1.getOpenAICodexConfig)();
99
- if (!(codexConfig.model && codexConfig.oauthAccessToken)) {
100
- throw new Error(getOpenAICodexReauthGuidance("provider 'openai-codex' is selected in agent.json but providers.openai-codex.model/oauthAccessToken is incomplete in secrets.json."));
114
+ if (!codexConfig.oauthAccessToken) {
115
+ throw new Error(getOpenAICodexReauthGuidance("provider 'openai-codex' is selected but openai-codex.oauthAccessToken is missing in the agent vault."));
101
116
  }
102
117
  const token = codexConfig.oauthAccessToken.trim();
103
118
  if (!token) {
@@ -107,7 +122,7 @@ function createOpenAICodexProviderRuntime() {
107
122
  if (!chatgptAccountId) {
108
123
  throw new Error(getOpenAICodexReauthGuidance("OpenAI Codex OAuth access token is missing a chatgpt_account_id claim required for chatgpt.com/backend-api/codex."));
109
124
  }
110
- const modelCaps = (0, model_capabilities_1.getModelCapabilities)(codexConfig.model);
125
+ const modelCaps = (0, model_capabilities_1.getModelCapabilities)(model);
111
126
  const capabilities = new Set();
112
127
  if (modelCaps.reasoningEffort)
113
128
  capabilities.add("reasoning-effort");
@@ -121,14 +136,13 @@ function createOpenAICodexProviderRuntime() {
121
136
  "OpenAI-Beta": "responses=experimental",
122
137
  originator: "ouroboros",
123
138
  },
124
- timeout: 30000,
125
139
  maxRetries: 0,
126
140
  });
127
141
  let nativeInput = null;
128
142
  let nativeInstructions = "";
129
143
  return {
130
144
  id: "openai-codex",
131
- model: codexConfig.model,
145
+ model,
132
146
  client,
133
147
  capabilities,
134
148
  supportedReasoningEfforts: modelCaps.reasoningEffort,
@@ -140,32 +154,33 @@ function createOpenAICodexProviderRuntime() {
140
154
  appendToolOutput(callId, output) {
141
155
  if (!nativeInput)
142
156
  return;
143
- nativeInput.push({ type: "function_call_output", call_id: callId, output });
157
+ nativeInput.push({ type: "function_call_output", call_id: callId, output: (0, streaming_1.truncateResponsesFunctionCallOutput)(output) });
144
158
  },
145
159
  async streamTurn(request) {
146
160
  if (!nativeInput)
147
161
  this.resetTurnState(request.messages);
148
- const params = {
149
- model: this.model,
150
- input: nativeInput,
151
- instructions: nativeInstructions,
152
- tools: (0, streaming_1.toResponsesTools)(request.activeTools),
153
- reasoning: { effort: request.reasoningEffort ?? "medium", summary: "detailed" },
154
- stream: true,
155
- store: false,
156
- include: ["reasoning.encrypted_content"],
157
- };
162
+ const params = createOpenAICodexResponsesParams(nativeInput, nativeInstructions, this.model, request.reasoningEffort ?? "medium");
163
+ params.tools = (0, streaming_1.toResponsesTools)(request.activeTools);
158
164
  if (request.toolChoiceRequired)
159
165
  params.tool_choice = "required";
160
166
  try {
161
- const result = await (0, streaming_1.streamResponsesApi)(this.client, params, request.callbacks, request.signal);
167
+ const result = await (0, streaming_1.streamResponsesApi)(this.client, params, request.callbacks, request.signal, request.eagerSettleStreaming);
162
168
  for (const item of result.outputItems)
163
169
  nativeInput.push(item);
164
170
  return result;
165
171
  }
166
172
  catch (error) {
167
- throw withOpenAICodexAuthGuidance(error);
173
+ throw error instanceof Error ? error : new Error(String(error));
168
174
  }
169
175
  },
176
+ /* v8 ignore start -- ping: tested via provider-ping.test.ts @preserve */
177
+ async ping(signal) {
178
+ await (0, streaming_1.streamResponsesApi)(this.client, createOpenAICodexResponsesParams(OPENAI_CODEX_PING_INPUT, "", this.model, "medium"), OPENAI_CODEX_PING_CALLBACKS, signal);
179
+ },
180
+ /* v8 ignore stop */
181
+ /* v8 ignore next 3 -- delegation: classification logic tested via classifyOpenAICodexError @preserve */
182
+ classifyError(error) {
183
+ return classifyOpenAICodexError(error);
184
+ },
170
185
  };
171
186
  }