@gajae-code/coding-agent 0.13.3 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +184 -2
- package/README.md +2 -0
- package/bin/gajaessi.js +4 -0
- package/dist/types/async/job-manager.d.ts +55 -2
- package/dist/types/async/support.d.ts +14 -0
- package/dist/types/capability/mcp.d.ts +6 -0
- package/dist/types/capability/types.d.ts +6 -0
- package/dist/types/cli/accounts-cli.d.ts +19 -0
- package/dist/types/cli/args.d.ts +3 -0
- package/dist/types/cli/config-cli.d.ts +6 -0
- package/dist/types/cli/crash-cli.d.ts +10 -0
- package/dist/types/cli/customize-doctor.d.ts +145 -0
- package/dist/types/cli/daemon-cli.d.ts +3 -1
- package/dist/types/cli/mcp-cli.d.ts +11 -0
- package/dist/types/cli/notify-cli.d.ts +1 -1
- package/dist/types/cli/root-flags.d.ts +12 -0
- package/dist/types/cli/setup-cli.d.ts +3 -1
- package/dist/types/cli/skills-cli.d.ts +2 -1
- package/dist/types/cli/update-cli.d.ts +19 -1
- package/dist/types/cli.d.ts +6 -0
- package/dist/types/commands/accounts.d.ts +40 -0
- package/dist/types/commands/crash.d.ts +24 -0
- package/dist/types/commands/customize.d.ts +22 -0
- package/dist/types/commands/daemon.d.ts +1 -1
- package/dist/types/commands/launch.d.ts +6 -0
- package/dist/types/commands/setup.d.ts +6 -0
- package/dist/types/commands/skills.d.ts +6 -1
- package/dist/types/commands/update.d.ts +7 -0
- package/dist/types/config/atomic-yaml-patch-worker.d.ts +25 -0
- package/dist/types/config/atomic-yaml-patch.d.ts +62 -2
- package/dist/types/config/config-schema-version.d.ts +10 -0
- package/dist/types/config/file-lock.d.ts +18 -0
- package/dist/types/config/model-profile-activation.d.ts +3 -1
- package/dist/types/config/model-registry.d.ts +9 -1
- package/dist/types/config/models-config-schema.d.ts +2 -0
- package/dist/types/config/settings-schema.d.ts +70 -6
- package/dist/types/config/settings.d.ts +63 -0
- package/dist/types/config/skill-settings-defaults.d.ts +26 -0
- package/dist/types/config/task-delegation.d.ts +39 -0
- package/dist/types/config/update-channel.d.ts +10 -0
- package/dist/types/coordinator-mcp/server.d.ts +5 -1
- package/dist/types/crash/index-store.d.ts +87 -0
- package/dist/types/crash/nudge.d.ts +50 -0
- package/dist/types/crash/record-loader.d.ts +17 -0
- package/dist/types/crash/report.d.ts +134 -0
- package/dist/types/crash/sanitize.d.ts +25 -0
- package/dist/types/cursor.d.ts +13 -2
- package/dist/types/customization/import.d.ts +37 -0
- package/dist/types/customization/index.d.ts +4 -0
- package/dist/types/customization/inventory.d.ts +25 -0
- package/dist/types/customization/mutations.d.ts +32 -0
- package/dist/types/customization/types.d.ts +115 -0
- package/dist/types/daemon/control-types.d.ts +8 -1
- package/dist/types/daemon/operator-contract.d.ts +4 -4
- package/dist/types/discovery/claude.d.ts +39 -1
- package/dist/types/discovery/codex.d.ts +39 -1
- package/dist/types/discovery/index.d.ts +2 -0
- package/dist/types/discovery/mcp-compat.d.ts +30 -0
- package/dist/types/edit/renderer.d.ts +23 -0
- package/dist/types/extensibility/extensions/runner.d.ts +3 -0
- package/dist/types/extensibility/extensions/types.d.ts +21 -4
- package/dist/types/extensibility/gjc-plugins/observability.d.ts +6 -1
- package/dist/types/extensibility/gjc-plugins/registry.d.ts +8 -1
- package/dist/types/extensibility/hooks/loader.d.ts +19 -5
- package/dist/types/extensibility/runtime-skill-discovery.d.ts +22 -1
- package/dist/types/extensibility/skill-management.d.ts +107 -0
- package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +3 -1
- package/dist/types/gjc-runtime/launch-worktree.d.ts +8 -0
- package/dist/types/gjc-runtime/linux-proc.d.ts +3 -0
- package/dist/types/gjc-runtime/ralplan-runtime.d.ts +10 -6
- package/dist/types/gjc-runtime/session-state-lock.d.ts +104 -0
- package/dist/types/gjc-runtime/session-state-sidecar.d.ts +120 -2
- package/dist/types/gjc-runtime/state-writer.d.ts +10 -1
- package/dist/types/gjc-runtime/ultragoal-guard.d.ts +4 -2
- package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +8 -6
- package/dist/types/gjc-runtime/workflow-settings.d.ts +109 -0
- package/dist/types/hooks/events.d.ts +60 -0
- package/dist/types/hooks/normalize.d.ts +83 -0
- package/dist/types/hooks/skill-state.d.ts +9 -2
- package/dist/types/main.d.ts +1 -1
- package/dist/types/modes/acp/abort-scope.d.ts +13 -0
- package/dist/types/modes/acp/acp-agent.d.ts +7 -4
- package/dist/types/modes/components/customization/customization-dashboard.d.ts +44 -0
- package/dist/types/modes/components/customization/import-wizard.d.ts +21 -0
- package/dist/types/modes/components/customization/index.d.ts +1 -0
- package/dist/types/modes/components/gajae-pet-widget.d.ts +8 -30
- package/dist/types/modes/components/irc-sidebar.d.ts +1 -0
- package/dist/types/modes/components/iterm-pet-transport.d.ts +122 -0
- package/dist/types/modes/components/oauth-selector.d.ts +10 -4
- package/dist/types/modes/components/pet-capability.d.ts +11 -25
- package/dist/types/modes/components/status-line/gh.d.ts +6 -2
- package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
- package/dist/types/modes/controllers/selector-controller.d.ts +7 -8
- package/dist/types/modes/controllers/stt-controller.d.ts +1 -1
- package/dist/types/modes/interactive-mode.d.ts +1 -0
- package/dist/types/modes/types.d.ts +1 -0
- package/dist/types/modes/utils/injected-user-submission.d.ts +10 -0
- package/dist/types/runtime-mcp/config.d.ts +9 -0
- package/dist/types/runtime-mcp/manager.d.ts +26 -1
- package/dist/types/runtime-mcp/oauth-discovery.d.ts +4 -0
- package/dist/types/runtime-mcp/oauth-flow.d.ts +24 -1
- package/dist/types/runtime-mcp/pool-key.d.ts +2 -0
- package/dist/types/runtime-mcp/protocol.d.ts +278 -0
- package/dist/types/runtime-mcp/scope-config.d.ts +29 -0
- package/dist/types/runtime-mcp/tool-bridge.d.ts +15 -13
- package/dist/types/runtime-mcp/transports/http.d.ts +9 -0
- package/dist/types/runtime-mcp/types.d.ts +102 -10
- package/dist/types/sdk/acp/adapter.d.ts +26 -5
- package/dist/types/sdk/broker/broker.d.ts +3 -55
- package/dist/types/sdk/broker/lifecycle.d.ts +18 -12
- package/dist/types/sdk/broker/session-index.d.ts +14 -5
- package/dist/types/sdk/broker/startup-failure.d.ts +16 -1
- package/dist/types/sdk/bus/chat-daemon-control.d.ts +51 -1
- package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -41
- package/dist/types/sdk/bus/config.d.ts +11 -0
- package/dist/types/sdk/bus/conversation-store.d.ts +0 -1
- package/dist/types/sdk/bus/daemon-paths.d.ts +6 -0
- package/dist/types/sdk/bus/discord-conversation.d.ts +2 -0
- package/dist/types/sdk/bus/discord-daemon.d.ts +17 -12
- package/dist/types/sdk/bus/existing-thread-readiness.d.ts +4 -34
- package/dist/types/sdk/bus/inbound-reaction-ordering.d.ts +61 -0
- package/dist/types/sdk/bus/index.d.ts +85 -99
- package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +29 -7
- package/dist/types/sdk/bus/managed-daemon.d.ts +2 -32
- package/dist/types/sdk/bus/notification-service.d.ts +52 -0
- package/dist/types/sdk/bus/operator-runtime.d.ts +1 -1
- package/dist/types/sdk/bus/prompt-reconciliation.d.ts +16 -5
- package/dist/types/sdk/bus/reconciliation-store.d.ts +113 -5
- package/dist/types/sdk/bus/session-control.d.ts +25 -1
- package/dist/types/sdk/bus/slack-conversation.d.ts +4 -0
- package/dist/types/sdk/bus/slack-daemon.d.ts +9 -17
- package/dist/types/sdk/bus/slack-live-provider.d.ts +3 -1
- package/dist/types/sdk/bus/slack-provider.d.ts +4 -0
- package/dist/types/sdk/bus/slack-thread-binding.d.ts +6 -40
- package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +30 -104
- package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +10 -0
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +262 -19
- package/dist/types/sdk/bus/telegram-daemon-orphan-reap.d.ts +125 -0
- package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +22 -0
- package/dist/types/sdk/bus/telegram-daemon.d.ts +119 -310
- package/dist/types/sdk/bus/telegram-reference.d.ts +1 -47
- package/dist/types/sdk/bus/threaded-render.d.ts +1 -0
- package/dist/types/sdk/bus/topic-registry.d.ts +33 -17
- package/dist/types/sdk/cli/rows.d.ts +2 -11
- package/dist/types/sdk/cli/session-cli.d.ts +15 -25
- package/dist/types/sdk/client/client.d.ts +97 -1
- package/dist/types/sdk/host/control/dispatch.d.ts +0 -7
- package/dist/types/sdk/host/control/index.d.ts +1 -1
- package/dist/types/sdk/host/control/operations.d.ts +18 -5
- package/dist/types/sdk/host/control/runtime-gate.d.ts +19 -0
- package/dist/types/sdk/host/host.d.ts +15 -1
- package/dist/types/sdk/host/query/handlers.d.ts +5 -0
- package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
- package/dist/types/sdk/host/session-runtime.d.ts +127 -7
- package/dist/types/sdk/host/types.d.ts +1 -1
- package/dist/types/sdk/host/websocket-transport.d.ts +1 -1
- package/dist/types/sdk/index.d.ts +2 -1
- package/dist/types/sdk/lifecycle/broker-client.d.ts +8 -0
- package/dist/types/sdk/lifecycle/client.d.ts +59 -0
- package/dist/types/sdk/lifecycle/index.d.ts +3 -0
- package/dist/types/sdk/lifecycle/service.d.ts +232 -0
- package/dist/types/sdk/mcp/server.d.ts +9 -6
- package/dist/types/sdk/prompt-deadline-lease.d.ts +43 -0
- package/dist/types/sdk/prompt-deadline-manager.d.ts +28 -0
- package/dist/types/sdk/prompt-status.d.ts +10 -3
- package/dist/types/sdk/protocol/operation-registry.d.ts +5 -0
- package/dist/types/sdk/receipt-state.d.ts +17 -0
- package/dist/types/sdk/reconciliation-extensions.d.ts +2 -0
- package/dist/types/sdk/router/index.d.ts +1 -0
- package/dist/types/sdk/router/session-router.d.ts +152 -0
- package/dist/types/sdk/session-list.d.ts +22 -0
- package/dist/types/sdk/session-reconnect.d.ts +43 -1
- package/dist/types/sdk/session.d.ts +34 -1
- package/dist/types/sdk/transport/serve-cli.d.ts +1 -4
- package/dist/types/session/account-inventory.d.ts +86 -0
- package/dist/types/session/agent-session.d.ts +145 -6
- package/dist/types/session/agent-storage.d.ts +10 -0
- package/dist/types/session/coordinator-tool-label.d.ts +28 -0
- package/dist/types/session/internal/managed-session-storage.d.ts +23 -4
- package/dist/types/session/messages.d.ts +1 -1
- package/dist/types/session/secure-token-file.d.ts +3 -0
- package/dist/types/session/session-manager.d.ts +40 -1
- package/dist/types/session/startup-auth-config.d.ts +44 -0
- package/dist/types/session/terminal-abort.d.ts +378 -0
- package/dist/types/session/yield-queue.d.ts +7 -0
- package/dist/types/session-import/claude.d.ts +26 -0
- package/dist/types/session-import/codex.d.ts +88 -0
- package/dist/types/session-import/command.d.ts +35 -0
- package/dist/types/session-import/detect.d.ts +22 -0
- package/dist/types/session-import/index.d.ts +7 -0
- package/dist/types/session-import/provider-codex.d.ts +22 -0
- package/dist/types/session-import/provider-service.d.ts +38 -0
- package/dist/types/session-import/redact.d.ts +23 -0
- package/dist/types/session-import/service.d.ts +47 -0
- package/dist/types/session-import/types.d.ts +120 -0
- package/dist/types/setup/paseo/check.d.ts +16 -0
- package/dist/types/setup/paseo/install-saga.d.ts +115 -0
- package/dist/types/setup/paseo/json-publisher.d.ts +76 -0
- package/dist/types/setup/paseo/orchestration-preferences.d.ts +24 -0
- package/dist/types/setup/paseo/paseo-ownership.d.ts +87 -0
- package/dist/types/setup/paseo/paseo-setup.d.ts +29 -0
- package/dist/types/setup/paseo/provider-config.d.ts +35 -0
- package/dist/types/setup/paseo/remove.d.ts +14 -0
- package/dist/types/setup/paseo/result-types.d.ts +59 -0
- package/dist/types/setup/paseo/setup-deps.d.ts +73 -0
- package/dist/types/setup/paseo/skills-bridge.d.ts +44 -0
- package/dist/types/skill-state/active-state.d.ts +5 -1
- package/dist/types/slash-commands/acp-builtins.d.ts +5 -1
- package/dist/types/slash-commands/builtin-registry.d.ts +2 -0
- package/dist/types/slash-commands/helpers/credential-switch.d.ts +12 -0
- package/dist/types/slash-commands/helpers/usage-report.d.ts +5 -6
- package/dist/types/slash-commands/types.d.ts +7 -1
- package/dist/types/task/executor.d.ts +10 -0
- package/dist/types/task/index.d.ts +3 -1
- package/dist/types/tools/ask-answer-registry.d.ts +6 -3
- package/dist/types/tools/bash-sleep-advisory.d.ts +14 -0
- package/dist/types/tools/bash.d.ts +2 -6
- package/dist/types/tools/browser/attach.d.ts +11 -0
- package/dist/types/tools/browser/launch.d.ts +20 -0
- package/dist/types/tools/browser/profile-discovery.d.ts +6 -0
- package/dist/types/tools/browser/render.d.ts +1 -0
- package/dist/types/tools/browser.d.ts +3 -1
- package/dist/types/tools/image-gen.d.ts +9 -2
- package/dist/types/tools/index.d.ts +8 -0
- package/dist/types/tools/monitor.d.ts +1 -1
- package/dist/types/tools/skill-discovery.d.ts +8 -1
- package/dist/types/tools/subagent.d.ts +2 -0
- package/dist/types/tools/ultragoal-ask-guard.d.ts +2 -2
- package/dist/types/utils/herdr-pane.d.ts +76 -0
- package/package.json +19 -9
- package/scripts/build-binary.ts +2 -1
- package/scripts/build-sdk-package-smoke.ts +2 -13
- package/scripts/capture-sticky-viewport-showcase.ts +0 -1
- package/scripts/compile-args.ts +2 -0
- package/scripts/generate-sdk-adapter-parity-manifest.ts +31 -16
- package/scripts/generate-sdk-operation-inventory.ts +28 -0
- package/scripts/generate-telegram-baseline-manifest.ts +1 -0
- package/scripts/generate-tool-catalog.ts +6 -4
- package/scripts/verify-gjc-sdk-canonicalization.ts +5 -39
- package/src/async/job-manager.ts +352 -17
- package/src/async/support.ts +25 -0
- package/src/autoresearch/dashboard.ts +28 -13
- package/src/capability/index.ts +3 -1
- package/src/capability/mcp.ts +6 -0
- package/src/capability/types.ts +6 -0
- package/src/cli/accounts-cli.ts +395 -0
- package/src/cli/args.ts +23 -0
- package/src/cli/auth-broker-cli.ts +136 -66
- package/src/cli/auth-gateway-cli.ts +94 -70
- package/src/cli/config-cli.ts +27 -2
- package/src/cli/crash-cli.ts +78 -0
- package/src/cli/customize-doctor.ts +1605 -0
- package/src/cli/daemon-cli.ts +12 -3
- package/src/cli/fast-help.ts +1 -0
- package/src/cli/mcp-cli.ts +128 -60
- package/src/cli/notify-cli.ts +8 -14
- package/src/cli/root-flags.ts +8 -0
- package/src/cli/setup-cli.ts +145 -0
- package/src/cli/skills-cli.ts +38 -2
- package/src/cli/update-cli.ts +167 -12
- package/src/cli.ts +4 -0
- package/src/commands/accounts.ts +71 -0
- package/src/commands/crash.ts +35 -0
- package/src/commands/customize.ts +84 -0
- package/src/commands/daemon.ts +2 -2
- package/src/commands/deep-interview.ts +2 -0
- package/src/commands/launch.ts +1 -0
- package/src/commands/mcp.ts +12 -7
- package/src/commands/ralplan.ts +2 -0
- package/src/commands/sdk.ts +65 -32
- package/src/commands/setup.ts +5 -0
- package/src/commands/skills.ts +14 -4
- package/src/commands/ultragoal.ts +10 -1
- package/src/commands/update.ts +26 -15
- package/src/config/atomic-yaml-patch-worker.ts +57 -0
- package/src/config/atomic-yaml-patch.ts +769 -29
- package/src/config/config-schema-version.ts +10 -0
- package/src/config/file-lock.ts +70 -1
- package/src/config/mcp-schema.json +52 -14
- package/src/config/model-profile-activation.ts +20 -1
- package/src/config/model-profiles.ts +29 -19
- package/src/config/model-registry.ts +132 -21
- package/src/config/models-config-schema.ts +1 -1
- package/src/config/settings-schema.ts +76 -6
- package/src/config/settings.ts +4038 -199
- package/src/config/skill-settings-defaults.ts +41 -3
- package/src/config/task-delegation.ts +87 -0
- package/src/config/update-channel.ts +23 -0
- package/src/coordinator-mcp/server.ts +377 -308
- package/src/crash/index-store.ts +723 -0
- package/src/crash/nudge.ts +89 -0
- package/src/crash/record-loader.ts +149 -0
- package/src/crash/report.ts +551 -0
- package/src/crash/sanitize.ts +129 -0
- package/src/cursor.ts +36 -10
- package/src/customization/import.ts +946 -0
- package/src/customization/index.ts +4 -0
- package/src/customization/inventory.ts +335 -0
- package/src/customization/mutations.ts +141 -0
- package/src/customization/types.ts +223 -0
- package/src/daemon/control-types.ts +8 -1
- package/src/daemon/operator-contract.ts +6 -6
- package/src/defaults/gjc/skills/deep-interview/SKILL.md +11 -22
- package/src/defaults/gjc/skills/ralplan/SKILL.md +36 -23
- package/src/defaults/gjc/skills/ultragoal/SKILL.md +16 -0
- package/src/discovery/claude-hooks.ts +38 -0
- package/src/discovery/claude.ts +142 -209
- package/src/discovery/codex-hooks.ts +38 -0
- package/src/discovery/codex.ts +132 -198
- package/src/discovery/helpers.ts +8 -1
- package/src/discovery/index.ts +2 -0
- package/src/discovery/mcp-compat.ts +234 -0
- package/src/discovery/mcp-json.ts +6 -0
- package/src/edit/renderer.ts +40 -0
- package/src/edit/streaming.ts +4 -2
- package/src/exec/bash-executor.ts +24 -20
- package/src/export/html/index.ts +51 -2
- package/src/extensibility/extensions/loader.ts +9 -1
- package/src/extensibility/extensions/runner.ts +17 -4
- package/src/extensibility/extensions/types.ts +31 -6
- package/src/extensibility/gjc-plugins/constrained-hooks.ts +33 -0
- package/src/extensibility/gjc-plugins/installer.ts +9 -5
- package/src/extensibility/gjc-plugins/observability.ts +8 -2
- package/src/extensibility/gjc-plugins/registry.ts +13 -2
- package/src/extensibility/gjc-plugins/runtime-adapters.ts +3 -1
- package/src/extensibility/gjc-plugins/schema.ts +222 -39
- package/src/extensibility/hooks/loader.ts +154 -10
- package/src/extensibility/runtime-skill-discovery.ts +257 -60
- package/src/extensibility/skill-management.ts +368 -0
- package/src/extensibility/skills.ts +52 -16
- package/src/gjc-runtime/deep-interview-runtime.ts +45 -61
- package/src/gjc-runtime/launch-worktree.ts +56 -2
- package/src/gjc-runtime/linux-proc.ts +7 -1
- package/src/gjc-runtime/ralplan-runtime.ts +100 -164
- package/src/gjc-runtime/session-state-lock.ts +992 -0
- package/src/gjc-runtime/session-state-sidecar.ts +644 -142
- package/src/gjc-runtime/state-writer.ts +39 -14
- package/src/gjc-runtime/tmux-owner-isolation.ts +5 -4
- package/src/gjc-runtime/ultragoal-guard.ts +11 -4
- package/src/gjc-runtime/ultragoal-runtime.ts +44 -41
- package/src/gjc-runtime/workflow-settings.ts +596 -0
- package/src/goals/tools/goal-tool.ts +6 -1
- package/src/hooks/events.ts +291 -0
- package/src/hooks/native-skill-hook.ts +4 -0
- package/src/hooks/normalize.ts +369 -0
- package/src/hooks/skill-state.ts +165 -46
- package/src/internal-urls/docs-index.generated.ts +40 -32
- package/src/main.ts +32 -5
- package/src/migrate/mcp-mapper.ts +25 -2
- package/src/modes/acp/abort-scope.ts +29 -0
- package/src/modes/acp/acp-agent.ts +423 -98
- package/src/modes/components/assistant-message.ts +6 -1
- package/src/modes/components/customization/customization-dashboard.ts +443 -0
- package/src/modes/components/customization/import-wizard.ts +372 -0
- package/src/modes/components/customization/index.ts +1 -0
- package/src/modes/components/gajae-pet-widget.ts +539 -213
- package/src/modes/components/irc-sidebar.ts +11 -0
- package/src/modes/components/iterm-pet-transport.ts +585 -0
- package/src/modes/components/oauth-selector.ts +277 -86
- package/src/modes/components/pet-capability.ts +39 -40
- package/src/modes/components/settings-selector.ts +9 -0
- package/src/modes/components/status-line/gh.ts +45 -1
- package/src/modes/components/status-line/segments.ts +16 -1
- package/src/modes/components/tool-status-header.ts +13 -3
- package/src/modes/controllers/command-controller.ts +20 -8
- package/src/modes/controllers/extension-ui-controller.ts +56 -257
- package/src/modes/controllers/input-controller.ts +10 -0
- package/src/modes/controllers/runtime-mcp-command-controller.ts +16 -3
- package/src/modes/controllers/selector-controller.ts +177 -72
- package/src/modes/controllers/stt-controller.ts +3 -3
- package/src/modes/interactive-mode.ts +88 -16
- package/src/modes/print-mode.ts +35 -6
- package/src/modes/runtime-init.ts +21 -68
- package/src/modes/types.ts +1 -0
- package/src/modes/utils/injected-user-submission.ts +25 -0
- package/src/modes/utils/terminal-bell.ts +15 -1
- package/src/prompts/agent-fragments/ralplan-persistence.md +1 -1
- package/src/prompts/agent-fragments/restricted-bash.md +1 -1
- package/src/prompts/agents/critic.md +1 -1
- package/src/prompts/system/rlm-research.md +1 -1
- package/src/prompts/system/system-prompt.md +0 -2
- package/src/prompts/tools/bash.md +7 -1
- package/src/prompts/tools/browser.md +1 -1
- package/src/prompts/tools/cron.md +6 -6
- package/src/prompts/tools/read.md +0 -2
- package/src/prompts/tools/skill-discovery.md +4 -2
- package/src/runtime-mcp/client.ts +427 -23
- package/src/runtime-mcp/config.ts +37 -5
- package/src/runtime-mcp/manager-pool.test.ts +56 -0
- package/src/runtime-mcp/manager.ts +52 -2
- package/src/runtime-mcp/oauth-discovery.ts +13 -0
- package/src/runtime-mcp/oauth-flow.ts +46 -1
- package/src/runtime-mcp/pool-key.ts +5 -1
- package/src/runtime-mcp/pool.test.ts +9 -0
- package/src/runtime-mcp/protocol.test.ts +353 -0
- package/src/runtime-mcp/protocol.ts +624 -0
- package/src/runtime-mcp/scope-config.ts +78 -0
- package/src/runtime-mcp/tool-bridge.ts +44 -10
- package/src/runtime-mcp/transports/http.ts +84 -13
- package/src/runtime-mcp/types.ts +123 -12
- package/src/sdk/acp/adapter.ts +328 -97
- package/src/sdk/broker/broker.ts +160 -741
- package/src/sdk/broker/ensure.ts +9 -1
- package/src/sdk/broker/lifecycle.ts +510 -116
- package/src/sdk/broker/operation-receipt-ledger.ts +11 -2
- package/src/sdk/broker/process-incarnation.ts +19 -0
- package/src/sdk/broker/session-index.ts +516 -117
- package/src/sdk/broker/startup-failure.ts +28 -5
- package/src/sdk/broker/transport.ts +1 -13
- package/src/sdk/bus/chat-daemon-cli.ts +4 -2
- package/src/sdk/bus/chat-daemon-control.ts +67 -6
- package/src/sdk/bus/chat-daemon-runtime.ts +183 -859
- package/src/sdk/bus/config.ts +13 -0
- package/src/sdk/bus/conversation-store.ts +59 -171
- package/src/sdk/bus/daemon-paths.ts +20 -0
- package/src/sdk/bus/discord-conversation.ts +2 -0
- package/src/sdk/bus/discord-daemon.ts +524 -126
- package/src/sdk/bus/discord-live-provider.ts +206 -79
- package/src/sdk/bus/existing-thread-readiness.ts +4 -97
- package/src/sdk/bus/inbound-reaction-ordering.ts +122 -0
- package/src/sdk/bus/index.ts +2480 -456
- package/src/sdk/bus/kind-aware-reconciliation.ts +204 -34
- package/src/sdk/bus/lifecycle-commands.ts +2 -2
- package/src/sdk/bus/managed-daemon.ts +2 -145
- package/src/sdk/bus/notification-service.ts +196 -0
- package/src/sdk/bus/operator-runtime.ts +1 -1
- package/src/sdk/bus/prompt-reconciliation.ts +24 -15
- package/src/sdk/bus/reconciliation-store.ts +553 -24
- package/src/sdk/bus/session-control.ts +49 -3
- package/src/sdk/bus/slack-conversation.ts +4 -0
- package/src/sdk/bus/slack-daemon.ts +733 -134
- package/src/sdk/bus/slack-live-provider.ts +65 -15
- package/src/sdk/bus/slack-provider.ts +4 -0
- package/src/sdk/bus/slack-thread-binding.ts +9 -104
- package/src/sdk/bus/telegram-adoption-intent.ts +299 -209
- package/src/sdk/bus/telegram-daemon-cli.ts +194 -7
- package/src/sdk/bus/telegram-daemon-contract.ts +265 -19
- package/src/sdk/bus/telegram-daemon-control.ts +3 -13
- package/src/sdk/bus/telegram-daemon-orphan-reap.ts +498 -0
- package/src/sdk/bus/telegram-daemon-owner-registry.ts +176 -0
- package/src/sdk/bus/telegram-daemon.ts +2552 -2280
- package/src/sdk/bus/telegram-reference.ts +1 -226
- package/src/sdk/bus/telegram-setup.ts +2 -2
- package/src/sdk/bus/threaded-render.ts +1 -0
- package/src/sdk/bus/topic-registry.ts +279 -146
- package/src/sdk/cli/rows.ts +2 -35
- package/src/sdk/cli/session-cli.ts +776 -700
- package/src/sdk/client/client.ts +892 -1
- package/src/sdk/host/control/dispatch.ts +93 -58
- package/src/sdk/host/control/index.ts +1 -1
- package/src/sdk/host/control/operations.ts +18 -10
- package/src/sdk/host/control/runtime-gate.ts +40 -0
- package/src/sdk/host/host.ts +63 -12
- package/src/sdk/host/query/handlers.ts +66 -7
- package/src/sdk/host/reverse-leases.ts +2 -2
- package/src/sdk/host/sdk-surface-parity.test.ts +1 -1
- package/src/sdk/host/session-runtime.test.ts +2787 -34
- package/src/sdk/host/session-runtime.ts +1489 -101
- package/src/sdk/host/surface-policy.ts +12 -8
- package/src/sdk/host/types.ts +1 -1
- package/src/sdk/host/websocket-transport.lifecycle.test.ts +31 -59
- package/src/sdk/host/websocket-transport.ts +85 -50
- package/src/sdk/index.ts +2 -1
- package/src/sdk/lifecycle/broker-client.ts +53 -0
- package/src/sdk/lifecycle/client.ts +234 -0
- package/src/sdk/lifecycle/index.ts +3 -0
- package/src/sdk/{bus/recent-activity.ts → lifecycle/recent-sessions.ts} +5 -2
- package/src/sdk/lifecycle/service.ts +720 -0
- package/src/sdk/mcp/server.ts +226 -188
- package/src/sdk/prompt-deadline-lease.ts +55 -0
- package/src/sdk/prompt-deadline-manager.ts +148 -0
- package/src/sdk/prompt-status.ts +11 -3
- package/src/sdk/protocol/operation-inventory.generated.json +272 -129
- package/src/sdk/protocol/operation-registry.ts +71 -8
- package/src/sdk/receipt-state.ts +43 -0
- package/src/sdk/reconciliation-extensions.ts +14 -0
- package/src/sdk/router/index.ts +1 -0
- package/src/sdk/router/session-router.ts +1658 -0
- package/src/sdk/session-list.ts +93 -0
- package/src/sdk/session-reconnect.ts +45 -1
- package/src/sdk/session.ts +716 -120
- package/src/sdk/transport/serve-cli.ts +18 -34
- package/src/session/account-inventory.ts +603 -0
- package/src/session/agent-session.ts +2857 -582
- package/src/session/agent-storage.ts +35 -0
- package/src/session/blob-store.ts +32 -1
- package/src/session/coordinator-tool-label.ts +40 -0
- package/src/session/internal/managed-session-scope.ts +4 -0
- package/src/session/internal/managed-session-storage.ts +173 -12
- package/src/session/messages.ts +1 -1
- package/src/session/secure-token-file.ts +80 -0
- package/src/session/session-manager.ts +730 -58
- package/src/session/session-storage.ts +25 -16
- package/src/session/startup-auth-config.ts +297 -0
- package/src/session/terminal-abort.ts +1253 -0
- package/src/session/yield-queue.ts +57 -15
- package/src/session-import/claude.ts +334 -0
- package/src/session-import/codex.ts +1033 -0
- package/src/session-import/command.ts +77 -0
- package/src/session-import/detect.ts +133 -0
- package/src/session-import/index.ts +7 -0
- package/src/session-import/provider-codex.ts +327 -0
- package/src/session-import/provider-service.ts +457 -0
- package/src/session-import/redact.ts +128 -0
- package/src/session-import/service.ts +1264 -0
- package/src/session-import/types.ts +148 -0
- package/src/setup/paseo/check.ts +213 -0
- package/src/setup/paseo/install-saga.ts +293 -0
- package/src/setup/paseo/json-publisher.ts +263 -0
- package/src/setup/paseo/orchestration-preferences.ts +86 -0
- package/src/setup/paseo/paseo-ownership.ts +224 -0
- package/src/setup/paseo/paseo-setup.ts +253 -0
- package/src/setup/paseo/provider-config.ts +139 -0
- package/src/setup/paseo/remove.ts +183 -0
- package/src/setup/paseo/result-types.ts +79 -0
- package/src/setup/paseo/setup-deps.ts +175 -0
- package/src/setup/paseo/skills-bridge.ts +260 -0
- package/src/skill-state/active-state.ts +21 -11
- package/src/slash-commands/acp-builtins.ts +9 -1
- package/src/slash-commands/builtin-registry.ts +98 -16
- package/src/slash-commands/helpers/credential-switch.ts +143 -0
- package/src/slash-commands/helpers/mcp.ts +9 -3
- package/src/slash-commands/helpers/usage-report.ts +61 -56
- package/src/slash-commands/types.ts +7 -2
- package/src/task/executor.ts +30 -11
- package/src/task/index.ts +66 -7
- package/src/task/render.ts +23 -9
- package/src/tools/ask-answer-registry.ts +23 -7
- package/src/tools/ask.ts +8 -4
- package/src/tools/bash-sleep-advisory.ts +115 -0
- package/src/tools/bash.ts +98 -18
- package/src/tools/browser/attach.ts +71 -3
- package/src/tools/browser/launch.ts +86 -13
- package/src/tools/browser/profile-discovery.ts +57 -7
- package/src/tools/browser/render.ts +8 -1
- package/src/tools/browser.ts +130 -21
- package/src/tools/computer.enforcement.test.ts +1 -1
- package/src/tools/computer.ts +3 -2
- package/src/tools/cron.ts +12 -1
- package/src/tools/image-gen.ts +27 -16
- package/src/tools/index.ts +8 -0
- package/src/tools/job.ts +33 -6
- package/src/tools/monitor.ts +41 -2
- package/src/tools/skill-discovery.ts +21 -29
- package/src/tools/subagent.ts +142 -24
- package/src/tools/tool-catalog.generated.ts +6 -6
- package/src/tools/ultragoal-ask-guard.ts +10 -3
- package/src/utils/herdr-pane.ts +345 -0
- package/src/utils/title-generator.ts +2 -0
- package/src/web/scrapers/index.ts +6 -4
- package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
- package/dist/types/defaults/gjc-defaults.test.d.ts +0 -1
- package/dist/types/memory-backend/lazy-loading.test.d.ts +0 -1
- package/dist/types/runtime/boot-ordering.test.d.ts +0 -1
- package/dist/types/runtime/lazy-service.test.d.ts +0 -1
- package/dist/types/runtime/network-prewarm-service.test.d.ts +0 -1
- package/dist/types/runtime/workspace-tree-service.test.d.ts +0 -1
- package/dist/types/runtime-mcp/config.test.d.ts +0 -1
- package/dist/types/runtime-mcp/http.test.d.ts +0 -1
- package/dist/types/runtime-mcp/manager-pool.test.d.ts +0 -1
- package/dist/types/runtime-mcp/pool-key.test.d.ts +0 -1
- package/dist/types/runtime-mcp/pool.test.d.ts +0 -1
- package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +0 -117
- package/dist/types/sdk/bus/lifecycle-orchestrator.d.ts +0 -141
- package/dist/types/sdk/bus/telegram-cli.d.ts +0 -31
- package/dist/types/sdk/elevation/allowlist.d.ts +0 -20
- package/dist/types/sdk/elevation/audit.d.ts +0 -93
- package/dist/types/sdk/elevation/capability.d.ts +0 -3
- package/dist/types/sdk/elevation/digest.d.ts +0 -72
- package/dist/types/sdk/elevation/dispatch-receipt.d.ts +0 -85
- package/dist/types/sdk/elevation/grant-ledger.d.ts +0 -163
- package/dist/types/sdk/elevation/owner.d.ts +0 -48
- package/dist/types/sdk/host/import-graph.test.d.ts +0 -1
- package/dist/types/sdk/host/sdk-surface-parity.test.d.ts +0 -1
- package/dist/types/sdk/host/session-runtime.test.d.ts +0 -1
- package/dist/types/sdk/host/websocket-transport.lifecycle.test.d.ts +0 -1
- package/dist/types/session/auth-broker-config.d.ts +0 -13
- package/dist/types/session/heap-eviction-artifacts.test.d.ts +0 -1
- package/dist/types/skills/skills.test.d.ts +0 -1
- package/dist/types/slash-commands/notify-command.test.d.ts +0 -1
- package/dist/types/task/token-log.test.d.ts +0 -1
- package/dist/types/tools/computer.enforcement.test.d.ts +0 -1
- package/dist/types/tools/descriptors.test.d.ts +0 -1
- package/scripts/g005-daemon-smoke.ts +0 -180
- package/scripts/g011-daemon-path-smoke.ts +0 -153
- package/src/sdk/bus/lifecycle-control-runtime.ts +0 -1733
- package/src/sdk/bus/lifecycle-orchestrator.ts +0 -489
- package/src/sdk/bus/telegram-cli.ts +0 -212
- package/src/sdk/elevation/allowlist.ts +0 -54
- package/src/sdk/elevation/audit.ts +0 -208
- package/src/sdk/elevation/capability.ts +0 -41
- package/src/sdk/elevation/digest.ts +0 -129
- package/src/sdk/elevation/dispatch-receipt.ts +0 -184
- package/src/sdk/elevation/grant-ledger.ts +0 -1142
- package/src/sdk/elevation/owner.ts +0 -109
- package/src/session/auth-broker-config.ts +0 -109
- /package/dist/types/{ai-core-import-gate.test.d.ts → discovery/claude-hooks.d.ts} +0 -0
- /package/dist/types/{cli/fixture-report.test.d.ts → discovery/codex-hooks.d.ts} +0 -0
- /package/dist/types/sdk/{bus/recent-activity.d.ts → lifecycle/recent-sessions.d.ts} +0 -0
package/src/discovery/codex.ts
CHANGED
|
@@ -1,31 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* OpenAI
|
|
2
|
+
* OpenAI Codex project/global skill layout adapter (import source).
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* The `.codex/skills` layout is an explicit import source into the canonical
|
|
5
|
+
* `.gjc` skill locations — it is never loaded as an ordinary runtime authority.
|
|
6
|
+
* These helpers enumerate the layout for import/inspection consumers (#4291
|
|
7
|
+
* import UI, #4288 provenance diagnostics) and are deliberately NOT registered
|
|
8
|
+
* as capability providers: activating Codex's other surfaces (MCP servers,
|
|
9
|
+
* hooks, commands, tools, prompts, settings) is owned by sibling issues.
|
|
10
|
+
*
|
|
11
|
+
* User-home `~/.codex/skills` is enumerated as an explicit import candidate
|
|
12
|
+
* only; it is never loaded into sessions without an explicit import action.
|
|
7
13
|
*/
|
|
8
14
|
import * as path from "node:path";
|
|
9
15
|
import { logger, parseFrontmatter } from "@gajae-code/utils";
|
|
10
|
-
import {
|
|
11
|
-
import type { ContextFile } from "../capability/context-file";
|
|
12
|
-
import { contextFileCapability } from "../capability/context-file";
|
|
13
|
-
import { type ExtensionModule, extensionModuleCapability } from "../capability/extension-module";
|
|
16
|
+
import type { ExtensionModule } from "../capability/extension-module";
|
|
14
17
|
import { readFile } from "../capability/fs";
|
|
15
18
|
import type { Hook } from "../capability/hook";
|
|
16
|
-
import { hookCapability } from "../capability/hook";
|
|
17
19
|
import type { MCPServer } from "../capability/mcp";
|
|
18
|
-
import { mcpCapability } from "../capability/mcp";
|
|
19
|
-
import type { Prompt } from "../capability/prompt";
|
|
20
|
-
import { promptCapability } from "../capability/prompt";
|
|
21
|
-
import type { Settings } from "../capability/settings";
|
|
22
|
-
import { settingsCapability } from "../capability/settings";
|
|
23
20
|
import type { Skill } from "../capability/skill";
|
|
24
|
-
import { skillCapability } from "../capability/skill";
|
|
25
21
|
import type { SlashCommand } from "../capability/slash-command";
|
|
26
|
-
import { slashCommandCapability } from "../capability/slash-command";
|
|
27
22
|
import type { CustomTool } from "../capability/tool";
|
|
28
|
-
import { toolCapability } from "../capability/tool";
|
|
29
23
|
import type { LoadContext, LoadResult, SourceMeta } from "../capability/types";
|
|
30
24
|
import {
|
|
31
25
|
buildExtensionModuleItems,
|
|
@@ -35,57 +29,53 @@ import {
|
|
|
35
29
|
scanSkillsFromDir,
|
|
36
30
|
} from "./helpers";
|
|
37
31
|
|
|
38
|
-
const
|
|
39
|
-
const
|
|
40
|
-
const
|
|
32
|
+
export const CODEX_PROVIDER_ID = "codex";
|
|
33
|
+
export const CODEX_DISPLAY_NAME = "OpenAI Codex";
|
|
34
|
+
export const CODEX_CONFIG_DIR = ".codex";
|
|
41
35
|
|
|
42
|
-
|
|
43
|
-
|
|
36
|
+
/**
|
|
37
|
+
* Enumerate the project-local `.codex/skills` layout (cwd only), mirroring the
|
|
38
|
+
* OpenAI Codex project convention.
|
|
39
|
+
*/
|
|
40
|
+
export async function scanCodexProjectSkills(ctx: LoadContext): Promise<LoadResult<Skill>> {
|
|
41
|
+
return await scanSkillsFromDir(ctx, {
|
|
42
|
+
dir: path.join(ctx.cwd, CODEX_CONFIG_DIR, "skills"),
|
|
43
|
+
providerId: CODEX_PROVIDER_ID,
|
|
44
|
+
level: "project",
|
|
45
|
+
requireDescription: true,
|
|
46
|
+
});
|
|
44
47
|
}
|
|
45
48
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
return { items, warnings: [] };
|
|
49
|
+
/**
|
|
50
|
+
* Enumerate the user-global `~/.codex/skills` layout. This is an explicit
|
|
51
|
+
* import candidate only; GJC never loads it without an explicit import action.
|
|
52
|
+
*/
|
|
53
|
+
export async function scanCodexUserSkills(ctx: LoadContext): Promise<LoadResult<Skill>> {
|
|
54
|
+
return await scanSkillsFromDir(ctx, {
|
|
55
|
+
dir: path.join(ctx.home, CODEX_CONFIG_DIR, "skills"),
|
|
56
|
+
providerId: CODEX_PROVIDER_ID,
|
|
57
|
+
level: "user",
|
|
58
|
+
requireDescription: true,
|
|
59
|
+
});
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
const projectConfigPath = path.join(getProjectCodexDir(ctx), "config.toml");
|
|
65
|
-
const projectConfig = await loadTomlConfig(projectConfigPath);
|
|
66
|
-
const items: MCPServer[] = [];
|
|
67
|
-
if (projectConfig) {
|
|
68
|
-
const servers = extractMCPServersFromToml(projectConfig);
|
|
69
|
-
for (const [name, config] of Object.entries(servers)) {
|
|
70
|
-
items.push({
|
|
71
|
-
name,
|
|
72
|
-
...config,
|
|
73
|
-
_source: createSourceMeta(PROVIDER_ID, projectConfigPath, "project"),
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return { items, warnings };
|
|
62
|
+
export function codexSkillSourceMeta(filePath: string, level: "user" | "project") {
|
|
63
|
+
return createSourceMeta(CODEX_PROVIDER_ID, filePath, level);
|
|
78
64
|
}
|
|
79
65
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
66
|
+
// =============================================================================
|
|
67
|
+
// Provenance inspection (#4288)
|
|
68
|
+
//
|
|
69
|
+
// The scans below enumerate the remaining `.codex/` project surfaces (MCP
|
|
70
|
+
// servers, hooks, tools, extensions, commands) for the `gjc customize doctor`
|
|
71
|
+
// provenance report. They reuse the shared discovery helpers but are
|
|
72
|
+
// deliberately NOT registered as capability providers: none of these surfaces
|
|
73
|
+
// are part of the session load path, and inspection must not change runtime
|
|
74
|
+
// behavior.
|
|
75
|
+
// =============================================================================
|
|
76
|
+
|
|
77
|
+
function getProjectCodexDir(ctx: LoadContext): string {
|
|
78
|
+
return path.join(ctx.cwd, CODEX_CONFIG_DIR);
|
|
89
79
|
}
|
|
90
80
|
|
|
91
81
|
interface CodexMCPConfig {
|
|
@@ -104,6 +94,17 @@ interface CodexMCPConfig {
|
|
|
104
94
|
disabled_tools?: string[];
|
|
105
95
|
}
|
|
106
96
|
|
|
97
|
+
async function loadTomlConfig(filePath: string): Promise<Record<string, unknown> | null> {
|
|
98
|
+
const content = await readFile(filePath);
|
|
99
|
+
if (!content) return null;
|
|
100
|
+
try {
|
|
101
|
+
return Bun.TOML.parse(content) as Record<string, unknown>;
|
|
102
|
+
} catch (error) {
|
|
103
|
+
logger.warn("Failed to parse TOML config", { path: filePath, error: String(error) });
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
107
108
|
function extractMCPServersFromToml(toml: Record<string, unknown>): Record<string, Partial<MCPServer>> {
|
|
108
109
|
if (!toml.mcp_servers || typeof toml.mcp_servers !== "object") {
|
|
109
110
|
return {};
|
|
@@ -153,59 +154,25 @@ function extractMCPServersFromToml(toml: Record<string, unknown>): Record<string
|
|
|
153
154
|
return result;
|
|
154
155
|
}
|
|
155
156
|
|
|
156
|
-
async function
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
const transformCommand = (name: string, content: string, filePath: string, source: SourceMeta) => {
|
|
173
|
-
const { frontmatter, body } = parseFrontmatter(content, { source: filePath });
|
|
174
|
-
const commandName = frontmatter.name || name.replace(/\.md$/, "");
|
|
175
|
-
return {
|
|
176
|
-
name: String(commandName),
|
|
177
|
-
path: filePath,
|
|
178
|
-
content: body,
|
|
179
|
-
level: "project" as const,
|
|
180
|
-
_source: source,
|
|
181
|
-
};
|
|
182
|
-
};
|
|
183
|
-
return await loadFilesFromDir(ctx, projectCommandsDir, PROVIDER_ID, "project", {
|
|
184
|
-
extensions: ["md"],
|
|
185
|
-
transform: transformCommand,
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
async function loadPrompts(ctx: LoadContext): Promise<LoadResult<Prompt>> {
|
|
190
|
-
const projectPromptsDir = path.join(getProjectCodexDir(ctx), "prompts");
|
|
191
|
-
const transformPrompt = (name: string, content: string, filePath: string, source: SourceMeta) => {
|
|
192
|
-
const { frontmatter, body } = parseFrontmatter(content, { source: filePath });
|
|
193
|
-
const promptName = frontmatter.name || name.replace(/\.md$/, "");
|
|
194
|
-
return {
|
|
195
|
-
name: String(promptName),
|
|
196
|
-
path: filePath,
|
|
197
|
-
content: body,
|
|
198
|
-
description: frontmatter.description ? String(frontmatter.description) : undefined,
|
|
199
|
-
_source: source,
|
|
200
|
-
};
|
|
201
|
-
};
|
|
202
|
-
return await loadFilesFromDir(ctx, projectPromptsDir, PROVIDER_ID, "project", {
|
|
203
|
-
extensions: ["md"],
|
|
204
|
-
transform: transformPrompt,
|
|
205
|
-
});
|
|
157
|
+
async function inspectMCPServers(ctx: LoadContext): Promise<LoadResult<MCPServer>> {
|
|
158
|
+
const warnings: string[] = [];
|
|
159
|
+
const projectConfigPath = path.join(getProjectCodexDir(ctx), "config.toml");
|
|
160
|
+
const projectConfig = await loadTomlConfig(projectConfigPath);
|
|
161
|
+
const items: MCPServer[] = [];
|
|
162
|
+
if (projectConfig) {
|
|
163
|
+
const servers = extractMCPServersFromToml(projectConfig);
|
|
164
|
+
for (const [name, config] of Object.entries(servers)) {
|
|
165
|
+
items.push({
|
|
166
|
+
name,
|
|
167
|
+
...config,
|
|
168
|
+
_source: createSourceMeta(CODEX_PROVIDER_ID, projectConfigPath, "project"),
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return { items, warnings };
|
|
206
173
|
}
|
|
207
174
|
|
|
208
|
-
async function
|
|
175
|
+
async function inspectHooks(ctx: LoadContext): Promise<LoadResult<Hook>> {
|
|
209
176
|
const projectHooksDir = path.join(getProjectCodexDir(ctx), "hooks");
|
|
210
177
|
const transformHook = (name: string, _content: string, filePath: string, source: SourceMeta) => {
|
|
211
178
|
const baseName = name.replace(/\.(ts|js)$/, "");
|
|
@@ -220,13 +187,13 @@ async function loadHooks(ctx: LoadContext): Promise<LoadResult<Hook>> {
|
|
|
220
187
|
_source: source,
|
|
221
188
|
};
|
|
222
189
|
};
|
|
223
|
-
return await loadFilesFromDir(ctx, projectHooksDir,
|
|
190
|
+
return await loadFilesFromDir(ctx, projectHooksDir, CODEX_PROVIDER_ID, "project", {
|
|
224
191
|
extensions: ["ts", "js"],
|
|
225
192
|
transform: transformHook,
|
|
226
193
|
});
|
|
227
194
|
}
|
|
228
195
|
|
|
229
|
-
async function
|
|
196
|
+
async function inspectTools(ctx: LoadContext): Promise<LoadResult<CustomTool>> {
|
|
230
197
|
const projectToolsDir = path.join(getProjectCodexDir(ctx), "tools");
|
|
231
198
|
const transformTool = (name: string, _content: string, filePath: string, source: SourceMeta) =>
|
|
232
199
|
({
|
|
@@ -235,96 +202,63 @@ async function loadTools(ctx: LoadContext): Promise<LoadResult<CustomTool>> {
|
|
|
235
202
|
level: "project" as const,
|
|
236
203
|
_source: source,
|
|
237
204
|
}) as CustomTool;
|
|
238
|
-
return await loadFilesFromDir(ctx, projectToolsDir,
|
|
205
|
+
return await loadFilesFromDir(ctx, projectToolsDir, CODEX_PROVIDER_ID, "project", {
|
|
239
206
|
extensions: ["ts", "js"],
|
|
240
207
|
transform: transformTool,
|
|
241
208
|
});
|
|
242
209
|
}
|
|
243
210
|
|
|
244
|
-
async function
|
|
245
|
-
const
|
|
246
|
-
const
|
|
247
|
-
return {
|
|
248
|
-
items: projectConfig
|
|
249
|
-
? [
|
|
250
|
-
{
|
|
251
|
-
...projectConfig,
|
|
252
|
-
_source: createSourceMeta(PROVIDER_ID, projectConfigPath, "project"),
|
|
253
|
-
} as Settings,
|
|
254
|
-
]
|
|
255
|
-
: [],
|
|
256
|
-
warnings: [],
|
|
257
|
-
};
|
|
211
|
+
async function inspectExtensionModules(ctx: LoadContext): Promise<LoadResult<ExtensionModule>> {
|
|
212
|
+
const projectExtensionsDir = path.join(getProjectCodexDir(ctx), "extensions");
|
|
213
|
+
const projectPaths = await discoverExtensionModulePaths(ctx, projectExtensionsDir);
|
|
214
|
+
return { items: buildExtensionModuleItems(CODEX_PROVIDER_ID, [], projectPaths), warnings: [] };
|
|
258
215
|
}
|
|
259
216
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
displayName: DISPLAY_NAME,
|
|
279
|
-
description: "Load skills from project .codex/skills/",
|
|
280
|
-
priority: PRIORITY,
|
|
281
|
-
load: loadSkills,
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
registerProvider<ExtensionModule>(extensionModuleCapability.id, {
|
|
285
|
-
id: PROVIDER_ID,
|
|
286
|
-
displayName: DISPLAY_NAME,
|
|
287
|
-
description: "Load extension modules from project .codex/extensions/",
|
|
288
|
-
priority: PRIORITY,
|
|
289
|
-
load: loadExtensionModules,
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
registerProvider<SlashCommand>(slashCommandCapability.id, {
|
|
293
|
-
id: PROVIDER_ID,
|
|
294
|
-
displayName: DISPLAY_NAME,
|
|
295
|
-
description: "Load slash commands from project .codex/commands/",
|
|
296
|
-
priority: PRIORITY,
|
|
297
|
-
load: loadSlashCommands,
|
|
298
|
-
});
|
|
299
|
-
|
|
300
|
-
registerProvider<Prompt>(promptCapability.id, {
|
|
301
|
-
id: PROVIDER_ID,
|
|
302
|
-
displayName: DISPLAY_NAME,
|
|
303
|
-
description: "Load prompts from project .codex/prompts/",
|
|
304
|
-
priority: PRIORITY,
|
|
305
|
-
load: loadPrompts,
|
|
306
|
-
});
|
|
307
|
-
|
|
308
|
-
registerProvider<Hook>(hookCapability.id, {
|
|
309
|
-
id: PROVIDER_ID,
|
|
310
|
-
displayName: DISPLAY_NAME,
|
|
311
|
-
description: "Load hooks from project .codex/hooks/",
|
|
312
|
-
priority: PRIORITY,
|
|
313
|
-
load: loadHooks,
|
|
314
|
-
});
|
|
217
|
+
async function inspectSlashCommands(ctx: LoadContext): Promise<LoadResult<SlashCommand>> {
|
|
218
|
+
const projectCommandsDir = path.join(getProjectCodexDir(ctx), "commands");
|
|
219
|
+
const transformCommand = (name: string, content: string, filePath: string, source: SourceMeta) => {
|
|
220
|
+
const { frontmatter, body } = parseFrontmatter(content, { source: filePath });
|
|
221
|
+
const commandName = frontmatter.name || name.replace(/\.md$/, "");
|
|
222
|
+
return {
|
|
223
|
+
name: String(commandName),
|
|
224
|
+
path: filePath,
|
|
225
|
+
content: body,
|
|
226
|
+
level: "project" as const,
|
|
227
|
+
_source: source,
|
|
228
|
+
};
|
|
229
|
+
};
|
|
230
|
+
return await loadFilesFromDir(ctx, projectCommandsDir, CODEX_PROVIDER_ID, "project", {
|
|
231
|
+
extensions: ["md"],
|
|
232
|
+
transform: transformCommand,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
315
235
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
236
|
+
export interface CodexConventionInspection {
|
|
237
|
+
mcps: LoadResult<MCPServer>;
|
|
238
|
+
skills: LoadResult<Skill>;
|
|
239
|
+
hooks: LoadResult<Hook>;
|
|
240
|
+
tools: LoadResult<CustomTool>;
|
|
241
|
+
extensions: LoadResult<ExtensionModule>;
|
|
242
|
+
commands: LoadResult<SlashCommand>;
|
|
243
|
+
}
|
|
323
244
|
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
245
|
+
/**
|
|
246
|
+
* Inspect what the Codex project convention (.codex/) would surface.
|
|
247
|
+
*
|
|
248
|
+
* Reuses the shared discovery scan helpers without registering any provider,
|
|
249
|
+
* so diagnostics can report the convention's files while keeping the runtime
|
|
250
|
+
* load path exactly as configured (none of these surfaces are registered for
|
|
251
|
+
* session loading; hooks are covered by the separate registered codex-hooks
|
|
252
|
+
* provider).
|
|
253
|
+
*/
|
|
254
|
+
export async function inspectCodexConvention(ctx: LoadContext): Promise<CodexConventionInspection> {
|
|
255
|
+
const [mcps, skills, hooks, tools, extensions, commands] = await Promise.all([
|
|
256
|
+
inspectMCPServers(ctx),
|
|
257
|
+
scanCodexProjectSkills(ctx),
|
|
258
|
+
inspectHooks(ctx),
|
|
259
|
+
inspectTools(ctx),
|
|
260
|
+
inspectExtensionModules(ctx),
|
|
261
|
+
inspectSlashCommands(ctx),
|
|
262
|
+
]);
|
|
263
|
+
return { mcps, skills, hooks, tools, extensions, commands };
|
|
264
|
+
}
|
package/src/discovery/helpers.ts
CHANGED
|
@@ -416,11 +416,18 @@ export async function scanSkillsFromDir(
|
|
|
416
416
|
warnings.push(
|
|
417
417
|
`Skill frontmatter exceeded ${SKILL_FRONTMATTER_SCAN_TOTAL_BYTES} byte scan cap: ${skillPath}`,
|
|
418
418
|
);
|
|
419
|
+
} else {
|
|
420
|
+
warnings.push(
|
|
421
|
+
`Skill file has no parseable frontmatter (expected a leading \`---\` YAML block with name/description): ${skillPath}`,
|
|
422
|
+
);
|
|
419
423
|
}
|
|
420
424
|
return;
|
|
421
425
|
}
|
|
422
426
|
if (frontmatter.enabled === false) return;
|
|
423
|
-
if (requireDescription && !frontmatter.description)
|
|
427
|
+
if (requireDescription && !frontmatter.description) {
|
|
428
|
+
warnings.push(`Skill is missing a description in frontmatter: ${skillPath}`);
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
424
431
|
const skillDirName = path.basename(path.dirname(skillPath));
|
|
425
432
|
const rawName = frontmatter.name;
|
|
426
433
|
const name = typeof rawName === "string" ? rawName.trim() || skillDirName : skillDirName;
|
package/src/discovery/index.ts
CHANGED
|
@@ -22,10 +22,12 @@ import "../capability/tool";
|
|
|
22
22
|
// Import providers (each registers itself on import)
|
|
23
23
|
import "./agents-md";
|
|
24
24
|
import "./builtin";
|
|
25
|
+
import "./claude-hooks";
|
|
25
26
|
import "./claude-plugins";
|
|
26
27
|
import "./cline";
|
|
27
28
|
import "./agents";
|
|
28
29
|
import "./cursor";
|
|
30
|
+
import "./codex-hooks";
|
|
29
31
|
import "./gemini";
|
|
30
32
|
import "./opencode";
|
|
31
33
|
import "./github";
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounded Claude Code / Codex MCP import-source adapters.
|
|
3
|
+
*
|
|
4
|
+
* These functions normalize foreign MCP formats to GJC's internal MCP contract
|
|
5
|
+
* (`MCPServer`). They are EXPLICIT import sources: a caller (for example the
|
|
6
|
+
* `/extensions` import transaction) reads a Claude `.mcp.json` or Codex
|
|
7
|
+
* `config.toml` file and writes the normalized definitions into GJC's native
|
|
8
|
+
* `.gjc` config. They are never registered as runtime discovery providers, so
|
|
9
|
+
* foreign files are never implicit competing runtime authorities, and user-home
|
|
10
|
+
* (`~/.claude`, `~/.codex`) configuration is never scanned.
|
|
11
|
+
*/
|
|
12
|
+
import { tryParseJson } from "@gajae-code/utils";
|
|
13
|
+
import { type MCPServer, mcpCapability } from "../capability/mcp";
|
|
14
|
+
import type { LoadResult, SourceMeta } from "../capability/types";
|
|
15
|
+
import { createSourceMeta, expandEnvVarsDeep } from "./helpers";
|
|
16
|
+
|
|
17
|
+
const PROVIDER_IDS = {
|
|
18
|
+
claude: "claude",
|
|
19
|
+
codex: "codex",
|
|
20
|
+
} as const;
|
|
21
|
+
|
|
22
|
+
const PROTOTYPE_SENSITIVE_SERVER_NAMES = new Set(["__proto__", "prototype", "constructor"]);
|
|
23
|
+
|
|
24
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
25
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function isStringRecord(value: unknown): value is Record<string, string> {
|
|
29
|
+
return isRecord(value) && Object.values(value).every(item => typeof item === "string");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Result of normalizing a foreign MCP config into the internal contract. */
|
|
33
|
+
export interface MCPCompatNormalizeResult extends LoadResult<MCPServer> {
|
|
34
|
+
/** Normalization diagnostics (always present, possibly empty). */
|
|
35
|
+
warnings: string[];
|
|
36
|
+
/** Path the definitions were normalized from (for provenance). */
|
|
37
|
+
sourcePath: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function compatSource(providerId: string, sourcePath: string, level: "project" | "user"): SourceMeta {
|
|
41
|
+
return createSourceMeta(providerId, sourcePath, level);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Normalize a Claude Code `.mcp.json` file body into the internal MCP contract.
|
|
46
|
+
*
|
|
47
|
+
* The Claude project format uses the same `{ "mcpServers": { name: {...} } }`
|
|
48
|
+
* JSON shape as GJC's config; `enabled`/`autoload` are preserved so a caller
|
|
49
|
+
* can decide startup behavior after import. Bounded to the supplied content:
|
|
50
|
+
* no filesystem scanning, no user-home reads.
|
|
51
|
+
*/
|
|
52
|
+
export function normalizeClaudeMcpJson(
|
|
53
|
+
content: string,
|
|
54
|
+
sourcePath: string,
|
|
55
|
+
level: "project" | "user" = "project",
|
|
56
|
+
): MCPCompatNormalizeResult {
|
|
57
|
+
const items: MCPServer[] = [];
|
|
58
|
+
const warnings: string[] = [];
|
|
59
|
+
const json = tryParseJson<Record<string, unknown>>(content);
|
|
60
|
+
const mcpServers = json?.mcpServers;
|
|
61
|
+
if (!json || !isRecord(mcpServers)) {
|
|
62
|
+
warnings.push(`Failed to parse MCP servers in ${sourcePath}`);
|
|
63
|
+
return { items, warnings, sourcePath };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Check prototype-sensitive names on the RAW record first: env expansion
|
|
67
|
+
// rebuilds the object via plain assignment, which silently drops a
|
|
68
|
+
// `__proto__` own-property into the result's prototype — the check must
|
|
69
|
+
// run before that transformation or it would never fire.
|
|
70
|
+
const unsafeNames = Object.keys(mcpServers).filter(name => PROTOTYPE_SENSITIVE_SERVER_NAMES.has(name));
|
|
71
|
+
for (const name of unsafeNames) {
|
|
72
|
+
warnings.push(`Skipped unsafe MCP server name in ${sourcePath}: ${name}`);
|
|
73
|
+
}
|
|
74
|
+
const expanded = expandEnvVarsDeep(mcpServers);
|
|
75
|
+
for (const [name, config] of Object.entries(expanded)) {
|
|
76
|
+
if (PROTOTYPE_SENSITIVE_SERVER_NAMES.has(name)) {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const serverConfig = isRecord(config) ? config : {};
|
|
80
|
+
const server: MCPServer = {
|
|
81
|
+
name,
|
|
82
|
+
enabled: typeof serverConfig.enabled === "boolean" ? serverConfig.enabled : undefined,
|
|
83
|
+
autoload: typeof serverConfig.autoload === "boolean" ? serverConfig.autoload : undefined,
|
|
84
|
+
sharing:
|
|
85
|
+
serverConfig.sharing === "per-session" || serverConfig.sharing === "shared"
|
|
86
|
+
? serverConfig.sharing
|
|
87
|
+
: undefined,
|
|
88
|
+
timeout: typeof serverConfig.timeout === "number" ? serverConfig.timeout : undefined,
|
|
89
|
+
command: typeof serverConfig.command === "string" ? serverConfig.command : undefined,
|
|
90
|
+
args: Array.isArray(serverConfig.args)
|
|
91
|
+
? serverConfig.args.filter((arg): arg is string => typeof arg === "string")
|
|
92
|
+
: undefined,
|
|
93
|
+
env: isStringRecord(serverConfig.env) ? serverConfig.env : undefined,
|
|
94
|
+
noInheritEnv: typeof serverConfig.noInheritEnv === "boolean" ? serverConfig.noInheritEnv : undefined,
|
|
95
|
+
cwd: typeof serverConfig.cwd === "string" ? serverConfig.cwd : undefined,
|
|
96
|
+
url: typeof serverConfig.url === "string" ? serverConfig.url : undefined,
|
|
97
|
+
headers: isStringRecord(serverConfig.headers) ? serverConfig.headers : undefined,
|
|
98
|
+
transport:
|
|
99
|
+
serverConfig.type === "http" || serverConfig.type === "sse" || serverConfig.type === "stdio"
|
|
100
|
+
? serverConfig.type
|
|
101
|
+
: undefined,
|
|
102
|
+
_source: compatSource(PROVIDER_IDS.claude, sourcePath, level),
|
|
103
|
+
};
|
|
104
|
+
items.push(server);
|
|
105
|
+
}
|
|
106
|
+
return { items, warnings, sourcePath };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
interface CodexMcpServerConfig {
|
|
110
|
+
command?: string;
|
|
111
|
+
args?: string[];
|
|
112
|
+
env?: Record<string, string>;
|
|
113
|
+
env_vars?: string[];
|
|
114
|
+
url?: string;
|
|
115
|
+
http_headers?: Record<string, string>;
|
|
116
|
+
env_http_headers?: Record<string, string>;
|
|
117
|
+
bearer_token_env_var?: string;
|
|
118
|
+
cwd?: string;
|
|
119
|
+
startup_timeout_sec?: number;
|
|
120
|
+
tool_timeout_sec?: number;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Extract normalized MCP servers from a Codex `config.toml` `[mcp_servers.*]`
|
|
125
|
+
* section. Codex's config does not carry an `enabled` concept; imported servers
|
|
126
|
+
* default to autoload (startup) behavior after import. Bounded to the supplied
|
|
127
|
+
* content: no filesystem scanning, no user-home reads.
|
|
128
|
+
*/
|
|
129
|
+
function extractCodexMcpServers(toml: Record<string, unknown>): Record<string, Partial<MCPServer>> {
|
|
130
|
+
if (!toml.mcp_servers || !isRecord(toml.mcp_servers)) return {};
|
|
131
|
+
|
|
132
|
+
const codexServers = toml.mcp_servers as Record<string, CodexMcpServerConfig>;
|
|
133
|
+
const result: Record<string, Partial<MCPServer>> = {};
|
|
134
|
+
for (const [name, config] of Object.entries(codexServers)) {
|
|
135
|
+
// `result[name] = ...` below is a plain assignment: a prototype-sensitive
|
|
136
|
+
// name would mutate the result's prototype instead of becoming an item.
|
|
137
|
+
if (PROTOTYPE_SENSITIVE_SERVER_NAMES.has(name)) continue;
|
|
138
|
+
const serverConfig = isRecord(config) ? config : {};
|
|
139
|
+
const server: Partial<MCPServer> = {
|
|
140
|
+
command: typeof serverConfig.command === "string" ? serverConfig.command : undefined,
|
|
141
|
+
args: Array.isArray(serverConfig.args)
|
|
142
|
+
? serverConfig.args.filter((arg): arg is string => typeof arg === "string")
|
|
143
|
+
: undefined,
|
|
144
|
+
url: typeof serverConfig.url === "string" ? serverConfig.url : undefined,
|
|
145
|
+
cwd: typeof serverConfig.cwd === "string" ? serverConfig.cwd : undefined,
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
const env: Record<string, string> = { ...(isStringRecord(serverConfig.env) ? serverConfig.env : {}) };
|
|
149
|
+
if (Array.isArray(serverConfig.env_vars)) {
|
|
150
|
+
for (const varName of serverConfig.env_vars) {
|
|
151
|
+
if (typeof varName !== "string") continue;
|
|
152
|
+
const value = Bun.env[varName];
|
|
153
|
+
if (value !== undefined) env[varName] = value;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (Object.keys(env).length > 0) server.env = env;
|
|
157
|
+
|
|
158
|
+
const headers: Record<string, string> = {
|
|
159
|
+
...(isStringRecord(serverConfig.http_headers) ? serverConfig.http_headers : {}),
|
|
160
|
+
};
|
|
161
|
+
if (isRecord(serverConfig.env_http_headers)) {
|
|
162
|
+
for (const [headerName, envVarName] of Object.entries(serverConfig.env_http_headers)) {
|
|
163
|
+
if (typeof envVarName !== "string") continue;
|
|
164
|
+
const value = Bun.env[envVarName];
|
|
165
|
+
if (value !== undefined) headers[headerName] = value;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (typeof serverConfig.bearer_token_env_var === "string") {
|
|
169
|
+
const token = Bun.env[serverConfig.bearer_token_env_var];
|
|
170
|
+
if (token) headers.Authorization = `Bearer ${token}`;
|
|
171
|
+
}
|
|
172
|
+
if (Object.keys(headers).length > 0) server.headers = headers;
|
|
173
|
+
|
|
174
|
+
if (server.url) {
|
|
175
|
+
server.transport = "http";
|
|
176
|
+
} else if (server.command) {
|
|
177
|
+
server.transport = "stdio";
|
|
178
|
+
}
|
|
179
|
+
if (typeof serverConfig.tool_timeout_sec === "number" && serverConfig.tool_timeout_sec > 0) {
|
|
180
|
+
server.timeout = serverConfig.tool_timeout_sec * 1000;
|
|
181
|
+
}
|
|
182
|
+
result[name] = server;
|
|
183
|
+
}
|
|
184
|
+
return result;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Normalize a Codex `config.toml` file body into the internal MCP contract.
|
|
189
|
+
* Only the `[mcp_servers.*]` sections are read; everything else is ignored.
|
|
190
|
+
*/
|
|
191
|
+
export function normalizeCodexMcpToml(
|
|
192
|
+
content: string,
|
|
193
|
+
sourcePath: string,
|
|
194
|
+
level: "project" | "user" = "project",
|
|
195
|
+
): MCPCompatNormalizeResult {
|
|
196
|
+
const items: MCPServer[] = [];
|
|
197
|
+
const warnings: string[] = [];
|
|
198
|
+
let parsed: Record<string, unknown>;
|
|
199
|
+
try {
|
|
200
|
+
parsed = Bun.TOML.parse(content) as Record<string, unknown>;
|
|
201
|
+
} catch {
|
|
202
|
+
warnings.push(`Failed to parse TOML in ${sourcePath}`);
|
|
203
|
+
return { items, warnings, sourcePath };
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Mirror the Claude path: warn on prototype-sensitive names dropped by the
|
|
207
|
+
// extractor's plain-assignment result construction.
|
|
208
|
+
if (isRecord(parsed.mcp_servers)) {
|
|
209
|
+
for (const name of Object.keys(parsed.mcp_servers)) {
|
|
210
|
+
if (PROTOTYPE_SENSITIVE_SERVER_NAMES.has(name)) {
|
|
211
|
+
warnings.push(`Skipped unsafe MCP server name in ${sourcePath}: ${name}`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
const servers = extractCodexMcpServers(parsed);
|
|
216
|
+
for (const [name, config] of Object.entries(servers)) {
|
|
217
|
+
items.push({
|
|
218
|
+
name,
|
|
219
|
+
...config,
|
|
220
|
+
_source: compatSource(PROVIDER_IDS.codex, sourcePath, level),
|
|
221
|
+
} as MCPServer);
|
|
222
|
+
}
|
|
223
|
+
return { items, warnings, sourcePath };
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Validate a normalized server against the internal MCP contract. Returns an
|
|
228
|
+
* error message, or undefined when the definition is importable. Callers use
|
|
229
|
+
* this to fail closed before writing a malformed/untrusted definition into
|
|
230
|
+
* `.gjc` (mcpCapability.validate is reused so import and runtime share one rule).
|
|
231
|
+
*/
|
|
232
|
+
export function validateMCPCompatServer(server: MCPServer): string | undefined {
|
|
233
|
+
return mcpCapability.validate?.(server);
|
|
234
|
+
}
|