@0xmaxma/claude-gateway 2.0.6 → 2.0.7
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/README.md +14 -1
- package/dist/agent/builtin-commands.js +5 -5
- package/dist/agent/builtin-commands.js.map +1 -1
- package/dist/agent/command-help.d.ts +9 -0
- package/dist/agent/command-help.d.ts.map +1 -0
- package/dist/agent/command-help.js +50 -0
- package/dist/agent/command-help.js.map +1 -0
- package/dist/agent/dreaming/index.d.ts +6 -3
- package/dist/agent/dreaming/index.d.ts.map +1 -1
- package/dist/agent/dreaming/index.js +21 -1
- package/dist/agent/dreaming/index.js.map +1 -1
- package/dist/agent/knowledge/reflection.d.ts +7 -4
- package/dist/agent/knowledge/reflection.d.ts.map +1 -1
- package/dist/agent/knowledge/reflection.js +19 -1
- package/dist/agent/knowledge/reflection.js.map +1 -1
- package/dist/agent/runner.d.ts +37 -3
- package/dist/agent/runner.d.ts.map +1 -1
- package/dist/agent/runner.js +164 -47
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/session-confirmations.d.ts +12 -0
- package/dist/agent/session-confirmations.d.ts.map +1 -0
- package/dist/agent/session-confirmations.js +43 -0
- package/dist/agent/session-confirmations.js.map +1 -0
- package/dist/agent/session-status.d.ts +7 -0
- package/dist/agent/session-status.d.ts.map +1 -0
- package/dist/agent/session-status.js +16 -0
- package/dist/agent/session-status.js.map +1 -0
- package/dist/agent/skill-learning/index.d.ts +5 -1
- package/dist/agent/skill-learning/index.d.ts.map +1 -1
- package/dist/agent/skill-learning/index.js +23 -1
- package/dist/agent/skill-learning/index.js.map +1 -1
- package/dist/agent/skill-learning/notifier.d.ts +2 -1
- package/dist/agent/skill-learning/notifier.d.ts.map +1 -1
- package/dist/agent/skill-learning/notifier.js +1 -0
- package/dist/agent/skill-learning/notifier.js.map +1 -1
- package/dist/api/apps-router.d.ts.map +1 -1
- package/dist/api/apps-router.js +1 -3
- package/dist/api/apps-router.js.map +1 -1
- package/dist/api/cron-router.d.ts +1 -1
- package/dist/api/cron-router.d.ts.map +1 -1
- package/dist/api/cron-router.js +4 -4
- package/dist/api/cron-router.js.map +1 -1
- package/dist/api/dashboard-processes.d.ts +86 -0
- package/dist/api/dashboard-processes.d.ts.map +1 -0
- package/dist/api/dashboard-processes.js +155 -0
- package/dist/api/dashboard-processes.js.map +1 -0
- package/dist/api/dashboard-sessions.d.ts +15 -0
- package/dist/api/dashboard-sessions.d.ts.map +1 -0
- package/dist/api/dashboard-sessions.js +66 -0
- package/dist/api/dashboard-sessions.js.map +1 -0
- package/dist/api/gateway-router.d.ts +3 -4
- package/dist/api/gateway-router.d.ts.map +1 -1
- package/dist/api/gateway-router.js +77 -56
- package/dist/api/gateway-router.js.map +1 -1
- package/dist/api/oauth-connectors-router.d.ts +1 -1
- package/dist/api/oauth-connectors-router.d.ts.map +1 -1
- package/dist/api/oauth-connectors-router.js +11 -21
- package/dist/api/oauth-connectors-router.js.map +1 -1
- package/dist/api/router.d.ts +1 -1
- package/dist/api/router.d.ts.map +1 -1
- package/dist/api/router.js +3 -9
- package/dist/api/router.js.map +1 -1
- package/dist/api/share-router.d.ts +1 -1
- package/dist/api/share-router.d.ts.map +1 -1
- package/dist/api/share-router.js +1 -1
- package/dist/api/share-router.js.map +1 -1
- package/dist/api/slack-webhook-router.js +1 -1
- package/dist/api/slack-webhook-router.js.map +1 -1
- package/dist/api/voice-router.d.ts +1 -0
- package/dist/api/voice-router.d.ts.map +1 -1
- package/dist/api/voice-router.js +7 -0
- package/dist/api/voice-router.js.map +1 -1
- package/dist/apps/agent-container-migration.d.ts +2 -0
- package/dist/apps/agent-container-migration.d.ts.map +1 -1
- package/dist/apps/agent-container-migration.js +59 -2
- package/dist/apps/agent-container-migration.js.map +1 -1
- package/dist/apps/agent-manager.d.ts +4 -2
- package/dist/apps/agent-manager.d.ts.map +1 -1
- package/dist/apps/agent-manager.js +39 -3
- package/dist/apps/agent-manager.js.map +1 -1
- package/dist/apps/installer.d.ts +4 -3
- package/dist/apps/installer.d.ts.map +1 -1
- package/dist/apps/installer.js +8 -4
- package/dist/apps/installer.js.map +1 -1
- package/dist/build-provenance.json +8 -0
- package/dist/cli/args.js +1 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/commands/app.d.ts.map +1 -1
- package/dist/cli/commands/app.js +39 -3
- package/dist/cli/commands/app.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +6 -2
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/safemode.d.ts +2 -0
- package/dist/cli/commands/safemode.d.ts.map +1 -0
- package/dist/cli/commands/safemode.js +279 -0
- package/dist/cli/commands/safemode.js.map +1 -0
- package/dist/cli/dependencies.d.ts +2 -0
- package/dist/cli/dependencies.d.ts.map +1 -1
- package/dist/cli/dependencies.js +81 -0
- package/dist/cli/dependencies.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +11 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/manager.d.ts.map +1 -1
- package/dist/cli/manager.js +4 -1
- package/dist/cli/manager.js.map +1 -1
- package/dist/config/agent-lifecycle.d.ts +26 -0
- package/dist/config/agent-lifecycle.d.ts.map +1 -0
- package/dist/config/agent-lifecycle.js +63 -0
- package/dist/config/agent-lifecycle.js.map +1 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +11 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/reload-policy.d.ts +9 -0
- package/dist/config/reload-policy.d.ts.map +1 -0
- package/dist/config/reload-policy.js +62 -0
- package/dist/config/reload-policy.js.map +1 -0
- package/dist/config/watcher.d.ts +3 -2
- package/dist/config/watcher.d.ts.map +1 -1
- package/dist/config/watcher.js +34 -51
- package/dist/config/watcher.js.map +1 -1
- package/dist/cron/tool-schemas.d.ts +296 -0
- package/dist/cron/tool-schemas.d.ts.map +1 -0
- package/dist/cron/tool-schemas.js +122 -0
- package/dist/cron/tool-schemas.js.map +1 -0
- package/dist/index.js +141 -158
- package/dist/index.js.map +1 -1
- package/dist/orchestration/agent-tool-schemas.js +4 -4
- package/dist/orchestration/agent-tool-schemas.js.map +1 -1
- package/dist/orchestration/background-work.d.ts +9 -0
- package/dist/orchestration/background-work.d.ts.map +1 -0
- package/dist/orchestration/background-work.js +49 -0
- package/dist/orchestration/background-work.js.map +1 -0
- package/dist/orchestration/bridge.d.ts +6 -15
- package/dist/orchestration/bridge.d.ts.map +1 -1
- package/dist/orchestration/bridge.js +67 -32
- package/dist/orchestration/bridge.js.map +1 -1
- package/dist/orchestration/capabilities.d.ts.map +1 -1
- package/dist/orchestration/capabilities.js +18 -10
- package/dist/orchestration/capabilities.js.map +1 -1
- package/dist/orchestration/capacity.d.ts +3 -2
- package/dist/orchestration/capacity.d.ts.map +1 -1
- package/dist/orchestration/capacity.js +7 -0
- package/dist/orchestration/capacity.js.map +1 -1
- package/dist/orchestration/channel-controls.d.ts.map +1 -1
- package/dist/orchestration/channel-controls.js +3 -2
- package/dist/orchestration/channel-controls.js.map +1 -1
- package/dist/orchestration/cli-skills.d.ts +5 -0
- package/dist/orchestration/cli-skills.d.ts.map +1 -1
- package/dist/orchestration/container-tool-schemas.d.ts +37 -0
- package/dist/orchestration/container-tool-schemas.d.ts.map +1 -0
- package/dist/orchestration/container-tool-schemas.js +27 -0
- package/dist/orchestration/container-tool-schemas.js.map +1 -0
- package/dist/orchestration/container.d.ts.map +1 -1
- package/dist/orchestration/container.js +7 -0
- package/dist/orchestration/container.js.map +1 -1
- package/dist/orchestration/dashboard-reader-worker.js +7 -7
- package/dist/orchestration/dashboard-reader-worker.js.map +1 -1
- package/dist/orchestration/decision-context.js +1 -1
- package/dist/orchestration/decision-context.js.map +1 -1
- package/dist/orchestration/gateway-tasks/controller.d.ts +29 -0
- package/dist/orchestration/gateway-tasks/controller.d.ts.map +1 -0
- package/dist/orchestration/gateway-tasks/controller.js +139 -0
- package/dist/orchestration/gateway-tasks/controller.js.map +1 -0
- package/dist/orchestration/gateway-tasks/safemode.d.ts +19 -0
- package/dist/orchestration/gateway-tasks/safemode.d.ts.map +1 -0
- package/dist/orchestration/gateway-tasks/safemode.js +128 -0
- package/dist/orchestration/gateway-tasks/safemode.js.map +1 -0
- package/dist/orchestration/process-turn.d.ts +11 -2
- package/dist/orchestration/process-turn.d.ts.map +1 -1
- package/dist/orchestration/process-turn.js +47 -7
- package/dist/orchestration/process-turn.js.map +1 -1
- package/dist/orchestration/recovery.d.ts.map +1 -1
- package/dist/orchestration/recovery.js +4 -2
- package/dist/orchestration/recovery.js.map +1 -1
- package/dist/orchestration/runtime.d.ts +10 -0
- package/dist/orchestration/runtime.d.ts.map +1 -1
- package/dist/orchestration/runtime.js +31 -4
- package/dist/orchestration/runtime.js.map +1 -1
- package/dist/orchestration/skills.d.ts +2 -0
- package/dist/orchestration/skills.d.ts.map +1 -1
- package/dist/orchestration/skills.js +4 -3
- package/dist/orchestration/skills.js.map +1 -1
- package/dist/orchestration/task-controls.d.ts +12 -0
- package/dist/orchestration/task-controls.d.ts.map +1 -1
- package/dist/orchestration/task-controls.js +3 -1
- package/dist/orchestration/task-controls.js.map +1 -1
- package/dist/orchestration/tasks/driver.d.ts.map +1 -1
- package/dist/orchestration/tasks/driver.js +99 -12
- package/dist/orchestration/tasks/driver.js.map +1 -1
- package/dist/orchestration/tasks/pool.d.ts +2 -0
- package/dist/orchestration/tasks/pool.d.ts.map +1 -1
- package/dist/orchestration/tasks/pool.js +4 -0
- package/dist/orchestration/tasks/pool.js.map +1 -1
- package/dist/orchestration/tasks/scheduler.d.ts.map +1 -1
- package/dist/orchestration/tasks/scheduler.js +4 -0
- package/dist/orchestration/tasks/scheduler.js.map +1 -1
- package/dist/orchestration/tasks/service.d.ts +4 -0
- package/dist/orchestration/tasks/service.d.ts.map +1 -1
- package/dist/orchestration/tasks/service.js +38 -8
- package/dist/orchestration/tasks/service.js.map +1 -1
- package/dist/orchestration/token-ledger.d.ts +1 -0
- package/dist/orchestration/token-ledger.d.ts.map +1 -1
- package/dist/orchestration/token-ledger.js +6 -2
- package/dist/orchestration/token-ledger.js.map +1 -1
- package/dist/orchestration/token-usage.d.ts +3 -0
- package/dist/orchestration/token-usage.d.ts.map +1 -1
- package/dist/orchestration/token-usage.js +12 -3
- package/dist/orchestration/token-usage.js.map +1 -1
- package/dist/orchestration/types.d.ts +19 -1
- package/dist/orchestration/types.d.ts.map +1 -1
- package/dist/orchestration/types.js.map +1 -1
- package/dist/orchestration/worker-crons.d.ts +5 -0
- package/dist/orchestration/worker-crons.d.ts.map +1 -0
- package/dist/orchestration/worker-crons.js +84 -0
- package/dist/orchestration/worker-crons.js.map +1 -0
- package/dist/orchestration/worker-harness.d.ts +15 -0
- package/dist/orchestration/worker-harness.d.ts.map +1 -0
- package/dist/orchestration/worker-harness.js +72 -0
- package/dist/orchestration/worker-harness.js.map +1 -0
- package/dist/safemode/config.d.ts +7 -0
- package/dist/safemode/config.d.ts.map +1 -0
- package/dist/safemode/config.js +67 -0
- package/dist/safemode/config.js.map +1 -0
- package/dist/safemode/context.d.ts +7 -0
- package/dist/safemode/context.d.ts.map +1 -0
- package/dist/safemode/context.js +397 -0
- package/dist/safemode/context.js.map +1 -0
- package/dist/safemode/external-owners.d.ts +19 -0
- package/dist/safemode/external-owners.d.ts.map +1 -0
- package/dist/safemode/external-owners.js +229 -0
- package/dist/safemode/external-owners.js.map +1 -0
- package/dist/safemode/native.d.ts +38 -0
- package/dist/safemode/native.d.ts.map +1 -0
- package/dist/safemode/native.js +220 -0
- package/dist/safemode/native.js.map +1 -0
- package/dist/safemode/params.d.ts +10 -0
- package/dist/safemode/params.d.ts.map +1 -0
- package/dist/safemode/params.js +86 -0
- package/dist/safemode/params.js.map +1 -0
- package/dist/safemode/provenance.d.ts +45 -0
- package/dist/safemode/provenance.d.ts.map +1 -0
- package/dist/safemode/provenance.js +153 -0
- package/dist/safemode/provenance.js.map +1 -0
- package/dist/safemode/runner.d.ts +17 -0
- package/dist/safemode/runner.d.ts.map +1 -0
- package/dist/safemode/runner.js +398 -0
- package/dist/safemode/runner.js.map +1 -0
- package/dist/safemode/store.d.ts +56 -0
- package/dist/safemode/store.d.ts.map +1 -0
- package/dist/safemode/store.js +451 -0
- package/dist/safemode/store.js.map +1 -0
- package/dist/session/codex-auth.d.ts +37 -0
- package/dist/session/codex-auth.d.ts.map +1 -0
- package/dist/session/codex-auth.js +266 -0
- package/dist/session/codex-auth.js.map +1 -0
- package/dist/session/codex-container-runtime.d.ts +15 -0
- package/dist/session/codex-container-runtime.d.ts.map +1 -0
- package/dist/session/codex-container-runtime.js +85 -0
- package/dist/session/codex-container-runtime.js.map +1 -0
- package/dist/session/codex-context-defaults.json +5 -0
- package/dist/session/codex-context.d.ts +13 -0
- package/dist/session/codex-context.d.ts.map +1 -0
- package/dist/session/codex-context.js +27 -0
- package/dist/session/codex-context.js.map +1 -0
- package/dist/session/codex-extension-discovery.d.ts +21 -0
- package/dist/session/codex-extension-discovery.d.ts.map +1 -0
- package/dist/session/codex-extension-discovery.js +132 -0
- package/dist/session/codex-extension-discovery.js.map +1 -0
- package/dist/session/codex-native-mcp-client.d.ts +37 -0
- package/dist/session/codex-native-mcp-client.d.ts.map +1 -0
- package/dist/session/codex-native-mcp-client.js +164 -0
- package/dist/session/codex-native-mcp-client.js.map +1 -0
- package/dist/session/codex-policy.d.ts +6 -0
- package/dist/session/codex-policy.d.ts.map +1 -0
- package/dist/session/codex-policy.js +17 -0
- package/dist/session/codex-policy.js.map +1 -0
- package/dist/session/codex-process.d.ts +114 -0
- package/dist/session/codex-process.d.ts.map +1 -0
- package/dist/session/codex-process.js +759 -0
- package/dist/session/codex-process.js.map +1 -0
- package/dist/session/codex-runtime.d.ts +20 -0
- package/dist/session/codex-runtime.d.ts.map +1 -0
- package/dist/session/codex-runtime.js +182 -0
- package/dist/session/codex-runtime.js.map +1 -0
- package/dist/session/codex-tool-capture.d.ts +35 -0
- package/dist/session/codex-tool-capture.d.ts.map +1 -0
- package/dist/session/codex-tool-capture.js +178 -0
- package/dist/session/codex-tool-capture.js.map +1 -0
- package/dist/session/container-connectors.d.ts +10 -0
- package/dist/session/container-connectors.d.ts.map +1 -0
- package/dist/session/container-connectors.js +41 -0
- package/dist/session/container-connectors.js.map +1 -0
- package/dist/session/container-extensions.d.ts +4 -0
- package/dist/session/container-extensions.d.ts.map +1 -0
- package/dist/session/container-extensions.js +45 -0
- package/dist/session/container-extensions.js.map +1 -0
- package/dist/session/managed-connectors.d.ts +16 -0
- package/dist/session/managed-connectors.d.ts.map +1 -0
- package/dist/session/managed-connectors.js +25 -0
- package/dist/session/managed-connectors.js.map +1 -0
- package/dist/session/process-diagnostics.d.ts +14 -0
- package/dist/session/process-diagnostics.d.ts.map +1 -0
- package/dist/session/process-diagnostics.js +39 -0
- package/dist/session/process-diagnostics.js.map +1 -0
- package/dist/session/process.d.ts +4 -0
- package/dist/session/process.d.ts.map +1 -1
- package/dist/session/process.js +21 -16
- package/dist/session/process.js.map +1 -1
- package/dist/session/request-tool-capture.d.ts +1 -1
- package/dist/session/request-tool-capture.d.ts.map +1 -1
- package/dist/session/runtime-profile.d.ts +8 -0
- package/dist/session/runtime-profile.d.ts.map +1 -1
- package/dist/session/runtime-profile.js +3 -2
- package/dist/session/runtime-profile.js.map +1 -1
- package/dist/session/worker-environment.d.ts +5 -0
- package/dist/session/worker-environment.d.ts.map +1 -0
- package/dist/session/worker-environment.js +27 -0
- package/dist/session/worker-environment.js.map +1 -0
- package/dist/session/worker-extensions.d.ts +20 -0
- package/dist/session/worker-extensions.d.ts.map +1 -0
- package/dist/session/worker-extensions.js +322 -0
- package/dist/session/worker-extensions.js.map +1 -0
- package/dist/skills/loader.d.ts +2 -0
- package/dist/skills/loader.d.ts.map +1 -1
- package/dist/skills/loader.js.map +1 -1
- package/dist/types.d.ts +30 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/codex-context.d.ts +4 -0
- package/dist/ui/codex-context.d.ts.map +1 -0
- package/dist/ui/codex-context.js +15 -0
- package/dist/ui/codex-context.js.map +1 -0
- package/dist/ui/dashboard-client.d.ts.map +1 -1
- package/dist/ui/dashboard-client.js +14 -11
- package/dist/ui/dashboard-client.js.map +1 -1
- package/dist/ui/dashboard-presentation.d.ts +1 -1
- package/dist/ui/dashboard-presentation.d.ts.map +1 -1
- package/dist/ui/dashboard-presentation.js +2 -2
- package/dist/ui/dashboard-presentation.js.map +1 -1
- package/dist/ui/token-report.d.ts +3 -0
- package/dist/ui/token-report.d.ts.map +1 -1
- package/dist/ui/token-report.js +22 -10
- package/dist/ui/token-report.js.map +1 -1
- package/dist/ui/web-ui.d.ts.map +1 -1
- package/dist/ui/web-ui.js +53 -132
- package/dist/ui/web-ui.js.map +1 -1
- package/mcp/capability-catalog.ts +2 -0
- package/mcp/extension-catalog.ts +18 -0
- package/mcp/lazy-connector.ts +4 -2
- package/mcp/lazy-tools.test.ts +29 -0
- package/mcp/modules.ts +1 -0
- package/mcp/server.ts +2 -2
- package/mcp/tools/cron/module.ts +8 -114
- package/mcp/tools/discord/commands.ts +4 -1
- package/mcp/tools/safemode/module.test.ts +29 -0
- package/mcp/tools/telegram/receiver-server.ts +2 -22
- package/mcp/tools/telegram/task-detail.ts +2 -1
- package/package.json +3 -2
- package/scripts/orchestration/audit-codex-context.cjs +83 -0
- package/scripts/orchestration/benchmark-worker-harnesses.cjs +112 -0
- package/scripts/orchestration/smoke-codex-extensions.ts +29 -0
- package/scripts/orchestration/smoke-codex-worker.cjs +166 -0
- package/scripts/orchestration/smoke-safemode-codex.cjs +66 -0
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CodexReadinessError = void 0;
|
|
4
|
+
exports.inspectCodexAccount = inspectCodexAccount;
|
|
5
|
+
exports.resolveCodexCredentials = resolveCodexCredentials;
|
|
6
|
+
exports.codexSafemodeEnvironment = codexSafemodeEnvironment;
|
|
7
|
+
const codex_policy_1 = require("./codex-policy");
|
|
8
|
+
const child_process_1 = require("child_process");
|
|
9
|
+
const promises_1 = require("fs/promises");
|
|
10
|
+
const smol_toml_1 = require("smol-toml");
|
|
11
|
+
const path_1 = require("path");
|
|
12
|
+
const os_1 = require("os");
|
|
13
|
+
const crypto_1 = require("crypto");
|
|
14
|
+
class CodexReadinessError extends Error {
|
|
15
|
+
constructor(code, message) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.code = code;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.CodexReadinessError = CodexReadinessError;
|
|
21
|
+
const unavailable = (code, message) => { throw new CodexReadinessError(code, message); };
|
|
22
|
+
/** Native config/account discovery only: no thread, tool server or model request. */
|
|
23
|
+
function inspectCodexAccount(bin, env = process.env, exportToken = false, refreshToken = false) {
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
const child = (0, child_process_1.spawn)(bin, [...(0, codex_policy_1.codexPolicyArgs)(), 'app-server', '--listen', 'stdio://'], {
|
|
26
|
+
cwd: env.HOME || (0, os_1.homedir)(), env, stdio: 'pipe',
|
|
27
|
+
});
|
|
28
|
+
let buffer = '', config, accountResult, settled = false;
|
|
29
|
+
const finish = (error, account, auth) => {
|
|
30
|
+
if (settled)
|
|
31
|
+
return;
|
|
32
|
+
settled = true;
|
|
33
|
+
clearTimeout(timer);
|
|
34
|
+
child.stdin.destroy();
|
|
35
|
+
child.stdout.destroy();
|
|
36
|
+
child.stderr.destroy();
|
|
37
|
+
child.kill('SIGTERM');
|
|
38
|
+
const kill = setTimeout(() => { child.kill('SIGKILL'); child.unref(); }, 1000);
|
|
39
|
+
kill.unref();
|
|
40
|
+
child.once('close', () => clearTimeout(kill));
|
|
41
|
+
if (error)
|
|
42
|
+
reject(error);
|
|
43
|
+
else
|
|
44
|
+
resolve({ config, account, ...(auth ? { auth } : {}) });
|
|
45
|
+
};
|
|
46
|
+
const timer = setTimeout(() => finish(new CodexReadinessError('CODEX_PROBE_TIMEOUT', 'Codex native configuration/auth check timed out. Check Codex under the gateway service user.')), refreshToken ? 8500 : 10000);
|
|
47
|
+
const send = (id, method, params) => child.stdin.write(JSON.stringify({ id, method, params }) + '\n');
|
|
48
|
+
child.on('error', () => finish(new CodexReadinessError('CODEX_UNAVAILABLE', 'Codex cannot start. Install it separately and check the gateway service PATH.')));
|
|
49
|
+
child.on('close', () => finish(new CodexReadinessError('CODEX_CONFIG_UNAVAILABLE', 'Codex could not read its native configuration. Run codex login status as the gateway service user.')));
|
|
50
|
+
child.stdin.on('error', () => finish(new CodexReadinessError('CODEX_CONFIG_UNAVAILABLE', 'Codex configuration probe closed unexpectedly.')));
|
|
51
|
+
child.stderr.resume(); // Native diagnostics may contain account/credential information.
|
|
52
|
+
child.stdout.setEncoding('utf8');
|
|
53
|
+
child.stdout.on('data', (chunk) => {
|
|
54
|
+
buffer += chunk;
|
|
55
|
+
if (buffer.length > 2 * 1024 * 1024)
|
|
56
|
+
return finish(new CodexReadinessError('CODEX_CONFIG_UNAVAILABLE', 'Codex configuration exceeded the inspection limit.'));
|
|
57
|
+
let newline;
|
|
58
|
+
while ((newline = buffer.indexOf('\n')) >= 0) {
|
|
59
|
+
const line = buffer.slice(0, newline);
|
|
60
|
+
buffer = buffer.slice(newline + 1);
|
|
61
|
+
let event;
|
|
62
|
+
try {
|
|
63
|
+
event = JSON.parse(line);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (event.error)
|
|
69
|
+
return finish(new CodexReadinessError('CODEX_CONFIG_UNAVAILABLE', 'Codex rejected the native configuration/auth probe. Update Codex or check its native configuration.'));
|
|
70
|
+
if (event.id === 1) {
|
|
71
|
+
child.stdin.write(JSON.stringify({ method: 'initialized', params: {} }) + '\n');
|
|
72
|
+
send(2, 'config/read', { includeLayers: false });
|
|
73
|
+
}
|
|
74
|
+
else if (event.id === 2) {
|
|
75
|
+
config = event.result?.config;
|
|
76
|
+
if (!config)
|
|
77
|
+
return finish(new CodexReadinessError('CODEX_CONFIG_UNAVAILABLE', 'Codex omitted effective configuration.'));
|
|
78
|
+
send(3, 'account/read', { refreshToken: false });
|
|
79
|
+
}
|
|
80
|
+
else if (event.id === 3) {
|
|
81
|
+
accountResult = event.result;
|
|
82
|
+
if (exportToken)
|
|
83
|
+
send(4, 'getAuthStatus', { includeToken: true, refreshToken });
|
|
84
|
+
else
|
|
85
|
+
finish(undefined, accountResult);
|
|
86
|
+
}
|
|
87
|
+
else if (event.id === 4)
|
|
88
|
+
finish(undefined, accountResult, event.result);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
send(1, 'initialize', { clientInfo: { name: 'gateway_readiness', version: '1.0.0' } });
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
function credentials(baseUrl, key, allowDockerHost = false) {
|
|
95
|
+
let url;
|
|
96
|
+
try {
|
|
97
|
+
url = new URL(baseUrl);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return unavailable('CODEX_PROVIDER_INVALID', 'Codex Responses provider URL is invalid.');
|
|
101
|
+
}
|
|
102
|
+
if (url.username || url.password || url.search || url.hash ||
|
|
103
|
+
!(url.protocol === 'https:' || url.protocol === 'http:' && ['localhost', '127.0.0.1', '[::1]', ...(allowDockerHost ? ['host.docker.internal'] : [])].includes(url.hostname))) {
|
|
104
|
+
return unavailable('CODEX_PROVIDER_INVALID', 'Codex requires an HTTPS Responses provider (local HTTP is allowed).');
|
|
105
|
+
}
|
|
106
|
+
if (typeof key !== 'string' || !key.trim() || /[\r\n\0]/.test(key))
|
|
107
|
+
return unavailable('CODEX_AUTH_REQUIRED', 'Codex has no usable native API key. Run codex login under the gateway service user, or use Claude workers.');
|
|
108
|
+
return { baseUrl, key, fingerprint: (0, crypto_1.createHash)('sha256').update(JSON.stringify([baseUrl, key])).digest('hex') };
|
|
109
|
+
}
|
|
110
|
+
// Coalesce concurrent native probes/refreshes. The CLI owns native refresh/storage;
|
|
111
|
+
// the gateway retains no refresh token and does not write the user's auth files.
|
|
112
|
+
const nativeProbes = new Map();
|
|
113
|
+
function nativeCredentials(bin, env, refresh) {
|
|
114
|
+
const key = (0, crypto_1.createHash)('sha256').update(JSON.stringify([bin, Object.entries(env).sort(), refresh])).digest('hex');
|
|
115
|
+
const existing = nativeProbes.get(key);
|
|
116
|
+
if (existing)
|
|
117
|
+
return existing;
|
|
118
|
+
const pending = inspectCodexAccount(bin, env, true, refresh).finally(() => nativeProbes.delete(key));
|
|
119
|
+
nativeProbes.set(key, pending);
|
|
120
|
+
return pending;
|
|
121
|
+
}
|
|
122
|
+
/** Resolve only the selected native provider. Never inspect Claude credentials. */
|
|
123
|
+
async function resolveCodexCredentials(options) {
|
|
124
|
+
const env = options.env ?? process.env;
|
|
125
|
+
// Existing explicit worker overrides remain explicit, not silently replaced by native login.
|
|
126
|
+
if (options.baseUrl !== undefined || options.apiKeyEnv !== undefined) {
|
|
127
|
+
const name = options.apiKeyEnv ?? 'OPENAI_API_KEY';
|
|
128
|
+
if (!/^[A-Z_][A-Z0-9_]*$/.test(name) || /^(ANTHROPIC_|CLAUDE_)/.test(name))
|
|
129
|
+
return unavailable('CODEX_PROVIDER_INVALID', 'Codex requires its own API-key environment variable.');
|
|
130
|
+
return credentials(options.baseUrl ?? 'https://api.openai.com/v1', env[name], options.allowDockerHost);
|
|
131
|
+
}
|
|
132
|
+
const { config, account, auth } = await nativeCredentials(options.bin, env, options.refreshToken ?? false);
|
|
133
|
+
const id = config.model_provider ?? 'openai';
|
|
134
|
+
const provider = config.model_providers?.[id] ?? (id === 'openai' ? { requires_openai_auth: true } : undefined);
|
|
135
|
+
if (!provider || provider.wire_api && provider.wire_api !== 'responses' || provider.auth ||
|
|
136
|
+
Object.keys(provider.http_headers ?? {}).length || Object.keys(provider.env_http_headers ?? {}).length || Object.keys(provider.query_params ?? {}).length || provider.experimental_bearer_token) {
|
|
137
|
+
return unavailable('CODEX_PROVIDER_UNSUPPORTED', 'This native Codex provider needs settings that isolated workers cannot safely transfer. Use native Codex safemode or Claude workers.');
|
|
138
|
+
}
|
|
139
|
+
const base = provider.base_url ?? (id === 'openai' ? env.OPENAI_BASE_URL || 'https://api.openai.com/v1' : '');
|
|
140
|
+
if (!provider.requires_openai_auth && provider.env_key)
|
|
141
|
+
return credentials(base, env[provider.env_key], options.allowDockerHost);
|
|
142
|
+
if (account?.account?.type === 'chatgpt' || auth?.authMethod === 'chatgpt' || auth?.authMethod === 'chatgptAuthTokens') {
|
|
143
|
+
// Native account export handles file/keyring/auto storage. Never copy auth.json,
|
|
144
|
+
// refresh tokens, or the native home into a worker (especially a container).
|
|
145
|
+
if (id !== 'openai' || provider.base_url || env.OPENAI_BASE_URL)
|
|
146
|
+
return unavailable('CODEX_PROVIDER_UNSUPPORTED', 'ChatGPT workers require the native OpenAI provider endpoint. Remove a conflicting native endpoint override.');
|
|
147
|
+
let claims;
|
|
148
|
+
try {
|
|
149
|
+
claims = JSON.parse(Buffer.from(auth.authToken.split('.')[1], 'base64url').toString('utf8'));
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return unavailable('CODEX_AUTH_REQUIRED', 'Codex could not export a usable ChatGPT access token. Run codex login as the gateway service user.');
|
|
153
|
+
}
|
|
154
|
+
const identity = claims?.['https://api.openai.com/auth'];
|
|
155
|
+
const accountId = identity?.chatgpt_account_id;
|
|
156
|
+
if (typeof accountId !== 'string' || !accountId || typeof claims.sub !== 'string' || !claims.sub || typeof auth.authToken !== 'string' || /[\r\n\0]/.test(auth.authToken))
|
|
157
|
+
return unavailable('CODEX_AUTH_REQUIRED', 'Codex ChatGPT authentication is missing its account identity. Run codex login again.');
|
|
158
|
+
return { baseUrl: 'https://chatgpt.com/backend-api/codex', key: '',
|
|
159
|
+
fingerprint: (0, crypto_1.createHash)('sha256').update(JSON.stringify(['chatgpt', accountId, claims.sub])).digest('hex'),
|
|
160
|
+
chatgpt: { accessToken: auth.authToken, chatgptAccountId: accountId,
|
|
161
|
+
...(typeof identity.chatgpt_plan_type === 'string' ? { chatgptPlanType: identity.chatgpt_plan_type } : {}) } };
|
|
162
|
+
}
|
|
163
|
+
if (auth?.authMethod && !['apikey', 'apiKey'].includes(auth.authMethod))
|
|
164
|
+
return unavailable('CODEX_PROVIDER_UNSUPPORTED', 'The installed Codex cannot export this native authentication mode to an isolated worker. Update Codex or use the Claude Code harness.');
|
|
165
|
+
return credentials(base, auth?.authToken, options.allowDockerHost);
|
|
166
|
+
}
|
|
167
|
+
/** Overlay native config data without inheriting object prototypes. */
|
|
168
|
+
function overlayConfig(base, next) {
|
|
169
|
+
const result = Object.assign(Object.create(null), base);
|
|
170
|
+
for (const [name, value] of Object.entries(next ?? {})) {
|
|
171
|
+
if (['__proto__', 'prototype', 'constructor'].includes(name))
|
|
172
|
+
continue;
|
|
173
|
+
result[name] = value && typeof value === 'object' && !Array.isArray(value)
|
|
174
|
+
? overlayConfig(result[name], value) : value;
|
|
175
|
+
}
|
|
176
|
+
return result;
|
|
177
|
+
}
|
|
178
|
+
/** Select auth using the same profile then CLI-override precedence as native Codex.
|
|
179
|
+
* Only configuration is read; interactive permission flags are never used by the probe. */
|
|
180
|
+
async function safemodeProviderConfig(config, args, source) {
|
|
181
|
+
let profile;
|
|
182
|
+
const overrides = [];
|
|
183
|
+
for (let i = 0; i < args.length; i++) {
|
|
184
|
+
const arg = args[i];
|
|
185
|
+
if (arg === '--')
|
|
186
|
+
break;
|
|
187
|
+
if (arg === '-p' || arg === '--profile')
|
|
188
|
+
profile = args[++i];
|
|
189
|
+
else if (arg.startsWith('--profile='))
|
|
190
|
+
profile = arg.slice(10);
|
|
191
|
+
else if (/^-p.+/.test(arg))
|
|
192
|
+
profile = arg.slice(2).replace(/^=/, '');
|
|
193
|
+
else if (arg === '-c' || arg === '--config')
|
|
194
|
+
overrides.push(args[++i]);
|
|
195
|
+
else if (arg.startsWith('--config='))
|
|
196
|
+
overrides.push(arg.slice(9));
|
|
197
|
+
else if (/^-c.+/.test(arg))
|
|
198
|
+
overrides.push(arg.slice(2).replace(/^=/, ''));
|
|
199
|
+
}
|
|
200
|
+
if (profile) {
|
|
201
|
+
if (!/^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,127}$/.test(profile))
|
|
202
|
+
return unavailable('CODEX_PROVIDER_INVALID', 'Invalid native Codex profile name.');
|
|
203
|
+
const home = source.CODEX_HOME || (0, path_1.join)(source.HOME || (0, os_1.homedir)(), '.codex');
|
|
204
|
+
const file = (0, path_1.join)(home, `${profile}.config.toml`);
|
|
205
|
+
try {
|
|
206
|
+
const info = await (0, promises_1.stat)(file);
|
|
207
|
+
if (!info.isFile() || info.size > 1024 * 1024)
|
|
208
|
+
throw new Error('Invalid profile');
|
|
209
|
+
config = overlayConfig(config, (0, smol_toml_1.parse)(await (0, promises_1.readFile)(file, 'utf8')));
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
// Older native CLIs store named profiles inside config.toml.
|
|
213
|
+
if (error.code === 'ENOENT' && config.profiles?.[profile])
|
|
214
|
+
config = overlayConfig(config, config.profiles[profile]);
|
|
215
|
+
else
|
|
216
|
+
return unavailable('CODEX_CONFIG_UNAVAILABLE', 'Cannot inspect the selected native Codex profile safely. Check its configuration file.');
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
for (const override of overrides) {
|
|
220
|
+
if (typeof override !== 'string' || !override.includes('='))
|
|
221
|
+
return unavailable('CODEX_PROVIDER_INVALID', 'Invalid native Codex configuration override.');
|
|
222
|
+
let parsed;
|
|
223
|
+
try {
|
|
224
|
+
parsed = (0, smol_toml_1.parse)(override);
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
// Native -c treats non-TOML values as literal strings.
|
|
228
|
+
const at = override.indexOf('=');
|
|
229
|
+
try {
|
|
230
|
+
parsed = (0, smol_toml_1.parse)(`${override.slice(0, at)} = ${JSON.stringify(override.slice(at + 1))}`);
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
return unavailable('CODEX_PROVIDER_INVALID', 'Invalid native Codex configuration override.');
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
config = overlayConfig(config, parsed);
|
|
237
|
+
}
|
|
238
|
+
return config;
|
|
239
|
+
}
|
|
240
|
+
/** Safemode stays in the native HOME, so OAuth/keyring refresh remains CLI-owned.
|
|
241
|
+
* Explicit params delegate login validation, but never drop selected provider credentials. */
|
|
242
|
+
async function codexSafemodeEnvironment(bin, env, options = {}) {
|
|
243
|
+
const source = options.source ?? process.env;
|
|
244
|
+
const inspected = await inspectCodexAccount(bin, source);
|
|
245
|
+
const config = await safemodeProviderConfig(inspected.config, options.nativeArgs ?? [], source);
|
|
246
|
+
const id = config.model_provider ?? 'openai';
|
|
247
|
+
const provider = config.model_providers?.[id];
|
|
248
|
+
const result = { ...env };
|
|
249
|
+
const names = new Set(Object.values(provider?.env_http_headers ?? {}));
|
|
250
|
+
if (provider?.env_key && !provider.requires_openai_auth)
|
|
251
|
+
names.add(provider.env_key);
|
|
252
|
+
for (const name of names) {
|
|
253
|
+
if (typeof name !== 'string' || !/^[A-Z_][A-Z0-9_]*$/.test(name) || /^(GH_|GITHUB_|GATEWAY_|ANTHROPIC_|CLAUDE_|LD_|DYLD_)/.test(name) || ['NODE_OPTIONS', 'BASH_ENV', 'ENV', 'SHELLOPTS'].includes(name)) {
|
|
254
|
+
return unavailable('CODEX_AUTH_REQUIRED', 'The selected native Codex credential variable is not permitted in safemode.');
|
|
255
|
+
}
|
|
256
|
+
if (source[name])
|
|
257
|
+
result[name] = source[name];
|
|
258
|
+
else if (options.nativeArgs === undefined)
|
|
259
|
+
return unavailable('CODEX_AUTH_REQUIRED', 'The native Codex provider credential is unavailable to safemode. Check its env_key under the gateway service user.');
|
|
260
|
+
}
|
|
261
|
+
if (options.nativeArgs === undefined && !(provider?.env_key && !provider.requires_openai_auth) && !inspected.account?.account) {
|
|
262
|
+
return unavailable('CODEX_AUTH_REQUIRED', 'Codex is not logged in. Run codex login first, or start safemode --cli claude. An existing session will not switch harnesses.');
|
|
263
|
+
}
|
|
264
|
+
return result;
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=codex-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-auth.js","sourceRoot":"","sources":["../../src/session/codex-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AgentConfig } from '../types';
|
|
2
|
+
import { CodexRuntime } from './codex-runtime';
|
|
3
|
+
export declare const CODEX_RUNTIME_LABEL = "ai.claude-gateway.codex-runtime";
|
|
4
|
+
export declare const CODEX_CONTAINER_BIN = "/opt/gateway-codex/bin/codex";
|
|
5
|
+
export declare const CODEX_RUNTIME_MAINTENANCE = "Drain work and stop only the app agent service, then run claude-gateway app refresh-runtime APP_NAME. All agents sharing this container must select the same host Codex runtime.";
|
|
6
|
+
/** Bind sources belong to this host, never a remote Docker machine. */
|
|
7
|
+
export declare function assertLocalCodexDocker(): Promise<void>;
|
|
8
|
+
/** Derive the narrow runtime allowlist from the native executable, never from labels.
|
|
9
|
+
* Only validated executable/resource mounts qualify, not an arbitrary parent directory.
|
|
10
|
+
* Task startup separately matches these against the operator-selected runtime. */
|
|
11
|
+
export declare function inspectedCodexRuntime(c: any): CodexRuntime | undefined;
|
|
12
|
+
export declare function assertCodexRuntimeInspection(c: any, runtime: CodexRuntime): void;
|
|
13
|
+
/** Read-only preflight. Never refresh a container underneath active work. */
|
|
14
|
+
export declare function inspectSelectedCodexRuntime(agent: AgentConfig, runtime: CodexRuntime): Promise<string>;
|
|
15
|
+
//# sourceMappingURL=codex-container-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-container-runtime.d.ts","sourceRoot":"","sources":["../../src/session/codex-container-runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAuB,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpE,eAAO,MAAM,mBAAmB,oCAAoC,CAAC;AACrE,eAAO,MAAM,mBAAmB,iCAAiC,CAAC;AAClE,eAAO,MAAM,yBAAyB,qLAAqL,CAAC;AAY5N,uEAAuE;AACvE,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAc5D;AAED;;kFAEkF;AAClF,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,GAAG,GAAG,YAAY,GAAG,SAAS,CAOtE;AAED,wBAAgB,4BAA4B,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAUhF;AAED,6EAA6E;AAC7E,wBAAsB,2BAA2B,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAU5G"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CODEX_RUNTIME_MAINTENANCE = exports.CODEX_CONTAINER_BIN = exports.CODEX_RUNTIME_LABEL = void 0;
|
|
4
|
+
exports.assertLocalCodexDocker = assertLocalCodexDocker;
|
|
5
|
+
exports.inspectedCodexRuntime = inspectedCodexRuntime;
|
|
6
|
+
exports.assertCodexRuntimeInspection = assertCodexRuntimeInspection;
|
|
7
|
+
exports.inspectSelectedCodexRuntime = inspectSelectedCodexRuntime;
|
|
8
|
+
const child_process_1 = require("child_process");
|
|
9
|
+
const codex_runtime_1 = require("./codex-runtime");
|
|
10
|
+
exports.CODEX_RUNTIME_LABEL = 'ai.claude-gateway.codex-runtime';
|
|
11
|
+
exports.CODEX_CONTAINER_BIN = '/opt/gateway-codex/bin/codex';
|
|
12
|
+
exports.CODEX_RUNTIME_MAINTENANCE = 'Drain work and stop only the app agent service, then run claude-gateway app refresh-runtime APP_NAME. All agents sharing this container must select the same host Codex runtime.';
|
|
13
|
+
/** Bound each Docker read without blocking gateway HTTP, voice or timers. */
|
|
14
|
+
function readDocker(args, timeout, maxBuffer) {
|
|
15
|
+
return new Promise((resolve, reject) => {
|
|
16
|
+
(0, child_process_1.execFile)('docker', args, { encoding: 'utf8', timeout, maxBuffer }, (error, stdout) => {
|
|
17
|
+
if (error)
|
|
18
|
+
reject(error);
|
|
19
|
+
else
|
|
20
|
+
resolve(stdout);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/** Bind sources belong to this host, never a remote Docker machine. */
|
|
25
|
+
async function assertLocalCodexDocker() {
|
|
26
|
+
let endpoint = process.env.DOCKER_CONTEXT ? undefined : process.env.DOCKER_HOST;
|
|
27
|
+
try {
|
|
28
|
+
if (!endpoint) {
|
|
29
|
+
const contexts = JSON.parse(await readDocker(['context', 'inspect'], 5000, 256 * 1024));
|
|
30
|
+
endpoint = contexts[0]?.Endpoints?.docker?.Host;
|
|
31
|
+
}
|
|
32
|
+
if (!endpoint?.startsWith('unix://'))
|
|
33
|
+
throw new Error('remote');
|
|
34
|
+
const info = JSON.parse(await readDocker(['info', '--format', '{{json .}}'], 5000, 256 * 1024));
|
|
35
|
+
const arch = info.Architecture === 'x86_64' ? 'x64' : info.Architecture === 'aarch64' ? 'arm64' : info.Architecture;
|
|
36
|
+
if (/docker desktop/i.test(info.OperatingSystem ?? '') || /desktop-linux/i.test(process.env.DOCKER_CONTEXT ?? '') || process.platform !== 'linux' || info.OSType !== 'linux' || arch !== process.arch)
|
|
37
|
+
throw new Error('incompatible');
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
throw new Error('CODEX_CONTAINER_RUNTIME_UNAVAILABLE: host runtime mounts require a local Linux Docker daemon with the same CPU architecture. Remote Docker and Docker Desktop are unsupported.');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/** Derive the narrow runtime allowlist from the native executable, never from labels.
|
|
44
|
+
* Only validated executable/resource mounts qualify, not an arbitrary parent directory.
|
|
45
|
+
* Task startup separately matches these against the operator-selected runtime. */
|
|
46
|
+
function inspectedCodexRuntime(c) {
|
|
47
|
+
const native = (c.Mounts ?? []).filter((m) => m.Destination === exports.CODEX_CONTAINER_BIN);
|
|
48
|
+
if (!native.length)
|
|
49
|
+
return undefined;
|
|
50
|
+
if (native.length !== 1 || native[0].Type !== 'bind' || native[0].RW)
|
|
51
|
+
throw new Error('CODEX_CONTAINER_RUNTIME_MOUNT_DENIED');
|
|
52
|
+
const runtime = (0, codex_runtime_1.resolveCodexRuntime)(native[0].Source);
|
|
53
|
+
if (runtime.containerError)
|
|
54
|
+
throw new Error('CODEX_CONTAINER_RUNTIME_MOUNT_DENIED');
|
|
55
|
+
return runtime;
|
|
56
|
+
}
|
|
57
|
+
function assertCodexRuntimeInspection(c, runtime) {
|
|
58
|
+
if (c.Config?.Labels?.[exports.CODEX_RUNTIME_LABEL] !== runtime.fingerprint) {
|
|
59
|
+
throw new Error(`CODEX_CONTAINER_RUNTIME_STALE: missing or changed host runtime. ${exports.CODEX_RUNTIME_MAINTENANCE}`);
|
|
60
|
+
}
|
|
61
|
+
for (const mount of runtime.mounts) {
|
|
62
|
+
const actual = (c.Mounts ?? []).filter((m) => m.Destination === mount.target);
|
|
63
|
+
if (actual.length !== 1 || actual[0].Type !== 'bind' || actual[0].RW || actual[0].Source !== mount.source) {
|
|
64
|
+
throw new Error(`CODEX_CONTAINER_RUNTIME_STALE: runtime mounts do not match the selected executable. ${exports.CODEX_RUNTIME_MAINTENANCE}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/** Read-only preflight. Never refresh a container underneath active work. */
|
|
69
|
+
async function inspectSelectedCodexRuntime(agent, runtime) {
|
|
70
|
+
if (runtime.containerError)
|
|
71
|
+
throw new Error(`CODEX_CONTAINER_RUNTIME_UNAVAILABLE: ${runtime.containerError}`);
|
|
72
|
+
await assertLocalCodexDocker();
|
|
73
|
+
let inspection;
|
|
74
|
+
try {
|
|
75
|
+
inspection = JSON.parse(await readDocker(['inspect', agent.container], 10000, 1024 * 1024))[0];
|
|
76
|
+
if (typeof inspection?.Id !== 'string' || !inspection.Id.trim())
|
|
77
|
+
throw new Error('Missing container ID');
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
throw new Error('CODEX_CONTAINER_RUNTIME_UNAVAILABLE: cannot inspect the app agent container.');
|
|
81
|
+
}
|
|
82
|
+
assertCodexRuntimeInspection(inspection, runtime);
|
|
83
|
+
return inspection.Id;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=codex-container-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-container-runtime.js","sourceRoot":"","sources":["../../src/session/codex-container-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Never a promise of upstream capacity. The native runtime may impose a lower limit. */
|
|
2
|
+
export interface CodexContextMeasurement {
|
|
3
|
+
requested: number | null;
|
|
4
|
+
configured: number | null;
|
|
5
|
+
providerLimit: number | null;
|
|
6
|
+
limitSource: 'documented-model' | 'unknown';
|
|
7
|
+
observed: number | null;
|
|
8
|
+
used: number | null;
|
|
9
|
+
status: 'unverified' | 'observed';
|
|
10
|
+
}
|
|
11
|
+
export declare function codexContextPolicy(model: string, requested?: number): CodexContextMeasurement;
|
|
12
|
+
export declare function observeCodexContext(policy: CodexContextMeasurement, usage: any): CodexContextMeasurement;
|
|
13
|
+
//# sourceMappingURL=codex-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-context.d.ts","sourceRoot":"","sources":["../../src/session/codex-context.ts"],"names":[],"mappings":"AAEA,yFAAyF;AACzF,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAC5C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,YAAY,GAAG,UAAU,CAAC;CACnC;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,uBAAuB,CAQ7F;AACD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,uBAAuB,EAAE,KAAK,EAAE,GAAG,GAAG,uBAAuB,CAMxG"}
|
|
@@ -0,0 +1,27 @@
|
|
|
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.codexContextPolicy = codexContextPolicy;
|
|
7
|
+
exports.observeCodexContext = observeCodexContext;
|
|
8
|
+
const codex_context_defaults_json_1 = __importDefault(require("./codex-context-defaults.json"));
|
|
9
|
+
const positive = (v) => typeof v === 'number' && Number.isSafeInteger(v) && v > 0;
|
|
10
|
+
function codexContextPolicy(model, requested) {
|
|
11
|
+
if (requested !== undefined && !positive(requested))
|
|
12
|
+
throw new Error('Invalid Codex context window');
|
|
13
|
+
// Versioned model data lives in one place. Never perform prefix matching or
|
|
14
|
+
// assume a dated/custom model has its family's capacity. No user setup required.
|
|
15
|
+
const limit = Object.hasOwnProperty.call(codex_context_defaults_json_1.default.limits, model) ? codex_context_defaults_json_1.default.limits[model] : undefined;
|
|
16
|
+
return { requested: requested ?? null, configured: limit === undefined ? requested ?? null : Math.min(requested ?? limit, limit),
|
|
17
|
+
providerLimit: limit ?? null, limitSource: limit !== undefined ? 'documented-model' : 'unknown',
|
|
18
|
+
observed: null, used: null, status: 'unverified' };
|
|
19
|
+
}
|
|
20
|
+
function observeCodexContext(policy, usage) {
|
|
21
|
+
const observed = positive(usage?.modelContextWindow) ? usage.modelContextWindow : null;
|
|
22
|
+
const used = typeof usage?.last?.totalTokens === 'number' && Number.isSafeInteger(usage.last.totalTokens) && usage.last.totalTokens >= 0 ? usage.last.totalTokens : null;
|
|
23
|
+
// A missing native measurement remains unknown. Never substitute cumulative usage
|
|
24
|
+
// (many requests) or the requested window as a measurement of the current context.
|
|
25
|
+
return { ...policy, observed, used, status: observed === null ? 'unverified' : 'observed' };
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=codex-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-context.js","sourceRoot":"","sources":["../../src/session/codex-context.ts"],"names":[],"mappings":";;;;;AAaA,gDAQC;AACD,kDAMC;AA5BD,gGAAqD;AAYrD,MAAM,QAAQ,GAAG,CAAC,CAAU,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxG,SAAgB,kBAAkB,CAAC,KAAa,EAAE,SAAkB;IAClE,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACrG,4EAA4E;IAC5E,iFAAiF;IACjF,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,qCAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAE,qCAAQ,CAAC,MAAiC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClI,OAAO,EAAE,SAAS,EAAE,SAAS,IAAI,IAAI,EAAE,UAAU,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,KAAK,EAAE,KAAK,CAAC;QAC9H,aAAa,EAAE,KAAK,IAAI,IAAI,EAAE,WAAW,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS;QAC/F,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AACvD,CAAC;AACD,SAAgB,mBAAmB,CAAC,MAA+B,EAAE,KAAU;IAC7E,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC;IACvF,MAAM,IAAI,GAAG,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;IACzK,kFAAkF;IAClF,mFAAmF;IACnF,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;AAC9F,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface NativeCodexSkill {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
path: string;
|
|
5
|
+
enabled: boolean;
|
|
6
|
+
pluginId?: string | null;
|
|
7
|
+
}
|
|
8
|
+
export interface NativeCodexExtensions {
|
|
9
|
+
skills: NativeCodexSkill[];
|
|
10
|
+
config: Record<string, any>;
|
|
11
|
+
plugins?: {
|
|
12
|
+
name: string;
|
|
13
|
+
root: string;
|
|
14
|
+
}[];
|
|
15
|
+
pluginIds?: string[];
|
|
16
|
+
notices?: string[];
|
|
17
|
+
}
|
|
18
|
+
/** Ask the installed CLI, rather than guessing cache versions or enabling every
|
|
19
|
+
* directory in its cache. No thread is created and no model request is sent. */
|
|
20
|
+
export declare function inspectCodexExtensions(bin: string, cwd: string, env?: NodeJS.ProcessEnv, container?: string): Promise<NativeCodexExtensions>;
|
|
21
|
+
//# sourceMappingURL=codex-extension-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-extension-discovery.d.ts","sourceRoot":"","sources":["../../src/session/codex-extension-discovery.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,gBAAgB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAAE;AAClI,MAAM,WAAW,qBAAqB;IAAG,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CAAE;AAEzL;gFACgF;AAChF,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,oBAAc,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA4FtI"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.inspectCodexExtensions = inspectCodexExtensions;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const codex_policy_1 = require("./codex-policy");
|
|
6
|
+
const fs_1 = require("fs");
|
|
7
|
+
const path_1 = require("path");
|
|
8
|
+
const os_1 = require("os");
|
|
9
|
+
/** Ask the installed CLI, rather than guessing cache versions or enabling every
|
|
10
|
+
* directory in its cache. No thread is created and no model request is sent. */
|
|
11
|
+
function inspectCodexExtensions(bin, cwd, env = process.env, container) {
|
|
12
|
+
return new Promise((resolve, reject) => {
|
|
13
|
+
const args = (0, codex_policy_1.codexPolicyArgs)();
|
|
14
|
+
const index = args.indexOf('features.plugins=false');
|
|
15
|
+
if (index >= 1)
|
|
16
|
+
args.splice(index - 1, 2);
|
|
17
|
+
const nativeArgs = [...args, 'app-server', '--listen', 'stdio://'];
|
|
18
|
+
const child = container ? (0, child_process_1.spawn)('docker', ['exec', '-i', '--workdir', '/workspace', '--user', String((0, os_1.userInfo)().uid), '-e', `HOME=${(0, os_1.homedir)()}`, container, bin, ...nativeArgs], { env, stdio: 'pipe' })
|
|
19
|
+
: (0, child_process_1.spawn)(bin, nativeArgs, { cwd, env, stdio: 'pipe' });
|
|
20
|
+
let sequence = 0, buffer = '', bytes = 0, settled = false;
|
|
21
|
+
const pending = new Map();
|
|
22
|
+
const finish = (error, result) => {
|
|
23
|
+
if (settled)
|
|
24
|
+
return;
|
|
25
|
+
settled = true;
|
|
26
|
+
clearTimeout(timer);
|
|
27
|
+
child.stdin.destroy();
|
|
28
|
+
child.stdout.destroy();
|
|
29
|
+
child.stderr.destroy();
|
|
30
|
+
child.kill('SIGTERM');
|
|
31
|
+
const kill = setTimeout(() => { child.kill('SIGKILL'); child.unref(); }, 1000);
|
|
32
|
+
kill.unref();
|
|
33
|
+
child.once('close', () => clearTimeout(kill));
|
|
34
|
+
for (const request of pending.values())
|
|
35
|
+
request.reject(new Error('CODEX_EXTENSION_DISCOVERY_CLOSED'));
|
|
36
|
+
pending.clear();
|
|
37
|
+
if (error)
|
|
38
|
+
reject(error);
|
|
39
|
+
else
|
|
40
|
+
resolve(result);
|
|
41
|
+
};
|
|
42
|
+
const timer = setTimeout(() => finish(new Error('CODEX_EXTENSION_DISCOVERY_TIMEOUT')), 15000);
|
|
43
|
+
child.on('error', () => finish(new Error('CODEX_EXTENSION_DISCOVERY_UNAVAILABLE')));
|
|
44
|
+
child.on('close', () => finish(new Error('CODEX_EXTENSION_DISCOVERY_CLOSED')));
|
|
45
|
+
child.stdin.on('error', () => finish(new Error('CODEX_EXTENSION_DISCOVERY_CLOSED')));
|
|
46
|
+
child.stderr.resume();
|
|
47
|
+
child.stdout.setEncoding('utf8');
|
|
48
|
+
child.stdout.on('data', (chunk) => {
|
|
49
|
+
bytes += Buffer.byteLength(chunk);
|
|
50
|
+
buffer += chunk;
|
|
51
|
+
if (bytes > 8 * 1024 * 1024)
|
|
52
|
+
return finish(new Error('CODEX_EXTENSION_DISCOVERY_TOO_LARGE'));
|
|
53
|
+
let newline;
|
|
54
|
+
while ((newline = buffer.indexOf('\n')) >= 0) {
|
|
55
|
+
const line = buffer.slice(0, newline);
|
|
56
|
+
buffer = buffer.slice(newline + 1);
|
|
57
|
+
let event;
|
|
58
|
+
try {
|
|
59
|
+
event = JSON.parse(line);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
const request = pending.get(event.id);
|
|
65
|
+
if (!request || event.method)
|
|
66
|
+
continue;
|
|
67
|
+
pending.delete(event.id);
|
|
68
|
+
// Native diagnostics can contain credentials. Never propagate their text.
|
|
69
|
+
if (event.error)
|
|
70
|
+
request.reject(new Error('CODEX_EXTENSION_DISCOVERY_REJECTED'));
|
|
71
|
+
else
|
|
72
|
+
request.resolve(event.result);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
const rpc = (method, params) => new Promise((resolve, reject) => {
|
|
76
|
+
const id = ++sequence;
|
|
77
|
+
pending.set(id, { resolve, reject });
|
|
78
|
+
child.stdin.write(JSON.stringify({ id, method, params }) + '\n');
|
|
79
|
+
});
|
|
80
|
+
void (async () => {
|
|
81
|
+
await rpc('initialize', { clientInfo: { name: 'gateway_extensions', version: '1' }, capabilities: { experimentalApi: true } });
|
|
82
|
+
child.stdin.write(JSON.stringify({ method: 'initialized', params: {} }) + '\n');
|
|
83
|
+
const config = (await rpc('config/read', { cwd, includeLayers: false })).config;
|
|
84
|
+
if (!config)
|
|
85
|
+
throw new Error('CODEX_EXTENSION_CONFIG_UNAVAILABLE');
|
|
86
|
+
const listing = await rpc('skills/list', { cwds: [cwd], forceReload: true });
|
|
87
|
+
const skills = (listing.data ?? []).flatMap((entry) => entry.skills ?? []).filter((skill) => skill.enabled === true && typeof skill.path === 'string');
|
|
88
|
+
// Remote installed plugins can be omitted from skills/list until explicitly
|
|
89
|
+
// selected. plugin/read gives their installed paths without a model call.
|
|
90
|
+
const notices = [];
|
|
91
|
+
const plugins = await rpc('plugin/installed', { cwds: [cwd] }).catch(() => {
|
|
92
|
+
notices.push('Codex plugin inventory is unavailable; native skills and configured MCP remain available.');
|
|
93
|
+
return { marketplaces: [] };
|
|
94
|
+
});
|
|
95
|
+
const installed = [];
|
|
96
|
+
const pluginIds = [];
|
|
97
|
+
for (const marketplace of plugins.marketplaces ?? []) {
|
|
98
|
+
for (const plugin of marketplace.plugins ?? []) {
|
|
99
|
+
if (!plugin.installed || !plugin.enabled || plugin.disabledReason)
|
|
100
|
+
continue;
|
|
101
|
+
let detail;
|
|
102
|
+
try {
|
|
103
|
+
detail = await rpc('plugin/read', { pluginName: plugin.name, marketplacePath: marketplace.path ?? null, remoteMarketplaceName: marketplace.path ? null : marketplace.name });
|
|
104
|
+
if (!detail?.plugin || typeof detail.plugin !== 'object')
|
|
105
|
+
throw new Error('CODEX_PLUGIN_METADATA_INVALID');
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// Do not discard healthy skills/MCP or expose native diagnostics.
|
|
109
|
+
notices.push('A Codex plugin could not be read; other native extensions remain available.');
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
pluginIds.push(plugin.id);
|
|
113
|
+
// A remote catalog may return null skill paths even after its exact
|
|
114
|
+
// published version has been materialized locally. Never choose an
|
|
115
|
+
// arbitrary cached version or scan disabled/uninstalled packages.
|
|
116
|
+
const version = plugin.localVersion ?? plugin.version;
|
|
117
|
+
const parts = [marketplace.name, plugin.name, version];
|
|
118
|
+
const root = plugin.source?.type === 'local' ? plugin.source.path : parts.every(part => typeof part === 'string' && /^[\w.-]+$/.test(part) && part !== '.' && part !== '..')
|
|
119
|
+
? (0, path_1.join)(env.CODEX_HOME ?? (0, path_1.join)(env.HOME ?? (0, os_1.homedir)(), '.codex'), 'plugins', 'cache', ...parts) : undefined;
|
|
120
|
+
if (root && (container || (0, fs_1.existsSync)((0, path_1.join)(root, '.codex-plugin', 'plugin.json'))))
|
|
121
|
+
installed.push({ name: plugin.name, root });
|
|
122
|
+
for (const skill of detail.plugin?.skills ?? []) {
|
|
123
|
+
if (skill.enabled === true && typeof skill.path === 'string' && !skills.some(entry => entry.path === skill.path))
|
|
124
|
+
skills.push({ ...skill, pluginId: plugin.id });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
finish(undefined, { config, skills, plugins: installed, pluginIds, notices });
|
|
129
|
+
})().catch(() => finish(new Error('CODEX_EXTENSION_DISCOVERY_UNAVAILABLE')));
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=codex-extension-discovery.js.map
|