@namzu/sdk 30.2.0 → 31.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +562 -0
- package/README.md +43 -2
- package/dist/advisory/executor.d.ts +2 -1
- package/dist/advisory/executor.d.ts.map +1 -1
- package/dist/advisory/executor.js +4 -1
- package/dist/advisory/executor.js.map +1 -1
- package/dist/agents/ReactiveAgent.d.ts.map +1 -1
- package/dist/agents/ReactiveAgent.js +12 -0
- package/dist/agents/ReactiveAgent.js.map +1 -1
- package/dist/agents/RouterAgent.d.ts.map +1 -1
- package/dist/agents/RouterAgent.js +21 -3
- package/dist/agents/RouterAgent.js.map +1 -1
- package/dist/agents/SupervisorAgent.d.ts.map +1 -1
- package/dist/agents/SupervisorAgent.js +34 -11
- package/dist/agents/SupervisorAgent.js.map +1 -1
- package/dist/agents/runAgent.d.ts +12 -0
- package/dist/agents/runAgent.d.ts.map +1 -1
- package/dist/agents/runAgent.js +26 -2
- package/dist/agents/runAgent.js.map +1 -1
- package/dist/authorization/command-line.d.ts +81 -0
- package/dist/authorization/command-line.d.ts.map +1 -0
- package/dist/authorization/command-line.js +347 -0
- package/dist/authorization/command-line.js.map +1 -0
- package/dist/authorization/rules.d.ts.map +1 -1
- package/dist/authorization/rules.js +22 -1
- package/dist/authorization/rules.js.map +1 -1
- package/dist/bridge/a2a/client.d.ts +23 -5
- package/dist/bridge/a2a/client.d.ts.map +1 -1
- package/dist/bridge/a2a/client.js +320 -73
- package/dist/bridge/a2a/client.js.map +1 -1
- package/dist/bridge/a2a/mapper.d.ts.map +1 -1
- package/dist/bridge/a2a/mapper.js +4 -0
- package/dist/bridge/a2a/mapper.js.map +1 -1
- package/dist/bridge/acp/server.d.ts +13 -1
- package/dist/bridge/acp/server.d.ts.map +1 -1
- package/dist/bridge/acp/server.js +150 -44
- package/dist/bridge/acp/server.js.map +1 -1
- package/dist/bridge/mcp/connector/adapter.d.ts +3 -2
- package/dist/bridge/mcp/connector/adapter.d.ts.map +1 -1
- package/dist/bridge/mcp/connector/adapter.js +17 -21
- package/dist/bridge/mcp/connector/adapter.js.map +1 -1
- package/dist/bridge/sse/mapper.d.ts.map +1 -1
- package/dist/bridge/sse/mapper.js +3 -0
- package/dist/bridge/sse/mapper.js.map +1 -1
- package/dist/compaction/dangling.d.ts +29 -2
- package/dist/compaction/dangling.d.ts.map +1 -1
- package/dist/compaction/dangling.js +172 -35
- package/dist/compaction/dangling.js.map +1 -1
- package/dist/compaction/index.d.ts +3 -2
- package/dist/compaction/index.d.ts.map +1 -1
- package/dist/compaction/index.js +1 -1
- package/dist/compaction/index.js.map +1 -1
- package/dist/compaction/manual.d.ts +11 -1
- package/dist/compaction/manual.d.ts.map +1 -1
- package/dist/compaction/manual.js +89 -14
- package/dist/compaction/manual.js.map +1 -1
- package/dist/compaction/plan.d.ts +19 -6
- package/dist/compaction/plan.d.ts.map +1 -1
- package/dist/compaction/plan.js +18 -4
- package/dist/compaction/plan.js.map +1 -1
- package/dist/compaction/retention.d.ts +10 -7
- package/dist/compaction/retention.d.ts.map +1 -1
- package/dist/compaction/retention.js +26 -8
- package/dist/compaction/retention.js.map +1 -1
- package/dist/compaction/summary.d.ts +4 -4
- package/dist/compaction/summary.js +4 -4
- package/dist/compaction/verifier.d.ts +19 -1
- package/dist/compaction/verifier.d.ts.map +1 -1
- package/dist/compaction/verifier.js +20 -1
- package/dist/compaction/verifier.js.map +1 -1
- package/dist/config/runtime.d.ts +6 -6
- package/dist/connector/BaseConnector.d.ts +6 -4
- package/dist/connector/BaseConnector.d.ts.map +1 -1
- package/dist/connector/BaseConnector.js +8 -2
- package/dist/connector/BaseConnector.js.map +1 -1
- package/dist/connector/builtins/http.d.ts +16 -4
- package/dist/connector/builtins/http.d.ts.map +1 -1
- package/dist/connector/builtins/http.js +177 -44
- package/dist/connector/builtins/http.js.map +1 -1
- package/dist/connector/builtins/webhook.d.ts +15 -4
- package/dist/connector/builtins/webhook.d.ts.map +1 -1
- package/dist/connector/builtins/webhook.js +165 -45
- package/dist/connector/builtins/webhook.js.map +1 -1
- package/dist/connector/execution-contract.d.ts +11 -0
- package/dist/connector/execution-contract.d.ts.map +1 -0
- package/dist/connector/execution-contract.js +14 -0
- package/dist/connector/execution-contract.js.map +1 -0
- package/dist/connector/http-operation.d.ts +48 -0
- package/dist/connector/http-operation.d.ts.map +1 -0
- package/dist/connector/http-operation.js +205 -0
- package/dist/connector/http-operation.js.map +1 -0
- package/dist/connector/mcp/adapter.d.ts.map +1 -1
- package/dist/connector/mcp/adapter.js +8 -3
- package/dist/connector/mcp/adapter.js.map +1 -1
- package/dist/connector/mcp/client.d.ts +14 -8
- package/dist/connector/mcp/client.d.ts.map +1 -1
- package/dist/connector/mcp/client.js +160 -44
- package/dist/connector/mcp/client.js.map +1 -1
- package/dist/connector/mcp/http-sse.d.ts +8 -2
- package/dist/connector/mcp/http-sse.d.ts.map +1 -1
- package/dist/connector/mcp/http-sse.js +70 -17
- package/dist/connector/mcp/http-sse.js.map +1 -1
- package/dist/connector/mcp/prompt-adapter.d.ts.map +1 -1
- package/dist/connector/mcp/prompt-adapter.js +9 -2
- package/dist/connector/mcp/prompt-adapter.js.map +1 -1
- package/dist/connector/mcp/stdio.d.ts +2 -2
- package/dist/connector/mcp/stdio.d.ts.map +1 -1
- package/dist/connector/mcp/stdio.js +14 -50
- package/dist/connector/mcp/stdio.js.map +1 -1
- package/dist/connector/mcp/streamable-http.d.ts +7 -2
- package/dist/connector/mcp/streamable-http.d.ts.map +1 -1
- package/dist/connector/mcp/streamable-http.js +66 -18
- package/dist/connector/mcp/streamable-http.js.map +1 -1
- package/dist/connector/tools/adapter.d.ts +2 -2
- package/dist/connector/tools/adapter.d.ts.map +1 -1
- package/dist/connector/tools/adapter.js +23 -14
- package/dist/connector/tools/adapter.js.map +1 -1
- package/dist/connector/tools/definitions.d.ts.map +1 -1
- package/dist/connector/tools/definitions.js +5 -2
- package/dist/connector/tools/definitions.js.map +1 -1
- package/dist/connector/tools/result.d.ts +4 -0
- package/dist/connector/tools/result.d.ts.map +1 -0
- package/dist/connector/tools/result.js +20 -0
- package/dist/connector/tools/result.js.map +1 -0
- package/dist/connector/web/guarded-fetch.d.ts +4 -2
- package/dist/connector/web/guarded-fetch.d.ts.map +1 -1
- package/dist/connector/web/guarded-fetch.js +157 -43
- package/dist/connector/web/guarded-fetch.js.map +1 -1
- package/dist/constants/sandbox/index.d.ts +3 -2
- package/dist/constants/sandbox/index.d.ts.map +1 -1
- package/dist/constants/sandbox/index.js +3 -2
- package/dist/constants/sandbox/index.js.map +1 -1
- package/dist/contracts/api.d.ts +2 -0
- package/dist/contracts/api.d.ts.map +1 -1
- package/dist/contracts/schemas.d.ts +38 -12
- package/dist/contracts/schemas.d.ts.map +1 -1
- package/dist/contracts/schemas.js +7 -0
- package/dist/contracts/schemas.js.map +1 -1
- package/dist/directory/derive-supervisor.d.ts.map +1 -1
- package/dist/directory/derive-supervisor.js +8 -0
- package/dist/directory/derive-supervisor.js.map +1 -1
- package/dist/directory/derive.d.ts.map +1 -1
- package/dist/directory/derive.js +8 -0
- package/dist/directory/derive.js.map +1 -1
- package/dist/directory/load.d.ts.map +1 -1
- package/dist/directory/load.js +2 -0
- package/dist/directory/load.js.map +1 -1
- package/dist/directory/types.d.ts +4 -0
- package/dist/directory/types.d.ts.map +1 -1
- package/dist/eval/experiment.d.ts +10 -10
- package/dist/eval/experiment.d.ts.map +1 -1
- package/dist/eval/experiment.js +121 -91
- package/dist/eval/experiment.js.map +1 -1
- package/dist/eval/judge.d.ts +6 -0
- package/dist/eval/judge.d.ts.map +1 -1
- package/dist/eval/judge.js +7 -2
- package/dist/eval/judge.js.map +1 -1
- package/dist/eval/types.d.ts +7 -1
- package/dist/eval/types.d.ts.map +1 -1
- package/dist/manager/agent/lifecycle.d.ts +12 -10
- package/dist/manager/agent/lifecycle.d.ts.map +1 -1
- package/dist/manager/agent/lifecycle.js +16 -3
- package/dist/manager/agent/lifecycle.js.map +1 -1
- package/dist/manager/connector/environment.d.ts +2 -2
- package/dist/manager/connector/environment.d.ts.map +1 -1
- package/dist/manager/connector/environment.js +2 -2
- package/dist/manager/connector/environment.js.map +1 -1
- package/dist/manager/connector/lifecycle.d.ts +10 -2
- package/dist/manager/connector/lifecycle.d.ts.map +1 -1
- package/dist/manager/connector/lifecycle.js +273 -24
- package/dist/manager/connector/lifecycle.js.map +1 -1
- package/dist/manager/connector/tenant.d.ts +5 -4
- package/dist/manager/connector/tenant.d.ts.map +1 -1
- package/dist/manager/connector/tenant.js +47 -22
- package/dist/manager/connector/tenant.js.map +1 -1
- package/dist/manager/goal/activation.d.ts +23 -0
- package/dist/manager/goal/activation.d.ts.map +1 -0
- package/dist/manager/goal/activation.js +41 -0
- package/dist/manager/goal/activation.js.map +1 -0
- package/dist/manager/index.d.ts +3 -2
- package/dist/manager/index.d.ts.map +1 -1
- package/dist/manager/index.js.map +1 -1
- package/dist/manager/run/persistence.d.ts +2 -0
- package/dist/manager/run/persistence.d.ts.map +1 -1
- package/dist/manager/run/persistence.js +5 -1
- package/dist/manager/run/persistence.js.map +1 -1
- package/dist/manager/topic/dependency.d.ts +24 -0
- package/dist/manager/topic/dependency.d.ts.map +1 -0
- package/dist/manager/topic/dependency.js +13 -0
- package/dist/manager/topic/dependency.js.map +1 -0
- package/dist/manager/topic/lifecycle.d.ts +9 -21
- package/dist/manager/topic/lifecycle.d.ts.map +1 -1
- package/dist/manager/topic/lifecycle.js +17 -29
- package/dist/manager/topic/lifecycle.js.map +1 -1
- package/dist/plugin/index.d.ts +1 -0
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js.map +1 -1
- package/dist/plugin/lifecycle.d.ts +15 -0
- package/dist/plugin/lifecycle.d.ts.map +1 -1
- package/dist/plugin/lifecycle.js +144 -38
- package/dist/plugin/lifecycle.js.map +1 -1
- package/dist/plugin/loader.d.ts +3 -3
- package/dist/plugin/loader.d.ts.map +1 -1
- package/dist/plugin/loader.js +58 -12
- package/dist/plugin/loader.js.map +1 -1
- package/dist/provider/collect-chat-completion.d.ts.map +1 -1
- package/dist/provider/collect-chat-completion.js +4 -0
- package/dist/provider/collect-chat-completion.js.map +1 -1
- package/dist/provider/fallback.d.ts +3 -1
- package/dist/provider/fallback.d.ts.map +1 -1
- package/dist/provider/fallback.js +62 -10
- package/dist/provider/fallback.js.map +1 -1
- package/dist/provider/idle-timeout.d.ts +4 -0
- package/dist/provider/idle-timeout.d.ts.map +1 -1
- package/dist/provider/idle-timeout.js +131 -15
- package/dist/provider/idle-timeout.js.map +1 -1
- package/dist/provider/index.d.ts +2 -0
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/provider/index.js +1 -0
- package/dist/provider/index.js.map +1 -1
- package/dist/provider/instrumentation.d.ts.map +1 -1
- package/dist/provider/instrumentation.js +1 -0
- package/dist/provider/instrumentation.js.map +1 -1
- package/dist/provider/retry.d.ts.map +1 -1
- package/dist/provider/retry.js +13 -1
- package/dist/provider/retry.js.map +1 -1
- package/dist/public-runtime.d.ts +57 -24
- package/dist/public-runtime.d.ts.map +1 -1
- package/dist/public-runtime.js +42 -35
- package/dist/public-runtime.js.map +1 -1
- package/dist/public-tools.d.ts +1 -0
- package/dist/public-tools.d.ts.map +1 -1
- package/dist/public-tools.js +5 -0
- package/dist/public-tools.js.map +1 -1
- package/dist/public-types.d.ts +33 -12
- package/dist/public-types.d.ts.map +1 -1
- package/dist/rag/embedding.d.ts +8 -3
- package/dist/rag/embedding.d.ts.map +1 -1
- package/dist/rag/embedding.js +120 -9
- package/dist/rag/embedding.js.map +1 -1
- package/dist/rag/index.d.ts +1 -1
- package/dist/rag/index.d.ts.map +1 -1
- package/dist/rag/index.js +1 -1
- package/dist/rag/index.js.map +1 -1
- package/dist/rag/ingestion.d.ts +2 -2
- package/dist/rag/ingestion.d.ts.map +1 -1
- package/dist/rag/ingestion.js +15 -3
- package/dist/rag/ingestion.js.map +1 -1
- package/dist/rag/knowledge-base.d.ts +3 -3
- package/dist/rag/knowledge-base.d.ts.map +1 -1
- package/dist/rag/knowledge-base.js +8 -4
- package/dist/rag/knowledge-base.js.map +1 -1
- package/dist/rag/operation.d.ts +10 -0
- package/dist/rag/operation.d.ts.map +1 -0
- package/dist/rag/operation.js +26 -0
- package/dist/rag/operation.js.map +1 -0
- package/dist/rag/rag-tool.d.ts.map +1 -1
- package/dist/rag/rag-tool.js +6 -3
- package/dist/rag/rag-tool.js.map +1 -1
- package/dist/rag/retriever.d.ts +2 -2
- package/dist/rag/retriever.d.ts.map +1 -1
- package/dist/rag/retriever.js +31 -15
- package/dist/rag/retriever.js.map +1 -1
- package/dist/rag/vector-store.d.ts +3 -3
- package/dist/rag/vector-store.d.ts.map +1 -1
- package/dist/rag/vector-store.js +4 -2
- package/dist/rag/vector-store.js.map +1 -1
- package/dist/registry/command/kernel-commands.d.ts +16 -4
- package/dist/registry/command/kernel-commands.d.ts.map +1 -1
- package/dist/registry/command/kernel-commands.js +171 -0
- package/dist/registry/command/kernel-commands.js.map +1 -1
- package/dist/run/reporter.d.ts.map +1 -1
- package/dist/run/reporter.js +9 -0
- package/dist/run/reporter.js.map +1 -1
- package/dist/run-query/index.d.ts +15 -1
- package/dist/run-query/index.d.ts.map +1 -1
- package/dist/run-query/index.js +69 -15
- package/dist/run-query/index.js.map +1 -1
- package/dist/runtime/query/context.d.ts.map +1 -1
- package/dist/runtime/query/context.js +10 -3
- package/dist/runtime/query/context.js.map +1 -1
- package/dist/runtime/query/executor.d.ts +3 -0
- package/dist/runtime/query/executor.d.ts.map +1 -1
- package/dist/runtime/query/executor.js +80 -18
- package/dist/runtime/query/executor.js.map +1 -1
- package/dist/runtime/query/guard.d.ts +9 -0
- package/dist/runtime/query/guard.d.ts.map +1 -1
- package/dist/runtime/query/guard.js +11 -0
- package/dist/runtime/query/guard.js.map +1 -1
- package/dist/runtime/query/index.d.ts +30 -1
- package/dist/runtime/query/index.d.ts.map +1 -1
- package/dist/runtime/query/index.js +548 -95
- package/dist/runtime/query/index.js.map +1 -1
- package/dist/runtime/query/iteration/index.d.ts.map +1 -1
- package/dist/runtime/query/iteration/index.js +74 -14
- package/dist/runtime/query/iteration/index.js.map +1 -1
- package/dist/runtime/query/iteration/phases/compaction.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/compaction.js +94 -53
- package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
- package/dist/runtime/query/iteration/phases/context.d.ts +3 -0
- package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/context.js.map +1 -1
- package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/tool-review.js +21 -0
- package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
- package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
- package/dist/runtime/query/iteration/stream-turn.js +4 -0
- package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
- package/dist/runtime/query/project-instructions.d.ts +69 -0
- package/dist/runtime/query/project-instructions.d.ts.map +1 -0
- package/dist/runtime/query/project-instructions.js +137 -0
- package/dist/runtime/query/project-instructions.js.map +1 -0
- package/dist/runtime/query/request-rich-content.d.ts +22 -0
- package/dist/runtime/query/request-rich-content.d.ts.map +1 -0
- package/dist/runtime/query/request-rich-content.js +122 -0
- package/dist/runtime/query/request-rich-content.js.map +1 -0
- package/dist/runtime/query/result.d.ts.map +1 -1
- package/dist/runtime/query/result.js +12 -1
- package/dist/runtime/query/result.js.map +1 -1
- package/dist/runtime/query/resume-pending.d.ts.map +1 -1
- package/dist/runtime/query/resume-pending.js +19 -20
- package/dist/runtime/query/resume-pending.js.map +1 -1
- package/dist/runtime/query/resume-run.d.ts.map +1 -1
- package/dist/runtime/query/resume-run.js +54 -8
- package/dist/runtime/query/resume-run.js.map +1 -1
- package/dist/runtime/query/run-state.d.ts +5 -0
- package/dist/runtime/query/run-state.d.ts.map +1 -1
- package/dist/runtime/query/run-state.js +6 -1
- package/dist/runtime/query/run-state.js.map +1 -1
- package/dist/runtime/query/sandbox-lifecycle.d.ts +54 -0
- package/dist/runtime/query/sandbox-lifecycle.d.ts.map +1 -0
- package/dist/runtime/query/sandbox-lifecycle.js +167 -0
- package/dist/runtime/query/sandbox-lifecycle.js.map +1 -0
- package/dist/sandbox/isolation.d.ts.map +1 -1
- package/dist/sandbox/isolation.js +9 -0
- package/dist/sandbox/isolation.js.map +1 -1
- package/dist/sandbox/provider/local.d.ts +56 -6
- package/dist/sandbox/provider/local.d.ts.map +1 -1
- package/dist/sandbox/provider/local.js +181 -76
- package/dist/sandbox/provider/local.js.map +1 -1
- package/dist/sandbox/terminal.d.ts +13 -5
- package/dist/sandbox/terminal.d.ts.map +1 -1
- package/dist/sandbox/terminal.js +11 -3
- package/dist/sandbox/terminal.js.map +1 -1
- package/dist/session/errors.d.ts +28 -29
- package/dist/session/errors.d.ts.map +1 -1
- package/dist/session/errors.js +28 -29
- package/dist/session/errors.js.map +1 -1
- package/dist/session/handoff/broadcast.d.ts +5 -8
- package/dist/session/handoff/broadcast.d.ts.map +1 -1
- package/dist/session/handoff/broadcast.js +16 -6
- package/dist/session/handoff/broadcast.js.map +1 -1
- package/dist/session/handoff/single.d.ts +5 -8
- package/dist/session/handoff/single.d.ts.map +1 -1
- package/dist/session/handoff/single.js +7 -4
- package/dist/session/handoff/single.js.map +1 -1
- package/dist/store/attachment/index.d.ts +11 -3
- package/dist/store/attachment/index.d.ts.map +1 -1
- package/dist/store/attachment/index.js +49 -4
- package/dist/store/attachment/index.js.map +1 -1
- package/dist/store/feedback/conformance.d.ts.map +1 -1
- package/dist/store/feedback/conformance.js +32 -0
- package/dist/store/feedback/conformance.js.map +1 -1
- package/dist/store/feedback/disk.d.ts +8 -6
- package/dist/store/feedback/disk.d.ts.map +1 -1
- package/dist/store/feedback/disk.js +111 -76
- package/dist/store/feedback/disk.js.map +1 -1
- package/dist/store/goal/index.d.ts +111 -0
- package/dist/store/goal/index.d.ts.map +1 -0
- package/dist/store/goal/index.js +436 -0
- package/dist/store/goal/index.js.map +1 -0
- package/dist/store/index.d.ts +1 -1
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +1 -1
- package/dist/store/index.js.map +1 -1
- package/dist/store/kv/revision-record-store.d.ts +70 -0
- package/dist/store/kv/revision-record-store.d.ts.map +1 -0
- package/dist/store/kv/revision-record-store.js +290 -0
- package/dist/store/kv/revision-record-store.js.map +1 -0
- package/dist/store/memory/disk.d.ts +9 -7
- package/dist/store/memory/disk.d.ts.map +1 -1
- package/dist/store/memory/disk.js +256 -98
- package/dist/store/memory/disk.js.map +1 -1
- package/dist/store/run/disk.d.ts +10 -2
- package/dist/store/run/disk.d.ts.map +1 -1
- package/dist/store/run/disk.js +70 -4
- package/dist/store/run/disk.js.map +1 -1
- package/dist/store/run/memory.d.ts +4 -2
- package/dist/store/run/memory.d.ts.map +1 -1
- package/dist/store/run/memory.js +15 -1
- package/dist/store/run/memory.js.map +1 -1
- package/dist/store/session/disk.d.ts +9 -0
- package/dist/store/session/disk.d.ts.map +1 -1
- package/dist/store/session/disk.js +57 -5
- package/dist/store/session/disk.js.map +1 -1
- package/dist/store/session/memory.d.ts +1 -0
- package/dist/store/session/memory.d.ts.map +1 -1
- package/dist/store/session/memory.js +14 -0
- package/dist/store/session/memory.js.map +1 -1
- package/dist/store/topic/memory.d.ts +1 -2
- package/dist/store/topic/memory.d.ts.map +1 -1
- package/dist/store/topic/memory.js +4 -5
- package/dist/store/topic/memory.js.map +1 -1
- package/dist/store/topic/objective.d.ts +8 -4
- package/dist/store/topic/objective.d.ts.map +1 -1
- package/dist/store/topic/objective.js +185 -100
- package/dist/store/topic/objective.js.map +1 -1
- package/dist/store/topic/state.d.ts +1 -2
- package/dist/store/topic/state.d.ts.map +1 -1
- package/dist/store/topic/state.js +50 -62
- package/dist/store/topic/state.js.map +1 -1
- package/dist/tools/builtins/bash.d.ts.map +1 -1
- package/dist/tools/builtins/bash.js +20 -0
- package/dist/tools/builtins/bash.js.map +1 -1
- package/dist/tools/builtins/computer-use.d.ts +9 -1
- package/dist/tools/builtins/computer-use.d.ts.map +1 -1
- package/dist/tools/builtins/computer-use.js.map +1 -1
- package/dist/tools/builtins/content-fingerprint.d.ts +8 -7
- package/dist/tools/builtins/content-fingerprint.d.ts.map +1 -1
- package/dist/tools/builtins/content-fingerprint.js +9 -10
- package/dist/tools/builtins/content-fingerprint.js.map +1 -1
- package/dist/tools/builtins/edit.d.ts +6 -1
- package/dist/tools/builtins/edit.d.ts.map +1 -1
- package/dist/tools/builtins/edit.js +166 -27
- package/dist/tools/builtins/edit.js.map +1 -1
- package/dist/tools/builtins/write-file.d.ts.map +1 -1
- package/dist/tools/builtins/write-file.js +45 -19
- package/dist/tools/builtins/write-file.js.map +1 -1
- package/dist/tools/command-arguments.d.ts +43 -0
- package/dist/tools/command-arguments.d.ts.map +1 -0
- package/dist/tools/command-arguments.js +52 -0
- package/dist/tools/command-arguments.js.map +1 -0
- package/dist/tools/coordinator/index.d.ts +2 -0
- package/dist/tools/coordinator/index.d.ts.map +1 -1
- package/dist/tools/coordinator/index.js +3 -1
- package/dist/tools/coordinator/index.js.map +1 -1
- package/dist/tools/defineTool.d.ts +10 -0
- package/dist/tools/defineTool.d.ts.map +1 -1
- package/dist/tools/defineTool.js +1 -0
- package/dist/tools/defineTool.js.map +1 -1
- package/dist/tools/env-scrub.d.ts +7 -5
- package/dist/tools/env-scrub.d.ts.map +1 -1
- package/dist/tools/env-scrub.js +7 -5
- package/dist/tools/env-scrub.js.map +1 -1
- package/dist/tools/goal/index.d.ts +20 -0
- package/dist/tools/goal/index.d.ts.map +1 -0
- package/dist/tools/goal/index.js +104 -0
- package/dist/tools/goal/index.js.map +1 -0
- package/dist/tools/memory/index.d.ts +16 -0
- package/dist/tools/memory/index.d.ts.map +1 -1
- package/dist/tools/memory/index.js +6 -2
- package/dist/tools/memory/index.js.map +1 -1
- package/dist/tools/memory/search.d.ts +4 -1
- package/dist/tools/memory/search.d.ts.map +1 -1
- package/dist/tools/memory/search.js +10 -2
- package/dist/tools/memory/search.js.map +1 -1
- package/dist/types/agent/base.d.ts +11 -3
- package/dist/types/agent/base.d.ts.map +1 -1
- package/dist/types/agent/factory.d.ts +2 -0
- package/dist/types/agent/factory.d.ts.map +1 -1
- package/dist/types/agent/reactive.d.ts +2 -0
- package/dist/types/agent/reactive.d.ts.map +1 -1
- package/dist/types/agent/supervisor.d.ts +6 -0
- package/dist/types/agent/supervisor.d.ts.map +1 -1
- package/dist/types/agent/task.d.ts +6 -2
- package/dist/types/agent/task.d.ts.map +1 -1
- package/dist/types/connector/core.d.ts +13 -8
- package/dist/types/connector/core.d.ts.map +1 -1
- package/dist/types/connector/definition.d.ts +37 -18
- package/dist/types/connector/definition.d.ts.map +1 -1
- package/dist/types/connector/http.d.ts +6 -0
- package/dist/types/connector/http.d.ts.map +1 -1
- package/dist/types/connector/mcp.d.ts +24 -6
- package/dist/types/connector/mcp.d.ts.map +1 -1
- package/dist/types/connector/tenant.d.ts +17 -7
- package/dist/types/connector/tenant.d.ts.map +1 -1
- package/dist/types/connector/webhook.d.ts +6 -0
- package/dist/types/connector/webhook.d.ts.map +1 -1
- package/dist/types/goal/index.d.ts +46 -0
- package/dist/types/goal/index.d.ts.map +1 -0
- package/dist/types/goal/index.js +2 -0
- package/dist/types/goal/index.js.map +1 -0
- package/dist/types/ids/index.d.ts +2 -0
- package/dist/types/ids/index.d.ts.map +1 -1
- package/dist/types/ids/index.js.map +1 -1
- package/dist/types/message/index.d.ts +79 -13
- package/dist/types/message/index.d.ts.map +1 -1
- package/dist/types/message/index.js +49 -3
- package/dist/types/message/index.js.map +1 -1
- package/dist/types/plugin/index.d.ts +7 -5
- package/dist/types/plugin/index.d.ts.map +1 -1
- package/dist/types/plugin/index.js.map +1 -1
- package/dist/types/provider/chat.d.ts +27 -4
- package/dist/types/provider/chat.d.ts.map +1 -1
- package/dist/types/provider/index.d.ts +1 -1
- package/dist/types/provider/index.d.ts.map +1 -1
- package/dist/types/provider/interface.d.ts +18 -7
- package/dist/types/provider/interface.d.ts.map +1 -1
- package/dist/types/provider/model.d.ts +12 -0
- package/dist/types/provider/model.d.ts.map +1 -1
- package/dist/types/provider/stream.d.ts +6 -0
- package/dist/types/provider/stream.d.ts.map +1 -1
- package/dist/types/rag/embedding.d.ts +15 -2
- package/dist/types/rag/embedding.d.ts.map +1 -1
- package/dist/types/rag/ingestion.d.ts +2 -2
- package/dist/types/rag/ingestion.d.ts.map +1 -1
- package/dist/types/rag/knowledge-base.d.ts +3 -3
- package/dist/types/rag/knowledge-base.d.ts.map +1 -1
- package/dist/types/rag/retrieval.d.ts +2 -2
- package/dist/types/rag/retrieval.d.ts.map +1 -1
- package/dist/types/rag/scope.d.ts +4 -0
- package/dist/types/rag/scope.d.ts.map +1 -1
- package/dist/types/rag/vector.d.ts +5 -2
- package/dist/types/rag/vector.d.ts.map +1 -1
- package/dist/types/run/config.d.ts +20 -0
- package/dist/types/run/config.d.ts.map +1 -1
- package/dist/types/run/events.d.ts +25 -1
- package/dist/types/run/events.d.ts.map +1 -1
- package/dist/types/run/events.js.map +1 -1
- package/dist/types/run/metadata.d.ts +2 -0
- package/dist/types/run/metadata.d.ts.map +1 -1
- package/dist/types/run/step.d.ts +2 -6
- package/dist/types/run/step.d.ts.map +1 -1
- package/dist/types/run/step.js.map +1 -1
- package/dist/types/run/store.d.ts +55 -2
- package/dist/types/run/store.d.ts.map +1 -1
- package/dist/types/sandbox/index.d.ts +47 -6
- package/dist/types/sandbox/index.d.ts.map +1 -1
- package/dist/types/sandbox/index.js +23 -10
- package/dist/types/sandbox/index.js.map +1 -1
- package/dist/types/session/store.d.ts +13 -0
- package/dist/types/session/store.d.ts.map +1 -1
- package/dist/types/tool/index.d.ts +33 -11
- package/dist/types/tool/index.d.ts.map +1 -1
- package/dist/types/tool/index.js.map +1 -1
- package/dist/types/topic/entity.d.ts +3 -4
- package/dist/types/topic/entity.d.ts.map +1 -1
- package/dist/types/topic/store.d.ts +3 -3
- package/dist/utils/id.d.ts +3 -1
- package/dist/utils/id.d.ts.map +1 -1
- package/dist/utils/id.js +4 -0
- package/dist/utils/id.js.map +1 -1
- package/dist/utils/process-environment.d.ts +26 -0
- package/dist/utils/process-environment.d.ts.map +1 -0
- package/dist/utils/process-environment.js +78 -0
- package/dist/utils/process-environment.js.map +1 -0
- package/dist/vault/InMemoryCredentialVault.d.ts +2 -0
- package/dist/vault/InMemoryCredentialVault.d.ts.map +1 -1
- package/dist/vault/InMemoryCredentialVault.js +24 -4
- package/dist/vault/InMemoryCredentialVault.js.map +1 -1
- package/dist/vault/instrumentation.d.ts.map +1 -1
- package/dist/vault/instrumentation.js +15 -0
- package/dist/vault/instrumentation.js.map +1 -1
- package/package.json +1 -1
- package/src/advisory/executor.ts +4 -1
- package/src/agents/ReactiveAgent.ts +12 -0
- package/src/agents/RouterAgent.ts +25 -3
- package/src/agents/SupervisorAgent.ts +33 -11
- package/src/agents/runAgent.ts +38 -2
- package/src/authorization/command-line.ts +390 -0
- package/src/authorization/rules.ts +22 -1
- package/src/bridge/a2a/client.ts +384 -97
- package/src/bridge/a2a/mapper.ts +5 -0
- package/src/bridge/acp/server.ts +184 -42
- package/src/bridge/mcp/connector/adapter.ts +28 -20
- package/src/bridge/sse/mapper.ts +3 -0
- package/src/compaction/dangling.ts +203 -38
- package/src/compaction/index.ts +9 -2
- package/src/compaction/manual.ts +125 -18
- package/src/compaction/plan.ts +42 -11
- package/src/compaction/retention.ts +23 -8
- package/src/compaction/summary.ts +4 -4
- package/src/compaction/verifier.ts +66 -0
- package/src/connector/BaseConnector.ts +19 -4
- package/src/connector/builtins/http.ts +236 -46
- package/src/connector/builtins/webhook.ts +207 -47
- package/src/connector/execution-contract.ts +27 -0
- package/src/connector/http-operation.ts +238 -0
- package/src/connector/mcp/adapter.ts +8 -3
- package/src/connector/mcp/client.ts +207 -58
- package/src/connector/mcp/http-sse.ts +91 -23
- package/src/connector/mcp/prompt-adapter.ts +8 -2
- package/src/connector/mcp/stdio.ts +21 -46
- package/src/connector/mcp/streamable-http.ts +86 -22
- package/src/connector/tools/adapter.ts +23 -14
- package/src/connector/tools/definitions.ts +5 -2
- package/src/connector/tools/result.ts +21 -0
- package/src/connector/web/guarded-fetch.ts +188 -48
- package/src/constants/sandbox/index.ts +3 -2
- package/src/contracts/api.ts +2 -0
- package/src/contracts/schemas.ts +7 -0
- package/src/directory/derive-supervisor.ts +8 -0
- package/src/directory/derive.ts +8 -0
- package/src/directory/load.ts +2 -0
- package/src/directory/types.ts +4 -0
- package/src/eval/experiment.ts +160 -111
- package/src/eval/judge.ts +13 -2
- package/src/eval/types.ts +7 -1
- package/src/manager/agent/lifecycle.ts +28 -12
- package/src/manager/connector/environment.ts +3 -1
- package/src/manager/connector/lifecycle.ts +364 -24
- package/src/manager/connector/tenant.ts +56 -23
- package/src/manager/goal/activation.ts +52 -0
- package/src/manager/index.ts +10 -2
- package/src/manager/run/persistence.ts +6 -1
- package/src/manager/topic/dependency.ts +39 -0
- package/src/manager/topic/lifecycle.ts +19 -31
- package/src/plugin/index.ts +1 -0
- package/src/plugin/lifecycle.ts +180 -39
- package/src/plugin/loader.ts +70 -13
- package/src/provider/collect-chat-completion.ts +3 -0
- package/src/provider/fallback.ts +79 -11
- package/src/provider/idle-timeout.ts +143 -17
- package/src/provider/index.ts +2 -0
- package/src/provider/instrumentation.ts +1 -0
- package/src/provider/retry.ts +16 -1
- package/src/public-runtime.ts +190 -32
- package/src/public-tools.ts +5 -0
- package/src/public-types.ts +85 -11
- package/src/rag/embedding.ts +147 -19
- package/src/rag/index.ts +1 -1
- package/src/rag/ingestion.ts +16 -2
- package/src/rag/knowledge-base.ts +13 -4
- package/src/rag/operation.ts +28 -0
- package/src/rag/rag-tool.ts +6 -3
- package/src/rag/retriever.ts +62 -11
- package/src/rag/vector-store.ts +8 -2
- package/src/registry/command/kernel-commands.ts +223 -4
- package/src/run/reporter.ts +10 -0
- package/src/run-query/index.ts +84 -15
- package/src/runtime/query/context.ts +13 -3
- package/src/runtime/query/executor.ts +90 -17
- package/src/runtime/query/guard.ts +12 -0
- package/src/runtime/query/index.ts +652 -103
- package/src/runtime/query/iteration/index.ts +89 -13
- package/src/runtime/query/iteration/phases/compaction.ts +120 -55
- package/src/runtime/query/iteration/phases/context.ts +4 -0
- package/src/runtime/query/iteration/phases/tool-review.ts +28 -0
- package/src/runtime/query/iteration/stream-turn.ts +3 -0
- package/src/runtime/query/project-instructions.ts +212 -0
- package/src/runtime/query/request-rich-content.ts +153 -0
- package/src/runtime/query/result.ts +12 -1
- package/src/runtime/query/resume-pending.ts +20 -18
- package/src/runtime/query/resume-run.ts +52 -8
- package/src/runtime/query/run-state.ts +11 -1
- package/src/runtime/query/sandbox-lifecycle.ts +210 -0
- package/src/sandbox/isolation.ts +9 -0
- package/src/sandbox/provider/local.ts +255 -90
- package/src/sandbox/terminal.ts +13 -5
- package/src/session/errors.ts +68 -42
- package/src/session/handoff/broadcast.ts +20 -14
- package/src/session/handoff/single.ts +14 -13
- package/src/store/attachment/index.ts +65 -3
- package/src/store/feedback/conformance.ts +39 -0
- package/src/store/feedback/disk.ts +128 -82
- package/src/store/goal/index.ts +594 -0
- package/src/store/index.ts +1 -1
- package/src/store/kv/revision-record-store.ts +346 -0
- package/src/store/memory/disk.ts +288 -113
- package/src/store/run/disk.ts +96 -5
- package/src/store/run/memory.ts +22 -2
- package/src/store/session/disk.ts +93 -6
- package/src/store/session/memory.ts +22 -0
- package/src/store/topic/memory.ts +4 -5
- package/src/store/topic/objective.ts +215 -100
- package/src/store/topic/state.ts +100 -63
- package/src/tools/builtins/bash.ts +21 -0
- package/src/tools/builtins/computer-use.ts +9 -1
- package/src/tools/builtins/content-fingerprint.ts +9 -12
- package/src/tools/builtins/edit.ts +190 -27
- package/src/tools/builtins/write-file.ts +55 -19
- package/src/tools/command-arguments.ts +54 -0
- package/src/tools/coordinator/index.ts +4 -1
- package/src/tools/defineTool.ts +11 -0
- package/src/tools/env-scrub.ts +7 -5
- package/src/tools/goal/index.ts +129 -0
- package/src/tools/memory/index.ts +26 -3
- package/src/tools/memory/search.ts +20 -3
- package/src/types/agent/base.ts +12 -3
- package/src/types/agent/factory.ts +2 -0
- package/src/types/agent/reactive.ts +2 -0
- package/src/types/agent/supervisor.ts +6 -0
- package/src/types/agent/task.ts +6 -2
- package/src/types/connector/core.ts +13 -8
- package/src/types/connector/definition.ts +54 -20
- package/src/types/connector/http.ts +7 -0
- package/src/types/connector/mcp.ts +27 -6
- package/src/types/connector/tenant.ts +21 -7
- package/src/types/connector/webhook.ts +7 -0
- package/src/types/goal/index.ts +50 -0
- package/src/types/ids/index.ts +2 -0
- package/src/types/message/index.ts +147 -12
- package/src/types/plugin/index.ts +7 -5
- package/src/types/provider/chat.ts +35 -4
- package/src/types/provider/index.ts +1 -1
- package/src/types/provider/interface.ts +22 -7
- package/src/types/provider/model.ts +13 -0
- package/src/types/provider/stream.ts +6 -0
- package/src/types/rag/embedding.ts +16 -2
- package/src/types/rag/ingestion.ts +2 -1
- package/src/types/rag/knowledge-base.ts +7 -3
- package/src/types/rag/retrieval.ts +2 -1
- package/src/types/rag/scope.ts +5 -0
- package/src/types/rag/vector.ts +5 -2
- package/src/types/run/config.ts +20 -0
- package/src/types/run/events.ts +28 -3
- package/src/types/run/metadata.ts +2 -0
- package/src/types/run/step.ts +2 -7
- package/src/types/run/store.ts +60 -2
- package/src/types/sandbox/index.ts +57 -14
- package/src/types/session/store.ts +18 -0
- package/src/types/tool/index.ts +33 -11
- package/src/types/topic/entity.ts +3 -4
- package/src/types/topic/store.ts +3 -3
- package/src/utils/id.ts +6 -0
- package/src/utils/process-environment.ts +101 -0
- package/src/vault/InMemoryCredentialVault.ts +29 -4
- package/src/vault/instrumentation.ts +24 -0
|
@@ -9,6 +9,7 @@ import type {
|
|
|
9
9
|
MCPLifecycleEvent,
|
|
10
10
|
MCPPromptDefinition,
|
|
11
11
|
MCPPromptMessage,
|
|
12
|
+
MCPRequestOptions,
|
|
12
13
|
MCPResource,
|
|
13
14
|
MCPResourceTemplate,
|
|
14
15
|
MCPServerCapabilities,
|
|
@@ -23,6 +24,7 @@ import { generateMCPClientId } from '../../utils/id.js'
|
|
|
23
24
|
import type { LogAttributes } from '../../utils/log/index.js'
|
|
24
25
|
import { SCOPE_ATTRIBUTE } from '../../utils/log/types.js'
|
|
25
26
|
import { type Logger, resolveLogger } from '../../utils/logger.js'
|
|
27
|
+
import { validateConnectorTimeoutMs } from '../http-operation.js'
|
|
26
28
|
import { HttpSseTransport } from './http-sse.js'
|
|
27
29
|
import { StdioTransport } from './stdio.js'
|
|
28
30
|
import { StreamableHttpTransport } from './streamable-http.js'
|
|
@@ -39,6 +41,9 @@ import { VERSION } from '../../version.js'
|
|
|
39
41
|
/** Runaway guard for a server whose cursor never ends. */
|
|
40
42
|
const MAX_LIST_PAGES = 100
|
|
41
43
|
|
|
44
|
+
/** A cancellation notification must never become the next unbounded wait. */
|
|
45
|
+
const CANCEL_NOTIFICATION_TIMEOUT_MS = 1_000
|
|
46
|
+
|
|
42
47
|
const NAMZU_CLIENT_INFO = { name: 'namzu-sdk', version: VERSION }
|
|
43
48
|
|
|
44
49
|
export class MCPClient {
|
|
@@ -53,18 +58,26 @@ export class MCPClient {
|
|
|
53
58
|
string | number,
|
|
54
59
|
{
|
|
55
60
|
resolve: (value: unknown) => void
|
|
56
|
-
reject: (reason:
|
|
61
|
+
reject: (reason: unknown) => void
|
|
62
|
+
abort: (reason: unknown) => void
|
|
57
63
|
}
|
|
58
64
|
>()
|
|
59
65
|
private nextRequestId = 1
|
|
60
66
|
private notificationHandlers: Array<(method: string, params?: Record<string, unknown>) => void> =
|
|
61
67
|
[]
|
|
62
68
|
private lifecycleListeners: MCPEventListener[] = []
|
|
69
|
+
/** Best-effort protocol cancellations still belong to this connection generation. */
|
|
70
|
+
private cancellationControllers = new Set<AbortController>()
|
|
63
71
|
private log: Logger
|
|
64
72
|
private readonly config: MCPClientConfig
|
|
73
|
+
private readonly requestTimeoutMs: number
|
|
65
74
|
|
|
66
75
|
constructor(config: MCPClientConfig) {
|
|
67
76
|
this.config = config
|
|
77
|
+
this.requestTimeoutMs = validateConnectorTimeoutMs(
|
|
78
|
+
config.requestTimeoutMs ?? DEFAULT_MCP_REQUEST_TIMEOUT_MS,
|
|
79
|
+
'MCPClient requestTimeoutMs',
|
|
80
|
+
)
|
|
68
81
|
this.id = config.id ?? generateMCPClientId()
|
|
69
82
|
// Built BEFORE the transport, not after: `createTransport` threads
|
|
70
83
|
// `this.log` into whichever transport it constructs (LOG-10), so the
|
|
@@ -87,12 +100,14 @@ export class MCPClient {
|
|
|
87
100
|
this.transport.onMessage((msg) => this.handleMessage(msg))
|
|
88
101
|
this.transport.onClose(() => {
|
|
89
102
|
this.status = 'disconnected'
|
|
103
|
+
this.abortCancellations(new Error('MCP transport closed'))
|
|
90
104
|
this.log.info('MCP transport closed')
|
|
91
105
|
this.emitLifecycle({ type: 'mcp_client_disconnected', clientId: this.id })
|
|
92
106
|
this.rejectAllPending(`MCP transport to "${this.config.serverName}" closed`)
|
|
93
107
|
})
|
|
94
108
|
this.transport.onError((err) => {
|
|
95
109
|
this.status = 'error'
|
|
110
|
+
this.abortCancellations(err)
|
|
96
111
|
this.error = err.message
|
|
97
112
|
this.log.error('MCP transport error', { 'exception.message': err.message })
|
|
98
113
|
this.emitLifecycle({ type: 'mcp_client_error', clientId: this.id, error: err.message })
|
|
@@ -153,6 +168,8 @@ export class MCPClient {
|
|
|
153
168
|
}
|
|
154
169
|
|
|
155
170
|
async disconnect(): Promise<void> {
|
|
171
|
+
const reason = new Error('MCPClient disconnecting')
|
|
172
|
+
this.abortCancellations(reason)
|
|
156
173
|
if (this.status === 'disconnected') return
|
|
157
174
|
|
|
158
175
|
this.rejectAllPending('MCPClient disconnecting')
|
|
@@ -180,28 +197,36 @@ export class MCPClient {
|
|
|
180
197
|
}
|
|
181
198
|
}
|
|
182
199
|
|
|
183
|
-
async listTools(): Promise<MCPToolDefinition[]> {
|
|
200
|
+
async listTools(options?: MCPRequestOptions): Promise<MCPToolDefinition[]> {
|
|
184
201
|
this.requireConnected()
|
|
185
|
-
return await this.listAllPages('tools/list', 'tools')
|
|
202
|
+
return await this.listAllPages('tools/list', 'tools', options)
|
|
186
203
|
}
|
|
187
204
|
|
|
188
|
-
async callTool(
|
|
205
|
+
async callTool(
|
|
206
|
+
name: string,
|
|
207
|
+
args?: Record<string, unknown>,
|
|
208
|
+
options?: MCPRequestOptions,
|
|
209
|
+
): Promise<MCPToolResult> {
|
|
189
210
|
this.requireConnected()
|
|
190
|
-
const result = (await this.request(
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
211
|
+
const result = (await this.request(
|
|
212
|
+
'tools/call',
|
|
213
|
+
{
|
|
214
|
+
name,
|
|
215
|
+
arguments: args ?? {},
|
|
216
|
+
},
|
|
217
|
+
options,
|
|
218
|
+
)) as MCPToolResult
|
|
194
219
|
return result
|
|
195
220
|
}
|
|
196
221
|
|
|
197
|
-
async listResources(): Promise<MCPResource[]> {
|
|
222
|
+
async listResources(options?: MCPRequestOptions): Promise<MCPResource[]> {
|
|
198
223
|
this.requireConnected()
|
|
199
|
-
return await this.listAllPages('resources/list', 'resources')
|
|
224
|
+
return await this.listAllPages('resources/list', 'resources', options)
|
|
200
225
|
}
|
|
201
226
|
|
|
202
|
-
async readResource(uri: string): Promise<MCPContentBlock[]> {
|
|
227
|
+
async readResource(uri: string, options?: MCPRequestOptions): Promise<MCPContentBlock[]> {
|
|
203
228
|
this.requireConnected()
|
|
204
|
-
const result = (await this.request('resources/read', { uri })) as {
|
|
229
|
+
const result = (await this.request('resources/read', { uri }, options)) as {
|
|
205
230
|
contents: MCPContentBlock[]
|
|
206
231
|
}
|
|
207
232
|
return result.contents
|
|
@@ -220,9 +245,9 @@ export class MCPClient {
|
|
|
220
245
|
* of it being generic: a server that pages its prompts does not get
|
|
221
246
|
* silently truncated to page one the way the tool list once was.
|
|
222
247
|
*/
|
|
223
|
-
async listPrompts(): Promise<MCPPromptDefinition[]> {
|
|
248
|
+
async listPrompts(options?: MCPRequestOptions): Promise<MCPPromptDefinition[]> {
|
|
224
249
|
this.requireConnected()
|
|
225
|
-
return await this.listAllPages('prompts/list', 'prompts')
|
|
250
|
+
return await this.listAllPages('prompts/list', 'prompts', options)
|
|
226
251
|
}
|
|
227
252
|
|
|
228
253
|
/**
|
|
@@ -237,21 +262,26 @@ export class MCPClient {
|
|
|
237
262
|
async getPrompt(
|
|
238
263
|
name: string,
|
|
239
264
|
args?: Record<string, string>,
|
|
265
|
+
options?: MCPRequestOptions,
|
|
240
266
|
): Promise<{ description?: string; messages: MCPPromptMessage[] }> {
|
|
241
267
|
this.requireConnected()
|
|
242
|
-
const result = (await this.request(
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
268
|
+
const result = (await this.request(
|
|
269
|
+
'prompts/get',
|
|
270
|
+
{
|
|
271
|
+
name,
|
|
272
|
+
arguments: args ?? {},
|
|
273
|
+
},
|
|
274
|
+
options,
|
|
275
|
+
)) as { description?: string; messages?: MCPPromptMessage[] }
|
|
246
276
|
return {
|
|
247
277
|
...(result.description !== undefined ? { description: result.description } : {}),
|
|
248
278
|
messages: result.messages ?? [],
|
|
249
279
|
}
|
|
250
280
|
}
|
|
251
281
|
|
|
252
|
-
async listResourceTemplates(): Promise<MCPResourceTemplate[]> {
|
|
282
|
+
async listResourceTemplates(options?: MCPRequestOptions): Promise<MCPResourceTemplate[]> {
|
|
253
283
|
this.requireConnected()
|
|
254
|
-
return await this.listAllPages('resources/templates/list', 'resourceTemplates')
|
|
284
|
+
return await this.listAllPages('resources/templates/list', 'resourceTemplates', options)
|
|
255
285
|
}
|
|
256
286
|
|
|
257
287
|
/**
|
|
@@ -271,15 +301,20 @@ export class MCPClient {
|
|
|
271
301
|
* until the process dies. Hitting it is loud, because a silently
|
|
272
302
|
* truncated catalogue is the failure being fixed here.
|
|
273
303
|
*/
|
|
274
|
-
private async listAllPages<T>(
|
|
304
|
+
private async listAllPages<T>(
|
|
305
|
+
method: string,
|
|
306
|
+
field: string,
|
|
307
|
+
options?: MCPRequestOptions,
|
|
308
|
+
): Promise<T[]> {
|
|
275
309
|
const items: T[] = []
|
|
276
310
|
let cursor: string | undefined
|
|
277
311
|
|
|
278
312
|
for (let page = 1; ; page++) {
|
|
279
|
-
const result = (await this.request(
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
313
|
+
const result = (await this.request(
|
|
314
|
+
method,
|
|
315
|
+
cursor === undefined ? {} : { cursor },
|
|
316
|
+
options,
|
|
317
|
+
)) as Record<string, unknown>
|
|
283
318
|
|
|
284
319
|
const batch = result[field]
|
|
285
320
|
if (Array.isArray(batch)) items.push(...(batch as T[]))
|
|
@@ -364,7 +399,13 @@ export class MCPClient {
|
|
|
364
399
|
* server hung the whole run with no error and no `run_failed`: not a
|
|
365
400
|
* crash, just a process that stopped.
|
|
366
401
|
*/
|
|
367
|
-
private
|
|
402
|
+
private request(
|
|
403
|
+
method: string,
|
|
404
|
+
params: Record<string, unknown>,
|
|
405
|
+
options?: MCPRequestOptions,
|
|
406
|
+
): Promise<unknown> {
|
|
407
|
+
// Refuse before allocating an id or asking the transport to do work.
|
|
408
|
+
options?.signal?.throwIfAborted()
|
|
368
409
|
const id = this.nextRequestId++
|
|
369
410
|
const message: MCPJsonRpcMessage = {
|
|
370
411
|
jsonrpc: '2.0',
|
|
@@ -372,40 +413,150 @@ export class MCPClient {
|
|
|
372
413
|
method,
|
|
373
414
|
params,
|
|
374
415
|
}
|
|
375
|
-
const
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
416
|
+
const transportController = new AbortController()
|
|
417
|
+
let issued = false
|
|
418
|
+
let settled = false
|
|
419
|
+
let resolvePublic!: (value: unknown) => void
|
|
420
|
+
let rejectPublic!: (reason: unknown) => void
|
|
421
|
+
const result = new Promise<unknown>((resolve, reject) => {
|
|
422
|
+
resolvePublic = resolve
|
|
423
|
+
rejectPublic = reject
|
|
424
|
+
})
|
|
425
|
+
|
|
426
|
+
type Terminal = 'response' | 'failure' | 'caller' | 'timeout' | 'transport_closed'
|
|
427
|
+
const entry = {
|
|
428
|
+
resolve: (value: unknown) => settle('response', value),
|
|
429
|
+
reject: (reason: unknown) => settle('failure', reason),
|
|
430
|
+
abort: (reason: unknown) => settle('transport_closed', reason),
|
|
431
|
+
}
|
|
432
|
+
const onCallerAbort = (): void => {
|
|
433
|
+
settle('caller', options?.signal?.reason)
|
|
434
|
+
}
|
|
435
|
+
const cleanup = (): void => {
|
|
436
|
+
clearTimeout(timer)
|
|
437
|
+
options?.signal?.removeEventListener('abort', onCallerAbort)
|
|
438
|
+
if (this.pendingRequests.get(id) === entry) this.pendingRequests.delete(id)
|
|
439
|
+
}
|
|
440
|
+
const settle = (terminal: Terminal, value: unknown): boolean => {
|
|
441
|
+
if (settled) return false
|
|
442
|
+
settled = true
|
|
443
|
+
// The terminal winner owns cleanup synchronously. In particular, a
|
|
444
|
+
// response delivered from inside transport.send removes the abort
|
|
445
|
+
// listener before that same send call can observe a later abort.
|
|
446
|
+
cleanup()
|
|
447
|
+
|
|
448
|
+
if (terminal === 'response') {
|
|
449
|
+
resolvePublic(value)
|
|
450
|
+
return true
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
rejectPublic(value)
|
|
454
|
+
if (terminal === 'caller' || terminal === 'timeout' || terminal === 'transport_closed') {
|
|
455
|
+
// Latch public settlement before aborting transport. An abort listener
|
|
456
|
+
// may synchronously reject send() with a generic AbortError; it no
|
|
457
|
+
// longer owns this request and cannot replace the first cause.
|
|
458
|
+
transportController.abort(value)
|
|
459
|
+
}
|
|
460
|
+
if (issued && method !== 'initialize' && (terminal === 'caller' || terminal === 'timeout')) {
|
|
461
|
+
this.sendCancellation(
|
|
462
|
+
id,
|
|
463
|
+
terminal === 'caller' ? 'Caller cancelled request' : 'Request deadline expired',
|
|
389
464
|
)
|
|
390
|
-
}
|
|
465
|
+
}
|
|
466
|
+
return true
|
|
467
|
+
}
|
|
468
|
+
const settleSendFailure = (reason: unknown): void => {
|
|
469
|
+
// An HTTP transport may have a deliberately shorter deadline than
|
|
470
|
+
// the JSON-RPC round-trip deadline. It is still a request timeout:
|
|
471
|
+
// the peer may be working after this local POST wait ended, so the
|
|
472
|
+
// correlated protocol cancellation remains required.
|
|
473
|
+
if (reason instanceof Error && reason.name === 'TimeoutError') {
|
|
474
|
+
settle('timeout', reason)
|
|
475
|
+
return
|
|
476
|
+
}
|
|
477
|
+
entry.reject(reason)
|
|
478
|
+
}
|
|
391
479
|
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
480
|
+
this.pendingRequests.set(id, entry)
|
|
481
|
+
const timer = setTimeout(() => {
|
|
482
|
+
const error = new Error(
|
|
483
|
+
`MCP request "${method}" to "${this.config.serverName}" timed out after ${this.requestTimeoutMs}ms`,
|
|
484
|
+
)
|
|
485
|
+
error.name = 'TimeoutError'
|
|
486
|
+
this.log.warn('MCP request timed out', {
|
|
487
|
+
'namzu.connector.server': this.config.serverName,
|
|
488
|
+
'namzu.connector.method': method,
|
|
489
|
+
'namzu.connector.timeout_ms': this.requestTimeoutMs,
|
|
490
|
+
})
|
|
491
|
+
settle('timeout', error)
|
|
492
|
+
}, this.requestTimeoutMs)
|
|
493
|
+
options?.signal?.addEventListener('abort', onCallerAbort, { once: true })
|
|
494
|
+
// AbortSignal events are not replayed. This closes the listener-install
|
|
495
|
+
// race before the request is issued.
|
|
496
|
+
if (options?.signal?.aborted) {
|
|
497
|
+
onCallerAbort()
|
|
498
|
+
return result
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
try {
|
|
502
|
+
issued = true
|
|
503
|
+
const sending = this.transport.send(message, {
|
|
504
|
+
signal: transportController.signal,
|
|
401
505
|
})
|
|
506
|
+
void sending.catch((err) => {
|
|
507
|
+
settleSendFailure(err)
|
|
508
|
+
})
|
|
509
|
+
} catch (err) {
|
|
510
|
+
settleSendFailure(err)
|
|
511
|
+
}
|
|
402
512
|
|
|
403
|
-
|
|
513
|
+
return result
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
/** Ask the peer to stop without letting cleanup become another hanging request. */
|
|
517
|
+
private sendCancellation(id: string | number, reason: string): void {
|
|
518
|
+
const controller = new AbortController()
|
|
519
|
+
this.cancellationControllers.add(controller)
|
|
520
|
+
const timer = setTimeout(() => {
|
|
521
|
+
const error = new Error('MCP cancellation notification timed out')
|
|
522
|
+
error.name = 'TimeoutError'
|
|
523
|
+
controller.abort(error)
|
|
524
|
+
this.cancellationControllers.delete(controller)
|
|
525
|
+
}, CANCEL_NOTIFICATION_TIMEOUT_MS)
|
|
526
|
+
timer.unref?.()
|
|
527
|
+
let sending: Promise<void>
|
|
528
|
+
try {
|
|
529
|
+
sending = this.transport.send(
|
|
530
|
+
{
|
|
531
|
+
jsonrpc: '2.0',
|
|
532
|
+
method: 'notifications/cancelled',
|
|
533
|
+
params: { requestId: id, reason },
|
|
534
|
+
},
|
|
535
|
+
{ signal: controller.signal },
|
|
536
|
+
)
|
|
537
|
+
} catch (err) {
|
|
538
|
+
clearTimeout(timer)
|
|
539
|
+
this.cancellationControllers.delete(controller)
|
|
540
|
+
this.log.debug('Failed to send MCP cancellation notification', {
|
|
541
|
+
'exception.message': toErrorMessage(err),
|
|
542
|
+
})
|
|
543
|
+
return
|
|
544
|
+
}
|
|
545
|
+
void sending
|
|
546
|
+
.catch((err) => {
|
|
547
|
+
this.log.debug('Failed to send MCP cancellation notification', {
|
|
548
|
+
'exception.message': toErrorMessage(err),
|
|
549
|
+
})
|
|
550
|
+
})
|
|
551
|
+
.finally(() => {
|
|
404
552
|
clearTimeout(timer)
|
|
405
|
-
this.
|
|
406
|
-
reject(err)
|
|
553
|
+
this.cancellationControllers.delete(controller)
|
|
407
554
|
})
|
|
408
|
-
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
private abortCancellations(reason: unknown): void {
|
|
558
|
+
for (const controller of this.cancellationControllers) controller.abort(reason)
|
|
559
|
+
this.cancellationControllers.clear()
|
|
409
560
|
}
|
|
410
561
|
|
|
411
562
|
/**
|
|
@@ -422,10 +573,9 @@ export class MCPClient {
|
|
|
422
573
|
'namzu.connector.count': this.pendingRequests.size,
|
|
423
574
|
'namzu.connector.reason': reason,
|
|
424
575
|
})
|
|
425
|
-
for (const
|
|
426
|
-
pending.
|
|
576
|
+
for (const pending of [...this.pendingRequests.values()]) {
|
|
577
|
+
pending.abort(new Error(reason))
|
|
427
578
|
}
|
|
428
|
-
this.pendingRequests.clear()
|
|
429
579
|
}
|
|
430
580
|
|
|
431
581
|
private async notify(method: string, params: Record<string, unknown>): Promise<void> {
|
|
@@ -441,7 +591,6 @@ export class MCPClient {
|
|
|
441
591
|
if (message.id !== undefined) {
|
|
442
592
|
const pending = this.pendingRequests.get(message.id)
|
|
443
593
|
if (pending) {
|
|
444
|
-
this.pendingRequests.delete(message.id)
|
|
445
594
|
if (message.error) {
|
|
446
595
|
pending.reject(new Error(`MCP error ${message.error.code}: ${message.error.message}`))
|
|
447
596
|
} else {
|
|
@@ -2,9 +2,13 @@ import type {
|
|
|
2
2
|
MCPHttpSseTransportConfig,
|
|
3
3
|
MCPJsonRpcMessage,
|
|
4
4
|
MCPTransport,
|
|
5
|
+
MCPTransportSendOptions,
|
|
5
6
|
} from '../../types/connector/index.js'
|
|
6
7
|
import { SCOPE_ATTRIBUTE } from '../../utils/log/types.js'
|
|
7
8
|
import { type Logger, resolveLogger } from '../../utils/logger.js'
|
|
9
|
+
import { ConnectorHttpOperation, validateConnectorTimeoutMs } from '../http-operation.js'
|
|
10
|
+
|
|
11
|
+
const DEFAULT_TIMEOUT_MS = 30_000
|
|
8
12
|
|
|
9
13
|
/**
|
|
10
14
|
* Trim trailing slashes without a regex.
|
|
@@ -27,9 +31,12 @@ export class HttpSseTransport implements MCPTransport {
|
|
|
27
31
|
private errorHandlers: Array<(error: Error) => void> = []
|
|
28
32
|
private connected = false
|
|
29
33
|
private abortController: AbortController | null = null
|
|
34
|
+
private generation = 0
|
|
35
|
+
private activeSends = new Set<AbortController>()
|
|
30
36
|
private sseUrl: string
|
|
31
37
|
private postUrl: string
|
|
32
38
|
private log: Logger
|
|
39
|
+
private readonly timeoutMs: number
|
|
33
40
|
|
|
34
41
|
constructor(
|
|
35
42
|
private readonly config: MCPHttpSseTransportConfig,
|
|
@@ -38,6 +45,10 @@ export class HttpSseTransport implements MCPTransport {
|
|
|
38
45
|
const base = stripTrailingSlashes(config.url)
|
|
39
46
|
this.sseUrl = `${base}/sse`
|
|
40
47
|
this.postUrl = `${base}/message`
|
|
48
|
+
this.timeoutMs = validateConnectorTimeoutMs(
|
|
49
|
+
config.timeoutMs ?? DEFAULT_TIMEOUT_MS,
|
|
50
|
+
'HttpSseTransport timeoutMs',
|
|
51
|
+
)
|
|
41
52
|
this.log = resolveLogger(log).child({ [SCOPE_ATTRIBUTE]: 'connector/mcp/http-sse' })
|
|
42
53
|
}
|
|
43
54
|
|
|
@@ -45,13 +56,18 @@ export class HttpSseTransport implements MCPTransport {
|
|
|
45
56
|
if (this.connected) return
|
|
46
57
|
|
|
47
58
|
this.abortController = new AbortController()
|
|
48
|
-
|
|
59
|
+
const generation = ++this.generation
|
|
49
60
|
this.connected = true
|
|
61
|
+
await this.startSSE(generation, this.abortController.signal)
|
|
50
62
|
this.log.info('HttpSseTransport connected', { 'namzu.mcp.url': this.config.url })
|
|
51
63
|
}
|
|
52
64
|
|
|
53
65
|
async close(): Promise<void> {
|
|
54
66
|
this.connected = false
|
|
67
|
+
this.generation++
|
|
68
|
+
const reason = new Error('HttpSseTransport closed')
|
|
69
|
+
for (const controller of this.activeSends) controller.abort(reason)
|
|
70
|
+
this.activeSends.clear()
|
|
55
71
|
this.abortController?.abort()
|
|
56
72
|
this.abortController = null
|
|
57
73
|
for (const handler of this.closeHandlers) handler()
|
|
@@ -74,24 +90,30 @@ export class HttpSseTransport implements MCPTransport {
|
|
|
74
90
|
this.errorHandlers = []
|
|
75
91
|
}
|
|
76
92
|
|
|
77
|
-
async send(message: MCPJsonRpcMessage): Promise<void> {
|
|
93
|
+
async send(message: MCPJsonRpcMessage, options?: MCPTransportSendOptions): Promise<void> {
|
|
78
94
|
if (!this.connected) {
|
|
79
95
|
throw new Error('HttpSseTransport: not connected')
|
|
80
96
|
}
|
|
81
97
|
|
|
82
|
-
const
|
|
83
|
-
const
|
|
98
|
+
const owned = this.beginSend(options?.signal)
|
|
99
|
+
const operation = new ConnectorHttpOperation(
|
|
100
|
+
owned.controller.signal,
|
|
101
|
+
this.timeoutMs,
|
|
102
|
+
'HTTP-SSE MCP send',
|
|
103
|
+
)
|
|
84
104
|
|
|
85
105
|
try {
|
|
86
|
-
const response = await
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
106
|
+
const response = await operation.run(() =>
|
|
107
|
+
fetch(this.postUrl, {
|
|
108
|
+
method: 'POST',
|
|
109
|
+
headers: {
|
|
110
|
+
'Content-Type': 'application/json',
|
|
111
|
+
...this.config.headers,
|
|
112
|
+
},
|
|
113
|
+
body: JSON.stringify(message),
|
|
114
|
+
signal: operation.signal,
|
|
115
|
+
}),
|
|
116
|
+
)
|
|
95
117
|
|
|
96
118
|
if (!response.ok) {
|
|
97
119
|
throw new Error(`HTTP ${response.status}: ${response.statusText}`)
|
|
@@ -99,11 +121,16 @@ export class HttpSseTransport implements MCPTransport {
|
|
|
99
121
|
|
|
100
122
|
const contentType = response.headers.get('content-type') ?? ''
|
|
101
123
|
if (contentType.includes('application/json')) {
|
|
102
|
-
const body = (await response.json()) as MCPJsonRpcMessage
|
|
103
|
-
|
|
124
|
+
const body = (await operation.run(() => response.json())) as MCPJsonRpcMessage
|
|
125
|
+
this.assertCurrent(owned.generation, operation)
|
|
126
|
+
for (const handler of [...this.messageHandlers]) {
|
|
127
|
+
this.assertCurrent(owned.generation, operation)
|
|
128
|
+
handler(body)
|
|
129
|
+
}
|
|
104
130
|
}
|
|
105
131
|
} finally {
|
|
106
|
-
|
|
132
|
+
operation.close()
|
|
133
|
+
owned.dispose()
|
|
107
134
|
}
|
|
108
135
|
}
|
|
109
136
|
|
|
@@ -123,9 +150,45 @@ export class HttpSseTransport implements MCPTransport {
|
|
|
123
150
|
return this.connected
|
|
124
151
|
}
|
|
125
152
|
|
|
126
|
-
private
|
|
127
|
-
|
|
128
|
-
|
|
153
|
+
private beginSend(signal: AbortSignal | undefined): {
|
|
154
|
+
readonly controller: AbortController
|
|
155
|
+
readonly generation: number
|
|
156
|
+
dispose(): void
|
|
157
|
+
} {
|
|
158
|
+
signal?.throwIfAborted()
|
|
159
|
+
const controller = new AbortController()
|
|
160
|
+
const onAbort = (): void => controller.abort(signal?.reason)
|
|
161
|
+
signal?.addEventListener('abort', onAbort, { once: true })
|
|
162
|
+
if (signal?.aborted) onAbort()
|
|
163
|
+
if (controller.signal.aborted) {
|
|
164
|
+
signal?.removeEventListener('abort', onAbort)
|
|
165
|
+
controller.signal.throwIfAborted()
|
|
166
|
+
}
|
|
167
|
+
this.activeSends.add(controller)
|
|
168
|
+
return {
|
|
169
|
+
controller,
|
|
170
|
+
generation: this.generation,
|
|
171
|
+
dispose: () => {
|
|
172
|
+
signal?.removeEventListener('abort', onAbort)
|
|
173
|
+
this.activeSends.delete(controller)
|
|
174
|
+
},
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
private assertCurrent(generation: number, operation: ConnectorHttpOperation): void {
|
|
179
|
+
operation.throwIfStopped()
|
|
180
|
+
if (!this.connected || generation !== this.generation) {
|
|
181
|
+
throw new Error('HTTP-SSE MCP response belongs to a closed connection generation')
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
private isCurrent(generation: number): boolean {
|
|
186
|
+
return this.connected && generation === this.generation
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
private async startSSE(generation: number, signal: AbortSignal): Promise<void> {
|
|
190
|
+
this.listenSSE(generation, signal).catch((err) => {
|
|
191
|
+
if (this.connected && generation === this.generation) {
|
|
129
192
|
this.log.error('SSE stream error', { 'exception.message': String(err) })
|
|
130
193
|
for (const handler of this.errorHandlers)
|
|
131
194
|
handler(err instanceof Error ? err : new Error(String(err)))
|
|
@@ -133,13 +196,13 @@ export class HttpSseTransport implements MCPTransport {
|
|
|
133
196
|
})
|
|
134
197
|
}
|
|
135
198
|
|
|
136
|
-
private async listenSSE(): Promise<void> {
|
|
199
|
+
private async listenSSE(generation: number, signal: AbortSignal): Promise<void> {
|
|
137
200
|
const response = await fetch(this.sseUrl, {
|
|
138
201
|
headers: {
|
|
139
202
|
Accept: 'text/event-stream',
|
|
140
203
|
...this.config.headers,
|
|
141
204
|
},
|
|
142
|
-
signal
|
|
205
|
+
signal,
|
|
143
206
|
})
|
|
144
207
|
|
|
145
208
|
if (!response.ok || !response.body) {
|
|
@@ -150,21 +213,26 @@ export class HttpSseTransport implements MCPTransport {
|
|
|
150
213
|
const decoder = new TextDecoder()
|
|
151
214
|
let buffer = ''
|
|
152
215
|
|
|
153
|
-
while (this.
|
|
216
|
+
while (this.isCurrent(generation)) {
|
|
154
217
|
const { done, value } = await reader.read()
|
|
155
218
|
if (done) break
|
|
219
|
+
if (!this.isCurrent(generation)) break
|
|
156
220
|
|
|
157
221
|
buffer += decoder.decode(value, { stream: true })
|
|
158
222
|
const events = buffer.split('\n\n')
|
|
159
223
|
buffer = events.pop() ?? ''
|
|
160
224
|
|
|
161
225
|
for (const event of events) {
|
|
226
|
+
if (!this.isCurrent(generation)) return
|
|
162
227
|
const dataLine = event.split('\n').find((line) => line.startsWith('data: '))
|
|
163
228
|
if (!dataLine) continue
|
|
164
229
|
const data = dataLine.slice(6)
|
|
165
230
|
try {
|
|
166
231
|
const message = JSON.parse(data) as MCPJsonRpcMessage
|
|
167
|
-
for (const handler of this.messageHandlers)
|
|
232
|
+
for (const handler of [...this.messageHandlers]) {
|
|
233
|
+
if (!this.isCurrent(generation)) return
|
|
234
|
+
handler(message)
|
|
235
|
+
}
|
|
168
236
|
} catch {
|
|
169
237
|
this.log.warn('HttpSseTransport: invalid SSE data', {
|
|
170
238
|
'namzu.mcp.data_head': data.slice(0, 100),
|
|
@@ -123,10 +123,12 @@ export function mcpPromptToToolDefinition(
|
|
|
123
123
|
isDestructive: () => false,
|
|
124
124
|
isConcurrencySafe: () => true,
|
|
125
125
|
|
|
126
|
-
async execute(input: unknown,
|
|
126
|
+
async execute(input: unknown, context: ToolContext): Promise<ToolResult> {
|
|
127
127
|
const args = (input ?? {}) as Record<string, string>
|
|
128
128
|
try {
|
|
129
|
-
const result = await client.getPrompt(prompt.name, args
|
|
129
|
+
const result = await client.getPrompt(prompt.name, args, {
|
|
130
|
+
signal: context.abortSignal,
|
|
131
|
+
})
|
|
130
132
|
return {
|
|
131
133
|
success: true,
|
|
132
134
|
output: renderPromptMessages(
|
|
@@ -137,6 +139,10 @@ export function mcpPromptToToolDefinition(
|
|
|
137
139
|
),
|
|
138
140
|
}
|
|
139
141
|
} catch (err) {
|
|
142
|
+
// Cancellation belongs to the run, not to the remote prompt. Turning
|
|
143
|
+
// it into an ordinary failed tool result would let the executor treat
|
|
144
|
+
// a withdrawn operation as one the model may route around.
|
|
145
|
+
if (context.abortSignal?.aborted) throw context.abortSignal.reason
|
|
140
146
|
// Returned to the MODEL rather than thrown. A prompt that
|
|
141
147
|
// cannot be fetched — a server that went away, an argument it
|
|
142
148
|
// rejected — is something the agent can work around, and
|