@aiwg/cli 2026.10.1 → 2026.10.4
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 +2 -2
- package/agentic/code/providers/capability-matrix.yaml +270 -0
- package/agentic/code/providers/model-capabilities.v1.json +3183 -24
- package/bin/aiwg.mjs +135 -47
- package/dist/src/a2a/codecs.js +9 -0
- package/dist/src/agents/grounding/knowledge-base.js +54 -6
- package/dist/src/artifacts/browser-export.js +6 -0
- package/dist/src/artifacts/checksum-manifest.js +1 -0
- package/dist/src/artifacts/citation-parser.js +173 -92
- package/dist/src/artifacts/citation-table-schema.js +59 -0
- package/dist/src/artifacts/cli.js +57 -18
- package/dist/src/artifacts/corpus-tools/snapshot.js +1 -1
- package/dist/src/artifacts/corpus-tools/vision-extract.js +107 -15
- package/dist/src/artifacts/corpus-views/ref-parser.js +3 -1
- package/dist/src/artifacts/corpus-views/renderers.js +3 -3
- package/dist/src/artifacts/discovery-eval.js +6 -4
- package/dist/src/artifacts/fortemi-core-query-adapter.js +36 -3
- package/dist/src/artifacts/fortemi-core-sync.js +166 -40
- package/dist/src/artifacts/framework-capabilities.js +171 -0
- package/dist/src/artifacts/framework-index-paths.js +73 -0
- package/dist/src/artifacts/framework-source-digest.js +75 -0
- package/dist/src/artifacts/index-builder.js +285 -131
- package/dist/src/artifacts/index-files.js +132 -18
- package/dist/src/artifacts/index-preparation.js +65 -0
- package/dist/src/artifacts/index-refresh.js +576 -0
- package/dist/src/artifacts/index-worker.mjs +9 -0
- package/dist/src/artifacts/prebuilt-build-lock.js +47 -4
- package/dist/src/artifacts/prebuilt-deployment.js +46 -0
- package/dist/src/artifacts/prebuilt-relations.js +80 -0
- package/dist/src/artifacts/query-engine.js +410 -88
- package/dist/src/artifacts/relations-builder.js +168 -0
- package/dist/src/artifacts/relations.js +148 -0
- package/dist/src/artifacts/repair.js +9 -4
- package/dist/src/artifacts/stats.js +5 -2
- package/dist/src/artifacts/types.js +30 -10
- package/dist/src/artifacts/watcher.js +1 -1
- package/dist/src/auth/credential-store.js +2 -1
- package/dist/src/catalog/cli.d.mts +5 -0
- package/dist/src/channel/manager.d.mts +20 -0
- package/dist/src/channel/manager.mjs +78 -12
- package/dist/src/cli/child-process-result.js +40 -0
- package/dist/src/cli/command-log.js +2 -3
- package/dist/src/cli/env.js +38 -16
- package/dist/src/cli/flag-parsing.js +236 -0
- package/dist/src/cli/handlers/artifacts.js +3 -0
- package/dist/src/cli/handlers/auth.js +3 -0
- package/dist/src/cli/handlers/decision.js +218 -5
- package/dist/src/cli/handlers/diagnose.js +13 -5
- package/dist/src/cli/handlers/effect.js +4 -2
- package/dist/src/cli/handlers/evidence.js +3 -0
- package/dist/src/cli/handlers/feedback.js +14 -5
- package/dist/src/cli/handlers/help.js +1 -0
- package/dist/src/cli/handlers/index.js +3 -1
- package/dist/src/cli/handlers/init.js +248 -30
- package/dist/src/cli/handlers/lint.js +5 -0
- package/dist/src/cli/handlers/mc.js +23 -0
- package/dist/src/cli/handlers/models.js +169 -10
- package/dist/src/cli/handlers/ralph-launcher.js +2 -0
- package/dist/src/cli/handlers/ralph.js +3 -0
- package/dist/src/cli/handlers/refresh.js +28 -0
- package/dist/src/cli/handlers/regenerate.js +14 -0
- package/dist/src/cli/handlers/resource-versions.js +3 -0
- package/dist/src/cli/handlers/rules.js +195 -0
- package/dist/src/cli/handlers/run.js +4 -0
- package/dist/src/cli/handlers/runtime-info.js +25 -11
- package/dist/src/cli/handlers/script-runner.js +19 -8
- package/dist/src/cli/handlers/session.js +406 -62
- package/dist/src/cli/handlers/sessions.js +243 -76
- package/dist/src/cli/handlers/setup-manifest.js +474 -79
- package/dist/src/cli/handlers/setup.js +180 -39
- package/dist/src/cli/handlers/steward.js +11 -0
- package/dist/src/cli/handlers/subcommands.js +60 -3
- package/dist/src/cli/handlers/team.js +18 -8
- package/dist/src/cli/handlers/uhp.js +3 -0
- package/dist/src/cli/handlers/use.js +307 -55
- package/dist/src/cli/handlers/utilities.js +125 -26
- package/dist/src/cli/handlers/version.js +8 -0
- package/dist/src/cli/prompt-utils.js +72 -0
- package/dist/src/cli/provider-resolution.js +11 -0
- package/dist/src/cli/router.js +15 -1
- package/dist/src/cli/services/deployment-verification.js +19 -9
- package/dist/src/cli/services/provider-prepare-coordinator.js +24 -0
- package/dist/src/cli/skill-usage.js +2 -3
- package/dist/src/config/aiwg-config.js +349 -35
- package/dist/src/config/cli.js +256 -23
- package/dist/src/config/decision-config.js +106 -0
- package/dist/src/config/dispatch-thresholds-runtime.d.mts +8 -0
- package/dist/src/config/dispatch-thresholds-runtime.mjs +38 -0
- package/dist/src/config/gitignore.js +50 -0
- package/dist/src/config/index-graph-overrides.js +36 -0
- package/dist/src/config/project-artifacts-health.d.mts +37 -0
- package/dist/src/config/project-artifacts-health.mjs +14 -3
- package/dist/src/config/project-artifacts-runtime.d.mts +16 -0
- package/dist/src/config/user-config-dir.d.mts +9 -0
- package/dist/src/config/user-config.js +38 -11
- package/dist/src/config/user-registry.js +23 -15
- package/dist/src/config/user-state.js +7 -0
- package/dist/src/decision/adapters/jev.js +75 -27
- package/dist/src/decision/ask.js +203 -43
- package/dist/src/decision/context-live-qualification.js +2 -2
- package/dist/src/decision/driver.js +14 -7
- package/dist/src/decision/ensemble/aggregate.js +23 -10
- package/dist/src/decision/ensemble-study/multifact-study.js +6 -2
- package/dist/src/decision/entry.js +25 -6
- package/dist/src/decision/graph-live-qualification.js +1 -1
- package/dist/src/decision/graph-run.js +9 -0
- package/dist/src/decision/heldout/collector.js +15 -14
- package/dist/src/decision/heldout/contract.js +30 -7
- package/dist/src/decision/index.js +1 -0
- package/dist/src/decision/interop.js +60 -8
- package/dist/src/decision/jev-credentials.js +15 -1
- package/dist/src/decision/ledger.js +942 -0
- package/dist/src/decision/offload-activation.js +137 -0
- package/dist/src/decision/offload.js +550 -0
- package/dist/src/decision/qualification/load.js +4 -6
- package/dist/src/decision/savings.js +28 -0
- package/dist/src/decision/validate.js +6 -3
- package/dist/src/effects/dispatch-verifier.js +252 -0
- package/dist/src/effects/index.js +1 -0
- package/dist/src/effects/types.js +5 -1
- package/dist/src/effects/verifiers/git.js +2 -1
- package/dist/src/effects/verifiers/tracker.js +26 -14
- package/dist/src/extensions/commands/definitions.js +19 -0
- package/dist/src/extensions/project-local-remove.js +36 -1
- package/dist/src/features/installer.js +2 -2
- package/dist/src/flow/graph-metadata.js +5 -0
- package/dist/src/gates/providers/loader.js +64 -18
- package/dist/src/installation/manager-command.d.mts +18 -0
- package/dist/src/installation/manager-command.mjs +15 -3
- package/dist/src/installation/manager.d.mts +49 -0
- package/dist/src/installation/manager.mjs +95 -5
- package/dist/src/issues/cli.js +4 -4
- package/dist/src/issues/local.js +24 -5
- package/dist/src/jobs/runner.js +1 -1
- package/dist/src/lint/cli.js +27 -1
- package/dist/src/lint/loader.js +2 -1
- package/dist/src/lint/reporters.js +25 -1
- package/dist/src/lint/rule-activation.js +43 -0
- package/dist/src/lint/runner.js +137 -62
- package/dist/src/mcp/adapters/codex-runtime.js +366 -56
- package/dist/src/mcp/claude-install.d.mts +4 -0
- package/dist/src/mcp/claude-install.mjs +41 -0
- package/dist/src/mcp/cli.d.mts +1 -0
- package/dist/src/mcp/cli.mjs +620 -85
- package/dist/src/mcp/config-file.d.mts +28 -0
- package/dist/src/mcp/config-file.mjs +279 -0
- package/dist/src/mcp/config-layers.d.mts +36 -0
- package/dist/src/mcp/config-layers.mjs +348 -0
- package/dist/src/mcp/credentials.d.mts +51 -0
- package/dist/src/mcp/credentials.mjs +484 -0
- package/dist/src/mcp/grok-build-config.d.mts +6 -0
- package/dist/src/mcp/grok-build-config.mjs +17 -27
- package/dist/src/mcp/helpers.mjs +109 -4
- package/dist/src/mcp/muse-native-config.d.mts +13 -0
- package/dist/src/mcp/muse-native-config.mjs +1 -0
- package/dist/src/mcp/omp-config.d.mts +4 -0
- package/dist/src/mcp/omp-config.mjs +50 -29
- package/dist/src/mcp/profiles.js +97 -23
- package/dist/src/mcp/profiles.mjs +99 -27
- package/dist/src/mcp/registry.js +248 -131
- package/dist/src/mcp/registry.mjs +169 -100
- package/dist/src/mcp/server-config.d.mts +3 -0
- package/dist/src/mcp/server-config.mjs +89 -0
- package/dist/src/mcp/server.mjs +127 -82
- package/dist/src/mcp/test-simple.mjs +2 -1
- package/dist/src/mcp/toml-editor.d.mts +4 -0
- package/dist/src/mcp/toml-string.d.mts +1 -0
- package/dist/src/mcp/toml-string.mjs +9 -0
- package/dist/src/mcp/toml-strip-mcp.d.mts +1 -0
- package/dist/src/mcp/toml-strip-mcp.mjs +135 -0
- package/dist/src/mcp/tool-filters.d.mts +46 -0
- package/dist/src/mcp/tool-filters.mjs +357 -0
- package/dist/src/mcp/tools/agentic-sandbox.mjs +3 -1
- package/dist/src/mcp/tools/decision.mjs +22 -3
- package/dist/src/mcp/tools/discovery.mjs +62 -55
- package/dist/src/mcp/tools/orchestration.mjs +50 -2
- package/dist/src/mcp/tools/subsystems.mjs +39 -8
- package/dist/src/mcp/tools/worker-invoke.mjs +2856 -0
- package/dist/src/mcp/tools/worker-shell-control.mjs +289 -0
- package/dist/src/mcp/tools/worker-stdin-runtime.mjs +79 -0
- package/dist/src/memory/project-registry.js +2 -2
- package/dist/src/mission-protocol/codecs.js +647 -1
- package/dist/src/mission-protocol/types.js +110 -0
- package/dist/src/mission-protocol/worker-status.js +2 -0
- package/dist/src/models/config-loader.js +76 -14
- package/dist/src/models/grok-build-models.js +93 -41
- package/dist/src/models/model-capabilities.v1.json +3183 -24
- package/dist/src/models/model-discovery.js +931 -67
- package/dist/src/models/provider-policy.js +719 -11
- package/dist/src/models/qualification-digest.d.mts +2 -0
- package/dist/src/models/qualification-digest.mjs +17 -0
- package/dist/src/models/resolver.js +261 -0
- package/dist/src/models/worker-direct-readiness.js +550 -0
- package/dist/src/models/worker-dispatch-offer.js +169 -0
- package/dist/src/models/worker-health-readiness.js +144 -0
- package/dist/src/models/worker-installation.d.mts +39 -0
- package/dist/src/models/worker-installation.mjs +986 -0
- package/dist/src/models/wrapper-route.js +18 -0
- package/dist/src/ops/registry.js +9 -14
- package/dist/src/plugins/standalone-packager.js +4 -3
- package/dist/src/process/bounded-child-process.d.mts +84 -0
- package/dist/src/process/bounded-child-process.mjs +430 -0
- package/dist/src/process/cli-command.d.mts +16 -0
- package/dist/src/process/cli-command.mjs +75 -0
- package/dist/src/process/signal-child.d.mts +6 -0
- package/dist/src/process/signal-child.mjs +7 -0
- package/dist/src/providers/capability-matrix.js +8 -0
- package/dist/src/providers/capability-matrix.yaml +270 -0
- package/dist/src/providers/deployed-skill-roots.js +20 -0
- package/dist/src/providers/grok-build-acp.js +3 -2
- package/dist/src/providers/grok-build-headless.js +53 -23
- package/dist/src/providers/grok-build-inspect.js +1 -0
- package/dist/src/providers/omp-agent.d.mts +8 -0
- package/dist/src/providers/omp-diagnostics.d.mts +1 -0
- package/dist/src/providers/omp-paths.d.mts +13 -0
- package/dist/src/providers/provider-definitions.js +9 -1
- package/dist/src/providers/provider-definitions.mjs +9 -2
- package/dist/src/providers/skill-ownership.d.mts +9 -0
- package/dist/src/providers/skill-ownership.mjs +88 -0
- package/dist/src/rules/activation.d.mts +21 -0
- package/dist/src/rules/activation.mjs +62 -0
- package/dist/src/rules/inline-budget.d.mts +26 -0
- package/dist/src/rules/inline-budget.mjs +66 -0
- package/dist/src/rules/inventory.js +129 -0
- package/dist/src/rules/pin-state.js +73 -0
- package/dist/src/rules/pins.d.mts +14 -0
- package/dist/src/rules/pins.mjs +112 -0
- package/dist/src/rules/rule-frontmatter.schema.json +197 -0
- package/dist/src/serve/executor-registry.js +16 -24
- package/dist/src/serve/fleet-mission-conductor.js +9 -0
- package/dist/src/serve/mission-conductor.js +47 -12
- package/dist/src/serve/shared-host-scheduler.js +2 -0
- package/dist/src/serve/worker-invocation.js +558 -0
- package/dist/src/serve/worker-stdin-frame.d.mts +10 -0
- package/dist/src/serve/worker-stdin-frame.mjs +107 -0
- package/dist/src/sessions/adapter-registry.js +49 -0
- package/dist/src/sessions/adapters/claude.js +39 -54
- package/dist/src/sessions/adapters/codex.js +82 -67
- package/dist/src/sessions/adapters/copilot.js +4 -4
- package/dist/src/sessions/adapters/cursor.js +40 -57
- package/dist/src/sessions/adapters/deepseek-harness.js +15 -12
- package/dist/src/sessions/adapters/factory.js +31 -27
- package/dist/src/sessions/adapters/generic.js +43 -9
- package/dist/src/sessions/adapters/grok-build.js +11 -11
- package/dist/src/sessions/adapters/grokbot-locator.js +111 -0
- package/dist/src/sessions/adapters/grokbot.js +434 -24
- package/dist/src/sessions/adapters/hermes.js +27 -29
- package/dist/src/sessions/adapters/muse-workspace-scan.js +128 -0
- package/dist/src/sessions/adapters/muse.js +200 -104
- package/dist/src/sessions/adapters/omp.js +28 -14
- package/dist/src/sessions/adapters/openclaw.js +89 -79
- package/dist/src/sessions/adapters/opencode.js +27 -24
- package/dist/src/sessions/adapters/openhuman.js +18 -60
- package/dist/src/sessions/adapters/pi.js +30 -14
- package/dist/src/sessions/adapters/warp.js +3 -3
- package/dist/src/sessions/adapters/windsurf.js +19 -48
- package/dist/src/sessions/batch-contracts.js +25 -5
- package/dist/src/sessions/batch-import.js +72 -51
- package/dist/src/sessions/candidates.js +47 -11
- package/dist/src/sessions/contracts.js +75 -2
- package/dist/src/sessions/coverage-preflight.js +134 -0
- package/dist/src/sessions/discovery.js +3 -0
- package/dist/src/sessions/export-plan.js +4 -3
- package/dist/src/sessions/grok-build-cli.js +67 -5
- package/dist/src/sessions/import-exclusions.js +72 -0
- package/dist/src/sessions/import-lease.js +34 -18
- package/dist/src/sessions/import-limits.js +37 -0
- package/dist/src/sessions/importer.js +84 -46
- package/dist/src/sessions/index.js +2 -0
- package/dist/src/sessions/lifecycle.js +45 -0
- package/dist/src/sessions/policy.js +133 -25
- package/dist/src/sessions/readers.js +106 -53
- package/dist/src/sessions/refresh.js +106 -0
- package/dist/src/sessions/repository.js +199 -63
- package/dist/src/sessions/workspace-discovery.js +315 -88
- package/dist/src/sessions/workspace-matching.js +107 -0
- package/dist/src/skills/adapters/clawhub.js +10 -8
- package/dist/src/skills/adapters/openclaw.js +10 -7
- package/dist/src/skills/importer.js +1 -0
- package/dist/src/smiths/context-pipeline/aiwg-md.js +11 -0
- package/dist/src/smiths/context-pipeline/claude-hook.js +3 -26
- package/dist/src/smiths/context-pipeline/finalization.js +6 -5
- package/dist/src/smiths/context-pipeline/generator.js +21 -4
- package/dist/src/smiths/context-pipeline/parallelism-section.js +195 -14
- package/dist/src/smiths/context-pipeline/workspace-context.js +116 -9
- package/dist/src/smiths/hook-bridge/codex-translator.js +6 -5
- package/dist/src/smiths/mcpsmith/example.js +1 -1
- package/dist/src/smiths/mcpsmith/generator.js +1 -1
- package/dist/src/smiths/toolsmith/runtime-discovery.d.mts +10 -0
- package/dist/src/smiths/toolsmith/runtime-discovery.mjs +85 -31
- package/dist/src/storage/backends/fs.js +18 -76
- package/dist/src/storage/backends/logseq.js +68 -7
- package/dist/src/storage/backends/obsidian.js +1 -0
- package/dist/src/storage/fortemi-qualification-receipt.js +2 -2
- package/dist/src/testing/generators/test-code-generator.js +57 -30
- package/dist/src/tracker/forge-http.js +2 -1
- package/dist/src/uhp/client.js +11 -1
- package/dist/src/uhp/mission.js +5 -0
- package/dist/src/update/checker.d.mts +2 -0
- package/dist/src/update/checker.mjs +5 -5
- package/dist/src/update/notifier.mjs +54 -2
- package/dist/src/update/service.d.mts +22 -0
- package/dist/src/utils/contained-filesystem.d.mts +37 -0
- package/dist/src/utils/contained-filesystem.mjs +683 -0
- package/dist/src/utils/temporary-directory.js +36 -0
- package/dist/src/writing/example-generator.js +1 -1
- package/dist/src/writing/fidelity.js +18 -1
- package/package.json +32 -2
- package/schemas/mission-v1.schema.json +2429 -0
- package/schemas/models/model-catalog.v1.schema.json +301 -0
- package/schemas/models/model-config-compatibility.v1.schema.json +281 -0
- package/schemas/models/model-policy.v1.schema.json +14 -0
- package/schemas/models/provider-model-capabilities.v1.schema.json +1072 -0
- package/tools/_resolve-impl.mjs +39 -2
- package/tools/agents/deploy-agents.mjs +64 -23
- package/tools/agents/providers/base.mjs +153 -166
- package/tools/agents/providers/claude.mjs +8 -24
- package/tools/agents/providers/codex.mjs +18 -11
- package/tools/agents/providers/cursor.mjs +19 -18
- package/tools/agents/providers/grok-build.mjs +3 -1
- package/tools/agents/providers/grokbot.mjs +11 -12
- package/tools/agents/providers/hermes.mjs +62 -49
- package/tools/agents/providers/omp.mjs +5 -2
- package/tools/agents/providers/openclaw-translator.mjs +19 -5
- package/tools/agents/providers/openclaw.mjs +9 -4
- package/tools/agents/providers/pi.mjs +5 -0
- package/tools/agents/providers/provider-prepare-channel.mjs +5 -0
- package/tools/agents/providers/provider-prepare-coordinator.mjs +247 -0
- package/tools/agents/providers/provider-prepare-worker.mjs +84 -0
- package/tools/agents/providers/rule-delivery.mjs +1270 -0
- package/tools/agents/providers/warp.mjs +20 -26
- package/tools/cli/decision-offload-report.mjs +40 -0
- package/tools/cli/workspace-status.mjs +862 -0
- package/tools/plugin/package-plugins.mjs +186 -8
- package/tools/plugin/plugin-links.mjs +114 -0
- package/tools/providers/antigravity-transport.mjs +3 -1
- package/tools/providers/deepseek-harness-transport.mjs +360 -0
- package/tools/providers/omp-transport.mjs +194 -0
- package/tools/ralph-external/lib/claude-adapter.mjs +389 -0
- package/tools/ralph-external/lib/codex-adapter.mjs +432 -0
- package/tools/ralph-external/lib/consecutive-failure-circuit-breaker.mjs +1748 -0
- package/tools/ralph-external/lib/deepseek-harness-adapter.mjs +397 -0
- package/tools/ralph-external/lib/factory-adapter.mjs +503 -0
- package/tools/ralph-external/lib/launcher-recovery-evidence.mjs +55 -0
- package/tools/ralph-external/lib/muse-adapter.mjs +364 -0
- package/tools/ralph-external/lib/omp-adapter.mjs +315 -0
- package/tools/ralph-external/lib/opencode-adapter.mjs +575 -0
- package/tools/ralph-external/lib/openhuman-adapter.mjs +75 -0
- package/tools/ralph-external/lib/pi-adapter.mjs +329 -0
- package/tools/ralph-external/lib/provider-adapter.mjs +748 -0
- package/tools/ralph-external/lib/recovery-probe.mjs +72 -0
- package/tools/ralph-external/lib/session-environment.mjs +28 -0
- package/tools/ralph-external/lib/systemd-client.mjs +49 -0
- package/tools/ralph-external/lib/worker-health.mjs +439 -0
- package/tools/ralph-external/lib/worker-isolation.mjs +717 -0
- package/tools/ralph-external/lib/worker-overflow.mjs +50 -0
- package/tools/ralph-external/process-monitor.mjs +1017 -0
- package/tools/ralph-external/session-launcher.mjs +5057 -0
- package/tools/scripts/resource-preflight.mjs +541 -0
- package/tools/skills/deploy-skills-codex.mjs +2 -1
- package/vscode-extension/schemas/aiwg.config.v1.json +2916 -0
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex CLI Provider Adapter for External Ralph Loop
|
|
3
|
+
*
|
|
4
|
+
* Provides support for OpenAI's Codex CLI as a provider for
|
|
5
|
+
* autonomous task execution in Ralph loops.
|
|
6
|
+
*
|
|
7
|
+
* Codex CLI differences from Claude:
|
|
8
|
+
* - Binary: `codex` instead of `claude`
|
|
9
|
+
* - Headless flag: `--dangerously-bypass-approvals-and-sandbox` (full dangerous mode)
|
|
10
|
+
* - Requires `--skip-git-repo-check` for temp/non-git working directories
|
|
11
|
+
* - No stream-json output format (text only)
|
|
12
|
+
* - No session resume capability
|
|
13
|
+
* - No --agent flag
|
|
14
|
+
* - No --mcp-config flag
|
|
15
|
+
* - No --append-system-prompt flag (inject into main prompt)
|
|
16
|
+
* - No --max-budget-usd flag
|
|
17
|
+
* - Model: generic aliases map to the GPT-5.6 tier ladder (sol / terra / luna)
|
|
18
|
+
*
|
|
19
|
+
* @implements Plan: Multi-Provider Support for External Ralph Loop
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import { ProviderAdapter, registerProvider } from './provider-adapter.mjs';
|
|
23
|
+
import { classifyWorkerHealthFailure, healthEventMatchesBinding } from './worker-health.mjs';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Model mapping from generic names to Codex-specific models.
|
|
27
|
+
*
|
|
28
|
+
* Tier-equivalent mapping (observed in Codex model/list, 2026-09-21):
|
|
29
|
+
* premium = gpt-5.6-sol, standard = gpt-5.6-terra, economy = gpt-5.6-luna.
|
|
30
|
+
* The flagship gpt-6-astra is never selected by an alias; pass it explicitly
|
|
31
|
+
* (e.g., --model gpt-6-astra) when the user elects it.
|
|
32
|
+
*/
|
|
33
|
+
const MODEL_MAP = {
|
|
34
|
+
'opus': 'gpt-5.6-sol',
|
|
35
|
+
'sonnet': 'gpt-5.6-terra',
|
|
36
|
+
'haiku': 'gpt-5.6-luna',
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Version-bound direct-worker surface (roctinam/aiwg#2897, B-OG-07).
|
|
41
|
+
*
|
|
42
|
+
* Qualified against codex-cli 0.161.0 `--help`/`exec --help` (help/version
|
|
43
|
+
* syntax only, 2026-10-09; never live qualification):
|
|
44
|
+
*
|
|
45
|
+
* codex --no-daemon exec --ignore-user-config -m M \
|
|
46
|
+
* -c model_reasoning_effort="E" -s S -C W -c approval_policy="never" \
|
|
47
|
+
* --skip-git-repo-check -o F --json - < briefPath
|
|
48
|
+
*
|
|
49
|
+
* `--no-daemon` is a root-level flag and `--ignore-user-config` is an
|
|
50
|
+
* `exec`-level flag (root `--help` lists no `--ignore-user-config`;
|
|
51
|
+
* `exec --help` does). `-C/--cd`, `-a/--ask-for-approval` and
|
|
52
|
+
* `-s/--sandbox` are also root-level (there is no `-a` on `exec --help`;
|
|
53
|
+
* approval travels as the `-c approval_policy` override). `-m/--model`
|
|
54
|
+
* is global;
|
|
55
|
+
* `--skip-git-repo-check`, `--json` (JSONL thread/turn/item/error events),
|
|
56
|
+
* `-o/--output-last-message` and `--output-schema` belong to `exec`.
|
|
57
|
+
* `--ignore-user-config` skips `$CODEX_HOME/config.toml`; auth still
|
|
58
|
+
* resolves via `CODEX_HOME` (per root `--help`), so `CODEX_HOME` (or `HOME`
|
|
59
|
+
* for its default location) stays on the env allowlist and nothing else
|
|
60
|
+
* does. `codex mcp-server --help` still prints the root help on 0.161.0, so
|
|
61
|
+
* native MCP stays version-blocked; the AIWG `worker-invoke` bridge remains
|
|
62
|
+
* the MCP route. There is no `--effort` flag: effort travels only as the
|
|
63
|
+
* `-c model_reasoning_effort` config override, emitted as one argv token
|
|
64
|
+
* with TOML `"E"` quoting and no shell layer (`JSON.stringify`, never
|
|
65
|
+
* `'"E"'`). There is no qualified step-cap flag and no per-call subagent
|
|
66
|
+
* disable. The brief travels on stdin (`-` prompt argument, `< briefPath`);
|
|
67
|
+
* it never enters argv, `-c` values or the environment, which also keeps
|
|
68
|
+
* leading-dash briefs out of option parsing.
|
|
69
|
+
*
|
|
70
|
+
* Installed-module shape: static `interfaceVersion` and `register` exports
|
|
71
|
+
* so the #2885 installed loader can approve this file by digest under
|
|
72
|
+
* `installed:codex` (mirroring #2911 openhuman-adapter.mjs). The bottom
|
|
73
|
+
* self-registration targets the legacy Ralph-loop registry only; the direct
|
|
74
|
+
* worker profile loads through the installed loader.
|
|
75
|
+
*/
|
|
76
|
+
export const CODEX_SUPPORTED_VERSIONS = Object.freeze(['0.161.0']);
|
|
77
|
+
export const CODEX_DIRECT_EFFORT_VALUES = Object.freeze(['minimal', 'low', 'medium', 'high', 'xhigh']);
|
|
78
|
+
export const CODEX_DIRECT_SANDBOX_MODES = Object.freeze(['read-only', 'workspace-write']);
|
|
79
|
+
/** Non-prompting execution only: a requested `on-request` is refused. */
|
|
80
|
+
export const CODEX_DIRECT_APPROVAL_POLICIES = Object.freeze(['never']);
|
|
81
|
+
/** Brief transport for the direct profile: piped stdin, never argv. */
|
|
82
|
+
export const CODEX_DIRECT_STDIN = 'brief-text';
|
|
83
|
+
/** Generic Ralph-loop aliases resolve to the stale gpt-5.6 ladder; the
|
|
84
|
+
* direct profile requires an exact observed API model instead. */
|
|
85
|
+
const CODEX_GENERIC_ALIASES = Object.freeze(['opus', 'sonnet', 'haiku']);
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Summarize one `exec --json` stdout capture: event kinds, correlated
|
|
89
|
+
* thread/turn identities and any model the stream reports. `threadBound`
|
|
90
|
+
* requires `thread.started` plus `turn.started` with a single thread id
|
|
91
|
+
* across all carrying events and every completed turn previously started.
|
|
92
|
+
* `modelMismatch` is true when the stream names a model and the requested
|
|
93
|
+
* pin is not among them (an observed substitution must stop/review, never
|
|
94
|
+
* qualify). Used by the direct-worker conformance tests (CX04b) to detect
|
|
95
|
+
* a model substitution from a real `exec --json` run against the fixture.
|
|
96
|
+
* @param {unknown} stdout
|
|
97
|
+
* @param {unknown} requestedModel
|
|
98
|
+
*/
|
|
99
|
+
export function summarizeCodexStream(stdout, requestedModel) {
|
|
100
|
+
const kinds = [];
|
|
101
|
+
const threadIds = new Set();
|
|
102
|
+
const startedTurns = new Set();
|
|
103
|
+
const completedTurns = new Set();
|
|
104
|
+
const observedModels = new Set();
|
|
105
|
+
let malformed = 0;
|
|
106
|
+
for (const line of String(stdout ?? '').split('\n')) {
|
|
107
|
+
const trimmed = line.trim();
|
|
108
|
+
if (!trimmed) continue;
|
|
109
|
+
let event;
|
|
110
|
+
try {
|
|
111
|
+
event = JSON.parse(trimmed);
|
|
112
|
+
} catch {
|
|
113
|
+
malformed += 1;
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (!event || typeof event !== 'object' || typeof event.type !== 'string') {
|
|
117
|
+
malformed += 1;
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
kinds.push(event.type);
|
|
121
|
+
if (typeof event.thread_id === 'string' && event.thread_id) threadIds.add(event.thread_id);
|
|
122
|
+
if (typeof event.turn_id === 'string' && event.turn_id) {
|
|
123
|
+
if (event.type === 'turn.started') startedTurns.add(event.turn_id);
|
|
124
|
+
if (event.type === 'turn.completed' || event.type === 'turn.failed') completedTurns.add(event.turn_id);
|
|
125
|
+
}
|
|
126
|
+
if (typeof event.model === 'string' && event.model) observedModels.add(event.model);
|
|
127
|
+
}
|
|
128
|
+
const models = [...observedModels];
|
|
129
|
+
return {
|
|
130
|
+
kinds,
|
|
131
|
+
threadIds: [...threadIds],
|
|
132
|
+
startedTurns: [...startedTurns],
|
|
133
|
+
completedTurns: [...completedTurns],
|
|
134
|
+
observedModels: models,
|
|
135
|
+
observedModel: models.length === 1 ? models[0] : null,
|
|
136
|
+
malformed,
|
|
137
|
+
threadBound: kinds.includes('thread.started') && kinds.includes('turn.started')
|
|
138
|
+
&& threadIds.size === 1 && [...completedTurns].every(id => startedTurns.has(id)),
|
|
139
|
+
terminalObserved: kinds.includes('turn.completed') || kinds.includes('turn.failed'),
|
|
140
|
+
modelMismatch: models.length > 0 && (typeof requestedModel !== 'string' || !observedModels.has(requestedModel)),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export class CodexAdapter extends ProviderAdapter {
|
|
145
|
+
observeHealthEvent(event, source, binding) {
|
|
146
|
+
if (source.kind !== 'stdout' || !event || typeof event !== 'object') return null;
|
|
147
|
+
if (!healthEventMatchesBinding({ sessionId: event.thread_id }, binding)) return null;
|
|
148
|
+
if (event.type === 'thread.started' && typeof event.thread_id === 'string') return { kind: 'setup', sessionId: event.thread_id };
|
|
149
|
+
if (event.type === 'turn.started') return { kind: 'accepted', key: event.turn_id };
|
|
150
|
+
if (event.type === 'item.completed') {
|
|
151
|
+
const item = event.item;
|
|
152
|
+
if (!item || typeof item !== 'object') return null;
|
|
153
|
+
if (item.type === 'error' || item.status === 'failed' || (Number.isInteger(item.exit_code) && item.exit_code !== 0)) {
|
|
154
|
+
return classifyWorkerHealthFailure({ type: 'error', message: item.message }, { source, provider: 'codex' })
|
|
155
|
+
?? { kind: 'error', reasonCode: 'tool-failed' };
|
|
156
|
+
}
|
|
157
|
+
if (typeof item.id === 'string' && ['agent_message', 'command_execution', 'file_change', 'mcp_tool_call', 'web_search'].includes(item.type)) {
|
|
158
|
+
return { kind: 'progress', key: item.id };
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (event.type === 'item.started' || event.type === 'item.updated') return { kind: 'activity' };
|
|
162
|
+
if (event.type === 'turn.completed') return { kind: 'terminal', success: true, key: event.turn_id ?? 'turn.completed' };
|
|
163
|
+
if (event.type === 'error' || event.type === 'turn.failed') {
|
|
164
|
+
// A standalone `error` event fails the run exactly like `turn.failed`:
|
|
165
|
+
// the observer treats fatal errors as non-terminal-proof, so a later
|
|
166
|
+
// `turn.completed` with exit 0 cannot paper over them.
|
|
167
|
+
return { ...classifyWorkerHealthFailure({ type: 'error', message: event.message ?? event.error?.message }, { source, provider: 'codex' }),
|
|
168
|
+
fatal: true };
|
|
169
|
+
}
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
/** @returns {string} */
|
|
173
|
+
getBinary() {
|
|
174
|
+
return 'codex';
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/** @returns {string} */
|
|
178
|
+
getName() {
|
|
179
|
+
return 'codex';
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Codex has limited capabilities compared to Claude.
|
|
184
|
+
* @returns {import('./provider-adapter.mjs').ProviderCapabilities}
|
|
185
|
+
*/
|
|
186
|
+
getCapabilities() {
|
|
187
|
+
return {
|
|
188
|
+
streamJson: false,
|
|
189
|
+
sessionResume: false,
|
|
190
|
+
budgetControl: false,
|
|
191
|
+
systemPrompt: false,
|
|
192
|
+
agentMode: false,
|
|
193
|
+
mcpConfig: false,
|
|
194
|
+
maxTurns: false,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Driver-owned argv after the binary for the version-bound direct-shell
|
|
200
|
+
* profile. Every control is explicit: `--ignore-user-config` (user
|
|
201
|
+
* config.toml skipped, auth still via `CODEX_HOME`), exact observed
|
|
202
|
+
* model, explicit effort as one `-c model_reasoning_effort="E"` token
|
|
203
|
+
* (TOML `"E"` quoting via `JSON.stringify`; there is no shell in argv),
|
|
204
|
+
* explicit sandbox/approval (`never` only), the conductor workdir as
|
|
205
|
+
* `-C`, the final file as `-o`, the JSONL event stream as `--json` and
|
|
206
|
+
* `-` as the prompt argument so the brief arrives on stdin
|
|
207
|
+
* (`stdin: 'brief-text'`). Permission flags from the legacy Ralph loop
|
|
208
|
+
* (`--dangerously-bypass-approvals-and-sandbox`), guessed step caps and
|
|
209
|
+
* silent alias/default inheritance are never emitted. The brief is
|
|
210
|
+
* validated here but never placed in argv.
|
|
211
|
+
*
|
|
212
|
+
* @param {{ selected?: { model?: unknown, effort?: { value?: unknown } }, cwd?: unknown, brief?: unknown, finalPath?: unknown }} invocation
|
|
213
|
+
* @param {unknown} _profile
|
|
214
|
+
* @param {{ sandbox?: unknown, approval?: unknown }} [permissions]
|
|
215
|
+
* @returns {string[]}
|
|
216
|
+
*/
|
|
217
|
+
buildWorkerArgs(invocation, _profile, permissions) {
|
|
218
|
+
const model = invocation?.selected?.model;
|
|
219
|
+
if (typeof model !== 'string' || !model || model.includes('\0')) {
|
|
220
|
+
throw new Error('Codex worker requires an explicit model');
|
|
221
|
+
}
|
|
222
|
+
if (CODEX_GENERIC_ALIASES.includes(model.toLowerCase())) {
|
|
223
|
+
throw new Error(`Codex worker requires an exact observed model, not the generic alias '${model}'`);
|
|
224
|
+
}
|
|
225
|
+
const effort = invocation?.selected?.effort?.value ?? null;
|
|
226
|
+
if (effort === null || !CODEX_DIRECT_EFFORT_VALUES.includes(effort)) {
|
|
227
|
+
throw new Error('Codex worker requires an explicit qualified effort (never a CLI default)');
|
|
228
|
+
}
|
|
229
|
+
const sandbox = permissions?.sandbox ?? 'workspace-write';
|
|
230
|
+
if (!CODEX_DIRECT_SANDBOX_MODES.includes(sandbox)) {
|
|
231
|
+
throw new Error(`Codex worker sandbox is not a qualified direct mode: ${String(sandbox)}`);
|
|
232
|
+
}
|
|
233
|
+
const approval = permissions?.approval ?? 'never';
|
|
234
|
+
if (!CODEX_DIRECT_APPROVAL_POLICIES.includes(approval)) {
|
|
235
|
+
throw new Error(`Codex worker approval is not a qualified direct policy: ${String(approval)}`);
|
|
236
|
+
}
|
|
237
|
+
const cwd = invocation?.cwd;
|
|
238
|
+
if (typeof cwd !== 'string' || !cwd.startsWith('/') || cwd.includes('\0')) {
|
|
239
|
+
throw new Error('Codex worker requires an absolute workspace');
|
|
240
|
+
}
|
|
241
|
+
const finalPath = invocation?.finalPath;
|
|
242
|
+
if (typeof finalPath !== 'string' || !finalPath.startsWith('/') || finalPath.includes('\0')) {
|
|
243
|
+
throw new Error('Codex worker requires an absolute final-output path');
|
|
244
|
+
}
|
|
245
|
+
const brief = invocation?.brief;
|
|
246
|
+
if (typeof brief !== 'string' || !brief || brief.includes('\0')) {
|
|
247
|
+
throw new Error('Codex worker requires a non-empty brief');
|
|
248
|
+
}
|
|
249
|
+
return [
|
|
250
|
+
'--no-daemon',
|
|
251
|
+
'exec',
|
|
252
|
+
'--ignore-user-config',
|
|
253
|
+
'-m', model,
|
|
254
|
+
'-c', `model_reasoning_effort=${JSON.stringify(effort)}`,
|
|
255
|
+
'-s', sandbox,
|
|
256
|
+
'-C', cwd,
|
|
257
|
+
'-c', `approval_policy=${JSON.stringify(approval)}`,
|
|
258
|
+
'--skip-git-repo-check',
|
|
259
|
+
'-o', finalPath,
|
|
260
|
+
'--json',
|
|
261
|
+
'-',
|
|
262
|
+
];
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* `exec --json` has no stdin abort channel and stdin carries the brief to
|
|
267
|
+
* EOF, so cancellation stays with owned process control.
|
|
268
|
+
* @returns {null}
|
|
269
|
+
*/
|
|
270
|
+
getAbortInput() {
|
|
271
|
+
return null;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Build args for the main headless session.
|
|
276
|
+
*
|
|
277
|
+
* Codex uses `--full-auto` for headless operation and has a different
|
|
278
|
+
* argument structure than Claude.
|
|
279
|
+
*
|
|
280
|
+
* @param {import('./provider-adapter.mjs').SessionArgs} options
|
|
281
|
+
* @returns {string[]}
|
|
282
|
+
*/
|
|
283
|
+
buildSessionArgs(options) {
|
|
284
|
+
const args = [
|
|
285
|
+
// Codex requires the 'exec' subcommand for non-interactive (headless) use.
|
|
286
|
+
'exec',
|
|
287
|
+
// SECURITY: bypass ALL confirmation prompts and sandboxing.
|
|
288
|
+
// Required for headless operation in temp directories (UAT, daemon tasks).
|
|
289
|
+
// Equivalent to Claude's --dangerously-skip-permissions.
|
|
290
|
+
'--dangerously-bypass-approvals-and-sandbox',
|
|
291
|
+
// Allow running outside a git repository (temp dirs used by UAT and daemon).
|
|
292
|
+
'--skip-git-repo-check',
|
|
293
|
+
];
|
|
294
|
+
|
|
295
|
+
// Model selection (map generic to Codex-specific)
|
|
296
|
+
if (options.model) {
|
|
297
|
+
args.push('--model', this.mapModel(options.model));
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// Budget control not supported - warn if requested
|
|
301
|
+
if (options.budget) {
|
|
302
|
+
this.warnUnsupported('budgetControl', 'Budget control (--max-budget-usd)');
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// Max turns not supported
|
|
306
|
+
if (options.maxTurns) {
|
|
307
|
+
this.warnUnsupported('maxTurns', 'Max turns (--max-turns)');
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// Session ID not supported - each iteration is a fresh session
|
|
311
|
+
if (options.sessionId) {
|
|
312
|
+
this.warnUnsupported('sessionResume', 'Session resume (--session-id)');
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// MCP configuration not supported
|
|
316
|
+
if (options.mcpConfig) {
|
|
317
|
+
this.warnUnsupported('mcpConfig', 'MCP configuration (--mcp-config)');
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// System prompt: Codex doesn't support --append-system-prompt,
|
|
321
|
+
// so we prepend it to the main prompt
|
|
322
|
+
let prompt = options.prompt;
|
|
323
|
+
if (options.systemPrompt) {
|
|
324
|
+
prompt = `[System Context]\n${options.systemPrompt}\n\n[Task]\n${prompt}`;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// The prompt itself (must be last)
|
|
328
|
+
args.push(prompt);
|
|
329
|
+
|
|
330
|
+
return args;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Build args for short analysis calls (spawnSync).
|
|
335
|
+
*
|
|
336
|
+
* Codex analysis calls use the same basic pattern but with
|
|
337
|
+
* Codex-specific flags.
|
|
338
|
+
*
|
|
339
|
+
* @param {import('./provider-adapter.mjs').AnalysisArgs} options
|
|
340
|
+
* @returns {string[]}
|
|
341
|
+
*/
|
|
342
|
+
buildAnalysisArgs(options) {
|
|
343
|
+
const args = [
|
|
344
|
+
'exec',
|
|
345
|
+
'--dangerously-bypass-approvals-and-sandbox',
|
|
346
|
+
'--skip-git-repo-check',
|
|
347
|
+
];
|
|
348
|
+
|
|
349
|
+
// Model selection
|
|
350
|
+
if (options.model) {
|
|
351
|
+
args.push('--model', this.mapModel(options.model));
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// Agent flag not supported by Codex - inject agent context into prompt
|
|
355
|
+
if (options.agent) {
|
|
356
|
+
// Silently skip - agent context will be in the prompt itself
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// The analysis prompt (must be last)
|
|
360
|
+
args.push(options.prompt);
|
|
361
|
+
|
|
362
|
+
return args;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Map generic model names to Codex-specific models.
|
|
367
|
+
*
|
|
368
|
+
* Mirrors the catalog roles used by tools/agents/providers/codex.mjs:
|
|
369
|
+
* opus → gpt-5.6-sol
|
|
370
|
+
* sonnet → gpt-5.6-terra
|
|
371
|
+
* haiku → gpt-5.6-luna
|
|
372
|
+
*
|
|
373
|
+
* @param {string} genericModel
|
|
374
|
+
* @returns {string}
|
|
375
|
+
*/
|
|
376
|
+
mapModel(genericModel) {
|
|
377
|
+
const mapped = MODEL_MAP[genericModel.toLowerCase()];
|
|
378
|
+
if (mapped) return mapped;
|
|
379
|
+
// Pass through if already a Codex model name or unknown
|
|
380
|
+
return genericModel;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Environment overrides for headless Codex sessions.
|
|
385
|
+
* @returns {Object<string, string>}
|
|
386
|
+
*/
|
|
387
|
+
getEnvOverrides() {
|
|
388
|
+
return {
|
|
389
|
+
CI: 'true',
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* Codex does not store session transcripts in a known location.
|
|
395
|
+
* @returns {null}
|
|
396
|
+
*/
|
|
397
|
+
getTranscriptPath() {
|
|
398
|
+
return null;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* Parse Codex output - Codex returns plain text, not stream-json.
|
|
403
|
+
* We still try to extract JSON from the output for analysis results.
|
|
404
|
+
*
|
|
405
|
+
* @param {string} stdout
|
|
406
|
+
* @returns {Object|null}
|
|
407
|
+
*/
|
|
408
|
+
parseOutput(stdout) {
|
|
409
|
+
// Codex output is plain text. Try to find embedded JSON.
|
|
410
|
+
try {
|
|
411
|
+
const jsonMatch = stdout.match(/\{[\s\S]*\}/);
|
|
412
|
+
if (!jsonMatch) return null;
|
|
413
|
+
return JSON.parse(jsonMatch[0]);
|
|
414
|
+
} catch {
|
|
415
|
+
return null;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
// Self-register on import for the legacy Ralph loop only. The direct worker
|
|
421
|
+
// profile loads through the #2885 installed loader instead (see below).
|
|
422
|
+
registerProvider('codex', () => new CodexAdapter());
|
|
423
|
+
|
|
424
|
+
/** Installed-module interface version (mirrors #2911 openhuman-adapter.mjs). */
|
|
425
|
+
export const interfaceVersion = 1;
|
|
426
|
+
|
|
427
|
+
/** Installed-module registration: exactly the one approved adapter ID. */
|
|
428
|
+
export function register(factory) {
|
|
429
|
+
factory('codex', () => new CodexAdapter());
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
export default CodexAdapter;
|