@gajae-code/coding-agent 0.17.2 → 0.17.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +194 -0
- package/dist/types/cli/daemon-cli.d.ts +3 -1
- package/dist/types/cli/github-release.d.ts +17 -0
- package/dist/types/cli/public-command-entry.d.ts +56 -0
- package/dist/types/cli/public-command-errors.d.ts +126 -0
- package/dist/types/cli/public-command-evidence.d.ts +99 -0
- package/dist/types/cli/public-command-help.d.ts +65 -0
- package/dist/types/cli/public-command-registry.d.ts +69 -0
- package/dist/types/cli/session-picker.d.ts +1 -1
- package/dist/types/cli/setup-cli.d.ts +1 -0
- package/dist/types/cli/skills-cli.d.ts +5 -0
- package/dist/types/cli.d.ts +3 -0
- package/dist/types/commands/daemon.d.ts +4 -50
- package/dist/types/commands/sdk.d.ts +20 -37
- package/dist/types/commands/setup.d.ts +3 -0
- package/dist/types/commands/skills.d.ts +9 -0
- package/dist/types/config/autorouting-tier-map.d.ts +18 -0
- package/dist/types/config/file-lock.d.ts +9 -1
- package/dist/types/config/model-profile-activation.d.ts +45 -1
- package/dist/types/config/model-registry.d.ts +11 -2
- package/dist/types/config/settings-schema.d.ts +11 -0
- package/dist/types/coordinator-mcp/question-state.d.ts +6 -1
- package/dist/types/daemon/operator-contract.d.ts +5 -1
- package/dist/types/eval/js/worker-protocol.d.ts +2 -0
- package/dist/types/extensibility/extensions/types.d.ts +12 -0
- package/dist/types/extensibility/gjc-plugins/registry.d.ts +4 -0
- package/dist/types/extensibility/runtime-skill-discovery.d.ts +18 -0
- package/dist/types/extensibility/shared-events.d.ts +3 -1
- package/dist/types/gjc-runtime/session-state-lock.d.ts +61 -0
- package/dist/types/internal-urls/embedded-protocol.d.ts +9 -0
- package/dist/types/internal-urls/index.d.ts +1 -0
- package/dist/types/internal-urls/parse.d.ts +9 -1
- package/dist/types/main.d.ts +22 -0
- package/dist/types/modes/acp/acp-agent.d.ts +55 -1
- package/dist/types/modes/acp/startup-provenance.d.ts +16 -0
- package/dist/types/modes/components/custom-provider-wizard.d.ts +19 -1
- package/dist/types/modes/components/session-selector.d.ts +5 -2
- package/dist/types/modes/components/user-message-selector.d.ts +5 -2
- package/dist/types/modes/controllers/command-controller.d.ts +1 -1
- package/dist/types/modes/controllers/selector-controller.d.ts +1 -1
- package/dist/types/modes/interactive-mode.d.ts +1 -1
- package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +11 -1
- package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +14 -1
- package/dist/types/modes/types.d.ts +2 -2
- package/dist/types/runtime/process-lifecycle.d.ts +2 -0
- package/dist/types/runtime-mcp/manager.d.ts +56 -0
- package/dist/types/runtime-mcp/pool.d.ts +17 -0
- package/dist/types/runtime-mcp/redaction.d.ts +20 -0
- package/dist/types/runtime-mcp/startup-policy.d.ts +6 -0
- package/dist/types/runtime-mcp/tool-bridge.d.ts +9 -0
- package/dist/types/runtime-mcp/transports/http.d.ts +11 -0
- package/dist/types/sdk/broker/broker.d.ts +13 -2
- package/dist/types/sdk/broker/identity.d.ts +3 -1
- package/dist/types/sdk/broker/lifecycle-ledger.d.ts +23 -3
- package/dist/types/sdk/broker/lifecycle.d.ts +15 -8
- package/dist/types/sdk/broker/runtime.d.ts +1 -1
- package/dist/types/sdk/broker/session-index.d.ts +22 -3
- package/dist/types/sdk/broker/spawn-authority.d.ts +4 -0
- package/dist/types/sdk/broker/stderr-drainer.d.ts +13 -0
- package/dist/types/sdk/bus/index.d.ts +19 -0
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +3 -1
- package/dist/types/sdk/bus/telegram-daemon.d.ts +5 -0
- package/dist/types/sdk/cli/master-cli.d.ts +6 -10
- package/dist/types/sdk/cli/rows.d.ts +19 -1
- package/dist/types/sdk/cli/session-cli.d.ts +22 -5
- package/dist/types/sdk/client/client.d.ts +2 -0
- package/dist/types/sdk/guides/cli.d.ts +3 -4
- package/dist/types/sdk/guides/verify.d.ts +2 -0
- package/dist/types/sdk/host/host.d.ts +9 -0
- package/dist/types/sdk/host/session-runtime.d.ts +31 -0
- package/dist/types/sdk/host/types.d.ts +10 -0
- package/dist/types/sdk/index.d.ts +1 -0
- package/dist/types/sdk/prompt-deadline-flush.d.ts +83 -0
- package/dist/types/sdk/prompt-deadline-manager.d.ts +37 -0
- package/dist/types/sdk/prompt-tool-boundary.d.ts +73 -0
- package/dist/types/sdk/router/session-router.d.ts +2 -0
- package/dist/types/sdk/startup-capability.d.ts +2 -0
- package/dist/types/sdk/transport/relay.d.ts +1 -0
- package/dist/types/sdk/transport/serve-cli.d.ts +48 -4
- package/dist/types/sdk/transport/stdio.d.ts +5 -1
- package/dist/types/session/agent-session.d.ts +168 -21
- package/dist/types/session/fallback-chain-controller.d.ts +6 -6
- package/dist/types/session/fold-coordinator.d.ts +17 -3
- package/dist/types/session/internal/managed-session-storage.d.ts +7 -1
- package/dist/types/session/session-manager.d.ts +64 -1
- package/dist/types/session/session-work-lease.d.ts +14 -0
- package/dist/types/setup/model-onboarding-guidance.d.ts +1 -1
- package/dist/types/setup/provider-onboarding.d.ts +81 -1
- package/dist/types/tools/bash.d.ts +37 -11
- package/dist/types/tools/job.d.ts +1 -1
- package/dist/types/tools/steer-fold.d.ts +31 -0
- package/dist/types/utils/git.d.ts +28 -2
- package/dist/types/utils/mupdf-embedded.d.ts +2 -0
- package/dist/types/utils/mupdf.d.ts +4 -0
- package/dist/types/utils/session-title-generation.d.ts +6 -0
- package/dist/types/utils/title-generator.d.ts +11 -2
- package/dist/types/web/scrapers/types.d.ts +3 -0
- package/package.json +18 -10
- package/scripts/build-binary.ts +9 -3
- package/scripts/compile-args.ts +0 -9
- package/scripts/embed-mupdf.ts +52 -0
- package/scripts/generate-sdk-operation-inventory.ts +31 -1
- package/scripts/vendor-markit.ts +196 -0
- package/src/async/job-manager.ts +22 -1
- package/src/cli/daemon-cli.ts +53 -18
- package/src/cli/github-release.ts +87 -5
- package/src/cli/mcp-cli.ts +38 -4
- package/src/cli/public-command-entry.ts +450 -0
- package/src/cli/public-command-errors.ts +581 -0
- package/src/cli/public-command-evidence.ts +717 -0
- package/src/cli/public-command-help.ts +360 -0
- package/src/cli/public-command-registry.ts +535 -0
- package/src/cli/session-picker.ts +2 -1
- package/src/cli/setup-cli.ts +9 -1
- package/src/cli/skills-cli.ts +46 -2
- package/src/cli.ts +61 -1
- package/src/commands/daemon.ts +65 -69
- package/src/commands/sdk.ts +175 -117
- package/src/commands/setup.ts +2 -0
- package/src/commands/skills.ts +11 -0
- package/src/config/autorouting-tier-map.ts +14 -0
- package/src/config/file-lock.ts +147 -51
- package/src/config/model-profile-activation.ts +334 -43
- package/src/config/model-registry.ts +183 -25
- package/src/config/settings-schema.ts +26 -2
- package/src/coordinator-mcp/policy.ts +10 -5
- package/src/coordinator-mcp/question-gate-codec.ts +17 -0
- package/src/coordinator-mcp/question-state.ts +175 -8
- package/src/coordinator-mcp/server.ts +507 -81
- package/src/coordinator-mcp/session-reaper.ts +6 -4
- package/src/crash/record-loader.ts +6 -2
- package/src/daemon/operator-contract.ts +26 -12
- package/src/defaults/gjc/skills/ultragoal/SKILL.md +1 -1
- package/src/eval/js/context-manager.ts +8 -8
- package/src/eval/js/worker-core.ts +9 -4
- package/src/eval/js/worker-protocol.ts +2 -0
- package/src/extensibility/extensions/runner.ts +52 -4
- package/src/extensibility/extensions/types.ts +10 -0
- package/src/extensibility/gjc-plugins/registry.ts +196 -37
- package/src/extensibility/runtime-skill-discovery.ts +61 -3
- package/src/extensibility/shared-events.ts +3 -1
- package/src/gjc-runtime/session-state-lock.ts +165 -24
- package/src/gjc-runtime/ultragoal-succession.ts +31 -3
- package/src/internal-urls/docs-index.generated.ts +20 -19
- package/src/internal-urls/embedded-protocol.ts +83 -0
- package/src/internal-urls/index.ts +1 -0
- package/src/internal-urls/parse.ts +21 -1
- package/src/internal-urls/router.ts +4 -2
- package/src/main.ts +123 -55
- package/src/modes/acp/acp-agent.ts +408 -35
- package/src/modes/acp/startup-provenance.ts +59 -0
- package/src/modes/components/custom-provider-wizard.ts +308 -7
- package/src/modes/components/oauth-selector.ts +9 -0
- package/src/modes/components/session-selector.ts +47 -4
- package/src/modes/components/user-message-selector.ts +57 -15
- package/src/modes/controllers/command-controller.ts +58 -32
- package/src/modes/controllers/extension-ui-controller.ts +33 -7
- package/src/modes/controllers/input-controller.ts +4 -0
- package/src/modes/controllers/selector-controller.ts +161 -15
- package/src/modes/interactive-mode.ts +21 -7
- package/src/modes/runtime-init.ts +1 -0
- package/src/modes/shared/agent-wire/workflow-gate-broker.ts +124 -7
- package/src/modes/shared/agent-wire/workflow-gate-types.ts +16 -2
- package/src/modes/types.ts +2 -2
- package/src/prompts/agent-fragments/browser-aside.md +1 -0
- package/src/prompts/system/title-system.md +1 -1
- package/src/prompts/tools/bash.md +1 -1
- package/src/prompts/tools/job.md +1 -1
- package/src/prompts/tools/read.md +2 -0
- package/src/runtime/network-prewarm-service.test.ts +36 -1
- package/src/runtime/network-prewarm-service.ts +28 -3
- package/src/runtime/process-lifecycle.ts +22 -11
- package/src/runtime-mcp/config.ts +16 -1
- package/src/runtime-mcp/manager.ts +689 -55
- package/src/runtime-mcp/pool.test.ts +31 -0
- package/src/runtime-mcp/pool.ts +304 -28
- package/src/runtime-mcp/redaction.ts +42 -0
- package/src/runtime-mcp/startup-policy.ts +7 -0
- package/src/runtime-mcp/tool-bridge.ts +71 -0
- package/src/runtime-mcp/transports/http.ts +108 -25
- package/src/sdk/acp/adapter.ts +27 -8
- package/src/sdk/broker/broker.ts +378 -52
- package/src/sdk/broker/identity.ts +9 -1
- package/src/sdk/broker/lifecycle-ledger.ts +95 -31
- package/src/sdk/broker/lifecycle.ts +690 -141
- package/src/sdk/broker/runtime.ts +1 -1
- package/src/sdk/broker/session-index.ts +97 -4
- package/src/sdk/broker/spawn-authority.ts +35 -7
- package/src/sdk/broker/stderr-drainer.ts +59 -0
- package/src/sdk/bus/chat-daemon-control.ts +2 -2
- package/src/sdk/bus/chat-daemon-runtime.ts +1 -0
- package/src/sdk/bus/index.ts +690 -80
- package/src/sdk/bus/telegram-daemon-cli.ts +31 -2
- package/src/sdk/bus/telegram-daemon-contract.ts +3 -1
- package/src/sdk/bus/telegram-daemon.ts +10 -3
- package/src/sdk/cli/master-cli.ts +47 -36
- package/src/sdk/cli/rows.ts +30 -7
- package/src/sdk/cli/session-cli.ts +687 -184
- package/src/sdk/client/client.ts +18 -0
- package/src/sdk/guides/catalog.ts +2 -2
- package/src/sdk/guides/cli.ts +20 -62
- package/src/sdk/guides/verify.ts +14 -0
- package/src/sdk/host/host.ts +49 -5
- package/src/sdk/host/session-runtime.test.ts +138 -2
- package/src/sdk/host/session-runtime.ts +311 -97
- package/src/sdk/host/types.ts +12 -1
- package/src/sdk/host/websocket-transport.lifecycle.test.ts +84 -0
- package/src/sdk/host/websocket-transport.ts +40 -6
- package/src/sdk/index.ts +11 -0
- package/src/sdk/prompt-deadline-flush.ts +334 -0
- package/src/sdk/prompt-deadline-manager.ts +133 -1
- package/src/sdk/prompt-tool-boundary.ts +121 -0
- package/src/sdk/protocol/operation-inventory.generated.json +106 -0
- package/src/sdk/router/session-router.ts +9 -1
- package/src/sdk/session.ts +182 -7
- package/src/sdk/startup-capability.ts +1 -1
- package/src/sdk/transport/relay.ts +71 -6
- package/src/sdk/transport/serve-cli.ts +397 -42
- package/src/sdk/transport/socket.ts +12 -11
- package/src/sdk/transport/stdio.ts +7 -3
- package/src/session/agent-session.ts +2437 -400
- package/src/session/fallback-chain-controller.ts +6 -7
- package/src/session/fold-coordinator.ts +24 -5
- package/src/session/internal/managed-session-scope.ts +58 -18
- package/src/session/internal/managed-session-storage.ts +304 -11
- package/src/session/session-manager.ts +382 -44
- package/src/session/session-work-lease.ts +34 -0
- package/src/setup/model-onboarding-guidance.ts +1 -1
- package/src/setup/provider-onboarding.ts +397 -24
- package/src/slash-commands/builtin-registry.ts +258 -14
- package/src/task/index.ts +14 -2
- package/src/tools/bash.ts +98 -78
- package/src/tools/fetch.ts +119 -20
- package/src/tools/job.ts +151 -25
- package/src/tools/output-meta.ts +15 -2
- package/src/tools/path-utils.ts +27 -3
- package/src/tools/read.ts +3 -3
- package/src/tools/steer-fold.ts +107 -0
- package/src/tools/tool-catalog.generated.ts +29 -2
- package/src/tools/tool-errors.ts +4 -0
- package/src/utils/git.ts +53 -3
- package/src/utils/markit.ts +55 -41
- package/src/utils/mupdf-assets.d.ts +4 -0
- package/src/utils/mupdf-embedded.ts +4 -0
- package/src/utils/mupdf.ts +129 -0
- package/src/utils/session-title-generation.ts +29 -0
- package/src/utils/title-generator.ts +46 -2
- package/src/web/scrapers/types.ts +24 -3
- package/vendor/markit-ai/LICENSE +21 -0
- package/vendor/markit-ai/MANIFEST.json +412 -0
- package/vendor/markit-ai/dist/commands/config.d.ts +4 -0
- package/vendor/markit-ai/dist/commands/config.js +139 -0
- package/vendor/markit-ai/dist/commands/convert.d.ts +6 -0
- package/vendor/markit-ai/dist/commands/convert.js +113 -0
- package/vendor/markit-ai/dist/commands/formats.d.ts +2 -0
- package/vendor/markit-ai/dist/commands/formats.js +92 -0
- package/vendor/markit-ai/dist/commands/init.d.ts +2 -0
- package/vendor/markit-ai/dist/commands/init.js +29 -0
- package/vendor/markit-ai/dist/commands/onboard.d.ts +2 -0
- package/vendor/markit-ai/dist/commands/onboard.js +61 -0
- package/vendor/markit-ai/dist/commands/plugin.d.ts +4 -0
- package/vendor/markit-ai/dist/commands/plugin.js +58 -0
- package/vendor/markit-ai/dist/config.d.ts +26 -0
- package/vendor/markit-ai/dist/config.js +42 -0
- package/vendor/markit-ai/dist/converters/audio.d.ts +7 -0
- package/vendor/markit-ai/dist/converters/audio.js +104 -0
- package/vendor/markit-ai/dist/converters/csv.d.ts +7 -0
- package/vendor/markit-ai/dist/converters/csv.js +83 -0
- package/vendor/markit-ai/dist/converters/docx.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/docx.js +57 -0
- package/vendor/markit-ai/dist/converters/epub.d.ts +8 -0
- package/vendor/markit-ai/dist/converters/epub.js +128 -0
- package/vendor/markit-ai/dist/converters/github.d.ts +18 -0
- package/vendor/markit-ai/dist/converters/github.js +148 -0
- package/vendor/markit-ai/dist/converters/html.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/html.js +30 -0
- package/vendor/markit-ai/dist/converters/image.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/image.js +124 -0
- package/vendor/markit-ai/dist/converters/ipynb.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/ipynb.js +75 -0
- package/vendor/markit-ai/dist/converters/iwork.d.ts +20 -0
- package/vendor/markit-ai/dist/converters/iwork.js +391 -0
- package/vendor/markit-ai/dist/converters/json.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/json.js +21 -0
- package/vendor/markit-ai/dist/converters/pdf/columns.d.ts +35 -0
- package/vendor/markit-ai/dist/converters/pdf/columns.js +93 -0
- package/vendor/markit-ai/dist/converters/pdf/extract.d.ts +19 -0
- package/vendor/markit-ai/dist/converters/pdf/extract.js +514 -0
- package/vendor/markit-ai/dist/converters/pdf/grid.d.ts +25 -0
- package/vendor/markit-ai/dist/converters/pdf/grid.js +795 -0
- package/vendor/markit-ai/dist/converters/pdf/headers.d.ts +24 -0
- package/vendor/markit-ai/dist/converters/pdf/headers.js +108 -0
- package/vendor/markit-ai/dist/converters/pdf/index.d.ts +19 -0
- package/vendor/markit-ai/dist/converters/pdf/index.js +136 -0
- package/vendor/markit-ai/dist/converters/pdf/mupdf-loader.js +9 -0
- package/vendor/markit-ai/dist/converters/pdf/render.d.ts +24 -0
- package/vendor/markit-ai/dist/converters/pdf/render.js +513 -0
- package/vendor/markit-ai/dist/converters/pdf/types.d.ts +75 -0
- package/vendor/markit-ai/dist/converters/pdf/types.js +1 -0
- package/vendor/markit-ai/dist/converters/plain-text.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/plain-text.js +87 -0
- package/vendor/markit-ai/dist/converters/pptx.d.ts +8 -0
- package/vendor/markit-ai/dist/converters/pptx.js +289 -0
- package/vendor/markit-ai/dist/converters/rss.d.ts +11 -0
- package/vendor/markit-ai/dist/converters/rss.js +138 -0
- package/vendor/markit-ai/dist/converters/wikipedia.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/wikipedia.js +33 -0
- package/vendor/markit-ai/dist/converters/xlsx.d.ts +8 -0
- package/vendor/markit-ai/dist/converters/xlsx.js +147 -0
- package/vendor/markit-ai/dist/converters/xml.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/xml.js +18 -0
- package/vendor/markit-ai/dist/converters/yaml.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/yaml.js +17 -0
- package/vendor/markit-ai/dist/converters/zip.d.ts +8 -0
- package/vendor/markit-ai/dist/converters/zip.js +57 -0
- package/vendor/markit-ai/dist/index.d.ts +30 -0
- package/vendor/markit-ai/dist/index.js +26 -0
- package/vendor/markit-ai/dist/main.d.ts +2 -0
- package/vendor/markit-ai/dist/main.js +191 -0
- package/vendor/markit-ai/dist/markit.d.ts +45 -0
- package/vendor/markit-ai/dist/markit.js +267 -0
- package/vendor/markit-ai/dist/plugins/api.d.ts +7 -0
- package/vendor/markit-ai/dist/plugins/api.js +42 -0
- package/vendor/markit-ai/dist/plugins/index.d.ts +4 -0
- package/vendor/markit-ai/dist/plugins/index.js +3 -0
- package/vendor/markit-ai/dist/plugins/installer.d.ts +25 -0
- package/vendor/markit-ai/dist/plugins/installer.js +176 -0
- package/vendor/markit-ai/dist/plugins/loader.d.ts +6 -0
- package/vendor/markit-ai/dist/plugins/loader.js +61 -0
- package/vendor/markit-ai/dist/plugins/types.d.ts +25 -0
- package/vendor/markit-ai/dist/plugins/types.js +1 -0
- package/vendor/markit-ai/dist/providers/anthropic.d.ts +2 -0
- package/vendor/markit-ai/dist/providers/anthropic.js +47 -0
- package/vendor/markit-ai/dist/providers/index.d.ts +21 -0
- package/vendor/markit-ai/dist/providers/index.js +56 -0
- package/vendor/markit-ai/dist/providers/openai.d.ts +2 -0
- package/vendor/markit-ai/dist/providers/openai.js +76 -0
- package/vendor/markit-ai/dist/providers/types.d.ts +26 -0
- package/vendor/markit-ai/dist/providers/types.js +1 -0
- package/vendor/markit-ai/dist/types.d.ts +36 -0
- package/vendor/markit-ai/dist/types.js +1 -0
- package/vendor/markit-ai/dist/utils/exit-codes.d.ts +4 -0
- package/vendor/markit-ai/dist/utils/exit-codes.js +4 -0
- package/vendor/markit-ai/dist/utils/output.d.ts +22 -0
- package/vendor/markit-ai/dist/utils/output.js +31 -0
- package/vendor/markit-ai/dist/utils/turndown.d.ts +8 -0
- package/vendor/markit-ai/dist/utils/turndown.js +70 -0
- package/vendor/markit-ai/package.json +74 -0
- package/vendor/markit-ai.patch +49 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protocol handler for `embedded:` URLs.
|
|
3
|
+
*
|
|
4
|
+
* Bundled GJC skills and skill fragments have no filesystem home: the skill
|
|
5
|
+
* tool, skill discovery, and the skill registry all report the stable
|
|
6
|
+
* identifier `embedded:gjc/<catalog relative path>` (for example
|
|
7
|
+
* `embedded:gjc/skills/ultragoal/SKILL.md`). This handler resolves exactly
|
|
8
|
+
* those identifiers back to the bundled catalog content so the path a tool
|
|
9
|
+
* prints is a path `read` can open.
|
|
10
|
+
*
|
|
11
|
+
* URL forms (the `embedded:` and `embedded://` spellings are equivalent):
|
|
12
|
+
* - `embedded:gjc/skills/<name>/SKILL.md` — bundled skill body
|
|
13
|
+
* - `embedded:gjc/skills/<name>` — skill baseDir, resolves to its SKILL.md
|
|
14
|
+
* - `embedded:gjc/skill-fragments/<parent>/<fragment>.md` — bundled fragment
|
|
15
|
+
*/
|
|
16
|
+
import { BUNDLED_GJC_SKILL_CATALOG, type BundledGjcSkillCatalogEntry } from "../defaults/gjc-skills.generated";
|
|
17
|
+
import type { InternalResource, InternalUrl, ProtocolHandler } from "./types";
|
|
18
|
+
|
|
19
|
+
const GJC_NAMESPACE = "gjc";
|
|
20
|
+
|
|
21
|
+
function normalizeRelativePath(relativePath: string): string {
|
|
22
|
+
return relativePath.replace(/^\/+/, "").replace(/\/+$/, "");
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function findCatalogEntry(relativePath: string): BundledGjcSkillCatalogEntry | undefined {
|
|
26
|
+
const direct = BUNDLED_GJC_SKILL_CATALOG.find(entry => entry.relativePath === relativePath);
|
|
27
|
+
if (direct) return direct;
|
|
28
|
+
// `baseDir` identifiers point at the skill directory, not the body file.
|
|
29
|
+
return BUNDLED_GJC_SKILL_CATALOG.find(entry => entry.relativePath === `${relativePath}/SKILL.md`);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function availablePaths(): string {
|
|
33
|
+
return BUNDLED_GJC_SKILL_CATALOG.map(entry => `embedded:${GJC_NAMESPACE}/${entry.relativePath}`).join(", ");
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Handler for `embedded:` URLs.
|
|
38
|
+
*/
|
|
39
|
+
export class EmbeddedProtocolHandler implements ProtocolHandler {
|
|
40
|
+
readonly scheme = "embedded";
|
|
41
|
+
readonly immutable = true;
|
|
42
|
+
|
|
43
|
+
async resolve(url: InternalUrl): Promise<InternalResource> {
|
|
44
|
+
const namespace = (url.rawHost || url.hostname || "").toLowerCase();
|
|
45
|
+
if (namespace !== GJC_NAMESPACE) {
|
|
46
|
+
throw new Error(
|
|
47
|
+
`Unknown embedded namespace: ${namespace || "(empty)"}\nOnly embedded:${GJC_NAMESPACE}/... is resolvable.`,
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
let rawRelativePath = url.rawPathname ?? url.pathname ?? "";
|
|
52
|
+
try {
|
|
53
|
+
rawRelativePath = decodeURIComponent(rawRelativePath);
|
|
54
|
+
} catch {
|
|
55
|
+
// Leave the raw form in place; the lookup below reports it verbatim.
|
|
56
|
+
}
|
|
57
|
+
const relativePath = normalizeRelativePath(rawRelativePath);
|
|
58
|
+
if (!relativePath) {
|
|
59
|
+
throw new Error(
|
|
60
|
+
`embedded:${GJC_NAMESPACE}/ URL requires a bundled resource path, e.g. embedded:${GJC_NAMESPACE}/skills/ultragoal/SKILL.md`,
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
if (relativePath.split("/").includes("..")) {
|
|
64
|
+
throw new Error("Path traversal (..) is not allowed in embedded: URLs");
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const entry = findCatalogEntry(relativePath);
|
|
68
|
+
if (!entry) {
|
|
69
|
+
throw new Error(
|
|
70
|
+
`Unknown embedded resource: embedded:${GJC_NAMESPACE}/${relativePath}\nAvailable: ${availablePaths()}`,
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const content = await entry.loadContent();
|
|
75
|
+
return {
|
|
76
|
+
url: url.href,
|
|
77
|
+
content,
|
|
78
|
+
contentType: "text/markdown",
|
|
79
|
+
size: Buffer.byteLength(content, "utf-8"),
|
|
80
|
+
notes: [],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -13,6 +13,25 @@ import type { InternalUrl } from "./types";
|
|
|
13
13
|
|
|
14
14
|
const SCHEME_HOST_RE = /^([a-z][a-z0-9+.-]*):\/\/([^/?#]*)/i;
|
|
15
15
|
const PATHNAME_RE = /^[a-z][a-z0-9+.-]*:\/\/[^/?#]*(\/[^?#]*)?/i;
|
|
16
|
+
// Schemes whose canonical spelling omits the authority slashes. `embedded:` is
|
|
17
|
+
// the identifier tools print for bundled (non-filesystem) resources, so both
|
|
18
|
+
// `embedded:gjc/...` and `embedded://gjc/...` must route to the same handler.
|
|
19
|
+
const SLASHLESS_SCHEMES = new Set(["embedded"]);
|
|
20
|
+
const SLASHLESS_SCHEME_RE = /^([a-z][a-z0-9+.-]*):(?!\/\/)(.*)$/is;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Canonicalize an internal URL so slashless schemes carry an authority.
|
|
24
|
+
*
|
|
25
|
+
* Every entry point that inspects or routes an internal URL (router,
|
|
26
|
+
* read/write tools, selector splitting) MUST normalize first, so handlers only
|
|
27
|
+
* ever see the `scheme://authority/path` form.
|
|
28
|
+
*/
|
|
29
|
+
export function normalizeInternalUrlInput(input: string): string {
|
|
30
|
+
const match = input.match(SLASHLESS_SCHEME_RE);
|
|
31
|
+
if (!match) return input;
|
|
32
|
+
if (!SLASHLESS_SCHEMES.has(match[1].toLowerCase())) return input;
|
|
33
|
+
return `${match[1].toLowerCase()}://${match[2]}`;
|
|
34
|
+
}
|
|
16
35
|
|
|
17
36
|
/**
|
|
18
37
|
* Parse an internal URL into an InternalUrl.
|
|
@@ -20,7 +39,8 @@ const PATHNAME_RE = /^[a-z][a-z0-9+.-]*:\/\/[^/?#]*(\/[^?#]*)?/i;
|
|
|
20
39
|
* Handles URLs where `new URL()` would fail (e.g., `skill://plugin:name`
|
|
21
40
|
* where the colon is not a port separator).
|
|
22
41
|
*/
|
|
23
|
-
export function parseInternalUrl(
|
|
42
|
+
export function parseInternalUrl(rawInput: string): InternalUrl {
|
|
43
|
+
const input = normalizeInternalUrlInput(rawInput);
|
|
24
44
|
const hostMatch = input.match(SCHEME_HOST_RE);
|
|
25
45
|
const pathMatch = input.match(PATHNAME_RE);
|
|
26
46
|
|
|
@@ -7,11 +7,12 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { AgentProtocolHandler } from "./agent-protocol";
|
|
9
9
|
import { ArtifactProtocolHandler } from "./artifact-protocol";
|
|
10
|
+
import { EmbeddedProtocolHandler } from "./embedded-protocol";
|
|
10
11
|
import { GjcProtocolHandler } from "./gjc-protocol";
|
|
11
12
|
import { IssueProtocolHandler, PrProtocolHandler } from "./issue-pr-protocol";
|
|
12
13
|
import { LocalProtocolHandler } from "./local-protocol";
|
|
13
14
|
import { MemoryProtocolHandler } from "./memory-protocol";
|
|
14
|
-
import { parseInternalUrl } from "./parse";
|
|
15
|
+
import { normalizeInternalUrlInput, parseInternalUrl } from "./parse";
|
|
15
16
|
import { RuleProtocolHandler } from "./rule-protocol";
|
|
16
17
|
import type { InternalResource, InternalUrl, ProtocolHandler, ResolveContext } from "./types";
|
|
17
18
|
|
|
@@ -29,6 +30,7 @@ export class InternalUrlRouter {
|
|
|
29
30
|
this.register(new RuleProtocolHandler());
|
|
30
31
|
this.register(new IssueProtocolHandler());
|
|
31
32
|
this.register(new PrProtocolHandler());
|
|
33
|
+
this.register(new EmbeddedProtocolHandler());
|
|
32
34
|
}
|
|
33
35
|
|
|
34
36
|
/** Process-global router instance. */
|
|
@@ -55,7 +57,7 @@ export class InternalUrlRouter {
|
|
|
55
57
|
}
|
|
56
58
|
|
|
57
59
|
canHandle(input: string): boolean {
|
|
58
|
-
const match = input.match(/^([a-z][a-z0-9+.-]*):\/\//i);
|
|
60
|
+
const match = normalizeInternalUrlInput(input).match(/^([a-z][a-z0-9+.-]*):\/\//i);
|
|
59
61
|
if (!match) return false;
|
|
60
62
|
return this.#handlers.has(match[1].toLowerCase());
|
|
61
63
|
}
|
package/src/main.ts
CHANGED
|
@@ -29,7 +29,11 @@ import { resolveLaunchDisposition } from "./cli/launch-disposition";
|
|
|
29
29
|
import { runListModelsCommand } from "./cli/list-models";
|
|
30
30
|
import { selectSession } from "./cli/session-picker";
|
|
31
31
|
import { findConfigFile } from "./config";
|
|
32
|
-
import {
|
|
32
|
+
import {
|
|
33
|
+
activateModelProfile,
|
|
34
|
+
applyModelProfileRuntimeBindings,
|
|
35
|
+
ModelProfileCredentialError,
|
|
36
|
+
} from "./config/model-profile-activation";
|
|
33
37
|
import { ModelRegistry, ModelsConfigFile } from "./config/model-registry";
|
|
34
38
|
import {
|
|
35
39
|
parseModelString,
|
|
@@ -59,6 +63,9 @@ import type { SubmittedUserInput } from "./modes/types";
|
|
|
59
63
|
import { applyCliRuntimeApiKeyOverride } from "./runtime-api-key";
|
|
60
64
|
import { type CliCredentialSelector, parseCliCredentialSelector } from "./runtime-credential-selector";
|
|
61
65
|
import type { MCPManager } from "./runtime-mcp";
|
|
66
|
+
// Leaf path, not the barrel: the capability registry must stay out of the
|
|
67
|
+
// runtime-mcp import graph that every root command would otherwise load.
|
|
68
|
+
import { attachExactMcpControls } from "./runtime-mcp/redaction";
|
|
62
69
|
import {
|
|
63
70
|
type CreateAgentSessionOptions,
|
|
64
71
|
type CreateAgentSessionResult,
|
|
@@ -477,13 +484,23 @@ async function applyStartupModelProfilesWithPolicy(
|
|
|
477
484
|
options: {
|
|
478
485
|
thinkingLevelOverride?: CreateAgentSessionOptions["thinkingLevel"];
|
|
479
486
|
tolerateCredentialError?: boolean;
|
|
487
|
+
runtimeBindingsOnly?: boolean;
|
|
480
488
|
} = {},
|
|
481
489
|
): Promise<boolean> => {
|
|
482
490
|
try {
|
|
483
|
-
|
|
484
|
-
{
|
|
485
|
-
|
|
486
|
-
|
|
491
|
+
if (options.runtimeBindingsOnly) {
|
|
492
|
+
await applyModelProfileRuntimeBindings({
|
|
493
|
+
session: args.session,
|
|
494
|
+
modelRegistry: args.modelRegistry,
|
|
495
|
+
settings: args.settings,
|
|
496
|
+
profileName,
|
|
497
|
+
});
|
|
498
|
+
} else {
|
|
499
|
+
await activateModelProfile(
|
|
500
|
+
{ session: args.session, modelRegistry: args.modelRegistry, settings: args.settings, profileName },
|
|
501
|
+
{ persistDefault, thinkingLevelOverride: options.thinkingLevelOverride },
|
|
502
|
+
);
|
|
503
|
+
}
|
|
487
504
|
return true;
|
|
488
505
|
} catch (error) {
|
|
489
506
|
if (error instanceof ModelProfileCredentialError && (onCredentialError || options.tolerateCredentialError)) {
|
|
@@ -519,6 +536,7 @@ async function applyStartupModelProfilesWithPolicy(
|
|
|
519
536
|
? args.settings.get("defaultThinkingLevel")
|
|
520
537
|
: undefined,
|
|
521
538
|
tolerateCredentialError: tolerateDefaultProfileFailure,
|
|
539
|
+
runtimeBindingsOnly: args.session.hasRecoveredDefaultFallbackChain(),
|
|
522
540
|
})) && applied;
|
|
523
541
|
}
|
|
524
542
|
if (args.parsedArgs.mpreset) {
|
|
@@ -780,6 +798,10 @@ function hasResumePickerTerminal(): boolean {
|
|
|
780
798
|
return process.stdin.isTTY === true && process.stdout.isTTY === true;
|
|
781
799
|
}
|
|
782
800
|
|
|
801
|
+
export function shouldNotifyModelFallback(authBootstrap: boolean | undefined, isInteractive: boolean): boolean {
|
|
802
|
+
return !(authBootstrap === true && isInteractive);
|
|
803
|
+
}
|
|
804
|
+
|
|
783
805
|
export async function runInteractiveMode(
|
|
784
806
|
session: AgentSession,
|
|
785
807
|
version: string,
|
|
@@ -1405,6 +1427,80 @@ export interface RunRootCommandDependencies {
|
|
|
1405
1427
|
loadSettingsForScope?: typeof Settings.loadForScope;
|
|
1406
1428
|
}
|
|
1407
1429
|
|
|
1430
|
+
type DirectSessionManager = Pick<SessionManager, "getCwd" | "getSessionFile" | "getSessionId">;
|
|
1431
|
+
|
|
1432
|
+
/**
|
|
1433
|
+
* Direct CLI liveness is meaningful only for sessions with a durable transcript.
|
|
1434
|
+
* An in-memory manager has no artifacts for GC to fence and must not touch the
|
|
1435
|
+
* shared SDK session-index lock.
|
|
1436
|
+
*/
|
|
1437
|
+
export function directSessionRegistrationId(
|
|
1438
|
+
sessionManager: DirectSessionManager | undefined,
|
|
1439
|
+
lifecycleRequestId: string | undefined,
|
|
1440
|
+
): string | undefined {
|
|
1441
|
+
if (lifecycleRequestId || sessionManager?.getSessionFile() === undefined) return undefined;
|
|
1442
|
+
return sessionManager.getSessionId();
|
|
1443
|
+
}
|
|
1444
|
+
|
|
1445
|
+
interface DirectSessionRegistrationDependencies {
|
|
1446
|
+
createIndex?: (agentDir: string) => SessionIndex;
|
|
1447
|
+
processIncarnation?: typeof processIncarnation;
|
|
1448
|
+
registerPostmortem?: typeof postmortem.register;
|
|
1449
|
+
masterRole?: { ownerSessionId: string; attestationEpoch: string };
|
|
1450
|
+
}
|
|
1451
|
+
|
|
1452
|
+
/** Register a durable direct CLI session while leaving ephemeral sessions lock-free. */
|
|
1453
|
+
export async function registerDirectSession(
|
|
1454
|
+
sessionManager: DirectSessionManager | undefined,
|
|
1455
|
+
agentDir: string,
|
|
1456
|
+
lifecycleRequestId: string | undefined,
|
|
1457
|
+
dependencies: DirectSessionRegistrationDependencies = {},
|
|
1458
|
+
): Promise<void> {
|
|
1459
|
+
const directSessionId = directSessionRegistrationId(sessionManager, lifecycleRequestId);
|
|
1460
|
+
if (!directSessionId || !sessionManager) return;
|
|
1461
|
+
const sessionIndex = dependencies.createIndex?.(agentDir) ?? new SessionIndex(agentDir);
|
|
1462
|
+
const locator = await resolveSessionLocator(sessionManager.getCwd(), agentDir);
|
|
1463
|
+
const directSessionIncarnation = (dependencies.processIncarnation ?? processIncarnation)(process.pid);
|
|
1464
|
+
await sessionIndex.append({
|
|
1465
|
+
type: "host_registered",
|
|
1466
|
+
sessionId: directSessionId,
|
|
1467
|
+
locator,
|
|
1468
|
+
endpointGeneration: 0,
|
|
1469
|
+
pid: process.pid,
|
|
1470
|
+
...(directSessionIncarnation ? { processIncarnation: directSessionIncarnation } : {}),
|
|
1471
|
+
...(dependencies.masterRole && directSessionIncarnation
|
|
1472
|
+
? {
|
|
1473
|
+
masterRole: {
|
|
1474
|
+
version: 2 as const,
|
|
1475
|
+
ownerSessionId: dependencies.masterRole.ownerSessionId,
|
|
1476
|
+
launchPid: process.pid,
|
|
1477
|
+
launchProcessIncarnation: directSessionIncarnation,
|
|
1478
|
+
role: "master" as const,
|
|
1479
|
+
attestationEpoch: dependencies.masterRole.attestationEpoch,
|
|
1480
|
+
},
|
|
1481
|
+
}
|
|
1482
|
+
: {}),
|
|
1483
|
+
});
|
|
1484
|
+
if (locator.worktreeRoot !== null) {
|
|
1485
|
+
try {
|
|
1486
|
+
await releaseLaunchWorktreeReservationAfterRegistration(agentDir, locator.worktreeRoot);
|
|
1487
|
+
} catch (error) {
|
|
1488
|
+
logger.warn("Failed to release launch worktree reservation after host registration", {
|
|
1489
|
+
error: error instanceof Error ? error.message : String(error),
|
|
1490
|
+
});
|
|
1491
|
+
}
|
|
1492
|
+
}
|
|
1493
|
+
(dependencies.registerPostmortem ?? postmortem.register)("direct-session-index", async _reason => {
|
|
1494
|
+
await sessionIndex.append({
|
|
1495
|
+
type: "host_unregistered",
|
|
1496
|
+
sessionId: directSessionId,
|
|
1497
|
+
locator,
|
|
1498
|
+
endpointGeneration: 0,
|
|
1499
|
+
pid: process.pid,
|
|
1500
|
+
});
|
|
1501
|
+
});
|
|
1502
|
+
}
|
|
1503
|
+
|
|
1408
1504
|
export interface ModelRoleOverrides {
|
|
1409
1505
|
smol?: string;
|
|
1410
1506
|
slow?: string;
|
|
@@ -1987,55 +2083,15 @@ export async function runRootCommand(
|
|
|
1987
2083
|
}
|
|
1988
2084
|
// Register a resumed direct session before constructing the agent: GC holds the
|
|
1989
2085
|
// same index lock while deleting artifacts, so startup and deletion are fenced.
|
|
1990
|
-
|
|
1991
|
-
|
|
1992
|
-
|
|
1993
|
-
|
|
1994
|
-
|
|
1995
|
-
|
|
1996
|
-
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
sessionId: directSessionId,
|
|
2000
|
-
locator,
|
|
2001
|
-
endpointGeneration: 0,
|
|
2002
|
-
pid: process.pid,
|
|
2003
|
-
...(directSessionIncarnation ? { processIncarnation: directSessionIncarnation } : {}),
|
|
2004
|
-
...(masterModeContext && directSessionIncarnation
|
|
2005
|
-
? {
|
|
2006
|
-
masterRole: {
|
|
2007
|
-
version: 2,
|
|
2008
|
-
ownerSessionId: masterModeContext.ownerSessionId,
|
|
2009
|
-
launchPid: process.pid,
|
|
2010
|
-
launchProcessIncarnation: directSessionIncarnation,
|
|
2011
|
-
role: "master" as const,
|
|
2012
|
-
attestationEpoch: masterModeContext.attestationEpoch,
|
|
2013
|
-
},
|
|
2014
|
-
}
|
|
2015
|
-
: {}),
|
|
2016
|
-
});
|
|
2017
|
-
if (locator.worktreeRoot !== null) {
|
|
2018
|
-
try {
|
|
2019
|
-
await releaseLaunchWorktreeReservationAfterRegistration(
|
|
2020
|
-
settingsInstance.getAgentDir(),
|
|
2021
|
-
locator.worktreeRoot,
|
|
2022
|
-
);
|
|
2023
|
-
} catch (error) {
|
|
2024
|
-
logger.warn("Failed to release launch worktree reservation after host registration", {
|
|
2025
|
-
error: error instanceof Error ? error.message : String(error),
|
|
2026
|
-
});
|
|
2027
|
-
}
|
|
2028
|
-
}
|
|
2029
|
-
postmortem.register("direct-session-index", async () => {
|
|
2030
|
-
await sessionIndex.append({
|
|
2031
|
-
type: "host_unregistered",
|
|
2032
|
-
sessionId: directSessionId,
|
|
2033
|
-
locator,
|
|
2034
|
-
endpointGeneration: 0,
|
|
2035
|
-
pid: process.pid,
|
|
2036
|
-
});
|
|
2037
|
-
});
|
|
2038
|
-
}
|
|
2086
|
+
// Ephemeral sessions have no durable artifacts or liveness authority to fence.
|
|
2087
|
+
await registerDirectSession(sessionManager, settingsInstance.getAgentDir(), process.env.GJC_LIFECYCLE_REQUEST_ID, {
|
|
2088
|
+
masterRole: masterModeContext
|
|
2089
|
+
? {
|
|
2090
|
+
ownerSessionId: masterModeContext.ownerSessionId,
|
|
2091
|
+
attestationEpoch: masterModeContext.attestationEpoch,
|
|
2092
|
+
}
|
|
2093
|
+
: undefined,
|
|
2094
|
+
});
|
|
2039
2095
|
|
|
2040
2096
|
const createAgentSessionImpl = deps.createAgentSession ?? createAgentSession;
|
|
2041
2097
|
const createSession: CreateSessionForMain = async (options, context): Promise<CreateAgentSessionResult> => {
|
|
@@ -2076,6 +2132,18 @@ export async function runRootCommand(
|
|
|
2076
2132
|
// Herdr integration: report gjc lifecycle state when running in a Herdr pane.
|
|
2077
2133
|
installHerdrReporter(listener => session.subscribe(listener));
|
|
2078
2134
|
|
|
2135
|
+
// Exact MCP capability attaches at the root interactive entry point.
|
|
2136
|
+
// Granted by creation path, not by call order:
|
|
2137
|
+
// only a session this root command built for an interactive run with an
|
|
2138
|
+
// explicit --mcp-config gets one. Sessions built through createAgentSession
|
|
2139
|
+
// directly, sub-sessions, ACP, and print/text/json runs never reach here.
|
|
2140
|
+
if (isInteractive && sessionOptions.mcpConfigPath) {
|
|
2141
|
+
attachExactMcpControls(session, {
|
|
2142
|
+
grantSource: "root-interactive-exact-config",
|
|
2143
|
+
configPath: sessionOptions.mcpConfigPath,
|
|
2144
|
+
});
|
|
2145
|
+
}
|
|
2146
|
+
|
|
2079
2147
|
let startDeferredModelProfiles: DeferredModelProfileStartup | undefined;
|
|
2080
2148
|
if (!(parsedArgs.authBootstrap === true && isInteractive)) {
|
|
2081
2149
|
const profileArgs = {
|
|
@@ -2114,7 +2182,7 @@ export async function runRootCommand(
|
|
|
2114
2182
|
}
|
|
2115
2183
|
}
|
|
2116
2184
|
|
|
2117
|
-
if (modelFallbackMessage) {
|
|
2185
|
+
if (modelFallbackMessage && shouldNotifyModelFallback(parsedArgs.authBootstrap, isInteractive)) {
|
|
2118
2186
|
notifs.push({ kind: "warn", message: modelFallbackMessage });
|
|
2119
2187
|
}
|
|
2120
2188
|
|