@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,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Session types for the standalone session manager.
|
|
8
|
+
*/
|
|
9
|
+
import type { ModelMessage } from 'ai';
|
|
10
|
+
import type { RuntimeEventPayload } from '@amodalai/types';
|
|
11
|
+
import type { TokenUsage, LLMProvider } from '../providers/types.js';
|
|
12
|
+
import type { ToolRegistry, ToolContext } from '../tools/types.js';
|
|
13
|
+
import type { PermissionChecker } from '../security/permission-checker.js';
|
|
14
|
+
import type { Logger } from '../logger.js';
|
|
15
|
+
/** Minimal event bus surface the session manager needs. */
|
|
16
|
+
export interface SessionEventBus {
|
|
17
|
+
emit: (payload: RuntimeEventPayload) => unknown;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Token usage for a single turn (one LLM call + tool executions).
|
|
21
|
+
* Reported via the `onUsage` callback on AgentContext.
|
|
22
|
+
*/
|
|
23
|
+
export interface TurnUsage {
|
|
24
|
+
inputTokens: number;
|
|
25
|
+
outputTokens: number;
|
|
26
|
+
cachedInputTokens: number;
|
|
27
|
+
cacheCreationInputTokens: number;
|
|
28
|
+
totalTokens: number;
|
|
29
|
+
turnNumber: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Full automation configuration from the agent repo.
|
|
33
|
+
*
|
|
34
|
+
* All fields are defined here. Only `schedule`, `prompt`, and `enabled`
|
|
35
|
+
* are currently implemented. The parser reads and validates the full
|
|
36
|
+
* schema; unimplemented fields are stored but ignored, so when future
|
|
37
|
+
* features ship the config is already parsed.
|
|
38
|
+
*/
|
|
39
|
+
export interface AutomationConfig {
|
|
40
|
+
name: string;
|
|
41
|
+
description?: string;
|
|
42
|
+
/** Cron expression */
|
|
43
|
+
schedule: string;
|
|
44
|
+
/** IANA timezone (default: UTC) */
|
|
45
|
+
timezone?: string;
|
|
46
|
+
prompt: string;
|
|
47
|
+
/** LLM model override (default: primary model) */
|
|
48
|
+
model?: string;
|
|
49
|
+
/** Max turns per run (default: 15) */
|
|
50
|
+
maxTurns?: number;
|
|
51
|
+
/** Max tokens per run */
|
|
52
|
+
budget?: number;
|
|
53
|
+
/** Delivery routing — parsed now, implemented in roadmap 3.1 */
|
|
54
|
+
delivery?: {
|
|
55
|
+
on: 'completion' | 'new_results';
|
|
56
|
+
targets: Array<{
|
|
57
|
+
type: 'webhook' | 'callback';
|
|
58
|
+
url?: string;
|
|
59
|
+
}>;
|
|
60
|
+
template?: string;
|
|
61
|
+
};
|
|
62
|
+
/** Failure alerting — parsed now, implemented in roadmap 3.1 */
|
|
63
|
+
failureAlert?: {
|
|
64
|
+
after: number;
|
|
65
|
+
targets: Array<{
|
|
66
|
+
type: 'webhook' | 'callback';
|
|
67
|
+
url?: string;
|
|
68
|
+
}>;
|
|
69
|
+
cooldownMinutes?: number;
|
|
70
|
+
};
|
|
71
|
+
enabled: boolean;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Result of an automation run (returned to onAutomationResult hook).
|
|
75
|
+
*/
|
|
76
|
+
export interface AutomationResult {
|
|
77
|
+
automation: string;
|
|
78
|
+
response: string;
|
|
79
|
+
toolCalls: Array<{
|
|
80
|
+
toolName: string;
|
|
81
|
+
toolId: string;
|
|
82
|
+
status: 'success' | 'error';
|
|
83
|
+
durationMs?: number;
|
|
84
|
+
}>;
|
|
85
|
+
outputSent: boolean;
|
|
86
|
+
durationMs: number;
|
|
87
|
+
usage: TokenUsage;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Shape of a persisted session record in the database.
|
|
91
|
+
* Versioned from day one so we can migrate the format later.
|
|
92
|
+
*/
|
|
93
|
+
export interface PersistedSession {
|
|
94
|
+
version: 1;
|
|
95
|
+
id: string;
|
|
96
|
+
messages: ModelMessage[];
|
|
97
|
+
tokenUsage: TokenUsage;
|
|
98
|
+
metadata: SessionMetadata;
|
|
99
|
+
createdAt: Date;
|
|
100
|
+
updatedAt: Date;
|
|
101
|
+
}
|
|
102
|
+
/** Metadata stored alongside a session. */
|
|
103
|
+
export interface SessionMetadata {
|
|
104
|
+
title?: string;
|
|
105
|
+
model?: string;
|
|
106
|
+
provider?: string;
|
|
107
|
+
appId?: string;
|
|
108
|
+
automationName?: string;
|
|
109
|
+
[key: string]: unknown;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* A live session managed by the standalone SessionManager.
|
|
113
|
+
*
|
|
114
|
+
* This is the runtime representation — it holds the components needed
|
|
115
|
+
* to execute messages via the agent loop. Separate from the persisted
|
|
116
|
+
* session which only holds serializable data.
|
|
117
|
+
*/
|
|
118
|
+
export interface Session {
|
|
119
|
+
id: string;
|
|
120
|
+
/** LLM provider for this session (pinned at creation) */
|
|
121
|
+
provider: LLMProvider;
|
|
122
|
+
/** Tool registry holding all available tools */
|
|
123
|
+
toolRegistry: ToolRegistry;
|
|
124
|
+
/** Permission checker for tool execution */
|
|
125
|
+
permissionChecker: PermissionChecker;
|
|
126
|
+
/** Logger scoped to this session */
|
|
127
|
+
logger: Logger;
|
|
128
|
+
/** Compiled system prompt */
|
|
129
|
+
systemPrompt: string;
|
|
130
|
+
/** Mutable: conversation messages */
|
|
131
|
+
messages: ModelMessage[];
|
|
132
|
+
/** Mutable: accumulated token usage */
|
|
133
|
+
usage: TokenUsage;
|
|
134
|
+
/** Model identifier (pinned at creation, survives resume) */
|
|
135
|
+
model: string;
|
|
136
|
+
/** Provider name (pinned at creation, survives resume) */
|
|
137
|
+
providerName: string;
|
|
138
|
+
/** User roles for permission checks and field guidance */
|
|
139
|
+
userRoles: string[];
|
|
140
|
+
/** App ID for multi-app isolation */
|
|
141
|
+
appId: string;
|
|
142
|
+
/** Session metadata (title, automation info, etc.) */
|
|
143
|
+
metadata: SessionMetadata;
|
|
144
|
+
/** Timestamps */
|
|
145
|
+
createdAt: number;
|
|
146
|
+
lastAccessedAt: number;
|
|
147
|
+
/** Max turns for the agent loop */
|
|
148
|
+
maxTurns: number;
|
|
149
|
+
/** Max context tokens (provider limit) */
|
|
150
|
+
maxContextTokens: number;
|
|
151
|
+
/** Optional total-token budget; loop stops with reason `budget_exceeded` */
|
|
152
|
+
maxSessionTokens?: number;
|
|
153
|
+
/** Tool context factory cached from session creation (avoids rebuilding per request) */
|
|
154
|
+
toolContextFactory?: (callId: string) => ToolContext;
|
|
155
|
+
}
|
|
156
|
+
/** Options for creating the standalone SessionManager. */
|
|
157
|
+
export interface SessionManagerOptions {
|
|
158
|
+
/** Session TTL in milliseconds (default: 30 minutes) */
|
|
159
|
+
ttlMs?: number;
|
|
160
|
+
/** Cleanup interval in milliseconds (default: 5 minutes) */
|
|
161
|
+
cleanupIntervalMs?: number;
|
|
162
|
+
/** Logger for the session manager itself */
|
|
163
|
+
logger: Logger;
|
|
164
|
+
/** Default max turns per session (default: 50) */
|
|
165
|
+
defaultMaxTurns?: number;
|
|
166
|
+
/** Default max context tokens (default: 200_000) */
|
|
167
|
+
defaultMaxContextTokens?: number;
|
|
168
|
+
/** Default token budget per session (default: undefined, no cap) */
|
|
169
|
+
defaultMaxSessionTokens?: number;
|
|
170
|
+
/** Optional event bus for emitting session lifecycle events */
|
|
171
|
+
eventBus?: SessionEventBus;
|
|
172
|
+
}
|
|
173
|
+
/** Options for creating a new session. */
|
|
174
|
+
export interface CreateSessionOptions {
|
|
175
|
+
provider: LLMProvider;
|
|
176
|
+
toolRegistry: ToolRegistry;
|
|
177
|
+
permissionChecker: PermissionChecker;
|
|
178
|
+
systemPrompt: string;
|
|
179
|
+
appId?: string;
|
|
180
|
+
metadata?: SessionMetadata;
|
|
181
|
+
maxTurns?: number;
|
|
182
|
+
maxContextTokens?: number;
|
|
183
|
+
/** Optional total-token budget; loop stops with `budget_exceeded` when reached */
|
|
184
|
+
maxSessionTokens?: number;
|
|
185
|
+
/** Optional: seed messages for resuming */
|
|
186
|
+
messages?: ModelMessage[];
|
|
187
|
+
/** Optional: seed token usage for resuming */
|
|
188
|
+
usage?: TokenUsage;
|
|
189
|
+
/** User roles for permission checks and field guidance */
|
|
190
|
+
userRoles?: string[];
|
|
191
|
+
/** Optional: onUsage callback fired after each turn */
|
|
192
|
+
onUsage?: (usage: TurnUsage) => void;
|
|
193
|
+
/** Optional: tool context factory to cache on the session */
|
|
194
|
+
toolContextFactory?: (callId: string) => ToolContext;
|
|
195
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/session/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import type { PgDatabase, PgQueryResultHKT } from 'drizzle-orm/pg-core';
|
|
7
|
+
import type { LoadedStore } from '@amodalai/core';
|
|
8
|
+
import type { StoreBackend, StoreDocument, StoreDocumentMeta, StorePutResult, StoreListOptions, StoreListResult } from '@amodalai/types';
|
|
9
|
+
import type { Logger } from '../logger.js';
|
|
10
|
+
type AnyPgDatabase = PgDatabase<PgQueryResultHKT, Record<string, unknown>>;
|
|
11
|
+
export interface DrizzleStoreBackendOptions {
|
|
12
|
+
db: AnyPgDatabase;
|
|
13
|
+
stores: LoadedStore[];
|
|
14
|
+
logger: Logger;
|
|
15
|
+
onClose: () => Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export declare class DrizzleStoreBackend implements StoreBackend {
|
|
18
|
+
private readonly db;
|
|
19
|
+
private readonly storeConfigs;
|
|
20
|
+
private readonly logger;
|
|
21
|
+
private readonly onClose;
|
|
22
|
+
private writeQueue;
|
|
23
|
+
private closed;
|
|
24
|
+
constructor(opts: DrizzleStoreBackendOptions);
|
|
25
|
+
/**
|
|
26
|
+
* StoreBackend.initialize() — no-op on this class. The concrete
|
|
27
|
+
* factory (createPGLiteStoreBackend / createPostgresStoreBackend)
|
|
28
|
+
* creates the db client and runs DDL before constructing this
|
|
29
|
+
* backend. Kept for interface compliance.
|
|
30
|
+
*/
|
|
31
|
+
initialize(_stores: LoadedStore[]): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Serialize write operations through a queue so that PGLite's
|
|
34
|
+
* single-threaded WASM engine never sees concurrent writes. Postgres
|
|
35
|
+
* doesn't need this strictly, but the overhead is negligible and the
|
|
36
|
+
* shared ordering semantics are valuable.
|
|
37
|
+
*/
|
|
38
|
+
private enqueue;
|
|
39
|
+
private ensureOpen;
|
|
40
|
+
get(appId: string, store: string, key: string): Promise<StoreDocument | null>;
|
|
41
|
+
put(appId: string, store: string, key: string, payload: Record<string, unknown>, meta: Partial<StoreDocumentMeta>): Promise<StorePutResult>;
|
|
42
|
+
list(appId: string, store: string, options?: StoreListOptions): Promise<StoreListResult>;
|
|
43
|
+
delete(appId: string, store: string, key: string): Promise<boolean>;
|
|
44
|
+
history(appId: string, store: string, key: string): Promise<StoreDocument[]>;
|
|
45
|
+
purgeExpired(appId: string, store?: string): Promise<number>;
|
|
46
|
+
close(): Promise<void>;
|
|
47
|
+
private rowToDocument;
|
|
48
|
+
}
|
|
49
|
+
export {};
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Shared Drizzle-ORM StoreBackend implementation.
|
|
8
|
+
*
|
|
9
|
+
* One query layer used by both PGLiteStoreBackend (local dev, in-process
|
|
10
|
+
* WASM Postgres) and PostgresStoreBackend (hosted runtime, real Postgres).
|
|
11
|
+
* Each concrete factory constructs the underlying db client and passes it
|
|
12
|
+
* here along with an `onClose` callback for teardown.
|
|
13
|
+
*
|
|
14
|
+
* Errors bubble up as StoreError — callers at module edges (routes,
|
|
15
|
+
* tool-context factory) are responsible for handling.
|
|
16
|
+
*/
|
|
17
|
+
import { sql, and, eq, lte, gt, isNull, or, desc, asc, count } from 'drizzle-orm';
|
|
18
|
+
import { storeDocuments, storeDocumentVersions } from './schema.js';
|
|
19
|
+
import { resolveTtl } from './ttl-resolver.js';
|
|
20
|
+
import { StoreError } from '../errors.js';
|
|
21
|
+
// Valid JSONB field identifier — alphanumerics and underscore only, must
|
|
22
|
+
// start with a letter or underscore. Used to guard filter/sort fields
|
|
23
|
+
// before interpolating into raw SQL via Drizzle's sql`` tag.
|
|
24
|
+
const FIELD_NAME_RE = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
25
|
+
export class DrizzleStoreBackend {
|
|
26
|
+
db;
|
|
27
|
+
storeConfigs;
|
|
28
|
+
logger;
|
|
29
|
+
onClose;
|
|
30
|
+
writeQueue = Promise.resolve();
|
|
31
|
+
closed = false;
|
|
32
|
+
constructor(opts) {
|
|
33
|
+
this.db = opts.db;
|
|
34
|
+
this.logger = opts.logger;
|
|
35
|
+
this.onClose = opts.onClose;
|
|
36
|
+
this.storeConfigs = new Map(opts.stores.map((s) => [s.name, s]));
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* StoreBackend.initialize() — no-op on this class. The concrete
|
|
40
|
+
* factory (createPGLiteStoreBackend / createPostgresStoreBackend)
|
|
41
|
+
* creates the db client and runs DDL before constructing this
|
|
42
|
+
* backend. Kept for interface compliance.
|
|
43
|
+
*/
|
|
44
|
+
async initialize(_stores) {
|
|
45
|
+
// Intentionally empty — initialization happens in the factories.
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Serialize write operations through a queue so that PGLite's
|
|
49
|
+
* single-threaded WASM engine never sees concurrent writes. Postgres
|
|
50
|
+
* doesn't need this strictly, but the overhead is negligible and the
|
|
51
|
+
* shared ordering semantics are valuable.
|
|
52
|
+
*/
|
|
53
|
+
enqueue(fn) {
|
|
54
|
+
const task = this.writeQueue.then(fn, fn);
|
|
55
|
+
this.writeQueue = task.then(() => { }, () => { });
|
|
56
|
+
return task;
|
|
57
|
+
}
|
|
58
|
+
ensureOpen(store, operation) {
|
|
59
|
+
if (this.closed) {
|
|
60
|
+
throw new StoreError('Store backend is closed', { store, operation });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async get(appId, store, key) {
|
|
64
|
+
this.ensureOpen(store, 'get');
|
|
65
|
+
try {
|
|
66
|
+
const rows = await this.db
|
|
67
|
+
.select()
|
|
68
|
+
.from(storeDocuments)
|
|
69
|
+
.where(and(eq(storeDocuments.appId, appId), eq(storeDocuments.store, store), eq(storeDocuments.key, key)))
|
|
70
|
+
.limit(1);
|
|
71
|
+
if (rows.length === 0)
|
|
72
|
+
return null;
|
|
73
|
+
return this.rowToDocument(rows[0]);
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
throw new StoreError('get failed', { store, operation: 'get', context: { appId, key }, cause: err });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async put(appId, store, key, payload, meta) {
|
|
80
|
+
this.ensureOpen(store, 'put');
|
|
81
|
+
return this.enqueue(async () => {
|
|
82
|
+
const storeConfig = this.storeConfigs.get(store);
|
|
83
|
+
const ttlSeconds = resolveTtl(storeConfig?.ttl, payload);
|
|
84
|
+
const maxVersions = storeConfig?.history?.versions;
|
|
85
|
+
const fullMeta = {
|
|
86
|
+
computedAt: new Date().toISOString(),
|
|
87
|
+
stale: false,
|
|
88
|
+
...meta,
|
|
89
|
+
ttl: ttlSeconds,
|
|
90
|
+
};
|
|
91
|
+
const expiresAt = ttlSeconds ? new Date(Date.now() + ttlSeconds * 1000) : null;
|
|
92
|
+
try {
|
|
93
|
+
const existing = await this.db
|
|
94
|
+
.select({
|
|
95
|
+
version: storeDocuments.version,
|
|
96
|
+
payload: storeDocuments.payload,
|
|
97
|
+
meta: storeDocuments.meta,
|
|
98
|
+
})
|
|
99
|
+
.from(storeDocuments)
|
|
100
|
+
.where(and(eq(storeDocuments.appId, appId), eq(storeDocuments.store, store), eq(storeDocuments.key, key)))
|
|
101
|
+
.limit(1);
|
|
102
|
+
if (existing.length > 0) {
|
|
103
|
+
const oldVersion = existing[0].version;
|
|
104
|
+
const newVersion = oldVersion + 1;
|
|
105
|
+
if (maxVersions && maxVersions > 0) {
|
|
106
|
+
await this.db.insert(storeDocumentVersions).values({
|
|
107
|
+
appId,
|
|
108
|
+
store,
|
|
109
|
+
key,
|
|
110
|
+
version: oldVersion,
|
|
111
|
+
payload: existing[0].payload,
|
|
112
|
+
meta: existing[0].meta,
|
|
113
|
+
});
|
|
114
|
+
// Trim history: keep only the most recent maxVersions rows.
|
|
115
|
+
await this.db.execute(sql `
|
|
116
|
+
DELETE FROM ${storeDocumentVersions}
|
|
117
|
+
WHERE ${storeDocumentVersions.appId} = ${appId}
|
|
118
|
+
AND ${storeDocumentVersions.store} = ${store}
|
|
119
|
+
AND ${storeDocumentVersions.key} = ${key}
|
|
120
|
+
AND ${storeDocumentVersions.version} <= (
|
|
121
|
+
SELECT COALESCE(MAX(${storeDocumentVersions.version}), 0) - ${maxVersions}
|
|
122
|
+
FROM ${storeDocumentVersions}
|
|
123
|
+
WHERE ${storeDocumentVersions.appId} = ${appId}
|
|
124
|
+
AND ${storeDocumentVersions.store} = ${store}
|
|
125
|
+
AND ${storeDocumentVersions.key} = ${key}
|
|
126
|
+
)
|
|
127
|
+
`);
|
|
128
|
+
}
|
|
129
|
+
await this.db
|
|
130
|
+
.update(storeDocuments)
|
|
131
|
+
.set({
|
|
132
|
+
version: newVersion,
|
|
133
|
+
payload,
|
|
134
|
+
meta: fullMeta,
|
|
135
|
+
expiresAt,
|
|
136
|
+
updatedAt: new Date(),
|
|
137
|
+
})
|
|
138
|
+
.where(and(eq(storeDocuments.appId, appId), eq(storeDocuments.store, store), eq(storeDocuments.key, key)));
|
|
139
|
+
return { stored: true, key, version: newVersion, previousVersion: oldVersion };
|
|
140
|
+
}
|
|
141
|
+
await this.db.insert(storeDocuments).values({
|
|
142
|
+
appId,
|
|
143
|
+
store,
|
|
144
|
+
key,
|
|
145
|
+
version: 1,
|
|
146
|
+
payload,
|
|
147
|
+
meta: fullMeta,
|
|
148
|
+
expiresAt,
|
|
149
|
+
});
|
|
150
|
+
return { stored: true, key, version: 1 };
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
throw new StoreError('put failed', { store, operation: 'put', context: { appId, key }, cause: err });
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
async list(appId, store, options = {}) {
|
|
158
|
+
this.ensureOpen(store, 'list');
|
|
159
|
+
const { filter, sort, limit = 100, offset = 0, includeStale = false } = options;
|
|
160
|
+
try {
|
|
161
|
+
const conds = [eq(storeDocuments.appId, appId), eq(storeDocuments.store, store)];
|
|
162
|
+
if (!includeStale) {
|
|
163
|
+
const staleCond = or(isNull(storeDocuments.expiresAt), gt(storeDocuments.expiresAt, new Date()));
|
|
164
|
+
if (staleCond)
|
|
165
|
+
conds.push(staleCond);
|
|
166
|
+
}
|
|
167
|
+
if (filter) {
|
|
168
|
+
for (const [field, value] of Object.entries(filter)) {
|
|
169
|
+
if (!FIELD_NAME_RE.test(field)) {
|
|
170
|
+
throw new StoreError(`Invalid store filter field name: ${field}`, {
|
|
171
|
+
store,
|
|
172
|
+
operation: 'list',
|
|
173
|
+
context: { field },
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
// `field` is regex-validated (safe to inline). `value` is bound as a parameter.
|
|
177
|
+
conds.push(sql `${storeDocuments.payload}->>${sql.raw(`'${field}'`)} = ${String(value)}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
const whereClause = and(...conds);
|
|
181
|
+
const totalRows = await this.db
|
|
182
|
+
.select({ total: count() })
|
|
183
|
+
.from(storeDocuments)
|
|
184
|
+
.where(whereClause);
|
|
185
|
+
const total = Number(totalRows[0]?.total ?? 0);
|
|
186
|
+
// If limit is 0, the caller only wants the count — skip the data fetch.
|
|
187
|
+
if (limit === 0) {
|
|
188
|
+
return { documents: [], total, hasMore: total > 0 };
|
|
189
|
+
}
|
|
190
|
+
let orderExpr;
|
|
191
|
+
if (sort) {
|
|
192
|
+
const descOrder = sort.startsWith('-');
|
|
193
|
+
const field = descOrder ? sort.slice(1) : sort;
|
|
194
|
+
if (!FIELD_NAME_RE.test(field)) {
|
|
195
|
+
throw new StoreError(`Invalid store sort field name: ${field}`, {
|
|
196
|
+
store,
|
|
197
|
+
operation: 'list',
|
|
198
|
+
context: { sort },
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
const fieldSql = sql `${storeDocuments.payload}->>${sql.raw(`'${field}'`)}`;
|
|
202
|
+
orderExpr = descOrder ? desc(fieldSql) : asc(fieldSql);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
orderExpr = desc(storeDocuments.updatedAt);
|
|
206
|
+
}
|
|
207
|
+
const rows = await this.db
|
|
208
|
+
.select()
|
|
209
|
+
.from(storeDocuments)
|
|
210
|
+
.where(whereClause)
|
|
211
|
+
.orderBy(orderExpr)
|
|
212
|
+
.limit(limit)
|
|
213
|
+
.offset(offset);
|
|
214
|
+
const documents = rows.map((r) => this.rowToDocument(r));
|
|
215
|
+
return { documents, total, hasMore: offset + documents.length < total };
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
if (err instanceof StoreError)
|
|
219
|
+
throw err;
|
|
220
|
+
throw new StoreError('list failed', { store, operation: 'list', context: { appId }, cause: err });
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
async delete(appId, store, key) {
|
|
224
|
+
this.ensureOpen(store, 'delete');
|
|
225
|
+
return this.enqueue(async () => {
|
|
226
|
+
try {
|
|
227
|
+
await this.db
|
|
228
|
+
.delete(storeDocumentVersions)
|
|
229
|
+
.where(and(eq(storeDocumentVersions.appId, appId), eq(storeDocumentVersions.store, store), eq(storeDocumentVersions.key, key)));
|
|
230
|
+
const deleted = await this.db
|
|
231
|
+
.delete(storeDocuments)
|
|
232
|
+
.where(and(eq(storeDocuments.appId, appId), eq(storeDocuments.store, store), eq(storeDocuments.key, key)))
|
|
233
|
+
.returning({ key: storeDocuments.key });
|
|
234
|
+
return deleted.length > 0;
|
|
235
|
+
}
|
|
236
|
+
catch (err) {
|
|
237
|
+
throw new StoreError('delete failed', { store, operation: 'delete', context: { appId, key }, cause: err });
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
async history(appId, store, key) {
|
|
242
|
+
this.ensureOpen(store, 'history');
|
|
243
|
+
try {
|
|
244
|
+
const rows = await this.db
|
|
245
|
+
.select()
|
|
246
|
+
.from(storeDocumentVersions)
|
|
247
|
+
.where(and(eq(storeDocumentVersions.appId, appId), eq(storeDocumentVersions.store, store), eq(storeDocumentVersions.key, key)))
|
|
248
|
+
.orderBy(desc(storeDocumentVersions.version));
|
|
249
|
+
return rows.map((r) => ({
|
|
250
|
+
key: r.key,
|
|
251
|
+
appId: r.appId,
|
|
252
|
+
store: r.store,
|
|
253
|
+
version: r.version,
|
|
254
|
+
payload: r.payload,
|
|
255
|
+
meta: r.meta,
|
|
256
|
+
}));
|
|
257
|
+
}
|
|
258
|
+
catch (err) {
|
|
259
|
+
throw new StoreError('history failed', { store, operation: 'history', context: { appId, key }, cause: err });
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
async purgeExpired(appId, store) {
|
|
263
|
+
this.ensureOpen(store ?? '(all)', 'purgeExpired');
|
|
264
|
+
return this.enqueue(async () => {
|
|
265
|
+
try {
|
|
266
|
+
const conds = [
|
|
267
|
+
eq(storeDocuments.appId, appId),
|
|
268
|
+
sql `${storeDocuments.expiresAt} IS NOT NULL`,
|
|
269
|
+
lte(storeDocuments.expiresAt, new Date()),
|
|
270
|
+
];
|
|
271
|
+
if (store)
|
|
272
|
+
conds.push(eq(storeDocuments.store, store));
|
|
273
|
+
const deleted = await this.db
|
|
274
|
+
.delete(storeDocuments)
|
|
275
|
+
.where(and(...conds))
|
|
276
|
+
.returning({ key: storeDocuments.key });
|
|
277
|
+
return deleted.length;
|
|
278
|
+
}
|
|
279
|
+
catch (err) {
|
|
280
|
+
throw new StoreError('purgeExpired failed', { store: store ?? '(all)', operation: 'purgeExpired', context: { appId }, cause: err });
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
async close() {
|
|
285
|
+
if (this.closed)
|
|
286
|
+
return;
|
|
287
|
+
this.closed = true;
|
|
288
|
+
// Wait for any in-flight writes to settle before closing the db.
|
|
289
|
+
await this.writeQueue.catch(() => { });
|
|
290
|
+
await this.onClose();
|
|
291
|
+
this.logger.debug('store_backend_closed', {});
|
|
292
|
+
}
|
|
293
|
+
rowToDocument(row) {
|
|
294
|
+
const isStale = row.expiresAt ? row.expiresAt <= new Date() : false;
|
|
295
|
+
const meta = { ...row.meta, stale: isStale };
|
|
296
|
+
return {
|
|
297
|
+
key: row.key,
|
|
298
|
+
appId: row.appId,
|
|
299
|
+
store: row.store,
|
|
300
|
+
version: row.version,
|
|
301
|
+
payload: row.payload,
|
|
302
|
+
meta,
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
//# sourceMappingURL=drizzle-store-backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drizzle-store-backend.js","sourceRoot":"","sources":["../../../src/stores/drizzle-store-backend.ts"],"names":[],"mappings":"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"}
|