@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
|
@@ -2,6 +2,7 @@ import { DANGEROUS_PATTERNS } from '../constants/tools/index.js'
|
|
|
2
2
|
import { isTrustedReadOnly } from '../tools/trusted-read-only.js'
|
|
3
3
|
import type { AuthorizationRule, GateDecision } from '../types/authorization/index.js'
|
|
4
4
|
import type { ToolDefinition } from '../types/tool/index.js'
|
|
5
|
+
import { decomposeCommandLine } from './command-line.js'
|
|
5
6
|
|
|
6
7
|
export function evaluateRule(
|
|
7
8
|
rule: AuthorizationRule,
|
|
@@ -105,7 +106,27 @@ export function evaluateRule(
|
|
|
105
106
|
: undefined
|
|
106
107
|
if (subject === undefined) return null
|
|
107
108
|
|
|
108
|
-
|
|
109
|
+
// A command line is not one string, and testing it as one is how a
|
|
110
|
+
// prohibition gets bypassed: `^git push` sees `git push origin main`
|
|
111
|
+
// and does not see `true; git push origin main`. See
|
|
112
|
+
// `decomposeCommandLine` for the measurement and for why the two
|
|
113
|
+
// decisions must read the result differently.
|
|
114
|
+
const { segments, opaque } = decomposeCommandLine(subject)
|
|
115
|
+
|
|
116
|
+
if (rule.decision === 'deny') {
|
|
117
|
+
// ANY segment. The whole subject is tested first so an
|
|
118
|
+
// unanchored deny keeps matching across a boundary, which
|
|
119
|
+
// splitting alone would have taken away.
|
|
120
|
+
if (compiledPattern.test(subject)) return 'deny'
|
|
121
|
+
return segments.some((segment) => compiledPattern.test(segment)) ? 'deny' : null
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// EVERY segment, and nothing that hides one. Permission is a claim
|
|
125
|
+
// about the whole line; granting it from one matching part is what
|
|
126
|
+
// let `git status && rm -rf ~` through an allow rule for
|
|
127
|
+
// `^git status`.
|
|
128
|
+
if (opaque) return null
|
|
129
|
+
return segments.every((segment) => compiledPattern.test(segment)) ? 'allow' : null
|
|
109
130
|
}
|
|
110
131
|
|
|
111
132
|
case 'allow_by_tier': {
|
package/src/bridge/a2a/client.ts
CHANGED
|
@@ -38,6 +38,14 @@ export type FetchLike = (
|
|
|
38
38
|
text(): Promise<string>
|
|
39
39
|
}>
|
|
40
40
|
|
|
41
|
+
export interface FetchAgentCardOptions {
|
|
42
|
+
readonly fetch: FetchLike
|
|
43
|
+
/** Cancels discovery; a pre-aborted signal starts no request. */
|
|
44
|
+
readonly signal?: AbortSignal
|
|
45
|
+
/** Whole fetch-and-body deadline. Defaults to 30 seconds; `0` opts out. */
|
|
46
|
+
readonly timeoutMs?: number
|
|
47
|
+
}
|
|
48
|
+
|
|
41
49
|
/** A peer that answered with something that is not an agent card. */
|
|
42
50
|
export class InvalidAgentCardError extends Error {
|
|
43
51
|
readonly details: { url: string; reason: string }
|
|
@@ -75,6 +83,149 @@ export class A2ARequestError extends Error {
|
|
|
75
83
|
|
|
76
84
|
const majorMinor = (version: string): string => version.split('.').slice(0, 2).join('.')
|
|
77
85
|
|
|
86
|
+
const MAX_TIMER_DELAY_MS = 2_147_483_647
|
|
87
|
+
const DEFAULT_CARD_TIMEOUT_MS = 30_000
|
|
88
|
+
const DEFAULT_POLL_MS = 1_000
|
|
89
|
+
const DEFAULT_TIMEOUT_MS = 10 * 60 * 1000
|
|
90
|
+
const PEER_CANCEL_GRACE_MS = 500
|
|
91
|
+
|
|
92
|
+
function resolveTimerMs(
|
|
93
|
+
value: number | undefined,
|
|
94
|
+
fallback: number,
|
|
95
|
+
name: string,
|
|
96
|
+
allowZero: boolean,
|
|
97
|
+
): number {
|
|
98
|
+
const resolved = value ?? fallback
|
|
99
|
+
const minimum = allowZero ? 0 : 1
|
|
100
|
+
if (!Number.isInteger(resolved) || resolved < minimum || resolved > MAX_TIMER_DELAY_MS) {
|
|
101
|
+
throw new RangeError(
|
|
102
|
+
`${name} must be an integer from ${minimum} to ${MAX_TIMER_DELAY_MS}; received ${String(resolved)}`,
|
|
103
|
+
)
|
|
104
|
+
}
|
|
105
|
+
return resolved
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function timeoutError(message: string): Error {
|
|
109
|
+
const error = new Error(message)
|
|
110
|
+
error.name = 'TimeoutError'
|
|
111
|
+
return error
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
interface OperationCause {
|
|
115
|
+
readonly kind: 'caller' | 'timeout'
|
|
116
|
+
readonly reason: unknown
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function taskIdOf(value: unknown): string | undefined {
|
|
120
|
+
if (typeof value !== 'object' || value === null || !Object.hasOwn(value, 'id')) return undefined
|
|
121
|
+
const id = (value as { readonly id?: unknown }).id
|
|
122
|
+
return typeof id === 'string' && id.length > 0 ? id : undefined
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** Internal control flow. Public callers receive the exact cause instead. */
|
|
126
|
+
class OperationInterrupted {
|
|
127
|
+
constructor(readonly cause: OperationCause) {}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
interface OperationBoundary {
|
|
131
|
+
readonly signal: AbortSignal
|
|
132
|
+
wait<T>(operation: Promise<T>): Promise<T>
|
|
133
|
+
throwIfStopped(): void
|
|
134
|
+
armTransportAbort(): void
|
|
135
|
+
abortTransport(): void
|
|
136
|
+
dispose(): void
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* One caller-owned cancellation plus one kernel-owned deadline.
|
|
141
|
+
*
|
|
142
|
+
* The promise race is intentional even though the signal is forwarded. A
|
|
143
|
+
* host can inject `FetchLike`, and accepting an AbortSignal does not prove it
|
|
144
|
+
* settles when that signal fires. The race settles Namzu independently while
|
|
145
|
+
* keeping the losing promise observed.
|
|
146
|
+
*/
|
|
147
|
+
function operationBoundary(options: {
|
|
148
|
+
readonly callerSignal?: AbortSignal
|
|
149
|
+
readonly timeoutMs: number
|
|
150
|
+
readonly timeoutMessage: string
|
|
151
|
+
readonly abortTransportInitially: boolean
|
|
152
|
+
}): OperationBoundary {
|
|
153
|
+
options.callerSignal?.throwIfAborted()
|
|
154
|
+
|
|
155
|
+
const transport = new AbortController()
|
|
156
|
+
let cause: OperationCause | undefined
|
|
157
|
+
let transportAbortArmed = options.abortTransportInitially
|
|
158
|
+
let resolveStopped!: (cause: OperationCause) => void
|
|
159
|
+
const stopped = new Promise<OperationCause>((resolve) => {
|
|
160
|
+
resolveStopped = resolve
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
const stop = (next: OperationCause): void => {
|
|
164
|
+
if (cause !== undefined) return
|
|
165
|
+
cause = next
|
|
166
|
+
// Latch and resolve BEFORE aborting the transport. A fetch implementation
|
|
167
|
+
// may synchronously turn transport abort into a generic AbortError; that
|
|
168
|
+
// fallout must not erase whether the caller or the deadline stopped us.
|
|
169
|
+
resolveStopped(next)
|
|
170
|
+
if (transportAbortArmed && !transport.signal.aborted) {
|
|
171
|
+
transport.abort(next.reason)
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const onCallerAbort = (): void => {
|
|
176
|
+
stop({ kind: 'caller', reason: options.callerSignal?.reason })
|
|
177
|
+
}
|
|
178
|
+
options.callerSignal?.addEventListener('abort', onCallerAbort, { once: true })
|
|
179
|
+
// Abort events are not replayed. The first throw closes the ordinary
|
|
180
|
+
// pre-abort case; this second check closes a signal that changed while its
|
|
181
|
+
// listener was being installed by a non-standard implementation.
|
|
182
|
+
if (options.callerSignal?.aborted) onCallerAbort()
|
|
183
|
+
|
|
184
|
+
const timer =
|
|
185
|
+
options.timeoutMs > 0
|
|
186
|
+
? setTimeout(() => {
|
|
187
|
+
stop({ kind: 'timeout', reason: timeoutError(options.timeoutMessage) })
|
|
188
|
+
}, options.timeoutMs)
|
|
189
|
+
: undefined
|
|
190
|
+
|
|
191
|
+
return {
|
|
192
|
+
signal: transport.signal,
|
|
193
|
+
async wait<T>(operation: Promise<T>): Promise<T> {
|
|
194
|
+
if (cause !== undefined) throw new OperationInterrupted(cause)
|
|
195
|
+
const completed = operation.then(
|
|
196
|
+
(value) => ({ kind: 'value' as const, value, causeAtSettlement: cause }),
|
|
197
|
+
(error: unknown) => ({ kind: 'error' as const, error, causeAtSettlement: cause }),
|
|
198
|
+
)
|
|
199
|
+
const winner = await Promise.race([
|
|
200
|
+
completed,
|
|
201
|
+
stopped.then((stoppedCause) => ({ kind: 'stopped' as const, cause: stoppedCause })),
|
|
202
|
+
])
|
|
203
|
+
if (winner.kind === 'stopped') throw new OperationInterrupted(winner.cause)
|
|
204
|
+
// If transport.abort() made the operation reject first, the cause was
|
|
205
|
+
// already latched. Preserve it rather than leaking a generic AbortError.
|
|
206
|
+
if (winner.causeAtSettlement !== undefined) {
|
|
207
|
+
throw new OperationInterrupted(winner.causeAtSettlement)
|
|
208
|
+
}
|
|
209
|
+
if (winner.kind === 'error') throw winner.error
|
|
210
|
+
return winner.value
|
|
211
|
+
},
|
|
212
|
+
throwIfStopped(): void {
|
|
213
|
+
if (cause !== undefined) throw new OperationInterrupted(cause)
|
|
214
|
+
},
|
|
215
|
+
armTransportAbort(): void {
|
|
216
|
+
transportAbortArmed = true
|
|
217
|
+
if (cause !== undefined && !transport.signal.aborted) transport.abort(cause.reason)
|
|
218
|
+
},
|
|
219
|
+
abortTransport(): void {
|
|
220
|
+
if (!transport.signal.aborted) transport.abort(cause?.reason)
|
|
221
|
+
},
|
|
222
|
+
dispose(): void {
|
|
223
|
+
if (timer !== undefined) clearTimeout(timer)
|
|
224
|
+
options.callerSignal?.removeEventListener('abort', onCallerAbort)
|
|
225
|
+
},
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
78
229
|
/**
|
|
79
230
|
* Read a peer's card, and refuse one this kernel cannot honestly use.
|
|
80
231
|
*
|
|
@@ -91,51 +242,74 @@ const majorMinor = (version: string): string => version.split('.').slice(0, 2).j
|
|
|
91
242
|
*/
|
|
92
243
|
export async function fetchAgentCard(
|
|
93
244
|
baseUrl: string,
|
|
94
|
-
opts:
|
|
245
|
+
opts: FetchAgentCardOptions,
|
|
95
246
|
): Promise<A2AAgentCard> {
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
247
|
+
const timeoutMs = resolveTimerMs(
|
|
248
|
+
opts.timeoutMs,
|
|
249
|
+
DEFAULT_CARD_TIMEOUT_MS,
|
|
250
|
+
'fetchAgentCard timeoutMs',
|
|
251
|
+
true,
|
|
252
|
+
)
|
|
253
|
+
const boundary = operationBoundary({
|
|
254
|
+
callerSignal: opts.signal,
|
|
255
|
+
timeoutMs,
|
|
256
|
+
timeoutMessage: `A2A agent-card request timed out after ${timeoutMs}ms`,
|
|
257
|
+
abortTransportInitially: true,
|
|
101
258
|
})
|
|
102
|
-
|
|
103
|
-
throw new InvalidAgentCardError({ url, reason: `HTTP ${response.status}` })
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
let body: unknown
|
|
259
|
+
const url = `${baseUrl.replace(/\/$/, '')}/.well-known/agent-card.json`
|
|
107
260
|
try {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
261
|
+
boundary.throwIfStopped()
|
|
262
|
+
const response = await boundary.wait(
|
|
263
|
+
opts.fetch(url, {
|
|
264
|
+
method: 'GET',
|
|
265
|
+
headers: { accept: 'application/json' },
|
|
266
|
+
signal: boundary.signal,
|
|
267
|
+
}),
|
|
268
|
+
)
|
|
269
|
+
if (!response.ok) {
|
|
270
|
+
throw new InvalidAgentCardError({ url, reason: `HTTP ${response.status}` })
|
|
271
|
+
}
|
|
115
272
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
273
|
+
let body: unknown
|
|
274
|
+
try {
|
|
275
|
+
body = await boundary.wait(response.json())
|
|
276
|
+
} catch (err) {
|
|
277
|
+
if (err instanceof OperationInterrupted) throw err
|
|
278
|
+
throw new InvalidAgentCardError({
|
|
279
|
+
url,
|
|
280
|
+
reason: err instanceof Error ? err.message : 'the body is not JSON',
|
|
281
|
+
})
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
const card = body as Partial<A2AAgentCard>
|
|
285
|
+
// Checked by hand rather than through a schema, because there is no
|
|
286
|
+
// `A2AAgentCardSchema` in `contracts/a2a.ts` — the card is a type here
|
|
287
|
+
// and not a parser. Only the fields this client actually depends on are
|
|
288
|
+
// required; inventing requirements a peer does not owe us would refuse
|
|
289
|
+
// working peers.
|
|
290
|
+
if (typeof card?.name !== 'string' || !Array.isArray(card.supportedInterfaces)) {
|
|
291
|
+
throw new InvalidAgentCardError({ url, reason: 'no name, or no supportedInterfaces' })
|
|
292
|
+
}
|
|
293
|
+
if (card.supportedInterfaces.length === 0) {
|
|
294
|
+
throw new InvalidAgentCardError({ url, reason: 'supportedInterfaces is empty' })
|
|
295
|
+
}
|
|
296
|
+
if (
|
|
297
|
+
card.protocolVersion &&
|
|
298
|
+
majorMinor(card.protocolVersion) !== majorMinor(A2A_PROTOCOL_VERSION)
|
|
299
|
+
) {
|
|
300
|
+
throw new A2AProtocolMismatchError({
|
|
301
|
+
url,
|
|
302
|
+
theirs: card.protocolVersion,
|
|
303
|
+
ours: A2A_PROTOCOL_VERSION,
|
|
304
|
+
})
|
|
305
|
+
}
|
|
306
|
+
return card as A2AAgentCard
|
|
307
|
+
} catch (err) {
|
|
308
|
+
if (err instanceof OperationInterrupted) throw err.cause.reason
|
|
309
|
+
throw err
|
|
310
|
+
} finally {
|
|
311
|
+
boundary.dispose()
|
|
137
312
|
}
|
|
138
|
-
return card as A2AAgentCard
|
|
139
313
|
}
|
|
140
314
|
|
|
141
315
|
export interface A2ADelegateConfig {
|
|
@@ -147,13 +321,10 @@ export interface A2ADelegateConfig {
|
|
|
147
321
|
readonly headers?: Readonly<Record<string, string>>
|
|
148
322
|
/** How often to ask `tasks/get` while the peer is still working. */
|
|
149
323
|
readonly pollIntervalMs?: number
|
|
150
|
-
/** Give up on
|
|
324
|
+
/** Give up on the whole delegation, including `message/send`, after this long. */
|
|
151
325
|
readonly timeoutMs?: number
|
|
152
326
|
}
|
|
153
327
|
|
|
154
|
-
const DEFAULT_POLL_MS = 1_000
|
|
155
|
-
const DEFAULT_TIMEOUT_MS = 10 * 60 * 1000
|
|
156
|
-
|
|
157
328
|
/**
|
|
158
329
|
* States this CLIENT will stop polling on — `TERMINAL_STATES` plus
|
|
159
330
|
* `input-required`, and the difference is not a widening of the same idea.
|
|
@@ -226,8 +397,17 @@ export class A2ADelegate implements Delegate {
|
|
|
226
397
|
readonly capabilities: DelegateCapabilities
|
|
227
398
|
|
|
228
399
|
private readonly endpoint: string
|
|
400
|
+
private readonly pollIntervalMs: number
|
|
401
|
+
private readonly timeoutMs: number
|
|
229
402
|
|
|
230
403
|
constructor(private readonly config: A2ADelegateConfig) {
|
|
404
|
+
this.pollIntervalMs = resolveTimerMs(
|
|
405
|
+
config.pollIntervalMs,
|
|
406
|
+
DEFAULT_POLL_MS,
|
|
407
|
+
'pollIntervalMs',
|
|
408
|
+
false,
|
|
409
|
+
)
|
|
410
|
+
this.timeoutMs = resolveTimerMs(config.timeoutMs, DEFAULT_TIMEOUT_MS, 'timeoutMs', false)
|
|
231
411
|
this.id = config.id
|
|
232
412
|
const target = config.card.supportedInterfaces.find((i) => i.transport === 'jsonrpc')
|
|
233
413
|
if (!target) {
|
|
@@ -256,7 +436,7 @@ export class A2ADelegate implements Delegate {
|
|
|
256
436
|
}
|
|
257
437
|
}
|
|
258
438
|
|
|
259
|
-
private async rpc(method: A2AMethod, params: unknown, signal
|
|
439
|
+
private async rpc(method: A2AMethod, params: unknown, signal: AbortSignal): Promise<unknown> {
|
|
260
440
|
const response = await this.config.fetch(this.endpoint, {
|
|
261
441
|
method: 'POST',
|
|
262
442
|
headers: {
|
|
@@ -265,7 +445,7 @@ export class A2ADelegate implements Delegate {
|
|
|
265
445
|
...this.config.headers,
|
|
266
446
|
},
|
|
267
447
|
body: JSON.stringify({ jsonrpc: '2.0', id: `${method}-${this.id}`, method, params }),
|
|
268
|
-
|
|
448
|
+
signal,
|
|
269
449
|
})
|
|
270
450
|
if (!response.ok) {
|
|
271
451
|
throw new A2ARequestError(`${method} failed with HTTP ${response.status}`, {
|
|
@@ -286,9 +466,70 @@ export class A2ADelegate implements Delegate {
|
|
|
286
466
|
return body.result
|
|
287
467
|
}
|
|
288
468
|
|
|
289
|
-
|
|
469
|
+
/** Bounded best effort; cancellation is never allowed to create a second hang. */
|
|
470
|
+
private async cancelPeer(taskId: string): Promise<void> {
|
|
471
|
+
const boundary = operationBoundary({
|
|
472
|
+
timeoutMs: PEER_CANCEL_GRACE_MS,
|
|
473
|
+
timeoutMessage: `A2A tasks/cancel timed out after ${PEER_CANCEL_GRACE_MS}ms`,
|
|
474
|
+
abortTransportInitially: true,
|
|
475
|
+
})
|
|
476
|
+
try {
|
|
477
|
+
await boundary.wait(this.rpc('tasks/cancel', { id: taskId }, boundary.signal))
|
|
478
|
+
} catch {
|
|
479
|
+
// Best-effort courtesy on a path already unwinding. A refusal or an
|
|
480
|
+
// unreachable peer does not reverse the caller's stop or deadline.
|
|
481
|
+
} finally {
|
|
482
|
+
boundary.dispose()
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/** A client-terminal state may still be live on the peer. */
|
|
487
|
+
private async settleKnownTask(task: A2ATask): Promise<DelegateResult> {
|
|
488
|
+
if (!TERMINAL_STATES.has(task.status.state)) await this.cancelPeer(task.id)
|
|
489
|
+
return toDelegateResult(task)
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
/**
|
|
493
|
+
* Give an in-flight `message/send` one short chance to reveal its task id.
|
|
494
|
+
*
|
|
495
|
+
* Aborting that first transport immediately can abandon remote work while
|
|
496
|
+
* claiming cancellation locally. A2A cannot address a task until the peer
|
|
497
|
+
* returns its id, so this bounded grace is the only honest cleanup attempt.
|
|
498
|
+
*/
|
|
499
|
+
private async recoverInitialTask(
|
|
500
|
+
request: Promise<unknown>,
|
|
501
|
+
): Promise<{ readonly taskId?: string; readonly task?: A2ATask }> {
|
|
502
|
+
let timer: ReturnType<typeof setTimeout> | undefined
|
|
503
|
+
const expired = new Promise<undefined>((resolve) => {
|
|
504
|
+
timer = setTimeout(() => resolve(undefined), PEER_CANCEL_GRACE_MS)
|
|
505
|
+
})
|
|
506
|
+
try {
|
|
507
|
+
const recovered = await Promise.race([
|
|
508
|
+
request.then(
|
|
509
|
+
(value) => value,
|
|
510
|
+
() => undefined,
|
|
511
|
+
),
|
|
512
|
+
expired,
|
|
513
|
+
])
|
|
514
|
+
if (recovered === undefined) return {}
|
|
515
|
+
const taskId = taskIdOf(recovered)
|
|
516
|
+
try {
|
|
517
|
+
const task = this.parseTask(recovered, 'message/send')
|
|
518
|
+
return { taskId: task.id, task }
|
|
519
|
+
} catch {
|
|
520
|
+
// The answer remains unusable, but a non-empty string id is enough
|
|
521
|
+
// authority to address `tasks/cancel`. Throwing that id away because
|
|
522
|
+
// an unrelated status/artifact field was malformed orphans work.
|
|
523
|
+
return taskId === undefined ? {} : { taskId }
|
|
524
|
+
}
|
|
525
|
+
} finally {
|
|
526
|
+
if (timer !== undefined) clearTimeout(timer)
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
private parseTask(raw: unknown, method: A2AMethod, expectedTaskId?: string): A2ATask {
|
|
290
531
|
const parsed = A2ATaskSchema.safeParse(raw)
|
|
291
|
-
if (!parsed.success) {
|
|
532
|
+
if (!parsed.success || taskIdOf(parsed.data) === undefined) {
|
|
292
533
|
// Validated rather than trusted. This is a foreign service's reply
|
|
293
534
|
// being turned into a result the model will read as an answer, and
|
|
294
535
|
// the difference between a malformed task and a task in a state we
|
|
@@ -297,6 +538,12 @@ export class A2ADelegate implements Delegate {
|
|
|
297
538
|
method,
|
|
298
539
|
})
|
|
299
540
|
}
|
|
541
|
+
if (expectedTaskId !== undefined && parsed.data.id !== expectedTaskId) {
|
|
542
|
+
throw new A2ARequestError(
|
|
543
|
+
`${method} returned task ${parsed.data.id} for requested task ${expectedTaskId}`,
|
|
544
|
+
{ method },
|
|
545
|
+
)
|
|
546
|
+
}
|
|
300
547
|
return parsed.data as A2ATask
|
|
301
548
|
}
|
|
302
549
|
|
|
@@ -304,66 +551,106 @@ export class A2ADelegate implements Delegate {
|
|
|
304
551
|
request: DelegateRequest,
|
|
305
552
|
opts: { readonly signal?: AbortSignal },
|
|
306
553
|
): Promise<DelegateResult> {
|
|
307
|
-
|
|
308
|
-
|
|
554
|
+
if (opts.signal?.aborted) return { status: 'cancelled' }
|
|
555
|
+
const boundary = operationBoundary({
|
|
556
|
+
callerSignal: opts.signal,
|
|
557
|
+
timeoutMs: this.timeoutMs,
|
|
558
|
+
timeoutMessage: `A2A delegation timed out after ${this.timeoutMs}ms`,
|
|
559
|
+
// `message/send` has not returned an addressable task id yet. Hold
|
|
560
|
+
// transport abort for one bounded cleanup attempt if cancellation wins.
|
|
561
|
+
abortTransportInitially: false,
|
|
562
|
+
})
|
|
563
|
+
let initialRequest: Promise<unknown> | undefined
|
|
564
|
+
let sent: A2ATask | undefined
|
|
565
|
+
let latest: A2ATask | undefined
|
|
566
|
+
let taskId: string | undefined
|
|
567
|
+
try {
|
|
568
|
+
boundary.throwIfStopped()
|
|
569
|
+
initialRequest = this.rpc(
|
|
309
570
|
'message/send',
|
|
310
571
|
{ message: { role: 'user', parts: [{ kind: 'text', text: request.prompt }] } },
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
const tellThePeer = () => {
|
|
327
|
-
void this.rpc('tasks/cancel', { id: sent.id }).catch(() => {})
|
|
328
|
-
}
|
|
329
|
-
opts.signal?.addEventListener('abort', tellThePeer, { once: true })
|
|
330
|
-
if (opts.signal?.aborted) tellThePeer()
|
|
331
|
-
|
|
332
|
-
try {
|
|
333
|
-
const deadline = Date.now() + (this.config.timeoutMs ?? DEFAULT_TIMEOUT_MS)
|
|
334
|
-
let task = sent
|
|
335
|
-
while (!WILL_NOT_PROGRESS.has(task.status.state)) {
|
|
336
|
-
if (opts.signal?.aborted) {
|
|
337
|
-
// The peer has been told. Reported as cancelled rather than
|
|
338
|
-
// polled to a terminal state, because the parent has stopped
|
|
339
|
-
// waiting and the answer is no longer wanted.
|
|
340
|
-
return { status: 'cancelled' }
|
|
341
|
-
}
|
|
342
|
-
if (Date.now() > deadline) {
|
|
343
|
-
return {
|
|
344
|
-
status: 'failed',
|
|
345
|
-
error: `The peer was still ${task.status.state} after ${this.config.timeoutMs ?? DEFAULT_TIMEOUT_MS}ms.`,
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
await sleep(this.config.pollIntervalMs ?? DEFAULT_POLL_MS, opts.signal)
|
|
349
|
-
task = this.parseTask(
|
|
350
|
-
await this.rpc('tasks/get', { id: sent.id }, opts.signal),
|
|
572
|
+
boundary.signal,
|
|
573
|
+
)
|
|
574
|
+
const initialReply = await boundary.wait(initialRequest)
|
|
575
|
+
taskId = taskIdOf(initialReply)
|
|
576
|
+
sent = this.parseTask(initialReply, 'message/send')
|
|
577
|
+
latest = sent
|
|
578
|
+
if (WILL_NOT_PROGRESS.has(latest.status.state)) return await this.settleKnownTask(latest)
|
|
579
|
+
// From this point onward the peer has given us an id. Abort pending
|
|
580
|
+
// poll transport immediately, then address the remote task separately.
|
|
581
|
+
boundary.armTransportAbort()
|
|
582
|
+
boundary.throwIfStopped()
|
|
583
|
+
while (!WILL_NOT_PROGRESS.has(latest.status.state)) {
|
|
584
|
+
await boundary.wait(sleep(this.pollIntervalMs, boundary.signal))
|
|
585
|
+
latest = this.parseTask(
|
|
586
|
+
await boundary.wait(this.rpc('tasks/get', { id: sent.id }, boundary.signal)),
|
|
351
587
|
'tasks/get',
|
|
588
|
+
sent.id,
|
|
352
589
|
)
|
|
353
590
|
}
|
|
354
|
-
return
|
|
591
|
+
return await this.settleKnownTask(latest)
|
|
592
|
+
} catch (err) {
|
|
593
|
+
if (!(err instanceof OperationInterrupted)) {
|
|
594
|
+
// A protocol/HTTP/body failure does not prove a task that was already
|
|
595
|
+
// accepted by the peer stopped. Once we know its id, clean it up
|
|
596
|
+
// under the same bounded best-effort path, then preserve the original
|
|
597
|
+
// failure for the caller.
|
|
598
|
+
if (
|
|
599
|
+
taskId !== undefined &&
|
|
600
|
+
(latest === undefined || !WILL_NOT_PROGRESS.has(latest.status.state))
|
|
601
|
+
) {
|
|
602
|
+
await this.cancelPeer(taskId)
|
|
603
|
+
}
|
|
604
|
+
throw err
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
if (sent === undefined && initialRequest !== undefined) {
|
|
608
|
+
const recovered = await this.recoverInitialTask(initialRequest)
|
|
609
|
+
sent = recovered.task
|
|
610
|
+
latest = sent
|
|
611
|
+
taskId = recovered.taskId
|
|
612
|
+
boundary.abortTransport()
|
|
613
|
+
}
|
|
614
|
+
if (
|
|
615
|
+
taskId !== undefined &&
|
|
616
|
+
(latest === undefined || !WILL_NOT_PROGRESS.has(latest.status.state))
|
|
617
|
+
) {
|
|
618
|
+
await this.cancelPeer(taskId)
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
if (err.cause.kind === 'caller') return { status: 'cancelled' }
|
|
622
|
+
return {
|
|
623
|
+
status: 'failed',
|
|
624
|
+
error:
|
|
625
|
+
sent === undefined
|
|
626
|
+
? `The peer did not return a task id before the ${this.timeoutMs}ms delegation deadline; its remote outcome is unknown.`
|
|
627
|
+
: `The peer was still ${latest?.status.state ?? sent.status.state} after ${this.timeoutMs}ms.`,
|
|
628
|
+
}
|
|
355
629
|
} finally {
|
|
356
|
-
|
|
630
|
+
boundary.dispose()
|
|
357
631
|
}
|
|
358
632
|
}
|
|
359
633
|
}
|
|
360
634
|
|
|
361
|
-
function sleep(ms: number, signal
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
635
|
+
function sleep(ms: number, signal: AbortSignal): Promise<void> {
|
|
636
|
+
signal.throwIfAborted()
|
|
637
|
+
return new Promise((resolve, reject) => {
|
|
638
|
+
let settled = false
|
|
639
|
+
const cleanup = (): void => signal.removeEventListener('abort', onAbort)
|
|
640
|
+
const onAbort = (): void => {
|
|
641
|
+
if (settled) return
|
|
642
|
+
settled = true
|
|
365
643
|
clearTimeout(timer)
|
|
644
|
+
cleanup()
|
|
645
|
+
reject(signal.reason)
|
|
646
|
+
}
|
|
647
|
+
const timer = setTimeout(() => {
|
|
648
|
+
if (settled) return
|
|
649
|
+
settled = true
|
|
650
|
+
cleanup()
|
|
366
651
|
resolve()
|
|
367
|
-
})
|
|
652
|
+
}, ms)
|
|
653
|
+
signal.addEventListener('abort', onAbort, { once: true })
|
|
654
|
+
if (signal.aborted) onAbort()
|
|
368
655
|
})
|
|
369
656
|
}
|
package/src/bridge/a2a/mapper.ts
CHANGED
|
@@ -82,6 +82,11 @@ const MAPPING: {
|
|
|
82
82
|
// Capability degradation is host-facing diagnostics, not A2A task state.
|
|
83
83
|
capability_warning: null,
|
|
84
84
|
|
|
85
|
+
// Local history normalization is an operator/audit fact. The peer receives
|
|
86
|
+
// only the repaired provider-valid conversation, never this host's storage
|
|
87
|
+
// diagnosis or its counts.
|
|
88
|
+
message_history_repaired: null,
|
|
89
|
+
|
|
85
90
|
// Who approves on THIS side is an operator fact about this host, not a
|
|
86
91
|
// transition in the task the peer is watching. Forwarding it would also
|
|
87
92
|
// tell a remote caller how loosely its work is being supervised, which
|