@ouro.bot/cli 0.1.0-alpha.33 → 0.1.0-alpha.331

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 (315) hide show
  1. package/README.md +188 -187
  2. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +3 -2
  3. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +1 -1
  4. package/changelog.json +1982 -0
  5. package/dist/arc/attention-types.js +8 -0
  6. package/dist/arc/cares.js +140 -0
  7. package/dist/arc/episodes.js +117 -0
  8. package/dist/arc/intentions.js +133 -0
  9. package/dist/arc/json-store.js +117 -0
  10. package/dist/arc/obligations.js +237 -0
  11. package/dist/arc/packets.js +193 -0
  12. package/dist/arc/presence.js +185 -0
  13. package/dist/arc/task-lifecycle.js +65 -0
  14. package/dist/heart/active-work.js +832 -0
  15. package/dist/heart/agent-entry.js +37 -2
  16. package/dist/heart/attachments/image-normalize.js +194 -0
  17. package/dist/heart/attachments/materialize.js +97 -0
  18. package/dist/heart/attachments/originals.js +88 -0
  19. package/dist/heart/attachments/render.js +29 -0
  20. package/dist/heart/attachments/sources/adapter.js +2 -0
  21. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  22. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  23. package/dist/heart/attachments/sources/index.js +16 -0
  24. package/dist/heart/attachments/store.js +103 -0
  25. package/dist/heart/attachments/types.js +93 -0
  26. package/dist/heart/auth/auth-flow.js +463 -0
  27. package/dist/heart/bridges/manager.js +358 -0
  28. package/dist/heart/bridges/state-machine.js +135 -0
  29. package/dist/heart/bridges/store.js +123 -0
  30. package/dist/heart/bundle-state.js +168 -0
  31. package/dist/heart/commitments.js +111 -0
  32. package/dist/heart/config-registry.js +304 -0
  33. package/dist/heart/config.js +53 -21
  34. package/dist/heart/core.js +695 -195
  35. package/dist/heart/cross-chat-delivery.js +131 -0
  36. package/dist/heart/daemon/agent-config-check.js +149 -0
  37. package/dist/heart/daemon/agent-discovery.js +79 -3
  38. package/dist/heart/daemon/agent-service.js +360 -0
  39. package/dist/heart/daemon/agentic-repair.js +170 -0
  40. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  41. package/dist/heart/daemon/cadence.js +70 -0
  42. package/dist/heart/daemon/cli-defaults.js +591 -0
  43. package/dist/heart/daemon/cli-exec.js +2277 -0
  44. package/dist/heart/daemon/cli-help.js +306 -0
  45. package/dist/heart/daemon/cli-parse.js +824 -0
  46. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  47. package/dist/heart/daemon/cli-render.js +512 -0
  48. package/dist/heart/daemon/cli-types.js +8 -0
  49. package/dist/heart/daemon/daemon-cli.js +29 -1171
  50. package/dist/heart/daemon/daemon-entry.js +358 -3
  51. package/dist/heart/daemon/daemon-health.js +141 -0
  52. package/dist/heart/daemon/daemon-runtime-sync.js +157 -12
  53. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  54. package/dist/heart/daemon/daemon.js +751 -58
  55. package/dist/heart/daemon/doctor-types.js +8 -0
  56. package/dist/heart/daemon/doctor.js +401 -0
  57. package/dist/heart/daemon/health-monitor.js +79 -1
  58. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  59. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  60. package/dist/heart/daemon/http-health-probe.js +80 -0
  61. package/dist/heart/daemon/inner-status.js +89 -0
  62. package/dist/heart/daemon/interactive-repair.js +69 -0
  63. package/dist/heart/daemon/launchd.js +46 -9
  64. package/dist/heart/daemon/log-tailer.js +82 -12
  65. package/dist/heart/daemon/logs-prune.js +105 -0
  66. package/dist/heart/daemon/message-router.js +17 -8
  67. package/dist/heart/daemon/os-cron-deps.js +134 -0
  68. package/dist/heart/daemon/ouro-bot-entry.js +1 -1
  69. package/dist/heart/daemon/process-manager.js +201 -0
  70. package/dist/heart/daemon/provider-discovery.js +105 -0
  71. package/dist/heart/daemon/pulse.js +463 -0
  72. package/dist/heart/daemon/run-hooks.js +2 -0
  73. package/dist/heart/daemon/runtime-logging.js +67 -16
  74. package/dist/heart/daemon/runtime-metadata.js +101 -0
  75. package/dist/heart/daemon/runtime-mode.js +67 -0
  76. package/dist/heart/daemon/safe-mode.js +161 -0
  77. package/dist/heart/daemon/sense-manager.js +72 -3
  78. package/dist/heart/daemon/session-id-resolver.js +131 -0
  79. package/dist/heart/daemon/skill-management-installer.js +94 -0
  80. package/dist/heart/daemon/socket-client.js +307 -0
  81. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  82. package/dist/heart/daemon/startup-tui.js +237 -0
  83. package/dist/heart/daemon/task-scheduler.js +3 -25
  84. package/dist/heart/daemon/thoughts.js +510 -0
  85. package/dist/heart/daemon/up-progress.js +135 -0
  86. package/dist/heart/delegation.js +62 -0
  87. package/dist/heart/habits/habit-migration.js +181 -0
  88. package/dist/heart/habits/habit-parser.js +140 -0
  89. package/dist/heart/habits/habit-scheduler.js +371 -0
  90. package/dist/heart/{daemon → hatch}/hatch-flow.js +32 -120
  91. package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
  92. package/dist/heart/{daemon → hatch}/specialist-prompt.js +10 -7
  93. package/dist/heart/{daemon → hatch}/specialist-tools.js +49 -3
  94. package/dist/heart/identity.js +154 -59
  95. package/dist/heart/kicks.js +2 -20
  96. package/dist/heart/mcp/mcp-server.js +653 -0
  97. package/dist/heart/migrate-config.js +127 -0
  98. package/dist/heart/model-capabilities.js +59 -0
  99. package/dist/heart/outlook/outlook-http-hooks.js +64 -0
  100. package/dist/heart/outlook/outlook-http-response.js +7 -0
  101. package/dist/heart/outlook/outlook-http-routes.js +232 -0
  102. package/dist/heart/outlook/outlook-http-static.js +99 -0
  103. package/dist/heart/outlook/outlook-http-transport.js +116 -0
  104. package/dist/heart/outlook/outlook-http.js +99 -0
  105. package/dist/heart/outlook/outlook-read.js +28 -0
  106. package/dist/heart/outlook/outlook-render.js +1032 -0
  107. package/dist/heart/outlook/outlook-types.js +27 -0
  108. package/dist/heart/outlook/outlook-view.js +194 -0
  109. package/dist/heart/outlook/readers/agent-machine.js +355 -0
  110. package/dist/heart/outlook/readers/continuity-readers.js +332 -0
  111. package/dist/heart/outlook/readers/runtime-readers.js +660 -0
  112. package/dist/heart/outlook/readers/sessions.js +231 -0
  113. package/dist/heart/outlook/readers/shared.js +111 -0
  114. package/dist/heart/progress-story.js +42 -0
  115. package/dist/heart/provider-failover.js +135 -0
  116. package/dist/heart/provider-models.js +81 -0
  117. package/dist/heart/provider-ping.js +162 -0
  118. package/dist/heart/providers/anthropic-token.js +163 -0
  119. package/dist/heart/providers/anthropic.js +169 -46
  120. package/dist/heart/providers/azure.js +98 -11
  121. package/dist/heart/providers/error-classification.js +63 -0
  122. package/dist/heart/providers/github-copilot.js +136 -0
  123. package/dist/heart/providers/minimax-vlm.js +189 -0
  124. package/dist/heart/providers/minimax.js +23 -5
  125. package/dist/heart/providers/openai-codex.js +33 -22
  126. package/dist/heart/session-activity.js +190 -0
  127. package/dist/heart/session-events.js +726 -0
  128. package/dist/heart/session-recall.js +162 -0
  129. package/dist/heart/start-of-turn-packet.js +341 -0
  130. package/dist/heart/streaming.js +36 -27
  131. package/dist/heart/sync.js +332 -0
  132. package/dist/heart/target-resolution.js +127 -0
  133. package/dist/heart/tempo.js +93 -0
  134. package/dist/heart/temporal-view.js +41 -0
  135. package/dist/heart/tool-activity-callbacks.js +36 -0
  136. package/dist/heart/tool-description.js +135 -0
  137. package/dist/heart/tool-friction.js +55 -0
  138. package/dist/heart/tool-loop.js +200 -0
  139. package/dist/heart/turn-context.js +358 -0
  140. package/dist/heart/turn-coordinator.js +28 -0
  141. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +1 -1
  142. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  143. package/dist/heart/{daemon → versioning}/ouro-path-installer.js +78 -35
  144. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  145. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  146. package/dist/heart/{daemon → versioning}/update-checker.js +12 -2
  147. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  148. package/dist/mind/associative-recall.js +137 -66
  149. package/dist/mind/bundle-manifest.js +7 -1
  150. package/dist/mind/context.js +89 -93
  151. package/dist/mind/diary-integrity.js +60 -0
  152. package/dist/mind/{memory.js → diary.js} +84 -96
  153. package/dist/mind/embedding-provider.js +60 -0
  154. package/dist/mind/file-state.js +179 -0
  155. package/dist/mind/first-impressions.js +14 -1
  156. package/dist/mind/friends/channel.js +56 -0
  157. package/dist/mind/friends/group-context.js +144 -0
  158. package/dist/mind/friends/resolver.js +37 -0
  159. package/dist/mind/friends/store-file.js +58 -3
  160. package/dist/mind/friends/trust-explanation.js +74 -0
  161. package/dist/mind/friends/types.js +8 -0
  162. package/dist/mind/journal-index.js +161 -0
  163. package/dist/mind/obligation-steering.js +221 -0
  164. package/dist/mind/pending.js +74 -7
  165. package/dist/mind/prompt.js +949 -111
  166. package/dist/mind/provenance-trust.js +26 -0
  167. package/dist/mind/scrutiny.js +173 -0
  168. package/dist/mind/token-estimate.js +8 -12
  169. package/dist/nerves/cli-logging.js +7 -1
  170. package/dist/nerves/coverage/audit.js +1 -1
  171. package/dist/nerves/coverage/file-completeness.js +83 -5
  172. package/dist/nerves/coverage/run-artifacts.js +1 -1
  173. package/dist/nerves/event-buffer.js +111 -0
  174. package/dist/nerves/index.js +224 -4
  175. package/dist/nerves/observation.js +20 -0
  176. package/dist/nerves/redact.js +79 -0
  177. package/dist/nerves/runtime.js +5 -1
  178. package/dist/outlook-ui/assets/index-IuR4F6y6.js +61 -0
  179. package/dist/outlook-ui/assets/index-LwChZTgL.css +1 -0
  180. package/dist/outlook-ui/index.html +15 -0
  181. package/dist/repertoire/ado-client.js +15 -56
  182. package/dist/repertoire/ado-semantic.js +11 -10
  183. package/dist/repertoire/api-client.js +97 -0
  184. package/dist/repertoire/bitwarden-store.js +319 -0
  185. package/dist/repertoire/bundle-templates.js +72 -0
  186. package/dist/repertoire/bw-installer.js +79 -0
  187. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  188. package/dist/repertoire/coding/context-pack.js +330 -0
  189. package/dist/repertoire/coding/feedback.js +197 -30
  190. package/dist/repertoire/coding/manager.js +158 -9
  191. package/dist/repertoire/coding/spawner.js +55 -9
  192. package/dist/repertoire/coding/tools.js +170 -7
  193. package/dist/repertoire/commerce-errors.js +109 -0
  194. package/dist/repertoire/commerce-self-test.js +156 -0
  195. package/dist/repertoire/credential-access.js +527 -0
  196. package/dist/repertoire/duffel-client.js +185 -0
  197. package/dist/repertoire/github-client.js +14 -55
  198. package/dist/repertoire/graph-client.js +11 -52
  199. package/dist/repertoire/guardrails.js +375 -0
  200. package/dist/repertoire/mcp-client.js +255 -0
  201. package/dist/repertoire/mcp-manager.js +305 -0
  202. package/dist/repertoire/mcp-tools.js +63 -0
  203. package/dist/repertoire/shell-sessions.js +133 -0
  204. package/dist/repertoire/skills.js +14 -23
  205. package/dist/repertoire/stripe-client.js +131 -0
  206. package/dist/repertoire/tasks/board.js +43 -5
  207. package/dist/repertoire/tasks/fix.js +182 -0
  208. package/dist/repertoire/tasks/index.js +28 -10
  209. package/dist/repertoire/tasks/lifecycle.js +2 -2
  210. package/dist/repertoire/tasks/parser.js +3 -2
  211. package/dist/repertoire/tasks/scanner.js +194 -37
  212. package/dist/repertoire/tasks/transitions.js +16 -79
  213. package/dist/repertoire/tool-results.js +29 -0
  214. package/dist/repertoire/tools-attachments.js +316 -0
  215. package/dist/repertoire/tools-base.js +45 -771
  216. package/dist/repertoire/tools-bluebubbles.js +1 -0
  217. package/dist/repertoire/tools-bridge.js +141 -0
  218. package/dist/repertoire/tools-bundle.js +984 -0
  219. package/dist/repertoire/tools-config.js +185 -0
  220. package/dist/repertoire/tools-continuity.js +248 -0
  221. package/dist/repertoire/tools-credential.js +182 -0
  222. package/dist/repertoire/tools-files.js +342 -0
  223. package/dist/repertoire/tools-flight.js +224 -0
  224. package/dist/repertoire/tools-flow.js +105 -0
  225. package/dist/repertoire/tools-github.js +1 -7
  226. package/dist/repertoire/tools-memory.js +376 -0
  227. package/dist/repertoire/tools-session.js +739 -0
  228. package/dist/repertoire/tools-shell.js +120 -0
  229. package/dist/repertoire/tools-stripe.js +180 -0
  230. package/dist/repertoire/tools-surface.js +243 -0
  231. package/dist/repertoire/tools-teams.js +12 -62
  232. package/dist/repertoire/tools-travel.js +125 -0
  233. package/dist/repertoire/tools-user-profile.js +144 -0
  234. package/dist/repertoire/tools-vault.js +110 -0
  235. package/dist/repertoire/tools.js +144 -138
  236. package/dist/repertoire/travel-api-client.js +360 -0
  237. package/dist/repertoire/user-profile.js +118 -0
  238. package/dist/repertoire/vault-setup.js +241 -0
  239. package/dist/scripts/claude-code-hook.js +41 -0
  240. package/dist/scripts/claude-code-stop-hook.js +47 -0
  241. package/dist/senses/attention-queue.js +116 -0
  242. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  243. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  244. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +225 -9
  245. package/dist/senses/bluebubbles/entry.js +13 -0
  246. package/dist/senses/bluebubbles/inbound-log.js +113 -0
  247. package/dist/senses/bluebubbles/index.js +1590 -0
  248. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  249. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +43 -12
  250. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +46 -6
  251. package/dist/senses/bluebubbles/replay.js +129 -0
  252. package/dist/senses/bluebubbles/runtime-state.js +109 -0
  253. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  254. package/dist/senses/cli/bracketed-paste.js +82 -0
  255. package/dist/senses/cli/image-paste.js +287 -0
  256. package/dist/senses/cli/image-ref-navigation.js +75 -0
  257. package/dist/senses/cli/ink-app.js +156 -0
  258. package/dist/senses/cli/inline-diff.js +64 -0
  259. package/dist/senses/cli/input-keys.js +174 -0
  260. package/dist/senses/cli/kill-ring.js +86 -0
  261. package/dist/senses/cli/message-list.js +51 -0
  262. package/dist/senses/cli/ouro-tui.js +605 -0
  263. package/dist/senses/cli/spinner-imperative.js +135 -0
  264. package/dist/senses/cli/spinner.js +101 -0
  265. package/dist/senses/cli/status-line.js +60 -0
  266. package/dist/senses/cli/streaming-markdown.js +526 -0
  267. package/dist/senses/cli/tool-display.js +83 -0
  268. package/dist/senses/cli/tool-render.js +85 -0
  269. package/dist/senses/cli/tui-store.js +240 -0
  270. package/dist/senses/cli/virtual-list.js +35 -0
  271. package/dist/senses/cli-entry.js +1 -1
  272. package/dist/senses/cli-layout.js +187 -0
  273. package/dist/senses/cli.js +595 -246
  274. package/dist/senses/commands.js +65 -1
  275. package/dist/senses/continuity.js +94 -0
  276. package/dist/senses/habit-turn-message.js +108 -0
  277. package/dist/senses/inner-dialog-worker.js +112 -19
  278. package/dist/senses/inner-dialog.js +633 -86
  279. package/dist/senses/pipeline.js +567 -0
  280. package/dist/senses/shared-turn.js +199 -0
  281. package/dist/senses/surface-tool.js +68 -0
  282. package/dist/senses/teams.js +665 -160
  283. package/dist/senses/trust-gate.js +112 -2
  284. package/package.json +28 -7
  285. package/skills/agent-commerce.md +106 -0
  286. package/skills/browser-navigation.md +110 -0
  287. package/skills/commerce-setup-guide.md +116 -0
  288. package/skills/commerce-setup.md +84 -0
  289. package/skills/configure-dev-tools.md +81 -0
  290. package/skills/travel-planning.md +138 -0
  291. package/dist/heart/daemon/subagent-installer.js +0 -134
  292. package/dist/senses/bluebubbles-entry.js +0 -11
  293. package/dist/senses/bluebubbles.js +0 -544
  294. package/dist/senses/debug-activity.js +0 -108
  295. package/subagents/README.md +0 -73
  296. package/subagents/work-doer.md +0 -235
  297. package/subagents/work-merger.md +0 -618
  298. package/subagents/work-planner.md +0 -382
  299. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  300. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  301. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  302. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  303. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  304. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  305. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  306. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  307. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  308. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  309. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  310. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +0 -0
  311. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  312. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  313. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  314. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  315. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -3,12 +3,15 @@ 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");
9
10
  const identity_1 = require("../identity");
10
11
  const runtime_1 = require("../../nerves/runtime");
11
12
  const streaming_1 = require("../streaming");
13
+ const model_capabilities_1 = require("../model-capabilities");
14
+ const error_classification_1 = require("./error-classification");
12
15
  const OPENAI_CODEX_AUTH_FAILURE_MARKERS = [
13
16
  "authentication failed",
14
17
  "unauthorized",
@@ -27,11 +30,11 @@ function getOpenAICodexOAuthInstructions() {
27
30
  const agentName = getOpenAICodexAgentNameForGuidance();
28
31
  return [
29
32
  "Fix:",
30
- ` 1. Run \`npm run auth:openai-codex -- --agent ${agentName}\``,
31
- " (or run `codex login` and set the OAuth token manually)",
33
+ ` 1. Run \`ouro auth --agent ${agentName}\``,
32
34
  ` 2. Open ${getOpenAICodexSecretsPathForGuidance()}`,
33
35
  " 3. Confirm providers.openai-codex.oauthAccessToken is set",
34
36
  " 4. This provider uses chatgpt.com/backend-api/codex/responses (not api.openai.com/responses).",
37
+ " 5. After reauth, retry the failed ouro command or reconnect this session.",
35
38
  ].join("\n");
36
39
  }
37
40
  function getOpenAICodexReauthGuidance(reason) {
@@ -41,22 +44,19 @@ function getOpenAICodexReauthGuidance(reason) {
41
44
  getOpenAICodexOAuthInstructions(),
42
45
  ].join("\n");
43
46
  }
47
+ function classifyOpenAICodexError(error) {
48
+ return (0, error_classification_1.classifyHttpError)(error, {
49
+ isAuthFailure: isOpenAICodexAuthFailure,
50
+ isUsageLimit: (e) => {
51
+ const lower = e.message.toLowerCase();
52
+ return lower.includes("usage") || lower.includes("quota") || lower.includes("exceeded your");
53
+ },
54
+ });
55
+ }
44
56
  function isOpenAICodexAuthFailure(error) {
45
- if (!(error instanceof Error))
46
- return false;
47
- const status = error.status;
48
- if (status === 401 || status === 403)
49
- return true;
50
57
  const lower = error.message.toLowerCase();
51
58
  return OPENAI_CODEX_AUTH_FAILURE_MARKERS.some((marker) => lower.includes(marker));
52
59
  }
53
- function withOpenAICodexAuthGuidance(error) {
54
- const base = error instanceof Error ? error.message : String(error);
55
- if (isOpenAICodexAuthFailure(error)) {
56
- return new Error(getOpenAICodexReauthGuidance(`OpenAI Codex authentication failed (${base}).`));
57
- }
58
- return error instanceof Error ? error : new Error(String(error));
59
- }
60
60
  function decodeJwtPayload(token) {
61
61
  const parts = token.split(".");
62
62
  if (parts.length < 2)
@@ -87,7 +87,7 @@ function getChatGPTAccountIdFromToken(token) {
87
87
  return "";
88
88
  return accountId.trim();
89
89
  }
90
- function createOpenAICodexProviderRuntime() {
90
+ function createOpenAICodexProviderRuntime(model) {
91
91
  (0, runtime_1.emitNervesEvent)({
92
92
  component: "engine",
93
93
  event: "engine.provider_init",
@@ -95,8 +95,8 @@ function createOpenAICodexProviderRuntime() {
95
95
  meta: { provider: "openai-codex" },
96
96
  });
97
97
  const codexConfig = (0, config_1.getOpenAICodexConfig)();
98
- if (!(codexConfig.model && codexConfig.oauthAccessToken)) {
99
- throw new Error(getOpenAICodexReauthGuidance("provider 'openai-codex' is selected in agent.json but providers.openai-codex.model/oauthAccessToken is incomplete in secrets.json."));
98
+ if (!codexConfig.oauthAccessToken) {
99
+ throw new Error(getOpenAICodexReauthGuidance("provider 'openai-codex' is selected in agent.json but providers.openai-codex.oauthAccessToken is missing in secrets.json."));
100
100
  }
101
101
  const token = codexConfig.oauthAccessToken.trim();
102
102
  if (!token) {
@@ -106,6 +106,12 @@ function createOpenAICodexProviderRuntime() {
106
106
  if (!chatgptAccountId) {
107
107
  throw new Error(getOpenAICodexReauthGuidance("OpenAI Codex OAuth access token is missing a chatgpt_account_id claim required for chatgpt.com/backend-api/codex."));
108
108
  }
109
+ const modelCaps = (0, model_capabilities_1.getModelCapabilities)(model);
110
+ const capabilities = new Set();
111
+ if (modelCaps.reasoningEffort)
112
+ capabilities.add("reasoning-effort");
113
+ if (modelCaps.phase)
114
+ capabilities.add("phase-annotation");
109
115
  const client = new openai_1.default({
110
116
  apiKey: token,
111
117
  baseURL: OPENAI_CODEX_BACKEND_BASE_URL,
@@ -114,15 +120,16 @@ function createOpenAICodexProviderRuntime() {
114
120
  "OpenAI-Beta": "responses=experimental",
115
121
  originator: "ouroboros",
116
122
  },
117
- timeout: 30000,
118
123
  maxRetries: 0,
119
124
  });
120
125
  let nativeInput = null;
121
126
  let nativeInstructions = "";
122
127
  return {
123
128
  id: "openai-codex",
124
- model: codexConfig.model,
129
+ model,
125
130
  client,
131
+ capabilities,
132
+ supportedReasoningEfforts: modelCaps.reasoningEffort,
126
133
  resetTurnState(messages) {
127
134
  const { instructions, input } = (0, streaming_1.toResponsesInput)(messages);
128
135
  nativeInput = input;
@@ -141,7 +148,7 @@ function createOpenAICodexProviderRuntime() {
141
148
  input: nativeInput,
142
149
  instructions: nativeInstructions,
143
150
  tools: (0, streaming_1.toResponsesTools)(request.activeTools),
144
- reasoning: { effort: "medium", summary: "detailed" },
151
+ reasoning: { effort: request.reasoningEffort ?? "medium", summary: "detailed" },
145
152
  stream: true,
146
153
  store: false,
147
154
  include: ["reasoning.encrypted_content"],
@@ -149,14 +156,18 @@ function createOpenAICodexProviderRuntime() {
149
156
  if (request.toolChoiceRequired)
150
157
  params.tool_choice = "required";
151
158
  try {
152
- const result = await (0, streaming_1.streamResponsesApi)(this.client, params, request.callbacks, request.signal);
159
+ const result = await (0, streaming_1.streamResponsesApi)(this.client, params, request.callbacks, request.signal, request.eagerSettleStreaming);
153
160
  for (const item of result.outputItems)
154
161
  nativeInput.push(item);
155
162
  return result;
156
163
  }
157
164
  catch (error) {
158
- throw withOpenAICodexAuthGuidance(error);
165
+ throw error instanceof Error ? error : new Error(String(error));
159
166
  }
160
167
  },
168
+ /* v8 ignore next 3 -- delegation: classification logic tested via classifyOpenAICodexError @preserve */
169
+ classifyError(error) {
170
+ return classifyOpenAICodexError(error);
171
+ },
161
172
  };
162
173
  }
@@ -0,0 +1,190 @@
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
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.listSessionActivity = listSessionActivity;
37
+ exports.findFreshestFriendSession = findFreshestFriendSession;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const runtime_1 = require("../nerves/runtime");
41
+ const config_1 = require("./config");
42
+ const session_events_1 = require("./session-events");
43
+ const DEFAULT_ACTIVE_THRESHOLD_MS = 24 * 60 * 60 * 1000;
44
+ function activityPriority(source) {
45
+ return source === "friend-facing" ? 0 : 1;
46
+ }
47
+ function resolveFriendName(friendId, friendsDir, agentName) {
48
+ if (friendId === "self")
49
+ return agentName;
50
+ try {
51
+ const raw = fs.readFileSync(path.join(friendsDir, `${friendId}.json`), "utf-8");
52
+ const parsed = JSON.parse(raw);
53
+ return parsed.name ?? friendId;
54
+ }
55
+ catch {
56
+ return friendId;
57
+ }
58
+ }
59
+ function parseFriendActivity(sessionPath) {
60
+ let mtimeMs;
61
+ try {
62
+ mtimeMs = fs.statSync(sessionPath).mtimeMs;
63
+ }
64
+ catch {
65
+ return null;
66
+ }
67
+ const envelope = (0, session_events_1.loadSessionEnvelopeFile)(sessionPath);
68
+ const chronology = envelope ? (0, session_events_1.deriveSessionChronology)(envelope.events) : null;
69
+ const explicit = envelope?.state.lastFriendActivityAt;
70
+ if (typeof explicit === "string") {
71
+ const parsedMs = Date.parse(explicit);
72
+ if (Number.isFinite(parsedMs)) {
73
+ return {
74
+ lastActivityMs: parsedMs,
75
+ lastActivityAt: new Date(parsedMs).toISOString(),
76
+ activitySource: "friend-facing",
77
+ lastInboundAt: chronology?.lastInboundAt ?? null,
78
+ lastOutboundAt: chronology?.lastOutboundAt ?? null,
79
+ unansweredInboundCount: chronology?.unansweredInboundCount ?? 0,
80
+ };
81
+ }
82
+ }
83
+ if (chronology?.lastInboundAt) {
84
+ const parsedMs = Date.parse(chronology.lastInboundAt);
85
+ if (Number.isFinite(parsedMs)) {
86
+ return {
87
+ lastActivityMs: parsedMs,
88
+ lastActivityAt: new Date(parsedMs).toISOString(),
89
+ activitySource: "friend-facing",
90
+ lastInboundAt: chronology.lastInboundAt,
91
+ lastOutboundAt: chronology.lastOutboundAt,
92
+ unansweredInboundCount: chronology.unansweredInboundCount,
93
+ };
94
+ }
95
+ }
96
+ return {
97
+ lastActivityMs: mtimeMs,
98
+ lastActivityAt: new Date(mtimeMs).toISOString(),
99
+ activitySource: "mtime-fallback",
100
+ lastInboundAt: chronology?.lastInboundAt ?? null,
101
+ lastOutboundAt: chronology?.lastOutboundAt ?? null,
102
+ unansweredInboundCount: chronology?.unansweredInboundCount ?? 0,
103
+ };
104
+ }
105
+ function listSessionActivity(query) {
106
+ const { sessionsDir, friendsDir, agentName, activeThresholdMs = DEFAULT_ACTIVE_THRESHOLD_MS, nowMs = Date.now(), currentSession = null, } = query;
107
+ (0, runtime_1.emitNervesEvent)({
108
+ component: "daemon",
109
+ event: "daemon.session_activity_scan",
110
+ message: "scanning session activity",
111
+ meta: {
112
+ sessionsDir,
113
+ currentSession: currentSession ? `${currentSession.friendId}/${currentSession.channel}/${currentSession.key}` : null,
114
+ },
115
+ });
116
+ if (!fs.existsSync(sessionsDir))
117
+ return [];
118
+ const results = [];
119
+ let friendDirs;
120
+ try {
121
+ friendDirs = fs.readdirSync(sessionsDir);
122
+ }
123
+ catch {
124
+ return [];
125
+ }
126
+ for (const friendId of friendDirs) {
127
+ const friendPath = path.join(sessionsDir, friendId);
128
+ let channels;
129
+ try {
130
+ channels = fs.readdirSync(friendPath);
131
+ }
132
+ catch {
133
+ continue;
134
+ }
135
+ for (const channel of channels) {
136
+ const channelPath = path.join(friendPath, channel);
137
+ let keys;
138
+ try {
139
+ keys = fs.readdirSync(channelPath);
140
+ }
141
+ catch {
142
+ continue;
143
+ }
144
+ for (const keyFile of keys) {
145
+ if (!keyFile.endsWith(".json"))
146
+ continue;
147
+ const key = keyFile.replace(/\.json$/, "");
148
+ // Compare with sanitizeKey on both sides — session keys from the filesystem
149
+ // are already sanitized (colons → underscores), but the canonical key from
150
+ // the pipeline may still have colons (e.g. "chat:any" vs "chat_any").
151
+ if (currentSession && friendId === currentSession.friendId && channel === currentSession.channel && (0, config_1.sanitizeKey)(key) === (0, config_1.sanitizeKey)(currentSession.key)) {
152
+ continue;
153
+ }
154
+ const sessionPath = path.join(channelPath, keyFile);
155
+ const activity = parseFriendActivity(sessionPath);
156
+ if (!activity)
157
+ continue;
158
+ if (nowMs - activity.lastActivityMs > activeThresholdMs)
159
+ continue;
160
+ results.push({
161
+ friendId,
162
+ friendName: resolveFriendName(friendId, friendsDir, agentName),
163
+ channel,
164
+ key,
165
+ sessionPath,
166
+ lastActivityAt: activity.lastActivityAt,
167
+ lastActivityMs: activity.lastActivityMs,
168
+ activitySource: activity.activitySource,
169
+ lastInboundAt: activity.lastInboundAt,
170
+ lastOutboundAt: activity.lastOutboundAt,
171
+ unansweredInboundCount: activity.unansweredInboundCount,
172
+ });
173
+ }
174
+ }
175
+ }
176
+ return results.sort((a, b) => {
177
+ const sourceDiff = activityPriority(a.activitySource) - activityPriority(b.activitySource);
178
+ if (sourceDiff !== 0)
179
+ return sourceDiff;
180
+ return b.lastActivityMs - a.lastActivityMs;
181
+ });
182
+ }
183
+ function findFreshestFriendSession(query) {
184
+ const { activeOnly = false, activeThresholdMs = DEFAULT_ACTIVE_THRESHOLD_MS, nowMs, ...rest } = query;
185
+ const currentSession = rest.currentSession ?? null;
186
+ const all = activeOnly
187
+ ? listSessionActivity({ ...rest, activeThresholdMs, nowMs, currentSession })
188
+ : listSessionActivity({ ...rest, activeThresholdMs: Number.MAX_SAFE_INTEGER, nowMs, currentSession });
189
+ return all.find((entry) => entry.friendId === query.friendId) ?? null;
190
+ }