@strands-agents/sdk 0.6.0 → 0.7.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/README.md +64 -0
- package/dist/src/__fixtures__/agent-helpers.d.ts +37 -4
- package/dist/src/__fixtures__/agent-helpers.d.ts.map +1 -1
- package/dist/src/__fixtures__/agent-helpers.js +31 -4
- package/dist/src/__fixtures__/agent-helpers.js.map +1 -1
- package/dist/src/__fixtures__/metrics-helpers.d.ts +30 -0
- package/dist/src/__fixtures__/metrics-helpers.d.ts.map +1 -1
- package/dist/src/__fixtures__/metrics-helpers.js +29 -6
- package/dist/src/__fixtures__/metrics-helpers.js.map +1 -1
- package/dist/src/__fixtures__/mock-message-model.d.ts +8 -4
- package/dist/src/__fixtures__/mock-message-model.d.ts.map +1 -1
- package/dist/src/__fixtures__/mock-message-model.js +13 -7
- package/dist/src/__fixtures__/mock-message-model.js.map +1 -1
- package/dist/src/__fixtures__/mock-meter.d.ts +32 -0
- package/dist/src/__fixtures__/mock-meter.d.ts.map +1 -0
- package/dist/src/__fixtures__/mock-meter.js +47 -0
- package/dist/src/__fixtures__/mock-meter.js.map +1 -0
- package/dist/src/__fixtures__/mock-plugin.d.ts +13 -0
- package/dist/src/__fixtures__/mock-plugin.d.ts.map +1 -0
- package/dist/src/__fixtures__/{mock-hook-provider.js → mock-plugin.js} +8 -5
- package/dist/src/__fixtures__/mock-plugin.js.map +1 -0
- package/dist/src/__fixtures__/tool-helpers.d.ts.map +1 -1
- package/dist/src/__fixtures__/tool-helpers.js +5 -2
- package/dist/src/__fixtures__/tool-helpers.js.map +1 -1
- package/dist/src/__tests__/index.test.js +21 -0
- package/dist/src/__tests__/index.test.js.map +1 -1
- package/dist/src/__tests__/mcp.test.js.map +1 -1
- package/dist/src/__tests__/mime.test.d.ts +2 -0
- package/dist/src/__tests__/mime.test.d.ts.map +1 -0
- package/dist/src/__tests__/mime.test.js +83 -0
- package/dist/src/__tests__/mime.test.js.map +1 -0
- package/dist/src/__tests__/state-store.test.d.ts +2 -0
- package/dist/src/__tests__/state-store.test.d.ts.map +1 -0
- package/dist/src/__tests__/{app-state.test.js → state-store.test.js} +86 -51
- package/dist/src/__tests__/state-store.test.js.map +1 -0
- package/dist/src/a2a/__tests__/a2a-agent.test.d.ts +2 -0
- package/dist/src/a2a/__tests__/a2a-agent.test.d.ts.map +1 -0
- package/dist/src/a2a/__tests__/a2a-agent.test.js +364 -0
- package/dist/src/a2a/__tests__/a2a-agent.test.js.map +1 -0
- package/dist/src/a2a/__tests__/adapters.test.d.ts +2 -0
- package/dist/src/a2a/__tests__/adapters.test.d.ts.map +1 -0
- package/dist/src/a2a/__tests__/adapters.test.js +151 -0
- package/dist/src/a2a/__tests__/adapters.test.js.map +1 -0
- package/dist/src/a2a/__tests__/executor.test.d.ts +2 -0
- package/dist/src/a2a/__tests__/executor.test.d.ts.map +1 -0
- package/dist/src/a2a/__tests__/executor.test.js +196 -0
- package/dist/src/a2a/__tests__/executor.test.js.map +1 -0
- package/dist/src/a2a/__tests__/server.test.d.ts +2 -0
- package/dist/src/a2a/__tests__/server.test.d.ts.map +1 -0
- package/dist/src/a2a/__tests__/server.test.js +51 -0
- package/dist/src/a2a/__tests__/server.test.js.map +1 -0
- package/dist/src/a2a/__tests__/server.test.node.d.ts +2 -0
- package/dist/src/a2a/__tests__/server.test.node.d.ts.map +1 -0
- package/dist/src/a2a/__tests__/server.test.node.js +110 -0
- package/dist/src/a2a/__tests__/server.test.node.js.map +1 -0
- package/dist/src/a2a/a2a-agent.d.ts +132 -0
- package/dist/src/a2a/a2a-agent.d.ts.map +1 -0
- package/dist/src/a2a/a2a-agent.js +255 -0
- package/dist/src/a2a/a2a-agent.js.map +1 -0
- package/dist/src/a2a/adapters.d.ts +27 -0
- package/dist/src/a2a/adapters.d.ts.map +1 -0
- package/dist/src/a2a/adapters.js +175 -0
- package/dist/src/a2a/adapters.js.map +1 -0
- package/dist/src/a2a/events.d.ts +42 -0
- package/dist/src/a2a/events.d.ts.map +1 -0
- package/dist/src/a2a/events.js +35 -0
- package/dist/src/a2a/events.js.map +1 -0
- package/dist/src/a2a/executor.d.ts +57 -0
- package/dist/src/a2a/executor.d.ts.map +1 -0
- package/dist/src/a2a/executor.js +130 -0
- package/dist/src/a2a/executor.js.map +1 -0
- package/dist/src/a2a/express-server.d.ts +67 -0
- package/dist/src/a2a/express-server.d.ts.map +1 -0
- package/dist/src/a2a/express-server.js +95 -0
- package/dist/src/a2a/express-server.js.map +1 -0
- package/dist/src/a2a/index.d.ts +16 -0
- package/dist/src/a2a/index.d.ts.map +1 -0
- package/dist/src/a2a/index.js +16 -0
- package/dist/src/a2a/index.js.map +1 -0
- package/dist/src/a2a/logging.d.ts +8 -0
- package/dist/src/a2a/logging.d.ts.map +1 -0
- package/dist/src/a2a/logging.js +15 -0
- package/dist/src/a2a/logging.js.map +1 -0
- package/dist/src/a2a/server.d.ts +67 -0
- package/dist/src/a2a/server.d.ts.map +1 -0
- package/dist/src/a2a/server.js +67 -0
- package/dist/src/a2a/server.js.map +1 -0
- package/dist/src/agent/__tests__/agent.hook.test.js +87 -51
- package/dist/src/agent/__tests__/agent.hook.test.js.map +1 -1
- package/dist/src/agent/__tests__/agent.test.js +87 -10
- package/dist/src/agent/__tests__/agent.test.js.map +1 -1
- package/dist/src/agent/__tests__/agent.tracer.test.js +10 -10
- package/dist/src/agent/__tests__/agent.tracer.test.js.map +1 -1
- package/dist/src/agent/__tests__/snapshot.test.js +11 -11
- package/dist/src/agent/__tests__/snapshot.test.js.map +1 -1
- package/dist/src/agent/agent.d.ts +39 -43
- package/dist/src/agent/agent.d.ts.map +1 -1
- package/dist/src/agent/agent.js +66 -40
- package/dist/src/agent/agent.js.map +1 -1
- package/dist/src/agent/snapshot.d.ts.map +1 -1
- package/dist/src/agent/snapshot.js +3 -2
- package/dist/src/agent/snapshot.js.map +1 -1
- package/dist/src/conversation-manager/__tests__/conversation-manager.test.d.ts +2 -0
- package/dist/src/conversation-manager/__tests__/conversation-manager.test.d.ts.map +1 -0
- package/dist/src/conversation-manager/__tests__/conversation-manager.test.js +100 -0
- package/dist/src/conversation-manager/__tests__/conversation-manager.test.js.map +1 -0
- package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js +26 -10
- package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js.map +1 -1
- package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js +84 -21
- package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js.map +1 -1
- package/dist/src/conversation-manager/conversation-manager.d.ts +87 -0
- package/dist/src/conversation-manager/conversation-manager.d.ts.map +1 -0
- package/dist/src/conversation-manager/conversation-manager.js +59 -0
- package/dist/src/conversation-manager/conversation-manager.js.map +1 -0
- package/dist/src/conversation-manager/index.d.ts +1 -0
- package/dist/src/conversation-manager/index.d.ts.map +1 -1
- package/dist/src/conversation-manager/index.js +1 -0
- package/dist/src/conversation-manager/index.js.map +1 -1
- package/dist/src/conversation-manager/null-conversation-manager.d.ts +12 -8
- package/dist/src/conversation-manager/null-conversation-manager.d.ts.map +1 -1
- package/dist/src/conversation-manager/null-conversation-manager.js +13 -7
- package/dist/src/conversation-manager/null-conversation-manager.js.map +1 -1
- package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts +28 -19
- package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts.map +1 -1
- package/dist/src/conversation-manager/sliding-window-conversation-manager.js +44 -36
- package/dist/src/conversation-manager/sliding-window-conversation-manager.js.map +1 -1
- package/dist/src/hooks/__tests__/registry.test.js +10 -154
- package/dist/src/hooks/__tests__/registry.test.js.map +1 -1
- package/dist/src/hooks/events.d.ts +44 -44
- package/dist/src/hooks/events.d.ts.map +1 -1
- package/dist/src/hooks/events.js +11 -11
- package/dist/src/hooks/events.js.map +1 -1
- package/dist/src/hooks/index.d.ts +3 -3
- package/dist/src/hooks/index.d.ts.map +1 -1
- package/dist/src/hooks/index.js +2 -2
- package/dist/src/hooks/registry.d.ts +1 -32
- package/dist/src/hooks/registry.d.ts.map +1 -1
- package/dist/src/hooks/registry.js +1 -47
- package/dist/src/hooks/registry.js.map +1 -1
- package/dist/src/hooks/types.d.ts +0 -31
- package/dist/src/hooks/types.d.ts.map +1 -1
- package/dist/src/index.d.ts +12 -12
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +8 -8
- package/dist/src/index.js.map +1 -1
- package/dist/src/mime.d.ts +24 -0
- package/dist/src/mime.d.ts.map +1 -0
- package/dist/src/mime.js +82 -0
- package/dist/src/mime.js.map +1 -0
- package/dist/src/models/__tests__/anthropic.test.js +78 -1
- package/dist/src/models/__tests__/anthropic.test.js.map +1 -1
- package/dist/src/models/__tests__/bedrock.test.js +1844 -613
- package/dist/src/models/__tests__/bedrock.test.js.map +1 -1
- package/dist/src/models/__tests__/gemini.test.js +100 -1
- package/dist/src/models/__tests__/gemini.test.js.map +1 -1
- package/dist/src/models/__tests__/model.test.js +25 -0
- package/dist/src/models/__tests__/model.test.js.map +1 -1
- package/dist/src/models/__tests__/openai.test.js +184 -32
- package/dist/src/models/__tests__/openai.test.js.map +1 -1
- package/dist/src/models/anthropic.d.ts.map +1 -1
- package/dist/src/models/anthropic.js +6 -7
- package/dist/src/models/anthropic.js.map +1 -1
- package/dist/src/models/bedrock.d.ts +64 -10
- package/dist/src/models/bedrock.d.ts.map +1 -1
- package/dist/src/models/bedrock.js +202 -23
- package/dist/src/models/bedrock.js.map +1 -1
- package/dist/src/models/gemini/adapters.d.ts.map +1 -1
- package/dist/src/models/gemini/adapters.js +65 -14
- package/dist/src/models/gemini/adapters.js.map +1 -1
- package/dist/src/models/model.d.ts +12 -0
- package/dist/src/models/model.d.ts.map +1 -1
- package/dist/src/models/model.js +5 -9
- package/dist/src/models/model.js.map +1 -1
- package/dist/src/models/openai.d.ts +15 -0
- package/dist/src/models/openai.d.ts.map +1 -1
- package/dist/src/models/openai.js +108 -64
- package/dist/src/models/openai.js.map +1 -1
- package/dist/src/models/streaming.d.ts +5 -0
- package/dist/src/models/streaming.d.ts.map +1 -1
- package/dist/src/multiagent/__tests__/events.test.js +24 -7
- package/dist/src/multiagent/__tests__/events.test.js.map +1 -1
- package/dist/src/multiagent/__tests__/graph.test.js +28 -13
- package/dist/src/multiagent/__tests__/graph.test.js.map +1 -1
- package/dist/src/multiagent/__tests__/nodes.test.js +28 -10
- package/dist/src/multiagent/__tests__/nodes.test.js.map +1 -1
- package/dist/src/multiagent/__tests__/swarm.test.js +33 -10
- package/dist/src/multiagent/__tests__/swarm.test.js.map +1 -1
- package/dist/src/multiagent/events.d.ts +48 -14
- package/dist/src/multiagent/events.d.ts.map +1 -1
- package/dist/src/multiagent/events.js +11 -3
- package/dist/src/multiagent/events.js.map +1 -1
- package/dist/src/multiagent/graph.d.ts +21 -11
- package/dist/src/multiagent/graph.d.ts.map +1 -1
- package/dist/src/multiagent/graph.js +35 -29
- package/dist/src/multiagent/graph.js.map +1 -1
- package/dist/src/multiagent/index.d.ts +3 -2
- package/dist/src/multiagent/index.d.ts.map +1 -1
- package/dist/src/multiagent/index.js.map +1 -1
- package/dist/src/multiagent/multiagent.d.ts +41 -0
- package/dist/src/multiagent/multiagent.d.ts.map +1 -0
- package/dist/src/multiagent/multiagent.js +2 -0
- package/dist/src/multiagent/multiagent.js.map +1 -0
- package/dist/src/multiagent/nodes.d.ts +18 -21
- package/dist/src/multiagent/nodes.d.ts.map +1 -1
- package/dist/src/multiagent/nodes.js +27 -11
- package/dist/src/multiagent/nodes.js.map +1 -1
- package/dist/src/multiagent/plugins.d.ts +70 -0
- package/dist/src/multiagent/plugins.d.ts.map +1 -0
- package/dist/src/multiagent/plugins.js +70 -0
- package/dist/src/multiagent/plugins.js.map +1 -0
- package/dist/src/multiagent/state.d.ts +2 -2
- package/dist/src/multiagent/state.d.ts.map +1 -1
- package/dist/src/multiagent/state.js +2 -2
- package/dist/src/multiagent/state.js.map +1 -1
- package/dist/src/multiagent/swarm.d.ts +26 -16
- package/dist/src/multiagent/swarm.d.ts.map +1 -1
- package/dist/src/multiagent/swarm.js +31 -13
- package/dist/src/multiagent/swarm.js.map +1 -1
- package/dist/src/plugins/__tests__/plugin.test.d.ts +2 -0
- package/dist/src/plugins/__tests__/plugin.test.d.ts.map +1 -0
- package/dist/src/plugins/__tests__/plugin.test.js +114 -0
- package/dist/src/plugins/__tests__/plugin.test.js.map +1 -0
- package/dist/src/plugins/__tests__/registry.test.d.ts +2 -0
- package/dist/src/plugins/__tests__/registry.test.d.ts.map +1 -0
- package/dist/src/plugins/__tests__/registry.test.js +147 -0
- package/dist/src/plugins/__tests__/registry.test.js.map +1 -0
- package/dist/src/plugins/index.d.ts +30 -0
- package/dist/src/plugins/index.d.ts.map +1 -0
- package/dist/src/plugins/index.js +30 -0
- package/dist/src/plugins/index.js.map +1 -0
- package/dist/src/plugins/plugin.d.ts +74 -0
- package/dist/src/plugins/plugin.d.ts.map +1 -0
- package/dist/src/plugins/plugin.js +8 -0
- package/dist/src/plugins/plugin.js.map +1 -0
- package/dist/src/plugins/registry.d.ts +25 -0
- package/dist/src/plugins/registry.d.ts.map +1 -0
- package/dist/src/plugins/registry.js +41 -0
- package/dist/src/plugins/registry.js.map +1 -0
- package/dist/src/session/__tests__/session-manager.test.js +74 -92
- package/dist/src/session/__tests__/session-manager.test.js.map +1 -1
- package/dist/src/session/index.d.ts +0 -1
- package/dist/src/session/index.d.ts.map +1 -1
- package/dist/src/session/index.js +0 -1
- package/dist/src/session/index.js.map +1 -1
- package/dist/src/session/session-manager.d.ts +9 -5
- package/dist/src/session/session-manager.d.ts.map +1 -1
- package/dist/src/session/session-manager.js +14 -8
- package/dist/src/session/session-manager.js.map +1 -1
- package/dist/src/session/storage.d.ts +1 -1
- package/dist/src/session/storage.d.ts.map +1 -1
- package/dist/src/session/types.d.ts +2 -2
- package/dist/src/session/types.d.ts.map +1 -1
- package/dist/src/{app-state.d.ts → state-store.d.ts} +11 -11
- package/dist/src/state-store.d.ts.map +1 -0
- package/dist/src/{app-state.js → state-store.js} +8 -7
- package/dist/src/state-store.js.map +1 -0
- package/dist/src/telemetry/__tests__/config.test.js +24 -0
- package/dist/src/telemetry/__tests__/config.test.js.map +1 -1
- package/dist/src/telemetry/__tests__/config.test.node.js +56 -0
- package/dist/src/telemetry/__tests__/config.test.node.js.map +1 -1
- package/dist/src/telemetry/__tests__/meter.test.js +176 -9
- package/dist/src/telemetry/__tests__/meter.test.js.map +1 -1
- package/dist/src/telemetry/__tests__/tracer.test.node.js +123 -2
- package/dist/src/telemetry/__tests__/tracer.test.node.js.map +1 -1
- package/dist/src/telemetry/config.d.ts +72 -12
- package/dist/src/telemetry/config.d.ts.map +1 -1
- package/dist/src/telemetry/config.js +101 -24
- package/dist/src/telemetry/config.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +10 -7
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +9 -6
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/meter.d.ts +23 -4
- package/dist/src/telemetry/meter.d.ts.map +1 -1
- package/dist/src/telemetry/meter.js +78 -5
- package/dist/src/telemetry/meter.js.map +1 -1
- package/dist/src/telemetry/tracer.d.ts +27 -0
- package/dist/src/telemetry/tracer.d.ts.map +1 -1
- package/dist/src/telemetry/tracer.js +80 -5
- package/dist/src/telemetry/tracer.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +2 -0
- package/dist/src/telemetry/types.d.ts.map +1 -1
- package/dist/src/telemetry/utils.d.ts +10 -0
- package/dist/src/telemetry/utils.d.ts.map +1 -0
- package/dist/src/telemetry/utils.js +13 -0
- package/dist/src/telemetry/utils.js.map +1 -0
- package/dist/src/tools/__tests__/tool.test.js +22 -1
- package/dist/src/tools/__tests__/tool.test.js.map +1 -1
- package/dist/src/tools/function-tool.d.ts +11 -1
- package/dist/src/tools/function-tool.d.ts.map +1 -1
- package/dist/src/tools/function-tool.js +64 -3
- package/dist/src/tools/function-tool.js.map +1 -1
- package/dist/src/tools/tool.d.ts +2 -2
- package/dist/src/tools/tool.d.ts.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/src/types/__tests__/media.test.js +22 -16
- package/dist/src/types/__tests__/media.test.js.map +1 -1
- package/dist/src/types/agent.d.ts +75 -7
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/agent.js.map +1 -1
- package/dist/src/types/media.d.ts +27 -30
- package/dist/src/types/media.d.ts.map +1 -1
- package/dist/src/types/media.js +15 -56
- package/dist/src/types/media.js.map +1 -1
- package/dist/src/types/messages.d.ts +18 -4
- package/dist/src/types/messages.d.ts.map +1 -1
- package/dist/src/types/messages.js +22 -26
- package/dist/src/types/messages.js.map +1 -1
- package/dist/src/types/serializable.d.ts +34 -4
- package/dist/src/types/serializable.d.ts.map +1 -1
- package/dist/src/types/serializable.js +31 -2
- package/dist/src/types/serializable.js.map +1 -1
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.js +5 -4
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.js.map +1 -1
- package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.d.ts.map +1 -0
- package/dist/src/vended-tools/{file_editor → file-editor}/__tests__/file-editor.test.node.js +11 -4
- package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js.map +1 -0
- package/dist/src/vended-tools/{file_editor → file-editor}/file-editor.d.ts +1 -1
- package/dist/src/vended-tools/{file_editor → file-editor}/file-editor.d.ts.map +1 -1
- package/dist/src/vended-tools/{file_editor → file-editor}/file-editor.js +2 -2
- package/dist/src/vended-tools/{file_editor → file-editor}/file-editor.js.map +1 -1
- package/dist/src/vended-tools/{file_editor → file-editor}/index.d.ts.map +1 -1
- package/dist/src/vended-tools/file-editor/index.js.map +1 -0
- package/dist/src/vended-tools/{file_editor → file-editor}/types.d.ts.map +1 -1
- package/dist/src/vended-tools/file-editor/types.js.map +1 -0
- package/dist/src/vended-tools/http-request/__tests__/http-request.test.d.ts.map +1 -0
- package/dist/src/vended-tools/{http_request → http-request}/__tests__/http-request.test.js.map +1 -1
- package/dist/src/vended-tools/{http_request → http-request}/http-request.d.ts.map +1 -1
- package/dist/src/vended-tools/{http_request → http-request}/http-request.js.map +1 -1
- package/dist/src/vended-tools/{http_request → http-request}/index.d.ts.map +1 -1
- package/dist/src/vended-tools/http-request/index.js.map +1 -0
- package/dist/src/vended-tools/{http_request → http-request}/types.d.ts.map +1 -1
- package/dist/src/vended-tools/http-request/types.js.map +1 -0
- package/dist/src/vended-tools/notebook/__tests__/notebook.test.js +5 -4
- package/dist/src/vended-tools/notebook/__tests__/notebook.test.js.map +1 -1
- package/dist/src/vended-tools/notebook/notebook.js +2 -2
- package/dist/src/vended-tools/notebook/notebook.js.map +1 -1
- package/package.json +52 -10
- package/dist/src/__fixtures__/mock-hook-provider.d.ts +0 -10
- package/dist/src/__fixtures__/mock-hook-provider.d.ts.map +0 -1
- package/dist/src/__fixtures__/mock-hook-provider.js.map +0 -1
- package/dist/src/__tests__/app-state.test.d.ts +0 -2
- package/dist/src/__tests__/app-state.test.d.ts.map +0 -1
- package/dist/src/__tests__/app-state.test.js.map +0 -1
- package/dist/src/app-state.d.ts.map +0 -1
- package/dist/src/app-state.js.map +0 -1
- package/dist/src/multiagent/base.d.ts +0 -25
- package/dist/src/multiagent/base.d.ts.map +0 -1
- package/dist/src/multiagent/base.js +0 -2
- package/dist/src/multiagent/base.js.map +0 -1
- package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.node.d.ts.map +0 -1
- package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.node.js.map +0 -1
- package/dist/src/vended-tools/file_editor/index.js.map +0 -1
- package/dist/src/vended-tools/file_editor/types.js.map +0 -1
- package/dist/src/vended-tools/http_request/__tests__/http-request.test.d.ts.map +0 -1
- package/dist/src/vended-tools/http_request/index.js.map +0 -1
- package/dist/src/vended-tools/http_request/types.js.map +0 -1
- /package/dist/src/vended-tools/{file_editor → file-editor}/__tests__/file-editor.test.node.d.ts +0 -0
- /package/dist/src/vended-tools/{file_editor → file-editor}/index.d.ts +0 -0
- /package/dist/src/vended-tools/{file_editor → file-editor}/index.js +0 -0
- /package/dist/src/vended-tools/{file_editor → file-editor}/types.d.ts +0 -0
- /package/dist/src/vended-tools/{file_editor → file-editor}/types.js +0 -0
- /package/dist/src/vended-tools/{http_request → http-request}/__tests__/http-request.test.d.ts +0 -0
- /package/dist/src/vended-tools/{http_request → http-request}/__tests__/http-request.test.js +0 -0
- /package/dist/src/vended-tools/{http_request → http-request}/http-request.d.ts +0 -0
- /package/dist/src/vended-tools/{http_request → http-request}/http-request.js +0 -0
- /package/dist/src/vended-tools/{http_request → http-request}/index.d.ts +0 -0
- /package/dist/src/vended-tools/{http_request → http-request}/index.js +0 -0
- /package/dist/src/vended-tools/{http_request → http-request}/types.d.ts +0 -0
- /package/dist/src/vended-tools/{http_request → http-request}/types.js +0 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { A2AExecutor } from '../executor.js';
|
|
3
|
+
import { Agent } from '../../agent/agent.js';
|
|
4
|
+
import { MockMessageModel } from '../../__fixtures__/mock-message-model.js';
|
|
5
|
+
import { createMockAgent } from '../../__fixtures__/agent-helpers.js';
|
|
6
|
+
import { TextBlock } from '../../types/messages.js';
|
|
7
|
+
import { ImageBlock, encodeBase64 } from '../../types/media.js';
|
|
8
|
+
import { ContentBlockEvent, ModelStreamUpdateEvent } from '../../hooks/events.js';
|
|
9
|
+
import { AgentResult } from '../../types/agent.js';
|
|
10
|
+
import { Message } from '../../types/messages.js';
|
|
11
|
+
function createMockEventBus() {
|
|
12
|
+
const events = [];
|
|
13
|
+
return {
|
|
14
|
+
events,
|
|
15
|
+
publish: vi.fn((event) => {
|
|
16
|
+
events.push(event);
|
|
17
|
+
}),
|
|
18
|
+
on: vi.fn().mockReturnThis(),
|
|
19
|
+
off: vi.fn().mockReturnThis(),
|
|
20
|
+
once: vi.fn().mockReturnThis(),
|
|
21
|
+
removeAllListeners: vi.fn().mockReturnThis(),
|
|
22
|
+
finished: vi.fn(),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function createRequestContext(text, taskId = 'task-1') {
|
|
26
|
+
return {
|
|
27
|
+
taskId,
|
|
28
|
+
contextId: 'ctx-1',
|
|
29
|
+
userMessage: {
|
|
30
|
+
kind: 'message',
|
|
31
|
+
messageId: 'msg-1',
|
|
32
|
+
role: 'user',
|
|
33
|
+
parts: [{ kind: 'text', text }],
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
describe('A2AExecutor', () => {
|
|
38
|
+
describe('execute', () => {
|
|
39
|
+
it('streams text deltas as artifact chunks and publishes completed status', async () => {
|
|
40
|
+
const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Agent response' });
|
|
41
|
+
const agent = new Agent({ model, printer: false });
|
|
42
|
+
const executor = new A2AExecutor(agent);
|
|
43
|
+
const eventBus = createMockEventBus();
|
|
44
|
+
await executor.execute(createRequestContext('Hello agent'), eventBus);
|
|
45
|
+
// First event registers the task with the ResultManager
|
|
46
|
+
expect(eventBus.events[0]).toStrictEqual({
|
|
47
|
+
kind: 'task',
|
|
48
|
+
id: 'task-1',
|
|
49
|
+
contextId: 'ctx-1',
|
|
50
|
+
status: { state: 'working' },
|
|
51
|
+
});
|
|
52
|
+
const artifactEvents = eventBus.events.filter((e) => e.kind === 'artifact-update');
|
|
53
|
+
const statusEvents = eventBus.events.filter((e) => e.kind === 'status-update');
|
|
54
|
+
// Should have at least 2 artifact events (text delta + lastChunk)
|
|
55
|
+
expect(artifactEvents.length).toBeGreaterThanOrEqual(2);
|
|
56
|
+
// First artifact: text delta, creates new artifact
|
|
57
|
+
expect(artifactEvents[0]).toStrictEqual({
|
|
58
|
+
kind: 'artifact-update',
|
|
59
|
+
taskId: 'task-1',
|
|
60
|
+
contextId: 'ctx-1',
|
|
61
|
+
append: false,
|
|
62
|
+
artifact: { artifactId: expect.any(String), parts: [{ kind: 'text', text: 'Agent response' }] },
|
|
63
|
+
});
|
|
64
|
+
// Last artifact: lastChunk marker, appends to existing artifact
|
|
65
|
+
expect(artifactEvents[artifactEvents.length - 1]).toStrictEqual(expect.objectContaining({ append: true, lastChunk: true }));
|
|
66
|
+
// All artifact events share the same artifactId
|
|
67
|
+
const artifactId = artifactEvents[0].artifact.artifactId;
|
|
68
|
+
for (const event of artifactEvents) {
|
|
69
|
+
expect(event.artifact.artifactId).toBe(artifactId);
|
|
70
|
+
}
|
|
71
|
+
// Only completed status — no working status (A2A-compliant streaming)
|
|
72
|
+
expect(statusEvents).toStrictEqual([
|
|
73
|
+
{ kind: 'status-update', taskId: 'task-1', contextId: 'ctx-1', status: { state: 'completed' }, final: true },
|
|
74
|
+
]);
|
|
75
|
+
});
|
|
76
|
+
it('sets append to true for subsequent chunks after the first', async () => {
|
|
77
|
+
const model = new MockMessageModel().addTurn([
|
|
78
|
+
{ type: 'textBlock', text: 'First' },
|
|
79
|
+
{ type: 'textBlock', text: 'Second' },
|
|
80
|
+
]);
|
|
81
|
+
const agent = new Agent({ model, printer: false });
|
|
82
|
+
const executor = new A2AExecutor(agent);
|
|
83
|
+
const eventBus = createMockEventBus();
|
|
84
|
+
await executor.execute(createRequestContext('Hello'), eventBus);
|
|
85
|
+
const artifactEvents = eventBus.events.filter((e) => e.kind === 'artifact-update');
|
|
86
|
+
// 2 text deltas + 1 lastChunk
|
|
87
|
+
expect(artifactEvents).toHaveLength(3);
|
|
88
|
+
expect(artifactEvents.map((e) => e.append)).toStrictEqual([false, true, true]);
|
|
89
|
+
expect(artifactEvents[2].lastChunk).toBe(true);
|
|
90
|
+
});
|
|
91
|
+
it('converts A2A parts to content blocks and passes to stream', async () => {
|
|
92
|
+
const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Response' });
|
|
93
|
+
const agent = new Agent({ model, printer: false });
|
|
94
|
+
vi.spyOn(agent, 'stream');
|
|
95
|
+
const executor = new A2AExecutor(agent);
|
|
96
|
+
const eventBus = createMockEventBus();
|
|
97
|
+
const context = {
|
|
98
|
+
taskId: 'task-1',
|
|
99
|
+
contextId: 'ctx-1',
|
|
100
|
+
userMessage: {
|
|
101
|
+
kind: 'message',
|
|
102
|
+
messageId: 'msg-1',
|
|
103
|
+
role: 'user',
|
|
104
|
+
parts: [
|
|
105
|
+
{ kind: 'text', text: 'Line 1' },
|
|
106
|
+
{ kind: 'file', file: { uri: 'file://test.txt' } },
|
|
107
|
+
{ kind: 'text', text: 'Line 2' },
|
|
108
|
+
],
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
await executor.execute(context, eventBus);
|
|
112
|
+
expect(agent.stream).toHaveBeenCalledWith([
|
|
113
|
+
new TextBlock('Line 1'),
|
|
114
|
+
new TextBlock('[File: file (file://test.txt)]'),
|
|
115
|
+
new TextBlock('Line 2'),
|
|
116
|
+
]);
|
|
117
|
+
});
|
|
118
|
+
it('re-throws when agent throws, publishing only the initial task event', async () => {
|
|
119
|
+
const model = new MockMessageModel().addTurn(new Error('Agent failed'));
|
|
120
|
+
const agent = new Agent({ model, printer: false });
|
|
121
|
+
const executor = new A2AExecutor(agent);
|
|
122
|
+
const eventBus = createMockEventBus();
|
|
123
|
+
await expect(executor.execute(createRequestContext('Hello'), eventBus)).rejects.toThrow('Agent failed');
|
|
124
|
+
// Only the initial task registration event is published before the error
|
|
125
|
+
expect(eventBus.events).toStrictEqual([
|
|
126
|
+
{ kind: 'task', id: 'task-1', contextId: 'ctx-1', status: { state: 'working' } },
|
|
127
|
+
]);
|
|
128
|
+
});
|
|
129
|
+
it('publishes image content blocks as separate file artifacts', async () => {
|
|
130
|
+
const imageBytes = new Uint8Array([137, 80, 78, 71]);
|
|
131
|
+
const mockAgent = {
|
|
132
|
+
id: 'test-agent',
|
|
133
|
+
name: 'Test Agent',
|
|
134
|
+
invoke: vi.fn(),
|
|
135
|
+
async *stream() {
|
|
136
|
+
const agent = createMockAgent();
|
|
137
|
+
// Text delta
|
|
138
|
+
yield new ModelStreamUpdateEvent({
|
|
139
|
+
agent,
|
|
140
|
+
event: { type: 'modelContentBlockDeltaEvent', delta: { type: 'textDelta', text: 'Here is the image:' } },
|
|
141
|
+
});
|
|
142
|
+
// Image content block
|
|
143
|
+
yield new ContentBlockEvent({
|
|
144
|
+
agent,
|
|
145
|
+
contentBlock: new ImageBlock({ format: 'png', source: { bytes: imageBytes } }),
|
|
146
|
+
});
|
|
147
|
+
return new AgentResult({
|
|
148
|
+
stopReason: 'endTurn',
|
|
149
|
+
lastMessage: new Message({ role: 'assistant', content: [new TextBlock('Here is the image:')] }),
|
|
150
|
+
});
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
const executor = new A2AExecutor(mockAgent);
|
|
154
|
+
const eventBus = createMockEventBus();
|
|
155
|
+
await executor.execute(createRequestContext('Generate an image'), eventBus);
|
|
156
|
+
const artifactEvents = eventBus.events.filter((e) => e.kind === 'artifact-update');
|
|
157
|
+
// text delta + image artifact + final text lastChunk = 3
|
|
158
|
+
expect(artifactEvents).toHaveLength(3);
|
|
159
|
+
// First: text delta
|
|
160
|
+
expect(artifactEvents[0].artifact.parts).toStrictEqual([{ kind: 'text', text: 'Here is the image:' }]);
|
|
161
|
+
// Second: image as file part with its own artifactId
|
|
162
|
+
expect(artifactEvents[1].artifact.artifactId).not.toBe(artifactEvents[0].artifact.artifactId);
|
|
163
|
+
expect(artifactEvents[1].lastChunk).toBe(true);
|
|
164
|
+
expect(artifactEvents[1].append).toBe(false);
|
|
165
|
+
expect(artifactEvents[1].artifact.parts).toStrictEqual([
|
|
166
|
+
{ kind: 'file', file: { bytes: encodeBase64(imageBytes), mimeType: 'image/png' } },
|
|
167
|
+
]);
|
|
168
|
+
// Third: final text lastChunk
|
|
169
|
+
expect(artifactEvents[2].lastChunk).toBe(true);
|
|
170
|
+
});
|
|
171
|
+
it('throws A2AError.invalidRequest when parts produce no content blocks', async () => {
|
|
172
|
+
const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Response' });
|
|
173
|
+
const agent = new Agent({ model, printer: false });
|
|
174
|
+
const executor = new A2AExecutor(agent);
|
|
175
|
+
const eventBus = createMockEventBus();
|
|
176
|
+
const context = {
|
|
177
|
+
taskId: 'task-1',
|
|
178
|
+
contextId: 'ctx-1',
|
|
179
|
+
userMessage: { kind: 'message', messageId: 'msg-1', role: 'user', parts: [] },
|
|
180
|
+
};
|
|
181
|
+
await expect(executor.execute(context, eventBus)).rejects.toThrow('No content blocks available');
|
|
182
|
+
expect(eventBus.events).toStrictEqual([]);
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
describe('cancelTask', () => {
|
|
186
|
+
it('throws A2AError.unsupportedOperation', async () => {
|
|
187
|
+
const model = new MockMessageModel().addTurn({ type: 'textBlock', text: '' });
|
|
188
|
+
const agent = new Agent({ model, printer: false });
|
|
189
|
+
const executor = new A2AExecutor(agent);
|
|
190
|
+
const eventBus = createMockEventBus();
|
|
191
|
+
await expect(executor.cancelTask('task-1', eventBus)).rejects.toThrow('Task cancellation is not supported');
|
|
192
|
+
expect(eventBus.events).toStrictEqual([]);
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
//# sourceMappingURL=executor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.test.js","sourceRoot":"","sources":["../../../../src/a2a/__tests__/executor.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.test.d.ts","sourceRoot":"","sources":["../../../../src/a2a/__tests__/server.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { A2AServer } from '../server.js';
|
|
3
|
+
import { Agent } from '../../agent/agent.js';
|
|
4
|
+
import { MockMessageModel } from '../../__fixtures__/mock-message-model.js';
|
|
5
|
+
describe('A2AServer', () => {
|
|
6
|
+
describe('constructor', () => {
|
|
7
|
+
it('builds agent card with provided values', () => {
|
|
8
|
+
const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Hello' });
|
|
9
|
+
const server = new A2AServer({
|
|
10
|
+
agent: new Agent({ model, printer: false }),
|
|
11
|
+
name: 'Base Agent',
|
|
12
|
+
description: 'A base agent',
|
|
13
|
+
httpUrl: 'http://example.com',
|
|
14
|
+
version: '2.0.0',
|
|
15
|
+
});
|
|
16
|
+
expect(server.agentCard).toStrictEqual({
|
|
17
|
+
name: 'Base Agent',
|
|
18
|
+
description: 'A base agent',
|
|
19
|
+
version: '2.0.0',
|
|
20
|
+
protocolVersion: '0.2.0',
|
|
21
|
+
url: 'http://example.com',
|
|
22
|
+
defaultInputModes: ['text/plain'],
|
|
23
|
+
defaultOutputModes: ['text/plain'],
|
|
24
|
+
skills: [],
|
|
25
|
+
capabilities: { streaming: true },
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
it('uses default values when optional config is omitted', () => {
|
|
29
|
+
const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Hello' });
|
|
30
|
+
const server = new A2AServer({
|
|
31
|
+
agent: new Agent({ model, printer: false }),
|
|
32
|
+
name: 'Minimal Agent',
|
|
33
|
+
});
|
|
34
|
+
expect(server.agentCard.description).toBe('');
|
|
35
|
+
expect(server.agentCard.version).toBe('0.0.1');
|
|
36
|
+
expect(server.agentCard.url).toBe('');
|
|
37
|
+
expect(server.agentCard.skills).toStrictEqual([]);
|
|
38
|
+
});
|
|
39
|
+
it('accepts custom taskStore', () => {
|
|
40
|
+
const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Hello' });
|
|
41
|
+
const taskStore = { save: vi.fn(), load: vi.fn() };
|
|
42
|
+
const server = new A2AServer({
|
|
43
|
+
agent: new Agent({ model, printer: false }),
|
|
44
|
+
name: 'Agent',
|
|
45
|
+
taskStore,
|
|
46
|
+
});
|
|
47
|
+
expect(server.agentCard).toBeDefined();
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=server.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.test.js","sourceRoot":"","sources":["../../../../src/a2a/__tests__/server.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.test.node.d.ts","sourceRoot":"","sources":["../../../../src/a2a/__tests__/server.test.node.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { A2AExpressServer } from '../express-server.js';
|
|
3
|
+
import { A2AServer } from '../server.js';
|
|
4
|
+
import { Agent } from '../../agent/agent.js';
|
|
5
|
+
import { MockMessageModel } from '../../__fixtures__/mock-message-model.js';
|
|
6
|
+
// Mock express
|
|
7
|
+
vi.mock('express', () => {
|
|
8
|
+
const mockRouter = {
|
|
9
|
+
get: vi.fn(),
|
|
10
|
+
post: vi.fn(),
|
|
11
|
+
use: vi.fn(),
|
|
12
|
+
};
|
|
13
|
+
const mockApp = {
|
|
14
|
+
use: vi.fn(),
|
|
15
|
+
listen: vi.fn((_port, _host, cb) => {
|
|
16
|
+
cb();
|
|
17
|
+
return { on: vi.fn(), close: vi.fn(), address: () => ({ port: _port || 54321 }) };
|
|
18
|
+
}),
|
|
19
|
+
};
|
|
20
|
+
const express = Object.assign(vi.fn(() => mockApp), {
|
|
21
|
+
Router: vi.fn(() => mockRouter),
|
|
22
|
+
json: vi.fn(() => 'json-middleware'),
|
|
23
|
+
});
|
|
24
|
+
return { default: express };
|
|
25
|
+
});
|
|
26
|
+
// Mock A2A SDK express middleware
|
|
27
|
+
const mockAgentCardHandler = vi.fn(() => 'agent-card-handler');
|
|
28
|
+
const mockJsonRpcHandler = vi.fn(() => 'json-rpc-handler');
|
|
29
|
+
vi.mock('@a2a-js/sdk/server/express', () => ({
|
|
30
|
+
agentCardHandler: (...args) => mockAgentCardHandler(...args),
|
|
31
|
+
jsonRpcHandler: (...args) => mockJsonRpcHandler(...args),
|
|
32
|
+
UserBuilder: { noAuthentication: vi.fn() },
|
|
33
|
+
}));
|
|
34
|
+
function createTestConfig(overrides) {
|
|
35
|
+
const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Hello' });
|
|
36
|
+
return {
|
|
37
|
+
agent: new Agent({ model, printer: false }),
|
|
38
|
+
name: 'Test Agent',
|
|
39
|
+
...overrides,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
describe('A2AExpressServer', () => {
|
|
43
|
+
describe('constructor', () => {
|
|
44
|
+
it('builds agent card with default values', () => {
|
|
45
|
+
const server = new A2AExpressServer(createTestConfig());
|
|
46
|
+
expect(server.agentCard).toStrictEqual({
|
|
47
|
+
name: 'Test Agent',
|
|
48
|
+
description: '',
|
|
49
|
+
version: '0.0.1',
|
|
50
|
+
protocolVersion: '0.2.0',
|
|
51
|
+
url: 'http://127.0.0.1:9000',
|
|
52
|
+
defaultInputModes: ['text/plain'],
|
|
53
|
+
defaultOutputModes: ['text/plain'],
|
|
54
|
+
skills: [],
|
|
55
|
+
capabilities: { streaming: true },
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
it('uses custom config values', () => {
|
|
59
|
+
const server = new A2AExpressServer(createTestConfig({
|
|
60
|
+
description: 'A helpful agent',
|
|
61
|
+
host: '0.0.0.0',
|
|
62
|
+
port: 8080,
|
|
63
|
+
version: '1.0.0',
|
|
64
|
+
skills: [{ id: 'skill-1', name: 'Skill 1', description: 'A skill', tags: [] }],
|
|
65
|
+
}));
|
|
66
|
+
expect(server.agentCard).toStrictEqual({
|
|
67
|
+
name: 'Test Agent',
|
|
68
|
+
description: 'A helpful agent',
|
|
69
|
+
version: '1.0.0',
|
|
70
|
+
protocolVersion: '0.2.0',
|
|
71
|
+
url: 'http://0.0.0.0:8080',
|
|
72
|
+
defaultInputModes: ['text/plain'],
|
|
73
|
+
defaultOutputModes: ['text/plain'],
|
|
74
|
+
skills: [{ id: 'skill-1', name: 'Skill 1', description: 'A skill', tags: [] }],
|
|
75
|
+
capabilities: { streaming: true },
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
it('uses httpUrl override when provided', () => {
|
|
79
|
+
const server = new A2AExpressServer(createTestConfig({ httpUrl: 'https://my-agent.example.com' }));
|
|
80
|
+
expect(server.agentCard.url).toBe('https://my-agent.example.com');
|
|
81
|
+
});
|
|
82
|
+
it('accepts custom taskStore', () => {
|
|
83
|
+
const taskStore = { save: vi.fn(), load: vi.fn() };
|
|
84
|
+
const server = new A2AExpressServer(createTestConfig({ taskStore }));
|
|
85
|
+
expect(server.agentCard).toBeDefined();
|
|
86
|
+
});
|
|
87
|
+
it('is an instance of A2AServer', () => {
|
|
88
|
+
const server = new A2AExpressServer(createTestConfig());
|
|
89
|
+
expect(server).toBeInstanceOf(A2AServer);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
describe('createMiddleware', () => {
|
|
93
|
+
it('returns an express router with SDK middleware', async () => {
|
|
94
|
+
const server = new A2AExpressServer(createTestConfig());
|
|
95
|
+
const router = server.createMiddleware();
|
|
96
|
+
expect(router).toBeDefined();
|
|
97
|
+
expect(router.use).toHaveBeenCalledTimes(2);
|
|
98
|
+
expect(router.use).toHaveBeenCalledWith('/.well-known/agent-card.json', 'agent-card-handler');
|
|
99
|
+
expect(router.use).toHaveBeenCalledWith('/', 'json-rpc-handler');
|
|
100
|
+
expect(mockAgentCardHandler).toHaveBeenCalledWith({
|
|
101
|
+
agentCardProvider: expect.objectContaining({ getAgentCard: expect.any(Function) }),
|
|
102
|
+
});
|
|
103
|
+
expect(mockJsonRpcHandler).toHaveBeenCalledWith({
|
|
104
|
+
requestHandler: expect.anything(),
|
|
105
|
+
userBuilder: expect.anything(),
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
//# sourceMappingURL=server.test.node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.test.node.js","sourceRoot":"","sources":["../../../../src/a2a/__tests__/server.test.node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A2A agent that wraps a remote A2A agent as an InvokableAgent.
|
|
3
|
+
*
|
|
4
|
+
* Implements the InvokableAgent interface so it can be used anywhere a local Agent
|
|
5
|
+
* can be used. The remote agent is invoked via the A2A protocol.
|
|
6
|
+
* The A2A protocol is experimental, so breaking changes in the underlying SDK
|
|
7
|
+
* may require breaking changes in this module.
|
|
8
|
+
*/
|
|
9
|
+
import type { InvokableAgent, InvokeArgs, InvokeOptions } from '../types/agent.js';
|
|
10
|
+
import { AgentResult } from '../types/agent.js';
|
|
11
|
+
import { type A2AStreamEvent } from './events.js';
|
|
12
|
+
/**
|
|
13
|
+
* Configuration options for creating an A2AAgent.
|
|
14
|
+
*/
|
|
15
|
+
export interface A2AAgentConfig {
|
|
16
|
+
/** Base URL of the remote A2A agent */
|
|
17
|
+
url: string;
|
|
18
|
+
/** Path to the agent card endpoint (default: '/.well-known/agent-card.json') */
|
|
19
|
+
agentCardPath?: string;
|
|
20
|
+
/** Optional unique identifier. Defaults to the URL. */
|
|
21
|
+
id?: string;
|
|
22
|
+
/** Optional name. If not provided, populated from the agent card after connection. */
|
|
23
|
+
name?: string;
|
|
24
|
+
/** Optional description. If not provided, populated from the agent card after connection. */
|
|
25
|
+
description?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Wraps a remote A2A agent as an InvokableAgent.
|
|
29
|
+
*
|
|
30
|
+
* Implements `InvokableAgent` so it can be used polymorphically with local `Agent` instances.
|
|
31
|
+
* On invocation, the agent lazily connects to the remote endpoint via the A2A protocol
|
|
32
|
+
* and returns the response as an `AgentResult`.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* import { A2AAgent } from '@strands-agents/sdk/a2a'
|
|
37
|
+
*
|
|
38
|
+
* const remoteAgent = new A2AAgent({ url: 'http://localhost:9000' })
|
|
39
|
+
* const result = await remoteAgent.invoke('Hello, remote agent!')
|
|
40
|
+
* console.log(result.toString())
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare class A2AAgent implements InvokableAgent {
|
|
44
|
+
private _config;
|
|
45
|
+
private _client;
|
|
46
|
+
private _agentCard;
|
|
47
|
+
/**
|
|
48
|
+
* The unique identifier of the agent instance.
|
|
49
|
+
*/
|
|
50
|
+
readonly id: string;
|
|
51
|
+
/**
|
|
52
|
+
* The name of the agent.
|
|
53
|
+
* If not provided in config, populated from the agent card after connection.
|
|
54
|
+
*/
|
|
55
|
+
readonly name?: string;
|
|
56
|
+
/**
|
|
57
|
+
* Optional description of what the agent does.
|
|
58
|
+
* If not provided in config, populated from the agent card after connection.
|
|
59
|
+
*/
|
|
60
|
+
readonly description?: string;
|
|
61
|
+
/**
|
|
62
|
+
* Creates a new A2AAgent.
|
|
63
|
+
*
|
|
64
|
+
* @param config - Configuration for connecting to the remote agent
|
|
65
|
+
*/
|
|
66
|
+
constructor(config: A2AAgentConfig);
|
|
67
|
+
/**
|
|
68
|
+
* Invokes the remote agent and returns the final result.
|
|
69
|
+
*
|
|
70
|
+
* Built on top of `stream()` — consumes the full event stream and returns the final result.
|
|
71
|
+
*
|
|
72
|
+
* @param args - Arguments for invoking the agent
|
|
73
|
+
* @param options - Optional invocation options (unused for remote agents)
|
|
74
|
+
* @returns Promise that resolves to the AgentResult
|
|
75
|
+
*/
|
|
76
|
+
invoke(args: InvokeArgs, options?: InvokeOptions): Promise<AgentResult>;
|
|
77
|
+
/**
|
|
78
|
+
* Streams the remote agent execution, yielding A2A events as they arrive.
|
|
79
|
+
*
|
|
80
|
+
* Yields `A2AStreamUpdateEvent` for each raw A2A protocol event (Message, Task,
|
|
81
|
+
* TaskStatusUpdateEvent, TaskArtifactUpdateEvent), followed by an `A2AResultEvent`
|
|
82
|
+
* containing the final result built from the last complete event.
|
|
83
|
+
*
|
|
84
|
+
* @param args - Arguments for invoking the agent
|
|
85
|
+
* @param _options - Optional invocation options (unused for remote agents)
|
|
86
|
+
* @returns Async generator that yields AgentStreamEvent objects and returns AgentResult
|
|
87
|
+
*/
|
|
88
|
+
stream(args: InvokeArgs, _options?: InvokeOptions): AsyncGenerator<A2AStreamEvent, AgentResult, undefined>;
|
|
89
|
+
/**
|
|
90
|
+
* Returns the cached A2A SDK client, creating one lazily on first use.
|
|
91
|
+
* Also fetches and caches the agent card for name/description.
|
|
92
|
+
*
|
|
93
|
+
* @returns The A2A SDK client
|
|
94
|
+
*/
|
|
95
|
+
private _getClient;
|
|
96
|
+
/**
|
|
97
|
+
* Extracts a text string from InvokeArgs for sending to the remote agent.
|
|
98
|
+
*
|
|
99
|
+
* @param args - The invocation arguments
|
|
100
|
+
* @returns The extracted text string
|
|
101
|
+
*/
|
|
102
|
+
private _extractTextFromArgs;
|
|
103
|
+
/**
|
|
104
|
+
* Checks whether an A2A streaming event represents a complete response.
|
|
105
|
+
*
|
|
106
|
+
* @param event - The A2A streaming event
|
|
107
|
+
* @returns True if the event is a terminal/complete event
|
|
108
|
+
*/
|
|
109
|
+
private _isCompleteEvent;
|
|
110
|
+
/**
|
|
111
|
+
* Builds an AgentResult from the final A2A streaming event.
|
|
112
|
+
*
|
|
113
|
+
* @param event - The final A2A event, or undefined if no events were received
|
|
114
|
+
* @returns The constructed AgentResult
|
|
115
|
+
*/
|
|
116
|
+
private _buildResult;
|
|
117
|
+
/**
|
|
118
|
+
* Extracts text content from an A2A streaming event.
|
|
119
|
+
*
|
|
120
|
+
* @param event - The A2A streaming event
|
|
121
|
+
* @returns Extracted text content
|
|
122
|
+
*/
|
|
123
|
+
private _extractTextFromEvent;
|
|
124
|
+
/**
|
|
125
|
+
* Joins text from A2A parts, filtering out non-text parts.
|
|
126
|
+
*
|
|
127
|
+
* @param parts - Array of A2A parts
|
|
128
|
+
* @returns Joined text content
|
|
129
|
+
*/
|
|
130
|
+
private _textFromParts;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=a2a-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a2a-agent.d.ts","sourceRoot":"","sources":["../../../src/a2a/a2a-agent.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,OAAO,EAA2D,KAAK,cAAc,EAAE,MAAM,aAAa,CAAA;AAI1G;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAA;IACX,gFAAgF;IAChF,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,uDAAuD;IACvD,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,sFAAsF;IACtF,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,6FAA6F;IAC7F,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,QAAS,YAAW,cAAc;IAC7C,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,UAAU,CAAuB;IAEzC;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IAEnB;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IAEtB;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAE7B;;;;OAIG;gBACS,MAAM,EAAE,cAAc;IAOlC;;;;;;;;OAQG;IACG,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC;IAS7E;;;;;;;;;;OAUG;IACI,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,cAAc,CAAC,cAAc,EAAE,WAAW,EAAE,SAAS,CAAC;IA6CjH;;;;;OAKG;YACW,UAAU;IAoBxB;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IA4B5B;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IASpB;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAkB7B;;;;;OAKG;IACH,OAAO,CAAC,cAAc;CAMvB"}
|