@namzu/sdk 46.0.0 → 48.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 +351 -8
- package/README.md +7 -8
- package/dist/advisory/history.d.ts.map +1 -1
- package/dist/advisory/history.js +21 -1
- package/dist/advisory/history.js.map +1 -1
- package/dist/advisory/index.d.ts +1 -1
- package/dist/advisory/index.d.ts.map +1 -1
- package/dist/advisory/index.js +1 -1
- package/dist/advisory/index.js.map +1 -1
- package/dist/advisory/registry.d.ts +17 -0
- package/dist/advisory/registry.d.ts.map +1 -1
- package/dist/advisory/registry.js +26 -0
- package/dist/advisory/registry.js.map +1 -1
- package/dist/agents/PipelineAgent.d.ts +2 -46
- package/dist/agents/PipelineAgent.d.ts.map +1 -1
- package/dist/agents/PipelineAgent.js +2 -242
- package/dist/agents/PipelineAgent.js.map +1 -1
- package/dist/agents/QueryAgent.d.ts +21 -0
- package/dist/agents/QueryAgent.d.ts.map +1 -0
- package/dist/agents/QueryAgent.js +214 -0
- package/dist/agents/QueryAgent.js.map +1 -0
- package/dist/agents/ReactiveAgent.d.ts +4 -16
- package/dist/agents/ReactiveAgent.d.ts.map +1 -1
- package/dist/agents/ReactiveAgent.js +4 -183
- package/dist/agents/ReactiveAgent.js.map +1 -1
- package/dist/agents/RouterAgent.d.ts +2 -20
- package/dist/agents/RouterAgent.d.ts.map +1 -1
- package/dist/agents/RouterAgent.js +2 -266
- package/dist/agents/RouterAgent.js.map +1 -1
- package/dist/agents/SupervisorAgent.d.ts +3 -43
- package/dist/agents/SupervisorAgent.d.ts.map +1 -1
- package/dist/agents/SupervisorAgent.js +3 -418
- package/dist/agents/SupervisorAgent.js.map +1 -1
- package/dist/agents/defineAgent.d.ts +2 -1
- package/dist/agents/defineAgent.d.ts.map +1 -1
- package/dist/agents/defineAgent.js +6 -1
- package/dist/agents/defineAgent.js.map +1 -1
- package/dist/agents/examples/PipelineAgent.d.ts +46 -0
- package/dist/agents/examples/PipelineAgent.d.ts.map +1 -0
- package/dist/agents/examples/PipelineAgent.js +242 -0
- package/dist/agents/examples/PipelineAgent.js.map +1 -0
- package/dist/agents/examples/RouterAgent.d.ts +22 -0
- package/dist/agents/examples/RouterAgent.d.ts.map +1 -0
- package/dist/agents/examples/RouterAgent.js +268 -0
- package/dist/agents/examples/RouterAgent.js.map +1 -0
- package/dist/agents/examples/SupervisorAgent.d.ts +45 -0
- package/dist/agents/examples/SupervisorAgent.d.ts.map +1 -0
- package/dist/agents/examples/SupervisorAgent.js +406 -0
- package/dist/agents/examples/SupervisorAgent.js.map +1 -0
- package/dist/agents/explore.d.ts +6 -3
- package/dist/agents/explore.d.ts.map +1 -1
- package/dist/agents/explore.js +6 -3
- package/dist/agents/explore.js.map +1 -1
- package/dist/agents/forward-options.d.ts +11 -0
- package/dist/agents/forward-options.d.ts.map +1 -0
- package/dist/agents/forward-options.js +15 -0
- package/dist/agents/forward-options.js.map +1 -0
- package/dist/agents/index.d.ts +1 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +2 -0
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/runAgent.d.ts +19 -8
- package/dist/agents/runAgent.d.ts.map +1 -1
- package/dist/agents/runAgent.js +99 -29
- package/dist/agents/runAgent.js.map +1 -1
- package/dist/authorization/command-line.d.ts +2 -0
- package/dist/authorization/command-line.d.ts.map +1 -1
- package/dist/authorization/command-line.js +2 -2
- package/dist/authorization/command-line.js.map +1 -1
- package/dist/authorization/gate.d.ts +8 -0
- package/dist/authorization/gate.d.ts.map +1 -1
- package/dist/authorization/gate.js +12 -1
- package/dist/authorization/gate.js.map +1 -1
- package/dist/authorization/program.d.ts +151 -0
- package/dist/authorization/program.d.ts.map +1 -0
- package/dist/authorization/program.js +713 -0
- package/dist/authorization/program.js.map +1 -0
- package/dist/authorization/reexec-wrapper.d.ts +106 -0
- package/dist/authorization/reexec-wrapper.d.ts.map +1 -0
- package/dist/authorization/reexec-wrapper.js +532 -0
- package/dist/authorization/reexec-wrapper.js.map +1 -0
- package/dist/authorization/rules.d.ts +9 -0
- package/dist/authorization/rules.d.ts.map +1 -1
- package/dist/authorization/rules.js +8 -1
- package/dist/authorization/rules.js.map +1 -1
- package/dist/authorization/shell-lexer.d.ts +19 -4
- package/dist/authorization/shell-lexer.d.ts.map +1 -1
- package/dist/authorization/shell-lexer.js +91 -65
- package/dist/authorization/shell-lexer.js.map +1 -1
- package/dist/bridge/sse/mapper.d.ts.map +1 -1
- package/dist/bridge/sse/mapper.js +6 -0
- package/dist/bridge/sse/mapper.js.map +1 -1
- package/dist/capabilities/index.d.ts +54 -0
- package/dist/capabilities/index.d.ts.map +1 -0
- package/dist/capabilities/index.js +92 -0
- package/dist/capabilities/index.js.map +1 -0
- package/dist/config/registry.d.ts +2 -1
- package/dist/config/registry.d.ts.map +1 -1
- package/dist/config/registry.js +3 -2
- package/dist/config/registry.js.map +1 -1
- package/dist/connector/index.d.ts +4 -4
- package/dist/connector/index.d.ts.map +1 -1
- package/dist/connector/index.js +3 -3
- package/dist/connector/index.js.map +1 -1
- package/dist/connector/mcp/adapter.d.ts +16 -1
- package/dist/connector/mcp/adapter.d.ts.map +1 -1
- package/dist/connector/mcp/adapter.js +71 -4
- package/dist/connector/mcp/adapter.js.map +1 -1
- package/dist/connector/mcp/client.d.ts +32 -4
- package/dist/connector/mcp/client.d.ts.map +1 -1
- package/dist/connector/mcp/client.js +383 -5
- package/dist/connector/mcp/client.js.map +1 -1
- package/dist/connector/mcp/discovery.d.ts +24 -1
- package/dist/connector/mcp/discovery.d.ts.map +1 -1
- package/dist/connector/mcp/discovery.js +44 -0
- package/dist/connector/mcp/discovery.js.map +1 -1
- package/dist/connector/mcp/era.d.ts.map +1 -1
- package/dist/connector/mcp/era.js +7 -0
- package/dist/connector/mcp/era.js.map +1 -1
- package/dist/connector/mcp/index.d.ts +2 -0
- package/dist/connector/mcp/index.d.ts.map +1 -1
- package/dist/connector/mcp/index.js +11 -0
- package/dist/connector/mcp/index.js.map +1 -1
- package/dist/connector/mcp/mcp-toolset.d.ts +133 -0
- package/dist/connector/mcp/mcp-toolset.d.ts.map +1 -0
- package/dist/connector/mcp/mcp-toolset.js +399 -0
- package/dist/connector/mcp/mcp-toolset.js.map +1 -0
- package/dist/connector/mcp/streamable-http.d.ts +15 -0
- package/dist/connector/mcp/streamable-http.d.ts.map +1 -1
- package/dist/connector/mcp/streamable-http.js +281 -6
- package/dist/connector/mcp/streamable-http.js.map +1 -1
- package/dist/connector/tools/index.d.ts +2 -2
- package/dist/connector/tools/index.d.ts.map +1 -1
- package/dist/connector/tools/index.js +1 -1
- package/dist/connector/tools/index.js.map +1 -1
- package/dist/connector/tools/router.d.ts +15 -13
- package/dist/connector/tools/router.d.ts.map +1 -1
- package/dist/connector/tools/router.js +30 -51
- package/dist/connector/tools/router.js.map +1 -1
- package/dist/contracts/a2a.d.ts +2 -2
- package/dist/directory/derive-supervisor.d.ts +2 -2
- package/dist/directory/derive-supervisor.d.ts.map +1 -1
- package/dist/directory/derive-supervisor.js +6 -7
- package/dist/directory/derive-supervisor.js.map +1 -1
- package/dist/directory/derive.d.ts.map +1 -1
- package/dist/directory/derive.js +5 -5
- package/dist/directory/derive.js.map +1 -1
- package/dist/execution/code-runtime/types.d.ts +2 -2
- package/dist/execution/code-runtime/types.js +1 -1
- package/dist/invariants/index.d.ts +2 -1
- package/dist/invariants/index.d.ts.map +1 -1
- package/dist/invariants/index.js +3 -2
- package/dist/invariants/index.js.map +1 -1
- package/dist/manager/agent/lifecycle.d.ts +1 -0
- package/dist/manager/agent/lifecycle.d.ts.map +1 -1
- package/dist/manager/agent/lifecycle.js +146 -18
- package/dist/manager/agent/lifecycle.js.map +1 -1
- package/dist/manager/connector/environment.d.ts +6 -0
- package/dist/manager/connector/environment.d.ts.map +1 -1
- package/dist/manager/connector/environment.js +11 -4
- package/dist/manager/connector/environment.js.map +1 -1
- package/dist/manager/connector/index.d.ts +2 -2
- package/dist/manager/connector/index.d.ts.map +1 -1
- package/dist/manager/connector/index.js +2 -2
- package/dist/manager/connector/index.js.map +1 -1
- package/dist/manager/connector/tenant.d.ts +6 -0
- package/dist/manager/connector/tenant.d.ts.map +1 -1
- package/dist/manager/connector/tenant.js +11 -4
- package/dist/manager/connector/tenant.js.map +1 -1
- package/dist/manager/index.d.ts +2 -2
- package/dist/manager/index.d.ts.map +1 -1
- package/dist/manager/index.js +2 -2
- package/dist/manager/index.js.map +1 -1
- package/dist/manager/resident/initiative.d.ts +6 -6
- package/dist/manager/resident/learning-observation.d.ts +4 -4
- package/dist/manager/resident/learning.d.ts +36 -36
- package/dist/manager/resident/outbox.d.ts +4 -4
- package/dist/manager/session/attribution.d.ts +22 -0
- package/dist/manager/session/attribution.d.ts.map +1 -0
- package/dist/manager/session/attribution.js +64 -0
- package/dist/manager/session/attribution.js.map +1 -0
- package/dist/manager/session/turn-recorder.d.ts +14 -0
- package/dist/manager/session/turn-recorder.d.ts.map +1 -1
- package/dist/manager/session/turn-recorder.js +208 -55
- package/dist/manager/session/turn-recorder.js.map +1 -1
- package/dist/peers/address.d.ts +36 -0
- package/dist/peers/address.d.ts.map +1 -0
- package/dist/peers/address.js +52 -0
- package/dist/peers/address.js.map +1 -0
- package/dist/peers/client.d.ts +47 -0
- package/dist/peers/client.d.ts.map +1 -0
- package/dist/peers/client.js +132 -0
- package/dist/peers/client.js.map +1 -0
- package/dist/peers/dir.d.ts +88 -0
- package/dist/peers/dir.d.ts.map +1 -0
- package/dist/peers/dir.js +139 -0
- package/dist/peers/dir.js.map +1 -0
- package/dist/peers/endpoint.d.ts +144 -0
- package/dist/peers/endpoint.d.ts.map +1 -0
- package/dist/peers/endpoint.js +420 -0
- package/dist/peers/endpoint.js.map +1 -0
- package/dist/peers/envelope.d.ts +42 -0
- package/dist/peers/envelope.d.ts.map +1 -0
- package/dist/peers/envelope.js +110 -0
- package/dist/peers/envelope.js.map +1 -0
- package/dist/peers/index.d.ts +30 -0
- package/dist/peers/index.d.ts.map +1 -0
- package/dist/peers/index.js +22 -0
- package/dist/peers/index.js.map +1 -0
- package/dist/peers/protocol.d.ts +645 -0
- package/dist/peers/protocol.d.ts.map +1 -0
- package/dist/peers/protocol.js +151 -0
- package/dist/peers/protocol.js.map +1 -0
- package/dist/peers/record.d.ts +71 -0
- package/dist/peers/record.d.ts.map +1 -0
- package/dist/peers/record.js +45 -0
- package/dist/peers/record.js.map +1 -0
- package/dist/peers/registry.d.ts +54 -0
- package/dist/peers/registry.d.ts.map +1 -0
- package/dist/peers/registry.js +213 -0
- package/dist/peers/registry.js.map +1 -0
- package/dist/plugin/define.d.ts +24 -0
- package/dist/plugin/define.d.ts.map +1 -0
- package/dist/plugin/define.js +42 -0
- package/dist/plugin/define.js.map +1 -0
- package/dist/plugin/index.d.ts +2 -0
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js +1 -0
- package/dist/plugin/index.js.map +1 -1
- package/dist/plugin/lifecycle.d.ts +27 -3
- package/dist/plugin/lifecycle.d.ts.map +1 -1
- package/dist/plugin/lifecycle.js +242 -92
- package/dist/plugin/lifecycle.js.map +1 -1
- package/dist/plugin/resolver.d.ts +2 -2
- package/dist/plugin/resolver.d.ts.map +1 -1
- package/dist/plugin/resolver.js.map +1 -1
- package/dist/plugin/shell-hook.d.ts.map +1 -1
- package/dist/plugin/shell-hook.js +17 -3
- package/dist/plugin/shell-hook.js.map +1 -1
- package/dist/probe/errors.d.ts +2 -1
- package/dist/probe/errors.d.ts.map +1 -1
- package/dist/probe/errors.js +3 -2
- package/dist/probe/errors.js.map +1 -1
- package/dist/prompt/coding-agent-doctrine.d.ts +18 -7
- package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -1
- package/dist/prompt/coding-agent-doctrine.js +11 -6
- package/dist/prompt/coding-agent-doctrine.js.map +1 -1
- package/dist/prompt/contributions.d.ts +4 -1
- package/dist/prompt/contributions.d.ts.map +1 -1
- package/dist/prompt/contributions.js +7 -2
- package/dist/prompt/contributions.js.map +1 -1
- package/dist/prompt/index.d.ts +1 -1
- package/dist/prompt/index.d.ts.map +1 -1
- package/dist/prompt/index.js +1 -1
- package/dist/prompt/index.js.map +1 -1
- package/dist/provider/collect-chat-completion.d.ts +6 -1
- package/dist/provider/collect-chat-completion.d.ts.map +1 -1
- package/dist/provider/collect-chat-completion.js +88 -10
- package/dist/provider/collect-chat-completion.js.map +1 -1
- package/dist/provider/mock.d.ts.map +1 -1
- package/dist/provider/mock.js +23 -6
- package/dist/provider/mock.js.map +1 -1
- package/dist/provider/registry.d.ts +2 -1
- package/dist/provider/registry.d.ts.map +1 -1
- package/dist/provider/registry.js +3 -2
- package/dist/provider/registry.js.map +1 -1
- package/dist/provider/tool-call-framing.d.ts +164 -0
- package/dist/provider/tool-call-framing.d.ts.map +1 -0
- package/dist/provider/tool-call-framing.js +163 -0
- package/dist/provider/tool-call-framing.js.map +1 -0
- package/dist/public-runtime.d.ts +24 -11
- package/dist/public-runtime.d.ts.map +1 -1
- package/dist/public-runtime.js +45 -9
- package/dist/public-runtime.js.map +1 -1
- package/dist/public-tools.d.ts +6 -4
- package/dist/public-tools.d.ts.map +1 -1
- package/dist/public-tools.js +8 -3
- package/dist/public-tools.js.map +1 -1
- package/dist/public-types.d.ts +13 -2
- package/dist/public-types.d.ts.map +1 -1
- package/dist/read-model/registry.d.ts +2 -1
- package/dist/read-model/registry.d.ts.map +1 -1
- package/dist/read-model/registry.js +3 -2
- package/dist/read-model/registry.js.map +1 -1
- package/dist/registry/ManagedRegistry.d.ts +30 -0
- package/dist/registry/ManagedRegistry.d.ts.map +1 -1
- package/dist/registry/ManagedRegistry.js +45 -6
- package/dist/registry/ManagedRegistry.js.map +1 -1
- package/dist/registry/collision.d.ts +57 -0
- package/dist/registry/collision.d.ts.map +1 -0
- package/dist/registry/collision.js +41 -0
- package/dist/registry/collision.js.map +1 -0
- package/dist/registry/command/index.d.ts +5 -3
- package/dist/registry/command/index.d.ts.map +1 -1
- package/dist/registry/command/index.js +6 -4
- package/dist/registry/command/index.js.map +1 -1
- package/dist/registry/index.d.ts +3 -4
- package/dist/registry/index.d.ts.map +1 -1
- package/dist/registry/index.js +2 -2
- package/dist/registry/index.js.map +1 -1
- package/dist/registry/plugin/index.d.ts.map +1 -1
- package/dist/registry/plugin/index.js +14 -1
- package/dist/registry/plugin/index.js.map +1 -1
- package/dist/registry/tool/callable.d.ts +7 -7
- package/dist/registry/tool/callable.d.ts.map +1 -1
- package/dist/registry/tool/callable.js +6 -7
- package/dist/registry/tool/callable.js.map +1 -1
- package/dist/registry/tool/execute.d.ts +14 -77
- package/dist/registry/tool/execute.d.ts.map +1 -1
- package/dist/registry/tool/execute.js +15 -727
- package/dist/registry/tool/execute.js.map +1 -1
- package/dist/registry/tool/portable.d.ts +25 -0
- package/dist/registry/tool/portable.d.ts.map +1 -1
- package/dist/registry/tool/portable.js +50 -0
- package/dist/registry/tool/portable.js.map +1 -1
- package/dist/registry/tool/presentation.d.ts +6 -5
- package/dist/registry/tool/presentation.d.ts.map +1 -1
- package/dist/registry/tool/presentation.js +3 -3
- package/dist/registry/tool/presentation.js.map +1 -1
- package/dist/runtime/bidi/session.d.ts +5 -4
- package/dist/runtime/bidi/session.d.ts.map +1 -1
- package/dist/runtime/bidi/session.js +18 -1
- package/dist/runtime/bidi/session.js.map +1 -1
- package/dist/runtime/query/executor/tool-call-admission.d.ts +45 -2
- package/dist/runtime/query/executor/tool-call-admission.d.ts.map +1 -1
- package/dist/runtime/query/executor/tool-call-admission.js +189 -5
- package/dist/runtime/query/executor/tool-call-admission.js.map +1 -1
- package/dist/runtime/query/executor.d.ts +33 -3
- package/dist/runtime/query/executor.d.ts.map +1 -1
- package/dist/runtime/query/executor.js +86 -10
- package/dist/runtime/query/executor.js.map +1 -1
- package/dist/runtime/query/file-evidence-replay.d.ts +1 -1
- package/dist/runtime/query/file-evidence-replay.d.ts.map +1 -1
- package/dist/runtime/query/file-evidence-replay.js +8 -7
- package/dist/runtime/query/file-evidence-replay.js.map +1 -1
- package/dist/runtime/query/fork/prepare.d.ts +4 -1
- package/dist/runtime/query/fork/prepare.d.ts.map +1 -1
- package/dist/runtime/query/fork/prepare.js +4 -0
- package/dist/runtime/query/fork/prepare.js.map +1 -1
- package/dist/runtime/query/guardrail-presets.d.ts +4 -3
- package/dist/runtime/query/guardrail-presets.d.ts.map +1 -1
- package/dist/runtime/query/guardrail-presets.js +4 -3
- package/dist/runtime/query/guardrail-presets.js.map +1 -1
- package/dist/runtime/query/index.d.ts +23 -10
- package/dist/runtime/query/index.d.ts.map +1 -1
- package/dist/runtime/query/index.js +149 -70
- 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 +8 -1
- package/dist/runtime/query/iteration/index.js.map +1 -1
- package/dist/runtime/query/iteration/phases/compaction.js +1 -1
- package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
- package/dist/runtime/query/iteration/phases/context.d.ts +2 -2
- package/dist/runtime/query/iteration/phases/context.d.ts.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 +55 -2
- 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 +342 -116
- package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
- package/dist/runtime/query/iteration/tool-input.d.ts +79 -0
- package/dist/runtime/query/iteration/tool-input.d.ts.map +1 -0
- package/dist/runtime/query/iteration/tool-input.js +291 -0
- package/dist/runtime/query/iteration/tool-input.js.map +1 -0
- package/dist/runtime/query/observation-context.d.ts +2 -2
- package/dist/runtime/query/observation-context.d.ts.map +1 -1
- package/dist/runtime/query/observation-context.js.map +1 -1
- package/dist/runtime/query/prelude-lease.d.ts +18 -0
- package/dist/runtime/query/prelude-lease.d.ts.map +1 -0
- package/dist/runtime/query/prelude-lease.js +121 -0
- package/dist/runtime/query/prelude-lease.js.map +1 -0
- package/dist/runtime/query/prepare-turn.d.ts.map +1 -1
- package/dist/runtime/query/prepare-turn.js +386 -187
- package/dist/runtime/query/prepare-turn.js.map +1 -1
- package/dist/runtime/query/prompt-cache.d.ts +2 -2
- package/dist/runtime/query/prompt-cache.d.ts.map +1 -1
- package/dist/runtime/query/prompt.d.ts +2 -2
- package/dist/runtime/query/prompt.d.ts.map +1 -1
- package/dist/runtime/query/prompt.js +1 -1
- package/dist/runtime/query/prompt.js.map +1 -1
- package/dist/runtime/query/resume-session.d.ts.map +1 -1
- package/dist/runtime/query/resume-session.js +37 -2
- package/dist/runtime/query/resume-session.js.map +1 -1
- package/dist/runtime/query/review-policy.d.ts +22 -3
- package/dist/runtime/query/review-policy.d.ts.map +1 -1
- package/dist/runtime/query/review-policy.js +84 -6
- package/dist/runtime/query/review-policy.js.map +1 -1
- package/dist/runtime/query/tooling.d.ts +3 -2
- package/dist/runtime/query/tooling.d.ts.map +1 -1
- package/dist/runtime/query/tooling.js.map +1 -1
- package/dist/runtime/query/turn-state.d.ts.map +1 -1
- package/dist/runtime/query/turn-state.js +5 -0
- package/dist/runtime/query/turn-state.js.map +1 -1
- package/dist/runtime/system-events.d.ts +112 -0
- package/dist/runtime/system-events.d.ts.map +1 -0
- package/dist/runtime/system-events.js +183 -0
- package/dist/runtime/system-events.js.map +1 -0
- package/dist/scheduler/delegating.d.ts +2 -1
- package/dist/scheduler/delegating.d.ts.map +1 -1
- package/dist/scheduler/delegating.js +3 -2
- package/dist/scheduler/delegating.js.map +1 -1
- package/dist/scheduler/local.d.ts.map +1 -1
- package/dist/scheduler/local.js +2 -0
- package/dist/scheduler/local.js.map +1 -1
- package/dist/session/retention/archive.js +1 -1
- package/dist/session/retention/archive.js.map +1 -1
- package/dist/skills/index.d.ts +1 -1
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +1 -1
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/registry.d.ts +12 -0
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +19 -0
- package/dist/skills/registry.js.map +1 -1
- package/dist/store/evidence/index-page.d.ts +2 -2
- package/dist/store/session/disk.d.ts.map +1 -1
- package/dist/store/session/disk.js +2 -0
- package/dist/store/session/disk.js.map +1 -1
- package/dist/store/session-log/conformance.d.ts +1 -1
- package/dist/store/session-log/conformance.d.ts.map +1 -1
- package/dist/store/session-log/conformance.js +49 -8
- package/dist/store/session-log/conformance.js.map +1 -1
- package/dist/store/session-log/core.d.ts +8 -3
- package/dist/store/session-log/core.d.ts.map +1 -1
- package/dist/store/session-log/core.js +2 -1
- package/dist/store/session-log/core.js.map +1 -1
- package/dist/store/session-log/fold.d.ts +12 -0
- package/dist/store/session-log/fold.d.ts.map +1 -1
- package/dist/store/session-log/fold.js +57 -7
- package/dist/store/session-log/fold.js.map +1 -1
- package/dist/store/session-log/index.d.ts +2 -2
- package/dist/store/session-log/index.d.ts.map +1 -1
- package/dist/store/session-log/index.js +1 -1
- package/dist/store/session-log/index.js.map +1 -1
- package/dist/test-support/toolset.d.ts +19 -0
- package/dist/test-support/toolset.d.ts.map +1 -0
- package/dist/test-support/toolset.js +20 -0
- package/dist/test-support/toolset.js.map +1 -0
- package/dist/tools/builtins/bash.d.ts +29 -0
- package/dist/tools/builtins/bash.d.ts.map +1 -1
- package/dist/tools/builtins/bash.js +19 -9
- package/dist/tools/builtins/bash.js.map +1 -1
- package/dist/tools/builtins/browser-url.d.ts +1 -1
- package/dist/tools/builtins/browser-url.js +1 -1
- package/dist/tools/builtins/browser.d.ts +6 -6
- package/dist/tools/builtins/browser.js +2 -2
- package/dist/tools/builtins/browser.js.map +1 -1
- package/dist/tools/builtins/computer-use.d.ts.map +1 -1
- package/dist/tools/builtins/computer-use.js +19 -11
- package/dist/tools/builtins/computer-use.js.map +1 -1
- package/dist/tools/builtins/edit.d.ts.map +1 -1
- package/dist/tools/builtins/edit.js +9 -1
- package/dist/tools/builtins/edit.js.map +1 -1
- package/dist/tools/builtins/json-string-hint.d.ts +15 -0
- package/dist/tools/builtins/json-string-hint.d.ts.map +1 -0
- package/dist/tools/builtins/json-string-hint.js +17 -0
- package/dist/tools/builtins/json-string-hint.js.map +1 -0
- package/dist/tools/builtins/search-tools.d.ts.map +1 -1
- package/dist/tools/builtins/search-tools.js +7 -15
- package/dist/tools/builtins/search-tools.js.map +1 -1
- package/dist/tools/builtins/write-file.d.ts.map +1 -1
- package/dist/tools/builtins/write-file.js +11 -0
- package/dist/tools/builtins/write-file.js.map +1 -1
- package/dist/tools/command-shell.d.ts +10 -0
- package/dist/tools/command-shell.d.ts.map +1 -1
- package/dist/tools/command-shell.js +45 -1
- package/dist/tools/command-shell.js.map +1 -1
- package/dist/tools/coordinator/agent.d.ts.map +1 -1
- package/dist/tools/coordinator/agent.js +5 -0
- package/dist/tools/coordinator/agent.js.map +1 -1
- package/dist/tools/coordinator/ask-user-question.d.ts.map +1 -1
- package/dist/tools/coordinator/ask-user-question.js +26 -13
- package/dist/tools/coordinator/ask-user-question.js.map +1 -1
- package/dist/tools/coordinator/index.d.ts.map +1 -1
- package/dist/tools/coordinator/index.js +5 -0
- package/dist/tools/coordinator/index.js.map +1 -1
- package/dist/tools/coordinator/question-options.d.ts +78 -0
- package/dist/tools/coordinator/question-options.d.ts.map +1 -0
- package/dist/tools/coordinator/question-options.js +153 -0
- package/dist/tools/coordinator/question-options.js.map +1 -0
- package/dist/tools/defineTool.d.ts +10 -0
- package/dist/tools/defineTool.d.ts.map +1 -1
- package/dist/tools/defineTool.js +17 -0
- package/dist/tools/defineTool.js.map +1 -1
- package/dist/tools/memory/search.d.ts.map +1 -1
- package/dist/tools/memory/search.js +4 -1
- package/dist/tools/memory/search.js.map +1 -1
- package/dist/tools/memory/update.d.ts.map +1 -1
- package/dist/tools/memory/update.js +8 -5
- package/dist/tools/memory/update.js.map +1 -1
- package/dist/tools/render-nonce.d.ts +47 -0
- package/dist/tools/render-nonce.d.ts.map +1 -0
- package/dist/tools/render-nonce.js +63 -0
- package/dist/tools/render-nonce.js.map +1 -0
- package/dist/tools/roster.d.ts +46 -19
- package/dist/tools/roster.d.ts.map +1 -1
- package/dist/tools/roster.js +63 -33
- package/dist/tools/roster.js.map +1 -1
- package/dist/tools/schedules/schedule-tool.d.ts.map +1 -1
- package/dist/tools/schedules/schedule-tool.js +94 -14
- package/dist/tools/schedules/schedule-tool.js.map +1 -1
- package/dist/tools/schedules/types.d.ts +52 -6
- package/dist/tools/schedules/types.d.ts.map +1 -1
- package/dist/tools/trusted-read-only.d.ts +9 -5
- package/dist/tools/trusted-read-only.d.ts.map +1 -1
- package/dist/tools/trusted-read-only.js +14 -10
- package/dist/tools/trusted-read-only.js.map +1 -1
- package/dist/tools/untrusted-envelope.d.ts +67 -28
- package/dist/tools/untrusted-envelope.d.ts.map +1 -1
- package/dist/tools/untrusted-envelope.js +108 -59
- package/dist/tools/untrusted-envelope.js.map +1 -1
- package/dist/toolsets/combine.d.ts +44 -0
- package/dist/toolsets/combine.d.ts.map +1 -0
- package/dist/toolsets/combine.js +153 -0
- package/dist/toolsets/combine.js.map +1 -0
- package/dist/toolsets/manager.d.ts +201 -0
- package/dist/toolsets/manager.d.ts.map +1 -0
- package/dist/toolsets/manager.js +837 -0
- package/dist/toolsets/manager.js.map +1 -0
- package/dist/toolsets/source-glob.d.ts +15 -0
- package/dist/toolsets/source-glob.d.ts.map +1 -0
- package/dist/toolsets/source-glob.js +23 -0
- package/dist/toolsets/source-glob.js.map +1 -0
- package/dist/toolsets/toolset.d.ts +20 -0
- package/dist/toolsets/toolset.d.ts.map +1 -0
- package/dist/toolsets/toolset.js +28 -0
- package/dist/toolsets/toolset.js.map +1 -0
- package/dist/toolsets/types.d.ts +128 -0
- package/dist/toolsets/types.d.ts.map +1 -0
- package/dist/toolsets/types.js +33 -0
- package/dist/toolsets/types.js.map +1 -0
- package/dist/toolsets/wrappers.d.ts +59 -0
- package/dist/toolsets/wrappers.d.ts.map +1 -0
- package/dist/toolsets/wrappers.js +165 -0
- package/dist/toolsets/wrappers.js.map +1 -0
- package/dist/types/agent/base.d.ts +27 -16
- package/dist/types/agent/base.d.ts.map +1 -1
- package/dist/types/agent/index.d.ts +1 -0
- package/dist/types/agent/index.d.ts.map +1 -1
- package/dist/types/agent/index.js +1 -0
- package/dist/types/agent/index.js.map +1 -1
- package/dist/types/agent/pipeline.d.ts +2 -0
- package/dist/types/agent/pipeline.d.ts.map +1 -1
- package/dist/types/agent/query.d.ts +117 -0
- package/dist/types/agent/query.d.ts.map +1 -0
- package/dist/types/agent/query.js +2 -0
- package/dist/types/agent/query.js.map +1 -0
- package/dist/types/agent/reactive.d.ts +2 -129
- package/dist/types/agent/reactive.d.ts.map +1 -1
- package/dist/types/agent/router.d.ts +2 -0
- package/dist/types/agent/router.d.ts.map +1 -1
- package/dist/types/agent/scheduler.d.ts +6 -1
- package/dist/types/agent/scheduler.d.ts.map +1 -1
- package/dist/types/agent/supervisor.d.ts +5 -2
- package/dist/types/agent/supervisor.d.ts.map +1 -1
- package/dist/types/agent/task.d.ts +19 -1
- package/dist/types/agent/task.d.ts.map +1 -1
- package/dist/types/agent/task.js.map +1 -1
- package/dist/types/authorization/index.d.ts +49 -12
- package/dist/types/authorization/index.d.ts.map +1 -1
- package/dist/types/authorization/index.js +6 -0
- package/dist/types/authorization/index.js.map +1 -1
- package/dist/types/connector/mcp.d.ts +45 -0
- package/dist/types/connector/mcp.d.ts.map +1 -1
- package/dist/types/errors/index.d.ts +15 -0
- package/dist/types/errors/index.d.ts.map +1 -1
- package/dist/types/errors/index.js.map +1 -1
- package/dist/types/hitl/index.d.ts +57 -0
- package/dist/types/hitl/index.d.ts.map +1 -1
- package/dist/types/hitl/index.js.map +1 -1
- package/dist/types/message/index.d.ts +130 -9
- package/dist/types/message/index.d.ts.map +1 -1
- package/dist/types/message/index.js +4 -1
- package/dist/types/message/index.js.map +1 -1
- package/dist/types/plugin/index.d.ts +22 -4
- package/dist/types/plugin/index.d.ts.map +1 -1
- package/dist/types/plugin/index.js +1 -0
- package/dist/types/plugin/index.js.map +1 -1
- package/dist/types/provider/chat.d.ts +5 -0
- package/dist/types/provider/chat.d.ts.map +1 -1
- package/dist/types/provider/config.d.ts +8 -3
- package/dist/types/provider/config.d.ts.map +1 -1
- package/dist/types/provider/stream.d.ts +39 -0
- package/dist/types/provider/stream.d.ts.map +1 -1
- package/dist/types/sandbox/index.d.ts +1 -1
- package/dist/types/session/events.d.ts +14 -3
- package/dist/types/session/events.d.ts.map +1 -1
- package/dist/types/session/events.js.map +1 -1
- package/dist/types/session/sub-session.d.ts +2 -0
- package/dist/types/session/sub-session.d.ts.map +1 -1
- package/dist/types/tool/index.d.ts +152 -91
- package/dist/types/tool/index.d.ts.map +1 -1
- package/dist/types/tool/index.js.map +1 -1
- package/dist/types/toolset/index.d.ts +10 -40
- package/dist/types/toolset/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/advisory/history.ts +27 -2
- package/src/advisory/index.ts +1 -1
- package/src/advisory/registry.ts +33 -0
- package/src/agents/AGENTS.md +14 -7
- package/src/agents/PipelineAgent.ts +2 -303
- package/src/agents/QueryAgent.ts +269 -0
- package/src/agents/ReactiveAgent.ts +6 -216
- package/src/agents/RouterAgent.ts +2 -337
- package/src/agents/SupervisorAgent.ts +3 -476
- package/src/agents/defineAgent.ts +13 -2
- package/src/agents/examples/PipelineAgent.ts +302 -0
- package/src/agents/examples/RouterAgent.ts +338 -0
- package/src/agents/examples/SupervisorAgent.ts +472 -0
- package/src/agents/explore.ts +6 -3
- package/src/agents/forward-options.ts +37 -0
- package/src/agents/index.ts +2 -0
- package/src/agents/runAgent.ts +144 -37
- package/src/authorization/command-line.ts +2 -2
- package/src/authorization/gate.ts +21 -1
- package/src/authorization/program.ts +773 -0
- package/src/authorization/reexec-wrapper.ts +589 -0
- package/src/authorization/rules.ts +18 -1
- package/src/authorization/shell-lexer.ts +104 -59
- package/src/bridge/sse/mapper.ts +6 -0
- package/src/capabilities/index.ts +157 -0
- package/src/config/registry.ts +4 -1
- package/src/connector/index.ts +9 -2
- package/src/connector/mcp/adapter.ts +73 -3
- package/src/connector/mcp/client.ts +425 -6
- package/src/connector/mcp/discovery.ts +60 -0
- package/src/connector/mcp/era.ts +7 -0
- package/src/connector/mcp/index.ts +13 -0
- package/src/connector/mcp/mcp-toolset.ts +515 -0
- package/src/connector/mcp/streamable-http.ts +302 -5
- package/src/connector/tools/index.ts +2 -2
- package/src/connector/tools/router.ts +35 -58
- package/src/directory/derive-supervisor.ts +12 -8
- package/src/directory/derive.ts +8 -5
- package/src/execution/code-runtime/types.ts +2 -2
- package/src/invariants/index.ts +4 -1
- package/src/manager/agent/lifecycle.ts +167 -19
- package/src/manager/connector/environment.ts +17 -4
- package/src/manager/connector/index.ts +2 -2
- package/src/manager/connector/tenant.ts +17 -4
- package/src/manager/index.ts +2 -2
- package/src/manager/session/attribution.ts +79 -0
- package/src/manager/session/turn-recorder.ts +211 -55
- package/src/peers/address.ts +58 -0
- package/src/peers/client.ts +202 -0
- package/src/peers/dir.ts +176 -0
- package/src/peers/endpoint.ts +564 -0
- package/src/peers/envelope.ts +121 -0
- package/src/peers/index.ts +96 -0
- package/src/peers/protocol.ts +196 -0
- package/src/peers/record.ts +56 -0
- package/src/peers/registry.ts +241 -0
- package/src/plugin/define.ts +68 -0
- package/src/plugin/index.ts +2 -0
- package/src/plugin/lifecycle.ts +286 -106
- package/src/plugin/resolver.ts +6 -3
- package/src/plugin/shell-hook.ts +21 -5
- package/src/probe/errors.ts +4 -1
- package/src/prompt/coding-agent-doctrine.ts +22 -10
- package/src/prompt/contributions.ts +12 -2
- package/src/prompt/index.ts +1 -0
- package/src/provider/collect-chat-completion.ts +96 -11
- package/src/provider/mock.ts +24 -6
- package/src/provider/registry.ts +4 -1
- package/src/provider/tool-call-framing.ts +226 -0
- package/src/public-runtime.ts +136 -7
- package/src/public-tools.ts +24 -4
- package/src/public-types.ts +60 -6
- package/src/read-model/registry.ts +7 -2
- package/src/registry/ManagedRegistry.ts +57 -6
- package/src/registry/collision.ts +64 -0
- package/src/registry/command/index.ts +7 -3
- package/src/registry/index.ts +3 -9
- package/src/registry/plugin/index.ts +14 -1
- package/src/registry/tool/callable.ts +8 -9
- package/src/registry/tool/execute.ts +16 -846
- package/src/registry/tool/portable.ts +59 -0
- package/src/registry/tool/presentation.ts +6 -5
- package/src/runtime/bidi/session.ts +24 -5
- package/src/runtime/query/executor/tool-call-admission.ts +228 -6
- package/src/runtime/query/executor.ts +110 -12
- package/src/runtime/query/file-evidence-replay.ts +8 -7
- package/src/runtime/query/fork/prepare.ts +6 -1
- package/src/runtime/query/guardrail-presets.ts +4 -3
- package/src/runtime/query/index.ts +199 -101
- package/src/runtime/query/iteration/index.ts +13 -3
- package/src/runtime/query/iteration/phases/compaction.ts +1 -1
- package/src/runtime/query/iteration/phases/context.ts +2 -2
- package/src/runtime/query/iteration/phases/tool-review.ts +59 -2
- package/src/runtime/query/iteration/stream-turn.ts +390 -136
- package/src/runtime/query/iteration/tool-input.ts +284 -0
- package/src/runtime/query/observation-context.ts +2 -2
- package/src/runtime/query/prelude-lease.ts +132 -0
- package/src/runtime/query/prepare-turn.ts +477 -198
- package/src/runtime/query/prompt-cache.ts +2 -2
- package/src/runtime/query/prompt.ts +4 -4
- package/src/runtime/query/resume-session.ts +42 -3
- package/src/runtime/query/review-policy.ts +87 -9
- package/src/runtime/query/tooling.ts +3 -6
- package/src/runtime/query/turn-state.ts +4 -0
- package/src/runtime/system-events.ts +246 -0
- package/src/scheduler/delegating.ts +7 -2
- package/src/scheduler/local.ts +2 -0
- package/src/session/retention/archive.ts +1 -1
- package/src/skills/index.ts +1 -1
- package/src/skills/registry.ts +25 -0
- package/src/store/session/disk.ts +3 -0
- package/src/store/session-log/conformance.ts +51 -8
- package/src/store/session-log/core.ts +10 -4
- package/src/store/session-log/fold.ts +33 -7
- package/src/store/session-log/index.ts +2 -0
- package/src/test-support/toolset.ts +23 -0
- package/src/tools/builtins/bash.ts +27 -10
- package/src/tools/builtins/browser-url.ts +1 -1
- package/src/tools/builtins/browser.ts +2 -2
- package/src/tools/builtins/computer-use.ts +21 -11
- package/src/tools/builtins/edit.ts +12 -2
- package/src/tools/builtins/json-string-hint.ts +16 -0
- package/src/tools/builtins/search-tools.ts +7 -20
- package/src/tools/builtins/write-file.ts +12 -0
- package/src/tools/command-shell.ts +46 -1
- package/src/tools/coordinator/agent.ts +6 -0
- package/src/tools/coordinator/ask-user-question.ts +29 -15
- package/src/tools/coordinator/index.ts +6 -0
- package/src/tools/coordinator/question-options.ts +195 -0
- package/src/tools/defineTool.ts +28 -0
- package/src/tools/memory/search.ts +4 -1
- package/src/tools/memory/update.ts +8 -5
- package/src/tools/render-nonce.ts +69 -0
- package/src/tools/roster.ts +84 -33
- package/src/tools/schedules/schedule-tool.ts +107 -14
- package/src/tools/schedules/types.ts +52 -6
- package/src/tools/trusted-read-only.ts +19 -10
- package/src/tools/untrusted-envelope.ts +121 -57
- package/src/toolsets/combine.ts +181 -0
- package/src/toolsets/manager.ts +996 -0
- package/src/toolsets/source-glob.ts +22 -0
- package/src/toolsets/toolset.ts +31 -0
- package/src/toolsets/types.ts +154 -0
- package/src/toolsets/wrappers.ts +191 -0
- package/src/types/agent/base.ts +29 -16
- package/src/types/agent/index.ts +1 -0
- package/src/types/agent/pipeline.ts +2 -0
- package/src/types/agent/query.ts +129 -0
- package/src/types/agent/reactive.ts +5 -142
- package/src/types/agent/router.ts +2 -0
- package/src/types/agent/scheduler.ts +6 -1
- package/src/types/agent/supervisor.ts +5 -2
- package/src/types/agent/task.ts +21 -1
- package/src/types/authorization/index.ts +12 -0
- package/src/types/connector/mcp.ts +46 -0
- package/src/types/errors/index.ts +15 -0
- package/src/types/hitl/index.ts +57 -0
- package/src/types/message/index.ts +135 -7
- package/src/types/plugin/index.ts +44 -21
- package/src/types/provider/chat.ts +5 -0
- package/src/types/provider/config.ts +8 -3
- package/src/types/provider/stream.ts +39 -0
- package/src/types/sandbox/index.ts +1 -1
- package/src/types/session/events.ts +14 -3
- package/src/types/session/sub-session.ts +2 -0
- package/src/types/tool/index.ts +154 -105
- package/src/types/toolset/index.ts +10 -47
- package/dist/registry/toolset/catalog.d.ts +0 -42
- package/dist/registry/toolset/catalog.d.ts.map +0 -1
- package/dist/registry/toolset/catalog.js +0 -234
- package/dist/registry/toolset/catalog.js.map +0 -1
- package/src/registry/toolset/catalog.ts +0 -308
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Peer addresses are URIs so a later cross-machine transport can be added
|
|
3
|
+
* without redesigning the registry or the protocol: `uds:<path>` and
|
|
4
|
+
* `pipe:<name>` today, `a2a:https://…` later (design §1.1). Only the two
|
|
5
|
+
* local schemes are ever SERVED or DIALED by this package; `a2a:` addresses
|
|
6
|
+
* are recognised so a reader can tell them apart, not connected to.
|
|
7
|
+
*
|
|
8
|
+
* @experimental
|
|
9
|
+
*/
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { peerSocketFileName } from './dir.js';
|
|
12
|
+
export class PeerAddressError extends Error {
|
|
13
|
+
name = 'PeerAddressError';
|
|
14
|
+
}
|
|
15
|
+
/** The `uds:<path>` address for a session's socket inside a hardened runtime directory. */
|
|
16
|
+
export function udsPeerAddress(runtimeDir, sessionId) {
|
|
17
|
+
return `uds:${join(runtimeDir, peerSocketFileName(sessionId))}`;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The `pipe:<name>` address for a session's Windows named pipe.
|
|
21
|
+
*
|
|
22
|
+
* `<name>` is the full pipe path Node's `net` module dials directly
|
|
23
|
+
* (`\\.\pipe\namzu-<uid-hash>-<session-short>`, design §1.1) — coded here for
|
|
24
|
+
* completeness; this package does not run its tests on win32, so the shape
|
|
25
|
+
* is reviewed rather than exercised.
|
|
26
|
+
*/
|
|
27
|
+
export function pipePeerAddress(uidHash, sessionShort) {
|
|
28
|
+
return `pipe:\\\\.\\pipe\\namzu-${uidHash}-${sessionShort}`;
|
|
29
|
+
}
|
|
30
|
+
/** Parse a peer address URI. Throws {@link PeerAddressError} on an unrecognised or empty scheme. */
|
|
31
|
+
export function parsePeerAddress(address) {
|
|
32
|
+
if (address.startsWith('uds:')) {
|
|
33
|
+
const path = address.slice('uds:'.length);
|
|
34
|
+
if (path.length === 0)
|
|
35
|
+
throw new PeerAddressError(`Empty uds: address: ${address}`);
|
|
36
|
+
return { scheme: 'uds', path };
|
|
37
|
+
}
|
|
38
|
+
if (address.startsWith('pipe:')) {
|
|
39
|
+
const path = address.slice('pipe:'.length);
|
|
40
|
+
if (path.length === 0)
|
|
41
|
+
throw new PeerAddressError(`Empty pipe: address: ${address}`);
|
|
42
|
+
return { scheme: 'pipe', path };
|
|
43
|
+
}
|
|
44
|
+
if (address.startsWith('a2a:')) {
|
|
45
|
+
const url = address.slice('a2a:'.length);
|
|
46
|
+
if (url.length === 0)
|
|
47
|
+
throw new PeerAddressError(`Empty a2a: address: ${address}`);
|
|
48
|
+
return { scheme: 'a2a', url };
|
|
49
|
+
}
|
|
50
|
+
throw new PeerAddressError(`Unrecognised peer address scheme: ${address}`);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=address.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address.js","sourceRoot":"","sources":["../../src/peers/address.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAO7C,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACxB,IAAI,GAAG,kBAAkB,CAAA;CAC3C;AAED,2FAA2F;AAC3F,MAAM,UAAU,cAAc,CAAC,UAAkB,EAAE,SAAiB;IACnE,OAAO,OAAO,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAA;AAChE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,YAAoB;IACpE,OAAO,2BAA2B,OAAO,IAAI,YAAY,EAAE,CAAA;AAC5D,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC/C,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACzC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,gBAAgB,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAA;QACnF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IAC/B,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAC1C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,gBAAgB,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAA;QACpF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;IAChC,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACxC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,gBAAgB,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAA;QAClF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAA;IAC9B,CAAC;IACD,MAAM,IAAI,gBAAgB,CAAC,qCAAqC,OAAO,EAAE,CAAC,CAAA;AAC3E,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A client for one connection of `namzu-peer/1`: connect, write one request
|
|
3
|
+
* line, read one response line, close. Mirrors the shape of this
|
|
4
|
+
* repository's other local control clients (`queryRunner` in
|
|
5
|
+
* `packages/cli/src/integrations/resident/runner-control.ts`,
|
|
6
|
+
* `callEndpoint` in `packages/cli/src/schedule/daemon/endpoint.ts`): an
|
|
7
|
+
* authenticated response PROVES responsiveness, and its absence never proves
|
|
8
|
+
* the peer is dead — only that this attempt could not reach it.
|
|
9
|
+
*
|
|
10
|
+
* @experimental
|
|
11
|
+
*/
|
|
12
|
+
import { type DeliverRequest, type DeliverResponse, type NoticeRequest, type NoticeResponse, type PingResponse, type SubscribeIdleRequest, type SubscribeIdleResponse } from './protocol.js';
|
|
13
|
+
import type { PeerRecord } from './record.js';
|
|
14
|
+
export declare class PeerClientError extends Error {
|
|
15
|
+
readonly name = "PeerClientError";
|
|
16
|
+
}
|
|
17
|
+
/** An authenticated reply proves responsiveness; every other outcome names why none arrived. */
|
|
18
|
+
export type PeerClientResult<T> = ({
|
|
19
|
+
readonly kind: 'responded';
|
|
20
|
+
} & T) | {
|
|
21
|
+
readonly kind: 'unreachable';
|
|
22
|
+
readonly reason: string;
|
|
23
|
+
};
|
|
24
|
+
export interface PeerClientOptions {
|
|
25
|
+
/** Default 2000ms. */
|
|
26
|
+
readonly timeoutMs?: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* `ping`, `deliver`, `subscribe_idle` and `notice` over `namzu-peer/1`.
|
|
30
|
+
*
|
|
31
|
+
* `deliver`/`subscribeIdle`/`notice` read the RECIPIENT's token from the
|
|
32
|
+
* `PeerRecord` passed in — the wire's token is always the recipient's own,
|
|
33
|
+
* asserted by the caller and verified by the server (design §1.1, §1.3).
|
|
34
|
+
* `ping` takes a bare address and carries no token; see the file header for
|
|
35
|
+
* why.
|
|
36
|
+
*/
|
|
37
|
+
export declare class PeerClient {
|
|
38
|
+
private readonly timeoutMs;
|
|
39
|
+
constructor(options?: PeerClientOptions);
|
|
40
|
+
ping(address: string, timeoutMs?: number): Promise<PeerClientResult<PingResponse>>;
|
|
41
|
+
deliver(record: Pick<PeerRecord, 'address' | 'token'>, message: Omit<DeliverRequest, 'protocol' | 'op' | 'token'>): Promise<PeerClientResult<DeliverResponse>>;
|
|
42
|
+
subscribeIdle(record: Pick<PeerRecord, 'address' | 'token'>, message: Omit<SubscribeIdleRequest, 'protocol' | 'op' | 'token'>): Promise<PeerClientResult<SubscribeIdleResponse>>;
|
|
43
|
+
notice(record: Pick<PeerRecord, 'address' | 'token'>, message: Omit<NoticeRequest, 'protocol' | 'op' | 'token'>): Promise<PeerClientResult<NoticeResponse>>;
|
|
44
|
+
}
|
|
45
|
+
/** A bare liveness probe: `true` iff an unauthenticated `ping` answers within `timeoutMs`. Used by `listLivePeers`. */
|
|
46
|
+
export declare function pingPeer(address: string, timeoutMs?: number): Promise<boolean>;
|
|
47
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/peers/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EACN,KAAK,cAAc,EACnB,KAAK,eAAe,EAGpB,KAAK,aAAa,EAClB,KAAK,cAAc,EAInB,KAAK,YAAY,EAEjB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAE1B,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAI7C,qBAAa,eAAgB,SAAQ,KAAK;IACzC,SAAkB,IAAI,qBAAoB;CAC1C;AAED,gGAAgG;AAChG,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAC3B,CAAC;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAAE,GAAG,CAAC,CAAC,GACpC;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAsE5D,MAAM,WAAW,iBAAiB;IACjC,sBAAsB;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED;;;;;;;;GAQG;AACH,qBAAa,UAAU;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBAEtB,OAAO,GAAE,iBAAsB;IAI3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,SAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAK1F,OAAO,CACN,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,EAC7C,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,GAAG,IAAI,GAAG,OAAO,CAAC,GACxD,OAAO,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAe7C,aAAa,CACZ,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,EAC7C,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAAE,UAAU,GAAG,IAAI,GAAG,OAAO,CAAC,GAC9D,OAAO,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;IAenD,MAAM,CACL,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,EAC7C,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,GAAG,IAAI,GAAG,OAAO,CAAC,GACvD,OAAO,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;CAc5C;AAED,uHAAuH;AACvH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,SAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ1F"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A client for one connection of `namzu-peer/1`: connect, write one request
|
|
3
|
+
* line, read one response line, close. Mirrors the shape of this
|
|
4
|
+
* repository's other local control clients (`queryRunner` in
|
|
5
|
+
* `packages/cli/src/integrations/resident/runner-control.ts`,
|
|
6
|
+
* `callEndpoint` in `packages/cli/src/schedule/daemon/endpoint.ts`): an
|
|
7
|
+
* authenticated response PROVES responsiveness, and its absence never proves
|
|
8
|
+
* the peer is dead — only that this attempt could not reach it.
|
|
9
|
+
*
|
|
10
|
+
* @experimental
|
|
11
|
+
*/
|
|
12
|
+
import { createConnection } from 'node:net';
|
|
13
|
+
import { parsePeerAddress } from './address.js';
|
|
14
|
+
import { DeliverResponseSchema, MAX_PEER_REQUEST_BYTES, NoticeResponseSchema, PEER_PROTOCOL_VERSION, PingResponseSchema, SubscribeIdleResponseSchema, } from './protocol.js';
|
|
15
|
+
const DEFAULT_TIMEOUT_MS = 2_000;
|
|
16
|
+
export class PeerClientError extends Error {
|
|
17
|
+
name = 'PeerClientError';
|
|
18
|
+
}
|
|
19
|
+
function connectPath(address) {
|
|
20
|
+
const parsed = parsePeerAddress(address);
|
|
21
|
+
if (parsed.scheme === 'a2a') {
|
|
22
|
+
throw new PeerClientError(`PeerClient cannot dial an a2a: address directly: ${address}`);
|
|
23
|
+
}
|
|
24
|
+
return parsed.path;
|
|
25
|
+
}
|
|
26
|
+
/** One request, one response, one connection. */
|
|
27
|
+
function sendPeerRequest(address, request, parseResponse, timeoutMs) {
|
|
28
|
+
return new Promise((resolve) => {
|
|
29
|
+
let settled = false;
|
|
30
|
+
const finish = (result) => {
|
|
31
|
+
if (settled)
|
|
32
|
+
return;
|
|
33
|
+
settled = true;
|
|
34
|
+
clearTimeout(timer);
|
|
35
|
+
socket.destroy();
|
|
36
|
+
resolve(result);
|
|
37
|
+
};
|
|
38
|
+
const unreachable = (error) => finish({
|
|
39
|
+
kind: 'unreachable',
|
|
40
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
41
|
+
});
|
|
42
|
+
const timer = setTimeout(() => unreachable(new Error('Peer request timed out.')), timeoutMs);
|
|
43
|
+
let path;
|
|
44
|
+
try {
|
|
45
|
+
path = connectPath(address);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
clearTimeout(timer);
|
|
49
|
+
resolve({
|
|
50
|
+
kind: 'unreachable',
|
|
51
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
52
|
+
});
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const socket = createConnection({ path });
|
|
56
|
+
let buffered = Buffer.alloc(0);
|
|
57
|
+
socket.once('error', unreachable);
|
|
58
|
+
socket.once('close', () => unreachable(new Error('Peer connection closed before a response arrived.')));
|
|
59
|
+
socket.once('connect', () => {
|
|
60
|
+
socket.write(`${JSON.stringify(request)}\n`);
|
|
61
|
+
});
|
|
62
|
+
socket.on('data', (chunk) => {
|
|
63
|
+
if (buffered.length + chunk.length > MAX_PEER_REQUEST_BYTES) {
|
|
64
|
+
unreachable(new Error('Peer response exceeded the size limit.'));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
buffered = Buffer.concat([buffered, chunk]);
|
|
68
|
+
const newline = buffered.indexOf(10);
|
|
69
|
+
if (newline < 0)
|
|
70
|
+
return;
|
|
71
|
+
try {
|
|
72
|
+
const parsed = JSON.parse(buffered.subarray(0, newline).toString('utf8'));
|
|
73
|
+
finish({ kind: 'responded', ...parseResponse(parsed) });
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
unreachable(error);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* `ping`, `deliver`, `subscribe_idle` and `notice` over `namzu-peer/1`.
|
|
83
|
+
*
|
|
84
|
+
* `deliver`/`subscribeIdle`/`notice` read the RECIPIENT's token from the
|
|
85
|
+
* `PeerRecord` passed in — the wire's token is always the recipient's own,
|
|
86
|
+
* asserted by the caller and verified by the server (design §1.1, §1.3).
|
|
87
|
+
* `ping` takes a bare address and carries no token; see the file header for
|
|
88
|
+
* why.
|
|
89
|
+
*/
|
|
90
|
+
export class PeerClient {
|
|
91
|
+
timeoutMs;
|
|
92
|
+
constructor(options = {}) {
|
|
93
|
+
this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
94
|
+
}
|
|
95
|
+
ping(address, timeoutMs = this.timeoutMs) {
|
|
96
|
+
const request = { protocol: PEER_PROTOCOL_VERSION, op: 'ping' };
|
|
97
|
+
return sendPeerRequest(address, request, (value) => PingResponseSchema.parse(value), timeoutMs);
|
|
98
|
+
}
|
|
99
|
+
deliver(record, message) {
|
|
100
|
+
const request = {
|
|
101
|
+
protocol: PEER_PROTOCOL_VERSION,
|
|
102
|
+
op: 'deliver',
|
|
103
|
+
token: record.token,
|
|
104
|
+
...message,
|
|
105
|
+
};
|
|
106
|
+
return sendPeerRequest(record.address, request, (value) => DeliverResponseSchema.parse(value), this.timeoutMs);
|
|
107
|
+
}
|
|
108
|
+
subscribeIdle(record, message) {
|
|
109
|
+
const request = {
|
|
110
|
+
protocol: PEER_PROTOCOL_VERSION,
|
|
111
|
+
op: 'subscribe_idle',
|
|
112
|
+
token: record.token,
|
|
113
|
+
...message,
|
|
114
|
+
};
|
|
115
|
+
return sendPeerRequest(record.address, request, (value) => SubscribeIdleResponseSchema.parse(value), this.timeoutMs);
|
|
116
|
+
}
|
|
117
|
+
notice(record, message) {
|
|
118
|
+
const request = {
|
|
119
|
+
protocol: PEER_PROTOCOL_VERSION,
|
|
120
|
+
op: 'notice',
|
|
121
|
+
token: record.token,
|
|
122
|
+
...message,
|
|
123
|
+
};
|
|
124
|
+
return sendPeerRequest(record.address, request, (value) => NoticeResponseSchema.parse(value), this.timeoutMs);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/** A bare liveness probe: `true` iff an unauthenticated `ping` answers within `timeoutMs`. Used by `listLivePeers`. */
|
|
128
|
+
export function pingPeer(address, timeoutMs = DEFAULT_TIMEOUT_MS) {
|
|
129
|
+
const request = { protocol: PEER_PROTOCOL_VERSION, op: 'ping' };
|
|
130
|
+
return sendPeerRequest(address, request, (value) => PingResponseSchema.parse(value), timeoutMs).then((result) => result.kind === 'responded');
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/peers/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAGN,qBAAqB,EACrB,sBAAsB,EAGtB,oBAAoB,EACpB,qBAAqB,EAGrB,kBAAkB,EAGlB,2BAA2B,GAC3B,MAAM,eAAe,CAAA;AAGtB,MAAM,kBAAkB,GAAG,KAAK,CAAA;AAEhC,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACvB,IAAI,GAAG,iBAAiB,CAAA;CAC1C;AAOD,SAAS,WAAW,CAAC,OAAe;IACnC,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;IACxC,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC7B,MAAM,IAAI,eAAe,CAAC,oDAAoD,OAAO,EAAE,CAAC,CAAA;IACzF,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAA;AACnB,CAAC;AAED,iDAAiD;AACjD,SAAS,eAAe,CACvB,OAAe,EACf,OAAgB,EAChB,aAAoC,EACpC,SAAiB;IAEjB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC9B,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,MAAM,MAAM,GAAG,CAAC,MAA2B,EAAQ,EAAE;YACpD,IAAI,OAAO;gBAAE,OAAM;YACnB,OAAO,GAAG,IAAI,CAAA;YACd,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,MAAM,CAAC,OAAO,EAAE,CAAA;YAChB,OAAO,CAAC,MAAM,CAAC,CAAA;QAChB,CAAC,CAAA;QACD,MAAM,WAAW,GAAG,CAAC,KAAc,EAAQ,EAAE,CAC5C,MAAM,CAAC;YACN,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAA;QACH,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;QAC5F,IAAI,IAAY,CAAA;QAChB,IAAI,CAAC;YACJ,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,OAAO,CAAC;gBACP,IAAI,EAAE,aAAa;gBACnB,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAA;YACF,OAAM;QACP,CAAC;QACD,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;QACzC,IAAI,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;QACjC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CACzB,WAAW,CAAC,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAC3E,CAAA;QACD,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;YAC3B,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAA;QACF,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACnC,IAAI,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,sBAAsB,EAAE,CAAC;gBAC7D,WAAW,CAAC,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC,CAAA;gBAChE,OAAM;YACP,CAAC;YACD,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAA;YAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;YACpC,IAAI,OAAO,GAAG,CAAC;gBAAE,OAAM;YACvB,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;gBAClF,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YACxD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,WAAW,CAAC,KAAK,CAAC,CAAA;YACnB,CAAC;QACF,CAAC,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;AACH,CAAC;AAOD;;;;;;;;GAQG;AACH,MAAM,OAAO,UAAU;IACL,SAAS,CAAQ;IAElC,YAAY,UAA6B,EAAE;QAC1C,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAA;IACzD,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,SAAS,GAAG,IAAI,CAAC,SAAS;QAC/C,MAAM,OAAO,GAAgB,EAAE,QAAQ,EAAE,qBAAqB,EAAE,EAAE,EAAE,MAAM,EAAE,CAAA;QAC5E,OAAO,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAA;IAChG,CAAC;IAED,OAAO,CACN,MAA6C,EAC7C,OAA0D;QAE1D,MAAM,OAAO,GAAmB;YAC/B,QAAQ,EAAE,qBAAqB;YAC/B,EAAE,EAAE,SAAS;YACb,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,GAAG,OAAO;SACV,CAAA;QACD,OAAO,eAAe,CACrB,MAAM,CAAC,OAAO,EACd,OAAO,EACP,CAAC,KAAK,EAAE,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,EAC7C,IAAI,CAAC,SAAS,CACd,CAAA;IACF,CAAC;IAED,aAAa,CACZ,MAA6C,EAC7C,OAAgE;QAEhE,MAAM,OAAO,GAAyB;YACrC,QAAQ,EAAE,qBAAqB;YAC/B,EAAE,EAAE,gBAAgB;YACpB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,GAAG,OAAO;SACV,CAAA;QACD,OAAO,eAAe,CACrB,MAAM,CAAC,OAAO,EACd,OAAO,EACP,CAAC,KAAK,EAAE,EAAE,CAAC,2BAA2B,CAAC,KAAK,CAAC,KAAK,CAAC,EACnD,IAAI,CAAC,SAAS,CACd,CAAA;IACF,CAAC;IAED,MAAM,CACL,MAA6C,EAC7C,OAAyD;QAEzD,MAAM,OAAO,GAAkB;YAC9B,QAAQ,EAAE,qBAAqB;YAC/B,EAAE,EAAE,QAAQ;YACZ,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,GAAG,OAAO;SACV,CAAA;QACD,OAAO,eAAe,CACrB,MAAM,CAAC,OAAO,EACd,OAAO,EACP,CAAC,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,EAC5C,IAAI,CAAC,SAAS,CACd,CAAA;IACF,CAAC;CACD;AAED,uHAAuH;AACvH,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,SAAS,GAAG,kBAAkB;IACvE,MAAM,OAAO,GAAgB,EAAE,QAAQ,EAAE,qBAAqB,EAAE,EAAE,EAAE,MAAM,EAAE,CAAA;IAC5E,OAAO,eAAe,CACrB,OAAO,EACP,OAAO,EACP,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,EAC1C,SAAS,CACT,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,CAAA;AAChD,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The private per-user runtime directory peer sockets and the live-session
|
|
3
|
+
* registry live in.
|
|
4
|
+
*
|
|
5
|
+
* Boundary = the OS user (design: cross-session messaging §1.1). Any process
|
|
6
|
+
* of the same user can already read the user's files, so the directory only
|
|
7
|
+
* has to keep OTHER users and the network out, and every candidate is
|
|
8
|
+
* checked the same way: created 0700, refused if it turns out to be a
|
|
9
|
+
* symlink, and — on POSIX — verified by `lstat` to really be owned by this
|
|
10
|
+
* uid and to carry no group/other permission.
|
|
11
|
+
*
|
|
12
|
+
* The SDK cannot depend on the CLI's `ensurePrivateStateDirectory`
|
|
13
|
+
* (`packages/cli/src/integrations/state/private-directory.ts`, which also
|
|
14
|
+
* tightens a Windows ACL); {@link hardenPeerRuntimeDir} is the small subset
|
|
15
|
+
* of that contract this module needs, reimplemented here so the dependency
|
|
16
|
+
* direction (`sdk` never imports `cli`) holds. A caller with its own
|
|
17
|
+
* directory-hardening policy may supply `hardenDirectory` instead.
|
|
18
|
+
*
|
|
19
|
+
* @experimental
|
|
20
|
+
*/
|
|
21
|
+
export declare class PeerDirectoryError extends Error {
|
|
22
|
+
readonly name = "PeerDirectoryError";
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Session ids are UUIDv7 (`generateSessionId`, `utils/id.ts`): 36 characters.
|
|
26
|
+
* `.sock` is the longest suffix {@link peerSocketFileName} ever appends, so
|
|
27
|
+
* this is the longest socket filename the peers module creates — the figure
|
|
28
|
+
* {@link resolvePeerRuntimeDir} subtracts from the platform's
|
|
29
|
+
* `sockaddr_un.sun_path` limit before choosing a runtime directory.
|
|
30
|
+
*/
|
|
31
|
+
export declare const LONGEST_PEER_SOCKET_FILE_NAME_LENGTH: number;
|
|
32
|
+
/** The socket filename for one session, placed directly inside the runtime directory. */
|
|
33
|
+
export declare function peerSocketFileName(sessionId: string): string;
|
|
34
|
+
/** Harden one directory in place; see {@link hardenPeerRuntimeDir}. Injectable for tests. */
|
|
35
|
+
export type HardenPeerDirectory = (path: string, uid: number | undefined) => void;
|
|
36
|
+
/**
|
|
37
|
+
* Create (or re-verify) a private directory for peer sockets and registry
|
|
38
|
+
* records.
|
|
39
|
+
*
|
|
40
|
+
* Existing directories are tightened (`chmod`) on POSIX, then re-checked by
|
|
41
|
+
* `lstat` — tightening a directory this uid does not own would fail, which is
|
|
42
|
+
* exactly the outcome wanted, so the check afterward is the real gate. Skips
|
|
43
|
+
* the POSIX-only steps on win32, where `chmod` only toggles the read-only
|
|
44
|
+
* attribute and there is no uid to compare (`process.getuid` does not exist).
|
|
45
|
+
*/
|
|
46
|
+
export declare function hardenPeerRuntimeDir(path: string, uid: number | undefined): void;
|
|
47
|
+
export interface ResolvePeerRuntimeDirOptions {
|
|
48
|
+
readonly env: NodeJS.ProcessEnv;
|
|
49
|
+
readonly namzuHome: string;
|
|
50
|
+
/** `undefined` models a platform with no uid (win32; `process.getuid` does not exist there). */
|
|
51
|
+
readonly uid: number | undefined;
|
|
52
|
+
/** Default `process.platform`; override for tests. */
|
|
53
|
+
readonly platform?: NodeJS.Platform;
|
|
54
|
+
/** Default `os.tmpdir()`; override for tests, matching `TempRootOptions.tmpdir` in `session/paths.ts`. */
|
|
55
|
+
readonly tmpDir?: string;
|
|
56
|
+
/** Overrides {@link hardenPeerRuntimeDir}; primarily for tests that need to fabricate a failure. */
|
|
57
|
+
readonly hardenDirectory?: HardenPeerDirectory;
|
|
58
|
+
}
|
|
59
|
+
export interface PeerRuntimeDir {
|
|
60
|
+
/** The directory sockets are created in. */
|
|
61
|
+
readonly path: string;
|
|
62
|
+
/** `<path>/sessions`, holding one registry record per live session. */
|
|
63
|
+
readonly sessionsDir: string;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Choose and harden the per-session peer runtime directory.
|
|
67
|
+
*
|
|
68
|
+
* Candidates, in order: `$XDG_RUNTIME_DIR/namzu`, `$NAMZU_HOME/run`,
|
|
69
|
+
* `$TMPDIR/namzu-<uid>`. Every candidate whose resulting socket paths fit
|
|
70
|
+
* this platform's `sockaddr_un` limit is a length-eligible candidate; among
|
|
71
|
+
* those, the first that can actually be created and hardened 0700 (see
|
|
72
|
+
* {@link hardenPeerRuntimeDir}), along with its `sessions/` subdirectory, is
|
|
73
|
+
* the one used.
|
|
74
|
+
*
|
|
75
|
+
* Fitting the length budget and being hardenable are different failure
|
|
76
|
+
* modes, so they get different handling. A candidate that is too long for
|
|
77
|
+
* this platform's socket path is never even attempted — trying it would
|
|
78
|
+
* only fail later, at `listen()`, with a less useful error. A candidate
|
|
79
|
+
* that DOES fit but cannot be hardened (owned by another uid, a symlink, a
|
|
80
|
+
* permission this process cannot chmod away) is skipped in favour of the
|
|
81
|
+
* next length-eligible candidate rather than failing the whole call: a
|
|
82
|
+
* hostile or merely misconfigured `$XDG_RUNTIME_DIR` should not deny peer
|
|
83
|
+
* messaging to a session that could perfectly well fall back to
|
|
84
|
+
* `$NAMZU_HOME/run`. Only when every length-eligible candidate has failed to
|
|
85
|
+
* harden does this throw, naming each one and why.
|
|
86
|
+
*/
|
|
87
|
+
export declare function resolvePeerRuntimeDir(options: ResolvePeerRuntimeDirOptions): PeerRuntimeDir;
|
|
88
|
+
//# sourceMappingURL=dir.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dir.d.ts","sourceRoot":"","sources":["../../src/peers/dir.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,qBAAa,kBAAmB,SAAQ,KAAK;IAC5C,SAAkB,IAAI,wBAAuB;CAC7C;AAID;;;;;;GAMG;AACH,eAAO,MAAM,oCAAoC,QAAsB,CAAA;AAEvE,yFAAyF;AACzF,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5D;AAqBD,6FAA6F;AAC7F,MAAM,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAA;AAEjF;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAsBhF;AAED,MAAM,WAAW,4BAA4B;IAC5C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,gGAAgG;IAChG,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,sDAAsD;IACtD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;IACnC,0GAA0G;IAC1G,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,oGAAoG;IACpG,QAAQ,CAAC,eAAe,CAAC,EAAE,mBAAmB,CAAA;CAC9C;AAED,MAAM,WAAW,cAAc;IAC9B,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,uEAAuE;IACvE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC5B;AAUD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,GAAG,cAAc,CAwB3F"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The private per-user runtime directory peer sockets and the live-session
|
|
3
|
+
* registry live in.
|
|
4
|
+
*
|
|
5
|
+
* Boundary = the OS user (design: cross-session messaging §1.1). Any process
|
|
6
|
+
* of the same user can already read the user's files, so the directory only
|
|
7
|
+
* has to keep OTHER users and the network out, and every candidate is
|
|
8
|
+
* checked the same way: created 0700, refused if it turns out to be a
|
|
9
|
+
* symlink, and — on POSIX — verified by `lstat` to really be owned by this
|
|
10
|
+
* uid and to carry no group/other permission.
|
|
11
|
+
*
|
|
12
|
+
* The SDK cannot depend on the CLI's `ensurePrivateStateDirectory`
|
|
13
|
+
* (`packages/cli/src/integrations/state/private-directory.ts`, which also
|
|
14
|
+
* tightens a Windows ACL); {@link hardenPeerRuntimeDir} is the small subset
|
|
15
|
+
* of that contract this module needs, reimplemented here so the dependency
|
|
16
|
+
* direction (`sdk` never imports `cli`) holds. A caller with its own
|
|
17
|
+
* directory-hardening policy may supply `hardenDirectory` instead.
|
|
18
|
+
*
|
|
19
|
+
* @experimental
|
|
20
|
+
*/
|
|
21
|
+
import { chmodSync, lstatSync, mkdirSync } from 'node:fs';
|
|
22
|
+
import { tmpdir } from 'node:os';
|
|
23
|
+
import { join } from 'node:path';
|
|
24
|
+
export class PeerDirectoryError extends Error {
|
|
25
|
+
name = 'PeerDirectoryError';
|
|
26
|
+
}
|
|
27
|
+
const PRIVATE_DIR_MODE = 0o700;
|
|
28
|
+
/**
|
|
29
|
+
* Session ids are UUIDv7 (`generateSessionId`, `utils/id.ts`): 36 characters.
|
|
30
|
+
* `.sock` is the longest suffix {@link peerSocketFileName} ever appends, so
|
|
31
|
+
* this is the longest socket filename the peers module creates — the figure
|
|
32
|
+
* {@link resolvePeerRuntimeDir} subtracts from the platform's
|
|
33
|
+
* `sockaddr_un.sun_path` limit before choosing a runtime directory.
|
|
34
|
+
*/
|
|
35
|
+
export const LONGEST_PEER_SOCKET_FILE_NAME_LENGTH = 36 + '.sock'.length;
|
|
36
|
+
/** The socket filename for one session, placed directly inside the runtime directory. */
|
|
37
|
+
export function peerSocketFileName(sessionId) {
|
|
38
|
+
return `${sessionId}.sock`;
|
|
39
|
+
}
|
|
40
|
+
const DARWIN_SUN_PATH_LIMIT = 104;
|
|
41
|
+
/** Linux, and every other POSIX platform this runs on. */
|
|
42
|
+
const DEFAULT_SUN_PATH_LIMIT = 108;
|
|
43
|
+
function platformSocketPathLimit(platform) {
|
|
44
|
+
return platform === 'darwin' ? DARWIN_SUN_PATH_LIMIT : DEFAULT_SUN_PATH_LIMIT;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Whether a socket file directly inside `dir` fits the platform's
|
|
48
|
+
* `sockaddr_un.sun_path`. Windows named pipes live in a virtual namespace,
|
|
49
|
+
* not the filesystem, so no directory ever fails this check there.
|
|
50
|
+
*/
|
|
51
|
+
function fitsSocketPath(dir, platform) {
|
|
52
|
+
if (platform === 'win32')
|
|
53
|
+
return true;
|
|
54
|
+
// +1 for the path separator joining `dir` to the socket filename.
|
|
55
|
+
return dir.length + 1 + LONGEST_PEER_SOCKET_FILE_NAME_LENGTH <= platformSocketPathLimit(platform);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Create (or re-verify) a private directory for peer sockets and registry
|
|
59
|
+
* records.
|
|
60
|
+
*
|
|
61
|
+
* Existing directories are tightened (`chmod`) on POSIX, then re-checked by
|
|
62
|
+
* `lstat` — tightening a directory this uid does not own would fail, which is
|
|
63
|
+
* exactly the outcome wanted, so the check afterward is the real gate. Skips
|
|
64
|
+
* the POSIX-only steps on win32, where `chmod` only toggles the read-only
|
|
65
|
+
* attribute and there is no uid to compare (`process.getuid` does not exist).
|
|
66
|
+
*/
|
|
67
|
+
export function hardenPeerRuntimeDir(path, uid) {
|
|
68
|
+
mkdirSync(path, { recursive: true, mode: PRIVATE_DIR_MODE });
|
|
69
|
+
const created = lstatSync(path);
|
|
70
|
+
if (created.isSymbolicLink()) {
|
|
71
|
+
throw new PeerDirectoryError(`Refusing peer runtime path ${path}: it is a symbolic link.`);
|
|
72
|
+
}
|
|
73
|
+
if (!created.isDirectory()) {
|
|
74
|
+
throw new PeerDirectoryError(`Refusing peer runtime path ${path}: it is not a directory.`);
|
|
75
|
+
}
|
|
76
|
+
if (process.platform === 'win32')
|
|
77
|
+
return;
|
|
78
|
+
chmodSync(path, PRIVATE_DIR_MODE);
|
|
79
|
+
const entry = lstatSync(path);
|
|
80
|
+
if (uid !== undefined && entry.uid !== uid) {
|
|
81
|
+
throw new PeerDirectoryError(`Refusing peer runtime path ${path}: it belongs to uid ${entry.uid}, not ${uid}.`);
|
|
82
|
+
}
|
|
83
|
+
if ((entry.mode & 0o777) !== PRIVATE_DIR_MODE) {
|
|
84
|
+
throw new PeerDirectoryError(`Refusing peer runtime path ${path}: mode ${(entry.mode & 0o777).toString(8)} is not 0700.`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function peerRuntimeDirCandidates(options) {
|
|
88
|
+
const candidates = [];
|
|
89
|
+
if (options.env.XDG_RUNTIME_DIR)
|
|
90
|
+
candidates.push(join(options.env.XDG_RUNTIME_DIR, 'namzu'));
|
|
91
|
+
candidates.push(join(options.namzuHome, 'run'));
|
|
92
|
+
candidates.push(join(options.tmpDir ?? tmpdir(), `namzu-${options.uid ?? 'user'}`));
|
|
93
|
+
return candidates;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Choose and harden the per-session peer runtime directory.
|
|
97
|
+
*
|
|
98
|
+
* Candidates, in order: `$XDG_RUNTIME_DIR/namzu`, `$NAMZU_HOME/run`,
|
|
99
|
+
* `$TMPDIR/namzu-<uid>`. Every candidate whose resulting socket paths fit
|
|
100
|
+
* this platform's `sockaddr_un` limit is a length-eligible candidate; among
|
|
101
|
+
* those, the first that can actually be created and hardened 0700 (see
|
|
102
|
+
* {@link hardenPeerRuntimeDir}), along with its `sessions/` subdirectory, is
|
|
103
|
+
* the one used.
|
|
104
|
+
*
|
|
105
|
+
* Fitting the length budget and being hardenable are different failure
|
|
106
|
+
* modes, so they get different handling. A candidate that is too long for
|
|
107
|
+
* this platform's socket path is never even attempted — trying it would
|
|
108
|
+
* only fail later, at `listen()`, with a less useful error. A candidate
|
|
109
|
+
* that DOES fit but cannot be hardened (owned by another uid, a symlink, a
|
|
110
|
+
* permission this process cannot chmod away) is skipped in favour of the
|
|
111
|
+
* next length-eligible candidate rather than failing the whole call: a
|
|
112
|
+
* hostile or merely misconfigured `$XDG_RUNTIME_DIR` should not deny peer
|
|
113
|
+
* messaging to a session that could perfectly well fall back to
|
|
114
|
+
* `$NAMZU_HOME/run`. Only when every length-eligible candidate has failed to
|
|
115
|
+
* harden does this throw, naming each one and why.
|
|
116
|
+
*/
|
|
117
|
+
export function resolvePeerRuntimeDir(options) {
|
|
118
|
+
const platform = options.platform ?? process.platform;
|
|
119
|
+
const harden = options.hardenDirectory ?? hardenPeerRuntimeDir;
|
|
120
|
+
const candidates = peerRuntimeDirCandidates(options);
|
|
121
|
+
const fitting = candidates.filter((candidate) => fitsSocketPath(candidate, platform));
|
|
122
|
+
if (fitting.length === 0) {
|
|
123
|
+
throw new PeerDirectoryError(`No candidate peer runtime directory fits this platform's socket path limit (${platformSocketPathLimit(platform)} bytes): ${candidates.join(', ')}`);
|
|
124
|
+
}
|
|
125
|
+
const failures = [];
|
|
126
|
+
for (const candidate of fitting) {
|
|
127
|
+
try {
|
|
128
|
+
harden(candidate, options.uid);
|
|
129
|
+
const sessionsDir = join(candidate, 'sessions');
|
|
130
|
+
harden(sessionsDir, options.uid);
|
|
131
|
+
return { path: candidate, sessionsDir };
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
failures.push(`${candidate}: ${error instanceof Error ? error.message : String(error)}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
throw new PeerDirectoryError(`No candidate peer runtime directory could be hardened:\n${failures.join('\n')}`);
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=dir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dir.js","sourceRoot":"","sources":["../../src/peers/dir.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `namzu-peer/1` server: one UDS path (POSIX) or named pipe (win32) per
|
|
3
|
+
* session, newline-delimited JSON framing, a closed op set (design §1.1,
|
|
4
|
+
* §1.3). Mirrors the shape of this repository's other local control
|
|
5
|
+
* endpoints (`startEndpoint` in
|
|
6
|
+
* `packages/cli/src/schedule/daemon/endpoint.ts`, `createRunnerControlServer`
|
|
7
|
+
* in `packages/cli/src/integrations/resident/runner-control.ts`): a total
|
|
8
|
+
* read deadline per connection (not an inactivity timer a slow sender can
|
|
9
|
+
* reset), a bounded connection count, and a destroyed socket rather than an
|
|
10
|
+
* error response for anything malformed — request bytes and tokens are
|
|
11
|
+
* never logged, so there is nothing to say about a bad request beyond
|
|
12
|
+
* closing the connection.
|
|
13
|
+
*
|
|
14
|
+
* This package tests only the POSIX (UDS) path; the win32 branch is written
|
|
15
|
+
* and reviewed, not exercised, since this environment cannot run a win32
|
|
16
|
+
* test.
|
|
17
|
+
*
|
|
18
|
+
* @experimental
|
|
19
|
+
*/
|
|
20
|
+
import { type Logger } from '../utils/logger.js';
|
|
21
|
+
import { type DeliverRequest, type DeliverResponse, type NoticeRequest, type PeerFrom, type PeerSessionState, type SubscribeIdleRequest, type SubscribeIdleResponse } from './protocol.js';
|
|
22
|
+
export declare class PeerEndpointError extends Error {
|
|
23
|
+
readonly name = "PeerEndpointError";
|
|
24
|
+
}
|
|
25
|
+
export interface CreatePeerEndpointOptions {
|
|
26
|
+
readonly address: string;
|
|
27
|
+
/** This session's own token; compared against every request but `ping` with `timingSafeEqual`. */
|
|
28
|
+
readonly token: string;
|
|
29
|
+
/** `undefined` models a platform with no uid (win32). Gates the stale-socket removal below. */
|
|
30
|
+
readonly uid?: number;
|
|
31
|
+
/** Answered verbatim on every `ping`; `ping` has no other way to learn the current state. */
|
|
32
|
+
readonly getState: () => PeerSessionState;
|
|
33
|
+
/**
|
|
34
|
+
* Directory holding the live-session registry (`sessions/<id>.json`),
|
|
35
|
+
* used by the DEFAULT `verifySender`. Not read at all if `verifySender`
|
|
36
|
+
* is supplied.
|
|
37
|
+
*/
|
|
38
|
+
readonly sessionsDir?: string;
|
|
39
|
+
readonly onDeliver: (request: DeliverRequest) => Promise<DeliverResponse> | DeliverResponse;
|
|
40
|
+
readonly onSubscribeIdle: (request: SubscribeIdleRequest) => Promise<SubscribeIdleResponse> | SubscribeIdleResponse;
|
|
41
|
+
readonly onNotice: (request: NoticeRequest) => Promise<void> | void;
|
|
42
|
+
/**
|
|
43
|
+
* Verify a sender's asserted identity, and return the identity the
|
|
44
|
+
* recipient should actually use — which is never simply `from` handed
|
|
45
|
+
* back, because a value the recipient uses for a decision (`mode`,
|
|
46
|
+
* `kind`) or shows the operator (`name`, `ref`) must come from something
|
|
47
|
+
* the sender does not control on this one connection. `false` refuses.
|
|
48
|
+
*
|
|
49
|
+
* Default ({@link defaultVerifySender}): the sender's registry record
|
|
50
|
+
* exists, is live ({@link isPeerRecordLive}), its `address` equals
|
|
51
|
+
* `from.address`, and its `permissionMode`/`kind` equal `from.mode`/
|
|
52
|
+
* `from.kind` (design §1.3) — so a process cannot claim to be a session
|
|
53
|
+
* it does not own, and a session cannot claim a mode or kind other than
|
|
54
|
+
* the one it registered. The identity returned on success is built
|
|
55
|
+
* entirely from the record: `name` is the record's own display name
|
|
56
|
+
* (`title`, or the last path segment of `cwd` when unset), never the
|
|
57
|
+
* wire's `from.name`.
|
|
58
|
+
*/
|
|
59
|
+
readonly verifySender?: (from: PeerFrom) => Promise<PeerFrom | false> | PeerFrom | false;
|
|
60
|
+
/** Default 2000ms; override for tests so a deadline test does not have to wait 2 real seconds. */
|
|
61
|
+
readonly readDeadlineMs?: number;
|
|
62
|
+
/** Default 16; override for tests. */
|
|
63
|
+
readonly maxConnections?: number;
|
|
64
|
+
/** Default 64 KiB; override for tests. */
|
|
65
|
+
readonly maxRequestBytes?: number;
|
|
66
|
+
/** Default 500ms; the timeout the default `verifySender`'s liveness ping uses. */
|
|
67
|
+
readonly livenessPingTimeoutMs?: number;
|
|
68
|
+
/** Default {@link MAX_OUTSTANDING_PEERS}; override for tests. */
|
|
69
|
+
readonly maxOutstandingPeers?: number;
|
|
70
|
+
/** Default {@link MAX_OUTSTANDING_PER_PEER}; override for tests. */
|
|
71
|
+
readonly maxOutstandingPerPeer?: number;
|
|
72
|
+
/** Default {@link OUTSTANDING_EXPIRY_MS}; override for tests. */
|
|
73
|
+
readonly outstandingExpiryMs?: number;
|
|
74
|
+
/** Default `Date.now`; injectable so an expiry test does not have to wait 24 real hours. */
|
|
75
|
+
readonly now?: () => number;
|
|
76
|
+
/**
|
|
77
|
+
* Discards when absent ({@link resolveLogger}). Used only to warn, at
|
|
78
|
+
* most once per peer per minute, when the outstanding-delivery or
|
|
79
|
+
* outstanding-subscription table drops a registration at the per-peer
|
|
80
|
+
* cap or evicts one to stay under the peer-count cap — never for
|
|
81
|
+
* anything else this endpoint does, and never with message content.
|
|
82
|
+
*/
|
|
83
|
+
readonly logger?: Logger;
|
|
84
|
+
}
|
|
85
|
+
export interface PeerEndpoint {
|
|
86
|
+
readonly address: string;
|
|
87
|
+
/** Refuse new connections and destroy remaining sockets before resolving. */
|
|
88
|
+
close(): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Record that THIS session sent a `deliver` to `peerSessionId` and so
|
|
91
|
+
* expects a `delivery` notice back about it. A `notice` naming a peer
|
|
92
|
+
* with no outstanding delivery is refused (§1.3): a session that never
|
|
93
|
+
* dealt with this recipient cannot manufacture an outcome for a message
|
|
94
|
+
* that was never sent. Counted, not boolean — several messages to the
|
|
95
|
+
* same peer may be outstanding at once, and each accepted notice
|
|
96
|
+
* consumes exactly one. Bounded and expiring
|
|
97
|
+
* ({@link MAX_OUTSTANDING_PEERS} distinct peers, {@link
|
|
98
|
+
* MAX_OUTSTANDING_PER_PEER} per peer, {@link OUTSTANDING_EXPIRY_MS}
|
|
99
|
+
* idle), so a peer that never answers cannot pin memory forever and a
|
|
100
|
+
* session cannot be driven to register unbounded distinct peer ids.
|
|
101
|
+
*/
|
|
102
|
+
registerOutstandingDelivery(peerSessionId: string): void;
|
|
103
|
+
/**
|
|
104
|
+
* Record that THIS session subscribed (directly, or via
|
|
105
|
+
* `deliver.subscribeIdle`) to `peerSessionId`'s idle/exit notice. An
|
|
106
|
+
* `idle`/`exited` notice naming a peer with no outstanding subscription
|
|
107
|
+
* is refused, the same reasoning as {@link registerOutstandingDelivery},
|
|
108
|
+
* with the same bound and expiry.
|
|
109
|
+
*/
|
|
110
|
+
registerOutstandingSubscription(peerSessionId: string): void;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Distinct peer sessions an endpoint's outstanding-delivery or
|
|
114
|
+
* outstanding-subscription table tracks at once, before the oldest is
|
|
115
|
+
* evicted to make room. A session that talks to hundreds of distinct peers
|
|
116
|
+
* without ever hearing back from most of them is already an anomaly this
|
|
117
|
+
* table should not have to hold unbounded memory for.
|
|
118
|
+
*/
|
|
119
|
+
export declare const MAX_OUTSTANDING_PEERS = 256;
|
|
120
|
+
/**
|
|
121
|
+
* Outstanding relationships tracked for any ONE peer at once, before further
|
|
122
|
+
* registrations for that same peer stop increasing the count. Generous
|
|
123
|
+
* enough for many messages or resubscriptions in flight to a single busy
|
|
124
|
+
* peer; still a bound, so one peer cannot itself grow this table's memory
|
|
125
|
+
* without limit by being registered against repeatedly.
|
|
126
|
+
*/
|
|
127
|
+
export declare const MAX_OUTSTANDING_PER_PEER = 64;
|
|
128
|
+
/**
|
|
129
|
+
* How long an outstanding delivery or subscription is honoured with no
|
|
130
|
+
* activity before it is swept away on its own, matching the design's
|
|
131
|
+
* `notify_when_idle` subscription expiry (§1.7): a peer that never answers —
|
|
132
|
+
* crashed, or simply never will — must not pin memory forever.
|
|
133
|
+
*/
|
|
134
|
+
export declare const OUTSTANDING_EXPIRY_MS: number;
|
|
135
|
+
/**
|
|
136
|
+
* Start serving `namzu-peer/1` on `options.address`.
|
|
137
|
+
*
|
|
138
|
+
* The four business-decision callbacks (`onDeliver`, `onSubscribeIdle`,
|
|
139
|
+
* `onNotice`, and the default-overriding `verifySender`) decide outcomes;
|
|
140
|
+
* this function owns only the transport: framing, the size/connection/
|
|
141
|
+
* deadline limits, the closed op set, and token comparison.
|
|
142
|
+
*/
|
|
143
|
+
export declare function createPeerEndpoint(options: CreatePeerEndpointOptions): Promise<PeerEndpoint>;
|
|
144
|
+
//# sourceMappingURL=endpoint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoint.d.ts","sourceRoot":"","sources":["../../src/peers/endpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAOH,OAAO,EAAE,KAAK,MAAM,EAAiB,MAAM,oBAAoB,CAAA;AAG/D,OAAO,EAEN,KAAK,cAAc,EACnB,KAAK,eAAe,EAGpB,KAAK,aAAa,EAElB,KAAK,QAAQ,EAEb,KAAK,gBAAgB,EAErB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,MAAM,eAAe,CAAA;AAItB,qBAAa,iBAAkB,SAAQ,KAAK;IAC3C,SAAkB,IAAI,uBAAsB;CAC5C;AAED,MAAM,WAAW,yBAAyB;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,kGAAkG;IAClG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,+FAA+F;IAC/F,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,6FAA6F;IAC7F,QAAQ,CAAC,QAAQ,EAAE,MAAM,gBAAgB,CAAA;IACzC;;;;OAIG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAAA;IAC3F,QAAQ,CAAC,eAAe,EAAE,CACzB,OAAO,EAAE,oBAAoB,KACzB,OAAO,CAAC,qBAAqB,CAAC,GAAG,qBAAqB,CAAA;IAC3D,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACnE;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,GAAG,QAAQ,GAAG,KAAK,CAAA;IACxF,kGAAkG;IAClG,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,sCAAsC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,0CAA0C;IAC1C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;IACjC,kFAAkF;IAClF,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAA;IACvC,iEAAiE;IACjE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IACrC,oEAAoE;IACpE,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAA;IACvC,iEAAiE;IACjE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IACrC,4FAA4F;IAC5F,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAC3B;;;;;;OAMG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,6EAA6E;IAC7E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB;;;;;;;;;;;;OAYG;IACH,2BAA2B,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IACxD;;;;;;OAMG;IACH,+BAA+B,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5D;AAyCD;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,MAAM,CAAA;AAExC;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,KAAK,CAAA;AAE1C;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,QAAsB,CAAA;AAqJxD;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACvC,OAAO,EAAE,yBAAyB,GAChC,OAAO,CAAC,YAAY,CAAC,CAwMvB"}
|