@strands-agents/sdk 0.5.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 +55 -0
- package/dist/src/__fixtures__/metrics-helpers.d.ts.map +1 -0
- package/dist/src/__fixtures__/metrics-helpers.js +57 -0
- package/dist/src/__fixtures__/metrics-helpers.js.map +1 -0
- 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 +25 -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__/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.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 +45 -15
- 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 +176 -101
- 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 +71 -58
- package/dist/src/agent/agent.d.ts.map +1 -1
- package/dist/src/agent/agent.js +177 -93
- 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/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/__tests__/registry.test.js +10 -154
- package/dist/src/hooks/__tests__/registry.test.js.map +1 -1
- package/dist/src/hooks/events.d.ts +60 -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 +4 -4
- 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 +30 -15
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +21 -8
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp.d.ts +38 -0
- package/dist/src/mcp.d.ts.map +1 -1
- package/dist/src/mcp.js +23 -6
- package/dist/src/mcp.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 +2050 -131
- 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 +131 -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/__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/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 +144 -11
- package/dist/src/models/bedrock.d.ts.map +1 -1
- package/dist/src/models/bedrock.js +416 -28
- 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 +18 -0
- package/dist/src/models/model.d.ts.map +1 -1
- package/dist/src/models/model.js +57 -11
- 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 +88 -2
- 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.js +41 -8
- package/dist/src/multiagent/__tests__/events.test.js.map +1 -1
- 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 +453 -0
- package/dist/src/multiagent/__tests__/graph.test.js.map +1 -0
- package/dist/src/multiagent/__tests__/nodes.test.js +34 -16
- package/dist/src/multiagent/__tests__/nodes.test.js.map +1 -1
- package/dist/src/multiagent/__tests__/queue.test.js +22 -0
- package/dist/src/multiagent/__tests__/queue.test.js.map +1 -1
- 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 +264 -0
- package/dist/src/multiagent/__tests__/swarm.test.js.map +1 -0
- package/dist/src/multiagent/edge.d.ts +9 -2
- package/dist/src/multiagent/edge.d.ts.map +1 -1
- package/dist/src/multiagent/events.d.ts +63 -15
- package/dist/src/multiagent/events.d.ts.map +1 -1
- package/dist/src/multiagent/events.js +28 -3
- package/dist/src/multiagent/events.js.map +1 -1
- package/dist/src/multiagent/graph.d.ts +135 -0
- package/dist/src/multiagent/graph.d.ts.map +1 -0
- package/dist/src/multiagent/graph.js +400 -0
- package/dist/src/multiagent/graph.js.map +1 -0
- package/dist/src/multiagent/index.d.ts +8 -3
- package/dist/src/multiagent/index.d.ts.map +1 -1
- package/dist/src/multiagent/index.js +3 -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 +24 -25
- package/dist/src/multiagent/nodes.d.ts.map +1 -1
- package/dist/src/multiagent/nodes.js +42 -15
- 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/queue.d.ts +6 -0
- package/dist/src/multiagent/queue.d.ts.map +1 -1
- package/dist/src/multiagent/queue.js +13 -0
- package/dist/src/multiagent/queue.js.map +1 -1
- package/dist/src/multiagent/state.d.ts +4 -2
- package/dist/src/multiagent/state.d.ts.map +1 -1
- package/dist/src/multiagent/state.js +5 -2
- package/dist/src/multiagent/state.js.map +1 -1
- package/dist/src/multiagent/swarm.d.ts +112 -0
- package/dist/src/multiagent/swarm.d.ts.map +1 -0
- package/dist/src/multiagent/swarm.js +256 -0
- package/dist/src/multiagent/swarm.js.map +1 -0
- 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/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 +443 -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 -14
- package/dist/src/session/index.d.ts.map +1 -1
- package/dist/src/session/index.js +4 -13
- 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 +87 -0
- package/dist/src/session/session-manager.d.ts.map +1 -0
- package/dist/src/session/session-manager.js +128 -0
- package/dist/src/session/session-manager.js.map +1 -0
- package/dist/src/session/storage.d.ts +20 -12
- package/dist/src/session/storage.d.ts.map +1 -1
- package/dist/src/session/types.d.ts +8 -20
- 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/{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/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 +64 -0
- package/dist/src/telemetry/__tests__/config.test.js.map +1 -0
- package/dist/src/telemetry/__tests__/config.test.node.js +66 -36
- package/dist/src/telemetry/__tests__/config.test.node.js.map +1 -1
- 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 +624 -0
- package/dist/src/telemetry/__tests__/meter.test.js.map +1 -0
- 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 +104 -23
- package/dist/src/telemetry/config.d.ts.map +1 -1
- package/dist/src/telemetry/config.js +152 -43
- 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 +296 -0
- package/dist/src/telemetry/meter.d.ts.map +1 -0
- package/dist/src/telemetry/meter.js +365 -0
- package/dist/src/telemetry/meter.js.map +1 -0
- 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 +79 -4
- 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-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__/tool.test.js +22 -1
- package/dist/src/tools/__tests__/tool.test.js.map +1 -1
- 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 +26 -3
- package/dist/src/tools/function-tool.d.ts.map +1 -1
- package/dist/src/tools/function-tool.js +88 -3
- 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 +2 -2
- package/dist/src/tools/tool.d.ts.map +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__/media.test.js +22 -16
- package/dist/src/types/__tests__/media.test.js.map +1 -1
- 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 +82 -7
- 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/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 +23 -5
- package/dist/src/types/messages.d.ts.map +1 -1
- package/dist/src/types/messages.js +26 -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/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.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 +3 -3
- 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.d.ts.map +1 -0
- package/dist/src/vended-tools/{http_request → http-request}/http-request.js +1 -2
- package/dist/src/vended-tools/http-request/http-request.js.map +1 -0
- 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.d.ts +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 +66 -12
- 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/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
- 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/http-request.d.ts.map +0 -1
- package/dist/src/vended-tools/http_request/http-request.js.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}/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,443 @@
|
|
|
1
|
+
import { describe, expect, it, beforeEach, vi } from 'vitest';
|
|
2
|
+
import { SessionManager } from '../session-manager.js';
|
|
3
|
+
import { MockSnapshotStorage, createTestSnapshot } from '../../__fixtures__/mock-storage-provider.js';
|
|
4
|
+
import { InitializedEvent, MessageAddedEvent, AfterInvocationEvent, AfterModelCallEvent, HookableEvent, } from '../../hooks/index.js';
|
|
5
|
+
import { Agent } from '../../agent/agent.js';
|
|
6
|
+
import { Message, TextBlock } from '../../types/messages.js';
|
|
7
|
+
import { createMockAgent as createMockAgentWithHooks, invokeTrackedHook } from '../../__fixtures__/agent-helpers.js';
|
|
8
|
+
import { loadStateFromJSONSymbol, stateToJSONSymbol } from '../../types/serializable.js';
|
|
9
|
+
// Test fixtures
|
|
10
|
+
function createMockAgent(id = 'agent') {
|
|
11
|
+
const agent = {
|
|
12
|
+
id,
|
|
13
|
+
messages: [],
|
|
14
|
+
appState: {
|
|
15
|
+
_m: new Map(),
|
|
16
|
+
get(k) {
|
|
17
|
+
return this._m.get(k);
|
|
18
|
+
},
|
|
19
|
+
set(k, v) {
|
|
20
|
+
this._m.set(k, v);
|
|
21
|
+
},
|
|
22
|
+
[stateToJSONSymbol]() {
|
|
23
|
+
return Object.fromEntries(this._m);
|
|
24
|
+
},
|
|
25
|
+
[loadStateFromJSONSymbol](json) {
|
|
26
|
+
Object.entries(json).forEach(([k, v]) => this._m.set(k, v));
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
systemPrompt: 'Test prompt',
|
|
30
|
+
};
|
|
31
|
+
return agent;
|
|
32
|
+
}
|
|
33
|
+
const MOCK_MESSAGE = new Message({ role: 'user', content: [new TextBlock('test')] });
|
|
34
|
+
function createMockEvent(agent) {
|
|
35
|
+
return { agent };
|
|
36
|
+
}
|
|
37
|
+
function createMockMessageEvent(agent) {
|
|
38
|
+
return { agent, message: MOCK_MESSAGE };
|
|
39
|
+
}
|
|
40
|
+
async function initPluginAndInvokeHook(sessionManager, event) {
|
|
41
|
+
const pluginAgent = createMockAgentWithHooks();
|
|
42
|
+
sessionManager.initAgent(pluginAgent);
|
|
43
|
+
await invokeTrackedHook(pluginAgent, event);
|
|
44
|
+
}
|
|
45
|
+
describe('SessionManager', () => {
|
|
46
|
+
let storage;
|
|
47
|
+
let sessionManager;
|
|
48
|
+
let mockAgent;
|
|
49
|
+
beforeEach(() => {
|
|
50
|
+
storage = new MockSnapshotStorage();
|
|
51
|
+
mockAgent = createMockAgent();
|
|
52
|
+
});
|
|
53
|
+
describe('constructor', () => {
|
|
54
|
+
it('defaults saveLatestOn to invocation', async () => {
|
|
55
|
+
sessionManager = new SessionManager({ sessionId: 'test-default', storage: { snapshot: storage } });
|
|
56
|
+
await initPluginAndInvokeHook(sessionManager, new AfterInvocationEvent(createMockEvent(mockAgent)));
|
|
57
|
+
const snapshot = await storage.loadSnapshot({
|
|
58
|
+
location: { sessionId: 'test-default', scope: 'agent', scopeId: 'agent' },
|
|
59
|
+
});
|
|
60
|
+
expect(snapshot).not.toBeNull();
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
describe('saveSnapshot', () => {
|
|
64
|
+
beforeEach(() => {
|
|
65
|
+
mockAgent = createMockAgent('test-agent');
|
|
66
|
+
sessionManager = new SessionManager({
|
|
67
|
+
sessionId: 'test-session',
|
|
68
|
+
storage: { snapshot: storage },
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
it('saves snapshot_latest when isLatest is true', async () => {
|
|
72
|
+
await sessionManager.saveSnapshot({ target: mockAgent, isLatest: true });
|
|
73
|
+
const snapshot = await storage.loadSnapshot({
|
|
74
|
+
location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
|
|
75
|
+
});
|
|
76
|
+
expect(snapshot).not.toBeNull();
|
|
77
|
+
expect(snapshot?.scope).toBe('agent');
|
|
78
|
+
});
|
|
79
|
+
it('saves immutable snapshot when isLatest is false', async () => {
|
|
80
|
+
await sessionManager.saveSnapshot({ target: mockAgent, isLatest: false });
|
|
81
|
+
const ids = await storage.listSnapshotIds({
|
|
82
|
+
location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
|
|
83
|
+
});
|
|
84
|
+
expect(ids.length).toBeGreaterThan(0);
|
|
85
|
+
});
|
|
86
|
+
it('allocates unique snapshot IDs', async () => {
|
|
87
|
+
await sessionManager.saveSnapshot({ target: mockAgent, isLatest: false });
|
|
88
|
+
await sessionManager.saveSnapshot({ target: mockAgent, isLatest: false });
|
|
89
|
+
await sessionManager.saveSnapshot({ target: mockAgent, isLatest: false });
|
|
90
|
+
const ids = await storage.listSnapshotIds({
|
|
91
|
+
location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
|
|
92
|
+
});
|
|
93
|
+
expect(ids.length).toBe(3);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
describe('restoreSnapshot', () => {
|
|
97
|
+
beforeEach(() => {
|
|
98
|
+
mockAgent = createMockAgent('test-agent');
|
|
99
|
+
sessionManager = new SessionManager({
|
|
100
|
+
sessionId: 'test-session',
|
|
101
|
+
storage: { snapshot: storage },
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
it('restores snapshot_latest when no snapshotId provided', async () => {
|
|
105
|
+
const snapshot = createTestSnapshot();
|
|
106
|
+
await storage.saveSnapshot({
|
|
107
|
+
location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
|
|
108
|
+
snapshotId: 'latest',
|
|
109
|
+
isLatest: true,
|
|
110
|
+
snapshot,
|
|
111
|
+
});
|
|
112
|
+
const result = await sessionManager.restoreSnapshot({ target: mockAgent });
|
|
113
|
+
expect(result).toBe(true);
|
|
114
|
+
});
|
|
115
|
+
it('restores specific snapshot by ID', async () => {
|
|
116
|
+
const snapshot = createTestSnapshot();
|
|
117
|
+
await storage.saveSnapshot({
|
|
118
|
+
location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
|
|
119
|
+
snapshotId: '5',
|
|
120
|
+
isLatest: false,
|
|
121
|
+
snapshot,
|
|
122
|
+
});
|
|
123
|
+
const result = await sessionManager.restoreSnapshot({ target: mockAgent, snapshotId: '5' });
|
|
124
|
+
expect(result).toBe(true);
|
|
125
|
+
});
|
|
126
|
+
it('returns false when snapshot not found', async () => {
|
|
127
|
+
const result = await sessionManager.restoreSnapshot({ target: mockAgent, snapshotId: '999' });
|
|
128
|
+
expect(result).toBe(false);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
describe('InitializedEvent handling', () => {
|
|
132
|
+
beforeEach(() => {
|
|
133
|
+
mockAgent = createMockAgent('test-agent');
|
|
134
|
+
});
|
|
135
|
+
it('loads snapshot_latest on initialization', async () => {
|
|
136
|
+
const snapshot = createTestSnapshot();
|
|
137
|
+
await storage.saveSnapshot({
|
|
138
|
+
location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
|
|
139
|
+
snapshotId: 'latest',
|
|
140
|
+
isLatest: true,
|
|
141
|
+
snapshot,
|
|
142
|
+
});
|
|
143
|
+
sessionManager = new SessionManager({
|
|
144
|
+
sessionId: 'test-session',
|
|
145
|
+
storage: { snapshot: storage },
|
|
146
|
+
});
|
|
147
|
+
await initPluginAndInvokeHook(sessionManager, new InitializedEvent(createMockEvent(mockAgent)));
|
|
148
|
+
expect(mockAgent.messages).toEqual(snapshot.data.messages);
|
|
149
|
+
});
|
|
150
|
+
it('handles missing snapshot gracefully', async () => {
|
|
151
|
+
sessionManager = new SessionManager({
|
|
152
|
+
sessionId: 'new-session',
|
|
153
|
+
storage: { snapshot: storage },
|
|
154
|
+
});
|
|
155
|
+
await expect(initPluginAndInvokeHook(sessionManager, new InitializedEvent(createMockEvent(mockAgent)))).resolves.not.toThrow();
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
describe('MessageAddedEvent handling', () => {
|
|
159
|
+
beforeEach(() => {
|
|
160
|
+
mockAgent = createMockAgent('test-agent');
|
|
161
|
+
});
|
|
162
|
+
it('saves snapshot_latest when saveLatestOn is message', async () => {
|
|
163
|
+
sessionManager = new SessionManager({
|
|
164
|
+
sessionId: 'test-session',
|
|
165
|
+
storage: { snapshot: storage },
|
|
166
|
+
saveLatestOn: 'message',
|
|
167
|
+
});
|
|
168
|
+
await initPluginAndInvokeHook(sessionManager, new MessageAddedEvent(createMockMessageEvent(mockAgent)));
|
|
169
|
+
const snapshot = await storage.loadSnapshot({
|
|
170
|
+
location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
|
|
171
|
+
});
|
|
172
|
+
expect(snapshot).not.toBeNull();
|
|
173
|
+
});
|
|
174
|
+
it('does not save when saveLatestOn is invocation', async () => {
|
|
175
|
+
sessionManager = new SessionManager({
|
|
176
|
+
sessionId: 'test-session',
|
|
177
|
+
storage: { snapshot: storage },
|
|
178
|
+
saveLatestOn: 'invocation',
|
|
179
|
+
});
|
|
180
|
+
// MessageAddedEvent is not registered when saveLatestOn is 'invocation'
|
|
181
|
+
// So we need to call initAgent and check that no hook is registered for MessageAddedEvent
|
|
182
|
+
const pluginAgent = createMockAgentWithHooks();
|
|
183
|
+
sessionManager.initAgent(pluginAgent);
|
|
184
|
+
// Verify MessageAddedEvent hook is not registered
|
|
185
|
+
const messageHook = pluginAgent.trackedHooks.find((h) => h.eventType === MessageAddedEvent);
|
|
186
|
+
expect(messageHook).toBeUndefined();
|
|
187
|
+
// Even if we try to invoke (nothing should happen)
|
|
188
|
+
const snapshot = await storage.loadSnapshot({
|
|
189
|
+
location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
|
|
190
|
+
});
|
|
191
|
+
expect(snapshot).toBeNull();
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
describe('AfterInvocationEvent handling', () => {
|
|
195
|
+
beforeEach(() => {
|
|
196
|
+
mockAgent = createMockAgent('test-agent');
|
|
197
|
+
});
|
|
198
|
+
it('saves snapshot_latest when saveLatestOn is invocation', async () => {
|
|
199
|
+
sessionManager = new SessionManager({
|
|
200
|
+
sessionId: 'test-session',
|
|
201
|
+
storage: { snapshot: storage },
|
|
202
|
+
saveLatestOn: 'invocation',
|
|
203
|
+
});
|
|
204
|
+
await initPluginAndInvokeHook(sessionManager, new AfterInvocationEvent(createMockEvent(mockAgent)));
|
|
205
|
+
const snapshot = await storage.loadSnapshot({
|
|
206
|
+
location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
|
|
207
|
+
});
|
|
208
|
+
expect(snapshot).not.toBeNull();
|
|
209
|
+
});
|
|
210
|
+
it('does not save snapshot_latest when saveLatestOn is trigger', async () => {
|
|
211
|
+
sessionManager = new SessionManager({
|
|
212
|
+
sessionId: 'test-session',
|
|
213
|
+
storage: { snapshot: storage },
|
|
214
|
+
saveLatestOn: 'trigger',
|
|
215
|
+
});
|
|
216
|
+
await initPluginAndInvokeHook(sessionManager, new AfterInvocationEvent(createMockEvent(mockAgent)));
|
|
217
|
+
const snapshot = await storage.loadSnapshot({
|
|
218
|
+
location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
|
|
219
|
+
});
|
|
220
|
+
expect(snapshot).toBeNull();
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
describe('snapshotTrigger', () => {
|
|
224
|
+
beforeEach(() => {
|
|
225
|
+
mockAgent = createMockAgent('test-agent');
|
|
226
|
+
});
|
|
227
|
+
it('creates immutable snapshot when trigger returns true', async () => {
|
|
228
|
+
sessionManager = new SessionManager({
|
|
229
|
+
sessionId: 'test-session',
|
|
230
|
+
storage: { snapshot: storage },
|
|
231
|
+
saveLatestOn: 'trigger',
|
|
232
|
+
snapshotTrigger: () => true,
|
|
233
|
+
});
|
|
234
|
+
await initPluginAndInvokeHook(sessionManager, new AfterInvocationEvent(createMockEvent(mockAgent)));
|
|
235
|
+
const ids = await storage.listSnapshotIds({
|
|
236
|
+
location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
|
|
237
|
+
});
|
|
238
|
+
expect(ids.length).toBe(1);
|
|
239
|
+
});
|
|
240
|
+
it('does not create immutable snapshot when trigger returns false', async () => {
|
|
241
|
+
sessionManager = new SessionManager({
|
|
242
|
+
sessionId: 'test-session',
|
|
243
|
+
storage: { snapshot: storage },
|
|
244
|
+
saveLatestOn: 'trigger',
|
|
245
|
+
snapshotTrigger: () => false,
|
|
246
|
+
});
|
|
247
|
+
await initPluginAndInvokeHook(sessionManager, new AfterInvocationEvent(createMockEvent(mockAgent)));
|
|
248
|
+
const ids = await storage.listSnapshotIds({
|
|
249
|
+
location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
|
|
250
|
+
});
|
|
251
|
+
expect(ids.length).toBe(0);
|
|
252
|
+
});
|
|
253
|
+
it('provides agentData to trigger', async () => {
|
|
254
|
+
const triggerSpy = vi.fn(() => false);
|
|
255
|
+
sessionManager = new SessionManager({
|
|
256
|
+
sessionId: 'test-session',
|
|
257
|
+
storage: { snapshot: storage },
|
|
258
|
+
saveLatestOn: 'trigger',
|
|
259
|
+
snapshotTrigger: triggerSpy,
|
|
260
|
+
});
|
|
261
|
+
await initPluginAndInvokeHook(sessionManager, new AfterInvocationEvent(createMockEvent(mockAgent)));
|
|
262
|
+
expect(triggerSpy).toHaveBeenCalledWith(expect.objectContaining({
|
|
263
|
+
agentData: expect.objectContaining({
|
|
264
|
+
appState: mockAgent.appState,
|
|
265
|
+
messages: mockAgent.messages,
|
|
266
|
+
}),
|
|
267
|
+
}));
|
|
268
|
+
});
|
|
269
|
+
it('saves both immutable and latest when trigger fires', async () => {
|
|
270
|
+
sessionManager = new SessionManager({
|
|
271
|
+
sessionId: 'test-session',
|
|
272
|
+
storage: { snapshot: storage },
|
|
273
|
+
saveLatestOn: 'trigger',
|
|
274
|
+
snapshotTrigger: () => true,
|
|
275
|
+
});
|
|
276
|
+
await initPluginAndInvokeHook(sessionManager, new AfterInvocationEvent(createMockEvent(mockAgent)));
|
|
277
|
+
const immutableIds = await storage.listSnapshotIds({
|
|
278
|
+
location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
|
|
279
|
+
});
|
|
280
|
+
const latest = await storage.loadSnapshot({
|
|
281
|
+
location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
|
|
282
|
+
});
|
|
283
|
+
expect(immutableIds.length).toBe(1);
|
|
284
|
+
expect(latest).not.toBeNull();
|
|
285
|
+
});
|
|
286
|
+
it('trigger based on message count via agentData', async () => {
|
|
287
|
+
sessionManager = new SessionManager({
|
|
288
|
+
sessionId: 'test-session',
|
|
289
|
+
storage: { snapshot: storage },
|
|
290
|
+
saveLatestOn: 'trigger',
|
|
291
|
+
snapshotTrigger: ({ agentData }) => agentData.messages.length >= 2,
|
|
292
|
+
});
|
|
293
|
+
const pluginAgent = createMockAgentWithHooks();
|
|
294
|
+
sessionManager.initAgent(pluginAgent);
|
|
295
|
+
await invokeTrackedHook(pluginAgent, new AfterInvocationEvent(createMockEvent(mockAgent)));
|
|
296
|
+
let ids = await storage.listSnapshotIds({
|
|
297
|
+
location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
|
|
298
|
+
});
|
|
299
|
+
expect(ids.length).toBe(0); // 0 messages — no snapshot
|
|
300
|
+
mockAgent.messages.push(MOCK_MESSAGE, MOCK_MESSAGE);
|
|
301
|
+
await invokeTrackedHook(pluginAgent, new AfterInvocationEvent(createMockEvent(mockAgent)));
|
|
302
|
+
ids = await storage.listSnapshotIds({
|
|
303
|
+
location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
|
|
304
|
+
});
|
|
305
|
+
expect(ids.length).toBe(1); // 2 messages — snapshot taken
|
|
306
|
+
});
|
|
307
|
+
it('trigger based on agent state via agentData', async () => {
|
|
308
|
+
sessionManager = new SessionManager({
|
|
309
|
+
sessionId: 'test-session',
|
|
310
|
+
storage: { snapshot: storage },
|
|
311
|
+
saveLatestOn: 'trigger',
|
|
312
|
+
snapshotTrigger: ({ agentData }) => agentData.appState.get('checkpoint') === true,
|
|
313
|
+
});
|
|
314
|
+
const pluginAgent = createMockAgentWithHooks();
|
|
315
|
+
sessionManager.initAgent(pluginAgent);
|
|
316
|
+
await invokeTrackedHook(pluginAgent, new AfterInvocationEvent(createMockEvent(mockAgent)));
|
|
317
|
+
let ids = await storage.listSnapshotIds({
|
|
318
|
+
location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
|
|
319
|
+
});
|
|
320
|
+
expect(ids.length).toBe(0); // state not set — no snapshot
|
|
321
|
+
mockAgent.appState.set('checkpoint', true);
|
|
322
|
+
await invokeTrackedHook(pluginAgent, new AfterInvocationEvent(createMockEvent(mockAgent)));
|
|
323
|
+
ids = await storage.listSnapshotIds({
|
|
324
|
+
location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
|
|
325
|
+
});
|
|
326
|
+
expect(ids.length).toBe(1); // state set — snapshot taken
|
|
327
|
+
});
|
|
328
|
+
});
|
|
329
|
+
describe('integration scenarios', () => {
|
|
330
|
+
it('handles complete session lifecycle', async () => {
|
|
331
|
+
sessionManager = new SessionManager({
|
|
332
|
+
sessionId: 'lifecycle-test',
|
|
333
|
+
storage: { snapshot: storage },
|
|
334
|
+
saveLatestOn: 'invocation',
|
|
335
|
+
snapshotTrigger: () => true,
|
|
336
|
+
});
|
|
337
|
+
const pluginAgent = createMockAgentWithHooks();
|
|
338
|
+
sessionManager.initAgent(pluginAgent);
|
|
339
|
+
await invokeTrackedHook(pluginAgent, new InitializedEvent(createMockEvent(mockAgent)));
|
|
340
|
+
await invokeTrackedHook(pluginAgent, new AfterInvocationEvent(createMockEvent(mockAgent)));
|
|
341
|
+
await invokeTrackedHook(pluginAgent, new AfterInvocationEvent(createMockEvent(mockAgent)));
|
|
342
|
+
await invokeTrackedHook(pluginAgent, new AfterInvocationEvent(createMockEvent(mockAgent)));
|
|
343
|
+
const latest = await storage.loadSnapshot({
|
|
344
|
+
location: { sessionId: 'lifecycle-test', scope: 'agent', scopeId: 'agent' },
|
|
345
|
+
});
|
|
346
|
+
const immutableIds = await storage.listSnapshotIds({
|
|
347
|
+
location: { sessionId: 'lifecycle-test', scope: 'agent', scopeId: 'agent' },
|
|
348
|
+
});
|
|
349
|
+
expect(latest).not.toBeNull();
|
|
350
|
+
expect(immutableIds.length).toBe(3);
|
|
351
|
+
});
|
|
352
|
+
it('supports resuming from immutable snapshot', async () => {
|
|
353
|
+
// First session - snapshot fires when messages.length === 2 (after turn 1)
|
|
354
|
+
sessionManager = new SessionManager({
|
|
355
|
+
sessionId: 'resume-test',
|
|
356
|
+
storage: { snapshot: storage },
|
|
357
|
+
saveLatestOn: 'trigger',
|
|
358
|
+
snapshotTrigger: ({ agentData }) => agentData.messages.length === 2,
|
|
359
|
+
});
|
|
360
|
+
const pluginAgent = createMockAgentWithHooks();
|
|
361
|
+
sessionManager.initAgent(pluginAgent);
|
|
362
|
+
await invokeTrackedHook(pluginAgent, new InitializedEvent(createMockEvent(mockAgent)));
|
|
363
|
+
mockAgent.messages.push(MOCK_MESSAGE, MOCK_MESSAGE);
|
|
364
|
+
await invokeTrackedHook(pluginAgent, new AfterInvocationEvent(createMockEvent(mockAgent)));
|
|
365
|
+
const ids = await storage.listSnapshotIds({
|
|
366
|
+
location: { sessionId: 'resume-test', scope: 'agent', scopeId: 'agent' },
|
|
367
|
+
});
|
|
368
|
+
expect(ids.length).toBe(1);
|
|
369
|
+
// Second session - resume from that snapshot
|
|
370
|
+
const newAgent = createMockAgent();
|
|
371
|
+
const newSessionManager = new SessionManager({
|
|
372
|
+
sessionId: 'resume-test',
|
|
373
|
+
storage: { snapshot: storage },
|
|
374
|
+
saveLatestOn: 'invocation',
|
|
375
|
+
});
|
|
376
|
+
const newAgentData = createMockAgentWithHooks();
|
|
377
|
+
newSessionManager.initAgent(newAgentData);
|
|
378
|
+
await invokeTrackedHook(newAgentData, new InitializedEvent(createMockEvent(newAgent)));
|
|
379
|
+
await newSessionManager.restoreSnapshot({ target: newAgent, snapshotId: ids[0] });
|
|
380
|
+
expect(newAgent.messages).toEqual(mockAgent.messages);
|
|
381
|
+
});
|
|
382
|
+
});
|
|
383
|
+
describe('AfterModelCallEvent with redaction handling', () => {
|
|
384
|
+
beforeEach(() => {
|
|
385
|
+
mockAgent = createMockAgent('test-agent');
|
|
386
|
+
});
|
|
387
|
+
it('saves snapshot_latest when saveLatestOn is message and redaction occurred', async () => {
|
|
388
|
+
sessionManager = new SessionManager({
|
|
389
|
+
sessionId: 'test-session',
|
|
390
|
+
storage: { snapshot: storage },
|
|
391
|
+
saveLatestOn: 'message',
|
|
392
|
+
});
|
|
393
|
+
const assistantMessage = new Message({ role: 'assistant', content: [new TextBlock('Response')] });
|
|
394
|
+
const event = new AfterModelCallEvent({
|
|
395
|
+
agent: mockAgent,
|
|
396
|
+
stopData: {
|
|
397
|
+
message: assistantMessage,
|
|
398
|
+
stopReason: 'endTurn',
|
|
399
|
+
redaction: { userMessage: '[User input redacted.]' },
|
|
400
|
+
},
|
|
401
|
+
});
|
|
402
|
+
await initPluginAndInvokeHook(sessionManager, event);
|
|
403
|
+
const snapshot = await storage.loadSnapshot({
|
|
404
|
+
location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
|
|
405
|
+
});
|
|
406
|
+
expect(snapshot).not.toBeNull();
|
|
407
|
+
});
|
|
408
|
+
it('does not save when saveLatestOn is message but no redaction occurred', async () => {
|
|
409
|
+
sessionManager = new SessionManager({
|
|
410
|
+
sessionId: 'test-session',
|
|
411
|
+
storage: { snapshot: storage },
|
|
412
|
+
saveLatestOn: 'message',
|
|
413
|
+
});
|
|
414
|
+
const assistantMessage = new Message({ role: 'assistant', content: [new TextBlock('Response')] });
|
|
415
|
+
const event = new AfterModelCallEvent({
|
|
416
|
+
agent: mockAgent,
|
|
417
|
+
stopData: { message: assistantMessage, stopReason: 'endTurn' },
|
|
418
|
+
});
|
|
419
|
+
await initPluginAndInvokeHook(sessionManager, event);
|
|
420
|
+
const snapshot = await storage.loadSnapshot({
|
|
421
|
+
location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
|
|
422
|
+
});
|
|
423
|
+
expect(snapshot).toBeNull();
|
|
424
|
+
});
|
|
425
|
+
it('does not save when saveLatestOn is invocation', async () => {
|
|
426
|
+
sessionManager = new SessionManager({
|
|
427
|
+
sessionId: 'test-session',
|
|
428
|
+
storage: { snapshot: storage },
|
|
429
|
+
saveLatestOn: 'invocation',
|
|
430
|
+
});
|
|
431
|
+
// AfterModelCallEvent hook is not registered when saveLatestOn is 'invocation'
|
|
432
|
+
const pluginAgent = createMockAgentWithHooks();
|
|
433
|
+
sessionManager.initAgent(pluginAgent);
|
|
434
|
+
const afterModelHook = pluginAgent.trackedHooks.find((h) => h.eventType === AfterModelCallEvent);
|
|
435
|
+
expect(afterModelHook).toBeUndefined();
|
|
436
|
+
const snapshot = await storage.loadSnapshot({
|
|
437
|
+
location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
|
|
438
|
+
});
|
|
439
|
+
expect(snapshot).toBeNull();
|
|
440
|
+
});
|
|
441
|
+
});
|
|
442
|
+
});
|
|
443
|
+
//# sourceMappingURL=session-manager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.test.js","sourceRoot":"","sources":["../../../../src/session/__tests__/session-manager.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { validateIdentifier } from '../validation.js';
|
|
2
|
+
import { validateIdentifier, validateUuidV7 } from '../validation.js';
|
|
3
3
|
describe('validateIdentifier', () => {
|
|
4
4
|
describe('when identifier is valid', () => {
|
|
5
5
|
it('returns the identifier', () => {
|
|
@@ -17,4 +17,31 @@ describe('validateIdentifier', () => {
|
|
|
17
17
|
});
|
|
18
18
|
});
|
|
19
19
|
});
|
|
20
|
+
describe('validateUuidV7', () => {
|
|
21
|
+
describe('when id is a valid UUID v7', () => {
|
|
22
|
+
it('does not throw', () => {
|
|
23
|
+
expect(() => validateUuidV7('01956891-2b4c-7000-8abc-123456789abc')).not.toThrow();
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe('when id is a UUID v4 (wrong version)', () => {
|
|
27
|
+
it('throws error', () => {
|
|
28
|
+
expect(() => validateUuidV7('550e8400-e29b-41d4-a716-446655440000')).toThrow("'550e8400-e29b-41d4-a716-446655440000' is not a valid UUID v7 snapshot ID");
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
describe('when id is a timestamp string', () => {
|
|
32
|
+
it('throws error', () => {
|
|
33
|
+
expect(() => validateUuidV7('2025-01-15T10:30:00Z')).toThrow("'2025-01-15T10:30:00Z' is not a valid UUID v7 snapshot ID");
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe('when id contains path traversal', () => {
|
|
37
|
+
it('throws error', () => {
|
|
38
|
+
expect(() => validateUuidV7('../evil')).toThrow("'../evil' is not a valid UUID v7 snapshot ID");
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe('when id is empty string', () => {
|
|
42
|
+
it('throws error', () => {
|
|
43
|
+
expect(() => validateUuidV7('')).toThrow("'' is not a valid UUID v7 snapshot ID");
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
});
|
|
20
47
|
//# sourceMappingURL=validation.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.test.js","sourceRoot":"","sources":["../../../../src/session/__tests__/validation.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"validation.test.js","sourceRoot":"","sources":["../../../../src/session/__tests__/validation.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAErE,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;YAChC,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACzD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACtD,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YACtB,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CACpD,+FAA+F,CAChG,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAClD,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YACtB,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CACrD,gGAAgG,CACjG,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;YACxB,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,sCAAsC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;QACpF,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;QACpD,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YACtB,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,sCAAsC,CAAC,CAAC,CAAC,OAAO,CAC1E,2EAA2E,CAC5E,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;QAC7C,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YACtB,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAAC,CAAC,OAAO,CAC1D,2DAA2D,CAC5D,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC/C,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YACtB,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAA;QACjG,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YACtB,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAA;QACnF,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -1,22 +1,38 @@
|
|
|
1
1
|
import type { SnapshotStorage, SnapshotLocation } from './storage.js';
|
|
2
2
|
import type { Snapshot, SnapshotManifest } from './types.js';
|
|
3
3
|
/**
|
|
4
|
-
* File-based implementation of SnapshotStorage
|
|
4
|
+
* File-based implementation of SnapshotStorage.
|
|
5
|
+
* Persists session snapshots to the local filesystem under a configurable base directory.
|
|
6
|
+
*
|
|
7
|
+
* Directory layout:
|
|
8
|
+
* ```
|
|
9
|
+
* <baseDir>/<sessionId>/scopes/<scope>/<scopeId>/snapshots/
|
|
10
|
+
* snapshot_latest.json
|
|
11
|
+
* immutable_history/
|
|
12
|
+
* snapshot_<uuid7>.json
|
|
13
|
+
* ```
|
|
5
14
|
*/
|
|
6
15
|
export declare class FileStorage implements SnapshotStorage {
|
|
7
|
-
/**
|
|
16
|
+
/** Absolute path to the root directory where all session data is stored. */
|
|
8
17
|
private readonly _baseDir;
|
|
9
18
|
/**
|
|
10
|
-
*
|
|
11
|
-
* @param baseDir - Base directory path for storing snapshots
|
|
19
|
+
* @param baseDir - Absolute path to the root directory for storing session snapshots.
|
|
12
20
|
*/
|
|
13
21
|
constructor(baseDir: string);
|
|
14
22
|
/**
|
|
15
|
-
*
|
|
23
|
+
* Resolves the absolute file path for a given scope location and filename.
|
|
24
|
+
* Validates sessionId and scopeId before constructing the path.
|
|
16
25
|
*/
|
|
17
26
|
private _getPath;
|
|
18
27
|
/**
|
|
19
|
-
*
|
|
28
|
+
* Resolves the absolute path to the root directory for a session.
|
|
29
|
+
* Used by deleteSession to remove all data under `<baseDir>/<sessionId>/`.
|
|
30
|
+
*/
|
|
31
|
+
private _getSessionDir;
|
|
32
|
+
/**
|
|
33
|
+
* Persists a snapshot to disk.
|
|
34
|
+
* If `isLatest` is true, writes to `snapshot_latest.json` (overwriting any previous).
|
|
35
|
+
* Otherwise, writes to `immutable_history/snapshot_<snapshotId>.json`.
|
|
20
36
|
*/
|
|
21
37
|
saveSnapshot(params: {
|
|
22
38
|
location: SnapshotLocation;
|
|
@@ -25,55 +41,65 @@ export declare class FileStorage implements SnapshotStorage {
|
|
|
25
41
|
snapshot: Snapshot;
|
|
26
42
|
}): Promise<void>;
|
|
27
43
|
/**
|
|
28
|
-
* Loads snapshot
|
|
44
|
+
* Loads a snapshot from disk.
|
|
45
|
+
* If `snapshotId` is omitted, loads `snapshot_latest.json`.
|
|
46
|
+
* Returns null if the file does not exist.
|
|
29
47
|
*/
|
|
30
48
|
loadSnapshot(params: {
|
|
31
49
|
location: SnapshotLocation;
|
|
32
50
|
snapshotId?: string;
|
|
33
51
|
}): Promise<Snapshot | null>;
|
|
34
52
|
/**
|
|
35
|
-
*
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
* TODO: Add pagination support for long-running agents with many snapshots.
|
|
42
|
-
* Future signature could be:
|
|
43
|
-
* ```typescript
|
|
44
|
-
* listSnapshots(params: {
|
|
45
|
-
* sessionId: string
|
|
46
|
-
* scope: Scope
|
|
47
|
-
* limit?: number // Max results to return (e.g., 100)
|
|
48
|
-
* startAfter?: string // Snapshot ID to start after (for cursor-based pagination)
|
|
49
|
-
* }): Promise<{ snapshotIds: string[]; nextToken?: string }>
|
|
50
|
-
* ```
|
|
53
|
+
* Lists immutable snapshot IDs for a scope, sorted chronologically.
|
|
54
|
+
* Since IDs are UUID v7, lexicographic sort equals chronological order.
|
|
55
|
+
* `startAfter` filters to IDs after the given UUID v7 (exclusive cursor).
|
|
56
|
+
* `limit` caps the number of returned IDs.
|
|
57
|
+
* Returns an empty array if no snapshots exist yet.
|
|
51
58
|
*/
|
|
52
59
|
listSnapshotIds(params: {
|
|
53
60
|
location: SnapshotLocation;
|
|
61
|
+
limit?: number;
|
|
62
|
+
startAfter?: string;
|
|
54
63
|
}): Promise<string[]>;
|
|
55
64
|
/**
|
|
56
|
-
*
|
|
65
|
+
* Deletes all data for a session by removing its root directory (`<baseDir>/<sessionId>/`) recursively.
|
|
66
|
+
* No-ops if the session directory does not exist.
|
|
67
|
+
*/
|
|
68
|
+
deleteSession(params: {
|
|
69
|
+
sessionId: string;
|
|
70
|
+
}): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Loads the snapshot manifest for a scope.
|
|
73
|
+
* Returns a default manifest with the current timestamp if none exists yet.
|
|
57
74
|
*/
|
|
58
75
|
loadManifest(params: {
|
|
59
76
|
location: SnapshotLocation;
|
|
60
77
|
}): Promise<SnapshotManifest>;
|
|
61
78
|
/**
|
|
62
|
-
*
|
|
79
|
+
* Persists the snapshot manifest for a scope to disk.
|
|
63
80
|
*/
|
|
64
81
|
saveManifest(params: {
|
|
65
82
|
location: SnapshotLocation;
|
|
66
83
|
manifest: SnapshotManifest;
|
|
67
84
|
}): Promise<void>;
|
|
68
85
|
/**
|
|
69
|
-
*
|
|
86
|
+
* Atomically writes JSON to a file using a `.tmp` intermediary to prevent partial writes.
|
|
87
|
+
* Creates parent directories if they do not exist.
|
|
70
88
|
*/
|
|
71
89
|
private _writeJSON;
|
|
72
90
|
/**
|
|
73
|
-
* Reads and parses JSON
|
|
91
|
+
* Reads and parses a JSON file. Returns null if the file does not exist.
|
|
92
|
+
* Throws SessionError on parse failure or unexpected filesystem errors.
|
|
74
93
|
*/
|
|
75
94
|
private _readJSON;
|
|
95
|
+
/** Returns true if the error represents a missing file or directory (ENOENT). */
|
|
96
|
+
private _isFileNotFoundError;
|
|
97
|
+
/** Returns the file path for `snapshot_latest.json` within the given scope. */
|
|
76
98
|
private _getLatestSnapshotPath;
|
|
99
|
+
/**
|
|
100
|
+
* Returns the file path for an immutable snapshot in `immutable_history/`.
|
|
101
|
+
* Validates the snapshotId and guards against path traversal outside `_baseDir`.
|
|
102
|
+
*/
|
|
77
103
|
private _getHistorySnapshotPath;
|
|
78
104
|
}
|
|
79
105
|
//# sourceMappingURL=file-storage.d.ts.map
|