@qodo/sdk 0.13.4 → 2.0.0-next.1
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/LICENSE +31 -118
- package/README.md +133 -121
- package/bin/qodo-skills.mjs +13 -0
- package/bundled-skills/code-review/SKILL.md +41 -0
- package/bundled-skills/pr-summary/SKILL.md +59 -0
- package/bundled-skills/test-gen/SKILL.md +47 -0
- package/dist/auth/index.browser.d.ts +38 -0
- package/dist/auth/index.browser.d.ts.map +1 -0
- package/dist/auth/index.browser.js +62 -0
- package/dist/auth/index.browser.js.map +1 -0
- package/dist/auth/index.d.ts +44 -30
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +57 -110
- package/dist/auth/index.js.map +1 -1
- package/dist/client/AgentsClient.d.ts +33 -0
- package/dist/client/AgentsClient.d.ts.map +1 -0
- package/dist/client/AgentsClient.js +40 -0
- package/dist/client/AgentsClient.js.map +1 -0
- package/dist/client/ArtifactsClient.d.ts +43 -0
- package/dist/client/ArtifactsClient.d.ts.map +1 -0
- package/dist/client/ArtifactsClient.js +54 -0
- package/dist/client/ArtifactsClient.js.map +1 -0
- package/dist/client/BulletinClient.d.ts +45 -0
- package/dist/client/BulletinClient.d.ts.map +1 -0
- package/dist/client/BulletinClient.js +51 -0
- package/dist/client/BulletinClient.js.map +1 -0
- package/dist/client/InfoClient.d.ts +58 -0
- package/dist/client/InfoClient.d.ts.map +1 -0
- package/dist/client/InfoClient.js +135 -0
- package/dist/client/InfoClient.js.map +1 -0
- package/dist/client/PipelineClient.d.ts +162 -0
- package/dist/client/PipelineClient.d.ts.map +1 -0
- package/dist/client/PipelineClient.js +340 -0
- package/dist/client/PipelineClient.js.map +1 -0
- package/dist/client/QarRegistryClient.d.ts +396 -0
- package/dist/client/QarRegistryClient.d.ts.map +1 -0
- package/dist/client/QarRegistryClient.js +536 -0
- package/dist/client/QarRegistryClient.js.map +1 -0
- package/dist/client/QodoClient.d.ts +296 -0
- package/dist/client/QodoClient.d.ts.map +1 -0
- package/dist/client/QodoClient.js +803 -0
- package/dist/client/QodoClient.js.map +1 -0
- package/dist/client/SpecsClient.d.ts +121 -0
- package/dist/client/SpecsClient.d.ts.map +1 -0
- package/dist/client/SpecsClient.js +252 -0
- package/dist/client/SpecsClient.js.map +1 -0
- package/dist/client/StateClient.d.ts +35 -0
- package/dist/client/StateClient.d.ts.map +1 -0
- package/dist/client/StateClient.js +36 -0
- package/dist/client/StateClient.js.map +1 -0
- package/dist/client/TaskClient.d.ts +706 -0
- package/dist/client/TaskClient.d.ts.map +1 -0
- package/dist/client/TaskClient.js +2522 -0
- package/dist/client/TaskClient.js.map +1 -0
- package/dist/client/ToolClient.d.ts +278 -0
- package/dist/client/ToolClient.d.ts.map +1 -0
- package/dist/client/ToolClient.js +1139 -0
- package/dist/client/ToolClient.js.map +1 -0
- package/dist/client/a2a/index.d.ts +10 -0
- package/dist/client/a2a/index.d.ts.map +1 -0
- package/dist/client/a2a/index.js +9 -0
- package/dist/client/a2a/index.js.map +1 -0
- package/dist/client/a2a/registerA2A.d.ts +170 -0
- package/dist/client/a2a/registerA2A.d.ts.map +1 -0
- package/dist/client/a2a/registerA2A.js +85 -0
- package/dist/client/a2a/registerA2A.js.map +1 -0
- package/dist/client/connection.d.ts +893 -0
- package/dist/client/connection.d.ts.map +1 -0
- package/dist/client/connection.js +2189 -0
- package/dist/client/connection.js.map +1 -0
- package/dist/client/errors.d.ts +735 -0
- package/dist/client/errors.d.ts.map +1 -0
- package/dist/client/errors.js +921 -0
- package/dist/client/errors.js.map +1 -0
- package/dist/client/index.d.ts +26 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +20 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/inlineGraph.d.ts +66 -0
- package/dist/client/inlineGraph.d.ts.map +1 -0
- package/dist/client/inlineGraph.js +500 -0
- package/dist/client/inlineGraph.js.map +1 -0
- package/dist/client/internal/thenable.d.ts +27 -0
- package/dist/client/internal/thenable.d.ts.map +1 -0
- package/dist/client/internal/thenable.js +31 -0
- package/dist/client/internal/thenable.js.map +1 -0
- package/dist/client/iterator.d.ts +32 -0
- package/dist/client/iterator.d.ts.map +1 -0
- package/dist/client/iterator.js +73 -0
- package/dist/client/iterator.js.map +1 -0
- package/dist/client/mcp/McpClientPool.browser.d.ts +76 -0
- package/dist/client/mcp/McpClientPool.browser.d.ts.map +1 -0
- package/dist/client/mcp/McpClientPool.browser.js +78 -0
- package/dist/client/mcp/McpClientPool.browser.js.map +1 -0
- package/dist/client/mcp/McpClientPool.d.ts +236 -0
- package/dist/client/mcp/McpClientPool.d.ts.map +1 -0
- package/dist/client/mcp/McpClientPool.js +585 -0
- package/dist/client/mcp/McpClientPool.js.map +1 -0
- package/dist/client/mcp/projection.d.ts +109 -0
- package/dist/client/mcp/projection.d.ts.map +1 -0
- package/dist/client/mcp/projection.js +446 -0
- package/dist/client/mcp/projection.js.map +1 -0
- package/dist/client/mcp/substituteEnv.browser.d.ts +18 -0
- package/dist/client/mcp/substituteEnv.browser.d.ts.map +1 -0
- package/dist/client/mcp/substituteEnv.browser.js +20 -0
- package/dist/client/mcp/substituteEnv.browser.js.map +1 -0
- package/dist/client/mcp/substituteEnv.d.ts +45 -0
- package/dist/client/mcp/substituteEnv.d.ts.map +1 -0
- package/dist/client/mcp/substituteEnv.js +63 -0
- package/dist/client/mcp/substituteEnv.js.map +1 -0
- package/dist/client/observers.d.ts +57 -0
- package/dist/client/observers.d.ts.map +1 -0
- package/dist/client/observers.js +203 -0
- package/dist/client/observers.js.map +1 -0
- package/dist/client/options.d.ts +269 -0
- package/dist/client/options.d.ts.map +1 -0
- package/dist/client/options.js +9 -0
- package/dist/client/options.js.map +1 -0
- package/dist/client/tools/_readlineApprovalPrompt.browser.d.ts +17 -0
- package/dist/client/tools/_readlineApprovalPrompt.browser.d.ts.map +1 -0
- package/dist/client/tools/_readlineApprovalPrompt.browser.js +24 -0
- package/dist/client/tools/_readlineApprovalPrompt.browser.js.map +1 -0
- package/dist/client/tools/_readlineApprovalPrompt.d.ts +33 -0
- package/dist/client/tools/_readlineApprovalPrompt.d.ts.map +1 -0
- package/dist/client/tools/_readlineApprovalPrompt.js +90 -0
- package/dist/client/tools/_readlineApprovalPrompt.js.map +1 -0
- package/dist/client/tools/approval.d.ts +280 -0
- package/dist/client/tools/approval.d.ts.map +1 -0
- package/dist/client/tools/approval.js +229 -0
- package/dist/client/tools/approval.js.map +1 -0
- package/dist/client/tools/bindFunctionToolDefs.d.ts +156 -0
- package/dist/client/tools/bindFunctionToolDefs.d.ts.map +1 -0
- package/dist/client/tools/bindFunctionToolDefs.js +360 -0
- package/dist/client/tools/bindFunctionToolDefs.js.map +1 -0
- package/dist/client/tools/defineFunctionTool.d.ts +277 -0
- package/dist/client/tools/defineFunctionTool.d.ts.map +1 -0
- package/dist/client/tools/defineFunctionTool.js +190 -0
- package/dist/client/tools/defineFunctionTool.js.map +1 -0
- package/dist/client/transport.browser.d.ts +20 -0
- package/dist/client/transport.browser.d.ts.map +1 -0
- package/dist/client/transport.browser.js +29 -0
- package/dist/client/transport.browser.js.map +1 -0
- package/dist/client/transport.d.ts +47 -0
- package/dist/client/transport.d.ts.map +1 -0
- package/dist/client/transport.js +102 -0
- package/dist/client/transport.js.map +1 -0
- package/dist/client/transport.shared.d.ts +30 -0
- package/dist/client/transport.shared.d.ts.map +1 -0
- package/dist/client/transport.shared.js +40 -0
- package/dist/client/transport.shared.js.map +1 -0
- package/dist/client/uuid.d.ts +32 -0
- package/dist/client/uuid.d.ts.map +1 -0
- package/dist/client/uuid.js +65 -0
- package/dist/client/uuid.js.map +1 -0
- package/dist/index.d.ts +88 -39
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +166 -43
- package/dist/index.js.map +1 -1
- package/dist/observability/attributes.d.ts +136 -0
- package/dist/observability/attributes.d.ts.map +1 -0
- package/dist/observability/attributes.js +184 -0
- package/dist/observability/attributes.js.map +1 -0
- package/dist/observability/index.d.ts +14 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +11 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/resolveOTel.browser.d.ts +13 -0
- package/dist/observability/resolveOTel.browser.d.ts.map +1 -0
- package/dist/observability/resolveOTel.browser.js +14 -0
- package/dist/observability/resolveOTel.browser.js.map +1 -0
- package/dist/observability/resolveOTel.d.ts +28 -0
- package/dist/observability/resolveOTel.d.ts.map +1 -0
- package/dist/observability/resolveOTel.js +74 -0
- package/dist/observability/resolveOTel.js.map +1 -0
- package/dist/observability/spans.d.ts +198 -0
- package/dist/observability/spans.d.ts.map +1 -0
- package/dist/observability/spans.js +300 -0
- package/dist/observability/spans.js.map +1 -0
- package/dist/observability/traceContext.d.ts +51 -0
- package/dist/observability/traceContext.d.ts.map +1 -0
- package/dist/observability/traceContext.js +151 -0
- package/dist/observability/traceContext.js.map +1 -0
- package/dist/observability/transportMetrics.d.ts +58 -0
- package/dist/observability/transportMetrics.d.ts.map +1 -0
- package/dist/observability/transportMetrics.js +55 -0
- package/dist/observability/transportMetrics.js.map +1 -0
- package/dist/qar/agentSpec.d.ts +93 -0
- package/dist/qar/agentSpec.d.ts.map +1 -0
- package/dist/qar/agentSpec.js +184 -0
- package/dist/qar/agentSpec.js.map +1 -0
- package/dist/qar/clientEvents.d.ts +86 -0
- package/dist/qar/clientEvents.d.ts.map +1 -0
- package/dist/qar/clientEvents.js +36 -0
- package/dist/qar/clientEvents.js.map +1 -0
- package/dist/qar/envelopes.d.ts +227 -0
- package/dist/qar/envelopes.d.ts.map +1 -0
- package/dist/qar/envelopes.js +67 -0
- package/dist/qar/envelopes.js.map +1 -0
- package/dist/qar/generated/envelope.d.ts +332 -0
- package/dist/qar/generated/envelope.d.ts.map +1 -0
- package/dist/qar/generated/envelope.js +15 -0
- package/dist/qar/generated/envelope.js.map +1 -0
- package/dist/qar/generated/qar-info.d.ts +76 -0
- package/dist/qar/generated/qar-info.d.ts.map +1 -0
- package/dist/qar/generated/qar-info.js +15 -0
- package/dist/qar/generated/qar-info.js.map +1 -0
- package/dist/qar/generated/qodo-task-start-payload.d.ts +54 -0
- package/dist/qar/generated/qodo-task-start-payload.d.ts.map +1 -0
- package/dist/qar/generated/qodo-task-start-payload.js +15 -0
- package/dist/qar/generated/qodo-task-start-payload.js.map +1 -0
- package/dist/qar/ids.d.ts +19 -0
- package/dist/qar/ids.d.ts.map +1 -0
- package/dist/qar/ids.js +11 -0
- package/dist/qar/ids.js.map +1 -0
- package/dist/qar/index.d.ts +24 -0
- package/dist/qar/index.d.ts.map +1 -0
- package/dist/qar/index.js +16 -0
- package/dist/qar/index.js.map +1 -0
- package/dist/qar/info.d.ts +37 -0
- package/dist/qar/info.d.ts.map +1 -0
- package/dist/qar/info.js +17 -0
- package/dist/qar/info.js.map +1 -0
- package/dist/qar/json.d.ts +14 -0
- package/dist/qar/json.d.ts.map +1 -0
- package/dist/qar/json.js +9 -0
- package/dist/qar/json.js.map +1 -0
- package/dist/qar/payloads.d.ts +480 -0
- package/dist/qar/payloads.d.ts.map +1 -0
- package/dist/qar/payloads.js +37 -0
- package/dist/qar/payloads.js.map +1 -0
- package/dist/qar/specs.d.ts +604 -0
- package/dist/qar/specs.d.ts.map +1 -0
- package/dist/qar/specs.js +29 -0
- package/dist/qar/specs.js.map +1 -0
- package/dist/qar/taskEvents.d.ts +25 -0
- package/dist/qar/taskEvents.d.ts.map +1 -0
- package/dist/qar/taskEvents.js +22 -0
- package/dist/qar/taskEvents.js.map +1 -0
- package/dist/qar/trace.d.ts +12 -0
- package/dist/qar/trace.d.ts.map +1 -0
- package/dist/qar/trace.js +12 -0
- package/dist/qar/trace.js.map +1 -0
- package/dist/skills/activation.d.ts +177 -0
- package/dist/skills/activation.d.ts.map +1 -0
- package/dist/skills/activation.js +428 -0
- package/dist/skills/activation.js.map +1 -0
- package/dist/skills/cli/index.browser.d.ts +18 -0
- package/dist/skills/cli/index.browser.d.ts.map +1 -0
- package/dist/skills/cli/index.browser.js +27 -0
- package/dist/skills/cli/index.browser.js.map +1 -0
- package/dist/skills/cli/index.d.ts +37 -0
- package/dist/skills/cli/index.d.ts.map +1 -0
- package/dist/skills/cli/index.js +494 -0
- package/dist/skills/cli/index.js.map +1 -0
- package/dist/skills/events.d.ts +255 -0
- package/dist/skills/events.d.ts.map +1 -0
- package/dist/skills/events.js +224 -0
- package/dist/skills/events.js.map +1 -0
- package/dist/skills/index.d.ts +45 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +34 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/inject.d.ts +57 -0
- package/dist/skills/inject.d.ts.map +1 -0
- package/dist/skills/inject.js +162 -0
- package/dist/skills/inject.js.map +1 -0
- package/dist/skills/lockfile.browser.d.ts +56 -0
- package/dist/skills/lockfile.browser.d.ts.map +1 -0
- package/dist/skills/lockfile.browser.js +55 -0
- package/dist/skills/lockfile.browser.js.map +1 -0
- package/dist/skills/lockfile.d.ts +137 -0
- package/dist/skills/lockfile.d.ts.map +1 -0
- package/dist/skills/lockfile.js +423 -0
- package/dist/skills/lockfile.js.map +1 -0
- package/dist/skills/manager.browser.d.ts +94 -0
- package/dist/skills/manager.browser.d.ts.map +1 -0
- package/dist/skills/manager.browser.js +159 -0
- package/dist/skills/manager.browser.js.map +1 -0
- package/dist/skills/manager.d.ts +362 -0
- package/dist/skills/manager.d.ts.map +1 -0
- package/dist/skills/manager.js +1386 -0
- package/dist/skills/manager.js.map +1 -0
- package/dist/skills/mcp/index.d.ts +15 -0
- package/dist/skills/mcp/index.d.ts.map +1 -0
- package/dist/skills/mcp/index.js +12 -0
- package/dist/skills/mcp/index.js.map +1 -0
- package/dist/skills/mcp/path.browser.d.ts +27 -0
- package/dist/skills/mcp/path.browser.d.ts.map +1 -0
- package/dist/skills/mcp/path.browser.js +33 -0
- package/dist/skills/mcp/path.browser.js.map +1 -0
- package/dist/skills/mcp/path.d.ts +57 -0
- package/dist/skills/mcp/path.d.ts.map +1 -0
- package/dist/skills/mcp/path.js +150 -0
- package/dist/skills/mcp/path.js.map +1 -0
- package/dist/skills/mcp/server.browser.d.ts +32 -0
- package/dist/skills/mcp/server.browser.d.ts.map +1 -0
- package/dist/skills/mcp/server.browser.js +53 -0
- package/dist/skills/mcp/server.browser.js.map +1 -0
- package/dist/skills/mcp/server.d.ts +144 -0
- package/dist/skills/mcp/server.d.ts.map +1 -0
- package/dist/skills/mcp/server.js +841 -0
- package/dist/skills/mcp/server.js.map +1 -0
- package/dist/skills/mcp/types.d.ts +72 -0
- package/dist/skills/mcp/types.d.ts.map +1 -0
- package/dist/skills/mcp/types.js +20 -0
- package/dist/skills/mcp/types.js.map +1 -0
- package/dist/skills/mcp/wireDefs.d.ts +58 -0
- package/dist/skills/mcp/wireDefs.d.ts.map +1 -0
- package/dist/skills/mcp/wireDefs.js +141 -0
- package/dist/skills/mcp/wireDefs.js.map +1 -0
- package/dist/skills/parser.d.ts +63 -0
- package/dist/skills/parser.d.ts.map +1 -0
- package/dist/skills/parser.js +755 -0
- package/dist/skills/parser.js.map +1 -0
- package/dist/skills/prefilter.d.ts +104 -0
- package/dist/skills/prefilter.d.ts.map +1 -0
- package/dist/skills/prefilter.js +398 -0
- package/dist/skills/prefilter.js.map +1 -0
- package/dist/skills/preprocess.d.ts +169 -0
- package/dist/skills/preprocess.d.ts.map +1 -0
- package/dist/skills/preprocess.js +535 -0
- package/dist/skills/preprocess.js.map +1 -0
- package/dist/skills/render.d.ts +83 -0
- package/dist/skills/render.d.ts.map +1 -0
- package/dist/skills/render.js +397 -0
- package/dist/skills/render.js.map +1 -0
- package/dist/skills/sources/index.browser.d.ts +29 -0
- package/dist/skills/sources/index.browser.d.ts.map +1 -0
- package/dist/skills/sources/index.browser.js +16 -0
- package/dist/skills/sources/index.browser.js.map +1 -0
- package/dist/skills/sources/index.d.ts +59 -0
- package/dist/skills/sources/index.d.ts.map +1 -0
- package/dist/skills/sources/index.js +471 -0
- package/dist/skills/sources/index.js.map +1 -0
- package/dist/skills/sources/walk.browser.d.ts +17 -0
- package/dist/skills/sources/walk.browser.d.ts.map +1 -0
- package/dist/skills/sources/walk.browser.js +19 -0
- package/dist/skills/sources/walk.browser.js.map +1 -0
- package/dist/skills/sources/walk.d.ts +68 -0
- package/dist/skills/sources/walk.d.ts.map +1 -0
- package/dist/skills/sources/walk.js +264 -0
- package/dist/skills/sources/walk.js.map +1 -0
- package/dist/skills/substitute.d.ts +87 -0
- package/dist/skills/substitute.d.ts.map +1 -0
- package/dist/skills/substitute.js +322 -0
- package/dist/skills/substitute.js.map +1 -0
- package/dist/skills/testing/SkillKit.browser.d.ts +62 -0
- package/dist/skills/testing/SkillKit.browser.d.ts.map +1 -0
- package/dist/skills/testing/SkillKit.browser.js +41 -0
- package/dist/skills/testing/SkillKit.browser.js.map +1 -0
- package/dist/skills/testing/SkillKit.d.ts +130 -0
- package/dist/skills/testing/SkillKit.d.ts.map +1 -0
- package/dist/skills/testing/SkillKit.js +316 -0
- package/dist/skills/testing/SkillKit.js.map +1 -0
- package/dist/skills/testing/index.d.ts +9 -0
- package/dist/skills/testing/index.d.ts.map +1 -0
- package/dist/skills/testing/index.js +8 -0
- package/dist/skills/testing/index.js.map +1 -0
- package/dist/skills/trust.d.ts +72 -0
- package/dist/skills/trust.d.ts.map +1 -0
- package/dist/skills/trust.js +183 -0
- package/dist/skills/trust.js.map +1 -0
- package/dist/skills/types.d.ts +627 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +85 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/skills/validator.d.ts +95 -0
- package/dist/skills/validator.d.ts.map +1 -0
- package/dist/skills/validator.js +486 -0
- package/dist/skills/validator.js.map +1 -0
- package/dist/tracing/PipelineTracer.d.ts +35 -22
- package/dist/tracing/PipelineTracer.d.ts.map +1 -1
- package/dist/tracing/PipelineTracer.js +106 -61
- package/dist/tracing/PipelineTracer.js.map +1 -1
- package/dist/tracing/SdkTracer.d.ts +63 -61
- package/dist/tracing/SdkTracer.d.ts.map +1 -1
- package/dist/tracing/SdkTracer.js +185 -177
- package/dist/tracing/SdkTracer.js.map +1 -1
- package/dist/tracing/index.d.ts +10 -1
- package/dist/tracing/index.d.ts.map +1 -1
- package/dist/tracing/index.js +9 -0
- package/dist/tracing/index.js.map +1 -1
- package/dist/tracing/types.d.ts +89 -16
- package/dist/tracing/types.d.ts.map +1 -1
- package/dist/tracing/types.js +17 -4
- package/dist/tracing/types.js.map +1 -1
- package/dist/types.d.ts +6 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +10 -20
- package/dist/version.js.map +1 -1
- package/package.json +53 -39
- package/.claude/skills/qodo-agent/SKILL.md +0 -974
- package/.claude/skills/qodo-agent/assets/programmatic-agent.ts +0 -407
- package/.claude/skills/qodo-agent/references/builtin-tools.md +0 -342
- package/.claude/skills/qodo-agent/references/common-issues.md +0 -537
- package/bin/rg +0 -0
- package/dist/api/agent.d.ts +0 -105
- package/dist/api/agent.d.ts.map +0 -1
- package/dist/api/agent.js +0 -963
- package/dist/api/agent.js.map +0 -1
- package/dist/api/analytics.d.ts +0 -43
- package/dist/api/analytics.d.ts.map +0 -1
- package/dist/api/analytics.js +0 -163
- package/dist/api/analytics.js.map +0 -1
- package/dist/api/http.d.ts +0 -5
- package/dist/api/http.d.ts.map +0 -1
- package/dist/api/http.js +0 -62
- package/dist/api/http.js.map +0 -1
- package/dist/api/index.d.ts +0 -12
- package/dist/api/index.d.ts.map +0 -1
- package/dist/api/index.js +0 -17
- package/dist/api/index.js.map +0 -1
- package/dist/api/taskTracking.d.ts +0 -54
- package/dist/api/taskTracking.d.ts.map +0 -1
- package/dist/api/taskTracking.js +0 -208
- package/dist/api/taskTracking.js.map +0 -1
- package/dist/api/types.d.ts +0 -93
- package/dist/api/types.d.ts.map +0 -1
- package/dist/api/types.js +0 -2
- package/dist/api/types.js.map +0 -1
- package/dist/api/utils.d.ts +0 -8
- package/dist/api/utils.d.ts.map +0 -1
- package/dist/api/utils.js +0 -63
- package/dist/api/utils.js.map +0 -1
- package/dist/api/websocket.d.ts +0 -203
- package/dist/api/websocket.d.ts.map +0 -1
- package/dist/api/websocket.js +0 -1166
- package/dist/api/websocket.js.map +0 -1
- package/dist/bin/install-skill.d.ts +0 -14
- package/dist/bin/install-skill.d.ts.map +0 -1
- package/dist/bin/install-skill.js +0 -125
- package/dist/bin/install-skill.js.map +0 -1
- package/dist/bin/run-helpers.d.ts +0 -34
- package/dist/bin/run-helpers.d.ts.map +0 -1
- package/dist/bin/run-helpers.js +0 -186
- package/dist/bin/run-helpers.js.map +0 -1
- package/dist/bin/run.d.ts +0 -13
- package/dist/bin/run.d.ts.map +0 -1
- package/dist/bin/run.js +0 -57
- package/dist/bin/run.js.map +0 -1
- package/dist/clients/index.d.ts +0 -10
- package/dist/clients/index.d.ts.map +0 -1
- package/dist/clients/index.js +0 -8
- package/dist/clients/index.js.map +0 -1
- package/dist/clients/info/InfoClient.d.ts +0 -37
- package/dist/clients/info/InfoClient.d.ts.map +0 -1
- package/dist/clients/info/InfoClient.js +0 -69
- package/dist/clients/info/InfoClient.js.map +0 -1
- package/dist/clients/info/index.d.ts +0 -4
- package/dist/clients/info/index.d.ts.map +0 -1
- package/dist/clients/info/index.js +0 -2
- package/dist/clients/info/index.js.map +0 -1
- package/dist/clients/info/types.d.ts +0 -21
- package/dist/clients/info/types.d.ts.map +0 -1
- package/dist/clients/info/types.js +0 -2
- package/dist/clients/info/types.js.map +0 -1
- package/dist/clients/sessions/SessionsClient.d.ts +0 -34
- package/dist/clients/sessions/SessionsClient.d.ts.map +0 -1
- package/dist/clients/sessions/SessionsClient.js +0 -71
- package/dist/clients/sessions/SessionsClient.js.map +0 -1
- package/dist/clients/sessions/index.d.ts +0 -4
- package/dist/clients/sessions/index.d.ts.map +0 -1
- package/dist/clients/sessions/index.js +0 -2
- package/dist/clients/sessions/index.js.map +0 -1
- package/dist/clients/sessions/types.d.ts +0 -20
- package/dist/clients/sessions/types.d.ts.map +0 -1
- package/dist/clients/sessions/types.js +0 -2
- package/dist/clients/sessions/types.js.map +0 -1
- package/dist/clients/tools/ToolsClient.d.ts +0 -39
- package/dist/clients/tools/ToolsClient.d.ts.map +0 -1
- package/dist/clients/tools/ToolsClient.js +0 -95
- package/dist/clients/tools/ToolsClient.js.map +0 -1
- package/dist/clients/tools/index.d.ts +0 -4
- package/dist/clients/tools/index.d.ts.map +0 -1
- package/dist/clients/tools/index.js +0 -2
- package/dist/clients/tools/index.js.map +0 -1
- package/dist/clients/tools/types.d.ts +0 -14
- package/dist/clients/tools/types.d.ts.map +0 -1
- package/dist/clients/tools/types.js +0 -2
- package/dist/clients/tools/types.js.map +0 -1
- package/dist/config/ConfigManager.d.ts +0 -43
- package/dist/config/ConfigManager.d.ts.map +0 -1
- package/dist/config/ConfigManager.js +0 -472
- package/dist/config/ConfigManager.js.map +0 -1
- package/dist/config/index.d.ts +0 -6
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/index.js +0 -7
- package/dist/config/index.js.map +0 -1
- package/dist/config/urlConfig.d.ts +0 -15
- package/dist/config/urlConfig.d.ts.map +0 -1
- package/dist/config/urlConfig.js +0 -75
- package/dist/config/urlConfig.js.map +0 -1
- package/dist/constants/errors.d.ts +0 -2
- package/dist/constants/errors.d.ts.map +0 -1
- package/dist/constants/errors.js +0 -2
- package/dist/constants/errors.js.map +0 -1
- package/dist/constants/index.d.ts +0 -7
- package/dist/constants/index.d.ts.map +0 -1
- package/dist/constants/index.js +0 -11
- package/dist/constants/index.js.map +0 -1
- package/dist/constants/tools.d.ts +0 -4
- package/dist/constants/tools.d.ts.map +0 -1
- package/dist/constants/tools.js +0 -4
- package/dist/constants/tools.js.map +0 -1
- package/dist/constants/versions.d.ts +0 -2
- package/dist/constants/versions.d.ts.map +0 -1
- package/dist/constants/versions.js +0 -2
- package/dist/constants/versions.js.map +0 -1
- package/dist/context/buildUserContext.d.ts +0 -18
- package/dist/context/buildUserContext.d.ts.map +0 -1
- package/dist/context/buildUserContext.js +0 -34
- package/dist/context/buildUserContext.js.map +0 -1
- package/dist/context/index.d.ts +0 -9
- package/dist/context/index.d.ts.map +0 -1
- package/dist/context/index.js +0 -9
- package/dist/context/index.js.map +0 -1
- package/dist/context/messageManager.d.ts +0 -42
- package/dist/context/messageManager.d.ts.map +0 -1
- package/dist/context/messageManager.js +0 -322
- package/dist/context/messageManager.js.map +0 -1
- package/dist/context/taskFocus.d.ts +0 -2
- package/dist/context/taskFocus.d.ts.map +0 -1
- package/dist/context/taskFocus.js +0 -26
- package/dist/context/taskFocus.js.map +0 -1
- package/dist/context/userInput.d.ts +0 -3
- package/dist/context/userInput.d.ts.map +0 -1
- package/dist/context/userInput.js +0 -20
- package/dist/context/userInput.js.map +0 -1
- package/dist/mcp/MCPManager.d.ts +0 -109
- package/dist/mcp/MCPManager.d.ts.map +0 -1
- package/dist/mcp/MCPManager.js +0 -592
- package/dist/mcp/MCPManager.js.map +0 -1
- package/dist/mcp/approvedTools.d.ts +0 -4
- package/dist/mcp/approvedTools.d.ts.map +0 -1
- package/dist/mcp/approvedTools.js +0 -19
- package/dist/mcp/approvedTools.js.map +0 -1
- package/dist/mcp/baseServer.d.ts +0 -75
- package/dist/mcp/baseServer.d.ts.map +0 -1
- package/dist/mcp/baseServer.js +0 -107
- package/dist/mcp/baseServer.js.map +0 -1
- package/dist/mcp/builtinServers.d.ts +0 -15
- package/dist/mcp/builtinServers.d.ts.map +0 -1
- package/dist/mcp/builtinServers.js +0 -141
- package/dist/mcp/builtinServers.js.map +0 -1
- package/dist/mcp/dynamicBEServer.d.ts +0 -20
- package/dist/mcp/dynamicBEServer.d.ts.map +0 -1
- package/dist/mcp/dynamicBEServer.js +0 -52
- package/dist/mcp/dynamicBEServer.js.map +0 -1
- package/dist/mcp/index.d.ts +0 -18
- package/dist/mcp/index.d.ts.map +0 -1
- package/dist/mcp/index.js +0 -23
- package/dist/mcp/index.js.map +0 -1
- package/dist/mcp/mcpInitialization.d.ts +0 -2
- package/dist/mcp/mcpInitialization.d.ts.map +0 -1
- package/dist/mcp/mcpInitialization.js +0 -56
- package/dist/mcp/mcpInitialization.js.map +0 -1
- package/dist/mcp/servers/filesystem.d.ts +0 -44
- package/dist/mcp/servers/filesystem.d.ts.map +0 -1
- package/dist/mcp/servers/filesystem.js +0 -776
- package/dist/mcp/servers/filesystem.js.map +0 -1
- package/dist/mcp/servers/git.d.ts +0 -18
- package/dist/mcp/servers/git.d.ts.map +0 -1
- package/dist/mcp/servers/git.js +0 -441
- package/dist/mcp/servers/git.js.map +0 -1
- package/dist/mcp/servers/ripgrep.d.ts +0 -39
- package/dist/mcp/servers/ripgrep.d.ts.map +0 -1
- package/dist/mcp/servers/ripgrep.js +0 -550
- package/dist/mcp/servers/ripgrep.js.map +0 -1
- package/dist/mcp/servers/shell.d.ts +0 -20
- package/dist/mcp/servers/shell.d.ts.map +0 -1
- package/dist/mcp/servers/shell.js +0 -519
- package/dist/mcp/servers/shell.js.map +0 -1
- package/dist/mcp/serversRegistry.d.ts +0 -55
- package/dist/mcp/serversRegistry.d.ts.map +0 -1
- package/dist/mcp/serversRegistry.js +0 -416
- package/dist/mcp/serversRegistry.js.map +0 -1
- package/dist/mcp/toolProcessor.d.ts +0 -82
- package/dist/mcp/toolProcessor.d.ts.map +0 -1
- package/dist/mcp/toolProcessor.js +0 -392
- package/dist/mcp/toolProcessor.js.map +0 -1
- package/dist/mcp/types.d.ts +0 -29
- package/dist/mcp/types.d.ts.map +0 -1
- package/dist/mcp/types.js +0 -2
- package/dist/mcp/types.js.map +0 -1
- package/dist/messages/index.d.ts +0 -8
- package/dist/messages/index.d.ts.map +0 -1
- package/dist/messages/index.js +0 -7
- package/dist/messages/index.js.map +0 -1
- package/dist/messages/openai.d.ts +0 -26
- package/dist/messages/openai.d.ts.map +0 -1
- package/dist/messages/openai.js +0 -55
- package/dist/messages/openai.js.map +0 -1
- package/dist/messages/types.d.ts +0 -73
- package/dist/messages/types.d.ts.map +0 -1
- package/dist/messages/types.js +0 -78
- package/dist/messages/types.js.map +0 -1
- package/dist/parser/index.d.ts +0 -72
- package/dist/parser/index.d.ts.map +0 -1
- package/dist/parser/index.js +0 -967
- package/dist/parser/index.js.map +0 -1
- package/dist/parser/types.d.ts +0 -153
- package/dist/parser/types.d.ts.map +0 -1
- package/dist/parser/types.js +0 -6
- package/dist/parser/types.js.map +0 -1
- package/dist/parser/utils.d.ts +0 -18
- package/dist/parser/utils.d.ts.map +0 -1
- package/dist/parser/utils.js +0 -64
- package/dist/parser/utils.js.map +0 -1
- package/dist/sdk/QodoSDK.d.ts +0 -218
- package/dist/sdk/QodoSDK.d.ts.map +0 -1
- package/dist/sdk/QodoSDK.js +0 -1115
- package/dist/sdk/QodoSDK.js.map +0 -1
- package/dist/sdk/artifacts.d.ts +0 -156
- package/dist/sdk/artifacts.d.ts.map +0 -1
- package/dist/sdk/artifacts.js +0 -166
- package/dist/sdk/artifacts.js.map +0 -1
- package/dist/sdk/bootstrap.d.ts +0 -16
- package/dist/sdk/bootstrap.d.ts.map +0 -1
- package/dist/sdk/bootstrap.js +0 -28
- package/dist/sdk/bootstrap.js.map +0 -1
- package/dist/sdk/builders.d.ts +0 -54
- package/dist/sdk/builders.d.ts.map +0 -1
- package/dist/sdk/builders.js +0 -117
- package/dist/sdk/builders.js.map +0 -1
- package/dist/sdk/defaults.d.ts +0 -11
- package/dist/sdk/defaults.d.ts.map +0 -1
- package/dist/sdk/defaults.js +0 -39
- package/dist/sdk/defaults.js.map +0 -1
- package/dist/sdk/discovery.d.ts +0 -2
- package/dist/sdk/discovery.d.ts.map +0 -1
- package/dist/sdk/discovery.js +0 -25
- package/dist/sdk/discovery.js.map +0 -1
- package/dist/sdk/events.d.ts +0 -269
- package/dist/sdk/events.d.ts.map +0 -1
- package/dist/sdk/events.js +0 -69
- package/dist/sdk/events.js.map +0 -1
- package/dist/sdk/exit-expression.d.ts +0 -13
- package/dist/sdk/exit-expression.d.ts.map +0 -1
- package/dist/sdk/exit-expression.js +0 -35
- package/dist/sdk/exit-expression.js.map +0 -1
- package/dist/sdk/index.d.ts +0 -17
- package/dist/sdk/index.d.ts.map +0 -1
- package/dist/sdk/index.js +0 -17
- package/dist/sdk/index.js.map +0 -1
- package/dist/sdk/middleware.d.ts +0 -59
- package/dist/sdk/middleware.d.ts.map +0 -1
- package/dist/sdk/middleware.js +0 -69
- package/dist/sdk/middleware.js.map +0 -1
- package/dist/sdk/pipeline/PipelineBuilder.d.ts +0 -79
- package/dist/sdk/pipeline/PipelineBuilder.d.ts.map +0 -1
- package/dist/sdk/pipeline/PipelineBuilder.js +0 -129
- package/dist/sdk/pipeline/PipelineBuilder.js.map +0 -1
- package/dist/sdk/pipeline/PipelineRunner.d.ts +0 -28
- package/dist/sdk/pipeline/PipelineRunner.d.ts.map +0 -1
- package/dist/sdk/pipeline/PipelineRunner.js +0 -326
- package/dist/sdk/pipeline/PipelineRunner.js.map +0 -1
- package/dist/sdk/pipeline/compiler.d.ts +0 -24
- package/dist/sdk/pipeline/compiler.d.ts.map +0 -1
- package/dist/sdk/pipeline/compiler.js +0 -199
- package/dist/sdk/pipeline/compiler.js.map +0 -1
- package/dist/sdk/pipeline/declarative.d.ts +0 -34
- package/dist/sdk/pipeline/declarative.d.ts.map +0 -1
- package/dist/sdk/pipeline/declarative.js +0 -9
- package/dist/sdk/pipeline/declarative.js.map +0 -1
- package/dist/sdk/pipeline/index.d.ts +0 -20
- package/dist/sdk/pipeline/index.d.ts.map +0 -1
- package/dist/sdk/pipeline/index.js +0 -19
- package/dist/sdk/pipeline/index.js.map +0 -1
- package/dist/sdk/pipeline/types.d.ts +0 -93
- package/dist/sdk/pipeline/types.d.ts.map +0 -1
- package/dist/sdk/pipeline/types.js +0 -10
- package/dist/sdk/pipeline/types.js.map +0 -1
- package/dist/sdk/policies.d.ts +0 -163
- package/dist/sdk/policies.d.ts.map +0 -1
- package/dist/sdk/policies.js +0 -243
- package/dist/sdk/policies.js.map +0 -1
- package/dist/sdk/runner/AgentRunner.d.ts +0 -22
- package/dist/sdk/runner/AgentRunner.d.ts.map +0 -1
- package/dist/sdk/runner/AgentRunner.js +0 -222
- package/dist/sdk/runner/AgentRunner.js.map +0 -1
- package/dist/sdk/runner/finalize.d.ts +0 -56
- package/dist/sdk/runner/finalize.d.ts.map +0 -1
- package/dist/sdk/runner/finalize.js +0 -155
- package/dist/sdk/runner/finalize.js.map +0 -1
- package/dist/sdk/runner/formats.d.ts +0 -7
- package/dist/sdk/runner/formats.d.ts.map +0 -1
- package/dist/sdk/runner/formats.js +0 -76
- package/dist/sdk/runner/formats.js.map +0 -1
- package/dist/sdk/runner/index.d.ts +0 -9
- package/dist/sdk/runner/index.d.ts.map +0 -1
- package/dist/sdk/runner/index.js +0 -9
- package/dist/sdk/runner/index.js.map +0 -1
- package/dist/sdk/runner/progress.d.ts +0 -3
- package/dist/sdk/runner/progress.d.ts.map +0 -1
- package/dist/sdk/runner/progress.js +0 -16
- package/dist/sdk/runner/progress.js.map +0 -1
- package/dist/sdk/schemas.d.ts +0 -72
- package/dist/sdk/schemas.d.ts.map +0 -1
- package/dist/sdk/schemas.js +0 -282
- package/dist/sdk/schemas.js.map +0 -1
- package/dist/sdk/trigger-context.d.ts +0 -24
- package/dist/sdk/trigger-context.d.ts.map +0 -1
- package/dist/sdk/trigger-context.js +0 -136
- package/dist/sdk/trigger-context.js.map +0 -1
- package/dist/session/SessionContext.d.ts +0 -89
- package/dist/session/SessionContext.d.ts.map +0 -1
- package/dist/session/SessionContext.js +0 -410
- package/dist/session/SessionContext.js.map +0 -1
- package/dist/session/environment.d.ts +0 -52
- package/dist/session/environment.d.ts.map +0 -1
- package/dist/session/environment.js +0 -27
- package/dist/session/environment.js.map +0 -1
- package/dist/session/history.d.ts +0 -18
- package/dist/session/history.d.ts.map +0 -1
- package/dist/session/history.js +0 -68
- package/dist/session/history.js.map +0 -1
- package/dist/session/index.d.ts +0 -10
- package/dist/session/index.d.ts.map +0 -1
- package/dist/session/index.js +0 -9
- package/dist/session/index.js.map +0 -1
- package/dist/session/serverData.d.ts +0 -38
- package/dist/session/serverData.d.ts.map +0 -1
- package/dist/session/serverData.js +0 -261
- package/dist/session/serverData.js.map +0 -1
- package/dist/tracing/pipelineHelpers.d.ts +0 -29
- package/dist/tracing/pipelineHelpers.d.ts.map +0 -1
- package/dist/tracing/pipelineHelpers.js +0 -224
- package/dist/tracing/pipelineHelpers.js.map +0 -1
- package/dist/tracking/Tracker.d.ts +0 -55
- package/dist/tracking/Tracker.d.ts.map +0 -1
- package/dist/tracking/Tracker.js +0 -217
- package/dist/tracking/Tracker.js.map +0 -1
- package/dist/tracking/index.d.ts +0 -8
- package/dist/tracking/index.d.ts.map +0 -1
- package/dist/tracking/index.js +0 -8
- package/dist/tracking/index.js.map +0 -1
- package/dist/tracking/schemas.d.ts +0 -292
- package/dist/tracking/schemas.d.ts.map +0 -1
- package/dist/tracking/schemas.js +0 -91
- package/dist/tracking/schemas.js.map +0 -1
- package/dist/utils/extractSetFlags.d.ts +0 -6
- package/dist/utils/extractSetFlags.d.ts.map +0 -1
- package/dist/utils/extractSetFlags.js +0 -16
- package/dist/utils/extractSetFlags.js.map +0 -1
- package/dist/utils/formatTimeAgo.d.ts +0 -2
- package/dist/utils/formatTimeAgo.d.ts.map +0 -1
- package/dist/utils/formatTimeAgo.js +0 -20
- package/dist/utils/formatTimeAgo.js.map +0 -1
- package/dist/utils/index.d.ts +0 -12
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -12
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/machineId.d.ts +0 -14
- package/dist/utils/machineId.d.ts.map +0 -1
- package/dist/utils/machineId.js +0 -66
- package/dist/utils/machineId.js.map +0 -1
- package/dist/utils/pathUtils.d.ts +0 -22
- package/dist/utils/pathUtils.d.ts.map +0 -1
- package/dist/utils/pathUtils.js +0 -54
- package/dist/utils/pathUtils.js.map +0 -1
- package/scripts/download-ripgrep.js +0 -269
package/dist/sdk/QodoSDK.js
DELETED
|
@@ -1,1115 +0,0 @@
|
|
|
1
|
-
import { ConfigManager } from '../config/index.js';
|
|
2
|
-
import { v4 as uuid } from 'uuid';
|
|
3
|
-
import { findNearestAgentConfig } from './discovery.js';
|
|
4
|
-
import { buildDefaultSdkAgentConfig } from './defaults.js';
|
|
5
|
-
import { mcpInitialization, ServerRegistry, ToolProcessorManager } from '../mcp/index.js';
|
|
6
|
-
import { runWithEnvironment, ServerData, SessionContext } from '../session/index.js';
|
|
7
|
-
import { MessageManager } from '../context/index.js';
|
|
8
|
-
import { AgentAPI } from '../api/agent.js';
|
|
9
|
-
import { AgentRunnerCore } from './runner/index.js';
|
|
10
|
-
import { BackendBootstrap } from './bootstrap.js';
|
|
11
|
-
import { AuthProvider } from '../auth/index.js';
|
|
12
|
-
import { QodoInfoClient, QodoSessionsClient, QodoToolsClient } from '../clients/index.js';
|
|
13
|
-
import { canonicalizePathSync, extractSetFlags } from '../utils/index.js';
|
|
14
|
-
import { extractProgress } from './runner/progress.js';
|
|
15
|
-
import { toLangChainDict, toOpenAIChat } from './runner/formats.js';
|
|
16
|
-
import { buildFinalResult, isZodSchema, validateStructuredOutput, QodoOutputValidationError } from './runner/finalize.js';
|
|
17
|
-
import { createSdkEvent, getSdkVersion, SdkEventType, } from './events.js';
|
|
18
|
-
export class QodoSDK {
|
|
19
|
-
options;
|
|
20
|
-
/** Backend info (get-things) facade */
|
|
21
|
-
info;
|
|
22
|
-
/** Session history facade */
|
|
23
|
-
sessions;
|
|
24
|
-
/** Tool discovery facade */
|
|
25
|
-
tools;
|
|
26
|
-
initialized = false;
|
|
27
|
-
// Environment for AsyncLocalStorage-scoped singletons.
|
|
28
|
-
// Mark as sdkMode to avoid process.exit in SDK code paths.
|
|
29
|
-
env = {
|
|
30
|
-
sdkMode: true,
|
|
31
|
-
sdkDebug: false,
|
|
32
|
-
};
|
|
33
|
-
// SDK is headless by default. We avoid writing to stdout/stderr unless
|
|
34
|
-
// explicitly enabled via options.debug or a provided logger.
|
|
35
|
-
logger;
|
|
36
|
-
// Per-run envelope metadata
|
|
37
|
-
runId = '';
|
|
38
|
-
seq = 0;
|
|
39
|
-
runStartMs = 0;
|
|
40
|
-
sessionContext;
|
|
41
|
-
lastInitMeta = null;
|
|
42
|
-
messageManager;
|
|
43
|
-
agent;
|
|
44
|
-
core;
|
|
45
|
-
eventQueue = [];
|
|
46
|
-
pendingResolvers = [];
|
|
47
|
-
done = false;
|
|
48
|
-
activeRuns = 0;
|
|
49
|
-
// When true, this instance shares MCP with a parent and
|
|
50
|
-
// dispose() will not tear down MCP servers.
|
|
51
|
-
isFork = false;
|
|
52
|
-
_forkParent;
|
|
53
|
-
_activeForkCount = 0;
|
|
54
|
-
_listenerCleanups = [];
|
|
55
|
-
// For `sdk.message.delta`
|
|
56
|
-
lastAiText = '';
|
|
57
|
-
lastAiMessageId = '';
|
|
58
|
-
// Deduplication for tool lifecycle
|
|
59
|
-
toolRequestedEmitted = new Set();
|
|
60
|
-
toolApprovalEmitted = new Set();
|
|
61
|
-
toolApprovalInFlight = new Set();
|
|
62
|
-
toolExecutedEmitted = new Set();
|
|
63
|
-
// Track tool names by call id so sdk.tool.executed can include tool_name
|
|
64
|
-
toolRegistry = new Map();
|
|
65
|
-
// Per-run Zod schema for runtime validation of structured_output
|
|
66
|
-
runOutputZodSchema = undefined;
|
|
67
|
-
constructor(options = {}) {
|
|
68
|
-
this.options = options;
|
|
69
|
-
this.info = QodoInfoClient.fromSdkOptions(options);
|
|
70
|
-
this.sessions = QodoSessionsClient.fromSdkOptions(options);
|
|
71
|
-
this.tools = QodoToolsClient.fromSdkOptions(options);
|
|
72
|
-
// If debug is enabled, allow verbose logs in this SDK environment.
|
|
73
|
-
if (this.options.debug === true) {
|
|
74
|
-
this.env.sdkDebug = true;
|
|
75
|
-
}
|
|
76
|
-
const noop = () => { };
|
|
77
|
-
const fallback = this.options.debug
|
|
78
|
-
? {
|
|
79
|
-
debug: console.debug.bind(console),
|
|
80
|
-
info: console.info.bind(console),
|
|
81
|
-
warn: console.warn.bind(console),
|
|
82
|
-
error: console.error.bind(console),
|
|
83
|
-
}
|
|
84
|
-
: { debug: noop, info: noop, warn: noop, error: noop };
|
|
85
|
-
this.logger = {
|
|
86
|
-
debug: this.options.logger?.debug ?? fallback.debug,
|
|
87
|
-
info: this.options.logger?.info ?? fallback.info,
|
|
88
|
-
warn: this.options.logger?.warn ?? fallback.warn,
|
|
89
|
-
error: this.options.logger?.error ?? fallback.error,
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
static fromAgent(agentObject, options = {}) {
|
|
93
|
-
return new QodoSDK({ ...options, agentObject });
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Create a new SDK instance that will run using a specific backend session id.
|
|
97
|
-
*
|
|
98
|
-
* This is useful for:
|
|
99
|
-
* - resuming or continuing a known session
|
|
100
|
-
* - binding a run to a session id created via `sdk.sessions.createSessionId()`
|
|
101
|
-
*
|
|
102
|
-
* Note: this returns a NEW SDK instance (does not mutate the current one).
|
|
103
|
-
*/
|
|
104
|
-
withSession(sessionId) {
|
|
105
|
-
const nextFlags = { ...(this.options.flags || {}), sid: sessionId };
|
|
106
|
-
return new QodoSDK({ ...this.options, flags: nextFlags });
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Replace the backend session ID on this initialized instance without
|
|
110
|
-
* reinitializing MCP servers or other resources.
|
|
111
|
-
*
|
|
112
|
-
* Intended for long-lived SDK instances (e.g., Slack bots, multi-tenant
|
|
113
|
-
* servers) that need per-request session isolation while keeping MCP
|
|
114
|
-
* connections warm.
|
|
115
|
-
*
|
|
116
|
-
* If no sessionId is provided, a fresh one is fetched from the backend.
|
|
117
|
-
* Returns the effective session ID.
|
|
118
|
-
*/
|
|
119
|
-
async replaceSession(sessionId) {
|
|
120
|
-
if (!this.initialized) {
|
|
121
|
-
throw new Error('Cannot replaceSession before SDK is initialized. Call stream/prompt first, or use withSession().');
|
|
122
|
-
}
|
|
123
|
-
if (this.isFork) {
|
|
124
|
-
throw new Error('Cannot replaceSession on a fork. Create a new fork instead.');
|
|
125
|
-
}
|
|
126
|
-
if (this.activeRuns > 0) {
|
|
127
|
-
throw new Error('Cannot replaceSession while a run is in progress. Wait for the current run to complete.');
|
|
128
|
-
}
|
|
129
|
-
const newId = sessionId ?? await this.sessions.createSessionId();
|
|
130
|
-
this.sessionContext.replaceSessionId(newId);
|
|
131
|
-
return newId;
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Create a lightweight SDK clone that shares this instance's MCP servers
|
|
135
|
-
* but gets its own session, WebSocket, and message state.
|
|
136
|
-
*
|
|
137
|
-
* Use this for concurrent request handling (e.g., Slack bots, multi-tenant
|
|
138
|
-
* servers) where each request needs session isolation but MCP connections
|
|
139
|
-
* should stay warm.
|
|
140
|
-
*
|
|
141
|
-
* The returned fork MUST be disposed after use via `fork.dispose()`.
|
|
142
|
-
* Disposing a fork tears down its session and WebSocket but leaves the
|
|
143
|
-
* parent's MCP servers running.
|
|
144
|
-
*
|
|
145
|
-
* @param sessionId Optional backend session ID. If omitted, a fresh one is created.
|
|
146
|
-
*/
|
|
147
|
-
async fork(sessionId) {
|
|
148
|
-
if (!this.initialized) {
|
|
149
|
-
throw new Error('Cannot fork before SDK is initialized. Call stream/prompt first.');
|
|
150
|
-
}
|
|
151
|
-
if (this.isFork) {
|
|
152
|
-
throw new Error('Cannot fork a forked instance. Call fork() on the parent SDK instead.');
|
|
153
|
-
}
|
|
154
|
-
const child = new QodoSDK({ ...this.options });
|
|
155
|
-
child.isFork = true;
|
|
156
|
-
child._forkParent = this;
|
|
157
|
-
this._activeForkCount++;
|
|
158
|
-
try {
|
|
159
|
-
await runWithEnvironment(child.env, async () => {
|
|
160
|
-
// Share parent's expensive resources (read-only after init)
|
|
161
|
-
child.env.authProvider = this.env.authProvider;
|
|
162
|
-
child.env.serverRegistry = this.env.serverRegistry;
|
|
163
|
-
child.env.mcpManager = this.env.mcpManager;
|
|
164
|
-
child.env.serverData = this.env.serverData;
|
|
165
|
-
// Fresh per-request middleware
|
|
166
|
-
const tpm = new ToolProcessorManager();
|
|
167
|
-
for (const mw of this.options.toolMiddleware ?? []) {
|
|
168
|
-
tpm.addMiddleware(mw);
|
|
169
|
-
}
|
|
170
|
-
child.env.toolProcessorManager = tpm;
|
|
171
|
-
// Fresh session context with a new session ID
|
|
172
|
-
const newId = sessionId ?? await child.sessions.createSessionId();
|
|
173
|
-
child.sessionContext = await SessionContext.newSessionContext({ ...this.sessionContext.getFlags() }, { ...this.sessionContext.getCommand() }, this.sessionContext.getGeneralInstructions(), this.sessionContext.getSystemPrompt(), undefined, // forks always start fresh
|
|
174
|
-
newId);
|
|
175
|
-
// Replicate parent's path configuration
|
|
176
|
-
const paths = this.sessionContext.getAccessiblePaths();
|
|
177
|
-
if (paths.length > 0) {
|
|
178
|
-
await child.sessionContext.setAccessiblePaths(paths);
|
|
179
|
-
}
|
|
180
|
-
const execCwd = this.sessionContext.getExecutionCwd();
|
|
181
|
-
if (execCwd) {
|
|
182
|
-
child.sessionContext.setExecutionCwd(execCwd);
|
|
183
|
-
}
|
|
184
|
-
// Fresh message manager, agent, and core
|
|
185
|
-
child.messageManager = new MessageManager();
|
|
186
|
-
child.agent = new AgentAPI(child.sessionContext);
|
|
187
|
-
child.setupEventListeners();
|
|
188
|
-
child.core = new AgentRunnerCore(child.sessionContext, child.messageManager, child.agent, () => { }, child.options.autoApproveTools !== false);
|
|
189
|
-
});
|
|
190
|
-
child.initialized = true;
|
|
191
|
-
child.lastInitMeta = this.lastInitMeta;
|
|
192
|
-
return child;
|
|
193
|
-
}
|
|
194
|
-
catch (error) {
|
|
195
|
-
// Clean up partially constructed fork to avoid resource leaks.
|
|
196
|
-
// child.dispose() may return early (child not yet initialized),
|
|
197
|
-
// so always decrement the parent's fork count explicitly.
|
|
198
|
-
// Clear _forkParent first to prevent double-decrement in dispose().
|
|
199
|
-
child._forkParent = undefined;
|
|
200
|
-
this._activeForkCount--;
|
|
201
|
-
try {
|
|
202
|
-
await child.dispose();
|
|
203
|
-
}
|
|
204
|
-
catch { /* cleanup must not throw */ }
|
|
205
|
-
throw error;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
/**
|
|
209
|
-
* Register message, loading, and error listeners on the message manager.
|
|
210
|
-
* Called during both full initialization and fork setup.
|
|
211
|
-
*/
|
|
212
|
-
setupEventListeners() {
|
|
213
|
-
// Clear any previous listener cleanups before registering new ones
|
|
214
|
-
this._listenerCleanups = [];
|
|
215
|
-
// Observe message list changes to emit:
|
|
216
|
-
// - sdk.message.full
|
|
217
|
-
// - sdk.message.delta (best effort from last AI message)
|
|
218
|
-
this._listenerCleanups.push(this.messageManager.addMessageListener((messages) => {
|
|
219
|
-
const lc = toLangChainDict(messages);
|
|
220
|
-
const openai = toOpenAIChat(messages);
|
|
221
|
-
const sid = this.sessionContext.getSessionId();
|
|
222
|
-
this.pushEvent(SdkEventType.MessageFull, sid, {
|
|
223
|
-
messages: { langchain: lc, openai },
|
|
224
|
-
});
|
|
225
|
-
// progress extraction
|
|
226
|
-
try {
|
|
227
|
-
const progress = extractProgress(messages);
|
|
228
|
-
if (progress) {
|
|
229
|
-
this.pushEvent(SdkEventType.Progress, sid, { ...progress });
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
catch { /* non-fatal: progress extraction is best-effort */ }
|
|
233
|
-
// tool lifecycle extraction from LangChain dict (AIMessage tool_calls + ToolMessage results)
|
|
234
|
-
try {
|
|
235
|
-
this.extractToolLifecycleFromLangChain(lc, sid);
|
|
236
|
-
}
|
|
237
|
-
catch { /* non-fatal: tool lifecycle extraction is best-effort */ }
|
|
238
|
-
// delta: compare last AI message string
|
|
239
|
-
try {
|
|
240
|
-
const lastAi = messages
|
|
241
|
-
.slice()
|
|
242
|
-
.reverse()
|
|
243
|
-
.find((m) => m?.constructor?.name === 'AIMessage');
|
|
244
|
-
const content = lastAi?.content;
|
|
245
|
-
const text = typeof content === 'string' ? content : '';
|
|
246
|
-
const messageId = lastAi?.additional_kwargs?.id || lastAi?.id || 'ai';
|
|
247
|
-
if (messageId !== this.lastAiMessageId) {
|
|
248
|
-
this.lastAiMessageId = messageId;
|
|
249
|
-
this.lastAiText = '';
|
|
250
|
-
}
|
|
251
|
-
if (text.length > this.lastAiText.length && text.startsWith(this.lastAiText)) {
|
|
252
|
-
const delta = text.slice(this.lastAiText.length);
|
|
253
|
-
if (delta && delta.length > 0) {
|
|
254
|
-
this.pushEvent(SdkEventType.MessageDelta, sid, {
|
|
255
|
-
message_id: String(messageId),
|
|
256
|
-
role: 'assistant',
|
|
257
|
-
delta,
|
|
258
|
-
});
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
this.lastAiText = text;
|
|
262
|
-
}
|
|
263
|
-
catch { /* non-fatal: delta extraction is best-effort */ }
|
|
264
|
-
}));
|
|
265
|
-
// Finalization
|
|
266
|
-
this._listenerCleanups.push(this.messageManager.addLoadingListener(async (isLoading) => {
|
|
267
|
-
const sid = this.sessionContext.getSessionId();
|
|
268
|
-
if (!isLoading) {
|
|
269
|
-
try {
|
|
270
|
-
await this.agent.finishCurrentTask(false);
|
|
271
|
-
}
|
|
272
|
-
catch { /* best-effort: must not block finalization */ }
|
|
273
|
-
// AgentRunnerCore already emits final for old SDK, but we produce our own terminal sdk.final here
|
|
274
|
-
// by reading the message manager state.
|
|
275
|
-
try {
|
|
276
|
-
const finalized = buildFinalResult(this.messageManager);
|
|
277
|
-
// Check if there's an error - if so, mark as failure
|
|
278
|
-
const currentError = this.messageManager.getError();
|
|
279
|
-
const success = !currentError;
|
|
280
|
-
// Runtime Zod validation of structured_output when a schema is available
|
|
281
|
-
let validatedOutput = finalized.structured_output;
|
|
282
|
-
let validationError;
|
|
283
|
-
if (validatedOutput !== undefined && isZodSchema(this.runOutputZodSchema)) {
|
|
284
|
-
try {
|
|
285
|
-
validatedOutput = validateStructuredOutput(this.runOutputZodSchema, validatedOutput);
|
|
286
|
-
}
|
|
287
|
-
catch (ve) {
|
|
288
|
-
if (ve instanceof QodoOutputValidationError) {
|
|
289
|
-
validationError = ve.message;
|
|
290
|
-
}
|
|
291
|
-
else {
|
|
292
|
-
validationError = ve instanceof Error ? ve.message : String(ve);
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
this.pushEvent(SdkEventType.Final, sid, {
|
|
297
|
-
success: success && !validationError,
|
|
298
|
-
...(currentError ? { error: currentError } : {}),
|
|
299
|
-
...(validationError ? { error: validationError } : {}),
|
|
300
|
-
model: this.sessionContext.getModel(),
|
|
301
|
-
result: {
|
|
302
|
-
...(validatedOutput !== undefined ? { structured_output: validatedOutput } : {}),
|
|
303
|
-
...(finalized.final_output ? { final_output: finalized.final_output } : {}),
|
|
304
|
-
},
|
|
305
|
-
messages: { langchain: finalized.messagesLC, openai: finalized.messagesOpenAI },
|
|
306
|
-
meta: {
|
|
307
|
-
tools_auto_approved: this.options.autoApproveTools !== false,
|
|
308
|
-
subagents_used: finalized.subagentsUsed,
|
|
309
|
-
...(this.sessionContext.isDryRun() ? { dry_run: true } : {}),
|
|
310
|
-
...(() => { const _ee = this.sessionContext?.getCommand?.()?.exit_expression; return _ee ? { exit_expression: _ee } : {}; })(),
|
|
311
|
-
},
|
|
312
|
-
});
|
|
313
|
-
this.done = true;
|
|
314
|
-
}
|
|
315
|
-
catch (e) {
|
|
316
|
-
this.pushEvent(SdkEventType.Error, sid, { message: e?.message || 'Failed to finalize' });
|
|
317
|
-
this.pushEvent(SdkEventType.Final, sid, {
|
|
318
|
-
success: false,
|
|
319
|
-
error: e?.message || 'Failed to finalize',
|
|
320
|
-
model: this.sessionContext.getModel(),
|
|
321
|
-
result: {},
|
|
322
|
-
messages: { langchain: [], openai: [] },
|
|
323
|
-
meta: { tools_auto_approved: this.options.autoApproveTools !== false, subagents_used: false, ...(this.sessionContext.isDryRun() ? { dry_run: true } : {}), ...(() => { const _ee = this.sessionContext?.getCommand?.()?.exit_expression; return _ee ? { exit_expression: _ee } : {}; })() },
|
|
324
|
-
});
|
|
325
|
-
this.done = true;
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
}));
|
|
329
|
-
this._listenerCleanups.push(this.messageManager.addErrorListener(async (error) => {
|
|
330
|
-
if (!error)
|
|
331
|
-
return;
|
|
332
|
-
const sid = this.sessionContext.getSessionId();
|
|
333
|
-
this.pushEvent(SdkEventType.Error, sid, { message: error });
|
|
334
|
-
try {
|
|
335
|
-
await this.agent.finishCurrentTask(true);
|
|
336
|
-
}
|
|
337
|
-
catch { /* best-effort: must not block error handling */ }
|
|
338
|
-
}));
|
|
339
|
-
// Protocol-v2 transport lifecycle: surface reconnect, reconcile, and stall
|
|
340
|
-
// events through the SDK envelope stream. Consumers that only read these
|
|
341
|
-
// envelopes (no direct WebSocketClient access) can still distinguish a
|
|
342
|
-
// transient reconnect from a hard stall and respond appropriately.
|
|
343
|
-
const unsubscribeTransport = this.agent.onTransportEvent({
|
|
344
|
-
reconnecting: ({ attempt }) => {
|
|
345
|
-
const sid = this.sessionContext.getSessionId();
|
|
346
|
-
this.pushEvent(SdkEventType.Reconnecting, sid, { attempt });
|
|
347
|
-
},
|
|
348
|
-
reconnected: ({ downtime_ms }) => {
|
|
349
|
-
const sid = this.sessionContext.getSessionId();
|
|
350
|
-
this.pushEvent(SdkEventType.Reconnected, sid, { ...(typeof downtime_ms === 'number' ? { downtime_ms } : {}) });
|
|
351
|
-
},
|
|
352
|
-
resumeAck: ({ current_checkpoint, last_consumed_turn_id, awaiting, outbox_size }) => {
|
|
353
|
-
const sid = this.sessionContext.getSessionId();
|
|
354
|
-
this.pushEvent(SdkEventType.ResumeReconciled, sid, {
|
|
355
|
-
...(current_checkpoint ? { current_checkpoint } : {}),
|
|
356
|
-
...(last_consumed_turn_id ? { last_consumed_turn_id } : {}),
|
|
357
|
-
awaiting,
|
|
358
|
-
outbox_size,
|
|
359
|
-
});
|
|
360
|
-
},
|
|
361
|
-
reconcileFailed: ({ reason, awaiting }) => {
|
|
362
|
-
const sid = this.sessionContext.getSessionId();
|
|
363
|
-
this.pushEvent(SdkEventType.ReconcileFailed, sid, {
|
|
364
|
-
reason,
|
|
365
|
-
...(awaiting ? { awaiting } : {}),
|
|
366
|
-
});
|
|
367
|
-
},
|
|
368
|
-
stallDetected: ({ stage, outboxSize }) => {
|
|
369
|
-
const sid = this.sessionContext.getSessionId();
|
|
370
|
-
this.pushEvent(SdkEventType.StallDetected, sid, {
|
|
371
|
-
stage,
|
|
372
|
-
outbox_size: outboxSize,
|
|
373
|
-
});
|
|
374
|
-
},
|
|
375
|
-
});
|
|
376
|
-
this._listenerCleanups.push(unsubscribeTransport);
|
|
377
|
-
}
|
|
378
|
-
pushEvent(type, sessionId, data, opts) {
|
|
379
|
-
const evt = createSdkEvent({
|
|
380
|
-
type,
|
|
381
|
-
run_id: this.runId,
|
|
382
|
-
seq: ++this.seq,
|
|
383
|
-
session_id: sessionId,
|
|
384
|
-
data,
|
|
385
|
-
...(opts?.request_id ? { request_id: opts.request_id } : {}),
|
|
386
|
-
elapsed_ms: this.runStartMs ? Date.now() - this.runStartMs : undefined,
|
|
387
|
-
});
|
|
388
|
-
if (this.pendingResolvers.length > 0) {
|
|
389
|
-
const resolve = this.pendingResolvers.shift();
|
|
390
|
-
resolve({ value: evt, done: false });
|
|
391
|
-
}
|
|
392
|
-
else {
|
|
393
|
-
this.eventQueue.push(evt);
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
async ensureInitialized(desiredCommandName) {
|
|
397
|
-
if (this.initialized) {
|
|
398
|
-
// Return previously computed summary; best-effort fallback.
|
|
399
|
-
if (this.lastInitMeta)
|
|
400
|
-
return this.lastInitMeta;
|
|
401
|
-
return { commandName: '', promptMode: false, projectPath: this.options.projectPath ? canonicalizePathSync(this.options.projectPath) : canonicalizePathSync(process.cwd()), agentSource: { source: 'default' } };
|
|
402
|
-
}
|
|
403
|
-
// Create environment-scoped auth provider
|
|
404
|
-
const authProvider = new AuthProvider(this.options.apiKey);
|
|
405
|
-
this.env.authProvider = authProvider;
|
|
406
|
-
// Create environment-scoped ToolProcessorManager and register user middleware
|
|
407
|
-
const tpm = new ToolProcessorManager();
|
|
408
|
-
if (this.options.toolMiddleware) {
|
|
409
|
-
for (const mw of this.options.toolMiddleware) {
|
|
410
|
-
tpm.addMiddleware(mw);
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
this.env.toolProcessorManager = tpm;
|
|
414
|
-
// Init backend get-things (supports baseUrl override)
|
|
415
|
-
const bootstrap = new BackendBootstrap({ baseUrlOverride: this.options?.backend?.baseUrl });
|
|
416
|
-
await bootstrap.init();
|
|
417
|
-
const flags = {
|
|
418
|
-
...(this.options.flags || {}),
|
|
419
|
-
sdk: true,
|
|
420
|
-
...(this.options.debug ? { debug: true } : {}),
|
|
421
|
-
...(this.options.interactiveMode !== undefined ? { interactiveMode: this.options.interactiveMode } : {}),
|
|
422
|
-
};
|
|
423
|
-
if (this.options.model)
|
|
424
|
-
flags.model = this.options.model;
|
|
425
|
-
// Resolve effective cwd first (used for agent discovery and tool defaults)
|
|
426
|
-
const explicitProjectPath = this.options.projectPath ? canonicalizePathSync(this.options.projectPath) : undefined;
|
|
427
|
-
// Only fallback to process.cwd() here - the single source of truth
|
|
428
|
-
const effectiveCwd = explicitProjectPath || canonicalizePathSync(process.cwd());
|
|
429
|
-
// SDK-first agent resolution:
|
|
430
|
-
// 1) agentObject / agentContent / explicit agentFile
|
|
431
|
-
// 2) auto-discover agent.toml|yaml|yml from cwd
|
|
432
|
-
// 3) fallback to built-in minimal config
|
|
433
|
-
let configInput = this.options.agentObject ?? this.options.agentContent ?? this.options.agentFile;
|
|
434
|
-
let isFileContent = !!this.options.agentContent || !!this.options.agentObject;
|
|
435
|
-
let agentSource = { source: 'file' };
|
|
436
|
-
if (this.options.agentObject)
|
|
437
|
-
agentSource = { source: 'object' };
|
|
438
|
-
else if (this.options.agentContent)
|
|
439
|
-
agentSource = { source: 'content' };
|
|
440
|
-
else if (this.options.agentFile)
|
|
441
|
-
agentSource = { source: 'file', path: String(this.options.agentFile) };
|
|
442
|
-
if (!configInput) {
|
|
443
|
-
const discovered = await findNearestAgentConfig(effectiveCwd);
|
|
444
|
-
if (discovered) {
|
|
445
|
-
configInput = discovered;
|
|
446
|
-
isFileContent = false;
|
|
447
|
-
agentSource = { source: 'discovered', path: discovered };
|
|
448
|
-
}
|
|
449
|
-
else {
|
|
450
|
-
configInput = buildDefaultSdkAgentConfig();
|
|
451
|
-
isFileContent = true;
|
|
452
|
-
agentSource = { source: 'default' };
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
const configManager = await ConfigManager.init(configInput, isFileContent);
|
|
456
|
-
// Resolve command or mode
|
|
457
|
-
let modeCommand;
|
|
458
|
-
if (flags.mode) {
|
|
459
|
-
modeCommand = configManager.resolveModeAsCommand(flags.mode);
|
|
460
|
-
}
|
|
461
|
-
// Determine whether the caller passed a command name or a free-form prompt.
|
|
462
|
-
// SDK should be "prompt-first": if the provided string is not a known command,
|
|
463
|
-
// we still build a command config via getCommandConfig(prompt) (which returns
|
|
464
|
-
// a default config inheriting top-level model/tools) and treat the string as
|
|
465
|
-
// user prompt.
|
|
466
|
-
const allCommands = configManager.listCommands();
|
|
467
|
-
const desiredIsCommand = !!(desiredCommandName && allCommands.includes(desiredCommandName));
|
|
468
|
-
// If the user provided a command name but there are no commands configured,
|
|
469
|
-
// we treat it as a prompt (prompt-first behavior). We also synthesize an
|
|
470
|
-
// internal default command config so execution can proceed.
|
|
471
|
-
const hasAnyCommands = allCommands.length > 0;
|
|
472
|
-
// Choose command:
|
|
473
|
-
// 1) mode (explicit)
|
|
474
|
-
// 2) if desired name is a known command -> use that command
|
|
475
|
-
// 3) else if a non-empty prompt was provided -> treat as prompt and build a default command config
|
|
476
|
-
// 4) else if commands exist -> fallback to flags.command or a single command
|
|
477
|
-
// 5) else (no commands) -> synthesize default command
|
|
478
|
-
let command;
|
|
479
|
-
let cmdName = typeof flags.command === 'string' ? flags.command : configManager.getSingleCommand() || '';
|
|
480
|
-
let promptMode = false;
|
|
481
|
-
if (flags.mode) {
|
|
482
|
-
command = modeCommand;
|
|
483
|
-
cmdName = flags.mode;
|
|
484
|
-
}
|
|
485
|
-
else if (desiredIsCommand) {
|
|
486
|
-
cmdName = desiredCommandName;
|
|
487
|
-
command = configManager.getCommandConfig(cmdName);
|
|
488
|
-
}
|
|
489
|
-
else if (desiredCommandName && String(desiredCommandName).trim().length > 0) {
|
|
490
|
-
cmdName = ''; // prompt flow
|
|
491
|
-
promptMode = true;
|
|
492
|
-
command = configManager.getCommandConfig(desiredCommandName);
|
|
493
|
-
}
|
|
494
|
-
else if (hasAnyCommands) {
|
|
495
|
-
command = configManager.getCommandConfig(cmdName);
|
|
496
|
-
}
|
|
497
|
-
else {
|
|
498
|
-
// No commands exist: synthesize a default command that inherits top-level
|
|
499
|
-
// model/tools/mcpServers/etc. Prompt() uses this path.
|
|
500
|
-
cmdName = '';
|
|
501
|
-
promptMode = true;
|
|
502
|
-
command = configManager.getCommandConfig('');
|
|
503
|
-
}
|
|
504
|
-
// Tool allow/deny flags
|
|
505
|
-
if (flags.tools) {
|
|
506
|
-
command.available_tools = Array.isArray(flags.tools) ? flags.tools : String(flags.tools).split(',').map((s) => s.trim());
|
|
507
|
-
}
|
|
508
|
-
if (flags.noTools) {
|
|
509
|
-
command.ignore_tools = Array.isArray(flags.noTools) ? flags.noTools : String(flags.noTools).split(',').map((s) => s.trim());
|
|
510
|
-
}
|
|
511
|
-
// MCP servers
|
|
512
|
-
const serverRegistry = ServerRegistry.init(this.options.mcpFile);
|
|
513
|
-
const mcpServers = {
|
|
514
|
-
...configManager.getMCPServers(),
|
|
515
|
-
...(command?.mcpServers || {}),
|
|
516
|
-
...(this.options.mcpServers || {}),
|
|
517
|
-
};
|
|
518
|
-
const disableMcp = command.disable_mcp === true || configManager.getRawConfig()?.disable_mcp === true;
|
|
519
|
-
if (!disableMcp) {
|
|
520
|
-
serverRegistry.setTomlMCPConfigs(mcpServers);
|
|
521
|
-
}
|
|
522
|
-
const generalInstructions = configManager.getGeneralInstructions();
|
|
523
|
-
const systemPrompt = configManager.getSystemPrompt();
|
|
524
|
-
this.sessionContext = await SessionContext.newSessionContext(flags, command, generalInstructions, systemPrompt, undefined, flags.sid);
|
|
525
|
-
// Determine effective working directory
|
|
526
|
-
// Prefer the earlier effectiveCwd we already computed for agent discovery.
|
|
527
|
-
const effectiveCwd2 = effectiveCwd;
|
|
528
|
-
try {
|
|
529
|
-
this.sessionContext.setExecutionCwd?.(effectiveCwd2);
|
|
530
|
-
}
|
|
531
|
-
catch { /* best-effort: method may not exist */ }
|
|
532
|
-
const roots = [effectiveCwd2, ...((this.options.additionalPaths || []).map((r) => canonicalizePathSync(r)))];
|
|
533
|
-
try {
|
|
534
|
-
await this.sessionContext.setAccessiblePaths(roots);
|
|
535
|
-
}
|
|
536
|
-
catch { /* best-effort: accessible paths are non-critical */ }
|
|
537
|
-
if (!disableMcp) {
|
|
538
|
-
await mcpInitialization();
|
|
539
|
-
}
|
|
540
|
-
// Prefetch context summaries from other sessions (equivalent to CLI --with)
|
|
541
|
-
if (this.options.contextSessionIds && this.options.contextSessionIds.length > 0) {
|
|
542
|
-
try {
|
|
543
|
-
const agentTmp = new AgentAPI(this.sessionContext);
|
|
544
|
-
const { computeNextTaskFocus } = await import('../context/taskFocus.js');
|
|
545
|
-
const taskFocus = computeNextTaskFocus(command.instructions, '', extractSetFlags(flags));
|
|
546
|
-
const summaries = await agentTmp.tryPrefetchSummarization(this.options.contextSessionIds, taskFocus);
|
|
547
|
-
for (const [sid, summary] of Object.entries(summaries)) {
|
|
548
|
-
this.sessionContext.addPreviousSessionSummarization(sid, summary);
|
|
549
|
-
}
|
|
550
|
-
}
|
|
551
|
-
catch { /* best-effort: context prefetch failure should not block run */ }
|
|
552
|
-
}
|
|
553
|
-
// Per-client message manager and agent
|
|
554
|
-
this.messageManager = new MessageManager();
|
|
555
|
-
this.agent = new AgentAPI(this.sessionContext);
|
|
556
|
-
const backend = ServerData.getInstance();
|
|
557
|
-
this.pushEvent(SdkEventType.Init, this.sessionContext.getSessionId(), {
|
|
558
|
-
sdk_version: getSdkVersion(),
|
|
559
|
-
protocol: 'qodo.sdk.v2',
|
|
560
|
-
pid: process.pid,
|
|
561
|
-
backend: {
|
|
562
|
-
base_url: backend.getBaseUrl(),
|
|
563
|
-
source: backend.getBaseUrlSource(),
|
|
564
|
-
},
|
|
565
|
-
model: this.sessionContext.getModel(),
|
|
566
|
-
});
|
|
567
|
-
this.setupEventListeners();
|
|
568
|
-
this.core = new AgentRunnerCore(this.sessionContext, this.messageManager, this.agent,
|
|
569
|
-
// No-op emit: we emit via message manager listeners
|
|
570
|
-
() => { }, this.options.autoApproveTools !== false);
|
|
571
|
-
this.initialized = true;
|
|
572
|
-
this.lastInitMeta = {
|
|
573
|
-
commandName: cmdName,
|
|
574
|
-
promptMode,
|
|
575
|
-
projectPath: effectiveCwd2,
|
|
576
|
-
agentSource,
|
|
577
|
-
};
|
|
578
|
-
return this.lastInitMeta;
|
|
579
|
-
}
|
|
580
|
-
async maybeApproveTool(req) {
|
|
581
|
-
const { sid, tool_call_id } = req;
|
|
582
|
-
if (this.toolApprovalEmitted.has(tool_call_id) || this.toolApprovalInFlight.has(tool_call_id)) {
|
|
583
|
-
return;
|
|
584
|
-
}
|
|
585
|
-
this.toolApprovalInFlight.add(tool_call_id);
|
|
586
|
-
let approved = this.options.autoApproveTools !== false;
|
|
587
|
-
let reason = undefined;
|
|
588
|
-
if (this.options.autoApproveTools === false) {
|
|
589
|
-
if (this.options.toolApproval) {
|
|
590
|
-
try {
|
|
591
|
-
const res = await this.options.toolApproval({
|
|
592
|
-
tool_call_id: req.tool_call_id,
|
|
593
|
-
server_name: req.server_name,
|
|
594
|
-
tool_name: req.tool_name,
|
|
595
|
-
tool_args: req.tool_args,
|
|
596
|
-
reasoning: req.reasoning,
|
|
597
|
-
});
|
|
598
|
-
approved = !!res;
|
|
599
|
-
if (!approved)
|
|
600
|
-
reason = 'Declined by toolApproval callback';
|
|
601
|
-
}
|
|
602
|
-
catch (e) {
|
|
603
|
-
approved = false;
|
|
604
|
-
reason = e?.message || 'toolApproval callback threw';
|
|
605
|
-
}
|
|
606
|
-
}
|
|
607
|
-
else {
|
|
608
|
-
approved = false;
|
|
609
|
-
reason = 'Auto-approval disabled and no toolApproval callback provided';
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
// Emit decision
|
|
613
|
-
this.pushEvent(SdkEventType.ToolApproved, sid, {
|
|
614
|
-
tool_call_id,
|
|
615
|
-
approved,
|
|
616
|
-
...(approved ? {} : { reason }),
|
|
617
|
-
});
|
|
618
|
-
this.toolApprovalEmitted.add(tool_call_id);
|
|
619
|
-
// IMPORTANT: respond to backend so the run can continue.
|
|
620
|
-
try {
|
|
621
|
-
await this.agent.toolApproval(tool_call_id, approved);
|
|
622
|
-
}
|
|
623
|
-
catch (e) {
|
|
624
|
-
// Surface approval send failures as sdk.error but do not crash the stream.
|
|
625
|
-
this.pushEvent(SdkEventType.Error, sid, {
|
|
626
|
-
message: `Failed to submit tool approval for ${tool_call_id}`,
|
|
627
|
-
cause: e?.message || e,
|
|
628
|
-
});
|
|
629
|
-
}
|
|
630
|
-
finally {
|
|
631
|
-
this.toolApprovalInFlight.delete(tool_call_id);
|
|
632
|
-
}
|
|
633
|
-
}
|
|
634
|
-
extractToolLifecycleFromLangChain(lcMessages, sid) {
|
|
635
|
-
for (const msg of lcMessages) {
|
|
636
|
-
const type = msg?.type;
|
|
637
|
-
const data = msg?.data;
|
|
638
|
-
if (!type || !data)
|
|
639
|
-
continue;
|
|
640
|
-
// Tool request is represented as AI message with tool_calls
|
|
641
|
-
if (type === 'ai' && Array.isArray(data.tool_calls) && data.tool_calls.length > 0) {
|
|
642
|
-
// Determine pending approval from additional_kwargs
|
|
643
|
-
const pendingApproval = !!data.additional_kwargs?.pending_approval;
|
|
644
|
-
const serverName = data.additional_kwargs?.server_name || 'unknown';
|
|
645
|
-
for (const call of data.tool_calls) {
|
|
646
|
-
const toolCallId = String(call?.id || data.id || 'unknown');
|
|
647
|
-
const toolName = String(call?.name || 'unknown');
|
|
648
|
-
const serverStr = String(serverName);
|
|
649
|
-
// Record mapping for later sdk.tool.executed
|
|
650
|
-
if (toolCallId && toolCallId !== 'unknown') {
|
|
651
|
-
this.toolRegistry.set(toolCallId, { server_name: serverStr, tool_name: toolName });
|
|
652
|
-
}
|
|
653
|
-
// Emit tool.requested once per tool_call_id
|
|
654
|
-
if (!this.toolRequestedEmitted.has(toolCallId)) {
|
|
655
|
-
this.pushEvent(SdkEventType.ToolRequested, sid, {
|
|
656
|
-
tool_call_id: toolCallId,
|
|
657
|
-
server_name: serverStr,
|
|
658
|
-
tool_name: toolName,
|
|
659
|
-
tool_args: call?.args,
|
|
660
|
-
reasoning: typeof data.content === 'string' ? data.content : undefined,
|
|
661
|
-
pending_approval: pendingApproval,
|
|
662
|
-
});
|
|
663
|
-
this.toolRequestedEmitted.add(toolCallId);
|
|
664
|
-
}
|
|
665
|
-
// Approval handling
|
|
666
|
-
if (!this.toolApprovalEmitted.has(toolCallId)) {
|
|
667
|
-
if (pendingApproval) {
|
|
668
|
-
// Approval required: decide and respond via AgentAPI.toolApproval
|
|
669
|
-
void this.maybeApproveTool({
|
|
670
|
-
sid,
|
|
671
|
-
tool_call_id: toolCallId,
|
|
672
|
-
server_name: serverStr,
|
|
673
|
-
tool_name: toolName,
|
|
674
|
-
tool_args: call?.args,
|
|
675
|
-
reasoning: typeof data.content === 'string' ? data.content : undefined,
|
|
676
|
-
});
|
|
677
|
-
}
|
|
678
|
-
else {
|
|
679
|
-
// No approval required (auto-approved / read-only)
|
|
680
|
-
this.pushEvent(SdkEventType.ToolApproved, sid, {
|
|
681
|
-
tool_call_id: toolCallId,
|
|
682
|
-
approved: true,
|
|
683
|
-
});
|
|
684
|
-
this.toolApprovalEmitted.add(toolCallId);
|
|
685
|
-
}
|
|
686
|
-
}
|
|
687
|
-
}
|
|
688
|
-
}
|
|
689
|
-
// Tool execution result is represented as ToolMessage
|
|
690
|
-
if (type === 'tool') {
|
|
691
|
-
const toolCallId = String(data.tool_call_id || data.id || 'unknown');
|
|
692
|
-
if (!this.toolExecutedEmitted.has(toolCallId)) {
|
|
693
|
-
const serverName = String(data.additional_kwargs?.server_name || this.toolRegistry.get(toolCallId)?.server_name || 'unknown');
|
|
694
|
-
const toolName = String(this.toolRegistry.get(toolCallId)?.tool_name || 'unknown');
|
|
695
|
-
const status = data.status;
|
|
696
|
-
const dryRun = !!(this.sessionContext?.isDryRun?.());
|
|
697
|
-
this.pushEvent(SdkEventType.ToolExecuted, sid, {
|
|
698
|
-
tool_call_id: toolCallId,
|
|
699
|
-
server_name: serverName,
|
|
700
|
-
tool_name: toolName,
|
|
701
|
-
result: {
|
|
702
|
-
isError: status === 'error',
|
|
703
|
-
content: data.content,
|
|
704
|
-
raw: data,
|
|
705
|
-
},
|
|
706
|
-
...(dryRun ? { dry_run: true } : {}),
|
|
707
|
-
});
|
|
708
|
-
this.toolExecutedEmitted.add(toolCallId);
|
|
709
|
-
}
|
|
710
|
-
}
|
|
711
|
-
}
|
|
712
|
-
}
|
|
713
|
-
async *stream(commandOrPrompt, options) {
|
|
714
|
-
if (this.activeRuns > 0) {
|
|
715
|
-
// Initialized parents fork() to share warm MCP connections
|
|
716
|
-
const delegated = this.initialized ? await this.fork() : new QodoSDK(this.options);
|
|
717
|
-
try {
|
|
718
|
-
yield* delegated.stream(commandOrPrompt, options);
|
|
719
|
-
}
|
|
720
|
-
finally {
|
|
721
|
-
try {
|
|
722
|
-
await delegated.dispose();
|
|
723
|
-
}
|
|
724
|
-
catch { /* cleanup: dispose must not throw in finally */ }
|
|
725
|
-
}
|
|
726
|
-
return;
|
|
727
|
-
}
|
|
728
|
-
this.activeRuns++;
|
|
729
|
-
try {
|
|
730
|
-
this.done = false;
|
|
731
|
-
this.eventQueue = [];
|
|
732
|
-
this.pendingResolvers = [];
|
|
733
|
-
this.lastAiText = '';
|
|
734
|
-
this.lastAiMessageId = '';
|
|
735
|
-
this.toolRequestedEmitted.clear();
|
|
736
|
-
this.toolApprovalEmitted.clear();
|
|
737
|
-
this.toolApprovalInFlight.clear();
|
|
738
|
-
this.toolExecutedEmitted.clear();
|
|
739
|
-
this.toolRegistry.clear();
|
|
740
|
-
this.runOutputZodSchema = undefined;
|
|
741
|
-
// Initialize per-run metadata
|
|
742
|
-
this.runId = uuid();
|
|
743
|
-
this.seq = 0;
|
|
744
|
-
this.runStartMs = Date.now();
|
|
745
|
-
const env = this.env;
|
|
746
|
-
const self = this;
|
|
747
|
-
async function* inner() {
|
|
748
|
-
// If already initialized and user passed a different command name, reinit (same behavior as old QodoClient)
|
|
749
|
-
if (self.initialized) {
|
|
750
|
-
try {
|
|
751
|
-
const cm = ConfigManager.getInstance();
|
|
752
|
-
const cmds = cm.listCommands();
|
|
753
|
-
const isCommand = commandOrPrompt && cmds.includes(commandOrPrompt);
|
|
754
|
-
if (isCommand) {
|
|
755
|
-
const currentName = (self.sessionContext?.getCommand()?.name) || '';
|
|
756
|
-
if (commandOrPrompt !== currentName) {
|
|
757
|
-
await self.dispose();
|
|
758
|
-
}
|
|
759
|
-
}
|
|
760
|
-
}
|
|
761
|
-
catch { /* best-effort: reinit check should not block new run */ }
|
|
762
|
-
}
|
|
763
|
-
let initMeta = null;
|
|
764
|
-
let initFailed = false;
|
|
765
|
-
try {
|
|
766
|
-
initMeta = await self.ensureInitialized(commandOrPrompt);
|
|
767
|
-
}
|
|
768
|
-
catch (e) {
|
|
769
|
-
initFailed = true;
|
|
770
|
-
// Event-first: initialization errors should produce sdk.error + sdk.final
|
|
771
|
-
const sid = '';
|
|
772
|
-
self.pushEvent(SdkEventType.Error, sid, {
|
|
773
|
-
message: e?.message || String(e),
|
|
774
|
-
cause: e?.cause || e,
|
|
775
|
-
});
|
|
776
|
-
self.pushEvent(SdkEventType.Final, sid, {
|
|
777
|
-
success: false,
|
|
778
|
-
error: e?.message || String(e),
|
|
779
|
-
model: self.options.model || '',
|
|
780
|
-
result: {},
|
|
781
|
-
messages: { langchain: [], openai: [] },
|
|
782
|
-
meta: { tools_auto_approved: self.options.autoApproveTools !== false, subagents_used: false, ...(options?.dryRun ? { dry_run: true } : {}), ...(() => { const _ee = self.sessionContext?.getCommand?.()?.exit_expression; return _ee ? { exit_expression: _ee } : {}; })() },
|
|
783
|
-
});
|
|
784
|
-
// Do NOT return here – we still want to drain the queued events below.
|
|
785
|
-
}
|
|
786
|
-
if (!initFailed) {
|
|
787
|
-
// Thread per-run dryRun flag into session context
|
|
788
|
-
const isDryRun = !!(options?.dryRun);
|
|
789
|
-
try {
|
|
790
|
-
self.sessionContext.getFlags().dryRun = isDryRun;
|
|
791
|
-
}
|
|
792
|
-
catch { /* best-effort: dryRun flag threading is non-critical */ }
|
|
793
|
-
// Emit run.started
|
|
794
|
-
try {
|
|
795
|
-
const sid = self.sessionContext.getSessionId();
|
|
796
|
-
self.pushEvent(SdkEventType.RunStarted, sid, {
|
|
797
|
-
session_id: sid,
|
|
798
|
-
command: initMeta.commandName,
|
|
799
|
-
prompt_mode: initMeta.promptMode,
|
|
800
|
-
cwd: initMeta.projectPath,
|
|
801
|
-
agent: initMeta.agentSource,
|
|
802
|
-
tools_auto_approved: self.options.autoApproveTools !== false,
|
|
803
|
-
dry_run: isDryRun,
|
|
804
|
-
});
|
|
805
|
-
}
|
|
806
|
-
catch { /* non-fatal: run.started event emission is best-effort */ }
|
|
807
|
-
}
|
|
808
|
-
const extra = options?.extraInstructions || '';
|
|
809
|
-
const args = options?.args || {};
|
|
810
|
-
// Prompt-first behavior:
|
|
811
|
-
// - If commandOrPrompt matches a configured command name -> run that command.
|
|
812
|
-
// - Otherwise treat it as a free-form prompt and pass it as extraInstructions.
|
|
813
|
-
let prompt;
|
|
814
|
-
let promptExtra;
|
|
815
|
-
try {
|
|
816
|
-
const cm = ConfigManager.getInstance();
|
|
817
|
-
const cmds = cm.listCommands();
|
|
818
|
-
if (commandOrPrompt && cmds.includes(commandOrPrompt)) {
|
|
819
|
-
prompt = commandOrPrompt;
|
|
820
|
-
promptExtra = extra;
|
|
821
|
-
}
|
|
822
|
-
else {
|
|
823
|
-
prompt = '';
|
|
824
|
-
promptExtra = commandOrPrompt ? `${commandOrPrompt}${extra ? ` ${extra}` : ''}` : extra;
|
|
825
|
-
}
|
|
826
|
-
}
|
|
827
|
-
catch {
|
|
828
|
-
prompt = '';
|
|
829
|
-
promptExtra = commandOrPrompt ? `${commandOrPrompt}${extra ? ` ${extra}` : ''}` : extra;
|
|
830
|
-
}
|
|
831
|
-
// Inject dry-run playbook into the prompt so the agent understands
|
|
832
|
-
// that tool results are simulated and adapts its behaviour.
|
|
833
|
-
if (options?.dryRun) {
|
|
834
|
-
const dryRunPlaybook = [
|
|
835
|
-
'',
|
|
836
|
-
'--- DRY RUN MODE ---',
|
|
837
|
-
'This run is executing in dry-run mode. Important rules:',
|
|
838
|
-
'1. Every tool call you make will be intercepted. You will receive simulated (mock) responses marked with "[DRY RUN]".',
|
|
839
|
-
'2. Treat simulated results as plausible placeholders — reason about them as if they were real data.',
|
|
840
|
-
'3. Continue your analysis normally. Describe what actions you would take and what results you would expect.',
|
|
841
|
-
'4. Do NOT tell the user that tools are unavailable or that you cannot access the filesystem. Tools are working — their results are simply simulated.',
|
|
842
|
-
'5. In your final answer, clearly summarize the plan of actions you would execute in a real run, including which tools you called and why.',
|
|
843
|
-
'--- END DRY RUN MODE ---',
|
|
844
|
-
'',
|
|
845
|
-
].join('\n');
|
|
846
|
-
promptExtra = promptExtra ? `${promptExtra}\n${dryRunPlaybook}` : dryRunPlaybook;
|
|
847
|
-
}
|
|
848
|
-
if (!initFailed) {
|
|
849
|
-
try {
|
|
850
|
-
// If the command was built with sdkCommand({ args: <zod schema> }), validate args here.
|
|
851
|
-
// This keeps v2 behavior strict and provides actionable errors.
|
|
852
|
-
try {
|
|
853
|
-
const cmdAny = self.sessionContext?.getCommand?.();
|
|
854
|
-
const schema = cmdAny?.__sdk?.argsSchema;
|
|
855
|
-
if (schema) {
|
|
856
|
-
const { parseArgsWithSchema } = await import('./schemas.js');
|
|
857
|
-
parseArgsWithSchema(schema, args);
|
|
858
|
-
}
|
|
859
|
-
}
|
|
860
|
-
catch (e) {
|
|
861
|
-
throw e;
|
|
862
|
-
}
|
|
863
|
-
// Resolve Zod schema for runtime validation of structured_output.
|
|
864
|
-
// Priority: options.outputSchema (if Zod) > command.__sdk.outputSchema
|
|
865
|
-
if (options?.outputSchema && isZodSchema(options.outputSchema)) {
|
|
866
|
-
self.runOutputZodSchema = options.outputSchema;
|
|
867
|
-
}
|
|
868
|
-
else {
|
|
869
|
-
const cmdSdk = self.sessionContext?.getCommand?.();
|
|
870
|
-
const cmdZod = cmdSdk?.__sdk?.outputSchema;
|
|
871
|
-
if (cmdZod && isZodSchema(cmdZod)) {
|
|
872
|
-
self.runOutputZodSchema = cmdZod;
|
|
873
|
-
}
|
|
874
|
-
}
|
|
875
|
-
await self.core.start(prompt, promptExtra, args, options?.outputSchema);
|
|
876
|
-
}
|
|
877
|
-
catch (e) {
|
|
878
|
-
const sid = self.sessionContext?.getSessionId() || '';
|
|
879
|
-
self.pushEvent(SdkEventType.Error, sid, { message: e?.message || String(e) });
|
|
880
|
-
self.pushEvent(SdkEventType.Final, sid, {
|
|
881
|
-
success: false,
|
|
882
|
-
error: e?.message || String(e),
|
|
883
|
-
model: self.sessionContext?.getModel() || '',
|
|
884
|
-
result: {},
|
|
885
|
-
messages: { langchain: [], openai: [] },
|
|
886
|
-
meta: { tools_auto_approved: self.options.autoApproveTools !== false, subagents_used: false, ...(options?.dryRun ? { dry_run: true } : {}), ...(() => { const _ee = self.sessionContext?.getCommand?.()?.exit_expression; return _ee ? { exit_expression: _ee } : {}; })() },
|
|
887
|
-
});
|
|
888
|
-
// Do not set done=true here; allow the event drain loop to see sdk.final and terminate.
|
|
889
|
-
}
|
|
890
|
-
}
|
|
891
|
-
while (true) {
|
|
892
|
-
if (self.eventQueue.length > 0) {
|
|
893
|
-
const ev = self.eventQueue.shift();
|
|
894
|
-
// SDK default: keep internal logs muted for the entire stream.
|
|
895
|
-
// (Consumers can still write to stdout directly if they need streaming output.)
|
|
896
|
-
yield ev;
|
|
897
|
-
if (ev.type === SdkEventType.Final) {
|
|
898
|
-
self.done = true;
|
|
899
|
-
// drain
|
|
900
|
-
while (self.eventQueue.length > 0) {
|
|
901
|
-
const drained = self.eventQueue.shift();
|
|
902
|
-
yield drained;
|
|
903
|
-
}
|
|
904
|
-
break;
|
|
905
|
-
}
|
|
906
|
-
}
|
|
907
|
-
else {
|
|
908
|
-
const next = await new Promise((resolve) => {
|
|
909
|
-
self.pendingResolvers.push((res) => {
|
|
910
|
-
if (res.done)
|
|
911
|
-
resolve(null);
|
|
912
|
-
else
|
|
913
|
-
resolve(res.value);
|
|
914
|
-
});
|
|
915
|
-
if (self.eventQueue.length > 0) {
|
|
916
|
-
const ev = self.eventQueue.shift();
|
|
917
|
-
const r = self.pendingResolvers.shift();
|
|
918
|
-
if (r)
|
|
919
|
-
r({ value: ev, done: false });
|
|
920
|
-
}
|
|
921
|
-
});
|
|
922
|
-
if (next) {
|
|
923
|
-
yield next;
|
|
924
|
-
if (next.type === SdkEventType.Final) {
|
|
925
|
-
self.done = true;
|
|
926
|
-
while (self.eventQueue.length > 0) {
|
|
927
|
-
const drained = self.eventQueue.shift();
|
|
928
|
-
yield drained;
|
|
929
|
-
}
|
|
930
|
-
break;
|
|
931
|
-
}
|
|
932
|
-
}
|
|
933
|
-
}
|
|
934
|
-
// Only terminate once we've yielded sdk.final and there are no queued events left.
|
|
935
|
-
// (self.done may flip to true from internal listeners before sdk.final is drained.)
|
|
936
|
-
if (self.done && self.eventQueue.length === 0)
|
|
937
|
-
break;
|
|
938
|
-
}
|
|
939
|
-
}
|
|
940
|
-
// Set up execution timeout if specified
|
|
941
|
-
let timeoutTimer;
|
|
942
|
-
if (options?.timeout && options.timeout > 0) {
|
|
943
|
-
const timeoutMs = options.timeout;
|
|
944
|
-
timeoutTimer = setTimeout(() => {
|
|
945
|
-
const sid = this.sessionContext?.getSessionId?.() || '';
|
|
946
|
-
try {
|
|
947
|
-
this.cancel();
|
|
948
|
-
}
|
|
949
|
-
catch { /* best-effort: cancel must not prevent timeout event emission */ }
|
|
950
|
-
this.pushEvent(SdkEventType.Error, sid, {
|
|
951
|
-
message: `Execution timed out after ${timeoutMs}ms`,
|
|
952
|
-
});
|
|
953
|
-
this.pushEvent(SdkEventType.Final, sid, {
|
|
954
|
-
success: false,
|
|
955
|
-
error: `Execution timed out after ${timeoutMs}ms`,
|
|
956
|
-
model: this.sessionContext?.getModel?.() || '',
|
|
957
|
-
result: {},
|
|
958
|
-
messages: { langchain: [], openai: [] },
|
|
959
|
-
meta: {
|
|
960
|
-
tools_auto_approved: this.options.autoApproveTools !== false,
|
|
961
|
-
subagents_used: false,
|
|
962
|
-
timed_out: true,
|
|
963
|
-
...(options?.dryRun ? { dry_run: true } : {}),
|
|
964
|
-
...(() => { const _ee = this.sessionContext?.getCommand?.()?.exit_expression; return _ee ? { exit_expression: _ee } : {}; })(),
|
|
965
|
-
},
|
|
966
|
-
});
|
|
967
|
-
}, timeoutMs);
|
|
968
|
-
// Prevent the timer from keeping the process alive
|
|
969
|
-
if (typeof timeoutTimer === 'object' && 'unref' in timeoutTimer) {
|
|
970
|
-
timeoutTimer.unref();
|
|
971
|
-
}
|
|
972
|
-
}
|
|
973
|
-
try {
|
|
974
|
-
const innerGen = inner();
|
|
975
|
-
while (true) {
|
|
976
|
-
const { value, done } = await runWithEnvironment(env, () => innerGen.next());
|
|
977
|
-
if (done)
|
|
978
|
-
return;
|
|
979
|
-
yield value;
|
|
980
|
-
}
|
|
981
|
-
}
|
|
982
|
-
finally {
|
|
983
|
-
if (timeoutTimer !== undefined)
|
|
984
|
-
clearTimeout(timeoutTimer);
|
|
985
|
-
}
|
|
986
|
-
}
|
|
987
|
-
finally {
|
|
988
|
-
this.activeRuns = Math.max(0, this.activeRuns - 1);
|
|
989
|
-
}
|
|
990
|
-
}
|
|
991
|
-
async run(commandOrPrompt, options) {
|
|
992
|
-
const maxRetries = options?.maxRetries ?? 0;
|
|
993
|
-
let lastFinal = null;
|
|
994
|
-
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
995
|
-
lastFinal = null;
|
|
996
|
-
// On retry attempts, create a fresh SDK instance to get a clean session
|
|
997
|
-
if (attempt > 0) {
|
|
998
|
-
try {
|
|
999
|
-
await this.dispose();
|
|
1000
|
-
}
|
|
1001
|
-
catch { /* cleanup: dispose must not throw between retries */ }
|
|
1002
|
-
}
|
|
1003
|
-
// Strip maxRetries from inner options to prevent recursive retry
|
|
1004
|
-
const innerOpts = maxRetries > 0
|
|
1005
|
-
? { ...options, maxRetries: 0 }
|
|
1006
|
-
: options;
|
|
1007
|
-
for await (const ev of this.stream(commandOrPrompt, innerOpts)) {
|
|
1008
|
-
if (ev.type === SdkEventType.Final)
|
|
1009
|
-
lastFinal = ev.data;
|
|
1010
|
-
}
|
|
1011
|
-
await new Promise((r) => setTimeout(r, 10));
|
|
1012
|
-
// If successful, return immediately
|
|
1013
|
-
if (lastFinal?.success) {
|
|
1014
|
-
return lastFinal;
|
|
1015
|
-
}
|
|
1016
|
-
// If retries remain, loop; otherwise return the last failure
|
|
1017
|
-
if (attempt < maxRetries) {
|
|
1018
|
-
this.logger.info(`[retry] Attempt ${attempt + 1} failed, retrying (${maxRetries - attempt - 1} retries remaining)...`);
|
|
1019
|
-
}
|
|
1020
|
-
}
|
|
1021
|
-
return lastFinal;
|
|
1022
|
-
}
|
|
1023
|
-
/**
|
|
1024
|
-
* SDK-first friendly API: treat input as a free-form prompt (never a command name).
|
|
1025
|
-
*/
|
|
1026
|
-
prompt(text, options) {
|
|
1027
|
-
const extraInstructions = text;
|
|
1028
|
-
return this.run('', { ...options, extraInstructions });
|
|
1029
|
-
}
|
|
1030
|
-
/**
|
|
1031
|
-
* SDK-first friendly API: stream events for a free-form prompt.
|
|
1032
|
-
*/
|
|
1033
|
-
streamPrompt(text, options) {
|
|
1034
|
-
const extraInstructions = text;
|
|
1035
|
-
return this.stream('', { ...options, extraInstructions });
|
|
1036
|
-
}
|
|
1037
|
-
cancel() {
|
|
1038
|
-
if (!this.initialized)
|
|
1039
|
-
return;
|
|
1040
|
-
this.core.cancel();
|
|
1041
|
-
// AgentRunnerCore.cancel() aborts the agent's AbortController and drops
|
|
1042
|
-
// the WebSocket, but nothing in that path guarantees the stream iterator
|
|
1043
|
-
// ever produces another event. When we cancel during a mid-turn wait
|
|
1044
|
-
// (e.g. the Slack bot's inactivity timer fires because a ToolRequested
|
|
1045
|
-
// was lost in a reconnect), the iterator is blocked on a
|
|
1046
|
-
// ``pendingResolvers`` promise that would otherwise never resolve —
|
|
1047
|
-
// ``for await`` hangs, no final update is written back to the caller,
|
|
1048
|
-
// and the user-visible status message freezes at the last delta.
|
|
1049
|
-
//
|
|
1050
|
-
// Emit a synthetic Error + Final pair so the iterator drains cleanly.
|
|
1051
|
-
// Guarded by ``!this.done`` so a real Final arriving just before cancel
|
|
1052
|
-
// doesn't get clobbered.
|
|
1053
|
-
if (!this.done) {
|
|
1054
|
-
const sid = this.sessionContext?.getSessionId?.() || '';
|
|
1055
|
-
this.pushEvent(SdkEventType.Error, sid, { message: 'Cancelled' });
|
|
1056
|
-
this.pushEvent(SdkEventType.Final, sid, {
|
|
1057
|
-
success: false,
|
|
1058
|
-
error: 'Cancelled',
|
|
1059
|
-
model: this.options.model || '',
|
|
1060
|
-
result: {},
|
|
1061
|
-
messages: { langchain: [], openai: [] },
|
|
1062
|
-
meta: {
|
|
1063
|
-
tools_auto_approved: this.options.autoApproveTools !== false,
|
|
1064
|
-
subagents_used: false,
|
|
1065
|
-
timed_out: true,
|
|
1066
|
-
},
|
|
1067
|
-
});
|
|
1068
|
-
}
|
|
1069
|
-
}
|
|
1070
|
-
async dispose() {
|
|
1071
|
-
if (!this.initialized) {
|
|
1072
|
-
return;
|
|
1073
|
-
}
|
|
1074
|
-
const env = this.env;
|
|
1075
|
-
await runWithEnvironment(env, async () => {
|
|
1076
|
-
try {
|
|
1077
|
-
// Remove event listeners FIRST to prevent stale callbacks during core teardown
|
|
1078
|
-
for (const cleanup of this._listenerCleanups) {
|
|
1079
|
-
try {
|
|
1080
|
-
cleanup();
|
|
1081
|
-
}
|
|
1082
|
-
catch { /* cleanup must not throw */ }
|
|
1083
|
-
}
|
|
1084
|
-
this._listenerCleanups = [];
|
|
1085
|
-
await this.core.dispose();
|
|
1086
|
-
try {
|
|
1087
|
-
this.agent.cleanup?.();
|
|
1088
|
-
}
|
|
1089
|
-
catch { /* cleanup: agent teardown must not throw */ }
|
|
1090
|
-
// Forks share the parent's MCP — only the parent should tear it down.
|
|
1091
|
-
if (!this.isFork) {
|
|
1092
|
-
if (this._activeForkCount > 0) {
|
|
1093
|
-
this.logger.warn(`[sdk] dispose() called while ${this._activeForkCount} fork(s) are still active. Fork operations may fail.`);
|
|
1094
|
-
}
|
|
1095
|
-
try {
|
|
1096
|
-
const { MCPManager } = await import('../mcp/MCPManager.js');
|
|
1097
|
-
try {
|
|
1098
|
-
await MCPManager.getInstance().dispose();
|
|
1099
|
-
}
|
|
1100
|
-
catch { /* cleanup: MCP dispose must not throw */ }
|
|
1101
|
-
}
|
|
1102
|
-
catch { /* cleanup: MCP import may fail if never initialized */ }
|
|
1103
|
-
}
|
|
1104
|
-
else if (this._forkParent) {
|
|
1105
|
-
this._forkParent._activeForkCount = Math.max(0, this._forkParent._activeForkCount - 1);
|
|
1106
|
-
this._forkParent = undefined; // break reference to allow GC and prevent double-decrement
|
|
1107
|
-
}
|
|
1108
|
-
}
|
|
1109
|
-
finally {
|
|
1110
|
-
this.initialized = false;
|
|
1111
|
-
}
|
|
1112
|
-
});
|
|
1113
|
-
}
|
|
1114
|
-
}
|
|
1115
|
-
//# sourceMappingURL=QodoSDK.js.map
|