@strands-agents/sdk 0.4.0 → 0.6.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/dist/src/__fixtures__/agent-helpers.d.ts +10 -1
- package/dist/src/__fixtures__/agent-helpers.d.ts.map +1 -1
- package/dist/src/__fixtures__/agent-helpers.js +13 -2
- package/dist/src/__fixtures__/agent-helpers.js.map +1 -1
- package/dist/src/__fixtures__/metrics-helpers.d.ts +25 -0
- package/dist/src/__fixtures__/metrics-helpers.d.ts.map +1 -0
- package/dist/src/__fixtures__/metrics-helpers.js +34 -0
- package/dist/src/__fixtures__/metrics-helpers.js.map +1 -0
- package/dist/src/__fixtures__/mock-message-model.d.ts.map +1 -1
- package/dist/src/__fixtures__/mock-message-model.js +12 -0
- package/dist/src/__fixtures__/mock-message-model.js.map +1 -1
- package/dist/src/__fixtures__/mock-span.d.ts +78 -0
- package/dist/src/__fixtures__/mock-span.d.ts.map +1 -0
- package/dist/src/__fixtures__/mock-span.js +93 -0
- package/dist/src/__fixtures__/mock-span.js.map +1 -0
- package/dist/src/__fixtures__/mock-storage-provider.d.ts +5 -0
- package/dist/src/__fixtures__/mock-storage-provider.d.ts.map +1 -1
- package/dist/src/__fixtures__/mock-storage-provider.js +23 -6
- package/dist/src/__fixtures__/mock-storage-provider.js.map +1 -1
- package/dist/src/__fixtures__/slim-types.d.ts +2 -1
- package/dist/src/__fixtures__/slim-types.d.ts.map +1 -1
- package/dist/src/__fixtures__/tool-helpers.d.ts +2 -2
- package/dist/src/__fixtures__/tool-helpers.d.ts.map +1 -1
- package/dist/src/__fixtures__/tool-helpers.js +4 -4
- package/dist/src/__fixtures__/tool-helpers.js.map +1 -1
- package/dist/src/__tests__/app-state.test.d.ts +2 -0
- package/dist/src/__tests__/app-state.test.d.ts.map +1 -0
- package/dist/src/{agent/__tests__/state.test.js → __tests__/app-state.test.js} +46 -46
- package/dist/src/__tests__/app-state.test.js.map +1 -0
- package/dist/src/__tests__/mcp.test.js +129 -18
- package/dist/src/__tests__/mcp.test.js.map +1 -1
- package/dist/src/agent/__tests__/agent.test.js +119 -11
- package/dist/src/agent/__tests__/agent.test.js.map +1 -1
- package/dist/src/agent/__tests__/agent.tracer.test.d.ts +2 -0
- package/dist/src/agent/__tests__/agent.tracer.test.d.ts.map +1 -0
- package/dist/src/agent/__tests__/agent.tracer.test.js +470 -0
- package/dist/src/agent/__tests__/agent.tracer.test.js.map +1 -0
- package/dist/src/agent/agent.d.ts +79 -9
- package/dist/src/agent/agent.d.ts.map +1 -1
- package/dist/src/agent/agent.js +253 -68
- package/dist/src/agent/agent.js.map +1 -1
- package/dist/src/{agent/state.d.ts → app-state.d.ts} +7 -7
- package/dist/src/app-state.d.ts.map +1 -0
- package/dist/src/{agent/state.js → app-state.js} +6 -6
- package/dist/src/app-state.js.map +1 -0
- package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts +1 -1
- package/dist/src/conversation-manager/sliding-window-conversation-manager.js +1 -1
- package/dist/src/errors.d.ts +6 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +9 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/hooks/__tests__/events.test.js +2 -0
- package/dist/src/hooks/__tests__/events.test.js.map +1 -1
- package/dist/src/hooks/events.d.ts +16 -0
- package/dist/src/hooks/events.d.ts.map +1 -1
- package/dist/src/hooks/events.js.map +1 -1
- package/dist/src/hooks/index.d.ts +1 -1
- package/dist/src/hooks/index.d.ts.map +1 -1
- package/dist/src/index.d.ts +23 -7
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +19 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp.d.ts +41 -0
- package/dist/src/mcp.d.ts.map +1 -1
- package/dist/src/mcp.js +60 -6
- package/dist/src/mcp.js.map +1 -1
- package/dist/src/models/__tests__/bedrock.test.js +688 -0
- package/dist/src/models/__tests__/bedrock.test.js.map +1 -1
- package/dist/src/models/__tests__/model.test.js +113 -0
- package/dist/src/models/__tests__/model.test.js.map +1 -1
- package/dist/src/models/__tests__/streaming.test.d.ts +2 -0
- package/dist/src/models/__tests__/streaming.test.d.ts.map +1 -0
- package/dist/src/models/__tests__/streaming.test.js +50 -0
- package/dist/src/models/__tests__/streaming.test.js.map +1 -0
- package/dist/src/models/bedrock.d.ts +80 -1
- package/dist/src/models/bedrock.d.ts.map +1 -1
- package/dist/src/models/bedrock.js +214 -5
- package/dist/src/models/bedrock.js.map +1 -1
- package/dist/src/models/model.d.ts +10 -0
- package/dist/src/models/model.d.ts.map +1 -1
- package/dist/src/models/model.js +58 -2
- package/dist/src/models/model.js.map +1 -1
- package/dist/src/models/streaming.d.ts +84 -3
- package/dist/src/models/streaming.d.ts.map +1 -1
- package/dist/src/models/streaming.js +26 -0
- package/dist/src/models/streaming.js.map +1 -1
- package/dist/src/multiagent/__tests__/events.test.d.ts +2 -0
- package/dist/src/multiagent/__tests__/events.test.d.ts.map +1 -0
- package/dist/src/multiagent/__tests__/events.test.js +205 -0
- package/dist/src/multiagent/__tests__/events.test.js.map +1 -0
- package/dist/src/multiagent/__tests__/graph.test.d.ts +2 -0
- package/dist/src/multiagent/__tests__/graph.test.d.ts.map +1 -0
- package/dist/src/multiagent/__tests__/graph.test.js +438 -0
- package/dist/src/multiagent/__tests__/graph.test.js.map +1 -0
- package/dist/src/multiagent/__tests__/nodes.test.js +105 -9
- package/dist/src/multiagent/__tests__/nodes.test.js.map +1 -1
- package/dist/src/multiagent/__tests__/queue.test.d.ts +2 -0
- package/dist/src/multiagent/__tests__/queue.test.d.ts.map +1 -0
- package/dist/src/multiagent/__tests__/queue.test.js +118 -0
- package/dist/src/multiagent/__tests__/queue.test.js.map +1 -0
- package/dist/src/multiagent/__tests__/swarm.test.d.ts +2 -0
- package/dist/src/multiagent/__tests__/swarm.test.d.ts.map +1 -0
- package/dist/src/multiagent/__tests__/swarm.test.js +241 -0
- package/dist/src/multiagent/__tests__/swarm.test.js.map +1 -0
- package/dist/src/multiagent/base.d.ts +25 -0
- package/dist/src/multiagent/base.d.ts.map +1 -0
- package/dist/src/multiagent/base.js +2 -0
- package/dist/src/multiagent/base.js.map +1 -0
- package/dist/src/multiagent/edge.d.ts +36 -0
- package/dist/src/multiagent/edge.d.ts.map +1 -0
- package/dist/src/multiagent/edge.js +15 -0
- package/dist/src/multiagent/edge.js.map +1 -0
- package/dist/src/multiagent/events.d.ts +129 -4
- package/dist/src/multiagent/events.d.ts.map +1 -1
- package/dist/src/multiagent/events.js +140 -2
- package/dist/src/multiagent/events.js.map +1 -1
- package/dist/src/multiagent/graph.d.ts +125 -0
- package/dist/src/multiagent/graph.d.ts.map +1 -0
- package/dist/src/multiagent/graph.js +394 -0
- package/dist/src/multiagent/graph.js.map +1 -0
- package/dist/src/multiagent/index.d.ts +12 -6
- package/dist/src/multiagent/index.d.ts.map +1 -1
- package/dist/src/multiagent/index.js +6 -3
- package/dist/src/multiagent/index.js.map +1 -1
- package/dist/src/multiagent/nodes.d.ts +66 -16
- package/dist/src/multiagent/nodes.d.ts.map +1 -1
- package/dist/src/multiagent/nodes.js +82 -24
- package/dist/src/multiagent/nodes.js.map +1 -1
- package/dist/src/multiagent/queue.d.ts +73 -0
- package/dist/src/multiagent/queue.d.ts.map +1 -0
- package/dist/src/multiagent/queue.js +72 -0
- package/dist/src/multiagent/queue.js.map +1 -0
- package/dist/src/multiagent/state.d.ts +79 -10
- package/dist/src/multiagent/state.d.ts.map +1 -1
- package/dist/src/multiagent/state.js +101 -9
- package/dist/src/multiagent/state.js.map +1 -1
- package/dist/src/multiagent/swarm.d.ts +102 -0
- package/dist/src/multiagent/swarm.d.ts.map +1 -0
- package/dist/src/multiagent/swarm.js +238 -0
- package/dist/src/multiagent/swarm.js.map +1 -0
- package/dist/src/registry/__tests__/tool-registry.test.d.ts +2 -0
- package/dist/src/registry/__tests__/tool-registry.test.d.ts.map +1 -0
- package/dist/src/registry/__tests__/tool-registry.test.js +124 -0
- package/dist/src/registry/__tests__/tool-registry.test.js.map +1 -0
- package/dist/src/registry/tool-registry.d.ts +32 -20
- package/dist/src/registry/tool-registry.d.ts.map +1 -1
- package/dist/src/registry/tool-registry.js +60 -158
- package/dist/src/registry/tool-registry.js.map +1 -1
- package/dist/src/session/__tests__/file-storage.test.node.js +75 -15
- package/dist/src/session/__tests__/file-storage.test.node.js.map +1 -1
- package/dist/src/session/__tests__/s3-storage.test.d.ts +2 -0
- package/dist/src/session/__tests__/s3-storage.test.d.ts.map +1 -0
- package/dist/src/session/__tests__/{s3-storage.test.node.js → s3-storage.test.js} +161 -75
- package/dist/src/session/__tests__/s3-storage.test.js.map +1 -0
- package/dist/src/session/__tests__/session-manager.test.d.ts +2 -0
- package/dist/src/session/__tests__/session-manager.test.d.ts.map +1 -0
- package/dist/src/session/__tests__/session-manager.test.js +461 -0
- package/dist/src/session/__tests__/session-manager.test.js.map +1 -0
- package/dist/src/session/__tests__/validation.test.js +28 -1
- package/dist/src/session/__tests__/validation.test.js.map +1 -1
- package/dist/src/session/file-storage.d.ts +53 -27
- package/dist/src/session/file-storage.d.ts.map +1 -1
- package/dist/src/session/file-storage.js +103 -52
- package/dist/src/session/file-storage.js.map +1 -1
- package/dist/src/session/index.d.ts +6 -13
- package/dist/src/session/index.d.ts.map +1 -1
- package/dist/src/session/index.js +4 -12
- package/dist/src/session/index.js.map +1 -1
- package/dist/src/session/s3-storage.d.ts +49 -20
- package/dist/src/session/s3-storage.d.ts.map +1 -1
- package/dist/src/session/s3-storage.js +120 -35
- package/dist/src/session/s3-storage.js.map +1 -1
- package/dist/src/session/session-manager.d.ts +83 -0
- package/dist/src/session/session-manager.d.ts.map +1 -0
- package/dist/src/session/session-manager.js +122 -0
- package/dist/src/session/session-manager.js.map +1 -0
- package/dist/src/session/storage.d.ts +19 -11
- package/dist/src/session/storage.d.ts.map +1 -1
- package/dist/src/session/types.d.ts +6 -18
- package/dist/src/session/types.d.ts.map +1 -1
- package/dist/src/session/validation.d.ts +7 -0
- package/dist/src/session/validation.d.ts.map +1 -1
- package/dist/src/session/validation.js +12 -0
- package/dist/src/session/validation.js.map +1 -1
- package/dist/src/structured-output/__tests__/context.test.js +13 -13
- package/dist/src/structured-output/__tests__/context.test.js.map +1 -1
- package/dist/src/structured-output/context.js +1 -1
- package/dist/src/structured-output/context.js.map +1 -1
- package/dist/src/telemetry/__tests__/config.test.d.ts +2 -0
- package/dist/src/telemetry/__tests__/config.test.d.ts.map +1 -0
- package/dist/src/telemetry/__tests__/config.test.js +40 -0
- package/dist/src/telemetry/__tests__/config.test.js.map +1 -0
- package/dist/src/telemetry/__tests__/config.test.node.d.ts +2 -0
- package/dist/src/telemetry/__tests__/config.test.node.d.ts.map +1 -0
- package/dist/src/telemetry/__tests__/config.test.node.js +103 -0
- package/dist/src/telemetry/__tests__/config.test.node.js.map +1 -0
- package/dist/src/telemetry/__tests__/json.test.d.ts +2 -0
- package/dist/src/telemetry/__tests__/json.test.d.ts.map +1 -0
- package/dist/src/telemetry/__tests__/json.test.js +89 -0
- package/dist/src/telemetry/__tests__/json.test.js.map +1 -0
- package/dist/src/telemetry/__tests__/meter.test.d.ts +2 -0
- package/dist/src/telemetry/__tests__/meter.test.d.ts.map +1 -0
- package/dist/src/telemetry/__tests__/meter.test.js +457 -0
- package/dist/src/telemetry/__tests__/meter.test.js.map +1 -0
- package/dist/src/telemetry/__tests__/tracer.test.node.d.ts +2 -0
- package/dist/src/telemetry/__tests__/tracer.test.node.d.ts.map +1 -0
- package/dist/src/telemetry/__tests__/tracer.test.node.js +611 -0
- package/dist/src/telemetry/__tests__/tracer.test.node.js.map +1 -0
- package/dist/src/telemetry/config.d.ts +82 -0
- package/dist/src/telemetry/config.d.ts.map +1 -0
- package/dist/src/telemetry/config.js +133 -0
- package/dist/src/telemetry/config.js.map +1 -0
- package/dist/src/telemetry/index.d.ts +34 -0
- package/dist/src/telemetry/index.d.ts.map +1 -0
- package/dist/src/telemetry/index.js +33 -0
- package/dist/src/telemetry/index.js.map +1 -0
- package/dist/src/telemetry/json.d.ts +11 -0
- package/dist/src/telemetry/json.d.ts.map +1 -0
- package/dist/src/telemetry/json.js +25 -0
- package/dist/src/telemetry/json.js.map +1 -0
- package/dist/src/telemetry/meter.d.ts +277 -0
- package/dist/src/telemetry/meter.d.ts.map +1 -0
- package/dist/src/telemetry/meter.js +292 -0
- package/dist/src/telemetry/meter.js.map +1 -0
- package/dist/src/telemetry/tracer.d.ts +219 -0
- package/dist/src/telemetry/tracer.d.ts.map +1 -0
- package/dist/src/telemetry/tracer.js +610 -0
- package/dist/src/telemetry/tracer.js.map +1 -0
- package/dist/src/telemetry/types.d.ts +101 -0
- package/dist/src/telemetry/types.d.ts.map +1 -0
- package/dist/src/telemetry/types.js +5 -0
- package/dist/src/{multiagent → telemetry}/types.js.map +1 -1
- package/dist/src/tools/__tests__/tool-factory.test.d.ts +2 -0
- package/dist/src/tools/__tests__/tool-factory.test.d.ts.map +1 -0
- package/dist/src/tools/__tests__/tool-factory.test.js +98 -0
- package/dist/src/tools/__tests__/tool-factory.test.js.map +1 -0
- package/dist/src/tools/__tests__/zod-tool.test-d.js +1 -1
- package/dist/src/tools/__tests__/zod-tool.test-d.js.map +1 -1
- package/dist/src/tools/__tests__/zod-tool.test.js +3 -4
- package/dist/src/tools/__tests__/zod-tool.test.js.map +1 -1
- package/dist/src/tools/function-tool.d.ts +15 -2
- package/dist/src/tools/function-tool.d.ts.map +1 -1
- package/dist/src/tools/function-tool.js +24 -0
- package/dist/src/tools/function-tool.js.map +1 -1
- package/dist/src/tools/tool-factory.d.ts +22 -0
- package/dist/src/tools/tool-factory.d.ts.map +1 -0
- package/dist/src/tools/tool-factory.js +55 -0
- package/dist/src/tools/tool-factory.js.map +1 -0
- package/dist/src/tools/tool.d.ts +1 -1
- package/dist/src/tools/tool.js +1 -1
- package/dist/src/tools/zod-tool.d.ts +55 -52
- package/dist/src/tools/zod-tool.d.ts.map +1 -1
- package/dist/src/tools/zod-tool.js +7 -61
- package/dist/src/tools/zod-tool.js.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/src/types/__tests__/agent.test.js +11 -0
- package/dist/src/types/__tests__/agent.test.js.map +1 -1
- package/dist/src/types/__tests__/citations.test.d.ts +2 -0
- package/dist/src/types/__tests__/citations.test.d.ts.map +1 -0
- package/dist/src/types/__tests__/citations.test.js +104 -0
- package/dist/src/types/__tests__/citations.test.js.map +1 -0
- package/dist/src/types/__tests__/messages.test.js +26 -0
- package/dist/src/types/__tests__/messages.test.js.map +1 -1
- package/dist/src/types/agent.d.ts +10 -3
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/agent.js +9 -0
- package/dist/src/types/agent.js.map +1 -1
- package/dist/src/types/citations.d.ts +180 -0
- package/dist/src/types/citations.d.ts.map +1 -0
- package/dist/src/types/citations.js +45 -0
- package/dist/src/types/citations.js.map +1 -0
- package/dist/src/types/messages.d.ts +9 -5
- package/dist/src/types/messages.d.ts.map +1 -1
- package/dist/src/types/messages.js +5 -1
- package/dist/src/types/messages.js.map +1 -1
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.js +2 -2
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.js.map +1 -1
- package/dist/src/vended-tools/bash/bash.d.ts.map +1 -1
- package/dist/src/vended-tools/bash/bash.js +1 -2
- package/dist/src/vended-tools/bash/bash.js.map +1 -1
- package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.node.js +4 -4
- package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.node.js.map +1 -1
- package/dist/src/vended-tools/file_editor/file-editor.js +1 -1
- package/dist/src/vended-tools/file_editor/file-editor.js.map +1 -1
- package/dist/src/vended-tools/http_request/http-request.d.ts.map +1 -1
- package/dist/src/vended-tools/http_request/http-request.js +1 -2
- package/dist/src/vended-tools/http_request/http-request.js.map +1 -1
- package/dist/src/vended-tools/notebook/__tests__/notebook.test.js +2 -2
- package/dist/src/vended-tools/notebook/__tests__/notebook.test.js.map +1 -1
- package/dist/src/vended-tools/notebook/notebook.d.ts +1 -1
- package/package.json +25 -4
- package/dist/src/agent/__tests__/state.test.d.ts +0 -2
- package/dist/src/agent/__tests__/state.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/state.test.js.map +0 -1
- package/dist/src/agent/state.d.ts.map +0 -1
- package/dist/src/agent/state.js.map +0 -1
- package/dist/src/multiagent/types.d.ts +0 -5
- package/dist/src/multiagent/types.d.ts.map +0 -1
- package/dist/src/multiagent/types.js +0 -2
- package/dist/src/registry/registry.d.ts +0 -117
- package/dist/src/registry/registry.d.ts.map +0 -1
- package/dist/src/registry/registry.js +0 -298
- package/dist/src/registry/registry.js.map +0 -1
- package/dist/src/session/__tests__/s3-storage.test.node.d.ts +0 -2
- package/dist/src/session/__tests__/s3-storage.test.node.d.ts.map +0 -1
- package/dist/src/session/__tests__/s3-storage.test.node.js.map +0 -1
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { Agent } from '../agent/agent.js';
|
|
2
|
+
import type { InvokeArgs } from '../agent/agent.js';
|
|
3
|
+
import { HookRegistryImplementation } from '../hooks/registry.js';
|
|
4
|
+
import type { HookProvider } from '../hooks/types.js';
|
|
5
|
+
import type { AgentNodeOptions } from './nodes.js';
|
|
6
|
+
import { AgentNode } from './nodes.js';
|
|
7
|
+
import { MultiAgentResult } from './state.js';
|
|
8
|
+
import type { MultiAgentBase } from './base.js';
|
|
9
|
+
import type { MultiAgentStreamEvent } from './events.js';
|
|
10
|
+
/**
|
|
11
|
+
* Runtime configuration for swarm execution.
|
|
12
|
+
*/
|
|
13
|
+
export interface SwarmConfig {
|
|
14
|
+
/** Max total agent executions (including start). Defaults to Infinity. */
|
|
15
|
+
maxSteps?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Options for creating a Swarm instance.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Input type for swarm nodes. Pass an {@link Agent} directly for the simple case,
|
|
22
|
+
* or {@link AgentNodeOptions} for per-node config.
|
|
23
|
+
*/
|
|
24
|
+
export type SwarmNodeDefinition = Agent | AgentNodeOptions;
|
|
25
|
+
export interface SwarmOptions extends SwarmConfig {
|
|
26
|
+
/** Unique identifier. Defaults to `'swarm'`. */
|
|
27
|
+
id?: string;
|
|
28
|
+
/** Swarm agents. Pass agents directly or use {@link AgentNodeOptions} for per-node config. */
|
|
29
|
+
nodes: SwarmNodeDefinition[];
|
|
30
|
+
/** Agent id that receives the initial input. */
|
|
31
|
+
start: string;
|
|
32
|
+
/** Hook providers for event-driven extensibility. */
|
|
33
|
+
hooks?: HookProvider[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Swarm multi-agent orchestration pattern.
|
|
37
|
+
*
|
|
38
|
+
* Agents execute sequentially, each deciding whether to hand off to another agent or
|
|
39
|
+
* produce a final response. Routing is driven by structured output: each agent receives
|
|
40
|
+
* a Zod schema with `agentId`, `message`, and optional `context` fields. When `agentId`
|
|
41
|
+
* is present, the swarm hands off to that agent with `message` as input. When omitted,
|
|
42
|
+
* `message` becomes the final response.
|
|
43
|
+
*
|
|
44
|
+
* Key design choices vs the Python SDK:
|
|
45
|
+
* - Handoffs use structured output rather than an injected `handoff_to_agent` tool.
|
|
46
|
+
* Routing logic stays in the orchestrator, not inside tool callbacks.
|
|
47
|
+
* - Context is passed as serialized JSON text blocks rather than a mutable SharedContext.
|
|
48
|
+
* - A single `maxSteps` limit replaces Python's separate `max_handoffs`/`max_iterations`.
|
|
49
|
+
* - Agent descriptions are embedded in the structured output schema for routing decisions.
|
|
50
|
+
* - Exceeding `maxSteps` throws an exception. Python returns a FAILED result.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* const swarm = new Swarm({
|
|
55
|
+
* nodes: [researcher, writer],
|
|
56
|
+
* start: 'researcher',
|
|
57
|
+
* maxSteps: 10,
|
|
58
|
+
* })
|
|
59
|
+
*
|
|
60
|
+
* const result = await swarm.invoke('Explain quantum computing')
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export declare class Swarm implements MultiAgentBase {
|
|
64
|
+
readonly id: string;
|
|
65
|
+
readonly nodes: ReadonlyMap<string, AgentNode>;
|
|
66
|
+
readonly config: Required<SwarmConfig>;
|
|
67
|
+
readonly hooks: HookRegistryImplementation;
|
|
68
|
+
private readonly _start;
|
|
69
|
+
private readonly _handoffSchema;
|
|
70
|
+
private _initialized;
|
|
71
|
+
constructor(options: SwarmOptions);
|
|
72
|
+
/**
|
|
73
|
+
* Initialize the swarm. Invokes the {@link MultiAgentInitializedEvent} callback.
|
|
74
|
+
* Called automatically on first invocation.
|
|
75
|
+
*/
|
|
76
|
+
initialize(): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* Invoke swarm and return final result (consumes stream).
|
|
79
|
+
*
|
|
80
|
+
* @param input - The input to pass to the start agent
|
|
81
|
+
* @returns Promise resolving to the final MultiAgentResult
|
|
82
|
+
*/
|
|
83
|
+
invoke(input: InvokeArgs): Promise<MultiAgentResult>;
|
|
84
|
+
/**
|
|
85
|
+
* Stream swarm execution, yielding events as agents execute.
|
|
86
|
+
* Invokes hook callbacks for each event before yielding.
|
|
87
|
+
*
|
|
88
|
+
* @param input - The input to pass to the start agent
|
|
89
|
+
* @returns Async generator yielding streaming events and returning a MultiAgentResult
|
|
90
|
+
*/
|
|
91
|
+
stream(input: InvokeArgs): AsyncGenerator<MultiAgentStreamEvent, MultiAgentResult, undefined>;
|
|
92
|
+
private _stream;
|
|
93
|
+
private _streamNode;
|
|
94
|
+
private _validateConfig;
|
|
95
|
+
private _resolveNodes;
|
|
96
|
+
private _resolveStart;
|
|
97
|
+
private _resolveContent;
|
|
98
|
+
private _resolveNodeInput;
|
|
99
|
+
private _checkSteps;
|
|
100
|
+
private _buildHandoffSchema;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=swarm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swarm.d.ts","sourceRoot":"","sources":["../../../src/multiagent/swarm.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAGnD,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAA;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAmB,gBAAgB,EAAsB,MAAM,YAAY,CAAA;AAClF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAYxD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAiBD;;GAEG;AACH;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,gBAAgB,CAAA;AAE1D,MAAM,WAAW,YAAa,SAAQ,WAAW;IAC/C,gDAAgD;IAChD,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,8FAA8F;IAC9F,KAAK,EAAE,mBAAmB,EAAE,CAAA;IAC5B,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAA;IACb,qDAAqD;IACrD,KAAK,CAAC,EAAE,YAAY,EAAE,CAAA;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,KAAM,YAAW,cAAc;IAC1C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC9C,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAA;IACtC,QAAQ,CAAC,KAAK,EAAE,0BAA0B,CAAA;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA0B;IACzD,OAAO,CAAC,YAAY,CAAS;gBAEjB,OAAO,EAAE,YAAY;IAoBjC;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC;;;;;OAKG;IACG,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAS1D;;;;;;OAMG;IACI,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,cAAc,CAAC,qBAAqB,EAAE,gBAAgB,EAAE,SAAS,CAAC;YAerF,OAAO;YA8CP,WAAW;IA4C1B,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,mBAAmB;CAsB5B"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { logger } from '../logging/logger.js';
|
|
2
|
+
import { Agent } from '../agent/agent.js';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { HookableEvent } from '../hooks/events.js';
|
|
5
|
+
import { HookRegistryImplementation } from '../hooks/registry.js';
|
|
6
|
+
import { TextBlock } from '../types/messages.js';
|
|
7
|
+
import { AgentNode } from './nodes.js';
|
|
8
|
+
import { MultiAgentState, MultiAgentResult, NodeResult, Status } from './state.js';
|
|
9
|
+
import { AfterMultiAgentInvocationEvent, AfterNodeCallEvent, BeforeMultiAgentInvocationEvent, BeforeNodeCallEvent, MultiAgentHandoffEvent, MultiAgentInitializedEvent, MultiAgentResultEvent, NodeCancelEvent, } from './events.js';
|
|
10
|
+
/**
|
|
11
|
+
* Swarm multi-agent orchestration pattern.
|
|
12
|
+
*
|
|
13
|
+
* Agents execute sequentially, each deciding whether to hand off to another agent or
|
|
14
|
+
* produce a final response. Routing is driven by structured output: each agent receives
|
|
15
|
+
* a Zod schema with `agentId`, `message`, and optional `context` fields. When `agentId`
|
|
16
|
+
* is present, the swarm hands off to that agent with `message` as input. When omitted,
|
|
17
|
+
* `message` becomes the final response.
|
|
18
|
+
*
|
|
19
|
+
* Key design choices vs the Python SDK:
|
|
20
|
+
* - Handoffs use structured output rather than an injected `handoff_to_agent` tool.
|
|
21
|
+
* Routing logic stays in the orchestrator, not inside tool callbacks.
|
|
22
|
+
* - Context is passed as serialized JSON text blocks rather than a mutable SharedContext.
|
|
23
|
+
* - A single `maxSteps` limit replaces Python's separate `max_handoffs`/`max_iterations`.
|
|
24
|
+
* - Agent descriptions are embedded in the structured output schema for routing decisions.
|
|
25
|
+
* - Exceeding `maxSteps` throws an exception. Python returns a FAILED result.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* const swarm = new Swarm({
|
|
30
|
+
* nodes: [researcher, writer],
|
|
31
|
+
* start: 'researcher',
|
|
32
|
+
* maxSteps: 10,
|
|
33
|
+
* })
|
|
34
|
+
*
|
|
35
|
+
* const result = await swarm.invoke('Explain quantum computing')
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export class Swarm {
|
|
39
|
+
id;
|
|
40
|
+
nodes;
|
|
41
|
+
config;
|
|
42
|
+
hooks;
|
|
43
|
+
_start;
|
|
44
|
+
_handoffSchema;
|
|
45
|
+
_initialized;
|
|
46
|
+
constructor(options) {
|
|
47
|
+
const { id, nodes, start, hooks, ...config } = options;
|
|
48
|
+
this.id = id ?? 'swarm';
|
|
49
|
+
this.config = {
|
|
50
|
+
maxSteps: config.maxSteps ?? Infinity,
|
|
51
|
+
};
|
|
52
|
+
this._validateConfig();
|
|
53
|
+
this.nodes = this._resolveNodes(nodes);
|
|
54
|
+
this._start = this._resolveStart(start);
|
|
55
|
+
this._handoffSchema = this._buildHandoffSchema();
|
|
56
|
+
this.hooks = new HookRegistryImplementation();
|
|
57
|
+
this.hooks.addAllHooks(hooks ?? []);
|
|
58
|
+
this._initialized = false;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Initialize the swarm. Invokes the {@link MultiAgentInitializedEvent} callback.
|
|
62
|
+
* Called automatically on first invocation.
|
|
63
|
+
*/
|
|
64
|
+
async initialize() {
|
|
65
|
+
if (this._initialized)
|
|
66
|
+
return;
|
|
67
|
+
await this.hooks.invokeCallbacks(new MultiAgentInitializedEvent({ orchestrator: this }));
|
|
68
|
+
this._initialized = true;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Invoke swarm and return final result (consumes stream).
|
|
72
|
+
*
|
|
73
|
+
* @param input - The input to pass to the start agent
|
|
74
|
+
* @returns Promise resolving to the final MultiAgentResult
|
|
75
|
+
*/
|
|
76
|
+
async invoke(input) {
|
|
77
|
+
const gen = this.stream(input);
|
|
78
|
+
let next = await gen.next();
|
|
79
|
+
while (!next.done) {
|
|
80
|
+
next = await gen.next();
|
|
81
|
+
}
|
|
82
|
+
return next.value;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Stream swarm execution, yielding events as agents execute.
|
|
86
|
+
* Invokes hook callbacks for each event before yielding.
|
|
87
|
+
*
|
|
88
|
+
* @param input - The input to pass to the start agent
|
|
89
|
+
* @returns Async generator yielding streaming events and returning a MultiAgentResult
|
|
90
|
+
*/
|
|
91
|
+
async *stream(input) {
|
|
92
|
+
await this.initialize();
|
|
93
|
+
const gen = this._stream(input);
|
|
94
|
+
let next = await gen.next();
|
|
95
|
+
while (!next.done) {
|
|
96
|
+
if (next.value instanceof HookableEvent) {
|
|
97
|
+
await this.hooks.invokeCallbacks(next.value);
|
|
98
|
+
}
|
|
99
|
+
yield next.value;
|
|
100
|
+
next = await gen.next();
|
|
101
|
+
}
|
|
102
|
+
return next.value;
|
|
103
|
+
}
|
|
104
|
+
async *_stream(input) {
|
|
105
|
+
const state = new MultiAgentState({
|
|
106
|
+
nodeIds: [...this.nodes.keys()],
|
|
107
|
+
structuredOutputSchema: this._handoffSchema,
|
|
108
|
+
});
|
|
109
|
+
yield new BeforeMultiAgentInvocationEvent({ orchestrator: this, state });
|
|
110
|
+
let node = this._start;
|
|
111
|
+
let handoff;
|
|
112
|
+
try {
|
|
113
|
+
while (state.steps < this.config.maxSteps) {
|
|
114
|
+
state.steps++;
|
|
115
|
+
// Execute current node
|
|
116
|
+
const result = yield* this._streamNode(node, input, state, handoff);
|
|
117
|
+
handoff = result.structuredOutput;
|
|
118
|
+
state.results.push(result);
|
|
119
|
+
// Check for terminal conditions
|
|
120
|
+
if (result.status === Status.FAILED || !handoff?.agentId) {
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
// Hand off to next agent
|
|
124
|
+
const target = this.nodes.get(handoff.agentId);
|
|
125
|
+
yield new MultiAgentHandoffEvent({ source: node.id, targets: [target.id] });
|
|
126
|
+
logger.debug(`source=<${node.id}>, target=<${target.id}> | swarm handoff`);
|
|
127
|
+
node = target;
|
|
128
|
+
}
|
|
129
|
+
this._checkSteps(state);
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
yield new AfterMultiAgentInvocationEvent({ orchestrator: this, state });
|
|
133
|
+
}
|
|
134
|
+
const result = new MultiAgentResult({
|
|
135
|
+
results: state.results,
|
|
136
|
+
content: this._resolveContent(state),
|
|
137
|
+
duration: Date.now() - state.startTime,
|
|
138
|
+
});
|
|
139
|
+
yield new MultiAgentResultEvent({ result });
|
|
140
|
+
return result;
|
|
141
|
+
}
|
|
142
|
+
async *_streamNode(node, input, state, handoff) {
|
|
143
|
+
const nodeState = state.node(node.id);
|
|
144
|
+
const beforeEvent = new BeforeNodeCallEvent({ orchestrator: this, state, nodeId: node.id });
|
|
145
|
+
yield beforeEvent;
|
|
146
|
+
if (beforeEvent.cancel) {
|
|
147
|
+
const message = typeof beforeEvent.cancel === 'string' ? beforeEvent.cancel : 'node cancelled by hook';
|
|
148
|
+
const result = new NodeResult({ nodeId: node.id, status: Status.CANCELLED, duration: 0 });
|
|
149
|
+
nodeState.status = Status.CANCELLED;
|
|
150
|
+
nodeState.results.push(result);
|
|
151
|
+
yield new NodeCancelEvent({ nodeId: node.id, message });
|
|
152
|
+
yield new AfterNodeCallEvent({ orchestrator: this, state, nodeId: node.id });
|
|
153
|
+
return result;
|
|
154
|
+
}
|
|
155
|
+
const nodeInput = this._resolveNodeInput(input, handoff);
|
|
156
|
+
try {
|
|
157
|
+
const gen = node.stream(nodeInput, state);
|
|
158
|
+
let next = await gen.next();
|
|
159
|
+
while (!next.done) {
|
|
160
|
+
yield next.value;
|
|
161
|
+
next = await gen.next();
|
|
162
|
+
}
|
|
163
|
+
yield new AfterNodeCallEvent({ orchestrator: this, state, nodeId: node.id });
|
|
164
|
+
return next.value;
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
yield new AfterNodeCallEvent({
|
|
168
|
+
orchestrator: this,
|
|
169
|
+
state,
|
|
170
|
+
nodeId: node.id,
|
|
171
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
172
|
+
});
|
|
173
|
+
throw error;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
_validateConfig() {
|
|
177
|
+
if (this.config.maxSteps < 1) {
|
|
178
|
+
throw new Error(`max_steps=<${this.config.maxSteps}> | must be at least 1`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
_resolveNodes(definitions) {
|
|
182
|
+
const nodes = new Map();
|
|
183
|
+
for (const definition of definitions) {
|
|
184
|
+
const node = definition instanceof Agent ? new AgentNode({ agent: definition }) : new AgentNode(definition);
|
|
185
|
+
if (nodes.has(node.id)) {
|
|
186
|
+
throw new Error(`agent_id=<${node.id}> | duplicate agent id`);
|
|
187
|
+
}
|
|
188
|
+
nodes.set(node.id, node);
|
|
189
|
+
}
|
|
190
|
+
return nodes;
|
|
191
|
+
}
|
|
192
|
+
_resolveStart(start) {
|
|
193
|
+
const node = this.nodes.get(start);
|
|
194
|
+
if (!node) {
|
|
195
|
+
throw new Error(`start=<${start}> | start references unknown agent`);
|
|
196
|
+
}
|
|
197
|
+
return node;
|
|
198
|
+
}
|
|
199
|
+
_resolveContent(state) {
|
|
200
|
+
const last = state.results[state.results.length - 1];
|
|
201
|
+
state.node(last.nodeId).terminus = true;
|
|
202
|
+
return [...last.content];
|
|
203
|
+
}
|
|
204
|
+
_resolveNodeInput(input, handoff) {
|
|
205
|
+
if (!handoff)
|
|
206
|
+
return input;
|
|
207
|
+
const blocks = [new TextBlock(handoff.message)];
|
|
208
|
+
if (handoff.context) {
|
|
209
|
+
blocks.push(new TextBlock('Context:\n' + JSON.stringify(handoff.context, null, 2)));
|
|
210
|
+
}
|
|
211
|
+
return blocks;
|
|
212
|
+
}
|
|
213
|
+
_checkSteps(state) {
|
|
214
|
+
if (state.steps >= this.config.maxSteps) {
|
|
215
|
+
throw new Error(`max_steps=<${this.config.maxSteps}> | swarm reached step limit`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
_buildHandoffSchema() {
|
|
219
|
+
const agentIds = [...this.nodes.keys()];
|
|
220
|
+
const agentDescriptions = agentIds
|
|
221
|
+
.map((id) => {
|
|
222
|
+
const desc = this.nodes.get(id).config.description;
|
|
223
|
+
return desc ? `- ${id}: ${desc}` : `- ${id}`;
|
|
224
|
+
})
|
|
225
|
+
.join('\n');
|
|
226
|
+
return z
|
|
227
|
+
.object({
|
|
228
|
+
agentId: z
|
|
229
|
+
.enum(agentIds)
|
|
230
|
+
.optional()
|
|
231
|
+
.describe(`Target agent to hand off to. Omit to end the conversation.\n\nAvailable agents:\n${agentDescriptions}`),
|
|
232
|
+
message: z.string().describe('Instructions for the next agent, or the final response if no handoff.'),
|
|
233
|
+
context: z.record(z.string(), z.unknown()).optional().describe('Structured data to pass to the next agent.'),
|
|
234
|
+
})
|
|
235
|
+
.describe('Decide whether to hand off to another agent or produce a final response.');
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=swarm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swarm.js","sourceRoot":"","sources":["../../../src/multiagent/swarm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-registry.test.d.ts","sourceRoot":"","sources":["../../../../src/registry/__tests__/tool-registry.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
+
import { ToolRegistry } from '../tool-registry.js';
|
|
3
|
+
import { ToolValidationError } from '../../errors.js';
|
|
4
|
+
import { ToolStreamEvent } from '../../tools/tool.js';
|
|
5
|
+
import { ToolResultBlock } from '../../types/messages.js';
|
|
6
|
+
const createMockTool = (overrides = {}) => ({
|
|
7
|
+
name: 'valid-tool',
|
|
8
|
+
description: 'A valid tool description.',
|
|
9
|
+
toolSpec: {
|
|
10
|
+
name: 'valid-tool',
|
|
11
|
+
description: 'A valid tool description.',
|
|
12
|
+
inputSchema: { type: 'object', properties: {} },
|
|
13
|
+
},
|
|
14
|
+
stream: async function* () {
|
|
15
|
+
yield new ToolStreamEvent({ data: 'mock data' });
|
|
16
|
+
return new ToolResultBlock({ toolUseId: '', status: 'success', content: [] });
|
|
17
|
+
},
|
|
18
|
+
...overrides,
|
|
19
|
+
});
|
|
20
|
+
describe('ToolRegistry', () => {
|
|
21
|
+
let registry;
|
|
22
|
+
beforeEach(() => {
|
|
23
|
+
registry = new ToolRegistry();
|
|
24
|
+
});
|
|
25
|
+
describe('add', () => {
|
|
26
|
+
it('registers a single tool', () => {
|
|
27
|
+
const tool = createMockTool();
|
|
28
|
+
registry.add(tool);
|
|
29
|
+
expect(registry.list()).toStrictEqual([tool]);
|
|
30
|
+
});
|
|
31
|
+
it('registers an array of tools', () => {
|
|
32
|
+
const tool1 = createMockTool({ name: 'tool-1' });
|
|
33
|
+
const tool2 = createMockTool({ name: 'tool-2' });
|
|
34
|
+
registry.add([tool1, tool2]);
|
|
35
|
+
expect(registry.list()).toStrictEqual([tool1, tool2]);
|
|
36
|
+
});
|
|
37
|
+
it('throws ToolValidationError for a duplicate tool name', () => {
|
|
38
|
+
registry.add(createMockTool({ name: 'duplicate' }));
|
|
39
|
+
expect(() => registry.add(createMockTool({ name: 'duplicate' }))).toThrow(ToolValidationError);
|
|
40
|
+
expect(() => registry.add(createMockTool({ name: 'duplicate' }))).toThrow("Tool with name 'duplicate' already registered");
|
|
41
|
+
});
|
|
42
|
+
it('throws ToolValidationError for an invalid tool name pattern', () => {
|
|
43
|
+
expect(() => registry.add(createMockTool({ name: 'invalid name!' }))).toThrow(ToolValidationError);
|
|
44
|
+
expect(() => registry.add(createMockTool({ name: 'invalid name!' }))).toThrow('Tool name must contain only alphanumeric characters, hyphens, and underscores');
|
|
45
|
+
});
|
|
46
|
+
it('throws ToolValidationError for a tool name that is too long', () => {
|
|
47
|
+
expect(() => registry.add(createMockTool({ name: 'a'.repeat(65) }))).toThrow(ToolValidationError);
|
|
48
|
+
expect(() => registry.add(createMockTool({ name: 'a'.repeat(65) }))).toThrow('Tool name must be between 1 and 64 characters');
|
|
49
|
+
});
|
|
50
|
+
it('throws ToolValidationError for a tool name that is too short', () => {
|
|
51
|
+
expect(() => registry.add(createMockTool({ name: '' }))).toThrow(ToolValidationError);
|
|
52
|
+
expect(() => registry.add(createMockTool({ name: '' }))).toThrow('Tool name must be between 1 and 64 characters');
|
|
53
|
+
});
|
|
54
|
+
it('throws ToolValidationError for a non-string tool name', () => {
|
|
55
|
+
// @ts-expect-error - Testing invalid type for name
|
|
56
|
+
expect(() => registry.add(createMockTool({ name: 123 }))).toThrow(ToolValidationError);
|
|
57
|
+
// @ts-expect-error - Testing invalid type for name
|
|
58
|
+
expect(() => registry.add(createMockTool({ name: 123 }))).toThrow('Tool name must be a string');
|
|
59
|
+
});
|
|
60
|
+
it('throws ToolValidationError for an invalid description', () => {
|
|
61
|
+
// @ts-expect-error - Testing invalid type for description
|
|
62
|
+
expect(() => registry.add(createMockTool({ description: 123 }))).toThrow(ToolValidationError);
|
|
63
|
+
// @ts-expect-error - Testing invalid type for description
|
|
64
|
+
expect(() => registry.add(createMockTool({ description: 123 }))).toThrow('Tool description must be a non-empty string');
|
|
65
|
+
});
|
|
66
|
+
it('throws ToolValidationError for an empty string description', () => {
|
|
67
|
+
expect(() => registry.add(createMockTool({ description: '' }))).toThrow(ToolValidationError);
|
|
68
|
+
expect(() => registry.add(createMockTool({ description: '' }))).toThrow('Tool description must be a non-empty string');
|
|
69
|
+
});
|
|
70
|
+
it('allows a tool with a null or undefined description', () => {
|
|
71
|
+
const tool1 = createMockTool({ name: 'tool-1' });
|
|
72
|
+
// @ts-expect-error - Testing explicit undefined description
|
|
73
|
+
tool1.description = undefined;
|
|
74
|
+
const tool2 = createMockTool({ name: 'tool-2' });
|
|
75
|
+
// @ts-expect-error - Testing explicit null description
|
|
76
|
+
tool2.description = null;
|
|
77
|
+
registry.add([tool1, tool2]);
|
|
78
|
+
expect(registry.list()).toHaveLength(2);
|
|
79
|
+
});
|
|
80
|
+
it('registers a tool with a name at the maximum length', () => {
|
|
81
|
+
const tool = createMockTool({ name: 'a'.repeat(64) });
|
|
82
|
+
expect(() => registry.add(tool)).not.toThrow();
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
describe('get', () => {
|
|
86
|
+
it('retrieves a tool by name', () => {
|
|
87
|
+
const tool = createMockTool({ name: 'find-me' });
|
|
88
|
+
registry.add(tool);
|
|
89
|
+
expect(registry.get('find-me')).toBe(tool);
|
|
90
|
+
});
|
|
91
|
+
it('returns undefined for a non-existent tool', () => {
|
|
92
|
+
expect(registry.get('non-existent')).toBeUndefined();
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
describe('remove', () => {
|
|
96
|
+
it('removes a tool by name', () => {
|
|
97
|
+
registry.add(createMockTool({ name: 'remove-me' }));
|
|
98
|
+
registry.remove('remove-me');
|
|
99
|
+
expect(registry.get('remove-me')).toBeUndefined();
|
|
100
|
+
});
|
|
101
|
+
it('does not throw when removing a non-existent tool', () => {
|
|
102
|
+
expect(() => registry.remove('non-existent')).not.toThrow();
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
describe('list', () => {
|
|
106
|
+
it('returns an empty array when no tools are registered', () => {
|
|
107
|
+
expect(registry.list()).toStrictEqual([]);
|
|
108
|
+
});
|
|
109
|
+
it('returns all registered tools', () => {
|
|
110
|
+
const tool1 = createMockTool({ name: 'tool-1' });
|
|
111
|
+
const tool2 = createMockTool({ name: 'tool-2' });
|
|
112
|
+
registry.add([tool1, tool2]);
|
|
113
|
+
expect(registry.list()).toStrictEqual([tool1, tool2]);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
describe('constructor', () => {
|
|
117
|
+
it('accepts initial tools', () => {
|
|
118
|
+
const tool = createMockTool();
|
|
119
|
+
const reg = new ToolRegistry([tool]);
|
|
120
|
+
expect(reg.list()).toStrictEqual([tool]);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
//# sourceMappingURL=tool-registry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-registry.test.js","sourceRoot":"","sources":["../../../../src/registry/__tests__/tool-registry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,35 +1,47 @@
|
|
|
1
|
-
import { Registry } from './registry.js';
|
|
2
1
|
import type { Tool } from '../tools/tool.js';
|
|
3
2
|
/**
|
|
4
|
-
*
|
|
5
|
-
* It adds validation for tool properties and ensures unique tool names.
|
|
3
|
+
* Registry for managing Tool instances with name-based CRUDL operations.
|
|
6
4
|
*/
|
|
7
|
-
export declare class ToolRegistry
|
|
5
|
+
export declare class ToolRegistry {
|
|
6
|
+
private _tools;
|
|
8
7
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* @
|
|
8
|
+
* Creates a new ToolRegistry, optionally pre-populated with tools.
|
|
9
|
+
*
|
|
10
|
+
* @param tools - Optional initial tools to register
|
|
11
|
+
*/
|
|
12
|
+
constructor(tools?: Tool[]);
|
|
13
|
+
/**
|
|
14
|
+
* Registers one or more tools.
|
|
15
|
+
*
|
|
16
|
+
* @param tool - A single tool or array of tools to register
|
|
17
|
+
* @throws ToolValidationError If a tool's properties are invalid or its name is already registered
|
|
12
18
|
*/
|
|
13
|
-
|
|
19
|
+
add(tool: Tool | Tool[]): void;
|
|
14
20
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* @param
|
|
18
|
-
* @
|
|
21
|
+
* Retrieves a tool by name.
|
|
22
|
+
*
|
|
23
|
+
* @param name - The name of the tool to retrieve
|
|
24
|
+
* @returns The tool if found, otherwise undefined
|
|
25
|
+
*/
|
|
26
|
+
get(name: string): Tool | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* Removes a tool by name. No-op if the tool does not exist.
|
|
29
|
+
*
|
|
30
|
+
* @param name - The name of the tool to remove
|
|
19
31
|
*/
|
|
20
|
-
|
|
32
|
+
remove(name: string): void;
|
|
21
33
|
/**
|
|
22
|
-
*
|
|
34
|
+
* Returns all registered tools.
|
|
23
35
|
*
|
|
24
|
-
* @
|
|
25
|
-
* @returns The tool if found, otherwise undefined.
|
|
36
|
+
* @returns Array of all registered tools
|
|
26
37
|
*/
|
|
27
|
-
|
|
38
|
+
list(): Tool[];
|
|
28
39
|
/**
|
|
29
|
-
*
|
|
40
|
+
* Validates a tool before registration.
|
|
30
41
|
*
|
|
31
|
-
* @param
|
|
42
|
+
* @param tool - The tool to validate
|
|
43
|
+
* @throws ToolValidationError If the tool's properties are invalid or its name is already registered
|
|
32
44
|
*/
|
|
33
|
-
|
|
45
|
+
private _validate;
|
|
34
46
|
}
|
|
35
47
|
//# sourceMappingURL=tool-registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-registry.d.ts","sourceRoot":"","sources":["../../../src/registry/tool-registry.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"tool-registry.d.ts","sourceRoot":"","sources":["../../../src/registry/tool-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAG5C;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAA+B;IAE7C;;;;OAIG;gBACS,KAAK,CAAC,EAAE,IAAI,EAAE;IAM1B;;;;;OAKG;IACH,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI;IAQ9B;;;;;OAKG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAInC;;;;OAIG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI1B;;;;OAIG;IACH,IAAI,IAAI,IAAI,EAAE;IAId;;;;;OAKG;IACH,OAAO,CAAC,SAAS;CAwBlB"}
|