evolcore 0.0.25 → 0.0.27

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 (304) hide show
  1. package/CHANGELOG.md +632 -565
  2. package/LICENSE +21 -21
  3. package/README.md +455 -455
  4. package/bin/codex-managed-acl.ps1 +203 -160
  5. package/bin/codex-managed-hook.mjs +208 -208
  6. package/bin/ec-safe-output.js +327 -327
  7. package/bin/ec.js +40 -29
  8. package/bin/install-codex-managed-hooks.mjs +582 -555
  9. package/dist/agents/baseagent-availability.js +68 -0
  10. package/dist/agents/baseagent.js +96 -46
  11. package/dist/agents/claude-runner.js +172 -33
  12. package/dist/agents/codex/app-server-client.js +76 -31
  13. package/dist/agents/codex/catalog.js +1 -1
  14. package/dist/agents/codex/diagnostics.js +34 -1
  15. package/dist/agents/codex-runner.js +434 -446
  16. package/dist/agents/ecagent-runner.js +174 -34
  17. package/dist/agents/gemini-runner.js +8 -7
  18. package/dist/agents/runner-types.js +75 -19
  19. package/dist/aun/aid/agentmd.js +151 -36
  20. package/dist/aun/aid/client.js +1 -1
  21. package/dist/aun/aid/control-aid.js +180 -1
  22. package/dist/aun/aid/identity.js +4 -4
  23. package/dist/aun/aid/index.js +1 -1
  24. package/dist/aun/aid/store.js +17 -13
  25. package/dist/aun/group/history.js +303 -0
  26. package/dist/aun/group/identity.js +43 -0
  27. package/dist/aun/group/index.js +5 -0
  28. package/dist/aun/{msg/group.js → group/operations.js} +162 -39
  29. package/dist/aun/{menu-client.js → menu/client.js} +85 -6
  30. package/dist/aun/menu/index.js +2 -0
  31. package/dist/aun/menu/transport.js +49 -0
  32. package/dist/aun/msg/index.js +2 -1
  33. package/dist/aun/msg/managed-operation.js +85 -19
  34. package/dist/aun/msg/mention-schema.js +51 -0
  35. package/dist/aun/msg/p2p.js +19 -9
  36. package/dist/aun/msg/upload.js +43 -80
  37. package/dist/aun/outbox.js +29 -7
  38. package/dist/aun/rpc/client.js +1 -0
  39. package/dist/aun/storage/client.js +39 -50
  40. package/dist/channels/aun.js +842 -318
  41. package/dist/channels/daemon.js +10 -6
  42. package/dist/cli/agent-command.js +212 -89
  43. package/dist/cli/agent-create.js +626 -11
  44. package/dist/cli/agent.js +125 -13
  45. package/dist/cli/aun-commands.js +487 -337
  46. package/dist/cli/bench.js +20 -20
  47. package/dist/cli/config.js +55 -33
  48. package/dist/cli/contact.js +72 -15
  49. package/dist/cli/ctl-command.js +24 -24
  50. package/dist/cli/daemon-commands.js +140 -63
  51. package/dist/cli/diag.js +31 -0
  52. package/dist/cli/fs-command.js +70 -70
  53. package/dist/cli/handoff-command.js +46 -14
  54. package/dist/cli/index.js +91 -79
  55. package/dist/cli/init.js +34 -1
  56. package/dist/cli/link-rules.js +21 -21
  57. package/dist/cli/managed-command-guard.js +5 -1
  58. package/dist/cli/menu-client.js +51 -32
  59. package/dist/cli/model.js +3 -3
  60. package/dist/cli/net-check.js +22 -22
  61. package/dist/cli/queue-command.js +31 -31
  62. package/dist/cli/response.js +32 -32
  63. package/dist/cli/restart-monitor.js +103 -42
  64. package/dist/cli/stats.js +51 -51
  65. package/dist/cli/task-command.js +59 -0
  66. package/dist/cli/task-context.js +97 -49
  67. package/dist/cli/trigger-command.js +74 -64
  68. package/dist/config/builtin-roles.js +11 -0
  69. package/dist/config/config-field-policy.js +11 -0
  70. package/dist/config/config-manager.js +32 -4
  71. package/dist/config/config-operation-service.js +160 -0
  72. package/dist/config/contact-book-store.js +1 -1
  73. package/dist/config/contact-book.js +1 -1
  74. package/dist/config/contact-operation-service.js +97 -8
  75. package/dist/config/peer-role-resolver.js +1 -1
  76. package/dist/config/resolved-config-op.js +30 -7
  77. package/dist/config-store.js +1 -1
  78. package/dist/core/agent-application-service.js +7 -1
  79. package/dist/core/audit/event-key.js +17 -2
  80. package/dist/core/audit/log-integrity.js +34 -8
  81. package/dist/core/auth/agent-delegation.js +48 -14
  82. package/dist/core/auth/auth-gateway.js +2 -0
  83. package/dist/core/auth/authorization-audit.js +53 -49
  84. package/dist/core/auth/operation-authorizer.js +90 -7
  85. package/dist/core/auth/operation-catalog.js +145 -4
  86. package/dist/core/auth/remote-access-store.js +155 -10
  87. package/dist/core/bootstrap-messages.js +66 -7
  88. package/dist/core/bootstrap-service.js +111 -20
  89. package/dist/core/command/agent-control.js +88 -7
  90. package/dist/core/command/agent-storage-menu.js +443 -0
  91. package/dist/core/command/cli-intent-parser.js +19 -0
  92. package/dist/core/command/command-handler.js +159 -65
  93. package/dist/core/command/data-root-resolver.js +273 -0
  94. package/dist/core/command/diag-service.js +118 -0
  95. package/dist/core/command/group-menu.js +7 -2
  96. package/dist/core/command/menu-catalog.js +46 -7
  97. package/dist/core/command/menu-handler.js +392 -100
  98. package/dist/core/command/menu-protocol.js +45 -6
  99. package/dist/core/command/menu-token-store.js +41 -8
  100. package/dist/core/command/role-menu.js +2 -2
  101. package/dist/core/command/slash-gate.js +34 -4
  102. package/dist/core/command/slash-handler.js +123 -43
  103. package/dist/core/event-catalog.js +4 -0
  104. package/dist/core/evolagent-registry.js +28 -2
  105. package/dist/core/group/invite-service.js +924 -0
  106. package/dist/core/handoff/runtime.js +205 -27
  107. package/dist/core/handoff/store.js +193 -4
  108. package/dist/core/interaction-router.js +22 -8
  109. package/dist/core/message/im-renderer.js +146 -34
  110. package/dist/core/message/message-bridge.js +163 -20
  111. package/dist/core/message/message-log.js +5 -3
  112. package/dist/core/message/message-queue.js +99 -41
  113. package/dist/core/message/message-utils.js +1 -0
  114. package/dist/core/message/response-engine.js +755 -144
  115. package/dist/core/model/catalog-service.js +79 -49
  116. package/dist/core/model/context-window-suffix.js +33 -0
  117. package/dist/core/model/model-catalog.js +1 -1
  118. package/dist/core/model/model-permission.js +12 -3
  119. package/dist/core/permission/approval-gateway.js +36 -3
  120. package/dist/core/permission/ec-command-parser.js +112 -41
  121. package/dist/core/permission/protected-paths.js +134 -16
  122. package/dist/core/permission/sandbox-runtime.js +108 -17
  123. package/dist/core/permission/tool-error-code.js +15 -0
  124. package/dist/core/permission/tool-policy.js +9 -8
  125. package/dist/core/relation/peer-identity.js +57 -6
  126. package/dist/core/relation/shared-data.js +106 -0
  127. package/dist/core/role/runtime-policy.js +64 -0
  128. package/dist/core/runtime-lock.js +10 -26
  129. package/dist/core/session/runner-task-history.js +170 -0
  130. package/dist/core/session/session-manager.js +34 -6
  131. package/dist/core/session/session-mapper.js +41 -0
  132. package/dist/core/session/session-turn-coordinator.js +37 -7
  133. package/dist/core/session/session-turns.js +48 -7
  134. package/dist/core/task/task-recovery-service.js +176 -0
  135. package/dist/core/task/task-resume-operation.js +32 -0
  136. package/dist/eck/group-rules-sync.js +5 -3
  137. package/dist/eck/kit-renderer.js +1 -0
  138. package/dist/index.js +588 -217
  139. package/dist/ipc.js +193 -15
  140. package/dist/paths.js +17 -4
  141. package/dist/product.js +2 -0
  142. package/dist/response-system/engines/v1/proactive-flow.js +59 -2
  143. package/dist/stats/billing.js +41 -15
  144. package/dist/stats/db.js +159 -159
  145. package/dist/stats/eck-vars.js +9 -9
  146. package/dist/stats/price-resolver.js +28 -10
  147. package/dist/stats/query.js +139 -139
  148. package/dist/stats/role-budget.js +6 -6
  149. package/dist/stats/writer.js +51 -51
  150. package/dist/trigger/event-source.js +19 -0
  151. package/dist/trigger/feedback.js +233 -40
  152. package/dist/trigger/parser.js +55 -5
  153. package/dist/trigger/patch.js +9 -0
  154. package/dist/trigger/scheduler.js +30 -4
  155. package/dist/trigger/validation.js +20 -3
  156. package/dist/utils/cross-platform.js +30 -1
  157. package/dist/utils/ecweb-utils.js +1 -0
  158. package/dist/utils/error-dict.json +160 -160
  159. package/dist/utils/error-utils.js +61 -2
  160. package/dist/utils/evolcore-version.js +129 -0
  161. package/dist/utils/logger.js +26 -14
  162. package/dist/utils/macos-autostart.js +22 -22
  163. package/dist/utils/model-prices.jsonl +23 -23
  164. package/dist/utils/npm-ops.js +176 -35
  165. package/dist/utils/tool-summary.js +59 -3
  166. package/dist/utils/welcome.js +196 -23
  167. package/ecagent/LICENSE +21 -21
  168. package/ecagent/NOTICE +11 -11
  169. package/ecagent/README.md +61 -61
  170. package/ecagent/dist/harness/agent-harness.js +3 -0
  171. package/ecagent/dist/harness/compaction/branch-summarization.js +30 -30
  172. package/ecagent/dist/harness/compaction/compaction.js +83 -83
  173. package/ecagent/dist/harness/messages.js +7 -7
  174. package/ecagent/dist/harness/session/jsonl-storage.js +21 -2
  175. package/kits/docs/GUIDE.md +20 -20
  176. package/kits/docs/INDEX.md +60 -66
  177. package/kits/docs/aun/CHEATSHEET.md +19 -19
  178. package/kits/docs/aun/SYNC_PROTOCOL.md +15 -15
  179. package/kits/docs/channels/aun.md +69 -56
  180. package/kits/docs/channels/feishu.md +56 -56
  181. package/kits/docs/context-assembly.md +379 -367
  182. package/kits/docs/eck_templates/GUIDE.template.md +22 -22
  183. package/kits/docs/eck_templates/INDEX.template.md +28 -28
  184. package/kits/docs/eck_templates/path-registry.template.md +33 -33
  185. package/kits/docs/eck_templates/runtime.template.md +19 -19
  186. package/kits/docs/evolcore/INDEX.md +76 -71
  187. package/kits/docs/evolcore/agent-create.md +202 -165
  188. package/kits/docs/evolcore/agent.md +99 -67
  189. package/kits/docs/evolcore/aid.md +68 -60
  190. package/kits/docs/evolcore/codex-windows-sandbox.md +146 -146
  191. package/kits/docs/evolcore/config.md +241 -195
  192. package/kits/docs/evolcore/contact.md +75 -68
  193. package/kits/docs/evolcore/ctl.md +46 -46
  194. package/kits/docs/evolcore/event.md +216 -216
  195. package/kits/docs/evolcore/fs-architecture.md +1215 -1215
  196. package/kits/docs/evolcore/fs.md +110 -110
  197. package/kits/docs/evolcore/group-collaboration.md +244 -244
  198. package/kits/docs/evolcore/group-fs.md +17 -17
  199. package/kits/docs/evolcore/group-rules.md +251 -251
  200. package/kits/docs/evolcore/group.md +267 -152
  201. package/kits/docs/evolcore/menu-client.md +58 -34
  202. package/kits/docs/evolcore/model.md +50 -50
  203. package/kits/docs/evolcore/msg.md +169 -165
  204. package/kits/docs/evolcore/response.md +75 -75
  205. package/kits/docs/evolcore/rpc.md +37 -37
  206. package/kits/docs/evolcore/self-summary.md +29 -29
  207. package/kits/docs/evolcore/stats.md +83 -83
  208. package/kits/docs/evolcore/storage.md +53 -50
  209. package/kits/docs/evolcore/task.md +14 -0
  210. package/kits/docs/evolcore/trigger.md +623 -575
  211. package/kits/docs/identity/AID_PROFILE_SPEC.md +26 -26
  212. package/kits/docs/identity/PATH_OPS.md +16 -16
  213. package/kits/docs/identity/ROLE_DETAIL.md +25 -25
  214. package/kits/docs/identity/identity-tools.md +26 -26
  215. package/kits/docs/path-registry.md +62 -62
  216. package/kits/docs/prompt-loading-architecture.md +269 -269
  217. package/kits/docs/venues/aun-group.md +45 -45
  218. package/kits/docs/venues/aun-private.md +10 -10
  219. package/kits/docs/venues/client-desktop.md +10 -10
  220. package/kits/docs/venues/client-mobile.md +10 -10
  221. package/kits/docs/venues/feishu-group.md +13 -13
  222. package/kits/docs/venues/feishu-private.md +9 -9
  223. package/kits/docs/venues/group.md +42 -25
  224. package/kits/docs/venues/private.md +10 -10
  225. package/kits/eck_manifest.auxiliary.json +43 -43
  226. package/kits/eck_manifest.json +217 -190
  227. package/kits/eck_message_manifest.json +74 -74
  228. package/kits/migrations/README-role-config-v4.md +32 -32
  229. package/kits/migrations/migrate-contact-book-v2.mjs +748 -748
  230. package/kits/migrations/migrate-role-config-v4.mjs +614 -614
  231. package/kits/migrations/migrate-role-config-v5.mjs +365 -365
  232. package/kits/migrations/rename-config-file.mjs +99 -99
  233. package/kits/rules/01-overview.md +166 -162
  234. package/kits/rules/02-navigation.md +96 -96
  235. package/kits/rules/03-identity.md +36 -36
  236. package/kits/rules/04-relation.md +76 -75
  237. package/kits/rules/05-venue.md +60 -60
  238. package/kits/rules/06-channel.md +65 -63
  239. package/kits/schemas/_meta.json +53 -53
  240. package/kits/schemas/agent-config.schema.1.json +177 -177
  241. package/kits/schemas/agent-config.schema.10.json +395 -395
  242. package/kits/schemas/agent-config.schema.11.json +421 -421
  243. package/kits/schemas/agent-config.schema.12.json +451 -427
  244. package/kits/schemas/agent-config.schema.2.json +239 -239
  245. package/kits/schemas/agent-config.schema.3.json +119 -119
  246. package/kits/schemas/agent-config.schema.4.json +208 -208
  247. package/kits/schemas/agent-config.schema.5.json +326 -326
  248. package/kits/schemas/agent-config.schema.6.json +322 -322
  249. package/kits/schemas/agent-config.schema.7.json +303 -303
  250. package/kits/schemas/agent-config.schema.8.json +304 -304
  251. package/kits/schemas/agent-config.schema.9.json +364 -364
  252. package/kits/schemas/contact-book.schema.1.json +36 -36
  253. package/kits/schemas/contact-book.schema.2.json +43 -43
  254. package/kits/schemas/contact-book.schema.3.json +67 -67
  255. package/kits/schemas/daemon.schema.1.json +91 -91
  256. package/kits/schemas/daemon.schema.2.json +101 -101
  257. package/kits/schemas/daemon.schema.3.json +123 -123
  258. package/kits/schemas/daemon.schema.4.json +136 -136
  259. package/kits/schemas/daemon.schema.5.json +135 -135
  260. package/kits/schemas/daemon.schema.6.json +131 -131
  261. package/kits/schemas/defaults.schema.1.json +81 -81
  262. package/kits/schemas/defaults.schema.2.json +85 -85
  263. package/kits/schemas/defaults.schema.3.json +73 -73
  264. package/kits/schemas/defaults.schema.4.json +107 -107
  265. package/kits/schemas/defaults.schema.5.json +119 -119
  266. package/kits/schemas/menu-exec-schema-commands.md +208 -208
  267. package/kits/schemas/migrations/README.md +30 -30
  268. package/kits/schemas/relation-config.schema.1.json +158 -158
  269. package/kits/schemas/relation-config.schema.2.json +73 -73
  270. package/kits/schemas/relation-config.schema.3.json +50 -50
  271. package/kits/schemas/relation-config.schema.4.json +47 -47
  272. package/kits/schemas/relation-config.schema.5.json +47 -47
  273. package/kits/schemas/relation-config.schema.6.json +46 -46
  274. package/kits/schemas/relation-config.schema.7.json +59 -59
  275. package/kits/schemas/relation-config.schema.8.json +103 -103
  276. package/kits/schemas/role-config.schema.1.json +215 -201
  277. package/kits/schemas/role-registry.schema.1.json +35 -35
  278. package/kits/schemas/single-session.schema.1.json +31 -31
  279. package/kits/schemas/single-session.schema.2.json +57 -57
  280. package/kits/schemas/single-session.schema.3.json +32 -32
  281. package/kits/templates/bootstrap-welcome.md +17 -17
  282. package/kits/templates/message-fragments/handoff-context-to-target.md +9 -9
  283. package/kits/templates/message-fragments/handoff-request-to-target.md +19 -19
  284. package/kits/templates/message-fragments/handoff-response-to-origin.md +9 -9
  285. package/kits/templates/message-fragments/inject-default.md +2 -2
  286. package/kits/templates/message-fragments/item.md +2 -2
  287. package/kits/templates/roles/admin.json +92 -92
  288. package/kits/templates/roles/member.json +101 -96
  289. package/kits/templates/roles/owner.json +9 -9
  290. package/kits/templates/roles/visitor.json +90 -85
  291. package/kits/templates/system-fragments/baseagent.md +14 -14
  292. package/kits/templates/system-fragments/bootstrap.md +53 -34
  293. package/kits/templates/system-fragments/channel.md +28 -64
  294. package/kits/templates/system-fragments/commands.md +36 -28
  295. package/kits/templates/system-fragments/group-unread-history.md +7 -0
  296. package/kits/templates/system-fragments/identity.md +13 -13
  297. package/kits/templates/system-fragments/relation.md +19 -19
  298. package/kits/templates/system-fragments/reply.md +56 -0
  299. package/kits/templates/system-fragments/session.md +59 -59
  300. package/kits/templates/system-fragments/venue.md +31 -31
  301. package/package.json +104 -98
  302. package/dist/aun/group-identity.js +0 -9
  303. /package/dist/aun/{group-fs-download.js → group/fs-download.js} +0 -0
  304. /package/dist/aun/{msg/group-index.js → group/index-rpc.js} +0 -0
@@ -1,3 +1,4 @@
1
+ import { normalizeBaseagent } from './baseagent.js';
1
2
  import { commandExists } from '../utils/cross-platform.js';
2
3
  import { getCodexAppServerAvailability } from './codex-runner.js';
3
4
  export const BASEAGENT_CANDIDATES = ['claude', 'codex', 'gemini', 'ecagent'];
@@ -46,3 +47,70 @@ export function detectBaseagentDetails(codexAvailability = getCodexAppServerAvai
46
47
  },
47
48
  ];
48
49
  }
50
+ /** Only loaded runners can be switched to; never infer this from PATH/config. */
51
+ export function loadedBaseagentIds(keys, owner) {
52
+ const result = new Set();
53
+ for (const key of keys) {
54
+ if (owner !== undefined && !key.startsWith(`${owner}::`))
55
+ continue;
56
+ const separator = key.indexOf('::');
57
+ result.add(separator < 0 ? key : key.slice(separator + 2));
58
+ }
59
+ return [...result];
60
+ }
61
+ function canonical(value) {
62
+ if (typeof value !== 'string')
63
+ return null;
64
+ const id = normalizeBaseagent(value).canonical;
65
+ return id === 'unknown' ? null : id;
66
+ }
67
+ function record(value) {
68
+ return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
69
+ }
70
+ function text(value) {
71
+ return typeof value === 'string' && value.trim() ? value : null;
72
+ }
73
+ /** Safe public projection: credentials and arbitrary backend settings never leave this boundary. */
74
+ export function buildBaseagentSnapshot(config, detections, loaded) {
75
+ const blocks = new Map();
76
+ for (const [name, value] of Object.entries(record(config.baseagents))) {
77
+ const id = canonical(name);
78
+ if (id)
79
+ blocks.set(id, record(value));
80
+ }
81
+ const active = canonical(config.active_baseagent);
82
+ const probes = new Map((detections ?? []).map(item => [String(item.id), item]));
83
+ const loadedIds = loaded === undefined ? null : new Set(loaded);
84
+ const ids = new Set([
85
+ ...blocks.keys(),
86
+ ...(detections ?? []).filter(item => item.detected).map(item => item.id),
87
+ ...(loaded ?? []),
88
+ ...(active ? [active] : []),
89
+ ]);
90
+ return {
91
+ active,
92
+ baseagents: [...ids].map(id => ({
93
+ id,
94
+ label: normalizeBaseagent(id).displayName,
95
+ configured: blocks.has(id),
96
+ detected: detections === null ? null : probes.get(id)?.detected === true,
97
+ loaded: loadedIds?.has(id) ?? null,
98
+ active: id === active,
99
+ model: text(blocks.get(id)?.model),
100
+ effort: text(blocks.get(id)?.effort ?? blocks.get(id)?.reasoning),
101
+ version: probes.get(id)?.version ?? null,
102
+ })),
103
+ };
104
+ }
105
+ /** Shared defaults/Agent inventory for menu, slash and local history readers. */
106
+ export async function getBaseagentSnapshot(options = {}) {
107
+ let config = options.config;
108
+ if (config === undefined) {
109
+ const { read, ConfigTarget } = await import('../config/config-manager.js');
110
+ config = read(ConfigTarget.Defaults, undefined, { cache: false, expand: false }) ?? {};
111
+ }
112
+ const detections = options.probe === false
113
+ ? null
114
+ : (await import('./baseagent-availability.js')).detectBaseagentDetails();
115
+ return buildBaseagentSnapshot(config ?? {}, detections, options.loaded);
116
+ }
@@ -14,6 +14,7 @@ import path from 'path';
14
14
  import os from 'os';
15
15
  import { commandExists, isWindows, resolveProbePath } from '../utils/cross-platform.js';
16
16
  import { execFileSync } from 'child_process';
17
+ import { parse as parseToml } from 'smol-toml';
17
18
  /** Resolve the installed Codex CLI entrypoint, including npm shims on Windows. */
18
19
  export function resolveCodexCliPath() {
19
20
  return resolveProbePath('codex');
@@ -185,55 +186,74 @@ export function resolveAnthropicConfig(config, override) {
185
186
  || pickExec(config.agents?.claude?.pathToClaudeCodeExecutable);
186
187
  return { apiKey, baseUrl, headers, queryParams, model, effort, pathToClaudeCodeExecutable };
187
188
  }
189
+ function nonEmptyString(value) {
190
+ return typeof value === 'string' && value.trim() ? value.trim() : undefined;
191
+ }
192
+ function recordValue(value) {
193
+ return value && typeof value === 'object' && !Array.isArray(value)
194
+ ? value
195
+ : undefined;
196
+ }
188
197
  export function loadCodexSettings() {
198
+ const configuredHome = process.env.CODEX_HOME?.trim();
199
+ const codexHome = configuredHome ? path.resolve(configuredHome) : path.join(os.homedir(), '.codex');
200
+ const authPath = path.join(codexHome, 'auth.json');
201
+ const configPath = path.join(codexHome, 'config.toml');
202
+ let authJsonApiKey;
189
203
  try {
190
- const configuredHome = process.env.CODEX_HOME?.trim();
191
- const codexHome = configuredHome ? path.resolve(configuredHome) : path.join(os.homedir(), '.codex');
192
- const authPath = path.join(codexHome, 'auth.json');
193
- let apiKey;
194
204
  if (fs.existsSync(authPath)) {
195
205
  const auth = JSON.parse(fs.readFileSync(authPath, 'utf-8'));
196
- apiKey = auth.OPENAI_API_KEY;
206
+ authJsonApiKey = nonEmptyString(auth?.OPENAI_API_KEY);
197
207
  }
198
- const configPath = path.join(codexHome, 'config.toml');
199
- let model;
200
- let baseUrl;
201
- let provider;
208
+ }
209
+ catch {
210
+ // A corrupt auth.json must not prevent the provider config from loading.
211
+ }
212
+ let model;
213
+ let baseUrl;
214
+ let provider;
215
+ let bearerToken;
216
+ let requiresOpenaiAuth;
217
+ try {
202
218
  if (fs.existsSync(configPath)) {
203
- const content = fs.readFileSync(configPath, 'utf-8');
204
- const modelMatch = content.match(/^model\s*=\s*"([^"]+)"/m);
205
- if (modelMatch)
206
- model = modelMatch[1];
207
- const providerMatch = content.match(/^model_provider\s*=\s*"([^"]+)"/m);
208
- if (providerMatch) {
209
- provider = providerMatch[1];
210
- baseUrl = readCodexProviderBaseUrl(content, provider);
211
- }
219
+ const parsed = recordValue(parseToml(fs.readFileSync(configPath, 'utf-8')));
220
+ model = nonEmptyString(parsed?.model);
221
+ provider = nonEmptyString(parsed?.model_provider);
222
+ const providers = recordValue(parsed?.model_providers);
223
+ const selectedProvider = provider ? recordValue(providers?.[provider]) : undefined;
224
+ baseUrl = nonEmptyString(selectedProvider?.base_url);
225
+ bearerToken = nonEmptyString(selectedProvider?.experimental_bearer_token);
226
+ requiresOpenaiAuth = typeof selectedProvider?.requires_openai_auth === 'boolean'
227
+ ? selectedProvider.requires_openai_auth
228
+ : undefined;
212
229
  }
213
- return { apiKey, baseUrl, model, provider };
214
230
  }
215
231
  catch { }
216
- return {};
217
- }
218
- function escapeRegExp(value) {
219
- return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
220
- }
221
- function readCodexProviderBaseUrl(content, provider) {
222
- const segments = /^[A-Za-z0-9_-]+$/.test(provider)
223
- ? [provider, JSON.stringify(provider)]
224
- : [JSON.stringify(provider)];
225
- for (const segment of segments) {
226
- const section = new RegExp(`^\\s*\\[\\s*model_providers\\s*\\.\\s*${escapeRegExp(segment)}\\s*\\]\\s*(?:#.*)?$`, 'm').exec(content);
227
- if (!section || section.index === undefined)
228
- continue;
229
- const tail = content.slice(section.index + section[0].length);
230
- const nextSection = tail.search(/^\s*\[/m);
231
- const block = nextSection >= 0 ? tail.slice(0, nextSection) : tail;
232
- const baseUrl = block.match(/^\s*base_url\s*=\s*"([^"]+)"/m)?.[1];
233
- if (baseUrl)
234
- return baseUrl;
232
+ // Codex applies a provider's explicit bearer token before auth.json. Keep
233
+ // that precedence so EvolCore and the app-server select the same identity.
234
+ if (bearerToken) {
235
+ return {
236
+ apiKey: bearerToken,
237
+ authType: 'bearerToken',
238
+ authSource: 'config.toml',
239
+ baseUrl,
240
+ model,
241
+ provider,
242
+ requiresOpenaiAuth,
243
+ };
235
244
  }
236
- return undefined;
245
+ if (authJsonApiKey) {
246
+ return {
247
+ apiKey: authJsonApiKey,
248
+ authType: 'apiKey',
249
+ authSource: 'auth.json',
250
+ baseUrl,
251
+ model,
252
+ provider,
253
+ requiresOpenaiAuth,
254
+ };
255
+ }
256
+ return { baseUrl, model, provider, requiresOpenaiAuth };
237
257
  }
238
258
  /**
239
259
  * Resolve a complete credential/endpoint pair for direct OpenAI HTTP calls.
@@ -248,14 +268,23 @@ export function resolveOpenaiDirectConfig(override) {
248
268
  ...normalizeRequestMetadata(override),
249
269
  };
250
270
  }
251
- const environment = directInferencePair(process.env.OPENAI_API_KEY, process.env.OPENAI_BASE_URL);
271
+ const settings = loadCodexSettings();
272
+ const configuredBearer = settings.authType === 'bearerToken'
273
+ ? directInferencePair(settings.apiKey, settings.baseUrl)
274
+ : undefined;
275
+ if (configuredBearer) {
276
+ return {
277
+ ...configuredBearer,
278
+ ...normalizeRequestMetadata(override),
279
+ };
280
+ }
281
+ const environment = directInferencePair(process.env.OPENAI_API_KEY || process.env.CODEX_API_KEY, process.env.OPENAI_BASE_URL);
252
282
  if (environment) {
253
283
  return {
254
284
  ...environment,
255
285
  ...normalizeRequestMetadata(override),
256
286
  };
257
287
  }
258
- const settings = loadCodexSettings();
259
288
  const settingsResolved = directInferencePair(settings.apiKey, settings.baseUrl);
260
289
  return settingsResolved
261
290
  ? {
@@ -269,12 +298,31 @@ export function resolveOpenaiConfig(config, override, runtime) {
269
298
  const isPlaceholder = (v) => !v || v.includes('your-') || v.includes('placeholder');
270
299
  const overrideApiKey = isPlaceholder(override?.apiKey) ? undefined : override?.apiKey;
271
300
  const globalApiKey = isPlaceholder(config.agents?.codex?.apiKey) ? undefined : config.agents?.codex?.apiKey;
272
- const apiKey = overrideApiKey
273
- || globalApiKey
274
- || process.env.OPENAI_API_KEY
275
- || codexSettings.apiKey;
301
+ const environmentApiKey = [process.env.OPENAI_API_KEY, process.env.CODEX_API_KEY]
302
+ .map(value => isPlaceholder(value) ? undefined : value)
303
+ .find((value) => !!value);
304
+ const configuredBearer = codexSettings.authType === 'bearerToken' ? codexSettings.apiKey : undefined;
305
+ const storedApiKey = codexSettings.authType === 'apiKey' ? codexSettings.apiKey : undefined;
306
+ // A selected provider's explicit token is authoritative for that provider.
307
+ // OPENAI_API_KEY is not used by Codex when the provider declares its own
308
+ // bearer token, so choosing it here would make EvolCore and app-server use
309
+ // different credentials.
310
+ const credential = overrideApiKey
311
+ ? { apiKey: overrideApiKey, authType: 'apiKey', authSource: 'agent-config' }
312
+ : globalApiKey
313
+ ? { apiKey: globalApiKey, authType: 'apiKey', authSource: 'agent-config' }
314
+ : configuredBearer
315
+ ? { apiKey: configuredBearer, authType: 'bearerToken', authSource: 'config.toml' }
316
+ : environmentApiKey
317
+ ? { apiKey: environmentApiKey, authType: 'apiKey', authSource: 'environment' }
318
+ : storedApiKey
319
+ ? { apiKey: storedApiKey, authType: 'apiKey', authSource: 'auth.json' }
320
+ : undefined;
321
+ const apiKey = credential?.apiKey;
322
+ const authType = credential?.authType;
323
+ const authSource = credential?.authSource;
276
324
  if (!apiKey) {
277
- throw new Error('No OpenAI API key found. Set one of: baseagents.codex.apiKey (per-agent or defaults), env OPENAI_API_KEY, or ~/.codex/auth.json');
325
+ throw new Error('No Codex credential found. Set baseagents.codex.apiKey, env OPENAI_API_KEY/CODEX_API_KEY, ~/.codex/auth.json, or a provider experimental_bearer_token in ~/.codex/config.toml');
278
326
  }
279
327
  const isPlaceholderUrl = (v) => !v || v.includes('api.openai.com');
280
328
  const overrideBaseUrl = isPlaceholderUrl(override?.baseUrl) ? undefined : override?.baseUrl;
@@ -303,6 +351,8 @@ export function resolveOpenaiConfig(config, override, runtime) {
303
351
  ?? undefined;
304
352
  return {
305
353
  apiKey,
354
+ authType,
355
+ authSource,
306
356
  baseUrl,
307
357
  provider: codexSettings.provider,
308
358
  headers,