@amodalai/runtime 0.2.0 → 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.
Files changed (209) hide show
  1. package/dist/src/__fixtures__/README.md +4 -0
  2. package/dist/src/__fixtures__/e2e.test.d.ts +6 -0
  3. package/dist/src/__fixtures__/e2e.test.js +211 -0
  4. package/dist/src/__fixtures__/e2e.test.js.map +1 -0
  5. package/dist/src/__fixtures__/smoke-agent/automations/delivery-callback-test.json +9 -0
  6. package/dist/src/__fixtures__/smoke-agent/connections/mock-mcp/spec.json +1 -1
  7. package/dist/src/__fixtures__/smoke.test.js +715 -29
  8. package/dist/src/__fixtures__/smoke.test.js.map +1 -1
  9. package/dist/src/__fixtures__/test-env.d.ts +27 -0
  10. package/dist/src/__fixtures__/test-env.js +64 -0
  11. package/dist/src/__fixtures__/test-env.js.map +1 -0
  12. package/dist/src/__fixtures__/test-helpers.d.ts +30 -0
  13. package/dist/src/__fixtures__/test-helpers.js +120 -0
  14. package/dist/src/__fixtures__/test-helpers.js.map +1 -0
  15. package/dist/src/agent/agent-types.d.ts +22 -0
  16. package/dist/src/agent/agent-types.js.map +1 -1
  17. package/dist/src/agent/automation-bridge.d.ts +9 -0
  18. package/dist/src/agent/automation-bridge.js +26 -0
  19. package/dist/src/agent/automation-bridge.js.map +1 -1
  20. package/dist/src/agent/automation-bridge.test.js +63 -0
  21. package/dist/src/agent/automation-bridge.test.js.map +1 -1
  22. package/dist/src/agent/local-server.d.ts +0 -7
  23. package/dist/src/agent/local-server.js +230 -86
  24. package/dist/src/agent/local-server.js.map +1 -1
  25. package/dist/src/agent/local-server.test.js +14 -8
  26. package/dist/src/agent/local-server.test.js.map +1 -1
  27. package/dist/src/agent/loop-types.d.ts +81 -2
  28. package/dist/src/agent/loop-types.js +4 -0
  29. package/dist/src/agent/loop-types.js.map +1 -1
  30. package/dist/src/agent/loop.js +16 -3
  31. package/dist/src/agent/loop.js.map +1 -1
  32. package/dist/src/agent/loop.test.js +572 -8
  33. package/dist/src/agent/loop.test.js.map +1 -1
  34. package/dist/src/agent/proactive/delivery-router.d.ts +68 -0
  35. package/dist/src/agent/proactive/delivery-router.js +337 -0
  36. package/dist/src/agent/proactive/delivery-router.js.map +1 -0
  37. package/dist/src/agent/proactive/delivery-router.test.d.ts +6 -0
  38. package/dist/src/agent/proactive/delivery-router.test.js +455 -0
  39. package/dist/src/agent/proactive/delivery-router.test.js.map +1 -0
  40. package/dist/src/agent/proactive/proactive-runner.d.ts +23 -1
  41. package/dist/src/agent/proactive/proactive-runner.js +42 -10
  42. package/dist/src/agent/proactive/proactive-runner.js.map +1 -1
  43. package/dist/src/agent/proactive/proactive-runner.test.js +0 -2
  44. package/dist/src/agent/proactive/proactive-runner.test.js.map +1 -1
  45. package/dist/src/agent/routes/admin-chat-abort.test.d.ts +6 -0
  46. package/dist/src/agent/routes/admin-chat-abort.test.js +206 -0
  47. package/dist/src/agent/routes/admin-chat-abort.test.js.map +1 -0
  48. package/dist/src/agent/routes/admin-chat.js +0 -2
  49. package/dist/src/agent/routes/admin-chat.js.map +1 -1
  50. package/dist/src/agent/routes/task.test.js +0 -2
  51. package/dist/src/agent/routes/task.test.js.map +1 -1
  52. package/dist/src/agent/snapshot-server.js +0 -2
  53. package/dist/src/agent/snapshot-server.js.map +1 -1
  54. package/dist/src/agent/states/compacting.js +5 -3
  55. package/dist/src/agent/states/compacting.js.map +1 -1
  56. package/dist/src/agent/states/confirming.js +3 -0
  57. package/dist/src/agent/states/confirming.js.map +1 -1
  58. package/dist/src/agent/states/dispatching.js +45 -1
  59. package/dist/src/agent/states/dispatching.js.map +1 -1
  60. package/dist/src/agent/states/executing.js +225 -81
  61. package/dist/src/agent/states/executing.js.map +1 -1
  62. package/dist/src/agent/states/streaming.js +14 -0
  63. package/dist/src/agent/states/streaming.js.map +1 -1
  64. package/dist/src/agent/states/thinking.d.ts +1 -1
  65. package/dist/src/agent/states/thinking.js +246 -29
  66. package/dist/src/agent/states/thinking.js.map +1 -1
  67. package/dist/src/agent/token-estimate.d.ts +20 -6
  68. package/dist/src/agent/token-estimate.js +24 -3
  69. package/dist/src/agent/token-estimate.js.map +1 -1
  70. package/dist/src/agent/token-estimate.test.d.ts +6 -0
  71. package/dist/src/agent/token-estimate.test.js +44 -0
  72. package/dist/src/agent/token-estimate.test.js.map +1 -0
  73. package/dist/src/api/create-agent.js +0 -3
  74. package/dist/src/api/create-agent.js.map +1 -1
  75. package/dist/src/api/types.d.ts +0 -2
  76. package/dist/src/env-ref.d.ts +13 -0
  77. package/dist/src/env-ref.js +31 -0
  78. package/dist/src/env-ref.js.map +1 -0
  79. package/dist/src/env-ref.test.d.ts +6 -0
  80. package/dist/src/env-ref.test.js +34 -0
  81. package/dist/src/env-ref.test.js.map +1 -0
  82. package/dist/src/errors.d.ts +15 -0
  83. package/dist/src/errors.js +22 -0
  84. package/dist/src/errors.js.map +1 -1
  85. package/dist/src/errors.test.js +2 -2
  86. package/dist/src/errors.test.js.map +1 -1
  87. package/dist/src/events/event-bus.d.ts +54 -0
  88. package/dist/src/events/event-bus.js +84 -0
  89. package/dist/src/events/event-bus.js.map +1 -0
  90. package/dist/src/events/event-bus.test.d.ts +6 -0
  91. package/dist/src/events/event-bus.test.js +112 -0
  92. package/dist/src/events/event-bus.test.js.map +1 -0
  93. package/dist/src/events/events-route.d.ts +36 -0
  94. package/dist/src/events/events-route.js +80 -0
  95. package/dist/src/events/events-route.js.map +1 -0
  96. package/dist/src/events/events-route.test.d.ts +6 -0
  97. package/dist/src/events/events-route.test.js +134 -0
  98. package/dist/src/events/events-route.test.js.map +1 -0
  99. package/dist/src/events/store-event-wrapper.d.ts +19 -0
  100. package/dist/src/events/store-event-wrapper.js +57 -0
  101. package/dist/src/events/store-event-wrapper.js.map +1 -0
  102. package/dist/src/events/store-event-wrapper.test.d.ts +6 -0
  103. package/dist/src/events/store-event-wrapper.test.js +91 -0
  104. package/dist/src/events/store-event-wrapper.test.js.map +1 -0
  105. package/dist/src/middleware/auth.d.ts +0 -2
  106. package/dist/src/middleware/auth.js.map +1 -1
  107. package/dist/src/providers/search-provider.d.ts +64 -0
  108. package/dist/src/providers/search-provider.js +174 -0
  109. package/dist/src/providers/search-provider.js.map +1 -0
  110. package/dist/src/providers/types.d.ts +8 -0
  111. package/dist/src/routes/ai-stream.d.ts +15 -0
  112. package/dist/src/routes/ai-stream.js +9 -0
  113. package/dist/src/routes/ai-stream.js.map +1 -1
  114. package/dist/src/routes/chat-stream.d.ts +6 -0
  115. package/dist/src/routes/chat-stream.js +2 -0
  116. package/dist/src/routes/chat-stream.js.map +1 -1
  117. package/dist/src/routes/chat.d.ts +6 -0
  118. package/dist/src/routes/chat.js +2 -0
  119. package/dist/src/routes/chat.js.map +1 -1
  120. package/dist/src/routes/session-resolver.d.ts +5 -0
  121. package/dist/src/routes/session-resolver.js +1 -15
  122. package/dist/src/routes/session-resolver.js.map +1 -1
  123. package/dist/src/routes/session-resolver.test.js +7 -6
  124. package/dist/src/routes/session-resolver.test.js.map +1 -1
  125. package/dist/src/server.d.ts +6 -0
  126. package/dist/src/server.js +2 -0
  127. package/dist/src/server.js.map +1 -1
  128. package/dist/src/session/drizzle-session-store.d.ts +56 -0
  129. package/dist/src/session/drizzle-session-store.js +203 -0
  130. package/dist/src/session/drizzle-session-store.js.map +1 -0
  131. package/dist/src/session/manager.d.ts +6 -3
  132. package/dist/src/session/manager.js +46 -16
  133. package/dist/src/session/manager.js.map +1 -1
  134. package/dist/src/session/manager.test.js +12 -18
  135. package/dist/src/session/manager.test.js.map +1 -1
  136. package/dist/src/session/pglite-session-store.d.ts +23 -0
  137. package/dist/src/session/pglite-session-store.js +70 -0
  138. package/dist/src/session/pglite-session-store.js.map +1 -0
  139. package/dist/src/session/postgres-session-store.d.ts +44 -0
  140. package/dist/src/session/postgres-session-store.js +138 -0
  141. package/dist/src/session/postgres-session-store.js.map +1 -0
  142. package/dist/src/session/session-builder.d.ts +0 -2
  143. package/dist/src/session/session-builder.js +22 -2
  144. package/dist/src/session/session-builder.js.map +1 -1
  145. package/dist/src/session/session-builder.test.js +0 -2
  146. package/dist/src/session/session-builder.test.js.map +1 -1
  147. package/dist/src/session/session-store-selector.d.ts +49 -0
  148. package/dist/src/session/session-store-selector.js +60 -0
  149. package/dist/src/session/session-store-selector.js.map +1 -0
  150. package/dist/src/session/session-store-selector.test.d.ts +6 -0
  151. package/dist/src/session/session-store-selector.test.js +79 -0
  152. package/dist/src/session/session-store-selector.test.js.map +1 -0
  153. package/dist/src/session/store.d.ts +146 -32
  154. package/dist/src/session/store.js +126 -138
  155. package/dist/src/session/store.js.map +1 -1
  156. package/dist/src/session/store.test.js +385 -107
  157. package/dist/src/session/store.test.js.map +1 -1
  158. package/dist/src/session/tool-context-factory.d.ts +3 -2
  159. package/dist/src/session/tool-context-factory.js +1 -2
  160. package/dist/src/session/tool-context-factory.js.map +1 -1
  161. package/dist/src/session/tool-context-factory.test.js +1 -4
  162. package/dist/src/session/tool-context-factory.test.js.map +1 -1
  163. package/dist/src/session/types.d.ts +13 -6
  164. package/dist/src/stores/schema.d.ts +0 -34
  165. package/dist/src/stores/schema.js +6 -4
  166. package/dist/src/stores/schema.js.map +1 -1
  167. package/dist/src/tools/admin-file-tools.d.ts +29 -0
  168. package/dist/src/tools/admin-file-tools.js +525 -11
  169. package/dist/src/tools/admin-file-tools.js.map +1 -1
  170. package/dist/src/tools/admin-file-tools.test.js +373 -4
  171. package/dist/src/tools/admin-file-tools.test.js.map +1 -1
  172. package/dist/src/tools/custom-tool-adapter.test.js +0 -1
  173. package/dist/src/tools/custom-tool-adapter.test.js.map +1 -1
  174. package/dist/src/tools/dispatch-tool.d.ts +4 -4
  175. package/dist/src/tools/fetch-url-tool.d.ts +23 -0
  176. package/dist/src/tools/fetch-url-tool.js +333 -0
  177. package/dist/src/tools/fetch-url-tool.js.map +1 -0
  178. package/dist/src/tools/fetch-url-tool.test.d.ts +6 -0
  179. package/dist/src/tools/fetch-url-tool.test.js +228 -0
  180. package/dist/src/tools/fetch-url-tool.test.js.map +1 -0
  181. package/dist/src/tools/mcp-tool-adapter.test.js +0 -1
  182. package/dist/src/tools/mcp-tool-adapter.test.js.map +1 -1
  183. package/dist/src/tools/registry.test.js +0 -1
  184. package/dist/src/tools/registry.test.js.map +1 -1
  185. package/dist/src/tools/request-tool.test.js +0 -1
  186. package/dist/src/tools/request-tool.test.js.map +1 -1
  187. package/dist/src/tools/store-tools.test.js +0 -1
  188. package/dist/src/tools/store-tools.test.js.map +1 -1
  189. package/dist/src/tools/types.d.ts +20 -2
  190. package/dist/src/tools/web-search-tool.d.ts +31 -0
  191. package/dist/src/tools/web-search-tool.js +170 -0
  192. package/dist/src/tools/web-search-tool.js.map +1 -0
  193. package/dist/src/tools/web-search-tool.test.d.ts +6 -0
  194. package/dist/src/tools/web-search-tool.test.js +153 -0
  195. package/dist/src/tools/web-search-tool.test.js.map +1 -0
  196. package/dist/src/tools/web-tools-shared.d.ts +21 -0
  197. package/dist/src/tools/web-tools-shared.js +32 -0
  198. package/dist/src/tools/web-tools-shared.js.map +1 -0
  199. package/dist/src/types.d.ts +20 -0
  200. package/dist/src/types.js +13 -0
  201. package/dist/src/types.js.map +1 -1
  202. package/dist/tsconfig.tsbuildinfo +1 -1
  203. package/package.json +17 -3
  204. package/dist/src/agent/session-store.d.ts +0 -71
  205. package/dist/src/agent/session-store.js +0 -151
  206. package/dist/src/agent/session-store.js.map +0 -1
  207. package/dist/src/session/admin-file-tools.d.ts +0 -136
  208. package/dist/src/session/admin-file-tools.js +0 -240
  209. package/dist/src/session/admin-file-tools.js.map +0 -1
@@ -4,20 +4,35 @@
4
4
  * SPDX-License-Identifier: MIT
5
5
  */
6
6
  /**
7
- * Tests for PGLiteSessionStore.
7
+ * Shared session-store tests.
8
8
  *
9
- * Uses a real in-memory PGLite instance no mocks.
9
+ * Runs the full behaviour matrix (save/load, upsert, pagination,
10
+ * metadata filters, hooks, cleanup) against the PGLite backend by
11
+ * default.
12
+ *
13
+ * A Postgres variant runs only when TEST_POSTGRES_URL is set — same
14
+ * opt-in pattern as `stores/drizzle-store-backend.test.ts`:
15
+ *
16
+ * TEST_POSTGRES_URL=postgres://postgres:postgres@localhost:5433/amodal_test pnpm test
17
+ *
18
+ * Tests that need cross-test isolation use a per-test `scope` string
19
+ * stamped into `metadata.scope` and filter by it. There is no tenant
20
+ * or user concept in the session store.
10
21
  */
11
- import { describe, it, expect, beforeAll, afterAll } from 'vitest';
12
- import { PGLiteSessionStore } from './store.js';
22
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
23
+ import { createPGLiteSessionStore } from './pglite-session-store.js';
24
+ import { createPostgresSessionStore } from './postgres-session-store.js';
25
+ import { SessionStoreError } from '../errors.js';
13
26
  import { createLogger } from '../logger.js';
14
27
  const logger = createLogger({ component: 'test:session-store' });
28
+ /** Fresh per-test scope so list() filters return only this test's rows. */
29
+ function newScope(label) {
30
+ return `${label}-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
31
+ }
15
32
  function makeSession(overrides = {}) {
16
33
  return {
17
34
  version: 1,
18
35
  id: `sess-${Math.random().toString(36).slice(2, 10)}`,
19
- tenantId: 'tenant-1',
20
- userId: 'user-1',
21
36
  messages: [{ role: 'user', content: 'Hello' }],
22
37
  tokenUsage: { inputTokens: 100, outputTokens: 50, totalTokens: 150 },
23
38
  metadata: {},
@@ -26,120 +41,383 @@ function makeSession(overrides = {}) {
26
41
  ...overrides,
27
42
  };
28
43
  }
29
- describe('PGLiteSessionStore', () => {
44
+ function runSuite(makeBackend) {
30
45
  let store;
31
- beforeAll(async () => {
32
- store = new PGLiteSessionStore({ logger });
33
- await store.initialize();
46
+ let cleanup;
47
+ let makeWithHooks;
48
+ beforeEach(async () => {
49
+ const b = await makeBackend();
50
+ store = b.store;
51
+ cleanup = b.cleanup;
52
+ makeWithHooks = b.makeWithHooks;
34
53
  });
35
- afterAll(async () => {
36
- await store.close();
54
+ afterEach(async () => {
55
+ await cleanup();
37
56
  });
38
- it('save and load a session', async () => {
39
- const session = makeSession();
40
- await store.save(session);
41
- const loaded = await store.load(session.id);
42
- expect(loaded).not.toBeNull();
43
- expect(loaded.id).toBe(session.id);
44
- expect(loaded.tenantId).toBe(session.tenantId);
45
- expect(loaded.userId).toBe(session.userId);
46
- expect(loaded.version).toBe(1);
47
- expect(loaded.messages).toEqual(session.messages);
48
- expect(loaded.tokenUsage).toEqual(session.tokenUsage);
57
+ describe('save / load / upsert', () => {
58
+ it('saves and loads a session with all fields intact', async () => {
59
+ const session = makeSession({
60
+ messages: [
61
+ { role: 'user', content: 'Hi' },
62
+ { role: 'assistant', content: 'Hello there' },
63
+ ],
64
+ tokenUsage: { inputTokens: 42, outputTokens: 7, totalTokens: 49 },
65
+ metadata: { title: 'Test', provider: 'anthropic' },
66
+ });
67
+ await store.save(session);
68
+ const loaded = await store.load(session.id);
69
+ expect(loaded).not.toBeNull();
70
+ expect(loaded.id).toBe(session.id);
71
+ expect(loaded.version).toBe(1);
72
+ expect(loaded.messages).toEqual(session.messages);
73
+ expect(loaded.tokenUsage).toEqual(session.tokenUsage);
74
+ expect(loaded.metadata).toEqual(session.metadata);
75
+ });
76
+ it('returns null for a missing session', async () => {
77
+ expect(await store.load('nonexistent')).toBeNull();
78
+ });
79
+ it('save updates an existing session (upsert) and refreshes fields', async () => {
80
+ const session = makeSession();
81
+ await store.save(session);
82
+ session.messages = [...session.messages, { role: 'assistant', content: 'Hi' }];
83
+ session.tokenUsage = { inputTokens: 200, outputTokens: 100, totalTokens: 300 };
84
+ session.updatedAt = new Date(Date.now() + 1000);
85
+ await store.save(session);
86
+ const loaded = await store.load(session.id);
87
+ expect(loaded.messages).toHaveLength(2);
88
+ expect(loaded.tokenUsage.totalTokens).toBe(300);
89
+ });
90
+ it('preserves rich metadata round-trip', async () => {
91
+ const session = makeSession({
92
+ metadata: {
93
+ title: 'Complex session',
94
+ model: 'claude-sonnet-4-20250514',
95
+ provider: 'anthropic',
96
+ appId: 'my-app',
97
+ automationName: 'nightly-digest',
98
+ custom: { nested: { deeply: [1, 2, 3] } },
99
+ },
100
+ });
101
+ await store.save(session);
102
+ const loaded = await store.load(session.id);
103
+ expect(loaded.metadata).toEqual(session.metadata);
104
+ });
49
105
  });
50
- it('load returns null for missing session', async () => {
51
- const loaded = await store.load('nonexistent');
52
- expect(loaded).toBeNull();
106
+ describe('list ordering', () => {
107
+ it('returns sessions newest first', async () => {
108
+ const scope = newScope('order');
109
+ const older = makeSession({
110
+ metadata: { scope },
111
+ updatedAt: new Date('2026-01-01'),
112
+ });
113
+ const newer = makeSession({
114
+ metadata: { scope },
115
+ updatedAt: new Date('2026-03-01'),
116
+ });
117
+ await store.save(older);
118
+ await store.save(newer);
119
+ const { sessions } = await store.list({ filter: { scope } });
120
+ const ids = sessions.map((s) => s.id);
121
+ expect(ids.indexOf(newer.id)).toBeLessThan(ids.indexOf(older.id));
122
+ });
53
123
  });
54
- it('save updates existing session (upsert)', async () => {
55
- const session = makeSession();
56
- await store.save(session);
57
- // Update messages and re-save
58
- session.messages = [
59
- { role: 'user', content: 'Hello' },
60
- { role: 'assistant', content: 'Hi there' },
61
- ];
62
- session.tokenUsage = { inputTokens: 200, outputTokens: 100, totalTokens: 300 };
63
- session.updatedAt = new Date();
64
- await store.save(session);
65
- const loaded = await store.load(session.id);
66
- expect(loaded.messages).toHaveLength(2);
67
- expect(loaded.tokenUsage.totalTokens).toBe(300);
124
+ describe('list pagination', () => {
125
+ it('returns nextCursor when more rows exist, null when page is final', async () => {
126
+ const scope = newScope('page');
127
+ for (let i = 0; i < 5; i++) {
128
+ await store.save(makeSession({ metadata: { scope }, updatedAt: new Date(2026, 0, 1 + i) }));
129
+ }
130
+ const page1 = await store.list({ limit: 2, filter: { scope } });
131
+ expect(page1.sessions).toHaveLength(2);
132
+ expect(page1.nextCursor).not.toBeNull();
133
+ const page2 = await store.list({ limit: 2, filter: { scope }, cursor: page1.nextCursor });
134
+ expect(page2.sessions).toHaveLength(2);
135
+ expect(page2.nextCursor).not.toBeNull();
136
+ const page3 = await store.list({ limit: 2, filter: { scope }, cursor: page2.nextCursor });
137
+ expect(page3.sessions).toHaveLength(1);
138
+ expect(page3.nextCursor).toBeNull();
139
+ const allIds = [...page1.sessions, ...page2.sessions, ...page3.sessions].map((s) => s.id);
140
+ expect(new Set(allIds).size).toBe(5);
141
+ });
142
+ it('throws SessionStoreError on malformed cursor', async () => {
143
+ await expect(store.list({ cursor: 'not-base64-at-all!!!' })).rejects.toBeInstanceOf(SessionStoreError);
144
+ });
145
+ it('paginates correctly when multiple rows share the same updated_at', async () => {
146
+ // Compound (updated_at, id) cursor must visit every row exactly
147
+ // once even when rows tie on updated_at (batch inserts, sources
148
+ // with millisecond-precision clocks).
149
+ const scope = newScope('tied');
150
+ const sameTs = new Date('2026-05-15T12:00:00.000Z');
151
+ for (let i = 0; i < 4; i++) {
152
+ await store.save(makeSession({
153
+ id: `tied-${String.fromCharCode(97 + i)}-${scope}`,
154
+ metadata: { scope },
155
+ updatedAt: sameTs,
156
+ }));
157
+ }
158
+ const page1 = await store.list({ limit: 2, filter: { scope } });
159
+ expect(page1.sessions).toHaveLength(2);
160
+ expect(page1.nextCursor).not.toBeNull();
161
+ const page2 = await store.list({ limit: 2, filter: { scope }, cursor: page1.nextCursor });
162
+ expect(page2.sessions).toHaveLength(2);
163
+ const allIds = [...page1.sessions, ...page2.sessions].map((s) => s.id);
164
+ expect(new Set(allIds).size).toBe(4);
165
+ });
68
166
  });
69
- it('list sessions filtered by tenant, newest first', async () => {
70
- const tenantId = `tenant-list-${Date.now()}`;
71
- const older = makeSession({
72
- tenantId,
73
- updatedAt: new Date('2026-01-01'),
74
- });
75
- const newer = makeSession({
76
- tenantId,
77
- updatedAt: new Date('2026-03-01'),
78
- });
79
- await store.save(older);
80
- await store.save(newer);
81
- const sessions = await store.list(tenantId);
82
- expect(sessions.length).toBeGreaterThanOrEqual(2);
83
- // Newest first
84
- const ids = sessions.map((s) => s.id);
85
- expect(ids.indexOf(newer.id)).toBeLessThan(ids.indexOf(older.id));
167
+ describe('list metadata filters', () => {
168
+ it('filters by a metadata string field', async () => {
169
+ const scope = newScope('filter');
170
+ await store.save(makeSession({ metadata: { scope, status: 'active', appId: 'x' } }));
171
+ await store.save(makeSession({ metadata: { scope, status: 'archived', appId: 'x' } }));
172
+ await store.save(makeSession({ metadata: { scope, status: 'active', appId: 'y' } }));
173
+ const { sessions: active } = await store.list({ filter: { scope, status: 'active' } });
174
+ expect(active).toHaveLength(2);
175
+ expect(active.every((s) => s.metadata['status'] === 'active')).toBe(true);
176
+ const { sessions: inApp } = await store.list({
177
+ filter: { scope, status: 'active', appId: 'x' },
178
+ });
179
+ expect(inApp).toHaveLength(1);
180
+ });
181
+ it('rejects filter keys with injection characters', async () => {
182
+ await expect(store.list({ filter: { "'; DROP TABLE agent_sessions; --": 'x' } })).rejects.toBeInstanceOf(SessionStoreError);
183
+ });
184
+ it('rejects filter keys with whitespace / punctuation', async () => {
185
+ await expect(store.list({ filter: { 'status OR 1=1': 'x' } })).rejects.toBeInstanceOf(SessionStoreError);
186
+ });
86
187
  });
87
- it('list does not return sessions from other tenants', async () => {
88
- const tenantA = `tenant-a-${Date.now()}`;
89
- const tenantB = `tenant-b-${Date.now()}`;
90
- await store.save(makeSession({ tenantId: tenantA }));
91
- await store.save(makeSession({ tenantId: tenantB }));
92
- const sessionsA = await store.list(tenantA);
93
- expect(sessionsA.every((s) => s.tenantId === tenantA)).toBe(true);
188
+ describe('list date range', () => {
189
+ it('updatedAfter / updatedBefore constrain the result window', async () => {
190
+ const scope = newScope('date');
191
+ await store.save(makeSession({ metadata: { scope }, updatedAt: new Date('2026-01-01') }));
192
+ await store.save(makeSession({ metadata: { scope }, updatedAt: new Date('2026-02-15') }));
193
+ await store.save(makeSession({ metadata: { scope }, updatedAt: new Date('2026-04-01') }));
194
+ const { sessions } = await store.list({
195
+ filter: { scope },
196
+ updatedAfter: new Date('2026-02-01'),
197
+ updatedBefore: new Date('2026-03-01'),
198
+ });
199
+ expect(sessions).toHaveLength(1);
200
+ });
94
201
  });
95
- it('delete removes a session', async () => {
96
- const session = makeSession();
97
- await store.save(session);
98
- const deleted = await store.delete(session.id);
99
- expect(deleted).toBe(true);
100
- const loaded = await store.load(session.id);
101
- expect(loaded).toBeNull();
202
+ describe('delete', () => {
203
+ it('removes a session and returns true', async () => {
204
+ const session = makeSession();
205
+ await store.save(session);
206
+ expect(await store.delete(session.id)).toBe(true);
207
+ expect(await store.load(session.id)).toBeNull();
208
+ });
209
+ it('returns false for a missing session', async () => {
210
+ expect(await store.delete('nonexistent')).toBe(false);
211
+ });
212
+ });
213
+ describe('cleanup', () => {
214
+ it('removes only sessions older than the cutoff', async () => {
215
+ const scope = newScope('cleanup');
216
+ const old = makeSession({ metadata: { scope }, updatedAt: new Date('2020-01-01') });
217
+ const recent = makeSession({ metadata: { scope }, updatedAt: new Date() });
218
+ await store.save(old);
219
+ await store.save(recent);
220
+ const cleaned = await store.cleanup(new Date('2025-01-01'));
221
+ expect(cleaned).toBeGreaterThanOrEqual(1);
222
+ expect(await store.load(old.id)).toBeNull();
223
+ expect(await store.load(recent.id)).not.toBeNull();
224
+ });
102
225
  });
103
- it('delete returns false for missing session', async () => {
104
- const deleted = await store.delete('nonexistent');
105
- expect(deleted).toBe(false);
226
+ describe('hooks', () => {
227
+ it('onAfterSave fires on save', async () => {
228
+ const events = [];
229
+ const hooked = await makeWithHooks({
230
+ onAfterSave: (s) => { events.push(`save:${s.id}`); },
231
+ });
232
+ try {
233
+ const session = makeSession();
234
+ await hooked.store.save(session);
235
+ expect(events).toEqual([`save:${session.id}`]);
236
+ }
237
+ finally {
238
+ await hooked.cleanup();
239
+ }
240
+ });
241
+ it('onAfterDelete fires only on actual deletes', async () => {
242
+ const events = [];
243
+ const hooked = await makeWithHooks({
244
+ onAfterDelete: (id) => { events.push(`del:${id}`); },
245
+ });
246
+ try {
247
+ const session = makeSession();
248
+ await hooked.store.save(session);
249
+ await hooked.store.delete('nonexistent');
250
+ await hooked.store.delete(session.id);
251
+ expect(events).toEqual([`del:${session.id}`]);
252
+ }
253
+ finally {
254
+ await hooked.cleanup();
255
+ }
256
+ });
257
+ it('onAfterCleanup fires once with deleted count', async () => {
258
+ const events = [];
259
+ const hooked = await makeWithHooks({
260
+ onAfterCleanup: ({ deleted }) => { events.push({ deleted }); },
261
+ });
262
+ try {
263
+ await hooked.store.save(makeSession({ updatedAt: new Date('2020-01-01') }));
264
+ await hooked.store.save(makeSession({ updatedAt: new Date('2020-02-01') }));
265
+ await hooked.store.cleanup(new Date('2025-01-01'));
266
+ expect(events).toHaveLength(1);
267
+ expect(events[0].deleted).toBeGreaterThanOrEqual(2);
268
+ }
269
+ finally {
270
+ await hooked.cleanup();
271
+ }
272
+ });
273
+ it('hook failure propagates to caller', async () => {
274
+ const hooked = await makeWithHooks({
275
+ onAfterSave: () => { throw new Error('hook failed'); },
276
+ });
277
+ try {
278
+ await expect(hooked.store.save(makeSession())).rejects.toThrow('hook failed');
279
+ }
280
+ finally {
281
+ await hooked.cleanup();
282
+ }
283
+ });
106
284
  });
107
- it('cleanup removes sessions older than cutoff', async () => {
108
- const tenantId = `tenant-cleanup-${Date.now()}`;
109
- const old = makeSession({
110
- tenantId,
111
- updatedAt: new Date('2020-01-01'),
112
- });
113
- const recent = makeSession({
114
- tenantId,
115
- updatedAt: new Date(),
116
- });
117
- await store.save(old);
118
- await store.save(recent);
119
- const cleaned = await store.cleanup(new Date('2025-01-01'));
120
- expect(cleaned).toBeGreaterThanOrEqual(1);
121
- // Old session gone
122
- const loaded = await store.load(old.id);
123
- expect(loaded).toBeNull();
124
- // Recent session still there
125
- const loadedRecent = await store.load(recent.id);
126
- expect(loadedRecent).not.toBeNull();
285
+ }
286
+ // ---------------------------------------------------------------------------
287
+ // PGLite suite (always runs)
288
+ // ---------------------------------------------------------------------------
289
+ describe('PGLite session store', () => {
290
+ runSuite(async () => {
291
+ const store = await createPGLiteSessionStore({ logger });
292
+ return {
293
+ store,
294
+ cleanup: () => store.close(),
295
+ makeWithHooks: async (hooks) => {
296
+ const s = await createPGLiteSessionStore({ logger, hooks });
297
+ return { store: s, cleanup: () => s.close() };
298
+ },
299
+ };
127
300
  });
128
- it('metadata is preserved through save/load', async () => {
129
- const session = makeSession({
130
- metadata: {
131
- title: 'Test Session',
132
- model: 'claude-sonnet-4-20250514',
133
- provider: 'anthropic',
134
- appId: 'my-app',
301
+ });
302
+ // ---------------------------------------------------------------------------
303
+ // Postgres suite (opt-in via TEST_POSTGRES_URL env var)
304
+ // ---------------------------------------------------------------------------
305
+ const pgUrl = process.env['TEST_POSTGRES_URL'] ?? '';
306
+ const pgDescribe = pgUrl ? describe : describe.skip;
307
+ pgDescribe('Postgres session store (via TEST_POSTGRES_URL)', () => {
308
+ const TEST_TABLE = 'test_agent_sessions';
309
+ async function dropTable(name) {
310
+ const pg = await import('pg');
311
+ const { Pool } = pg.default ?? pg;
312
+ const pool = new Pool({ connectionString: pgUrl });
313
+ try {
314
+ await pool.query(`DROP TABLE IF EXISTS ${name} CASCADE`);
315
+ }
316
+ finally {
317
+ await pool.end();
318
+ }
319
+ }
320
+ runSuite(async () => {
321
+ await dropTable(TEST_TABLE);
322
+ const store = await createPostgresSessionStore({
323
+ connectionString: pgUrl,
324
+ tableName: TEST_TABLE,
325
+ logger,
326
+ });
327
+ return {
328
+ store,
329
+ cleanup: () => store.close(),
330
+ makeWithHooks: async (hooks) => {
331
+ const table = `test_h_${Math.random().toString(36).slice(2, 10)}`;
332
+ const s = await createPostgresSessionStore({
333
+ connectionString: pgUrl,
334
+ tableName: table,
335
+ logger,
336
+ hooks,
337
+ });
338
+ return {
339
+ store: s,
340
+ cleanup: async () => {
341
+ await s.close();
342
+ await dropTable(table);
343
+ },
344
+ };
135
345
  },
346
+ };
347
+ });
348
+ describe('Postgres factory specifics', () => {
349
+ it('accepts an externally-owned pg.Pool and does not close it', async () => {
350
+ const localTable = 'test_ext_pool';
351
+ await dropTable(localTable);
352
+ const pg = await import('pg');
353
+ const { Pool } = pg.default ?? pg;
354
+ const externalPool = new Pool({ connectionString: pgUrl });
355
+ try {
356
+ const store = await createPostgresSessionStore({
357
+ pool: externalPool,
358
+ tableName: localTable,
359
+ logger,
360
+ });
361
+ await store.save(makeSession());
362
+ await store.close();
363
+ const { rows } = await externalPool.query(`SELECT COUNT(*) AS c FROM ${localTable}`);
364
+ expect(Number(rows[0].c)).toBe(1);
365
+ }
366
+ finally {
367
+ await externalPool.end();
368
+ await dropTable(localTable);
369
+ }
370
+ });
371
+ it('close() is idempotent and ops after close throw SessionStoreError', async () => {
372
+ const localTable = 'test_close_idemp';
373
+ await dropTable(localTable);
374
+ const store = await createPostgresSessionStore({
375
+ connectionString: pgUrl,
376
+ tableName: localTable,
377
+ logger,
378
+ });
379
+ await store.close();
380
+ await store.close();
381
+ await expect(store.save(makeSession())).rejects.toBeInstanceOf(SessionStoreError);
382
+ await expect(store.load('x')).rejects.toBeInstanceOf(SessionStoreError);
383
+ await dropTable(localTable);
384
+ });
385
+ it('rejects invalid tableName at construct time', async () => {
386
+ await expect(createPostgresSessionStore({
387
+ connectionString: pgUrl,
388
+ tableName: 'bad table; DROP',
389
+ logger,
390
+ })).rejects.toBeInstanceOf(SessionStoreError);
391
+ });
392
+ it('requires connectionString or pool', async () => {
393
+ await expect(createPostgresSessionStore({ logger })).rejects.toBeInstanceOf(SessionStoreError);
394
+ });
395
+ it('concurrent saves to the same id converge', async () => {
396
+ const localTable = 'test_concurrent';
397
+ await dropTable(localTable);
398
+ const store = await createPostgresSessionStore({
399
+ connectionString: pgUrl,
400
+ tableName: localTable,
401
+ logger,
402
+ });
403
+ try {
404
+ const id = 'concurrent-id';
405
+ const saves = Array.from({ length: 10 }, (_, i) => store.save(makeSession({
406
+ id,
407
+ updatedAt: new Date(2026, 0, 1, 0, 0, i),
408
+ tokenUsage: { inputTokens: i, outputTokens: 0, totalTokens: i },
409
+ })));
410
+ await Promise.all(saves);
411
+ const loaded = await store.load(id);
412
+ expect(loaded).not.toBeNull();
413
+ expect(loaded.tokenUsage.totalTokens).toBeGreaterThanOrEqual(0);
414
+ expect(loaded.tokenUsage.totalTokens).toBeLessThanOrEqual(9);
415
+ }
416
+ finally {
417
+ await store.close();
418
+ await dropTable(localTable);
419
+ }
136
420
  });
137
- await store.save(session);
138
- const loaded = await store.load(session.id);
139
- expect(loaded.metadata.title).toBe('Test Session');
140
- expect(loaded.metadata.model).toBe('claude-sonnet-4-20250514');
141
- expect(loaded.metadata.provider).toBe('anthropic');
142
- expect(loaded.metadata.appId).toBe('my-app');
143
421
  });
144
422
  });
145
423
  //# sourceMappingURL=store.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.test.js","sourceRoot":"","sources":["../../../src/session/store.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.test.js","sourceRoot":"","sources":["../../../src/session/store.test.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,7 @@
17
17
  import type { LoadedStore, StoreBackend } from '@amodalai/types';
18
18
  import type { FieldScrubber } from '@amodalai/core';
19
19
  import type { ConnectionsMap } from '../tools/request-tool.js';
20
+ import type { SearchProvider } from '../providers/search-provider.js';
20
21
  import type { ToolContext } from '../tools/types.js';
21
22
  import type { Logger } from '../logger.js';
22
23
  /** Dependencies for creating tool contexts. */
@@ -42,8 +43,8 @@ export interface ToolContextFactoryOptions {
42
43
  };
43
44
  /** Session ID for correlation */
44
45
  sessionId: string;
45
- /** Tenant ID for multi-tenant isolation */
46
- tenantId: string;
46
+ /** Grounded search provider for web_search/fetch_url (optional). */
47
+ searchProvider?: SearchProvider;
47
48
  }
48
49
  /**
49
50
  * Create a factory function that builds ToolContext instances for tool execution.
@@ -176,13 +176,12 @@ export function createToolContextFactory(opts) {
176
176
  callId,
177
177
  message,
178
178
  session: opts.sessionId,
179
- tenant: opts.tenantId,
180
179
  });
181
180
  },
182
181
  user: opts.user,
183
182
  signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
184
183
  sessionId: opts.sessionId,
185
- tenantId: opts.tenantId,
184
+ ...(opts.searchProvider ? { searchProvider: opts.searchProvider } : {}),
186
185
  };
187
186
  return ctx;
188
187
  };