@namzu/sdk 30.2.0 → 31.0.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 +556 -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 +75 -10
- 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/interface.d.ts +18 -7
- package/dist/types/provider/interface.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 +143 -9
- package/src/types/plugin/index.ts +7 -5
- package/src/types/provider/chat.ts +35 -4
- package/src/types/provider/interface.ts +22 -7
- 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
|
@@ -1,13 +1,21 @@
|
|
|
1
1
|
import type { BaseConnector } from '../../connector/BaseConnector.js'
|
|
2
|
+
import { managedConnectorOptions } from '../../connector/execution-contract.js'
|
|
2
3
|
import type { ConnectorRegistry } from '../../registry/connector/definitions.js'
|
|
4
|
+
import { renderToolSchema } from '../../registry/tool/schema.js'
|
|
3
5
|
import type {
|
|
6
|
+
AuthConfig,
|
|
7
|
+
AuthType,
|
|
4
8
|
ConnectorConfig,
|
|
9
|
+
ConnectorDefinition,
|
|
5
10
|
ConnectorEventListener,
|
|
6
11
|
ConnectorExecuteParams,
|
|
7
12
|
ConnectorExecuteResult,
|
|
8
13
|
ConnectorInstance,
|
|
9
14
|
ConnectorLifecycleEvent,
|
|
15
|
+
ConnectorMethod,
|
|
16
|
+
ConnectorOperationOptions,
|
|
10
17
|
ConnectorStatus,
|
|
18
|
+
ConnectorTrigger,
|
|
11
19
|
} from '../../types/connector/index.js'
|
|
12
20
|
import type { ConnectorId, ConnectorInstanceId } from '../../types/ids/index.js'
|
|
13
21
|
import { toErrorMessage } from '../../utils/error.js'
|
|
@@ -28,16 +36,159 @@ export interface ConnectorManagerConfig {
|
|
|
28
36
|
log?: Logger
|
|
29
37
|
}
|
|
30
38
|
|
|
39
|
+
type Settled<T> = { kind: 'fulfilled'; value: T } | { kind: 'rejected'; reason: unknown }
|
|
40
|
+
|
|
41
|
+
interface InstanceAdmission {
|
|
42
|
+
readonly connectorId: ConnectorId
|
|
43
|
+
readonly definition: ConnectorDefinition
|
|
44
|
+
readonly supportedAuth?: ReadonlySet<AuthType>
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function copyAuth(auth: AuthConfig): AuthConfig {
|
|
48
|
+
return {
|
|
49
|
+
type: auth.type,
|
|
50
|
+
...(auth.credentials ? { credentials: { ...auth.credentials } } : {}),
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function sameAuthPolicy(
|
|
55
|
+
registered: readonly AuthType[] | undefined,
|
|
56
|
+
implementation: readonly AuthType[] | undefined,
|
|
57
|
+
): boolean {
|
|
58
|
+
if (registered === undefined || implementation === undefined) {
|
|
59
|
+
return registered === implementation
|
|
60
|
+
}
|
|
61
|
+
const expected = new Set(registered)
|
|
62
|
+
const actual = new Set(implementation)
|
|
63
|
+
return expected.size === actual.size && [...expected].every((authType) => actual.has(authType))
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function sameMethodSurface(
|
|
67
|
+
registered: readonly ConnectorMethod[],
|
|
68
|
+
implementation: readonly ConnectorMethod[],
|
|
69
|
+
): boolean {
|
|
70
|
+
const expected = new Set(registered.map((method) => method.name))
|
|
71
|
+
const actual = new Set(implementation.map((method) => method.name))
|
|
72
|
+
return (
|
|
73
|
+
expected.size === registered.length &&
|
|
74
|
+
actual.size === implementation.length &&
|
|
75
|
+
expected.size === actual.size &&
|
|
76
|
+
[...expected].every((name) => actual.has(name))
|
|
77
|
+
)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function copyMethod(method: ConnectorMethod): ConnectorMethod {
|
|
81
|
+
return { ...method }
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function copyTrigger(trigger: ConnectorTrigger): ConnectorTrigger {
|
|
85
|
+
return { ...trigger }
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function copyDefinition(definition: ConnectorDefinition): ConnectorDefinition {
|
|
89
|
+
return {
|
|
90
|
+
...definition,
|
|
91
|
+
...(definition.supportedAuth ? { supportedAuth: [...definition.supportedAuth] } : {}),
|
|
92
|
+
methods: definition.methods.map(copyMethod),
|
|
93
|
+
...(definition.triggers ? { triggers: definition.triggers.map(copyTrigger) } : {}),
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function assertMethodSchemas(definition: ConnectorDefinition): void {
|
|
98
|
+
for (const method of definition.methods) {
|
|
99
|
+
try {
|
|
100
|
+
renderToolSchema(method.inputSchema)
|
|
101
|
+
if (method.outputSchema) renderToolSchema(method.outputSchema)
|
|
102
|
+
} catch (err) {
|
|
103
|
+
throw new Error(
|
|
104
|
+
`Connector method "${method.name}" on "${definition.id}" has a schema that cannot be projected: ${toErrorMessage(err)}`,
|
|
105
|
+
)
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function formatSchemaIssues(issues: readonly { path: PropertyKey[]; message: string }[]): string {
|
|
111
|
+
return issues.map((issue) => `${issue.path.join('.') || '(root)'}: ${issue.message}`).join('; ')
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function formatOutputSchemaIssues(
|
|
115
|
+
issues: readonly { path: PropertyKey[]; code: string }[],
|
|
116
|
+
): string {
|
|
117
|
+
return issues.map((issue) => `${issue.path.join('.') || '(root)'}: ${issue.code}`).join('; ')
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function notStartedFailure(error: string): ConnectorExecuteResult {
|
|
121
|
+
return {
|
|
122
|
+
success: false,
|
|
123
|
+
output: null,
|
|
124
|
+
error,
|
|
125
|
+
durationMs: 0,
|
|
126
|
+
metadata: { remoteOutcome: 'not_started', retrySafety: 'safe' },
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
async function settleWithSignal<T>(
|
|
131
|
+
operation: Promise<T>,
|
|
132
|
+
signal: AbortSignal | undefined,
|
|
133
|
+
acceptAfterAbort?: (value: T) => boolean,
|
|
134
|
+
): Promise<T> {
|
|
135
|
+
if (!signal) return operation
|
|
136
|
+
const settled: Promise<Settled<T>> = operation.then(
|
|
137
|
+
(value) => ({ kind: 'fulfilled', value }),
|
|
138
|
+
(reason) => ({ kind: 'rejected', reason }),
|
|
139
|
+
)
|
|
140
|
+
let onAbort: (() => void) | undefined
|
|
141
|
+
const aborted = new Promise<{ kind: 'aborted' }>((resolve) => {
|
|
142
|
+
onAbort = () => resolve({ kind: 'aborted' })
|
|
143
|
+
if (signal.aborted) {
|
|
144
|
+
onAbort()
|
|
145
|
+
return
|
|
146
|
+
}
|
|
147
|
+
signal.addEventListener('abort', onAbort, { once: true })
|
|
148
|
+
})
|
|
149
|
+
|
|
150
|
+
try {
|
|
151
|
+
const winner = await Promise.race([settled, aborted])
|
|
152
|
+
if (winner.kind !== 'aborted') {
|
|
153
|
+
if (winner.kind === 'rejected') throw winner.reason
|
|
154
|
+
if (signal.aborted && !acceptAfterAbort?.(winner.value)) throw signal.reason
|
|
155
|
+
return winner.value
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// A cooperative connector can preserve richer phase information (for
|
|
159
|
+
// example response headers received but body unavailable). Give its abort
|
|
160
|
+
// continuation one event-loop turn before abandoning an uncooperative
|
|
161
|
+
// custom connector with the caller's reason.
|
|
162
|
+
let timer: ReturnType<typeof setTimeout> | undefined
|
|
163
|
+
const grace = await Promise.race([
|
|
164
|
+
settled,
|
|
165
|
+
new Promise<{ kind: 'grace_elapsed' }>((resolve) => {
|
|
166
|
+
timer = setTimeout(() => resolve({ kind: 'grace_elapsed' }), 0)
|
|
167
|
+
}),
|
|
168
|
+
]).finally(() => {
|
|
169
|
+
if (timer !== undefined) clearTimeout(timer)
|
|
170
|
+
})
|
|
171
|
+
if (grace.kind === 'fulfilled' && acceptAfterAbort?.(grace.value)) return grace.value
|
|
172
|
+
if (grace.kind === 'rejected') throw grace.reason
|
|
173
|
+
throw signal.reason
|
|
174
|
+
} finally {
|
|
175
|
+
if (onAbort) signal.removeEventListener('abort', onAbort)
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
31
179
|
export class ConnectorManager {
|
|
32
180
|
private registry: ConnectorRegistry
|
|
33
181
|
private instances: Map<ConnectorInstanceId, ConnectorInstance> = new Map()
|
|
34
182
|
private liveConnectors: Map<ConnectorInstanceId, BaseConnector<unknown>> = new Map()
|
|
183
|
+
private admissions: Map<ConnectorInstanceId, InstanceAdmission> = new Map()
|
|
35
184
|
private listeners: ConnectorEventListener[] = []
|
|
36
185
|
private log: Logger
|
|
37
186
|
|
|
38
187
|
constructor(config: ConnectorManagerConfig) {
|
|
39
188
|
this.registry = config.registry
|
|
40
|
-
this.log = resolveLogger(config.log).child({
|
|
189
|
+
this.log = resolveLogger(config.log).child({
|
|
190
|
+
[SCOPE_ATTRIBUTE]: 'manager/connector',
|
|
191
|
+
})
|
|
41
192
|
}
|
|
42
193
|
|
|
43
194
|
on(listener: ConnectorEventListener): void {
|
|
@@ -54,6 +205,31 @@ export class ConnectorManager {
|
|
|
54
205
|
connector: BaseConnector<unknown>,
|
|
55
206
|
): Promise<ConnectorInstance> {
|
|
56
207
|
const definition = this.registry.getOrThrow(config.connectorId)
|
|
208
|
+
if (connector.id !== config.connectorId) {
|
|
209
|
+
throw new Error(
|
|
210
|
+
`Connector implementation id "${connector.id}" does not match requested definition "${config.connectorId}"`,
|
|
211
|
+
)
|
|
212
|
+
}
|
|
213
|
+
if (!sameAuthPolicy(definition.supportedAuth, connector.supportedAuth)) {
|
|
214
|
+
throw new Error(
|
|
215
|
+
`Connector implementation "${connector.id}" does not match its registered auth policy`,
|
|
216
|
+
)
|
|
217
|
+
}
|
|
218
|
+
assertMethodSchemas(definition)
|
|
219
|
+
if (!sameMethodSurface(definition.methods, connector.methods)) {
|
|
220
|
+
throw new Error(
|
|
221
|
+
`Connector implementation "${connector.id}" does not match its registered method surface`,
|
|
222
|
+
)
|
|
223
|
+
}
|
|
224
|
+
const capturedDefinition = copyDefinition(definition)
|
|
225
|
+
const admission: InstanceAdmission = {
|
|
226
|
+
connectorId: config.connectorId,
|
|
227
|
+
definition: capturedDefinition,
|
|
228
|
+
...(capturedDefinition.supportedAuth
|
|
229
|
+
? { supportedAuth: new Set(capturedDefinition.supportedAuth) }
|
|
230
|
+
: {}),
|
|
231
|
+
}
|
|
232
|
+
if (config.auth) this.requireSupportedAuth(admission, config.connectorId, config.auth.type)
|
|
57
233
|
|
|
58
234
|
const parsedConfig = definition.configSchema.safeParse(config.options ?? {})
|
|
59
235
|
if (!parsedConfig.success) {
|
|
@@ -74,7 +250,12 @@ export class ConnectorManager {
|
|
|
74
250
|
|
|
75
251
|
this.instances.set(instanceId, instance)
|
|
76
252
|
this.liveConnectors.set(instanceId, connector)
|
|
77
|
-
this.
|
|
253
|
+
this.admissions.set(instanceId, admission)
|
|
254
|
+
this.emit({
|
|
255
|
+
type: 'instance_created',
|
|
256
|
+
instanceId,
|
|
257
|
+
connectorId: config.connectorId,
|
|
258
|
+
})
|
|
78
259
|
this.log.info('Connector instance created', {
|
|
79
260
|
'namzu.connector.instance_id': instanceId,
|
|
80
261
|
'namzu.connector.id': config.connectorId,
|
|
@@ -86,18 +267,24 @@ export class ConnectorManager {
|
|
|
86
267
|
async connect(instanceId: ConnectorInstanceId): Promise<void> {
|
|
87
268
|
const instance = this.getInstanceOrThrow(instanceId)
|
|
88
269
|
const connector = this.getConnectorOrThrow(instanceId)
|
|
89
|
-
|
|
90
|
-
this.updateStatus(instanceId, 'connecting')
|
|
91
|
-
this.emit({ type: 'instance_connecting', instanceId })
|
|
270
|
+
const admission = this.getAdmissionOrThrow(instanceId)
|
|
92
271
|
|
|
93
272
|
try {
|
|
94
|
-
const
|
|
95
|
-
|
|
273
|
+
const parsedConfig = admission.definition.configSchema.parse(instance.config.options ?? {})
|
|
274
|
+
this.requireSupportedAuth(
|
|
275
|
+
admission,
|
|
276
|
+
admission.connectorId,
|
|
277
|
+
instance.config.auth?.type ?? 'none',
|
|
278
|
+
)
|
|
279
|
+
this.updateStatus(instanceId, 'connecting')
|
|
280
|
+
this.emit({ type: 'instance_connecting', instanceId })
|
|
96
281
|
await connector.connect(parsedConfig, instance.config.auth)
|
|
97
282
|
this.updateStatus(instanceId, 'connected')
|
|
98
283
|
instance.connectedAt = Date.now()
|
|
99
284
|
this.emit({ type: 'instance_connected', instanceId })
|
|
100
|
-
this.log.info('Connector connected', {
|
|
285
|
+
this.log.info('Connector connected', {
|
|
286
|
+
'namzu.connector.instance_id': instanceId,
|
|
287
|
+
})
|
|
101
288
|
} catch (err) {
|
|
102
289
|
const message = toErrorMessage(err)
|
|
103
290
|
this.updateStatus(instanceId, 'error', message)
|
|
@@ -117,7 +304,9 @@ export class ConnectorManager {
|
|
|
117
304
|
await connector.disconnect()
|
|
118
305
|
this.updateStatus(instanceId, 'disconnected')
|
|
119
306
|
this.emit({ type: 'instance_disconnected', instanceId })
|
|
120
|
-
this.log.info('Connector disconnected', {
|
|
307
|
+
this.log.info('Connector disconnected', {
|
|
308
|
+
'namzu.connector.instance_id': instanceId,
|
|
309
|
+
})
|
|
121
310
|
} catch (err) {
|
|
122
311
|
const message = toErrorMessage(err)
|
|
123
312
|
this.log.error('Connector disconnect failed', {
|
|
@@ -128,10 +317,14 @@ export class ConnectorManager {
|
|
|
128
317
|
}
|
|
129
318
|
}
|
|
130
319
|
|
|
131
|
-
async healthCheck(
|
|
320
|
+
async healthCheck(
|
|
321
|
+
instanceId: ConnectorInstanceId,
|
|
322
|
+
options?: ConnectorOperationOptions,
|
|
323
|
+
): Promise<boolean> {
|
|
132
324
|
const connector = this.getConnectorOrThrow(instanceId)
|
|
325
|
+
if (options?.signal?.aborted) return false
|
|
133
326
|
try {
|
|
134
|
-
return await connector.healthCheck()
|
|
327
|
+
return await settleWithSignal(connector.healthCheck(options), options?.signal)
|
|
135
328
|
} catch {
|
|
136
329
|
return false
|
|
137
330
|
}
|
|
@@ -140,29 +333,119 @@ export class ConnectorManager {
|
|
|
140
333
|
async execute(params: ConnectorExecuteParams): Promise<ConnectorExecuteResult> {
|
|
141
334
|
const instance = this.getInstanceOrThrow(params.instanceId)
|
|
142
335
|
const connector = this.getConnectorOrThrow(params.instanceId)
|
|
336
|
+
const admission = this.getAdmissionOrThrow(params.instanceId)
|
|
337
|
+
if (params.signal?.aborted) {
|
|
338
|
+
return notStartedFailure(
|
|
339
|
+
`Connector execution was cancelled before it started: ${toErrorMessage(params.signal.reason)}. No remote request was started; retry is safe.`,
|
|
340
|
+
)
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
const method = admission.definition.methods.find(
|
|
344
|
+
(candidate) => candidate.name === params.method,
|
|
345
|
+
)
|
|
346
|
+
if (!method) {
|
|
347
|
+
const available = admission.definition.methods.map((candidate) => candidate.name).join(', ')
|
|
348
|
+
return notStartedFailure(
|
|
349
|
+
`Connector method "${params.method}" is not registered for "${admission.connectorId}". Available: ${available || '(none)'}. No remote request was started; retry is safe after correcting the method.`,
|
|
350
|
+
)
|
|
351
|
+
}
|
|
143
352
|
|
|
144
353
|
if (instance.status !== 'connected') {
|
|
145
|
-
return
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
354
|
+
return notStartedFailure(
|
|
355
|
+
`Connector "${params.instanceId}" is not connected (status: ${instance.status}). No remote request was started; retry is safe after connecting it.`,
|
|
356
|
+
)
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
let canonicalInput: unknown
|
|
360
|
+
try {
|
|
361
|
+
const parsedInput = await settleWithSignal(
|
|
362
|
+
method.inputSchema.safeParseAsync(params.input),
|
|
363
|
+
params.signal,
|
|
364
|
+
)
|
|
365
|
+
if (!parsedInput.success) {
|
|
366
|
+
return notStartedFailure(
|
|
367
|
+
`Invalid input for connector method "${params.method}": ${formatSchemaIssues(parsedInput.error.issues)}. No remote request was started; retry is safe after correcting the input.`,
|
|
368
|
+
)
|
|
369
|
+
}
|
|
370
|
+
canonicalInput = parsedInput.data
|
|
371
|
+
} catch (err) {
|
|
372
|
+
if (params.signal?.aborted) {
|
|
373
|
+
return notStartedFailure(
|
|
374
|
+
`Connector execution was cancelled during input validation: ${toErrorMessage(params.signal.reason)}. No remote request was started; retry is safe.`,
|
|
375
|
+
)
|
|
150
376
|
}
|
|
377
|
+
return notStartedFailure(
|
|
378
|
+
`Input validation failed for connector method "${params.method}": ${toErrorMessage(err)}. No remote request was started; retry is safe after correcting the connector schema or input.`,
|
|
379
|
+
)
|
|
151
380
|
}
|
|
152
381
|
|
|
153
|
-
|
|
382
|
+
if (params.signal?.aborted) {
|
|
383
|
+
return notStartedFailure(
|
|
384
|
+
`Connector execution was cancelled before it started: ${toErrorMessage(params.signal.reason)}. No remote request was started; retry is safe.`,
|
|
385
|
+
)
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
this.emit({
|
|
389
|
+
type: 'action_executing',
|
|
390
|
+
instanceId: params.instanceId,
|
|
391
|
+
method: params.method,
|
|
392
|
+
})
|
|
154
393
|
const start = performance.now()
|
|
155
394
|
try {
|
|
156
|
-
const result = await
|
|
395
|
+
const result = await settleWithSignal(
|
|
396
|
+
connector.execute(
|
|
397
|
+
params.method,
|
|
398
|
+
canonicalInput,
|
|
399
|
+
managedConnectorOptions({ signal: params.signal }),
|
|
400
|
+
),
|
|
401
|
+
params.signal,
|
|
402
|
+
(result) =>
|
|
403
|
+
result.metadata?.remoteOutcome === 'response_received' ||
|
|
404
|
+
(!result.success && result.metadata?.remoteOutcome !== undefined),
|
|
405
|
+
)
|
|
157
406
|
instance.lastUsedAt = Date.now()
|
|
407
|
+
let published = result
|
|
408
|
+
if (result.success && method.outputSchema) {
|
|
409
|
+
try {
|
|
410
|
+
const parsedOutput = await settleWithSignal(
|
|
411
|
+
method.outputSchema.safeParseAsync(result.output),
|
|
412
|
+
params.signal,
|
|
413
|
+
)
|
|
414
|
+
published = parsedOutput.success
|
|
415
|
+
? { ...result, output: parsedOutput.data }
|
|
416
|
+
: {
|
|
417
|
+
success: false,
|
|
418
|
+
output: null,
|
|
419
|
+
error: `Connector method "${params.method}" returned output that violates its registered schema: ${formatOutputSchemaIssues(parsedOutput.error.issues)}. A remote response was received; do not automatically retry.`,
|
|
420
|
+
durationMs: result.durationMs,
|
|
421
|
+
metadata: {
|
|
422
|
+
...result.metadata,
|
|
423
|
+
remoteOutcome: 'response_received',
|
|
424
|
+
retrySafety: 'unsafe',
|
|
425
|
+
},
|
|
426
|
+
}
|
|
427
|
+
} catch {
|
|
428
|
+
published = {
|
|
429
|
+
success: false,
|
|
430
|
+
output: null,
|
|
431
|
+
error: `Connector method "${params.method}" output validation could not establish the registered contract. A remote response was received; do not automatically retry.`,
|
|
432
|
+
durationMs: result.durationMs,
|
|
433
|
+
metadata: {
|
|
434
|
+
...result.metadata,
|
|
435
|
+
remoteOutcome: 'response_received',
|
|
436
|
+
retrySafety: 'unsafe',
|
|
437
|
+
},
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}
|
|
158
441
|
this.emit({
|
|
159
442
|
type: 'action_completed',
|
|
160
443
|
instanceId: params.instanceId,
|
|
161
444
|
method: params.method,
|
|
162
|
-
success:
|
|
163
|
-
durationMs:
|
|
445
|
+
success: published.success,
|
|
446
|
+
durationMs: published.durationMs,
|
|
164
447
|
})
|
|
165
|
-
return
|
|
448
|
+
return published
|
|
166
449
|
} catch (err) {
|
|
167
450
|
const message = toErrorMessage(err)
|
|
168
451
|
const durationMs = Math.round(performance.now() - start)
|
|
@@ -176,8 +459,18 @@ export class ConnectorManager {
|
|
|
176
459
|
return {
|
|
177
460
|
success: false,
|
|
178
461
|
output: null,
|
|
179
|
-
error:
|
|
462
|
+
error: params.signal?.aborted
|
|
463
|
+
? `Connector execution was interrupted: ${message}. The remote outcome is unknown; do not automatically retry.`
|
|
464
|
+
: `Execution failed: ${message}`,
|
|
180
465
|
durationMs,
|
|
466
|
+
...(params.signal?.aborted
|
|
467
|
+
? {
|
|
468
|
+
metadata: {
|
|
469
|
+
remoteOutcome: 'unknown' as const,
|
|
470
|
+
retrySafety: 'unknown' as const,
|
|
471
|
+
},
|
|
472
|
+
}
|
|
473
|
+
: {}),
|
|
181
474
|
}
|
|
182
475
|
}
|
|
183
476
|
}
|
|
@@ -197,8 +490,11 @@ export class ConnectorManager {
|
|
|
197
490
|
|
|
198
491
|
this.instances.delete(instanceId)
|
|
199
492
|
this.liveConnectors.delete(instanceId)
|
|
493
|
+
this.admissions.delete(instanceId)
|
|
200
494
|
this.emit({ type: 'instance_removed', instanceId })
|
|
201
|
-
this.log.info('Connector instance removed', {
|
|
495
|
+
this.log.info('Connector instance removed', {
|
|
496
|
+
'namzu.connector.instance_id': instanceId,
|
|
497
|
+
})
|
|
202
498
|
}
|
|
203
499
|
|
|
204
500
|
getRegistry(): ConnectorRegistry {
|
|
@@ -213,12 +509,35 @@ export class ConnectorManager {
|
|
|
213
509
|
return this.liveConnectors.get(instanceId)
|
|
214
510
|
}
|
|
215
511
|
|
|
512
|
+
getInstanceConnectorId(instanceId: ConnectorInstanceId): ConnectorId {
|
|
513
|
+
return this.getAdmissionOrThrow(instanceId).connectorId
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
getInstanceDefinition(instanceId: ConnectorInstanceId): ConnectorDefinition {
|
|
517
|
+
return copyDefinition(this.getAdmissionOrThrow(instanceId).definition)
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
supportsAuth(instanceId: ConnectorInstanceId, authType: AuthType): boolean {
|
|
521
|
+
const supported = this.getAdmissionOrThrow(instanceId).supportedAuth
|
|
522
|
+
return supported === undefined || supported.has(authType)
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
/** Validate before mutating the live instance's effective credential. */
|
|
526
|
+
setInstanceAuth(instanceId: ConnectorInstanceId, auth: AuthConfig): void {
|
|
527
|
+
const instance = this.getInstanceOrThrow(instanceId)
|
|
528
|
+
const admission = this.getAdmissionOrThrow(instanceId)
|
|
529
|
+
this.requireSupportedAuth(admission, admission.connectorId, auth.type)
|
|
530
|
+
instance.config.auth = copyAuth(auth)
|
|
531
|
+
}
|
|
532
|
+
|
|
216
533
|
listInstances(): ConnectorInstance[] {
|
|
217
534
|
return Array.from(this.instances.values())
|
|
218
535
|
}
|
|
219
536
|
|
|
220
537
|
listInstancesByConnector(connectorId: ConnectorId): ConnectorInstance[] {
|
|
221
|
-
return this.listInstances().filter(
|
|
538
|
+
return this.listInstances().filter(
|
|
539
|
+
(instance) => this.getAdmissionOrThrow(instance.id).connectorId === connectorId,
|
|
540
|
+
)
|
|
222
541
|
}
|
|
223
542
|
|
|
224
543
|
listConnectedInstances(): ConnectorInstance[] {
|
|
@@ -246,6 +565,27 @@ export class ConnectorManager {
|
|
|
246
565
|
return connector
|
|
247
566
|
}
|
|
248
567
|
|
|
568
|
+
private getAdmissionOrThrow(instanceId: ConnectorInstanceId): InstanceAdmission {
|
|
569
|
+
const admission = this.admissions.get(instanceId)
|
|
570
|
+
if (!admission) {
|
|
571
|
+
throw new Error(`Connector admission policy not found for instance: "${instanceId}"`)
|
|
572
|
+
}
|
|
573
|
+
return admission
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
private requireSupportedAuth(
|
|
577
|
+
admission: InstanceAdmission,
|
|
578
|
+
connectorId: ConnectorId,
|
|
579
|
+
authType: AuthType,
|
|
580
|
+
): void {
|
|
581
|
+
const supported = admission.supportedAuth
|
|
582
|
+
if (supported === undefined || supported.has(authType)) return
|
|
583
|
+
const available = [...supported].join(', ') || 'none'
|
|
584
|
+
throw new Error(
|
|
585
|
+
`Connector "${connectorId}" does not support auth scheme "${authType}". Supported: ${available}`,
|
|
586
|
+
)
|
|
587
|
+
}
|
|
588
|
+
|
|
249
589
|
private updateStatus(
|
|
250
590
|
instanceId: ConnectorInstanceId,
|
|
251
591
|
status: ConnectorStatus,
|
|
@@ -2,12 +2,15 @@ import type { BaseConnector } from '../../connector/BaseConnector.js'
|
|
|
2
2
|
import { NAMZU } from '../../constants/telemetry/index.js'
|
|
3
3
|
import type { ConnectorRegistry } from '../../registry/connector/definitions.js'
|
|
4
4
|
import type {
|
|
5
|
+
AuthConfig,
|
|
6
|
+
AuthType,
|
|
5
7
|
ConnectorConfig,
|
|
6
8
|
ConnectorEventListener,
|
|
7
9
|
ConnectorExecuteParams,
|
|
8
10
|
ConnectorExecuteResult,
|
|
9
11
|
ConnectorInstance,
|
|
10
12
|
ConnectorLifecycleEvent,
|
|
13
|
+
ConnectorOperationOptions,
|
|
11
14
|
CredentialVault,
|
|
12
15
|
TenantDescriptor,
|
|
13
16
|
TenantRateLimitConfig,
|
|
@@ -63,17 +66,24 @@ export class TenantConnectorManager {
|
|
|
63
66
|
this.registry = config.registry
|
|
64
67
|
this.credentialVault = config.credentialVault
|
|
65
68
|
this.defaultRateLimit = config.defaultRateLimit
|
|
66
|
-
this.log = resolveLogger(config.log).child({
|
|
69
|
+
this.log = resolveLogger(config.log).child({
|
|
70
|
+
[SCOPE_ATTRIBUTE]: 'manager/connector',
|
|
71
|
+
})
|
|
67
72
|
}
|
|
68
73
|
|
|
69
74
|
registerTenant(descriptor: TenantDescriptor, rateLimit?: TenantRateLimitConfig): void {
|
|
70
75
|
if (this.tenants.has(descriptor.id)) {
|
|
71
|
-
this.log.warn('Tenant already registered, skipping', {
|
|
76
|
+
this.log.warn('Tenant already registered, skipping', {
|
|
77
|
+
[NAMZU.TENANT_ID]: descriptor.id,
|
|
78
|
+
})
|
|
72
79
|
return
|
|
73
80
|
}
|
|
74
81
|
|
|
75
82
|
const tenantLog = this.log.child({ [NAMZU.TENANT_ID]: descriptor.id })
|
|
76
|
-
const manager = new ConnectorManager({
|
|
83
|
+
const manager = new ConnectorManager({
|
|
84
|
+
registry: this.registry,
|
|
85
|
+
log: tenantLog,
|
|
86
|
+
})
|
|
77
87
|
|
|
78
88
|
manager.on((event) => {
|
|
79
89
|
this.emitTenantEvent(descriptor.id, event)
|
|
@@ -150,18 +160,19 @@ export class TenantConnectorManager {
|
|
|
150
160
|
if (this.credentialVault) {
|
|
151
161
|
const instance = state.manager.getInstance(instanceId)
|
|
152
162
|
if (instance && !instance.config.auth) {
|
|
153
|
-
const
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
}
|
|
163
|
+
const connectorId = state.manager.getInstanceConnectorId(instanceId)
|
|
164
|
+
const creds = await this.credentialVault.list(tenantId, connectorId)
|
|
165
|
+
for (const ref of creds) {
|
|
166
|
+
if (!state.manager.supportsAuth(instanceId, ref.authType)) continue
|
|
167
|
+
const auth = await this.credentialVault.retrieveForScope(tenantId, connectorId, ref.id)
|
|
168
|
+
if (!auth || !state.manager.supportsAuth(instanceId, auth.type)) continue
|
|
169
|
+
state.manager.setInstanceAuth(instanceId, auth)
|
|
170
|
+
this.log.info('Auto-resolved credential for instance', {
|
|
171
|
+
[NAMZU.CREDENTIAL_ID]: ref.id,
|
|
172
|
+
'namzu.connector.instance_id': instanceId,
|
|
173
|
+
[NAMZU.TENANT_ID]: tenantId,
|
|
174
|
+
})
|
|
175
|
+
break
|
|
165
176
|
}
|
|
166
177
|
}
|
|
167
178
|
}
|
|
@@ -183,13 +194,16 @@ export class TenantConnectorManager {
|
|
|
183
194
|
if (!instance) {
|
|
184
195
|
throw new Error(`Connector instance not found: "${instanceId}"`)
|
|
185
196
|
}
|
|
197
|
+
const connectorId = state.manager.getInstanceConnectorId(instanceId)
|
|
186
198
|
|
|
187
|
-
const auth = await this.credentialVault.
|
|
199
|
+
const auth = await this.credentialVault.retrieveForScope(tenantId, connectorId, credentialId)
|
|
188
200
|
if (!auth) {
|
|
189
|
-
throw new Error(
|
|
201
|
+
throw new Error(
|
|
202
|
+
`Credential "${credentialId}" is unavailable for tenant "${tenantId}" and connector "${connectorId}"`,
|
|
203
|
+
)
|
|
190
204
|
}
|
|
191
205
|
|
|
192
|
-
|
|
206
|
+
state.manager.setInstanceAuth(instanceId, auth)
|
|
193
207
|
this.log.info('Credential applied to instance', {
|
|
194
208
|
[NAMZU.CREDENTIAL_ID]: credentialId,
|
|
195
209
|
'namzu.connector.instance_id': instanceId,
|
|
@@ -202,12 +216,13 @@ export class TenantConnectorManager {
|
|
|
202
216
|
tenantId: TenantId,
|
|
203
217
|
connectorId: ConnectorId,
|
|
204
218
|
label: string,
|
|
205
|
-
auth:
|
|
219
|
+
auth: AuthConfig,
|
|
206
220
|
): Promise<import('../../types/connector/index.js').CredentialRef> {
|
|
207
221
|
if (!this.credentialVault) {
|
|
208
222
|
throw new Error('No credential vault configured on TenantConnectorManager')
|
|
209
223
|
}
|
|
210
224
|
this.getTenantOrThrow(tenantId)
|
|
225
|
+
this.requireDefinitionSupportsAuth(connectorId, auth.type)
|
|
211
226
|
return this.credentialVault.store(tenantId, connectorId, label, auth)
|
|
212
227
|
}
|
|
213
228
|
|
|
@@ -222,11 +237,12 @@ export class TenantConnectorManager {
|
|
|
222
237
|
return this.credentialVault.list(tenantId, connectorId)
|
|
223
238
|
}
|
|
224
239
|
|
|
225
|
-
async revokeCredential(credentialId: CredentialId): Promise<boolean> {
|
|
240
|
+
async revokeCredential(tenantId: TenantId, credentialId: CredentialId): Promise<boolean> {
|
|
226
241
|
if (!this.credentialVault) {
|
|
227
242
|
return false
|
|
228
243
|
}
|
|
229
|
-
|
|
244
|
+
this.getTenantOrThrow(tenantId)
|
|
245
|
+
return this.credentialVault.revokeForTenant(tenantId, credentialId)
|
|
230
246
|
}
|
|
231
247
|
|
|
232
248
|
async disconnect(tenantId: TenantId, instanceId: ConnectorInstanceId): Promise<void> {
|
|
@@ -239,6 +255,11 @@ export class TenantConnectorManager {
|
|
|
239
255
|
params: ConnectorExecuteParams,
|
|
240
256
|
): Promise<ConnectorExecuteResult> {
|
|
241
257
|
const state = this.getTenantOrThrow(tenantId)
|
|
258
|
+
// A caller that has already withdrawn authority did not attempt a remote
|
|
259
|
+
// operation and must not spend the tenant's next admission slot. Delegate
|
|
260
|
+
// first so the ordinary manager still validates the instance and returns
|
|
261
|
+
// the canonical not-started phase result.
|
|
262
|
+
if (params.signal?.aborted) return state.manager.execute(params)
|
|
242
263
|
|
|
243
264
|
if (!this.checkRateLimit(state, params.instanceId)) {
|
|
244
265
|
return {
|
|
@@ -252,9 +273,13 @@ export class TenantConnectorManager {
|
|
|
252
273
|
return state.manager.execute(params)
|
|
253
274
|
}
|
|
254
275
|
|
|
255
|
-
async healthCheck(
|
|
276
|
+
async healthCheck(
|
|
277
|
+
tenantId: TenantId,
|
|
278
|
+
instanceId: ConnectorInstanceId,
|
|
279
|
+
options?: ConnectorOperationOptions,
|
|
280
|
+
): Promise<boolean> {
|
|
256
281
|
const state = this.getTenantOrThrow(tenantId)
|
|
257
|
-
return state.manager.healthCheck(instanceId)
|
|
282
|
+
return state.manager.healthCheck(instanceId, options)
|
|
258
283
|
}
|
|
259
284
|
|
|
260
285
|
async removeInstance(tenantId: TenantId, instanceId: ConnectorInstanceId): Promise<void> {
|
|
@@ -317,4 +342,12 @@ export class TenantConnectorManager {
|
|
|
317
342
|
}
|
|
318
343
|
return state
|
|
319
344
|
}
|
|
345
|
+
|
|
346
|
+
private requireDefinitionSupportsAuth(connectorId: ConnectorId, authType: AuthType): void {
|
|
347
|
+
const supported = this.registry.getOrThrow(connectorId).supportedAuth
|
|
348
|
+
if (supported === undefined || supported.includes(authType)) return
|
|
349
|
+
throw new Error(
|
|
350
|
+
`Connector "${connectorId}" does not support auth scheme "${authType}". Supported: ${supported.join(', ') || 'none'}`,
|
|
351
|
+
)
|
|
352
|
+
}
|
|
320
353
|
}
|