@amodalai/runtime 0.1.26 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/__fixtures__/README.md +88 -0
- package/dist/src/__fixtures__/e2e.test.js +211 -0
- package/dist/src/__fixtures__/e2e.test.js.map +1 -0
- package/dist/src/__fixtures__/smoke-agent/amodal.json +11 -0
- package/dist/src/__fixtures__/smoke-agent/automations/delivery-callback-test.json +9 -0
- package/dist/src/__fixtures__/smoke-agent/automations/test-auto.md +5 -0
- package/dist/src/__fixtures__/smoke-agent/connections/mock-api/access.json +11 -0
- package/dist/src/__fixtures__/smoke-agent/connections/mock-api/spec.json +4 -0
- package/dist/src/__fixtures__/smoke-agent/connections/mock-api/surface.md +9 -0
- package/dist/src/__fixtures__/smoke-agent/connections/mock-mcp/access.json +3 -0
- package/dist/src/__fixtures__/smoke-agent/connections/mock-mcp/spec.json +8 -0
- package/dist/src/__fixtures__/smoke-agent/evals/basic-eval.md +12 -0
- package/dist/src/__fixtures__/smoke-agent/knowledge/test-knowledge.md +3 -0
- package/dist/src/__fixtures__/smoke-agent/skills/test-skill/SKILL.md +11 -0
- package/dist/src/__fixtures__/smoke-agent/stores/test-items.json +11 -0
- package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/handler.d.ts +18 -0
- package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/handler.js +22 -0
- package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/handler.js.map +1 -0
- package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/tool.json +17 -0
- package/dist/src/__fixtures__/smoke.test.js +1404 -0
- package/dist/src/__fixtures__/smoke.test.js.map +1 -0
- package/dist/src/__fixtures__/test-env.d.ts +27 -0
- package/dist/src/__fixtures__/test-env.js +64 -0
- package/dist/src/__fixtures__/test-env.js.map +1 -0
- package/dist/src/__fixtures__/test-helpers.d.ts +30 -0
- package/dist/src/__fixtures__/test-helpers.js +120 -0
- package/dist/src/__fixtures__/test-helpers.js.map +1 -0
- package/dist/src/__tests__/test-providers.d.ts +40 -0
- package/dist/src/__tests__/test-providers.js +61 -0
- package/dist/src/__tests__/test-providers.js.map +1 -0
- package/dist/src/agent/agent-types.d.ts +22 -0
- package/dist/src/agent/agent-types.js.map +1 -1
- package/dist/src/agent/automation-bridge.d.ts +9 -0
- package/dist/src/agent/automation-bridge.js +26 -0
- package/dist/src/agent/automation-bridge.js.map +1 -1
- package/dist/src/agent/automation-bridge.test.js +63 -0
- package/dist/src/agent/automation-bridge.test.js.map +1 -1
- package/dist/src/agent/local-server.d.ts +1 -8
- package/dist/src/agent/local-server.js +398 -163
- package/dist/src/agent/local-server.js.map +1 -1
- package/dist/src/agent/local-server.test.js +14 -8
- package/dist/src/agent/local-server.test.js.map +1 -1
- package/dist/src/agent/loop-types.d.ts +254 -0
- package/dist/src/agent/loop-types.js +24 -0
- package/dist/src/agent/loop-types.js.map +1 -0
- package/dist/src/agent/loop.d.ts +31 -0
- package/dist/src/agent/loop.js +152 -0
- package/dist/src/agent/loop.js.map +1 -0
- package/dist/src/agent/loop.test.js +1594 -0
- package/dist/src/agent/loop.test.js.map +1 -0
- package/dist/src/agent/mcp-config.d.ts +28 -0
- package/dist/src/agent/mcp-config.js +57 -0
- package/dist/src/agent/mcp-config.js.map +1 -0
- package/dist/src/agent/page-builder.js +6 -1
- package/dist/src/agent/page-builder.js.map +1 -1
- package/dist/src/agent/proactive/delivery-router.d.ts +68 -0
- package/dist/src/agent/proactive/delivery-router.js +337 -0
- package/dist/src/agent/proactive/delivery-router.js.map +1 -0
- package/dist/src/agent/{stores-e2e.test.d.ts → proactive/delivery-router.test.d.ts} +1 -1
- package/dist/src/agent/proactive/delivery-router.test.js +455 -0
- package/dist/src/agent/proactive/delivery-router.test.js.map +1 -0
- package/dist/src/agent/proactive/proactive-runner.d.ts +46 -8
- package/dist/src/agent/proactive/proactive-runner.js +67 -37
- package/dist/src/agent/proactive/proactive-runner.js.map +1 -1
- package/dist/src/agent/proactive/proactive-runner.test.d.ts +1 -1
- package/dist/src/agent/proactive/proactive-runner.test.js +73 -87
- package/dist/src/agent/proactive/proactive-runner.test.js.map +1 -1
- package/dist/src/agent/routes/admin-chat-abort.test.d.ts +6 -0
- package/dist/src/agent/routes/admin-chat-abort.test.js +206 -0
- package/dist/src/agent/routes/admin-chat-abort.test.js.map +1 -0
- package/dist/src/agent/routes/admin-chat.d.ts +15 -3
- package/dist/src/agent/routes/admin-chat.js +61 -18
- package/dist/src/agent/routes/admin-chat.js.map +1 -1
- package/dist/src/agent/routes/automations.js +5 -6
- package/dist/src/agent/routes/automations.js.map +1 -1
- package/dist/src/agent/routes/evals.d.ts +3 -2
- package/dist/src/agent/routes/evals.js +25 -12
- package/dist/src/agent/routes/evals.js.map +1 -1
- package/dist/src/agent/routes/files.js +7 -9
- package/dist/src/agent/routes/files.js.map +1 -1
- package/dist/src/agent/routes/inspect.d.ts +6 -2
- package/dist/src/agent/routes/inspect.js +31 -17
- package/dist/src/agent/routes/inspect.js.map +1 -1
- package/dist/src/agent/routes/inspect.test.js +18 -42
- package/dist/src/agent/routes/inspect.test.js.map +1 -1
- package/dist/src/agent/routes/stores.js +9 -12
- package/dist/src/agent/routes/stores.js.map +1 -1
- package/dist/src/agent/routes/task.d.ts +15 -3
- package/dist/src/agent/routes/task.js +16 -7
- package/dist/src/agent/routes/task.js.map +1 -1
- package/dist/src/agent/routes/task.test.d.ts +1 -1
- package/dist/src/agent/routes/task.test.js +68 -53
- package/dist/src/agent/routes/task.test.js.map +1 -1
- package/dist/src/agent/routes/webhooks.js +12 -3
- package/dist/src/agent/routes/webhooks.js.map +1 -1
- package/dist/src/agent/snapshot-server.d.ts +2 -22
- package/dist/src/agent/snapshot-server.js +48 -27
- package/dist/src/agent/snapshot-server.js.map +1 -1
- package/dist/src/agent/states/compacting.d.ts +14 -0
- package/dist/src/agent/states/compacting.js +260 -0
- package/dist/src/agent/states/compacting.js.map +1 -0
- package/dist/src/agent/states/confirming.d.ts +10 -0
- package/dist/src/agent/states/confirming.js +79 -0
- package/dist/src/agent/states/confirming.js.map +1 -0
- package/dist/src/agent/states/dispatching.d.ts +18 -0
- package/dist/src/agent/states/dispatching.js +285 -0
- package/dist/src/agent/states/dispatching.js.map +1 -0
- package/dist/src/agent/states/executing.d.ts +21 -0
- package/dist/src/agent/states/executing.js +452 -0
- package/dist/src/agent/states/executing.js.map +1 -0
- package/dist/src/agent/states/streaming.d.ts +10 -0
- package/dist/src/agent/states/streaming.js +169 -0
- package/dist/src/agent/states/streaming.js.map +1 -0
- package/dist/src/agent/states/thinking.d.ts +13 -0
- package/dist/src/agent/states/thinking.js +450 -0
- package/dist/src/agent/states/thinking.js.map +1 -0
- package/dist/src/agent/token-estimate.d.ts +31 -0
- package/dist/src/agent/token-estimate.js +34 -0
- package/dist/src/agent/token-estimate.js.map +1 -0
- package/dist/src/agent/token-estimate.test.d.ts +6 -0
- package/dist/src/agent/token-estimate.test.js +44 -0
- package/dist/src/agent/token-estimate.test.js.map +1 -0
- package/dist/src/agent/tool-executor-local.js +9 -18
- package/dist/src/agent/tool-executor-local.js.map +1 -1
- package/dist/src/agent/tool-executor-local.test.js +3 -5
- package/dist/src/agent/tool-executor-local.test.js.map +1 -1
- package/dist/src/api/create-agent.d.ts +15 -0
- package/dist/src/api/create-agent.js +134 -0
- package/dist/src/api/create-agent.js.map +1 -0
- package/dist/src/api/types.d.ts +66 -0
- package/dist/src/api/types.js +7 -0
- package/dist/src/api/types.js.map +1 -0
- package/dist/src/context/compiler.d.ts +13 -0
- package/dist/src/context/compiler.js +358 -0
- package/dist/src/context/compiler.js.map +1 -0
- package/dist/src/context/compiler.test.d.ts +6 -0
- package/dist/src/context/compiler.test.js +532 -0
- package/dist/src/context/compiler.test.js.map +1 -0
- package/dist/src/context/types.d.ts +110 -0
- package/dist/src/context/types.js +7 -0
- package/dist/src/context/types.js.map +1 -0
- package/dist/src/env-ref.d.ts +13 -0
- package/dist/src/env-ref.js +31 -0
- package/dist/src/env-ref.js.map +1 -0
- package/dist/src/env-ref.test.d.ts +6 -0
- package/dist/src/env-ref.test.js +34 -0
- package/dist/src/env-ref.test.js.map +1 -0
- package/dist/src/errors.d.ts +15 -0
- package/dist/src/errors.js +22 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/errors.test.js +2 -2
- package/dist/src/errors.test.js.map +1 -1
- package/dist/src/events/event-bus.d.ts +54 -0
- package/dist/src/events/event-bus.js +84 -0
- package/dist/src/events/event-bus.js.map +1 -0
- package/dist/src/events/event-bus.test.d.ts +6 -0
- package/dist/src/events/event-bus.test.js +112 -0
- package/dist/src/events/event-bus.test.js.map +1 -0
- package/dist/src/events/events-route.d.ts +36 -0
- package/dist/src/events/events-route.js +80 -0
- package/dist/src/events/events-route.js.map +1 -0
- package/dist/src/events/events-route.test.d.ts +6 -0
- package/dist/src/events/events-route.test.js +134 -0
- package/dist/src/events/events-route.test.js.map +1 -0
- package/dist/src/events/store-event-wrapper.d.ts +19 -0
- package/dist/src/events/store-event-wrapper.js +57 -0
- package/dist/src/events/store-event-wrapper.js.map +1 -0
- package/dist/src/events/store-event-wrapper.test.d.ts +6 -0
- package/dist/src/events/store-event-wrapper.test.js +91 -0
- package/dist/src/events/store-event-wrapper.test.js.map +1 -0
- package/dist/src/index.d.ts +33 -6
- package/dist/src/index.js +35 -21
- package/dist/src/index.js.map +1 -1
- package/dist/src/middleware/auth.d.ts +0 -2
- package/dist/src/middleware/auth.js.map +1 -1
- package/dist/src/providers/create-provider.d.ts +23 -0
- package/dist/src/providers/create-provider.js +185 -0
- package/dist/src/providers/create-provider.js.map +1 -0
- package/dist/src/providers/create-provider.test.d.ts +6 -0
- package/dist/src/providers/create-provider.test.js +95 -0
- package/dist/src/providers/create-provider.test.js.map +1 -0
- package/dist/src/providers/failover.d.ts +38 -0
- package/dist/src/providers/failover.js +147 -0
- package/dist/src/providers/failover.js.map +1 -0
- package/dist/src/providers/failover.test.d.ts +6 -0
- package/dist/src/providers/failover.test.js +169 -0
- package/dist/src/providers/failover.test.js.map +1 -0
- package/dist/src/providers/search-provider.d.ts +64 -0
- package/dist/src/providers/search-provider.js +174 -0
- package/dist/src/providers/search-provider.js.map +1 -0
- package/dist/src/providers/types.d.ts +118 -0
- package/dist/src/providers/types.js +7 -0
- package/dist/src/providers/types.js.map +1 -0
- package/dist/src/routes/ai-stream.d.ts +28 -10
- package/dist/src/routes/ai-stream.js +85 -41
- package/dist/src/routes/ai-stream.js.map +1 -1
- package/dist/src/routes/chat-new.test.d.ts +6 -0
- package/dist/src/routes/chat-new.test.js +107 -0
- package/dist/src/routes/chat-new.test.js.map +1 -0
- package/dist/src/routes/chat-stream-new.test.d.ts +6 -0
- package/dist/src/routes/chat-stream-new.test.js +135 -0
- package/dist/src/routes/chat-stream-new.test.js.map +1 -0
- package/dist/src/routes/chat-stream.d.ts +20 -4
- package/dist/src/routes/chat-stream.js +49 -29
- package/dist/src/routes/chat-stream.js.map +1 -1
- package/dist/src/routes/chat.d.ts +19 -4
- package/dist/src/routes/chat.js +62 -23
- package/dist/src/routes/chat.js.map +1 -1
- package/dist/src/routes/health.d.ts +3 -2
- package/dist/src/routes/health.js.map +1 -1
- package/dist/src/routes/route-helpers.d.ts +50 -0
- package/dist/src/routes/route-helpers.js +80 -0
- package/dist/src/routes/route-helpers.js.map +1 -0
- package/dist/src/routes/session-resolver.d.ts +77 -0
- package/dist/src/routes/session-resolver.js +109 -0
- package/dist/src/routes/session-resolver.js.map +1 -0
- package/dist/src/routes/session-resolver.test.d.ts +6 -0
- package/dist/src/routes/session-resolver.test.js +207 -0
- package/dist/src/routes/session-resolver.test.js.map +1 -0
- package/dist/src/routes/webhooks.d.ts +3 -1
- package/dist/src/routes/webhooks.js +12 -4
- package/dist/src/routes/webhooks.js.map +1 -1
- package/dist/src/security/permission-checker.d.ts +80 -0
- package/dist/src/security/permission-checker.js +75 -0
- package/dist/src/security/permission-checker.js.map +1 -0
- package/dist/src/security/permission-checker.test.d.ts +6 -0
- package/dist/src/security/permission-checker.test.js +208 -0
- package/dist/src/security/permission-checker.test.js.map +1 -0
- package/dist/src/server.d.ts +18 -11
- package/dist/src/server.js +46 -46
- package/dist/src/server.js.map +1 -1
- package/dist/src/server.test.d.ts +1 -1
- package/dist/src/server.test.js +6 -144
- package/dist/src/server.test.js.map +1 -1
- package/dist/src/session/drizzle-session-store.d.ts +56 -0
- package/dist/src/session/drizzle-session-store.js +203 -0
- package/dist/src/session/drizzle-session-store.js.map +1 -0
- package/dist/src/session/manager.d.ts +101 -0
- package/dist/src/session/manager.js +394 -0
- package/dist/src/session/manager.js.map +1 -0
- package/dist/src/session/manager.test.d.ts +6 -0
- package/dist/src/session/manager.test.js +309 -0
- package/dist/src/session/manager.test.js.map +1 -0
- package/dist/src/session/pglite-session-store.d.ts +23 -0
- package/dist/src/session/pglite-session-store.js +70 -0
- package/dist/src/session/pglite-session-store.js.map +1 -0
- package/dist/src/session/postgres-session-store.d.ts +44 -0
- package/dist/src/session/postgres-session-store.js +138 -0
- package/dist/src/session/postgres-session-store.js.map +1 -0
- package/dist/src/session/session-builder.d.ts +69 -0
- package/dist/src/session/session-builder.js +384 -0
- package/dist/src/session/session-builder.js.map +1 -0
- package/dist/src/session/session-builder.test.d.ts +6 -0
- package/dist/src/session/session-builder.test.js +350 -0
- package/dist/src/session/session-builder.test.js.map +1 -0
- package/dist/src/session/session-store-selector.d.ts +49 -0
- package/dist/src/session/session-store-selector.js +60 -0
- package/dist/src/session/session-store-selector.js.map +1 -0
- package/dist/src/session/session-store-selector.test.d.ts +6 -0
- package/dist/src/session/session-store-selector.test.js +79 -0
- package/dist/src/session/session-store-selector.test.js.map +1 -0
- package/dist/src/session/store.d.ts +171 -0
- package/dist/src/session/store.js +155 -0
- package/dist/src/session/store.js.map +1 -0
- package/dist/src/session/store.test.d.ts +6 -0
- package/dist/src/session/store.test.js +423 -0
- package/dist/src/session/store.test.js.map +1 -0
- package/dist/src/session/stream-hooks.d.ts +39 -0
- package/dist/src/session/stream-hooks.js +7 -0
- package/dist/src/session/stream-hooks.js.map +1 -0
- package/dist/src/session/tool-context-factory.d.ts +61 -0
- package/dist/src/session/tool-context-factory.js +189 -0
- package/dist/src/session/tool-context-factory.js.map +1 -0
- package/dist/src/session/tool-context-factory.test.d.ts +6 -0
- package/dist/src/session/tool-context-factory.test.js +284 -0
- package/dist/src/session/tool-context-factory.test.js.map +1 -0
- package/dist/src/session/types.d.ts +195 -0
- package/dist/src/session/types.js +7 -0
- package/dist/src/session/types.js.map +1 -0
- package/dist/src/stores/drizzle-store-backend.d.ts +49 -0
- package/dist/src/stores/drizzle-store-backend.js +306 -0
- package/dist/src/stores/drizzle-store-backend.js.map +1 -0
- package/dist/src/stores/drizzle-store-backend.test.d.ts +6 -0
- package/dist/src/stores/drizzle-store-backend.test.js +215 -0
- package/dist/src/stores/drizzle-store-backend.test.js.map +1 -0
- package/dist/src/stores/index.d.ts +4 -0
- package/dist/src/stores/index.js +2 -0
- package/dist/src/stores/index.js.map +1 -1
- package/dist/src/stores/pglite-store-backend.d.ts +16 -19
- package/dist/src/stores/pglite-store-backend.js +85 -239
- package/dist/src/stores/pglite-store-backend.js.map +1 -1
- package/dist/src/stores/postgres-store-backend.d.ts +30 -0
- package/dist/src/stores/postgres-store-backend.js +100 -0
- package/dist/src/stores/postgres-store-backend.js.map +1 -0
- package/dist/src/stores/schema.d.ts +457 -0
- package/dist/src/stores/schema.js +59 -0
- package/dist/src/stores/schema.js.map +1 -0
- package/dist/src/tools/admin-file-tools.d.ts +42 -0
- package/dist/src/tools/admin-file-tools.js +714 -0
- package/dist/src/tools/admin-file-tools.js.map +1 -0
- package/dist/src/tools/admin-file-tools.test.d.ts +6 -0
- package/dist/src/tools/admin-file-tools.test.js +521 -0
- package/dist/src/tools/admin-file-tools.test.js.map +1 -0
- package/dist/src/tools/custom-tool-adapter.d.ts +41 -0
- package/dist/src/tools/custom-tool-adapter.js +190 -0
- package/dist/src/tools/custom-tool-adapter.js.map +1 -0
- package/dist/src/tools/custom-tool-adapter.test.d.ts +6 -0
- package/dist/src/tools/custom-tool-adapter.test.js +243 -0
- package/dist/src/tools/custom-tool-adapter.test.js.map +1 -0
- package/dist/src/tools/dispatch-tool.d.ts +52 -0
- package/dist/src/tools/dispatch-tool.js +71 -0
- package/dist/src/tools/dispatch-tool.js.map +1 -0
- package/dist/src/tools/dispatch-tool.test.d.ts +6 -0
- package/dist/src/tools/dispatch-tool.test.js +75 -0
- package/dist/src/tools/dispatch-tool.test.js.map +1 -0
- package/dist/src/tools/fetch-url-tool.d.ts +23 -0
- package/dist/src/tools/fetch-url-tool.js +333 -0
- package/dist/src/tools/fetch-url-tool.js.map +1 -0
- package/dist/src/tools/fetch-url-tool.test.d.ts +6 -0
- package/dist/src/tools/fetch-url-tool.test.js +228 -0
- package/dist/src/tools/fetch-url-tool.test.js.map +1 -0
- package/dist/src/tools/mcp-tool-adapter.d.ts +18 -0
- package/dist/src/tools/mcp-tool-adapter.js +135 -0
- package/dist/src/tools/mcp-tool-adapter.js.map +1 -0
- package/dist/src/tools/mcp-tool-adapter.test.d.ts +6 -0
- package/dist/src/tools/mcp-tool-adapter.test.js +226 -0
- package/dist/src/tools/mcp-tool-adapter.test.js.map +1 -0
- package/dist/src/tools/registry.d.ts +25 -0
- package/dist/src/tools/registry.js +72 -0
- package/dist/src/tools/registry.js.map +1 -0
- package/dist/src/tools/registry.test.d.ts +6 -0
- package/dist/src/tools/registry.test.js +120 -0
- package/dist/src/tools/registry.test.js.map +1 -0
- package/dist/src/tools/request-tool.d.ts +42 -0
- package/dist/src/tools/request-tool.js +190 -0
- package/dist/src/tools/request-tool.js.map +1 -0
- package/dist/src/tools/request-tool.test.d.ts +6 -0
- package/dist/src/tools/request-tool.test.js +253 -0
- package/dist/src/tools/request-tool.test.js.map +1 -0
- package/dist/src/tools/store-tools.d.ts +29 -0
- package/dist/src/tools/store-tools.js +224 -0
- package/dist/src/tools/store-tools.js.map +1 -0
- package/dist/src/tools/store-tools.test.d.ts +6 -0
- package/dist/src/tools/store-tools.test.js +215 -0
- package/dist/src/tools/store-tools.test.js.map +1 -0
- package/dist/src/tools/types.d.ts +129 -0
- package/dist/src/tools/types.js +7 -0
- package/dist/src/tools/types.js.map +1 -0
- package/dist/src/tools/web-search-tool.d.ts +31 -0
- package/dist/src/tools/web-search-tool.js +170 -0
- package/dist/src/tools/web-search-tool.js.map +1 -0
- package/dist/src/tools/web-search-tool.test.d.ts +6 -0
- package/dist/src/tools/web-search-tool.test.js +153 -0
- package/dist/src/tools/web-search-tool.test.js.map +1 -0
- package/dist/src/tools/web-tools-shared.d.ts +21 -0
- package/dist/src/tools/web-tools-shared.js +32 -0
- package/dist/src/tools/web-tools-shared.js.map +1 -0
- package/dist/src/types.d.ts +40 -12
- package/dist/src/types.js +16 -2
- package/dist/src/types.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +27 -4
- package/dist/src/__tests__/sse-contract.test.js +0 -464
- package/dist/src/__tests__/sse-contract.test.js.map +0 -1
- package/dist/src/__tests__/tools.test.js +0 -583
- package/dist/src/__tests__/tools.test.js.map +0 -1
- package/dist/src/agent/agent-runner.d.ts +0 -33
- package/dist/src/agent/agent-runner.js +0 -1040
- package/dist/src/agent/agent-runner.js.map +0 -1
- package/dist/src/agent/custom-tools-e2e.test.d.ts +0 -6
- package/dist/src/agent/custom-tools-e2e.test.js +0 -566
- package/dist/src/agent/custom-tools-e2e.test.js.map +0 -1
- package/dist/src/agent/request-helper.d.ts +0 -16
- package/dist/src/agent/request-helper.js +0 -96
- package/dist/src/agent/request-helper.js.map +0 -1
- package/dist/src/agent/session-store.d.ts +0 -62
- package/dist/src/agent/session-store.js +0 -151
- package/dist/src/agent/session-store.js.map +0 -1
- package/dist/src/agent/stores-e2e.test.js +0 -433
- package/dist/src/agent/stores-e2e.test.js.map +0 -1
- package/dist/src/agent/tool-context-builder.d.ts +0 -11
- package/dist/src/agent/tool-context-builder.js +0 -102
- package/dist/src/agent/tool-context-builder.js.map +0 -1
- package/dist/src/agent/tool-context-builder.test.d.ts +0 -6
- package/dist/src/agent/tool-context-builder.test.js +0 -152
- package/dist/src/agent/tool-context-builder.test.js.map +0 -1
- package/dist/src/agent/write-repo-file.test.js +0 -270
- package/dist/src/agent/write-repo-file.test.js.map +0 -1
- package/dist/src/cron/heartbeat-runner.d.ts +0 -21
- package/dist/src/cron/heartbeat-runner.js +0 -79
- package/dist/src/cron/heartbeat-runner.js.map +0 -1
- package/dist/src/cron/heartbeat-runner.test.d.ts +0 -6
- package/dist/src/cron/heartbeat-runner.test.js +0 -120
- package/dist/src/cron/heartbeat-runner.test.js.map +0 -1
- package/dist/src/cron/heartbeat-scheduler.d.ts +0 -26
- package/dist/src/cron/heartbeat-scheduler.js +0 -55
- package/dist/src/cron/heartbeat-scheduler.js.map +0 -1
- package/dist/src/cron/heartbeat-scheduler.test.d.ts +0 -6
- package/dist/src/cron/heartbeat-scheduler.test.js +0 -61
- package/dist/src/cron/heartbeat-scheduler.test.js.map +0 -1
- package/dist/src/routes/ai-stream.test.d.ts +0 -6
- package/dist/src/routes/ai-stream.test.js +0 -586
- package/dist/src/routes/ai-stream.test.js.map +0 -1
- package/dist/src/routes/ask-user-response.d.ts +0 -30
- package/dist/src/routes/ask-user-response.js +0 -61
- package/dist/src/routes/ask-user-response.js.map +0 -1
- package/dist/src/routes/ask-user-response.test.d.ts +0 -6
- package/dist/src/routes/ask-user-response.test.js +0 -88
- package/dist/src/routes/ask-user-response.test.js.map +0 -1
- package/dist/src/routes/chat-stream.test.d.ts +0 -6
- package/dist/src/routes/chat-stream.test.js +0 -155
- package/dist/src/routes/chat-stream.test.js.map +0 -1
- package/dist/src/routes/chat.test.d.ts +0 -6
- package/dist/src/routes/chat.test.js +0 -99
- package/dist/src/routes/chat.test.js.map +0 -1
- package/dist/src/routes/widget-actions.d.ts +0 -49
- package/dist/src/routes/widget-actions.js +0 -78
- package/dist/src/routes/widget-actions.js.map +0 -1
- package/dist/src/session/admin-file-tools.d.ts +0 -136
- package/dist/src/session/admin-file-tools.js +0 -240
- package/dist/src/session/admin-file-tools.js.map +0 -1
- package/dist/src/session/custom-tool-adapter.d.ts +0 -74
- package/dist/src/session/custom-tool-adapter.js +0 -180
- package/dist/src/session/custom-tool-adapter.js.map +0 -1
- package/dist/src/session/history-converter.d.ts +0 -21
- package/dist/src/session/history-converter.js +0 -59
- package/dist/src/session/history-converter.js.map +0 -1
- package/dist/src/session/history-converter.test.d.ts +0 -6
- package/dist/src/session/history-converter.test.js +0 -130
- package/dist/src/session/history-converter.test.js.map +0 -1
- package/dist/src/session/session-manager.d.ts +0 -219
- package/dist/src/session/session-manager.js +0 -915
- package/dist/src/session/session-manager.js.map +0 -1
- package/dist/src/session/session-manager.test.d.ts +0 -6
- package/dist/src/session/session-manager.test.js +0 -455
- package/dist/src/session/session-manager.test.js.map +0 -1
- package/dist/src/session/session-runner.d.ts +0 -45
- package/dist/src/session/session-runner.js +0 -719
- package/dist/src/session/session-runner.js.map +0 -1
- package/dist/src/session/session-runner.test.d.ts +0 -6
- package/dist/src/session/session-runner.test.js +0 -834
- package/dist/src/session/session-runner.test.js.map +0 -1
- /package/dist/src/{__tests__/sse-contract.test.d.ts → __fixtures__/e2e.test.d.ts} +0 -0
- /package/dist/src/{__tests__/tools.test.d.ts → __fixtures__/smoke.test.d.ts} +0 -0
- /package/dist/src/agent/{write-repo-file.test.d.ts → loop.test.d.ts} +0 -0
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Tests for StandaloneSessionManager.
|
|
8
|
+
*
|
|
9
|
+
* Tests session lifecycle: create, persist, resume, destroy, cleanup.
|
|
10
|
+
* Uses a real PGLite-backed store — no mocks for persistence.
|
|
11
|
+
* LLM provider is stubbed since we're testing the manager, not the loop.
|
|
12
|
+
*/
|
|
13
|
+
import { describe, it, expect, vi, beforeAll, afterAll } from 'vitest';
|
|
14
|
+
import { StandaloneSessionManager } from './manager.js';
|
|
15
|
+
import { createPGLiteSessionStore } from './pglite-session-store.js';
|
|
16
|
+
import { SSEEventType } from '../types.js';
|
|
17
|
+
import { createLogger } from '../logger.js';
|
|
18
|
+
import { createToolRegistry } from '../tools/registry.js';
|
|
19
|
+
const logger = createLogger({ component: 'test:session-manager' });
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Stubs
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
function stubProvider(model = 'test-model', provider = 'test-provider') {
|
|
24
|
+
return {
|
|
25
|
+
model,
|
|
26
|
+
provider,
|
|
27
|
+
languageModel: {},
|
|
28
|
+
streamText: () => {
|
|
29
|
+
throw new Error('streamText not implemented in stub');
|
|
30
|
+
},
|
|
31
|
+
generateText: () => Promise.reject(new Error('generateText not implemented in stub')),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create a provider that streams a single text response and finishes.
|
|
36
|
+
*/
|
|
37
|
+
function streamingProvider(responseText) {
|
|
38
|
+
return {
|
|
39
|
+
model: 'test-model',
|
|
40
|
+
provider: 'test-provider',
|
|
41
|
+
languageModel: {},
|
|
42
|
+
streamText() {
|
|
43
|
+
const usage = { inputTokens: 10, outputTokens: 5, totalTokens: 15 };
|
|
44
|
+
const events = [
|
|
45
|
+
{ type: 'text-delta', textDelta: responseText },
|
|
46
|
+
{ type: 'finish', usage },
|
|
47
|
+
];
|
|
48
|
+
async function* makeFullStream() {
|
|
49
|
+
for (const e of events)
|
|
50
|
+
yield e;
|
|
51
|
+
}
|
|
52
|
+
async function* makeTextStream() {
|
|
53
|
+
yield responseText;
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
fullStream: makeFullStream(),
|
|
57
|
+
textStream: makeTextStream(),
|
|
58
|
+
usage: Promise.resolve(usage),
|
|
59
|
+
text: Promise.resolve(responseText),
|
|
60
|
+
};
|
|
61
|
+
},
|
|
62
|
+
generateText: () => Promise.reject(new Error('not implemented')),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function stubPermissionChecker() {
|
|
66
|
+
return {
|
|
67
|
+
check: () => ({ allowed: true }),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function makeCreateOpts(overrides = {}) {
|
|
71
|
+
return {
|
|
72
|
+
provider: stubProvider(),
|
|
73
|
+
toolRegistry: createToolRegistry(),
|
|
74
|
+
permissionChecker: stubPermissionChecker(),
|
|
75
|
+
systemPrompt: 'You are a helpful assistant.',
|
|
76
|
+
...overrides,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
// Tests
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
describe('StandaloneSessionManager', () => {
|
|
83
|
+
let store;
|
|
84
|
+
beforeAll(async () => {
|
|
85
|
+
store = await createPGLiteSessionStore({ logger });
|
|
86
|
+
});
|
|
87
|
+
afterAll(async () => {
|
|
88
|
+
await store.close();
|
|
89
|
+
});
|
|
90
|
+
describe('create', () => {
|
|
91
|
+
it('creates a session with a generated ID', () => {
|
|
92
|
+
const mgr = new StandaloneSessionManager({ logger, store });
|
|
93
|
+
const session = mgr.create(makeCreateOpts());
|
|
94
|
+
expect(session.id).toBeTruthy();
|
|
95
|
+
expect(session.model).toBe('test-model');
|
|
96
|
+
expect(session.providerName).toBe('test-provider');
|
|
97
|
+
expect(session.messages).toEqual([]);
|
|
98
|
+
expect(session.usage.inputTokens).toBe(0);
|
|
99
|
+
});
|
|
100
|
+
it('stores session in memory', () => {
|
|
101
|
+
const mgr = new StandaloneSessionManager({ logger, store });
|
|
102
|
+
const session = mgr.create(makeCreateOpts());
|
|
103
|
+
expect(mgr.has(session.id)).toBe(true);
|
|
104
|
+
expect(mgr.get(session.id)).toBe(session);
|
|
105
|
+
expect(mgr.size).toBe(1);
|
|
106
|
+
});
|
|
107
|
+
it('uses custom maxTurns and maxContextTokens', () => {
|
|
108
|
+
const mgr = new StandaloneSessionManager({ logger, store });
|
|
109
|
+
const session = mgr.create(makeCreateOpts({
|
|
110
|
+
maxTurns: 10,
|
|
111
|
+
maxContextTokens: 100_000,
|
|
112
|
+
}));
|
|
113
|
+
expect(session.maxTurns).toBe(10);
|
|
114
|
+
expect(session.maxContextTokens).toBe(100_000);
|
|
115
|
+
});
|
|
116
|
+
it('uses manager defaults when not specified', () => {
|
|
117
|
+
const mgr = new StandaloneSessionManager({
|
|
118
|
+
logger,
|
|
119
|
+
store,
|
|
120
|
+
defaultMaxTurns: 25,
|
|
121
|
+
defaultMaxContextTokens: 150_000,
|
|
122
|
+
});
|
|
123
|
+
const session = mgr.create(makeCreateOpts());
|
|
124
|
+
expect(session.maxTurns).toBe(25);
|
|
125
|
+
expect(session.maxContextTokens).toBe(150_000);
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
describe('persist and resume', () => {
|
|
129
|
+
it('persists a session and resumes it with preserved messages', async () => {
|
|
130
|
+
const mgr = new StandaloneSessionManager({ logger, store });
|
|
131
|
+
const session = mgr.create(makeCreateOpts());
|
|
132
|
+
// Simulate some messages
|
|
133
|
+
session.messages = [
|
|
134
|
+
{ role: 'user', content: 'Hello' },
|
|
135
|
+
{ role: 'assistant', content: 'Hi there!' },
|
|
136
|
+
];
|
|
137
|
+
session.usage = { inputTokens: 100, outputTokens: 50, totalTokens: 150 };
|
|
138
|
+
await mgr.persist(session);
|
|
139
|
+
// Destroy and resume
|
|
140
|
+
await mgr.destroy(session.id);
|
|
141
|
+
expect(mgr.has(session.id)).toBe(false);
|
|
142
|
+
const resumed = await mgr.resume(session.id, makeCreateOpts({
|
|
143
|
+
systemPrompt: 'Updated system prompt',
|
|
144
|
+
}));
|
|
145
|
+
expect(resumed).not.toBeNull();
|
|
146
|
+
expect(resumed.id).toBe(session.id);
|
|
147
|
+
expect(resumed.messages).toHaveLength(2);
|
|
148
|
+
expect(resumed.usage.totalTokens).toBe(150);
|
|
149
|
+
// System prompt should be fresh, not stale
|
|
150
|
+
expect(resumed.systemPrompt).toBe('Updated system prompt');
|
|
151
|
+
});
|
|
152
|
+
it('resume returns null for missing session', async () => {
|
|
153
|
+
const mgr = new StandaloneSessionManager({ logger, store });
|
|
154
|
+
const result = await mgr.resume('nonexistent', makeCreateOpts());
|
|
155
|
+
expect(result).toBeNull();
|
|
156
|
+
});
|
|
157
|
+
it('version field is present on persisted sessions', async () => {
|
|
158
|
+
const mgr = new StandaloneSessionManager({ logger, store });
|
|
159
|
+
const session = mgr.create(makeCreateOpts());
|
|
160
|
+
await mgr.persist(session);
|
|
161
|
+
const persisted = await store.load(session.id);
|
|
162
|
+
expect(persisted.version).toBe(1);
|
|
163
|
+
});
|
|
164
|
+
it('deduplicates concurrent resume calls for the same session ID', async () => {
|
|
165
|
+
const mgr = new StandaloneSessionManager({ logger, store });
|
|
166
|
+
const session = mgr.create(makeCreateOpts());
|
|
167
|
+
session.messages = [{ role: 'user', content: 'test' }];
|
|
168
|
+
await mgr.persist(session);
|
|
169
|
+
await mgr.destroy(session.id);
|
|
170
|
+
// Spy on store.load to verify it's called once
|
|
171
|
+
const loadSpy = vi.spyOn(store, 'load');
|
|
172
|
+
// Fire two concurrent resumes for the same session
|
|
173
|
+
const opts = makeCreateOpts({ systemPrompt: 'fresh' });
|
|
174
|
+
const [result1, result2] = await Promise.all([
|
|
175
|
+
mgr.resume(session.id, opts),
|
|
176
|
+
mgr.resume(session.id, opts),
|
|
177
|
+
]);
|
|
178
|
+
// Both should resolve to the same session (same ID)
|
|
179
|
+
expect(result1).not.toBeNull();
|
|
180
|
+
expect(result2).not.toBeNull();
|
|
181
|
+
expect(result1.id).toBe(session.id);
|
|
182
|
+
expect(result2.id).toBe(session.id);
|
|
183
|
+
// Store should only be hit once (deduplication)
|
|
184
|
+
expect(loadSpy).toHaveBeenCalledTimes(1);
|
|
185
|
+
loadSpy.mockRestore();
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
describe('list persisted', () => {
|
|
189
|
+
it('lists persisted sessions newest first', async () => {
|
|
190
|
+
const mgr = new StandaloneSessionManager({ logger, store });
|
|
191
|
+
const s1 = mgr.create(makeCreateOpts());
|
|
192
|
+
const s2 = mgr.create(makeCreateOpts());
|
|
193
|
+
await mgr.persist(s1);
|
|
194
|
+
await mgr.persist(s2);
|
|
195
|
+
const list = await mgr.listPersisted();
|
|
196
|
+
// Should include at least the two we just persisted
|
|
197
|
+
const ids = list.map((s) => s.id);
|
|
198
|
+
expect(ids).toContain(s1.id);
|
|
199
|
+
expect(ids).toContain(s2.id);
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
describe('destroy', () => {
|
|
203
|
+
it('removes session from memory', async () => {
|
|
204
|
+
const mgr = new StandaloneSessionManager({ logger, store });
|
|
205
|
+
const session = mgr.create(makeCreateOpts());
|
|
206
|
+
await mgr.destroy(session.id);
|
|
207
|
+
expect(mgr.has(session.id)).toBe(false);
|
|
208
|
+
expect(mgr.size).toBe(0);
|
|
209
|
+
});
|
|
210
|
+
it('optionally deletes from store', async () => {
|
|
211
|
+
const mgr = new StandaloneSessionManager({ logger, store });
|
|
212
|
+
const session = mgr.create(makeCreateOpts());
|
|
213
|
+
await mgr.persist(session);
|
|
214
|
+
await mgr.destroy(session.id, { deleteFromStore: true });
|
|
215
|
+
const loaded = await store.load(session.id);
|
|
216
|
+
expect(loaded).toBeNull();
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
describe('cleanup', () => {
|
|
220
|
+
it('destroys sessions idle beyond TTL', async () => {
|
|
221
|
+
const mgr = new StandaloneSessionManager({ logger, store, ttlMs: 1 });
|
|
222
|
+
const session = mgr.create(makeCreateOpts());
|
|
223
|
+
// Force old lastAccessedAt
|
|
224
|
+
session.lastAccessedAt = Date.now() - 1000;
|
|
225
|
+
const destroyed = await mgr.cleanup();
|
|
226
|
+
expect(destroyed).toBeGreaterThanOrEqual(1);
|
|
227
|
+
expect(mgr.has(session.id)).toBe(false);
|
|
228
|
+
});
|
|
229
|
+
it('does not destroy recently accessed sessions', async () => {
|
|
230
|
+
const mgr = new StandaloneSessionManager({ logger, store, ttlMs: 60_000 });
|
|
231
|
+
const session = mgr.create(makeCreateOpts());
|
|
232
|
+
const destroyed = await mgr.cleanup();
|
|
233
|
+
expect(destroyed).toBe(0);
|
|
234
|
+
expect(mgr.has(session.id)).toBe(true);
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
describe('shutdown', () => {
|
|
238
|
+
it('destroys all sessions and closes store', async () => {
|
|
239
|
+
const shutdownStore = await createPGLiteSessionStore({ logger });
|
|
240
|
+
const mgr = new StandaloneSessionManager({ logger, store: shutdownStore });
|
|
241
|
+
mgr.start();
|
|
242
|
+
mgr.create(makeCreateOpts());
|
|
243
|
+
mgr.create(makeCreateOpts());
|
|
244
|
+
expect(mgr.size).toBe(2);
|
|
245
|
+
await mgr.shutdown();
|
|
246
|
+
expect(mgr.size).toBe(0);
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
describe('runMessage', () => {
|
|
250
|
+
it('executes a message through the agent loop and yields SSE events', async () => {
|
|
251
|
+
const mgr = new StandaloneSessionManager({ logger, store });
|
|
252
|
+
const session = mgr.create(makeCreateOpts({
|
|
253
|
+
provider: streamingProvider('Hello from the agent!'),
|
|
254
|
+
}));
|
|
255
|
+
const events = [];
|
|
256
|
+
for await (const event of mgr.runMessage(session.id, 'Hi there')) {
|
|
257
|
+
events.push(event);
|
|
258
|
+
}
|
|
259
|
+
// Should have init, text delta, and done events
|
|
260
|
+
const types = events.map((e) => e.type);
|
|
261
|
+
expect(types).toContain(SSEEventType.Init);
|
|
262
|
+
expect(types).toContain(SSEEventType.TextDelta);
|
|
263
|
+
expect(types).toContain(SSEEventType.Done);
|
|
264
|
+
});
|
|
265
|
+
it('persists session after execution', async () => {
|
|
266
|
+
const mgr = new StandaloneSessionManager({ logger, store });
|
|
267
|
+
const session = mgr.create(makeCreateOpts({
|
|
268
|
+
provider: streamingProvider('Persisted response'),
|
|
269
|
+
}));
|
|
270
|
+
// Drain the generator
|
|
271
|
+
for await (const _event of mgr.runMessage(session.id, 'Save me')) {
|
|
272
|
+
// consume
|
|
273
|
+
}
|
|
274
|
+
// Session should be persisted
|
|
275
|
+
const persisted = await store.load(session.id);
|
|
276
|
+
expect(persisted).not.toBeNull();
|
|
277
|
+
expect(persisted.messages.length).toBeGreaterThan(0);
|
|
278
|
+
});
|
|
279
|
+
it('fires onUsage callback with token counts', async () => {
|
|
280
|
+
const usageEvents = [];
|
|
281
|
+
const mgr = new StandaloneSessionManager({ logger, store });
|
|
282
|
+
const session = mgr.create(makeCreateOpts({
|
|
283
|
+
provider: streamingProvider('Usage test'),
|
|
284
|
+
}));
|
|
285
|
+
for await (const _event of mgr.runMessage(session.id, 'Count tokens', {
|
|
286
|
+
onUsage: (usage) => usageEvents.push(usage),
|
|
287
|
+
})) {
|
|
288
|
+
// consume
|
|
289
|
+
}
|
|
290
|
+
expect(usageEvents.length).toBe(1);
|
|
291
|
+
expect(usageEvents[0].inputTokens).toBe(10);
|
|
292
|
+
expect(usageEvents[0].outputTokens).toBe(5);
|
|
293
|
+
expect(usageEvents[0].turnNumber).toBe(1);
|
|
294
|
+
});
|
|
295
|
+
it('syncs messages back to session after execution', async () => {
|
|
296
|
+
const mgr = new StandaloneSessionManager({ logger, store });
|
|
297
|
+
const session = mgr.create(makeCreateOpts({
|
|
298
|
+
provider: streamingProvider('Response text'),
|
|
299
|
+
}));
|
|
300
|
+
expect(session.messages).toHaveLength(0);
|
|
301
|
+
for await (const _event of mgr.runMessage(session.id, 'Hello')) {
|
|
302
|
+
// consume
|
|
303
|
+
}
|
|
304
|
+
// Should have user + assistant messages
|
|
305
|
+
expect(session.messages.length).toBeGreaterThanOrEqual(2);
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
});
|
|
309
|
+
//# sourceMappingURL=manager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.test.js","sourceRoot":"","sources":["../../../src/session/manager.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import type { Logger } from '../logger.js';
|
|
7
|
+
import { DrizzleSessionStore } from './drizzle-session-store.js';
|
|
8
|
+
import type { SessionStoreHooks } from './store.js';
|
|
9
|
+
export interface PGLiteSessionStoreOptions {
|
|
10
|
+
/** Data directory for PGLite. If unset, runs fully in-memory. */
|
|
11
|
+
dataDir?: string;
|
|
12
|
+
/** Logger. Defaults to the runtime's global logger. */
|
|
13
|
+
logger?: Logger;
|
|
14
|
+
/** Optional hooks for dual-write / observability. */
|
|
15
|
+
hooks?: SessionStoreHooks;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Create and initialize a PGLite-backed session store.
|
|
19
|
+
*
|
|
20
|
+
* Returns a `DrizzleSessionStore` whose `close()` will close the
|
|
21
|
+
* underlying PGLite instance.
|
|
22
|
+
*/
|
|
23
|
+
export declare function createPGLiteSessionStore(opts?: PGLiteSessionStoreOptions): Promise<DrizzleSessionStore>;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* PGLite factory for the session store.
|
|
8
|
+
*
|
|
9
|
+
* Opens an in-process WASM Postgres (PGLite), runs idempotent DDL,
|
|
10
|
+
* and returns a `DrizzleSessionStore` wired to it. Thin factory —
|
|
11
|
+
* all query logic lives in DrizzleSessionStore.
|
|
12
|
+
*
|
|
13
|
+
* Default choice for `amodal dev`: zero config, no Docker, no DB to
|
|
14
|
+
* manage. Pair with `createPostgresSessionStore` for hosted runtime
|
|
15
|
+
* or ISV production deployments.
|
|
16
|
+
*/
|
|
17
|
+
import { drizzle } from 'drizzle-orm/pglite';
|
|
18
|
+
import { agentSessions } from '../stores/schema.js';
|
|
19
|
+
import { log as defaultLogger } from '../logger.js';
|
|
20
|
+
import { DrizzleSessionStore } from './drizzle-session-store.js';
|
|
21
|
+
const BACKEND_NAME = 'pglite';
|
|
22
|
+
// Must match the Drizzle schema in ../stores/schema.ts exactly.
|
|
23
|
+
const CREATE_TABLE_DDL = `
|
|
24
|
+
CREATE TABLE IF NOT EXISTS agent_sessions (
|
|
25
|
+
id TEXT PRIMARY KEY,
|
|
26
|
+
messages JSONB NOT NULL,
|
|
27
|
+
token_usage JSONB NOT NULL,
|
|
28
|
+
metadata JSONB DEFAULT '{}',
|
|
29
|
+
version INTEGER NOT NULL DEFAULT 1,
|
|
30
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
31
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
CREATE INDEX IF NOT EXISTS idx_agent_sessions_updated
|
|
35
|
+
ON agent_sessions (updated_at DESC);
|
|
36
|
+
`;
|
|
37
|
+
/**
|
|
38
|
+
* Create and initialize a PGLite-backed session store.
|
|
39
|
+
*
|
|
40
|
+
* Returns a `DrizzleSessionStore` whose `close()` will close the
|
|
41
|
+
* underlying PGLite instance.
|
|
42
|
+
*/
|
|
43
|
+
export async function createPGLiteSessionStore(opts = {}) {
|
|
44
|
+
const logger = opts.logger ?? defaultLogger;
|
|
45
|
+
if (opts.dataDir) {
|
|
46
|
+
const { mkdirSync } = await import('node:fs');
|
|
47
|
+
mkdirSync(opts.dataDir, { recursive: true });
|
|
48
|
+
}
|
|
49
|
+
// Dynamic import keeps PGLite lazy — Postgres-only deployments don't
|
|
50
|
+
// need to pay the WASM parsing cost.
|
|
51
|
+
const { PGlite } = await import('@electric-sql/pglite');
|
|
52
|
+
const pglite = new PGlite(opts.dataDir ?? undefined);
|
|
53
|
+
await pglite.exec(CREATE_TABLE_DDL);
|
|
54
|
+
const db = drizzle(pglite);
|
|
55
|
+
logger.info('session_store_initialized', {
|
|
56
|
+
backend: BACKEND_NAME,
|
|
57
|
+
dataDir: opts.dataDir ?? 'in-memory',
|
|
58
|
+
});
|
|
59
|
+
return new DrizzleSessionStore({
|
|
60
|
+
db,
|
|
61
|
+
table: agentSessions,
|
|
62
|
+
backendName: BACKEND_NAME,
|
|
63
|
+
logger,
|
|
64
|
+
hooks: opts.hooks,
|
|
65
|
+
onClose: async () => {
|
|
66
|
+
await pglite.close();
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=pglite-session-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pglite-session-store.js","sourceRoot":"","sources":["../../../src/session/pglite-session-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;GAUG;AAEH,OAAO,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAC,GAAG,IAAI,aAAa,EAAC,MAAM,cAAc,CAAC;AAElD,OAAO,EAAC,mBAAmB,EAAC,MAAM,4BAA4B,CAAC;AAG/D,MAAM,YAAY,GAAG,QAAQ,CAAC;AAE9B,gEAAgE;AAChE,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;CAaxB,CAAC;AAWF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAkC,EAAE;IAEpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC;IAE5C,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,EAAC,SAAS,EAAC,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QAC5C,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;IAC7C,CAAC;IAED,qEAAqE;IACrE,qCAAqC;IACrC,MAAM,EAAC,MAAM,EAAC,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC;IACrD,MAAM,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAEpC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE3B,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE;QACvC,OAAO,EAAE,YAAY;QACrB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,WAAW;KACrC,CAAC,CAAC;IAEH,OAAO,IAAI,mBAAmB,CAAC;QAC7B,EAAE;QACF,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,YAAY;QACzB,MAAM;QACN,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import type { Pool } from 'pg';
|
|
7
|
+
import type { Logger } from '../logger.js';
|
|
8
|
+
import { DrizzleSessionStore } from './drizzle-session-store.js';
|
|
9
|
+
import type { SessionStoreHooks } from './store.js';
|
|
10
|
+
export interface PostgresSessionStoreOptions {
|
|
11
|
+
/** Postgres connection string. Required if `pool` is not provided. */
|
|
12
|
+
connectionString?: string;
|
|
13
|
+
/** Existing pg.Pool to reuse instead of opening a new one. */
|
|
14
|
+
pool?: Pool;
|
|
15
|
+
/** Pool size when opening a new pool (default 10). Ignored if `pool` is passed. */
|
|
16
|
+
max?: number;
|
|
17
|
+
/** Per-statement timeout in ms (default 30_000). Ignored if `pool` is passed. */
|
|
18
|
+
statementTimeoutMs?: number;
|
|
19
|
+
/**
|
|
20
|
+
* Custom table name (default `agent_sessions`). Lets consumers run
|
|
21
|
+
* this store in a DB that already uses that name for something else.
|
|
22
|
+
*/
|
|
23
|
+
tableName?: string;
|
|
24
|
+
/** Logger. Defaults to the runtime's global logger. */
|
|
25
|
+
logger?: Logger;
|
|
26
|
+
/** Optional hooks for dual-write / observability. */
|
|
27
|
+
hooks?: SessionStoreHooks;
|
|
28
|
+
/**
|
|
29
|
+
* When true, `close()` will not `pool.end()` — use when the caller
|
|
30
|
+
* owns the pool lifecycle. Defaults to true iff `pool` was passed
|
|
31
|
+
* (caller-owned), false otherwise (store-owned).
|
|
32
|
+
*/
|
|
33
|
+
ownsPool?: boolean;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Create and initialize a Postgres-backed session store.
|
|
37
|
+
*
|
|
38
|
+
* Accepts either a connection string (shorthand) or full options
|
|
39
|
+
* object. Validates `tableName` at construct time, opens (or adopts)
|
|
40
|
+
* a `pg.Pool`, runs idempotent DDL, and returns a DrizzleSessionStore.
|
|
41
|
+
* The returned store's `close()` will `pool.end()` unless
|
|
42
|
+
* `ownsPool: false` (set automatically when a pool is passed in).
|
|
43
|
+
*/
|
|
44
|
+
export declare function createPostgresSessionStore(optsOrUrl: PostgresSessionStoreOptions | string): Promise<DrizzleSessionStore>;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Postgres factory for the session store.
|
|
8
|
+
*
|
|
9
|
+
* Opens a `pg.Pool` (or reuses one passed in), runs idempotent DDL,
|
|
10
|
+
* and returns a `DrizzleSessionStore` wired to it. Thin factory —
|
|
11
|
+
* all query logic lives in DrizzleSessionStore.
|
|
12
|
+
*
|
|
13
|
+
* For hosted runtime and ISV production deployments. Pair with
|
|
14
|
+
* `createPGLiteSessionStore` for `amodal dev`.
|
|
15
|
+
*/
|
|
16
|
+
import { drizzle } from 'drizzle-orm/node-postgres';
|
|
17
|
+
import { pgTable, text, integer, jsonb, timestamp } from 'drizzle-orm/pg-core';
|
|
18
|
+
import { log as defaultLogger } from '../logger.js';
|
|
19
|
+
import { SessionStoreError } from '../errors.js';
|
|
20
|
+
import { DrizzleSessionStore } from './drizzle-session-store.js';
|
|
21
|
+
const BACKEND_NAME = 'postgres';
|
|
22
|
+
const DEFAULT_STATEMENT_TIMEOUT_MS = 30_000;
|
|
23
|
+
const DEFAULT_POOL_MAX = 10;
|
|
24
|
+
const DEFAULT_TABLE_NAME = 'agent_sessions';
|
|
25
|
+
// Reject table names that could be used for SQL injection. The name
|
|
26
|
+
// is interpolated into DDL so strict validation is mandatory.
|
|
27
|
+
const SAFE_TABLE_NAME_RE = /^[a-zA-Z_][a-zA-Z0-9_]{0,62}$/;
|
|
28
|
+
function validateTableName(name) {
|
|
29
|
+
if (!SAFE_TABLE_NAME_RE.test(name)) {
|
|
30
|
+
throw new SessionStoreError(`Invalid table name: ${JSON.stringify(name)}`, {
|
|
31
|
+
backend: BACKEND_NAME,
|
|
32
|
+
operation: 'construct',
|
|
33
|
+
context: { tableName: name, expected: 'identifier: letters, digits, underscore' },
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Build a Drizzle table binding for a given table name. Columns match
|
|
39
|
+
* the static `agentSessions` schema exactly; only the SQL table name
|
|
40
|
+
* differs. The return is cast to `AgentSessionsTable` (the type alias
|
|
41
|
+
* for `typeof agentSessions`) because the column shape is identical —
|
|
42
|
+
* Drizzle's inferred generic differs only in the `name` literal.
|
|
43
|
+
*/
|
|
44
|
+
function makeAgentSessionsTable(name) {
|
|
45
|
+
const t = pgTable(name, {
|
|
46
|
+
id: text('id').primaryKey(),
|
|
47
|
+
messages: jsonb('messages').notNull().$type(),
|
|
48
|
+
tokenUsage: jsonb('token_usage').notNull().$type(),
|
|
49
|
+
metadata: jsonb('metadata').default({}).$type(),
|
|
50
|
+
version: integer('version').notNull().default(1),
|
|
51
|
+
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
52
|
+
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
|
|
53
|
+
});
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- dynamic-name table has identical column shape as the static `agentSessions`; only the `name` generic parameter differs
|
|
55
|
+
return t;
|
|
56
|
+
}
|
|
57
|
+
function buildDdl(tableName) {
|
|
58
|
+
return `
|
|
59
|
+
CREATE TABLE IF NOT EXISTS ${tableName} (
|
|
60
|
+
id TEXT PRIMARY KEY,
|
|
61
|
+
messages JSONB NOT NULL,
|
|
62
|
+
token_usage JSONB NOT NULL,
|
|
63
|
+
metadata JSONB DEFAULT '{}',
|
|
64
|
+
version INTEGER NOT NULL DEFAULT 1,
|
|
65
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
66
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
CREATE INDEX IF NOT EXISTS idx_${tableName}_updated
|
|
70
|
+
ON ${tableName} (updated_at DESC);
|
|
71
|
+
`;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Create and initialize a Postgres-backed session store.
|
|
75
|
+
*
|
|
76
|
+
* Accepts either a connection string (shorthand) or full options
|
|
77
|
+
* object. Validates `tableName` at construct time, opens (or adopts)
|
|
78
|
+
* a `pg.Pool`, runs idempotent DDL, and returns a DrizzleSessionStore.
|
|
79
|
+
* The returned store's `close()` will `pool.end()` unless
|
|
80
|
+
* `ownsPool: false` (set automatically when a pool is passed in).
|
|
81
|
+
*/
|
|
82
|
+
export async function createPostgresSessionStore(optsOrUrl) {
|
|
83
|
+
const opts = typeof optsOrUrl === 'string' ? { connectionString: optsOrUrl } : optsOrUrl;
|
|
84
|
+
if (!opts.connectionString && !opts.pool) {
|
|
85
|
+
throw new SessionStoreError('createPostgresSessionStore requires either connectionString or pool', { backend: BACKEND_NAME, operation: 'construct' });
|
|
86
|
+
}
|
|
87
|
+
const logger = opts.logger ?? defaultLogger;
|
|
88
|
+
const tableName = opts.tableName ?? DEFAULT_TABLE_NAME;
|
|
89
|
+
validateTableName(tableName);
|
|
90
|
+
const table = makeAgentSessionsTable(tableName);
|
|
91
|
+
const ownsPool = opts.ownsPool ?? !opts.pool;
|
|
92
|
+
let pool;
|
|
93
|
+
if (opts.pool) {
|
|
94
|
+
pool = opts.pool;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
// Dynamic import so `pg` stays an optional peer at the package
|
|
98
|
+
// level — PGLite users don't need it installed.
|
|
99
|
+
const pg = await import('pg');
|
|
100
|
+
const { Pool: PgPool } = pg.default ?? pg;
|
|
101
|
+
pool = new PgPool({
|
|
102
|
+
connectionString: opts.connectionString,
|
|
103
|
+
max: opts.max ?? DEFAULT_POOL_MAX,
|
|
104
|
+
statement_timeout: opts.statementTimeoutMs ?? DEFAULT_STATEMENT_TIMEOUT_MS,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
await pool.query(buildDdl(tableName));
|
|
109
|
+
}
|
|
110
|
+
catch (cause) {
|
|
111
|
+
throw new SessionStoreError('Failed to create session table', {
|
|
112
|
+
backend: BACKEND_NAME,
|
|
113
|
+
operation: 'initialize',
|
|
114
|
+
cause,
|
|
115
|
+
context: { tableName },
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
const db = drizzle(pool);
|
|
119
|
+
logger.info('session_store_initialized', {
|
|
120
|
+
backend: BACKEND_NAME,
|
|
121
|
+
tableName,
|
|
122
|
+
poolMax: opts.max ?? DEFAULT_POOL_MAX,
|
|
123
|
+
statementTimeoutMs: opts.statementTimeoutMs ?? DEFAULT_STATEMENT_TIMEOUT_MS,
|
|
124
|
+
ownsPool,
|
|
125
|
+
});
|
|
126
|
+
return new DrizzleSessionStore({
|
|
127
|
+
db,
|
|
128
|
+
table,
|
|
129
|
+
backendName: BACKEND_NAME,
|
|
130
|
+
logger,
|
|
131
|
+
hooks: opts.hooks,
|
|
132
|
+
onClose: async () => {
|
|
133
|
+
if (ownsPool)
|
|
134
|
+
await pool.end();
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=postgres-session-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-session-store.js","sourceRoot":"","sources":["../../../src/session/postgres-session-store.ts"],"names":[],"mappings":"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"}
|