@gajae-code/coding-agent 0.17.1 → 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 +266 -0
- package/dist/types/async/job-manager.d.ts +7 -6
- 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 +24 -0
- package/dist/types/config/file-lock.d.ts +10 -1
- package/dist/types/config/model-profile-activation.d.ts +63 -4
- package/dist/types/config/model-registry.d.ts +20 -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/coordinator-mcp/server.d.ts +3 -0
- 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 +94 -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/thinking-selector.d.ts +2 -1
- 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/acp/adapter.d.ts +27 -0
- package/dist/types/sdk/acp/final-text.d.ts +8 -0
- package/dist/types/sdk/broker/broker.d.ts +13 -2
- package/dist/types/sdk/broker/ensure.d.ts +46 -1
- 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 +38 -1
- package/dist/types/sdk/prompt-failure.d.ts +30 -1
- package/dist/types/sdk/prompt-status.d.ts +8 -0
- package/dist/types/sdk/prompt-tool-boundary.d.ts +73 -0
- package/dist/types/sdk/router/replay-retention-gap-cache.d.ts +13 -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 +73 -2
- 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/thinking.d.ts +3 -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-wasm-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 +60 -9
- 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 +232 -100
- package/src/commands/setup.ts +2 -0
- package/src/commands/skills.ts +11 -0
- package/src/config/autorouting-tier-map.ts +16 -0
- package/src/config/file-lock.ts +199 -68
- package/src/config/model-profile-activation.ts +406 -53
- package/src/config/model-registry.ts +204 -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 +528 -87
- 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/debug/report-bundle.ts +114 -24
- 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/managed-owner-admission.ts +67 -50
- 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 +21 -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 +593 -47
- package/src/modes/acp/acp-event-mapper.ts +9 -0
- package/src/modes/acp/startup-provenance.ts +59 -0
- package/src/modes/components/custom-provider-wizard.ts +308 -7
- package/src/modes/components/model-selector.ts +31 -15
- package/src/modes/components/oauth-selector.ts +9 -0
- package/src/modes/components/session-selector.ts +47 -4
- package/src/modes/components/status-line/segments.ts +6 -1
- package/src/modes/components/thinking-selector.ts +7 -3
- 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 +177 -18
- 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 +90 -9
- package/src/sdk/acp/final-text.ts +19 -2
- package/src/sdk/broker/broker.ts +378 -52
- package/src/sdk/broker/ensure.ts +97 -19
- 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 +721 -84
- 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 +636 -9
- package/src/sdk/host/session-runtime.ts +499 -118
- 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 +136 -4
- package/src/sdk/prompt-failure.ts +43 -1
- package/src/sdk/prompt-status.ts +8 -0
- package/src/sdk/prompt-tool-boundary.ts +121 -0
- package/src/sdk/protocol/operation-inventory.generated.json +106 -0
- package/src/sdk/router/replay-retention-gap-cache.ts +27 -0
- package/src/sdk/router/session-router.ts +31 -4
- package/src/sdk/session.ts +194 -16
- package/src/sdk/startup-capability.ts +1 -1
- package/src/sdk/transport/relay.ts +71 -6
- package/src/sdk/transport/serve-cli.ts +494 -49
- 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/session-import/codex.ts +12 -3
- 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/thinking.ts +21 -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-wasm-embedded.ts +3 -0
- package/src/utils/mupdf-wasm.ts +24 -2
- 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
package/src/commands/sdk.ts
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
+
import * as nodeFs from "node:fs";
|
|
2
3
|
import * as fs from "node:fs/promises";
|
|
3
4
|
import * as os from "node:os";
|
|
4
5
|
import * as path from "node:path";
|
|
5
6
|
import { logger } from "@gajae-code/utils";
|
|
6
|
-
import { Args, CliParseError, Command, Flags
|
|
7
|
+
import { Args, CliParseError, Command, Flags } from "@gajae-code/utils/cli";
|
|
7
8
|
import type { Args as ParsedArgs } from "../cli/args";
|
|
9
|
+
import { isSafeSdkInternalAgentDir, scanPublicCommand } from "../cli/public-command-entry";
|
|
10
|
+
import { PublicCommandFailure } from "../cli/public-command-errors";
|
|
8
11
|
import { parseModelString } from "../config/model-resolver";
|
|
9
12
|
import { Settings } from "../config/settings";
|
|
10
13
|
import { applyStartupModelProfiles, createSessionManager } from "../main";
|
|
@@ -13,7 +16,11 @@ import { initTheme } from "../modes/theme/theme";
|
|
|
13
16
|
import { ACP_MCP_REQUEST_TIMEOUT_MS, ACP_MCP_STARTUP_HEADROOM_MS } from "../sdk/acp/mcp";
|
|
14
17
|
import { Broker } from "../sdk/broker/broker";
|
|
15
18
|
import { readBrokerDiscovery } from "../sdk/broker/discovery";
|
|
16
|
-
import {
|
|
19
|
+
import {
|
|
20
|
+
emitBrokerStartupTestSignal,
|
|
21
|
+
reconcileBrokerGenerationForStartup,
|
|
22
|
+
withBrokerStartupLock,
|
|
23
|
+
} from "../sdk/broker/ensure";
|
|
17
24
|
import { completeBrokerProcess } from "../sdk/broker/internal";
|
|
18
25
|
import {
|
|
19
26
|
type LifecycleTranscriptEvidence,
|
|
@@ -21,13 +28,14 @@ import {
|
|
|
21
28
|
type SessionLifecycleLaunchRequest,
|
|
22
29
|
type SessionLifecycleTranscriptIdentity,
|
|
23
30
|
sessionHostAttachedClients,
|
|
24
|
-
|
|
31
|
+
sessionHostWorkLeaseActive,
|
|
25
32
|
startBrokerDeadRegistrationSweep,
|
|
26
33
|
writeSessionLifecycleFailure,
|
|
27
34
|
writeSessionLifecycleReady,
|
|
28
35
|
} from "../sdk/broker/lifecycle";
|
|
29
36
|
import { processIncarnation } from "../sdk/broker/process-incarnation";
|
|
30
37
|
import { writeBrokerStartupFailureMarker } from "../sdk/broker/startup-failure";
|
|
38
|
+
import { runSdkStderrDrainer } from "../sdk/broker/stderr-drainer";
|
|
31
39
|
import { renderSdkSearchTable, runSdkSearch, runSdkSessionCli } from "../sdk/cli";
|
|
32
40
|
import { renderSpawnTable, runSdkSpawn, SdkMasterCliError } from "../sdk/cli/master-cli";
|
|
33
41
|
import { runSdkGuidesCli } from "../sdk/guides/cli";
|
|
@@ -39,7 +47,7 @@ import {
|
|
|
39
47
|
type SdkStartupRollbackResult,
|
|
40
48
|
SdkStartupRollbackTracker,
|
|
41
49
|
} from "../sdk/startup-capability";
|
|
42
|
-
import { runSdkServe } from "../sdk/transport/serve-cli";
|
|
50
|
+
import { runSdkServe, SdkServeError } from "../sdk/transport/serve-cli";
|
|
43
51
|
import { isSessionDisposalIncompleteError } from "../session/agent-session";
|
|
44
52
|
import {
|
|
45
53
|
type CapturedSessionTranscriptSnapshot,
|
|
@@ -94,6 +102,43 @@ export async function lifecycleArgs(
|
|
|
94
102
|
export const SESSION_HOST_BROKER_ABSENCE_GRACE_MS = 10 * 60_000;
|
|
95
103
|
const SESSION_HOST_BROKER_POLL_MS = 15_000;
|
|
96
104
|
|
|
105
|
+
async function waitForBrokerStartupTestGate(gateFile: string): Promise<void> {
|
|
106
|
+
if (await Bun.file(gateFile).exists()) return;
|
|
107
|
+
const directory = path.dirname(gateFile);
|
|
108
|
+
const filename = path.basename(gateFile);
|
|
109
|
+
await new Promise<void>((resolve, reject) => {
|
|
110
|
+
let settled = false;
|
|
111
|
+
let watcher: nodeFs.FSWatcher | undefined;
|
|
112
|
+
const finish = (error?: unknown): void => {
|
|
113
|
+
if (settled) return;
|
|
114
|
+
settled = true;
|
|
115
|
+
watcher?.close();
|
|
116
|
+
if (error === undefined) resolve();
|
|
117
|
+
else reject(error);
|
|
118
|
+
};
|
|
119
|
+
try {
|
|
120
|
+
watcher = nodeFs.watch(directory, (_eventType, changed) => {
|
|
121
|
+
if (String(changed) !== filename) return;
|
|
122
|
+
void Bun.file(gateFile)
|
|
123
|
+
.exists()
|
|
124
|
+
.then(exists => {
|
|
125
|
+
if (exists) finish();
|
|
126
|
+
})
|
|
127
|
+
.catch(finish);
|
|
128
|
+
});
|
|
129
|
+
} catch (error) {
|
|
130
|
+
finish(error);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
void Bun.file(gateFile)
|
|
134
|
+
.exists()
|
|
135
|
+
.then(exists => {
|
|
136
|
+
if (exists) finish();
|
|
137
|
+
})
|
|
138
|
+
.catch(finish);
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
|
|
97
142
|
/**
|
|
98
143
|
* Identity of the broker incarnation an observation describes, or `null` when
|
|
99
144
|
* it carries no usable identity.
|
|
@@ -167,10 +212,10 @@ export async function watchSessionHostBrokerLiveness(deps: {
|
|
|
167
212
|
* no client attached before treating itself as abandoned.
|
|
168
213
|
*
|
|
169
214
|
* This cannot fire during healthy work. "Attached" is the host's own live
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
*
|
|
173
|
-
*
|
|
215
|
+
* demand count: observer-only sockets (such as an idle chat daemon) do not
|
|
216
|
+
* reset the window, while an in-flight turn is reported separately. Only a
|
|
217
|
+
* client that is actually demanding the host opens it, and 30 minutes is far
|
|
218
|
+
* longer than any client
|
|
174
219
|
* reconnect budget (ACP's is seconds), so a crashed-and-restarted client
|
|
175
220
|
* reattaches long before the window closes.
|
|
176
221
|
*/
|
|
@@ -196,8 +241,8 @@ const SESSION_HOST_ATTACHMENT_POLL_MS = 30_000;
|
|
|
196
241
|
* from every client for a full idle grace, or nobody has come for it at all
|
|
197
242
|
* for a full first-attach grace.
|
|
198
243
|
*
|
|
199
|
-
* `readAttachedClients` reports the host's own live client
|
|
200
|
-
*
|
|
244
|
+
* `readAttachedClients` reports the host's own live demanding-client count;
|
|
245
|
+
* `undefined` means the SDK endpoint publishes no such evidence — before
|
|
201
246
|
* startup, after teardown, or when every reader itself fails. That ambiguity is
|
|
202
247
|
* never instant detachment: it cannot reap on the poll that first sees it, it
|
|
203
248
|
* can only open a window. Which window depends on what was already observed. A
|
|
@@ -208,28 +253,27 @@ const SESSION_HOST_ATTACHMENT_POLL_MS = 30_000;
|
|
|
208
253
|
* an observed count of zero. Every reachable state therefore carries a finite
|
|
209
254
|
* bound.
|
|
210
255
|
*
|
|
211
|
-
* `
|
|
212
|
-
*
|
|
213
|
-
* arrive over an endpoint a client dialed. Live work therefore
|
|
214
|
-
* windows, which is what keeps a mid-prompt host alive whether
|
|
215
|
-
* zero or stops being readable at all. That still bounds a
|
|
216
|
-
* runtime never came up: with no transport it can never receive
|
|
217
|
-
* never
|
|
218
|
-
*
|
|
219
|
-
* never removes it.
|
|
256
|
+
* `readWorkLease` reports whether the host's authoritative session-work lease
|
|
257
|
+
* is held. A lease is positive proof a client did come for this host: a prompt
|
|
258
|
+
* can only arrive over an endpoint a client dialed. Live work therefore
|
|
259
|
+
* restarts both windows, which is what keeps a mid-prompt host alive whether
|
|
260
|
+
* its count reads zero or stops being readable at all. That still bounds a
|
|
261
|
+
* host whose SDK runtime never came up: with no transport it can never receive
|
|
262
|
+
* a prompt, so it never acquires work and its window keeps running from process
|
|
263
|
+
* start. Releasing the lease resumes the applicable bound.
|
|
220
264
|
*/
|
|
221
265
|
export async function watchSessionHostClientAttachment(deps: {
|
|
222
266
|
readAttachedClients: () => number | undefined;
|
|
223
|
-
|
|
267
|
+
readWorkLease?: () => boolean;
|
|
224
268
|
now?: () => number;
|
|
225
269
|
sleep?: (ms: number) => Promise<void>;
|
|
226
270
|
idleGraceMs?: number;
|
|
227
271
|
firstAttachGraceMs?: number;
|
|
228
272
|
pollMs?: number;
|
|
229
|
-
}): Promise<
|
|
273
|
+
}): Promise<"detached_idle"> {
|
|
230
274
|
const now = deps.now ?? Date.now;
|
|
231
275
|
const sleep = deps.sleep ?? (async ms => await Bun.sleep(ms));
|
|
232
|
-
const
|
|
276
|
+
const readWorkLease = deps.readWorkLease ?? (() => false);
|
|
233
277
|
const idleGraceMs = deps.idleGraceMs ?? SESSION_HOST_DETACHED_IDLE_GRACE_MS;
|
|
234
278
|
const firstAttachGraceMs = deps.firstAttachGraceMs ?? SESSION_HOST_FIRST_ATTACH_GRACE_MS;
|
|
235
279
|
const pollMs = deps.pollMs ?? SESSION_HOST_ATTACHMENT_POLL_MS;
|
|
@@ -239,7 +283,7 @@ export async function watchSessionHostClientAttachment(deps: {
|
|
|
239
283
|
let unattendedSince = now();
|
|
240
284
|
for (;;) {
|
|
241
285
|
const attached = deps.readAttachedClients();
|
|
242
|
-
if (
|
|
286
|
+
if (readWorkLease()) {
|
|
243
287
|
unattendedSince = now();
|
|
244
288
|
detachedSince = null;
|
|
245
289
|
}
|
|
@@ -252,9 +296,9 @@ export async function watchSessionHostClientAttachment(deps: {
|
|
|
252
296
|
// registration stops publishing a count instead of reporting zero.
|
|
253
297
|
// Both accrue against the idle bound rather than running forever.
|
|
254
298
|
detachedSince ??= now();
|
|
255
|
-
if (now() - detachedSince >= idleGraceMs) return;
|
|
299
|
+
if (now() - detachedSince >= idleGraceMs) return "detached_idle";
|
|
256
300
|
} else if (now() - unattendedSince >= firstAttachGraceMs) {
|
|
257
|
-
return;
|
|
301
|
+
return "detached_idle";
|
|
258
302
|
}
|
|
259
303
|
await sleep(pollMs);
|
|
260
304
|
}
|
|
@@ -644,10 +688,10 @@ export async function runSessionHost(
|
|
|
644
688
|
lifecycleTranscriptPath = session.sessionManager.getSessionFile();
|
|
645
689
|
});
|
|
646
690
|
let sessionDisposal: Promise<void> | undefined;
|
|
647
|
-
const disposeSession = (): Promise<void> => {
|
|
691
|
+
const disposeSession = (reason?: "detached_idle"): Promise<void> => {
|
|
648
692
|
sessionDisposal ??= (async () => {
|
|
649
693
|
try {
|
|
650
|
-
await session.dispose();
|
|
694
|
+
await session.dispose(reason === undefined ? {} : { sessionShutdownReason: reason });
|
|
651
695
|
} catch (error) {
|
|
652
696
|
if (!isSessionDisposalIncompleteError(error)) throw error;
|
|
653
697
|
await session.awaitDisposeCompletion();
|
|
@@ -693,8 +737,8 @@ export async function runSessionHost(
|
|
|
693
737
|
return failureRollback;
|
|
694
738
|
};
|
|
695
739
|
const sessionEndpointPath = path.join(request.stateRoot, "sdk", `${request.sessionId}.json`);
|
|
696
|
-
const exitAfterSessionDisposal = async (): Promise<void> => {
|
|
697
|
-
await disposeSession();
|
|
740
|
+
const exitAfterSessionDisposal = async (reason?: "detached_idle"): Promise<void> => {
|
|
741
|
+
await disposeSession(reason);
|
|
698
742
|
let failure: SdkStartupFailure | undefined;
|
|
699
743
|
try {
|
|
700
744
|
const endpoint = JSON.parse(await fs.readFile(sessionEndpointPath, "utf8")) as {
|
|
@@ -724,11 +768,11 @@ export async function runSessionHost(
|
|
|
724
768
|
process.exit(process.exitCode ?? 0);
|
|
725
769
|
};
|
|
726
770
|
let stopping = false;
|
|
727
|
-
const stop = () => {
|
|
771
|
+
const stop = (reason?: "detached_idle") => {
|
|
728
772
|
if (capability.result?.status === "started") {
|
|
729
773
|
if (stopping) return;
|
|
730
774
|
stopping = true;
|
|
731
|
-
void exitAfterSessionDisposal();
|
|
775
|
+
void exitAfterSessionDisposal(reason);
|
|
732
776
|
return;
|
|
733
777
|
}
|
|
734
778
|
const failure = capability.normalizeFailure("startup", "failed", "SDK lifecycle host terminated.");
|
|
@@ -816,31 +860,53 @@ export async function runSessionHost(
|
|
|
816
860
|
await Bun.sleep(5_000);
|
|
817
861
|
}
|
|
818
862
|
startMemoryBackendAfterReadiness(startDeferredMemoryBackend);
|
|
819
|
-
process.once("SIGTERM", stop);
|
|
820
|
-
process.once("SIGINT", stop);
|
|
863
|
+
process.once("SIGTERM", () => stop());
|
|
864
|
+
process.once("SIGINT", () => stop());
|
|
821
865
|
// Two independent bounds, either of which reaps this detached host through
|
|
822
866
|
// the same graceful teardown a SIGTERM would take. The first covers a broker
|
|
823
867
|
// that is gone for good; the second covers the opposite case, a perfectly
|
|
824
868
|
// healthy broker whose host nobody is attached to any more and for which no
|
|
825
869
|
// `session.close` will ever arrive.
|
|
826
|
-
await Promise.race([
|
|
827
|
-
watchSessionHostBrokerLiveness({ agentDir }),
|
|
870
|
+
const reapReason = await Promise.race([
|
|
871
|
+
watchSessionHostBrokerLiveness({ agentDir }).then(() => undefined),
|
|
828
872
|
watchSessionHostClientAttachment({
|
|
829
873
|
readAttachedClients: sessionHostAttachedClients,
|
|
830
|
-
|
|
874
|
+
readWorkLease: sessionHostWorkLeaseActive,
|
|
831
875
|
}),
|
|
832
876
|
]);
|
|
833
|
-
stop();
|
|
877
|
+
stop(reapReason);
|
|
834
878
|
await new Promise<void>(() => {});
|
|
835
879
|
}
|
|
836
880
|
|
|
837
|
-
export type SdkInternalArgv =
|
|
881
|
+
export type SdkInternalArgv =
|
|
882
|
+
| { action: "broker-internal"; agentDir: string }
|
|
883
|
+
| { action: "session-host-internal" }
|
|
884
|
+
| { action: "stderr-drain-internal"; logPath: string; maxBytes: number };
|
|
838
885
|
|
|
839
886
|
/** Parses the exact private argv contracts used by SDK child-process spawns. */
|
|
840
887
|
export function parseSdkInternalArgv(argv: readonly string[]): SdkInternalArgv {
|
|
841
888
|
if (argv[0] === "session-host-internal" && argv.length === 1) return { action: "session-host-internal" };
|
|
842
|
-
if (
|
|
889
|
+
if (
|
|
890
|
+
argv[0] === "broker-internal" &&
|
|
891
|
+
argv.length === 3 &&
|
|
892
|
+
argv[1] === "--agent-dir" &&
|
|
893
|
+
typeof argv[2] === "string" &&
|
|
894
|
+
isSafeSdkInternalAgentDir(argv[2])
|
|
895
|
+
)
|
|
843
896
|
return { action: "broker-internal", agentDir: argv[2] };
|
|
897
|
+
if (
|
|
898
|
+
argv[0] === "stderr-drain-internal" &&
|
|
899
|
+
argv.length === 5 &&
|
|
900
|
+
argv[1] === "--path" &&
|
|
901
|
+
argv[2] &&
|
|
902
|
+
path.isAbsolute(argv[2]) &&
|
|
903
|
+
argv[3] === "--max-bytes"
|
|
904
|
+
) {
|
|
905
|
+
const maxBytes = parsePositiveTimeout(argv[4], "--max-bytes");
|
|
906
|
+
if (maxBytes !== undefined && maxBytes <= 64 * 1024) {
|
|
907
|
+
return { action: "stderr-drain-internal", logPath: argv[2], maxBytes };
|
|
908
|
+
}
|
|
909
|
+
}
|
|
844
910
|
throw new CliParseError("Invalid internal SDK invocation.");
|
|
845
911
|
}
|
|
846
912
|
|
|
@@ -869,12 +935,12 @@ class SdkServeHelp extends Command {
|
|
|
869
935
|
|
|
870
936
|
class SdkSessionHelp extends Command {
|
|
871
937
|
static description =
|
|
872
|
-
"Manage SDK sessions: `gjc sdk session list|inspect|send|status|tail|retire`, or the explicit raw hatch `gjc sdk session raw control|query|global`. The session CLI is broker-bound and credential-free.";
|
|
938
|
+
"Manage SDK sessions: `gjc sdk session list|inspect|send|status|tail|close|retire`, or the explicit raw hatch `gjc sdk session raw control|query|global`. The session CLI is broker-bound and credential-free.";
|
|
873
939
|
static args = {
|
|
874
940
|
verb: Args.string({
|
|
875
941
|
description: "Session verb",
|
|
876
942
|
required: false,
|
|
877
|
-
options: ["list", "inspect", "send", "status", "tail", "retire", "raw"],
|
|
943
|
+
options: ["list", "inspect", "send", "status", "tail", "close", "retire", "raw"],
|
|
878
944
|
}),
|
|
879
945
|
target: Args.string({
|
|
880
946
|
description: "Session id (or the raw kind control|query|global for `raw`)",
|
|
@@ -901,7 +967,8 @@ class SdkSessionHelp extends Command {
|
|
|
901
967
|
}),
|
|
902
968
|
confirm: Flags.boolean({ description: "Confirm a destructive local CLI control operation" }),
|
|
903
969
|
cursor: Flags.string({
|
|
904
|
-
description:
|
|
970
|
+
description:
|
|
971
|
+
"Raw query continuation/search cursor, or session tail checkpoint claim (tail also requires --after-transcript-id)",
|
|
905
972
|
}),
|
|
906
973
|
scope: Flags.string({
|
|
907
974
|
description:
|
|
@@ -918,6 +985,10 @@ class SdkSessionHelp extends Command {
|
|
|
918
985
|
strict: Flags.boolean({ description: "tail --strict: fail closed on retention gaps" }),
|
|
919
986
|
"until-idle": Flags.boolean({ description: "tail --until-idle: exit after an observed terminal turn state" }),
|
|
920
987
|
"all-events": Flags.boolean({ description: "tail --all-events: include every event-ring kind" }),
|
|
988
|
+
"after-transcript-id": Flags.string({
|
|
989
|
+
description:
|
|
990
|
+
"tail --cursor (required): omit transcript rows up to and including this row id (the caller already has them)",
|
|
991
|
+
}),
|
|
921
992
|
page: Flags.boolean({ description: "raw global session.list: return exactly one broker page" }),
|
|
922
993
|
};
|
|
923
994
|
async run(): Promise<void> {}
|
|
@@ -1019,6 +1090,7 @@ class SdkSessionCommand extends Command {
|
|
|
1019
1090
|
strict: Boolean(flagRec.strict),
|
|
1020
1091
|
untilIdle: Boolean(flagRec["until-idle"]),
|
|
1021
1092
|
allEvents: Boolean(flagRec["all-events"]),
|
|
1093
|
+
afterTranscriptId: flagRec["after-transcript-id"] as string | undefined,
|
|
1022
1094
|
page: Boolean(flagRec.page),
|
|
1023
1095
|
limit: flagRec.limit as number | undefined,
|
|
1024
1096
|
agentDir: flagRec["agent-dir"] as string | undefined,
|
|
@@ -1058,77 +1130,127 @@ class SdkGuidesCommand extends Command {
|
|
|
1058
1130
|
});
|
|
1059
1131
|
}
|
|
1060
1132
|
}
|
|
1061
|
-
|
|
1062
1133
|
export default class Sdk extends Command {
|
|
1063
|
-
static description =
|
|
1064
|
-
"gjc sdk serve --stdio | --socket <path> [--session <id>]; gjc sdk search [--scope repo|pwd|global] [--json] [--limit N] [--cursor ...]; gjc sdk spawn --cwd <dir> --prompt <task> (master only); gjc sdk session list|inspect|send|status|tail; gjc sdk guides refresh|list|show|status|trust";
|
|
1134
|
+
static description = "SDK command runtime; public grammar and help are registry-owned.";
|
|
1065
1135
|
static hidden = false;
|
|
1066
1136
|
static delegateHelp = true;
|
|
1067
|
-
static args = {
|
|
1068
|
-
action: Args.string({ required: false, options: ["serve", "search", "spawn", "session", "guides"] }),
|
|
1069
|
-
};
|
|
1070
|
-
static flags = SdkServeHelp.flags;
|
|
1071
1137
|
async run(): Promise<void> {
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
:
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1138
|
+
if (
|
|
1139
|
+
this.argv[0] !== "broker-internal" &&
|
|
1140
|
+
this.argv[0] !== "session-host-internal" &&
|
|
1141
|
+
this.argv[0] !== "stderr-drain-internal"
|
|
1142
|
+
) {
|
|
1143
|
+
const scan = scanPublicCommand("sdk", this.argv);
|
|
1144
|
+
if (scan.kind !== "operation") throw new PublicCommandFailure({ kind: "usage", proof: "pre-effect" });
|
|
1145
|
+
const { args, flags } = scan;
|
|
1146
|
+
const operation = scan.descriptor.command[1];
|
|
1147
|
+
const stringFlag = (name: string): string | undefined => flags[name] as string | undefined;
|
|
1148
|
+
const timeoutMs = flags["timeout-ms"] === undefined ? undefined : Number(flags["timeout-ms"]);
|
|
1149
|
+
if (operation === "spawn") {
|
|
1150
|
+
const spawn = await runSdkSpawn({
|
|
1151
|
+
cwd: stringFlag("cwd"),
|
|
1152
|
+
prompt: stringFlag("prompt"),
|
|
1153
|
+
model: stringFlag("model"),
|
|
1154
|
+
profile: stringFlag("profile"),
|
|
1155
|
+
agentDir: stringFlag("agent-dir"),
|
|
1156
|
+
idempotencyKey: stringFlag("idempotency-key"),
|
|
1157
|
+
});
|
|
1158
|
+
process.stdout.write(`${flags.json ? JSON.stringify(spawn.rendered) : renderSpawnTable(spawn.rendered)}\n`);
|
|
1159
|
+
return;
|
|
1160
|
+
}
|
|
1161
|
+
if (operation === "search") {
|
|
1162
|
+
const search = await runSdkSearch({
|
|
1163
|
+
agentDir: stringFlag("agent-dir"),
|
|
1164
|
+
repo: stringFlag("repo"),
|
|
1165
|
+
scope: stringFlag("scope"),
|
|
1166
|
+
limit: flags.limit as number | undefined,
|
|
1167
|
+
cursor: stringFlag("cursor"),
|
|
1168
|
+
});
|
|
1169
|
+
process.stdout.write(
|
|
1170
|
+
`${flags.json ? JSON.stringify(search.result) : renderSdkSearchTable(search.result)}\n`,
|
|
1171
|
+
);
|
|
1172
|
+
return;
|
|
1173
|
+
}
|
|
1174
|
+
if (operation === "session") {
|
|
1175
|
+
await runSdkSessionCli({
|
|
1176
|
+
action: scan.descriptor.command[2],
|
|
1177
|
+
rawAction: scan.descriptor.command[3],
|
|
1178
|
+
sessionId: args.sessionId as string | undefined,
|
|
1179
|
+
opRef: (args.opRef as string | undefined) ?? stringFlag("op-ref"),
|
|
1180
|
+
operation: stringFlag("op"),
|
|
1181
|
+
query: stringFlag("query"),
|
|
1182
|
+
text: stringFlag("text"),
|
|
1183
|
+
jsonInput: stringFlag("json-input"),
|
|
1184
|
+
jsonInputFile: stringFlag("json-input-file"),
|
|
1185
|
+
jsonInputStdin: Boolean(flags["json-input-stdin"]),
|
|
1186
|
+
confirm: Boolean(flags.confirm),
|
|
1187
|
+
idempotencyKey: stringFlag("idempotency-key"),
|
|
1188
|
+
cursor: stringFlag("cursor"),
|
|
1189
|
+
afterTranscriptId: stringFlag("after-transcript-id"),
|
|
1190
|
+
wait: Boolean(flags.wait),
|
|
1191
|
+
timeoutMs,
|
|
1192
|
+
strict: Boolean(flags.strict),
|
|
1193
|
+
untilIdle: Boolean(flags["until-idle"]),
|
|
1194
|
+
allEvents: Boolean(flags["all-events"]),
|
|
1195
|
+
page: Boolean(flags.page),
|
|
1196
|
+
limit: flags.limit as number | undefined,
|
|
1197
|
+
agentDir: stringFlag("agent-dir"),
|
|
1198
|
+
repo: stringFlag("repo"),
|
|
1199
|
+
scope: stringFlag("scope"),
|
|
1200
|
+
json: flags.json === true,
|
|
1201
|
+
});
|
|
1202
|
+
return;
|
|
1203
|
+
}
|
|
1204
|
+
if (operation === "guides") {
|
|
1205
|
+
await runSdkGuidesCli({
|
|
1206
|
+
action: scan.descriptor.command[2],
|
|
1207
|
+
guideId: args.guideId as string | undefined,
|
|
1208
|
+
url: stringFlag("url"),
|
|
1209
|
+
agentDir: stringFlag("agent-dir"),
|
|
1210
|
+
timeoutMs,
|
|
1211
|
+
});
|
|
1212
|
+
return;
|
|
1213
|
+
}
|
|
1214
|
+
if (operation === "serve") {
|
|
1215
|
+
try {
|
|
1216
|
+
await runSdkServe(scan.operationArgv.slice(1));
|
|
1217
|
+
} catch (error) {
|
|
1218
|
+
if (!(error instanceof SdkServeError)) throw error;
|
|
1219
|
+
// A command invoked outside the public family dispatcher still owns its
|
|
1220
|
+
// stderr envelope. The dispatcher itself keeps the typed failure for the
|
|
1221
|
+
// shared JSON/text boundary so it can render the full contract.
|
|
1222
|
+
if (this.config?.commands instanceof Map && this.config.commands.has("sdk")) throw error;
|
|
1223
|
+
process.stderr.write(
|
|
1224
|
+
`${JSON.stringify({
|
|
1225
|
+
ok: false,
|
|
1226
|
+
error: {
|
|
1227
|
+
code: error.code,
|
|
1228
|
+
message: error.message,
|
|
1229
|
+
...(error.details === undefined ? {} : { details: error.details }),
|
|
1230
|
+
...(error.cleanupError === undefined ? {} : { cleanupError: error.cleanupError }),
|
|
1231
|
+
},
|
|
1232
|
+
})}\n`,
|
|
1233
|
+
);
|
|
1234
|
+
process.exitCode = error.exitCode;
|
|
1235
|
+
}
|
|
1236
|
+
return;
|
|
1237
|
+
}
|
|
1238
|
+
throw new PublicCommandFailure({ kind: "usage", proof: "pre-effect" });
|
|
1120
1239
|
}
|
|
1121
|
-
|
|
1122
|
-
throw new CliParseError("Expected action to be serve, search, spawn, session, or guides.");
|
|
1240
|
+
|
|
1123
1241
|
const internal = parseSdkInternalArgv(this.argv);
|
|
1124
1242
|
if (internal.action === "session-host-internal") {
|
|
1125
1243
|
await runSessionHost();
|
|
1126
1244
|
return;
|
|
1127
1245
|
}
|
|
1246
|
+
if (internal.action === "stderr-drain-internal") {
|
|
1247
|
+
await runSdkStderrDrainer(internal.logPath, internal.maxBytes);
|
|
1248
|
+
return;
|
|
1249
|
+
}
|
|
1128
1250
|
const agentDir = path.resolve(internal.agentDir);
|
|
1129
1251
|
let broker: Broker | undefined;
|
|
1130
1252
|
try {
|
|
1131
|
-
|
|
1253
|
+
const startupOperation = async (deadline: number): Promise<Broker | undefined> => {
|
|
1132
1254
|
const remainingMs = Math.max(1, deadline - Date.now());
|
|
1133
1255
|
const testWatchdogMs = Number(process.env.GJC_SDK_TEST_BROKER_STARTUP_WATCHDOG_MS ?? 0);
|
|
1134
1256
|
const watchdogMs =
|
|
@@ -1145,6 +1267,12 @@ export default class Sdk extends Command {
|
|
|
1145
1267
|
const stalled = Promise.withResolvers<void>();
|
|
1146
1268
|
await stalled.promise;
|
|
1147
1269
|
}
|
|
1270
|
+
const startupGateFile = process.env.GJC_SDK_TEST_BROKER_STARTUP_GATE_FILE;
|
|
1271
|
+
if (startupGateFile) {
|
|
1272
|
+
await emitBrokerStartupTestSignal("startup-gate-waiting");
|
|
1273
|
+
await waitForBrokerStartupTestGate(startupGateFile);
|
|
1274
|
+
await emitBrokerStartupTestSignal("startup-gate-released");
|
|
1275
|
+
}
|
|
1148
1276
|
const startupDelayMs = Number(process.env.GJC_SDK_TEST_BROKER_STARTUP_DELAY_MS ?? 0);
|
|
1149
1277
|
if (Number.isSafeInteger(startupDelayMs) && startupDelayMs > 0 && startupDelayMs <= 10_000)
|
|
1150
1278
|
await Bun.sleep(startupDelayMs);
|
|
@@ -1179,6 +1307,10 @@ export default class Sdk extends Command {
|
|
|
1179
1307
|
} finally {
|
|
1180
1308
|
clearTimeout(startupWatchdog);
|
|
1181
1309
|
}
|
|
1310
|
+
};
|
|
1311
|
+
broker = await withBrokerStartupLock(agentDir, startupOperation, {
|
|
1312
|
+
onAcquired: () => void emitBrokerStartupTestSignal("fence-acquired"),
|
|
1313
|
+
onContended: () => void emitBrokerStartupTestSignal("fence-contended"),
|
|
1182
1314
|
});
|
|
1183
1315
|
} catch (error) {
|
|
1184
1316
|
if (broker) {
|
package/src/commands/setup.ts
CHANGED
|
@@ -76,6 +76,7 @@ export default class Setup extends Command {
|
|
|
76
76
|
}),
|
|
77
77
|
"api-key-env": Flags.string({ description: "Read provider API key from this environment variable" }),
|
|
78
78
|
model: Flags.string({ description: "Model id to add (repeat or comma-separate)", multiple: true }),
|
|
79
|
+
discover: Flags.boolean({ description: "Discover models from the provider OpenAI /v1/models endpoint" }),
|
|
79
80
|
"models-path": Flags.string({ description: "Override models config path" }),
|
|
80
81
|
remove: Flags.boolean({ description: "Roll back the Paseo registration GJC created" }),
|
|
81
82
|
mpreset: Flags.string({ description: "Register an additional gjc-<preset> Paseo provider" }),
|
|
@@ -97,6 +98,7 @@ export default class Setup extends Command {
|
|
|
97
98
|
baseUrl: flags["base-url"],
|
|
98
99
|
apiKeyEnv: flags["api-key-env"],
|
|
99
100
|
model: flags.model,
|
|
101
|
+
discover: flags.discover,
|
|
100
102
|
modelsPath: flags["models-path"],
|
|
101
103
|
smoke: flags.smoke,
|
|
102
104
|
install: flags.install,
|
package/src/commands/skills.ts
CHANGED
|
@@ -28,6 +28,11 @@ export default class Skills extends Command {
|
|
|
28
28
|
options: ["all", "project", "user"],
|
|
29
29
|
default: "all",
|
|
30
30
|
}),
|
|
31
|
+
limit: Flags.integer({ description: "Max discover results, clamped to 1-50 (default 50)" }),
|
|
32
|
+
offset: Flags.integer({ description: "Zero-based offset into the discover results (default 0)" }),
|
|
33
|
+
query: Flags.string({
|
|
34
|
+
description: "Filter discover results by name, description, source, or use conditions",
|
|
35
|
+
}),
|
|
31
36
|
};
|
|
32
37
|
|
|
33
38
|
static examples = [
|
|
@@ -36,6 +41,9 @@ export default class Skills extends Command {
|
|
|
36
41
|
"# Machine-readable embedded skill content\n gjc skills read ralplan --json",
|
|
37
42
|
"# Show filesystem-discovered skills (project and user) with diagnostics\n gjc skills discover",
|
|
38
43
|
"# Show only project-scope skills (project .gjc/skills locations)\n gjc skills discover --source project --json",
|
|
44
|
+
"# Narrow a truncated catalog to the skills you care about\n gjc skills discover --query ego-browser",
|
|
45
|
+
"# Show only the first 10 discovered skills\n gjc skills discover --limit 10",
|
|
46
|
+
"# Page past the first 50: discover prints the exact next-page command\n gjc skills discover --offset 50",
|
|
39
47
|
];
|
|
40
48
|
|
|
41
49
|
async run(): Promise<void> {
|
|
@@ -51,6 +59,9 @@ export default class Skills extends Command {
|
|
|
51
59
|
flags: {
|
|
52
60
|
json: flags.json,
|
|
53
61
|
source: (flags.source as "all" | "project" | "user" | undefined) ?? "all",
|
|
62
|
+
limit: flags.limit,
|
|
63
|
+
offset: flags.offset,
|
|
64
|
+
query: flags.query,
|
|
54
65
|
},
|
|
55
66
|
};
|
|
56
67
|
await runSkillsCommand(cmd);
|
|
@@ -360,6 +360,8 @@ export const TIER_MAP_SKIP_LIST = {
|
|
|
360
360
|
"nvidia/thinkingmachines/inkling": { rationale: "post-rebase catalog addition from dev; not yet curated" },
|
|
361
361
|
"nvidia/upstage/solar-10.7b-instruct": { rationale: "post-rebase catalog addition from dev; not yet curated" },
|
|
362
362
|
"openai-codex/gpt-6-astra": { rationale: "GPT-6 Astra catalog addition (2026-09-03 release); not yet curated" },
|
|
363
|
+
"openai-codex/gpt-6-luna": { rationale: "GPT-6 Luna catalog addition (2026-09-22 release); not yet curated" },
|
|
364
|
+
"openai-codex/gpt-6-sol": { rationale: "GPT-6 Sol catalog addition (2026-09-22 release); not yet curated" },
|
|
363
365
|
"openai-codex/gpt-daybreak-blue-latest": { rationale: "post-rebase catalog addition from dev; not yet curated" },
|
|
364
366
|
"opencode-go/deepseek-v4-flash-vision-exp": {
|
|
365
367
|
rationale: "post-rebase catalog addition from dev; not yet curated",
|
|
@@ -378,11 +380,13 @@ export const TIER_MAP_SKIP_LIST = {
|
|
|
378
380
|
},
|
|
379
381
|
"opencode-go/qwen3.8-flash": { rationale: "post-rebase catalog addition from dev; not yet curated" },
|
|
380
382
|
"opencode-go/qwen3.8-max": { rationale: "post-rebase catalog addition from dev; not yet curated" },
|
|
383
|
+
"opencode-go/union-alpha": { rationale: "stealth model; capability tier not yet independently reviewed" },
|
|
381
384
|
"opencode-zen/grok-4.6": { rationale: "post-rebase catalog addition from dev; not yet curated" },
|
|
382
385
|
"opencode-zen/hy3-free": { rationale: "post-rebase catalog addition from dev; not yet curated" },
|
|
383
386
|
"opencode-zen/kimi-k3": { rationale: "post-rebase catalog addition from dev; not yet curated" },
|
|
384
387
|
"opencode-zen/ling-3.0-tiny-free": { rationale: "post-rebase catalog addition from dev; not yet curated" },
|
|
385
388
|
"opencode-zen/nemotron-3.5-lightning-free": { rationale: "post-rebase catalog addition from dev; not yet curated" },
|
|
389
|
+
"opencode-zen/union-alpha": { rationale: "stealth model; capability tier not yet independently reviewed" },
|
|
386
390
|
"openrouter/anthropic/claude-fable-5:batch": { rationale: "post-rebase catalog addition from dev; not yet curated" },
|
|
387
391
|
"openrouter/anthropic/claude-haiku-4.5:batch": {
|
|
388
392
|
rationale: "post-rebase catalog addition from dev; not yet curated",
|
|
@@ -539,6 +543,18 @@ export const TIER_MAP_SKIP_LIST = {
|
|
|
539
543
|
"alibaba-token-plan/glm-5.2": { baseline: true, rationale: "pre-feature baseline; not yet curated" },
|
|
540
544
|
"alibaba-token-plan/qwen3.8-max": { baseline: true, rationale: "post-feature catalog addition; not yet curated" },
|
|
541
545
|
"alibaba-token-plan/qwen3.8-max-preview": { baseline: true, rationale: "pre-feature baseline; not yet curated" },
|
|
546
|
+
"alibaba-token-plan/deepseek-v4-pro-0813": {
|
|
547
|
+
baseline: true,
|
|
548
|
+
rationale: "post-feature catalog addition; not yet curated",
|
|
549
|
+
},
|
|
550
|
+
"alibaba-token-plan/deepseek-v4.1-flash": {
|
|
551
|
+
baseline: true,
|
|
552
|
+
rationale: "post-feature catalog addition; not yet curated",
|
|
553
|
+
},
|
|
554
|
+
"alibaba-token-plan/glm-5.3": {
|
|
555
|
+
baseline: true,
|
|
556
|
+
rationale: "post-feature catalog addition; not yet curated",
|
|
557
|
+
},
|
|
542
558
|
"amazon-bedrock/anthropic.claude-3-5-haiku-20241022-v1:0": {
|
|
543
559
|
baseline: true,
|
|
544
560
|
rationale: "pre-feature baseline; not yet curated",
|