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.
- package/CHANGELOG.md +632 -565
- package/LICENSE +21 -21
- package/README.md +455 -455
- package/bin/codex-managed-acl.ps1 +203 -160
- package/bin/codex-managed-hook.mjs +208 -208
- package/bin/ec-safe-output.js +327 -327
- package/bin/ec.js +40 -29
- package/bin/install-codex-managed-hooks.mjs +582 -555
- package/dist/agents/baseagent-availability.js +68 -0
- package/dist/agents/baseagent.js +96 -46
- package/dist/agents/claude-runner.js +172 -33
- package/dist/agents/codex/app-server-client.js +76 -31
- package/dist/agents/codex/catalog.js +1 -1
- package/dist/agents/codex/diagnostics.js +34 -1
- package/dist/agents/codex-runner.js +434 -446
- package/dist/agents/ecagent-runner.js +174 -34
- package/dist/agents/gemini-runner.js +8 -7
- package/dist/agents/runner-types.js +75 -19
- package/dist/aun/aid/agentmd.js +151 -36
- package/dist/aun/aid/client.js +1 -1
- package/dist/aun/aid/control-aid.js +180 -1
- package/dist/aun/aid/identity.js +4 -4
- package/dist/aun/aid/index.js +1 -1
- package/dist/aun/aid/store.js +17 -13
- package/dist/aun/group/history.js +303 -0
- package/dist/aun/group/identity.js +43 -0
- package/dist/aun/group/index.js +5 -0
- package/dist/aun/{msg/group.js → group/operations.js} +162 -39
- package/dist/aun/{menu-client.js → menu/client.js} +85 -6
- package/dist/aun/menu/index.js +2 -0
- package/dist/aun/menu/transport.js +49 -0
- package/dist/aun/msg/index.js +2 -1
- package/dist/aun/msg/managed-operation.js +85 -19
- package/dist/aun/msg/mention-schema.js +51 -0
- package/dist/aun/msg/p2p.js +19 -9
- package/dist/aun/msg/upload.js +43 -80
- package/dist/aun/outbox.js +29 -7
- package/dist/aun/rpc/client.js +1 -0
- package/dist/aun/storage/client.js +39 -50
- package/dist/channels/aun.js +842 -318
- package/dist/channels/daemon.js +10 -6
- package/dist/cli/agent-command.js +212 -89
- package/dist/cli/agent-create.js +626 -11
- package/dist/cli/agent.js +125 -13
- package/dist/cli/aun-commands.js +487 -337
- package/dist/cli/bench.js +20 -20
- package/dist/cli/config.js +55 -33
- package/dist/cli/contact.js +72 -15
- package/dist/cli/ctl-command.js +24 -24
- package/dist/cli/daemon-commands.js +140 -63
- package/dist/cli/diag.js +31 -0
- package/dist/cli/fs-command.js +70 -70
- package/dist/cli/handoff-command.js +46 -14
- package/dist/cli/index.js +91 -79
- package/dist/cli/init.js +34 -1
- package/dist/cli/link-rules.js +21 -21
- package/dist/cli/managed-command-guard.js +5 -1
- package/dist/cli/menu-client.js +51 -32
- package/dist/cli/model.js +3 -3
- package/dist/cli/net-check.js +22 -22
- package/dist/cli/queue-command.js +31 -31
- package/dist/cli/response.js +32 -32
- package/dist/cli/restart-monitor.js +103 -42
- package/dist/cli/stats.js +51 -51
- package/dist/cli/task-command.js +59 -0
- package/dist/cli/task-context.js +97 -49
- package/dist/cli/trigger-command.js +74 -64
- package/dist/config/builtin-roles.js +11 -0
- package/dist/config/config-field-policy.js +11 -0
- package/dist/config/config-manager.js +32 -4
- package/dist/config/config-operation-service.js +160 -0
- package/dist/config/contact-book-store.js +1 -1
- package/dist/config/contact-book.js +1 -1
- package/dist/config/contact-operation-service.js +97 -8
- package/dist/config/peer-role-resolver.js +1 -1
- package/dist/config/resolved-config-op.js +30 -7
- package/dist/config-store.js +1 -1
- package/dist/core/agent-application-service.js +7 -1
- package/dist/core/audit/event-key.js +17 -2
- package/dist/core/audit/log-integrity.js +34 -8
- package/dist/core/auth/agent-delegation.js +48 -14
- package/dist/core/auth/auth-gateway.js +2 -0
- package/dist/core/auth/authorization-audit.js +53 -49
- package/dist/core/auth/operation-authorizer.js +90 -7
- package/dist/core/auth/operation-catalog.js +145 -4
- package/dist/core/auth/remote-access-store.js +155 -10
- package/dist/core/bootstrap-messages.js +66 -7
- package/dist/core/bootstrap-service.js +111 -20
- package/dist/core/command/agent-control.js +88 -7
- package/dist/core/command/agent-storage-menu.js +443 -0
- package/dist/core/command/cli-intent-parser.js +19 -0
- package/dist/core/command/command-handler.js +159 -65
- package/dist/core/command/data-root-resolver.js +273 -0
- package/dist/core/command/diag-service.js +118 -0
- package/dist/core/command/group-menu.js +7 -2
- package/dist/core/command/menu-catalog.js +46 -7
- package/dist/core/command/menu-handler.js +392 -100
- package/dist/core/command/menu-protocol.js +45 -6
- package/dist/core/command/menu-token-store.js +41 -8
- package/dist/core/command/role-menu.js +2 -2
- package/dist/core/command/slash-gate.js +34 -4
- package/dist/core/command/slash-handler.js +123 -43
- package/dist/core/event-catalog.js +4 -0
- package/dist/core/evolagent-registry.js +28 -2
- package/dist/core/group/invite-service.js +924 -0
- package/dist/core/handoff/runtime.js +205 -27
- package/dist/core/handoff/store.js +193 -4
- package/dist/core/interaction-router.js +22 -8
- package/dist/core/message/im-renderer.js +146 -34
- package/dist/core/message/message-bridge.js +163 -20
- package/dist/core/message/message-log.js +5 -3
- package/dist/core/message/message-queue.js +99 -41
- package/dist/core/message/message-utils.js +1 -0
- package/dist/core/message/response-engine.js +755 -144
- package/dist/core/model/catalog-service.js +79 -49
- package/dist/core/model/context-window-suffix.js +33 -0
- package/dist/core/model/model-catalog.js +1 -1
- package/dist/core/model/model-permission.js +12 -3
- package/dist/core/permission/approval-gateway.js +36 -3
- package/dist/core/permission/ec-command-parser.js +112 -41
- package/dist/core/permission/protected-paths.js +134 -16
- package/dist/core/permission/sandbox-runtime.js +108 -17
- package/dist/core/permission/tool-error-code.js +15 -0
- package/dist/core/permission/tool-policy.js +9 -8
- package/dist/core/relation/peer-identity.js +57 -6
- package/dist/core/relation/shared-data.js +106 -0
- package/dist/core/role/runtime-policy.js +64 -0
- package/dist/core/runtime-lock.js +10 -26
- package/dist/core/session/runner-task-history.js +170 -0
- package/dist/core/session/session-manager.js +34 -6
- package/dist/core/session/session-mapper.js +41 -0
- package/dist/core/session/session-turn-coordinator.js +37 -7
- package/dist/core/session/session-turns.js +48 -7
- package/dist/core/task/task-recovery-service.js +176 -0
- package/dist/core/task/task-resume-operation.js +32 -0
- package/dist/eck/group-rules-sync.js +5 -3
- package/dist/eck/kit-renderer.js +1 -0
- package/dist/index.js +588 -217
- package/dist/ipc.js +193 -15
- package/dist/paths.js +17 -4
- package/dist/product.js +2 -0
- package/dist/response-system/engines/v1/proactive-flow.js +59 -2
- package/dist/stats/billing.js +41 -15
- package/dist/stats/db.js +159 -159
- package/dist/stats/eck-vars.js +9 -9
- package/dist/stats/price-resolver.js +28 -10
- package/dist/stats/query.js +139 -139
- package/dist/stats/role-budget.js +6 -6
- package/dist/stats/writer.js +51 -51
- package/dist/trigger/event-source.js +19 -0
- package/dist/trigger/feedback.js +233 -40
- package/dist/trigger/parser.js +55 -5
- package/dist/trigger/patch.js +9 -0
- package/dist/trigger/scheduler.js +30 -4
- package/dist/trigger/validation.js +20 -3
- package/dist/utils/cross-platform.js +30 -1
- package/dist/utils/ecweb-utils.js +1 -0
- package/dist/utils/error-dict.json +160 -160
- package/dist/utils/error-utils.js +61 -2
- package/dist/utils/evolcore-version.js +129 -0
- package/dist/utils/logger.js +26 -14
- package/dist/utils/macos-autostart.js +22 -22
- package/dist/utils/model-prices.jsonl +23 -23
- package/dist/utils/npm-ops.js +176 -35
- package/dist/utils/tool-summary.js +59 -3
- package/dist/utils/welcome.js +196 -23
- package/ecagent/LICENSE +21 -21
- package/ecagent/NOTICE +11 -11
- package/ecagent/README.md +61 -61
- package/ecagent/dist/harness/agent-harness.js +3 -0
- package/ecagent/dist/harness/compaction/branch-summarization.js +30 -30
- package/ecagent/dist/harness/compaction/compaction.js +83 -83
- package/ecagent/dist/harness/messages.js +7 -7
- package/ecagent/dist/harness/session/jsonl-storage.js +21 -2
- package/kits/docs/GUIDE.md +20 -20
- package/kits/docs/INDEX.md +60 -66
- package/kits/docs/aun/CHEATSHEET.md +19 -19
- package/kits/docs/aun/SYNC_PROTOCOL.md +15 -15
- package/kits/docs/channels/aun.md +69 -56
- package/kits/docs/channels/feishu.md +56 -56
- package/kits/docs/context-assembly.md +379 -367
- package/kits/docs/eck_templates/GUIDE.template.md +22 -22
- package/kits/docs/eck_templates/INDEX.template.md +28 -28
- package/kits/docs/eck_templates/path-registry.template.md +33 -33
- package/kits/docs/eck_templates/runtime.template.md +19 -19
- package/kits/docs/evolcore/INDEX.md +76 -71
- package/kits/docs/evolcore/agent-create.md +202 -165
- package/kits/docs/evolcore/agent.md +99 -67
- package/kits/docs/evolcore/aid.md +68 -60
- package/kits/docs/evolcore/codex-windows-sandbox.md +146 -146
- package/kits/docs/evolcore/config.md +241 -195
- package/kits/docs/evolcore/contact.md +75 -68
- package/kits/docs/evolcore/ctl.md +46 -46
- package/kits/docs/evolcore/event.md +216 -216
- package/kits/docs/evolcore/fs-architecture.md +1215 -1215
- package/kits/docs/evolcore/fs.md +110 -110
- package/kits/docs/evolcore/group-collaboration.md +244 -244
- package/kits/docs/evolcore/group-fs.md +17 -17
- package/kits/docs/evolcore/group-rules.md +251 -251
- package/kits/docs/evolcore/group.md +267 -152
- package/kits/docs/evolcore/menu-client.md +58 -34
- package/kits/docs/evolcore/model.md +50 -50
- package/kits/docs/evolcore/msg.md +169 -165
- package/kits/docs/evolcore/response.md +75 -75
- package/kits/docs/evolcore/rpc.md +37 -37
- package/kits/docs/evolcore/self-summary.md +29 -29
- package/kits/docs/evolcore/stats.md +83 -83
- package/kits/docs/evolcore/storage.md +53 -50
- package/kits/docs/evolcore/task.md +14 -0
- package/kits/docs/evolcore/trigger.md +623 -575
- package/kits/docs/identity/AID_PROFILE_SPEC.md +26 -26
- package/kits/docs/identity/PATH_OPS.md +16 -16
- package/kits/docs/identity/ROLE_DETAIL.md +25 -25
- package/kits/docs/identity/identity-tools.md +26 -26
- package/kits/docs/path-registry.md +62 -62
- package/kits/docs/prompt-loading-architecture.md +269 -269
- package/kits/docs/venues/aun-group.md +45 -45
- package/kits/docs/venues/aun-private.md +10 -10
- package/kits/docs/venues/client-desktop.md +10 -10
- package/kits/docs/venues/client-mobile.md +10 -10
- package/kits/docs/venues/feishu-group.md +13 -13
- package/kits/docs/venues/feishu-private.md +9 -9
- package/kits/docs/venues/group.md +42 -25
- package/kits/docs/venues/private.md +10 -10
- package/kits/eck_manifest.auxiliary.json +43 -43
- package/kits/eck_manifest.json +217 -190
- package/kits/eck_message_manifest.json +74 -74
- package/kits/migrations/README-role-config-v4.md +32 -32
- package/kits/migrations/migrate-contact-book-v2.mjs +748 -748
- package/kits/migrations/migrate-role-config-v4.mjs +614 -614
- package/kits/migrations/migrate-role-config-v5.mjs +365 -365
- package/kits/migrations/rename-config-file.mjs +99 -99
- package/kits/rules/01-overview.md +166 -162
- package/kits/rules/02-navigation.md +96 -96
- package/kits/rules/03-identity.md +36 -36
- package/kits/rules/04-relation.md +76 -75
- package/kits/rules/05-venue.md +60 -60
- package/kits/rules/06-channel.md +65 -63
- package/kits/schemas/_meta.json +53 -53
- package/kits/schemas/agent-config.schema.1.json +177 -177
- package/kits/schemas/agent-config.schema.10.json +395 -395
- package/kits/schemas/agent-config.schema.11.json +421 -421
- package/kits/schemas/agent-config.schema.12.json +451 -427
- package/kits/schemas/agent-config.schema.2.json +239 -239
- package/kits/schemas/agent-config.schema.3.json +119 -119
- package/kits/schemas/agent-config.schema.4.json +208 -208
- package/kits/schemas/agent-config.schema.5.json +326 -326
- package/kits/schemas/agent-config.schema.6.json +322 -322
- package/kits/schemas/agent-config.schema.7.json +303 -303
- package/kits/schemas/agent-config.schema.8.json +304 -304
- package/kits/schemas/agent-config.schema.9.json +364 -364
- package/kits/schemas/contact-book.schema.1.json +36 -36
- package/kits/schemas/contact-book.schema.2.json +43 -43
- package/kits/schemas/contact-book.schema.3.json +67 -67
- package/kits/schemas/daemon.schema.1.json +91 -91
- package/kits/schemas/daemon.schema.2.json +101 -101
- package/kits/schemas/daemon.schema.3.json +123 -123
- package/kits/schemas/daemon.schema.4.json +136 -136
- package/kits/schemas/daemon.schema.5.json +135 -135
- package/kits/schemas/daemon.schema.6.json +131 -131
- package/kits/schemas/defaults.schema.1.json +81 -81
- package/kits/schemas/defaults.schema.2.json +85 -85
- package/kits/schemas/defaults.schema.3.json +73 -73
- package/kits/schemas/defaults.schema.4.json +107 -107
- package/kits/schemas/defaults.schema.5.json +119 -119
- package/kits/schemas/menu-exec-schema-commands.md +208 -208
- package/kits/schemas/migrations/README.md +30 -30
- package/kits/schemas/relation-config.schema.1.json +158 -158
- package/kits/schemas/relation-config.schema.2.json +73 -73
- package/kits/schemas/relation-config.schema.3.json +50 -50
- package/kits/schemas/relation-config.schema.4.json +47 -47
- package/kits/schemas/relation-config.schema.5.json +47 -47
- package/kits/schemas/relation-config.schema.6.json +46 -46
- package/kits/schemas/relation-config.schema.7.json +59 -59
- package/kits/schemas/relation-config.schema.8.json +103 -103
- package/kits/schemas/role-config.schema.1.json +215 -201
- package/kits/schemas/role-registry.schema.1.json +35 -35
- package/kits/schemas/single-session.schema.1.json +31 -31
- package/kits/schemas/single-session.schema.2.json +57 -57
- package/kits/schemas/single-session.schema.3.json +32 -32
- package/kits/templates/bootstrap-welcome.md +17 -17
- package/kits/templates/message-fragments/handoff-context-to-target.md +9 -9
- package/kits/templates/message-fragments/handoff-request-to-target.md +19 -19
- package/kits/templates/message-fragments/handoff-response-to-origin.md +9 -9
- package/kits/templates/message-fragments/inject-default.md +2 -2
- package/kits/templates/message-fragments/item.md +2 -2
- package/kits/templates/roles/admin.json +92 -92
- package/kits/templates/roles/member.json +101 -96
- package/kits/templates/roles/owner.json +9 -9
- package/kits/templates/roles/visitor.json +90 -85
- package/kits/templates/system-fragments/baseagent.md +14 -14
- package/kits/templates/system-fragments/bootstrap.md +53 -34
- package/kits/templates/system-fragments/channel.md +28 -64
- package/kits/templates/system-fragments/commands.md +36 -28
- package/kits/templates/system-fragments/group-unread-history.md +7 -0
- package/kits/templates/system-fragments/identity.md +13 -13
- package/kits/templates/system-fragments/relation.md +19 -19
- package/kits/templates/system-fragments/reply.md +56 -0
- package/kits/templates/system-fragments/session.md +59 -59
- package/kits/templates/system-fragments/venue.md +31 -31
- package/package.json +104 -98
- package/dist/aun/group-identity.js +0 -9
- /package/dist/aun/{group-fs-download.js → group/fs-download.js} +0 -0
- /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
|
+
}
|
package/dist/agents/baseagent.js
CHANGED
|
@@ -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
|
-
|
|
206
|
+
authJsonApiKey = nonEmptyString(auth?.OPENAI_API_KEY);
|
|
197
207
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
const
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
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
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
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
|
|
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,
|