@gajae-code/coding-agent 0.10.2 → 0.11.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 +50 -2
- package/dist/types/append-only-mode.d.ts +1 -1
- package/dist/types/cli/args.d.ts +4 -5
- package/dist/types/cli/daemon-cli.d.ts +12 -1
- package/dist/types/cli/notify-cli.d.ts +21 -1
- package/dist/types/cli.d.ts +3 -0
- package/dist/types/commands/daemon.d.ts +39 -0
- package/dist/types/commands/launch.d.ts +3 -0
- package/dist/types/commands/notify.d.ts +28 -1
- package/dist/types/commands/sdk.d.ts +33 -0
- package/dist/types/config/atomic-yaml-patch.d.ts +85 -0
- package/dist/types/config/model-profile-activation.d.ts +35 -15
- package/dist/types/config/model-profiles.d.ts +11 -5
- package/dist/types/config/model-registry.d.ts +3 -3
- package/dist/types/config/model-resolver.d.ts +39 -6
- package/dist/types/config/model-selector-value.d.ts +17 -0
- package/dist/types/config/models-config-schema.d.ts +10 -6
- package/dist/types/config/settings-schema.d.ts +133 -6
- package/dist/types/config/settings.d.ts +63 -35
- package/dist/types/coordinator-mcp/model-preset.d.ts +7 -6
- package/dist/types/coordinator-mcp/server.d.ts +6 -49
- package/dist/types/daemon/builtin.d.ts +6 -5
- package/dist/types/daemon/control-types.d.ts +1 -1
- package/dist/types/discovery/mcp-json.d.ts +12 -1
- package/dist/types/extensibility/custom-tools/types.d.ts +1 -1
- package/dist/types/extensibility/extensions/compact-handler.d.ts +4 -2
- package/dist/types/extensibility/extensions/get-commands-handler.d.ts +2 -2
- package/dist/types/extensibility/extensions/loader.d.ts +10 -1
- package/dist/types/extensibility/extensions/runner.d.ts +3 -3
- package/dist/types/extensibility/extensions/types.d.ts +141 -16
- package/dist/types/extensibility/hooks/types.d.ts +1 -1
- package/dist/types/gjc-runtime/launch-tmux.d.ts +3 -2
- package/dist/types/gjc-runtime/psmux-detect.d.ts +3 -0
- package/dist/types/gjc-runtime/session-state-sidecar.d.ts +3 -0
- package/dist/types/gjc-runtime/team-runtime.d.ts +3 -4
- package/dist/types/gjc-runtime/tmux-owner-isolation-cli.d.ts +13 -0
- package/dist/types/gjc-runtime/tmux-sessions.d.ts +4 -1
- package/dist/types/gjc-runtime/windows-powershell-command.d.ts +9 -0
- package/dist/types/harness-control-plane/operate.d.ts +5 -5
- package/dist/types/harness-control-plane/owner.d.ts +18 -4
- package/dist/types/harness-control-plane/receipts.d.ts +0 -1
- package/dist/types/harness-control-plane/sdk-transport.d.ts +43 -0
- package/dist/types/harness-control-plane/session-transport.d.ts +48 -0
- package/dist/types/harness-control-plane/types.d.ts +3 -4
- package/dist/types/lsp/index.d.ts +1 -1
- package/dist/types/main.d.ts +32 -38
- package/dist/types/modes/acp/acp-agent.d.ts +224 -53
- package/dist/types/modes/acp/acp-client-bridge.d.ts +1 -0
- package/dist/types/modes/acp/acp-mode.d.ts +6 -15
- package/dist/types/modes/acp/permission-mode.d.ts +4 -0
- package/dist/types/modes/acp/startup-options.d.ts +6 -0
- package/dist/types/modes/components/agent-dashboard.d.ts +3 -0
- package/dist/types/modes/components/model-selector.d.ts +1 -0
- package/dist/types/modes/components/notifications-settings-editor.d.ts +135 -0
- package/dist/types/modes/components/settings-selector.d.ts +6 -4
- package/dist/types/modes/components/welcome.d.ts +1 -1
- package/dist/types/modes/controllers/selector-controller.d.ts +35 -1
- package/dist/types/modes/index.d.ts +0 -4
- package/dist/types/modes/interactive-mode.d.ts +3 -0
- package/dist/types/modes/runtime-init.d.ts +2 -2
- package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +6 -9
- package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +4 -6
- package/dist/types/modes/shared/agent-wire/event-contract.d.ts +6 -6
- package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +4 -9
- package/dist/types/modes/shared/agent-wire/event-observation.d.ts +1 -1
- package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +169 -30
- package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +7 -7
- package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +105 -0
- package/dist/types/modes/types.d.ts +5 -0
- package/dist/types/runtime-mcp/client.d.ts +2 -0
- package/dist/types/runtime-mcp/config.d.ts +5 -1
- package/dist/types/runtime-mcp/manager.d.ts +8 -1
- package/dist/types/runtime-mcp/types.d.ts +4 -0
- package/dist/types/sdk/acp/adapter.d.ts +67 -0
- package/dist/types/sdk/acp/index.d.ts +2 -0
- package/dist/types/sdk/broker/broker.d.ts +53 -0
- package/dist/types/sdk/broker/discovery.d.ts +30 -0
- package/dist/types/sdk/broker/ensure.d.ts +33 -0
- package/dist/types/sdk/broker/identity.d.ts +3 -0
- package/dist/types/sdk/broker/index.d.ts +8 -0
- package/dist/types/sdk/broker/lifecycle-ledger.d.ts +95 -0
- package/dist/types/sdk/broker/lifecycle.d.ts +85 -0
- package/dist/types/sdk/broker/process-incarnation.d.ts +14 -0
- package/dist/types/sdk/broker/runtime.d.ts +33 -0
- package/dist/types/sdk/broker/session-index.d.ts +57 -0
- package/dist/types/sdk/broker/state-version.d.ts +8 -0
- package/dist/types/sdk/broker/transport.d.ts +9 -0
- package/dist/types/sdk/bus/chat-command-policy.d.ts +49 -0
- package/dist/types/sdk/bus/chat-daemon-cli.d.ts +21 -0
- package/dist/types/sdk/bus/chat-daemon-control.d.ts +111 -0
- package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +77 -0
- package/dist/types/sdk/bus/chat-effect-journal.d.ts +84 -0
- package/dist/types/{notifications → sdk/bus}/config-commands.d.ts +7 -2
- package/dist/types/sdk/bus/config.d.ts +274 -0
- package/dist/types/sdk/bus/conversation-store.d.ts +72 -0
- package/dist/types/sdk/bus/discord-conversation.d.ts +58 -0
- package/dist/types/sdk/bus/discord-daemon.d.ts +45 -0
- package/dist/types/sdk/bus/discord-live-provider.d.ts +70 -0
- package/dist/types/sdk/bus/discord-provider.d.ts +85 -0
- package/dist/types/{notifications → sdk/bus}/html-format.d.ts +2 -2
- package/dist/types/{notifications → sdk/bus}/index.d.ts +113 -13
- package/dist/types/{notifications → sdk/bus}/lifecycle-control-runtime.d.ts +4 -2
- package/dist/types/{notifications → sdk/bus}/lifecycle-orchestrator.d.ts +18 -21
- package/dist/types/{notifications → sdk/bus}/managed-daemon.d.ts +1 -1
- package/dist/types/sdk/bus/native-runtime-compatibility.d.ts +13 -0
- package/dist/types/sdk/bus/notification-orchestration.d.ts +170 -0
- package/dist/types/{notifications → sdk/bus}/notification-service.d.ts +7 -1
- package/dist/types/sdk/bus/session-control.d.ts +83 -0
- package/dist/types/sdk/bus/slack-conversation.d.ts +56 -0
- package/dist/types/sdk/bus/slack-daemon.d.ts +60 -0
- package/dist/types/sdk/bus/slack-live-provider.d.ts +59 -0
- package/dist/types/sdk/bus/slack-provider.d.ts +55 -0
- package/dist/types/{notifications → sdk/bus}/telegram-cli.d.ts +4 -4
- package/dist/types/{notifications → sdk/bus}/telegram-daemon-cli.d.ts +14 -5
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +12 -0
- package/dist/types/{notifications → sdk/bus}/telegram-daemon-control.d.ts +2 -2
- package/dist/types/{notifications → sdk/bus}/telegram-daemon.d.ts +55 -17
- package/dist/types/{notifications → sdk/bus}/telegram-reference.d.ts +2 -2
- package/dist/types/sdk/bus/telegram-setup.d.ts +128 -0
- package/dist/types/{notifications → sdk/bus}/topic-registry.d.ts +11 -0
- package/dist/types/sdk/cli/index.d.ts +1 -0
- package/dist/types/sdk/cli/session-cli.d.ts +19 -0
- package/dist/types/sdk/client/client.d.ts +1 -0
- package/dist/types/sdk/client/discovery.d.ts +27 -0
- package/dist/types/sdk/client/index.d.ts +2 -0
- package/dist/types/sdk/host/control/dispatch.d.ts +34 -0
- package/dist/types/sdk/host/control/index.d.ts +2 -0
- package/dist/types/sdk/host/control/operations.d.ts +65 -0
- package/dist/types/sdk/host/events.d.ts +35 -0
- package/dist/types/sdk/host/host.d.ts +35 -0
- package/dist/types/sdk/host/index.d.ts +4 -0
- package/dist/types/sdk/host/query/cursor.d.ts +62 -0
- package/dist/types/sdk/host/query/handlers.d.ts +70 -0
- package/dist/types/sdk/host/query/index.d.ts +3 -0
- package/dist/types/sdk/host/query/revision-store.d.ts +60 -0
- package/dist/types/sdk/host/reverse-leases.d.ts +45 -0
- package/dist/types/sdk/host/types.d.ts +32 -0
- package/dist/types/sdk/index.d.ts +6 -0
- package/dist/types/sdk/lifecycle-session.d.ts +14 -0
- package/dist/types/sdk/mcp/index.d.ts +1 -0
- package/dist/types/sdk/mcp/server.d.ts +37 -0
- package/dist/types/sdk/models.d.ts +44 -0
- package/dist/types/sdk/protocol/adapter-validation.d.ts +14 -0
- package/dist/types/sdk/protocol/operation-registry.d.ts +24 -0
- package/dist/types/{sdk.d.ts → sdk/session.d.ts} +44 -38
- package/dist/types/sdk/startup-capability.d.ts +50 -0
- package/dist/types/session/agent-session.d.ts +114 -21
- package/dist/types/session/default-model-selection.d.ts +25 -0
- package/dist/types/session/fallback-chain-controller.d.ts +52 -0
- package/dist/types/session/session-manager.d.ts +58 -1
- package/dist/types/setup/credential-auto-import.d.ts +36 -6
- package/dist/types/tools/ask-answer-registry.d.ts +1 -1
- package/dist/types/tools/browser/benchmark/detector-report.d.ts +63 -0
- package/dist/types/tools/browser/benchmark/run-suite.d.ts +18 -0
- package/dist/types/tools/browser/launch.d.ts +22 -0
- package/dist/types/tools/browser/profile-discovery.d.ts +31 -0
- package/dist/types/tools/browser/profile-posture.d.ts +37 -0
- package/dist/types/tools/browser/profile-reuse.d.ts +39 -0
- package/dist/types/tools/browser/profile-warmup.d.ts +39 -0
- package/dist/types/tools/browser/registry.d.ts +19 -0
- package/dist/types/tools/browser/tab-protocol.d.ts +4 -0
- package/dist/types/tools/index.d.ts +8 -8
- package/package.json +34 -13
- package/scripts/build-sdk-package-smoke.ts +94 -0
- package/scripts/capture-notifications-settings-showcase.ts +435 -0
- package/scripts/compile-args.ts +4 -2
- package/scripts/g005-daemon-smoke.ts +4 -5
- package/scripts/g011-daemon-path-smoke.ts +5 -5
- package/scripts/generate-sdk-adapter-parity-manifest.ts +163 -0
- package/scripts/generate-sdk-operation-inventory.ts +867 -0
- package/scripts/generate-telegram-baseline-manifest.ts +128 -0
- package/scripts/manifest-schema.ts +124 -0
- package/scripts/run-test-manifest.ts +153 -0
- package/scripts/run-threat-model-check.ts +157 -0
- package/scripts/verify-gjc-sdk-canonicalization.ts +3467 -0
- package/scripts/verify-gjc-sdk-rename.ts +90 -0
- package/src/append-only-mode.ts +1 -1
- package/src/cli/args.ts +43 -12
- package/src/cli/auth-gateway-cli.ts +2 -2
- package/src/cli/config-cli.ts +2 -1
- package/src/cli/daemon-cli.ts +63 -14
- package/src/cli/list-models.ts +1 -1
- package/src/cli/notify-cli.ts +288 -286
- package/src/cli.ts +21 -2
- package/src/commands/daemon.ts +50 -6
- package/src/commands/harness.ts +93 -36
- package/src/commands/launch.ts +5 -2
- package/src/commands/mcp-serve.ts +19 -12
- package/src/commands/notify.ts +36 -3
- package/src/commands/sdk.ts +426 -0
- package/src/commit/agentic/agent.ts +1 -0
- package/src/config/atomic-yaml-patch.ts +423 -0
- package/src/config/model-profile-activation.ts +240 -89
- package/src/config/model-profiles.ts +18 -15
- package/src/config/model-registry.ts +51 -26
- package/src/config/model-resolver.ts +138 -51
- package/src/config/model-selector-value.ts +50 -0
- package/src/config/models-config-schema.ts +14 -21
- package/src/config/settings-schema.ts +128 -10
- package/src/config/settings.ts +1120 -158
- package/src/coordinator-mcp/model-preset.ts +74 -20
- package/src/coordinator-mcp/server.ts +1597 -3052
- package/src/daemon/builtin.ts +8 -5
- package/src/daemon/control-types.ts +1 -1
- package/src/defaults/gjc/skills/team/SKILL.md +4 -4
- package/src/discovery/mcp-json.ts +327 -20
- package/src/extensibility/custom-tools/types.ts +1 -1
- package/src/extensibility/extensions/compact-handler.ts +3 -3
- package/src/extensibility/extensions/get-commands-handler.ts +2 -2
- package/src/extensibility/extensions/loader.ts +69 -5
- package/src/extensibility/extensions/runner.ts +112 -4
- package/src/extensibility/extensions/types.ts +176 -17
- package/src/extensibility/hooks/types.ts +1 -1
- package/src/gjc-runtime/launch-tmux.ts +170 -86
- package/src/gjc-runtime/psmux-detect.ts +82 -4
- package/src/gjc-runtime/session-state-sidecar.ts +41 -31
- package/src/gjc-runtime/team-runtime.ts +54 -35
- package/src/gjc-runtime/tmux-owner-isolation-cli.ts +53 -17
- package/src/gjc-runtime/tmux-owner-isolation.ts +1 -1
- package/src/gjc-runtime/tmux-sessions.ts +19 -13
- package/src/gjc-runtime/ultragoal-guard.ts +53 -6
- package/src/gjc-runtime/ultragoal-runtime.ts +155 -3
- package/src/gjc-runtime/windows-powershell-command.ts +58 -0
- package/src/harness-control-plane/operate.ts +9 -9
- package/src/harness-control-plane/owner.ts +283 -39
- package/src/harness-control-plane/receipts.ts +0 -1
- package/src/harness-control-plane/sdk-transport.ts +395 -0
- package/src/harness-control-plane/session-transport.ts +94 -0
- package/src/harness-control-plane/types.ts +1 -1
- package/src/internal-urls/docs-index.generated.ts +34 -35
- package/src/lsp/client.ts +42 -6
- package/src/lsp/index.ts +2 -2
- package/src/main.ts +299 -204
- package/src/modes/DESIGN.md +258 -0
- package/src/modes/acp/acp-agent.ts +1228 -2612
- package/src/modes/acp/acp-client-bridge.ts +2 -20
- package/src/modes/acp/acp-event-mapper.ts +18 -2
- package/src/modes/acp/acp-mode.ts +8 -36
- package/src/modes/acp/permission-mode.ts +25 -0
- package/src/modes/acp/startup-options.ts +6 -0
- package/src/modes/components/agent-dashboard.ts +37 -17
- package/src/modes/components/model-selector.ts +93 -35
- package/src/modes/components/notifications-settings-editor.ts +1379 -0
- package/src/modes/components/settings-selector.ts +60 -11
- package/src/modes/components/welcome.ts +4 -4
- package/src/modes/controllers/command-controller.ts +1 -2
- package/src/modes/controllers/event-controller.ts +11 -16
- package/src/modes/controllers/extension-ui-controller.ts +348 -4
- package/src/modes/controllers/selector-controller.ts +674 -36
- package/src/modes/index.ts +0 -22
- package/src/modes/interactive-mode.ts +59 -20
- package/src/modes/runtime-init.ts +298 -6
- package/src/modes/shared/agent-wire/approval-gate.ts +9 -11
- package/src/modes/shared/agent-wire/deep-interview-gate.ts +10 -11
- package/src/modes/shared/agent-wire/event-contract.ts +7 -8
- package/src/modes/shared/agent-wire/event-envelope.ts +9 -17
- package/src/modes/shared/agent-wire/event-observation.ts +16 -7
- package/src/modes/shared/agent-wire/workflow-gate-broker.ts +1254 -87
- package/src/modes/shared/agent-wire/workflow-gate-schema.ts +15 -15
- package/src/modes/shared/agent-wire/workflow-gate-types.ts +113 -0
- package/src/modes/types.ts +5 -0
- package/src/runtime-mcp/client.ts +94 -19
- package/src/runtime-mcp/config.ts +27 -15
- package/src/runtime-mcp/manager.ts +343 -105
- package/src/runtime-mcp/oauth-flow.ts +42 -12
- package/src/runtime-mcp/transports/http.ts +49 -19
- package/src/runtime-mcp/transports/stdio.ts +47 -28
- package/src/runtime-mcp/types.ts +10 -0
- package/src/sdk/acp/adapter.ts +418 -0
- package/src/sdk/acp/index.ts +2 -0
- package/src/sdk/broker/broker.ts +642 -0
- package/src/sdk/broker/discovery.ts +94 -0
- package/src/sdk/broker/ensure.ts +249 -0
- package/src/sdk/broker/identity.ts +42 -0
- package/src/sdk/broker/index.ts +8 -0
- package/src/sdk/broker/internal-source-marker-2178.txt +1 -0
- package/src/sdk/broker/internal-source.bunfig.toml +1 -0
- package/src/sdk/broker/lifecycle-ledger.ts +286 -0
- package/src/sdk/broker/lifecycle.ts +2157 -0
- package/src/sdk/broker/process-incarnation.ts +159 -0
- package/src/sdk/broker/runtime.ts +164 -0
- package/src/sdk/broker/session-index.ts +318 -0
- package/src/sdk/broker/state-version.ts +23 -0
- package/src/sdk/broker/transport.ts +125 -0
- package/src/sdk/bus/chat-command-policy.ts +107 -0
- package/src/sdk/bus/chat-daemon-cli.ts +214 -0
- package/src/sdk/bus/chat-daemon-control.ts +713 -0
- package/src/sdk/bus/chat-daemon-runtime.ts +526 -0
- package/src/sdk/bus/chat-effect-journal.ts +353 -0
- package/src/{notifications → sdk/bus}/config-commands.ts +39 -10
- package/src/sdk/bus/config.ts +433 -0
- package/src/sdk/bus/conversation-store.ts +391 -0
- package/src/sdk/bus/discord-conversation.ts +85 -0
- package/src/sdk/bus/discord-daemon.ts +2275 -0
- package/src/sdk/bus/discord-live-provider.ts +521 -0
- package/src/sdk/bus/discord-provider.ts +56 -0
- package/src/{notifications → sdk/bus}/html-format.ts +2 -2
- package/src/sdk/bus/index.ts +3943 -0
- package/src/{notifications → sdk/bus}/lifecycle-commands.ts +2 -0
- package/src/{notifications → sdk/bus}/lifecycle-control-runtime.ts +225 -196
- package/src/{notifications → sdk/bus}/lifecycle-orchestrator.ts +161 -74
- package/src/{notifications → sdk/bus}/managed-daemon.ts +2 -2
- package/src/sdk/bus/native-runtime-compatibility.ts +42 -0
- package/src/sdk/bus/natives-augment.d.ts +38 -0
- package/src/sdk/bus/notification-orchestration.ts +535 -0
- package/src/{notifications → sdk/bus}/notification-service.ts +106 -12
- package/src/sdk/bus/session-control.ts +333 -0
- package/src/sdk/bus/slack-conversation.ts +74 -0
- package/src/sdk/bus/slack-daemon.ts +2144 -0
- package/src/sdk/bus/slack-live-provider.ts +380 -0
- package/src/sdk/bus/slack-provider.ts +76 -0
- package/src/{notifications → sdk/bus}/telegram-cli.ts +8 -8
- package/src/sdk/bus/telegram-daemon-cli.ts +330 -0
- package/src/sdk/bus/telegram-daemon-contract.ts +14 -0
- package/src/{notifications → sdk/bus}/telegram-daemon-control.ts +4 -4
- package/src/{notifications → sdk/bus}/telegram-daemon.ts +502 -54
- package/src/{notifications → sdk/bus}/telegram-reference.ts +2 -2
- package/src/sdk/bus/telegram-setup.ts +663 -0
- package/src/{notifications → sdk/bus}/topic-registry.ts +32 -0
- package/src/sdk/cli/index.ts +1 -0
- package/src/sdk/cli/session-cli.ts +275 -0
- package/src/sdk/client/client.ts +1 -0
- package/src/sdk/client/discovery.ts +108 -0
- package/src/sdk/client/index.ts +2 -0
- package/src/sdk/host/control/dispatch.ts +367 -0
- package/src/sdk/host/control/index.ts +10 -0
- package/src/sdk/host/control/operations.ts +63 -0
- package/src/sdk/host/events.ts +91 -0
- package/src/sdk/host/host.ts +296 -0
- package/src/sdk/host/index.ts +4 -0
- package/src/sdk/host/query/cursor.ts +189 -0
- package/src/sdk/host/query/handlers.ts +533 -0
- package/src/sdk/host/query/index.ts +3 -0
- package/src/sdk/host/query/revision-store.ts +1126 -0
- package/src/sdk/host/reverse-leases.ts +325 -0
- package/src/sdk/host/types.ts +29 -0
- package/src/sdk/index.ts +13 -0
- package/src/sdk/lifecycle-session.ts +39 -0
- package/src/sdk/mcp/index.ts +1 -0
- package/src/sdk/mcp/server.ts +332 -0
- package/src/sdk/models.ts +168 -0
- package/src/sdk/protocol/adapter-validation.ts +48 -0
- package/src/sdk/protocol/operation-inventory.generated.json +5654 -0
- package/src/sdk/protocol/operation-registry.ts +312 -0
- package/src/{sdk.ts → sdk/session.ts} +339 -212
- package/src/sdk/startup-capability.ts +189 -0
- package/src/session/agent-session.ts +2453 -894
- package/src/session/default-model-selection.ts +93 -0
- package/src/session/fallback-chain-controller.ts +136 -0
- package/src/session/session-manager.ts +438 -11
- package/src/session/session-storage.ts +8 -1
- package/src/setup/credential-auto-import.ts +290 -35
- package/src/setup/hermes/templates/operator-instructions.v1.md +3 -5
- package/src/slash-commands/builtin-registry.ts +2 -1
- package/src/task/executor.ts +62 -13
- package/src/tools/ask-answer-registry.ts +1 -1
- package/src/tools/ask.ts +13 -8
- package/src/tools/browser/STEALTH-THIRD-PARTY-NOTICES.md +26 -0
- package/src/tools/browser/benchmark/detector-report.ts +157 -0
- package/src/tools/browser/benchmark/run-suite.ts +39 -0
- package/src/tools/browser/launch.ts +124 -19
- package/src/tools/browser/profile-discovery.ts +63 -0
- package/src/tools/browser/profile-posture.ts +59 -0
- package/src/tools/browser/profile-reuse.ts +102 -0
- package/src/tools/browser/profile-warmup.ts +109 -0
- package/src/tools/browser/registry.ts +87 -11
- package/src/tools/browser/tab-protocol.ts +1 -0
- package/src/tools/browser/tab-supervisor.ts +1 -0
- package/src/tools/browser/tab-worker.ts +1 -1
- package/src/tools/browser.ts +6 -0
- package/src/tools/index.ts +8 -8
- package/src/tools/puppeteer/14_stealth_permissions.txt +57 -0
- package/src/tools/puppeteer/15_stealth_webrtc.txt +60 -0
- package/src/tools/telegram-send.ts +2 -2
- package/vendor/insane-search/MANIFEST.json +2 -1
- package/vendor/insane-search/engine/bias_check.py +4 -1
- package/vendor/insane-search/engine/phase0.py +26 -1
- package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
- package/dist/types/modes/bridge/auth.d.ts +0 -12
- package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
- package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
- package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
- package/dist/types/modes/bridge/event-stream.d.ts +0 -8
- package/dist/types/modes/rpc/host-tools.d.ts +0 -1
- package/dist/types/modes/rpc/host-uris.d.ts +0 -1
- package/dist/types/modes/rpc/rpc-client.d.ts +0 -299
- package/dist/types/modes/rpc/rpc-mode.d.ts +0 -86
- package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
- package/dist/types/modes/rpc/rpc-types.d.ts +0 -810
- package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
- package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
- package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
- package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
- package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
- package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
- package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
- package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
- package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
- package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
- package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
- package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
- package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
- package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
- package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -166
- package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -127
- package/dist/types/notifications/config.d.ts +0 -132
- package/src/harness-control-plane/rpc-adapter.ts +0 -290
- package/src/modes/bridge/auth.ts +0 -41
- package/src/modes/bridge/bridge-client-bridge.ts +0 -47
- package/src/modes/bridge/bridge-mode.ts +0 -675
- package/src/modes/bridge/bridge-ui-context.ts +0 -200
- package/src/modes/bridge/event-stream.ts +0 -70
- package/src/modes/rpc/host-tools.ts +0 -1
- package/src/modes/rpc/host-uris.ts +0 -1
- package/src/modes/rpc/rpc-client.ts +0 -1166
- package/src/modes/rpc/rpc-mode.ts +0 -1029
- package/src/modes/rpc/rpc-socket-security.ts +0 -115
- package/src/modes/rpc/rpc-types.ts +0 -637
- package/src/modes/shared/agent-wire/command-contract.ts +0 -18
- package/src/modes/shared/agent-wire/command-dispatch.ts +0 -498
- package/src/modes/shared/agent-wire/command-validation.ts +0 -181
- package/src/modes/shared/agent-wire/handshake.ts +0 -157
- package/src/modes/shared/agent-wire/host-tool-bridge.ts +0 -197
- package/src/modes/shared/agent-wire/host-uri-bridge.ts +0 -236
- package/src/modes/shared/agent-wire/protocol.ts +0 -46
- package/src/modes/shared/agent-wire/responses.ts +0 -17
- package/src/modes/shared/agent-wire/scopes.ts +0 -94
- package/src/modes/shared/agent-wire/session-registry.ts +0 -109
- package/src/modes/shared/agent-wire/ui-request-broker.ts +0 -150
- package/src/modes/shared/agent-wire/ui-result.ts +0 -48
- package/src/modes/shared/agent-wire/unattended-action-policy.ts +0 -365
- package/src/modes/shared/agent-wire/unattended-audit.ts +0 -176
- package/src/modes/shared/agent-wire/unattended-run-controller.ts +0 -426
- package/src/modes/shared/agent-wire/unattended-session.ts +0 -528
- package/src/notifications/config.ts +0 -219
- package/src/notifications/index.ts +0 -1835
- package/src/notifications/telegram-daemon-cli.ts +0 -243
- package/src/tools/puppeteer/09_stealth_locale.txt +0 -46
- /package/dist/types/{notifications → sdk/bus}/attachment-registry.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/chat-adapters.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/daemon-paths.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/engine.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/helpers.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/lifecycle-commands.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/operator-runtime.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/rate-limit-pool.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/recent-activity.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/reply-sent-store.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/rich-draft.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/rich-render.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/threaded-inbound.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/threaded-render.d.ts +0 -0
- /package/src/{notifications → sdk/bus}/attachment-registry.ts +0 -0
- /package/src/{notifications → sdk/bus}/chat-adapters.ts +0 -0
- /package/src/{notifications → sdk/bus}/daemon-paths.ts +0 -0
- /package/src/{notifications → sdk/bus}/engine.ts +0 -0
- /package/src/{notifications → sdk/bus}/helpers.ts +0 -0
- /package/src/{notifications → sdk/bus}/operator-runtime.ts +0 -0
- /package/src/{notifications → sdk/bus}/rate-limit-pool.ts +0 -0
- /package/src/{notifications → sdk/bus}/recent-activity.ts +0 -0
- /package/src/{notifications → sdk/bus}/reply-sent-store.ts +0 -0
- /package/src/{notifications → sdk/bus}/rich-draft.ts +0 -0
- /package/src/{notifications → sdk/bus}/rich-render.ts +0 -0
- /package/src/{notifications → sdk/bus}/threaded-inbound.ts +0 -0
- /package/src/{notifications → sdk/bus}/threaded-render.ts +0 -0
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { getAgentDir } from "@gajae-code/utils";
|
|
3
|
+
import { ensureBroker } from "../broker/ensure";
|
|
4
|
+
import { SdkClient, SdkClientError } from "../client/client";
|
|
5
|
+
import {
|
|
6
|
+
listSdkSessionEndpoints,
|
|
7
|
+
readSdkBrokerDiscovery,
|
|
8
|
+
readSdkSessionEndpoint,
|
|
9
|
+
SdkDiscoveryError,
|
|
10
|
+
} from "../client/discovery";
|
|
11
|
+
import { validateAdapterControl, validateAdapterSecretFields } from "../protocol/adapter-validation";
|
|
12
|
+
import { adapterDispositionError, findOperation } from "../protocol/operation-registry";
|
|
13
|
+
|
|
14
|
+
const PROTOCOL_VERSION = "2024-11-05";
|
|
15
|
+
const SERVER_NAME = "gjc-sdk-mcp";
|
|
16
|
+
const ENDPOINT_CREDENTIAL_OPERATION = "session.get_endpoint";
|
|
17
|
+
|
|
18
|
+
type Arguments = Record<string, unknown>;
|
|
19
|
+
type JsonRpcRequest = { jsonrpc: "2.0"; id?: string | number | null; method: string; params?: unknown };
|
|
20
|
+
type JsonRpcResponse = {
|
|
21
|
+
jsonrpc: "2.0";
|
|
22
|
+
id: string | number | null;
|
|
23
|
+
result?: unknown;
|
|
24
|
+
error?: { code: number; message: string };
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export interface SdkMcpServerOptions {
|
|
28
|
+
repo?: string;
|
|
29
|
+
agentDir?: string;
|
|
30
|
+
connect?: (url: string, token: string) => Promise<SdkClient>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const SDK_MCP_TOOL_NAMES = [
|
|
34
|
+
"gjc_session_control",
|
|
35
|
+
"gjc_session_query",
|
|
36
|
+
"gjc_session_global",
|
|
37
|
+
"gjc_session_list",
|
|
38
|
+
] as const;
|
|
39
|
+
|
|
40
|
+
function schema(name: (typeof SDK_MCP_TOOL_NAMES)[number]): Record<string, unknown> {
|
|
41
|
+
const common = { type: "object", additionalProperties: false };
|
|
42
|
+
switch (name) {
|
|
43
|
+
case "gjc_session_control":
|
|
44
|
+
return {
|
|
45
|
+
name,
|
|
46
|
+
description: "Run a typed SDK control operation for one session.",
|
|
47
|
+
inputSchema: {
|
|
48
|
+
...common,
|
|
49
|
+
required: ["sessionId", "operation"],
|
|
50
|
+
properties: {
|
|
51
|
+
sessionId: { type: "string" },
|
|
52
|
+
operation: { type: "string" },
|
|
53
|
+
input: { type: "object" },
|
|
54
|
+
confirm: { type: "boolean", description: "Required for destructive controls." },
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
case "gjc_session_query":
|
|
59
|
+
return {
|
|
60
|
+
name,
|
|
61
|
+
description: "Run a typed SDK query for one session.",
|
|
62
|
+
inputSchema: {
|
|
63
|
+
...common,
|
|
64
|
+
required: ["sessionId", "query"],
|
|
65
|
+
properties: {
|
|
66
|
+
sessionId: { type: "string" },
|
|
67
|
+
query: { type: "string" },
|
|
68
|
+
input: { type: "object" },
|
|
69
|
+
cursor: { type: "string" },
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
case "gjc_session_global":
|
|
74
|
+
return {
|
|
75
|
+
name,
|
|
76
|
+
description: "Run a typed agent-global SDK broker operation.",
|
|
77
|
+
inputSchema: {
|
|
78
|
+
...common,
|
|
79
|
+
required: ["operation"],
|
|
80
|
+
properties: {
|
|
81
|
+
operation: { type: "string" },
|
|
82
|
+
input: { type: "object" },
|
|
83
|
+
idempotencyKey: {
|
|
84
|
+
type: "string",
|
|
85
|
+
description:
|
|
86
|
+
"Required for session.create, session.fork, session.resume, session.close, and session.delete.",
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
case "gjc_session_list":
|
|
92
|
+
return {
|
|
93
|
+
name,
|
|
94
|
+
description: "List locally discoverable SDK session IDs.",
|
|
95
|
+
inputSchema: { ...common, properties: {} },
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function isObject(value: unknown): value is Arguments {
|
|
101
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function asString(args: Arguments, name: string): string | null {
|
|
105
|
+
return typeof args[name] === "string" && args[name] ? (args[name] as string) : null;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function resultError(error: unknown): { ok: false; error: { code: string; message: string; path?: string } } {
|
|
109
|
+
if (error instanceof SdkDiscoveryError)
|
|
110
|
+
return { ok: false, error: { code: error.code, path: path.basename(error.path), message: error.message } };
|
|
111
|
+
if (error instanceof SdkClientError) return { ok: false, error: { code: error.code, message: error.message } };
|
|
112
|
+
return {
|
|
113
|
+
ok: false,
|
|
114
|
+
error: { code: "unavailable", message: error instanceof Error ? error.message : "SDK request failed" },
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function endpointCredentialForbidden(): {
|
|
119
|
+
ok: false;
|
|
120
|
+
error: { code: "endpoint_credential_forbidden"; message: string };
|
|
121
|
+
} {
|
|
122
|
+
return {
|
|
123
|
+
ok: false,
|
|
124
|
+
error: { code: "endpoint_credential_forbidden", message: "session.get_endpoint is not available through MCP" },
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function invalidControl(error: { code: string; message: string }): {
|
|
129
|
+
ok: false;
|
|
130
|
+
error: { code: string; message: string };
|
|
131
|
+
} {
|
|
132
|
+
return { ok: false, error };
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function mcpOperationError(
|
|
136
|
+
kind: "control" | "global" | "query",
|
|
137
|
+
operation: string,
|
|
138
|
+
): { code: string; message: string } | undefined {
|
|
139
|
+
const row = findOperation(kind, operation);
|
|
140
|
+
if (!row) return adapterDispositionError("mcp", kind, operation, true);
|
|
141
|
+
if (kind === "global" && operation === ENDPOINT_CREDENTIAL_OPERATION) return endpointCredentialForbidden().error;
|
|
142
|
+
return adapterDispositionError("mcp", kind, operation, true);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function isLifecycleOperation(operation: string): boolean {
|
|
146
|
+
return (
|
|
147
|
+
operation === "session.create" ||
|
|
148
|
+
operation === "session.fork" ||
|
|
149
|
+
operation === "session.resume" ||
|
|
150
|
+
operation === "session.close" ||
|
|
151
|
+
operation === "session.delete"
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
function redactLifecycleCredentials(value: unknown): unknown {
|
|
155
|
+
if (Array.isArray(value)) return value.map(redactLifecycleCredentials);
|
|
156
|
+
if (!isObject(value)) return value;
|
|
157
|
+
return Object.fromEntries(
|
|
158
|
+
Object.entries(value)
|
|
159
|
+
.filter(([key]) => key !== "endpoint" && key !== "token")
|
|
160
|
+
.map(([key, nested]) => [key, redactLifecycleCredentials(nested)]),
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function textResult(
|
|
165
|
+
payload: unknown,
|
|
166
|
+
isError: boolean,
|
|
167
|
+
): { content: Array<{ type: "text"; text: string }>; isError: boolean } {
|
|
168
|
+
return { content: [{ type: "text", text: JSON.stringify(payload) }], isError };
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/** Creates the model-facing MCP adapter using only SDK discovery records and v3 WebSockets. */
|
|
172
|
+
export function createSdkMcpServer(options: SdkMcpServerOptions = {}) {
|
|
173
|
+
const repo = options.repo ?? process.cwd();
|
|
174
|
+
const agentDir = options.agentDir ?? getAgentDir();
|
|
175
|
+
const connect = options.connect ?? ((url, token) => SdkClient.connect(url, token));
|
|
176
|
+
|
|
177
|
+
async function withSession(sessionId: string, action: (client: SdkClient) => Promise<unknown>): Promise<unknown> {
|
|
178
|
+
let client: SdkClient | undefined;
|
|
179
|
+
try {
|
|
180
|
+
const endpoint = await readSdkSessionEndpoint(repo, sessionId);
|
|
181
|
+
if (!endpoint)
|
|
182
|
+
return { ok: false, error: { code: "not_found", message: `SDK session not found: ${sessionId}` } };
|
|
183
|
+
client = await connect(endpoint.url, endpoint.token);
|
|
184
|
+
return await action(client);
|
|
185
|
+
} catch (error) {
|
|
186
|
+
return resultError(error);
|
|
187
|
+
} finally {
|
|
188
|
+
await client?.close();
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
async function callTool(name: string, args: Arguments = {}): Promise<unknown> {
|
|
193
|
+
if (name === "gjc_session_list") {
|
|
194
|
+
try {
|
|
195
|
+
const { endpoints, warnings } = await listSdkSessionEndpoints(repo);
|
|
196
|
+
return { ok: true, sessions: endpoints.map(({ sessionId }) => ({ sessionId })), warnings };
|
|
197
|
+
} catch (error) {
|
|
198
|
+
return resultError(error);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (name === "gjc_session_control") {
|
|
202
|
+
const sessionId = asString(args, "sessionId");
|
|
203
|
+
const operation = asString(args, "operation");
|
|
204
|
+
if (!sessionId || !operation)
|
|
205
|
+
return { ok: false, error: { code: "invalid_input", message: "sessionId and operation are required" } };
|
|
206
|
+
const input = isObject(args.input) ? args.input : {};
|
|
207
|
+
const dispositionError = mcpOperationError("control", operation);
|
|
208
|
+
if (dispositionError) return invalidControl(dispositionError);
|
|
209
|
+
const secretError = validateAdapterSecretFields(operation, input);
|
|
210
|
+
if (secretError) return invalidControl(secretError);
|
|
211
|
+
const invalid = validateAdapterControl(operation, input);
|
|
212
|
+
if (invalid) return invalidControl(invalid);
|
|
213
|
+
return await withSession(sessionId, client =>
|
|
214
|
+
client.control(operation, input, { confirm: args.confirm === true }),
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
if (name === "gjc_session_query") {
|
|
218
|
+
const sessionId = asString(args, "sessionId");
|
|
219
|
+
const query = asString(args, "query");
|
|
220
|
+
if (!sessionId || !query)
|
|
221
|
+
return { ok: false, error: { code: "invalid_input", message: "sessionId and query are required" } };
|
|
222
|
+
const cursor = args.cursor === undefined ? undefined : asString(args, "cursor");
|
|
223
|
+
if (args.cursor !== undefined && cursor === null)
|
|
224
|
+
return { ok: false, error: { code: "invalid_input", message: "cursor must be a string" } };
|
|
225
|
+
const input = isObject(args.input) ? args.input : {};
|
|
226
|
+
const dispositionError = mcpOperationError("query", query);
|
|
227
|
+
if (dispositionError) return invalidControl(dispositionError);
|
|
228
|
+
return await withSession(sessionId, client => client.query(query, input, cursor ?? undefined));
|
|
229
|
+
}
|
|
230
|
+
if (name === "gjc_session_global") {
|
|
231
|
+
const operation = asString(args, "operation");
|
|
232
|
+
if (!operation) return { ok: false, error: { code: "invalid_input", message: "operation is required" } };
|
|
233
|
+
const input = isObject(args.input) ? args.input : {};
|
|
234
|
+
const dispositionError = mcpOperationError("global", operation);
|
|
235
|
+
if (dispositionError) return invalidControl(dispositionError);
|
|
236
|
+
const secretError = validateAdapterSecretFields(operation, input);
|
|
237
|
+
if (secretError) return invalidControl(secretError);
|
|
238
|
+
const idempotencyKey =
|
|
239
|
+
args.idempotencyKey === undefined ? undefined : (asString(args, "idempotencyKey") ?? undefined);
|
|
240
|
+
if (args.idempotencyKey !== undefined && !idempotencyKey)
|
|
241
|
+
return {
|
|
242
|
+
ok: false,
|
|
243
|
+
error: { code: "invalid_input", message: "idempotencyKey must be a non-empty string" },
|
|
244
|
+
};
|
|
245
|
+
if (isLifecycleOperation(operation) && !idempotencyKey)
|
|
246
|
+
return {
|
|
247
|
+
ok: false,
|
|
248
|
+
error: { code: "invalid_input", message: "idempotencyKey is required for lifecycle operations" },
|
|
249
|
+
};
|
|
250
|
+
let client: SdkClient | undefined;
|
|
251
|
+
try {
|
|
252
|
+
await ensureBroker({ agentDir });
|
|
253
|
+
const broker = await readSdkBrokerDiscovery(agentDir);
|
|
254
|
+
if (!broker) return { ok: false, error: { code: "not_found", message: "SDK broker not found" } };
|
|
255
|
+
client = await connect(broker.url, broker.token);
|
|
256
|
+
const response = await client.global(operation, input, { idempotencyKey });
|
|
257
|
+
return isLifecycleOperation(operation) ? redactLifecycleCredentials(response) : response;
|
|
258
|
+
} catch (error) {
|
|
259
|
+
return resultError(error);
|
|
260
|
+
} finally {
|
|
261
|
+
await client?.close();
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return { ok: false, error: { code: "unknown_tool", message: `Unknown SDK MCP tool: ${name}` } };
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
async function handleJsonRpc(request: JsonRpcRequest): Promise<JsonRpcResponse> {
|
|
268
|
+
const id = request.id ?? null;
|
|
269
|
+
if (request.method === "initialize")
|
|
270
|
+
return {
|
|
271
|
+
jsonrpc: "2.0",
|
|
272
|
+
id,
|
|
273
|
+
result: {
|
|
274
|
+
protocolVersion: PROTOCOL_VERSION,
|
|
275
|
+
capabilities: { tools: {} },
|
|
276
|
+
serverInfo: { name: SERVER_NAME },
|
|
277
|
+
},
|
|
278
|
+
};
|
|
279
|
+
if (request.method === "tools/list")
|
|
280
|
+
return { jsonrpc: "2.0", id, result: { tools: SDK_MCP_TOOL_NAMES.map(schema) } };
|
|
281
|
+
if (request.method === "tools/call") {
|
|
282
|
+
const params = isObject(request.params) ? request.params : {};
|
|
283
|
+
const payload = await callTool(
|
|
284
|
+
typeof params.name === "string" ? params.name : "",
|
|
285
|
+
isObject(params.arguments) ? params.arguments : {},
|
|
286
|
+
);
|
|
287
|
+
const failed = isObject(payload) && payload.ok === false;
|
|
288
|
+
return { jsonrpc: "2.0", id, result: textResult(payload, failed) };
|
|
289
|
+
}
|
|
290
|
+
return { jsonrpc: "2.0", id, error: { code: -32601, message: `unknown_method:${request.method}` } };
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
return { callTool, handleJsonRpc, handle: handleJsonRpc, tools: SDK_MCP_TOOL_NAMES.map(schema) };
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Runs the SDK MCP server over stdio (newline-delimited JSON-RPC), the shipped
|
|
298
|
+
* `gjc mcp-serve sdk` entrypoint. Pure SDK client: session control/query flows
|
|
299
|
+
* through discovery records and v3 WebSockets only.
|
|
300
|
+
*/
|
|
301
|
+
export async function runSdkMcpStdio(options: SdkMcpServerOptions = {}): Promise<void> {
|
|
302
|
+
const server = createSdkMcpServer(options);
|
|
303
|
+
let buffer = "";
|
|
304
|
+
process.stdin.setEncoding("utf8");
|
|
305
|
+
await new Promise<void>(resolve => {
|
|
306
|
+
process.stdin.on("data", (chunk: string) => {
|
|
307
|
+
buffer += chunk;
|
|
308
|
+
let index = buffer.indexOf("\n");
|
|
309
|
+
while (index >= 0) {
|
|
310
|
+
const line = buffer.slice(0, index).trim();
|
|
311
|
+
buffer = buffer.slice(index + 1);
|
|
312
|
+
index = buffer.indexOf("\n");
|
|
313
|
+
if (!line) continue;
|
|
314
|
+
void (async () => {
|
|
315
|
+
let request: JsonRpcRequest;
|
|
316
|
+
try {
|
|
317
|
+
request = JSON.parse(line) as JsonRpcRequest;
|
|
318
|
+
} catch {
|
|
319
|
+
process.stdout.write(
|
|
320
|
+
`${JSON.stringify({ jsonrpc: "2.0", id: null, error: { code: -32700, message: "parse_error" } })}\n`,
|
|
321
|
+
);
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
const response = await server.handleJsonRpc(request);
|
|
325
|
+
// JSON-RPC notifications (no id) receive no response.
|
|
326
|
+
if (request.id !== undefined) process.stdout.write(`${JSON.stringify(response)}\n`);
|
|
327
|
+
})();
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
process.stdin.on("end", () => resolve());
|
|
331
|
+
});
|
|
332
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { ThinkingLevel } from "@gajae-code/agent-core";
|
|
2
|
+
import {
|
|
3
|
+
type Api,
|
|
4
|
+
type Effort,
|
|
5
|
+
getSupportedEfforts,
|
|
6
|
+
type Model,
|
|
7
|
+
THINKING_CONTROL_MODES,
|
|
8
|
+
THINKING_EFFORTS,
|
|
9
|
+
type ThinkingControlMode,
|
|
10
|
+
} from "@gajae-code/ai";
|
|
11
|
+
|
|
12
|
+
export type Q10ThinkingEffort = Effort;
|
|
13
|
+
export type Q10SettableThinkingLevel = typeof ThinkingLevel.Off | Q10ThinkingEffort;
|
|
14
|
+
export type Q10CurrentThinkingLevel = Q10SettableThinkingLevel | typeof ThinkingLevel.Inherit;
|
|
15
|
+
export type Q10ThinkingMode = ThinkingControlMode;
|
|
16
|
+
|
|
17
|
+
export interface Q10ThinkingCapabilities {
|
|
18
|
+
validLevels: readonly Q10SettableThinkingLevel[];
|
|
19
|
+
minLevel?: Q10ThinkingEffort;
|
|
20
|
+
maxLevel?: Q10ThinkingEffort;
|
|
21
|
+
mode?: Q10ThinkingMode;
|
|
22
|
+
defaultLevel?: Q10ThinkingEffort;
|
|
23
|
+
/** Fresh raw explicit descriptor copy; source order retained. */
|
|
24
|
+
levels?: readonly Q10ThinkingEffort[];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface Q10Model {
|
|
28
|
+
provider: string;
|
|
29
|
+
id: string;
|
|
30
|
+
name: string;
|
|
31
|
+
contextWindow: number;
|
|
32
|
+
maxTokens: number;
|
|
33
|
+
reasoning: boolean;
|
|
34
|
+
thinking: Q10ThinkingCapabilities;
|
|
35
|
+
current: boolean;
|
|
36
|
+
currentThinkingLevel?: Q10CurrentThinkingLevel;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export type Q10ThinkingMetadataReason =
|
|
40
|
+
| "missing_thinking"
|
|
41
|
+
| "unknown_min_level"
|
|
42
|
+
| "unknown_max_level"
|
|
43
|
+
| "inverted_range"
|
|
44
|
+
| "unknown_mode"
|
|
45
|
+
| "empty_levels"
|
|
46
|
+
| "unknown_level"
|
|
47
|
+
| "level_out_of_range"
|
|
48
|
+
| "lower_bound_mismatch"
|
|
49
|
+
| "upper_bound_mismatch"
|
|
50
|
+
| "supported_membership_mismatch"
|
|
51
|
+
| "empty_supported_levels"
|
|
52
|
+
| "unknown_default_level"
|
|
53
|
+
| "default_not_supported";
|
|
54
|
+
|
|
55
|
+
/** An intentionally safe error for malformed model thinking metadata. */
|
|
56
|
+
export class Q10ThinkingMetadataError extends Error {
|
|
57
|
+
readonly code = "internal";
|
|
58
|
+
|
|
59
|
+
constructor(
|
|
60
|
+
provider: string,
|
|
61
|
+
id: string,
|
|
62
|
+
readonly reason: Q10ThinkingMetadataReason,
|
|
63
|
+
) {
|
|
64
|
+
super(`Invalid thinking metadata for ${provider}/${id}: ${reason}`);
|
|
65
|
+
this.name = "Q10ThinkingMetadataError";
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface Q10ModelProjectionInput {
|
|
70
|
+
models: readonly Model<Api>[];
|
|
71
|
+
currentModel?: Model<Api>;
|
|
72
|
+
currentThinkingLevel?: Q10CurrentThinkingLevel;
|
|
73
|
+
resolveSupportedEfforts?: (model: Model<Api>) => readonly Effort[];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Projects model registry entries into the Q10 public DTO without exposing
|
|
78
|
+
* transport, credentials, pricing, or other registry internals.
|
|
79
|
+
*/
|
|
80
|
+
export function projectQ10Models(input: Q10ModelProjectionInput): Q10Model[] {
|
|
81
|
+
return input.models.map(model => {
|
|
82
|
+
const current = input.currentModel?.provider === model.provider && input.currentModel.id === model.id;
|
|
83
|
+
const base: Q10Model = {
|
|
84
|
+
provider: model.provider,
|
|
85
|
+
id: model.id,
|
|
86
|
+
name: model.name,
|
|
87
|
+
contextWindow: model.contextWindow,
|
|
88
|
+
maxTokens: model.maxTokens,
|
|
89
|
+
reasoning: model.reasoning,
|
|
90
|
+
thinking: { validLevels: [ThinkingLevel.Off] },
|
|
91
|
+
current,
|
|
92
|
+
...(current && input.currentThinkingLevel !== undefined
|
|
93
|
+
? { currentThinkingLevel: input.currentThinkingLevel }
|
|
94
|
+
: {}),
|
|
95
|
+
};
|
|
96
|
+
if (!model.reasoning) return base;
|
|
97
|
+
|
|
98
|
+
return {
|
|
99
|
+
...base,
|
|
100
|
+
thinking: projectThinking(model, input.resolveSupportedEfforts ?? getSupportedEfforts),
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function projectThinking(
|
|
106
|
+
model: Model<Api>,
|
|
107
|
+
resolveSupportedEfforts: (model: Model<Api>) => readonly Effort[],
|
|
108
|
+
): Q10ThinkingCapabilities {
|
|
109
|
+
const descriptor = model.thinking;
|
|
110
|
+
if (!descriptor) throw invalid(model, "missing_thinking");
|
|
111
|
+
|
|
112
|
+
if (!isEffort(descriptor.minLevel)) throw invalid(model, "unknown_min_level");
|
|
113
|
+
if (!isEffort(descriptor.maxLevel)) throw invalid(model, "unknown_max_level");
|
|
114
|
+
const minimumIndex = THINKING_EFFORTS.indexOf(descriptor.minLevel);
|
|
115
|
+
const maximumIndex = THINKING_EFFORTS.indexOf(descriptor.maxLevel);
|
|
116
|
+
if (minimumIndex > maximumIndex) throw invalid(model, "inverted_range");
|
|
117
|
+
if (!THINKING_CONTROL_MODES.includes(descriptor.mode)) throw invalid(model, "unknown_mode");
|
|
118
|
+
|
|
119
|
+
const levels = descriptor.levels;
|
|
120
|
+
if (levels !== undefined) {
|
|
121
|
+
if (levels.length === 0) throw invalid(model, "empty_levels");
|
|
122
|
+
for (const level of levels) {
|
|
123
|
+
if (!isEffort(level)) throw invalid(model, "unknown_level");
|
|
124
|
+
const levelIndex = THINKING_EFFORTS.indexOf(level);
|
|
125
|
+
if (levelIndex < minimumIndex || levelIndex > maximumIndex) throw invalid(model, "level_out_of_range");
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (descriptor.defaultLevel !== undefined && !isEffort(descriptor.defaultLevel))
|
|
129
|
+
throw invalid(model, "unknown_default_level");
|
|
130
|
+
|
|
131
|
+
const supported = new Set<Effort>();
|
|
132
|
+
for (const level of resolveSupportedEfforts(model)) {
|
|
133
|
+
if (!isEffort(level)) throw invalid(model, "unknown_level");
|
|
134
|
+
supported.add(level);
|
|
135
|
+
}
|
|
136
|
+
const canonicalSupported = THINKING_EFFORTS.filter(level => supported.has(level));
|
|
137
|
+
if (canonicalSupported.length === 0) throw invalid(model, "empty_supported_levels");
|
|
138
|
+
if (descriptor.defaultLevel !== undefined && !supported.has(descriptor.defaultLevel))
|
|
139
|
+
throw invalid(model, "default_not_supported");
|
|
140
|
+
|
|
141
|
+
if (levels !== undefined) {
|
|
142
|
+
const explicit = new Set<Effort>(levels);
|
|
143
|
+
const canonicalExplicit = THINKING_EFFORTS.filter(level => explicit.has(level));
|
|
144
|
+
if (canonicalExplicit[0] !== descriptor.minLevel) throw invalid(model, "lower_bound_mismatch");
|
|
145
|
+
if (canonicalExplicit.at(-1) !== descriptor.maxLevel) throw invalid(model, "upper_bound_mismatch");
|
|
146
|
+
if (!sameMembership(explicit, supported)) throw invalid(model, "supported_membership_mismatch");
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return {
|
|
150
|
+
validLevels: [ThinkingLevel.Off, ...canonicalSupported],
|
|
151
|
+
minLevel: descriptor.minLevel,
|
|
152
|
+
maxLevel: descriptor.maxLevel,
|
|
153
|
+
mode: descriptor.mode,
|
|
154
|
+
...(descriptor.defaultLevel !== undefined ? { defaultLevel: descriptor.defaultLevel } : {}),
|
|
155
|
+
...(levels !== undefined ? { levels: [...levels] } : {}),
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function invalid(model: Model<Api>, reason: Q10ThinkingMetadataReason): Q10ThinkingMetadataError {
|
|
160
|
+
return new Q10ThinkingMetadataError(model.provider, model.id, reason);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function isEffort(value: unknown): value is Effort {
|
|
164
|
+
return (THINKING_EFFORTS as readonly unknown[]).includes(value);
|
|
165
|
+
}
|
|
166
|
+
function sameMembership(left: ReadonlySet<Effort>, right: ReadonlySet<Effort>): boolean {
|
|
167
|
+
return left.size === right.size && [...left].every(level => right.has(level));
|
|
168
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
const RELOAD_COMPONENTS = new Set(["config", "models", "skills", "extensions", "tools"]);
|
|
2
|
+
const SERVICE_TIERS = new Set(["none", "auto", "default", "flex", "scale", "priority", "openai-only", "claude-only"]);
|
|
3
|
+
|
|
4
|
+
type Input = Record<string, unknown>;
|
|
5
|
+
|
|
6
|
+
type SecretInputError = { code: "secret_field_forbidden"; message: string };
|
|
7
|
+
const SECRET_FIELD = /(?:secret|token|password|credential|authorization|api[_-]?key)/i;
|
|
8
|
+
|
|
9
|
+
function containsSecretField(value: unknown): boolean {
|
|
10
|
+
if (Array.isArray(value)) return value.some(containsSecretField);
|
|
11
|
+
if (!value || typeof value !== "object") return false;
|
|
12
|
+
return Object.entries(value).some(([key, nested]) => SECRET_FIELD.test(key) || containsSecretField(nested));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Rejects secret-bearing config patches from model-facing adapter inputs. */
|
|
16
|
+
export function validateAdapterSecretFields(operation: string, input: Input): SecretInputError | undefined {
|
|
17
|
+
if (operation === "config.patch" && containsSecretField(input)) {
|
|
18
|
+
return {
|
|
19
|
+
code: "secret_field_forbidden",
|
|
20
|
+
message: "config.patch secret fields are not available through this adapter.",
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export type AdapterValidationError = {
|
|
27
|
+
code: "invalid_reload_component" | "invalid_input";
|
|
28
|
+
message: string;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/** Validates controls that adapters must reject before forwarding them to a host. */
|
|
32
|
+
export function validateAdapterControl(operation: string, input: Input): AdapterValidationError | undefined {
|
|
33
|
+
if (operation === "runtime.reload") {
|
|
34
|
+
if (
|
|
35
|
+
!Array.isArray(input.components) ||
|
|
36
|
+
!input.components.every(component => typeof component === "string" && RELOAD_COMPONENTS.has(component))
|
|
37
|
+
) {
|
|
38
|
+
return {
|
|
39
|
+
code: "invalid_reload_component",
|
|
40
|
+
message: "runtime.reload components must be drawn from config, models, skills, extensions, or tools.",
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (operation === "service_tier.set" && (typeof input.tier !== "string" || !SERVICE_TIERS.has(input.tier))) {
|
|
45
|
+
return { code: "invalid_input", message: "service_tier.set tier is invalid." };
|
|
46
|
+
}
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|