@amodalai/runtime 0.2.10 → 0.3.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 (139) hide show
  1. package/dist/src/__fixtures__/e2e.test.js +2 -2
  2. package/dist/src/__fixtures__/e2e.test.js.map +1 -1
  3. package/dist/src/__fixtures__/smoke.test.js +0 -88
  4. package/dist/src/__fixtures__/smoke.test.js.map +1 -1
  5. package/dist/src/__tests__/studio-integration.test.js +298 -0
  6. package/dist/src/__tests__/studio-integration.test.js.map +1 -0
  7. package/dist/src/agent/agent-types.d.ts +4 -0
  8. package/dist/src/agent/feedback-store.d.ts +11 -10
  9. package/dist/src/agent/feedback-store.js +147 -75
  10. package/dist/src/agent/feedback-store.js.map +1 -1
  11. package/dist/src/agent/local-server.js +30 -111
  12. package/dist/src/agent/local-server.js.map +1 -1
  13. package/dist/src/agent/local-server.test.js +17 -1
  14. package/dist/src/agent/local-server.test.js.map +1 -1
  15. package/dist/src/agent/routes/context.d.ts +24 -0
  16. package/dist/src/agent/routes/context.js +30 -0
  17. package/dist/src/agent/routes/context.js.map +1 -0
  18. package/dist/src/agent/routes/feedback.js +28 -56
  19. package/dist/src/agent/routes/feedback.js.map +1 -1
  20. package/dist/src/api/create-agent.js +8 -4
  21. package/dist/src/api/create-agent.js.map +1 -1
  22. package/dist/src/api/types.d.ts +1 -1
  23. package/dist/src/channels/channel-session-mapper.js +1 -1
  24. package/dist/src/channels/channel-session-mapper.js.map +1 -1
  25. package/dist/src/config.d.ts +2 -2
  26. package/dist/src/config.js +2 -1
  27. package/dist/src/config.js.map +1 -1
  28. package/dist/src/config.test.js +1 -1
  29. package/dist/src/config.test.js.map +1 -1
  30. package/dist/src/errors.d.ts +2 -2
  31. package/dist/src/errors.js +2 -2
  32. package/dist/src/index.d.ts +0 -3
  33. package/dist/src/index.js +0 -3
  34. package/dist/src/index.js.map +1 -1
  35. package/dist/src/session/drizzle-session-store.d.ts +4 -6
  36. package/dist/src/session/drizzle-session-store.js +15 -5
  37. package/dist/src/session/drizzle-session-store.js.map +1 -1
  38. package/dist/src/session/manager.js +1 -1
  39. package/dist/src/session/manager.test.js +7 -5
  40. package/dist/src/session/manager.test.js.map +1 -1
  41. package/dist/src/session/postgres-session-store.d.ts +3 -24
  42. package/dist/src/session/postgres-session-store.js +9 -128
  43. package/dist/src/session/postgres-session-store.js.map +1 -1
  44. package/dist/src/session/session-builder.d.ts +0 -4
  45. package/dist/src/session/session-builder.js +2 -9
  46. package/dist/src/session/session-builder.js.map +1 -1
  47. package/dist/src/session/session-builder.test.js +0 -25
  48. package/dist/src/session/session-builder.test.js.map +1 -1
  49. package/dist/src/session/session-store-selector.d.ts +11 -26
  50. package/dist/src/session/session-store-selector.js +3 -48
  51. package/dist/src/session/session-store-selector.js.map +1 -1
  52. package/dist/src/session/session-store-selector.test.js +5 -57
  53. package/dist/src/session/session-store-selector.test.js.map +1 -1
  54. package/dist/src/session/store.d.ts +8 -14
  55. package/dist/src/session/store.js +8 -10
  56. package/dist/src/session/store.js.map +1 -1
  57. package/dist/src/session/store.test.js +6 -126
  58. package/dist/src/session/store.test.js.map +1 -1
  59. package/dist/src/session/tool-context-factory.js +1 -1
  60. package/dist/src/session/tool-context-factory.js.map +1 -1
  61. package/dist/src/stores/drizzle-store-backend.d.ts +5 -0
  62. package/dist/src/stores/drizzle-store-backend.js +23 -3
  63. package/dist/src/stores/drizzle-store-backend.js.map +1 -1
  64. package/dist/src/stores/drizzle-store-backend.test.js +10 -58
  65. package/dist/src/stores/drizzle-store-backend.test.js.map +1 -1
  66. package/dist/src/stores/index.d.ts +0 -2
  67. package/dist/src/stores/index.js +0 -1
  68. package/dist/src/stores/index.js.map +1 -1
  69. package/dist/src/stores/postgres-store-backend.d.ts +5 -15
  70. package/dist/src/stores/postgres-store-backend.js +14 -72
  71. package/dist/src/stores/postgres-store-backend.js.map +1 -1
  72. package/dist/tsconfig.tsbuildinfo +1 -1
  73. package/package.json +4 -6
  74. package/dist/src/agent/automation-bridge.d.ts +0 -33
  75. package/dist/src/agent/automation-bridge.js +0 -50
  76. package/dist/src/agent/automation-bridge.js.map +0 -1
  77. package/dist/src/agent/automation-bridge.test.d.ts +0 -6
  78. package/dist/src/agent/automation-bridge.test.js +0 -130
  79. package/dist/src/agent/automation-bridge.test.js.map +0 -1
  80. package/dist/src/agent/eval-store.d.ts +0 -50
  81. package/dist/src/agent/eval-store.js +0 -137
  82. package/dist/src/agent/eval-store.js.map +0 -1
  83. package/dist/src/agent/proactive/delivery-router.d.ts +0 -68
  84. package/dist/src/agent/proactive/delivery-router.js +0 -337
  85. package/dist/src/agent/proactive/delivery-router.js.map +0 -1
  86. package/dist/src/agent/proactive/delivery-router.test.js +0 -455
  87. package/dist/src/agent/proactive/delivery-router.test.js.map +0 -1
  88. package/dist/src/agent/proactive/delivery.d.ts +0 -21
  89. package/dist/src/agent/proactive/delivery.js +0 -68
  90. package/dist/src/agent/proactive/delivery.js.map +0 -1
  91. package/dist/src/agent/proactive/delivery.test.d.ts +0 -6
  92. package/dist/src/agent/proactive/delivery.test.js +0 -65
  93. package/dist/src/agent/proactive/delivery.test.js.map +0 -1
  94. package/dist/src/agent/proactive/proactive-runner.d.ts +0 -129
  95. package/dist/src/agent/proactive/proactive-runner.js +0 -301
  96. package/dist/src/agent/proactive/proactive-runner.js.map +0 -1
  97. package/dist/src/agent/proactive/proactive-runner.test.d.ts +0 -6
  98. package/dist/src/agent/proactive/proactive-runner.test.js +0 -250
  99. package/dist/src/agent/proactive/proactive-runner.test.js.map +0 -1
  100. package/dist/src/agent/routes/admin-chat-abort.test.d.ts +0 -6
  101. package/dist/src/agent/routes/admin-chat-abort.test.js +0 -207
  102. package/dist/src/agent/routes/admin-chat-abort.test.js.map +0 -1
  103. package/dist/src/agent/routes/admin-chat.d.ts +0 -28
  104. package/dist/src/agent/routes/admin-chat.js +0 -110
  105. package/dist/src/agent/routes/admin-chat.js.map +0 -1
  106. package/dist/src/agent/routes/automations.d.ts +0 -19
  107. package/dist/src/agent/routes/automations.js +0 -86
  108. package/dist/src/agent/routes/automations.js.map +0 -1
  109. package/dist/src/agent/routes/automations.test.d.ts +0 -6
  110. package/dist/src/agent/routes/automations.test.js +0 -117
  111. package/dist/src/agent/routes/automations.test.js.map +0 -1
  112. package/dist/src/agent/routes/evals.d.ts +0 -17
  113. package/dist/src/agent/routes/evals.js +0 -389
  114. package/dist/src/agent/routes/evals.js.map +0 -1
  115. package/dist/src/agent/routes/webhooks.d.ts +0 -17
  116. package/dist/src/agent/routes/webhooks.js +0 -63
  117. package/dist/src/agent/routes/webhooks.js.map +0 -1
  118. package/dist/src/agent/routes/webhooks.test.d.ts +0 -6
  119. package/dist/src/agent/routes/webhooks.test.js +0 -100
  120. package/dist/src/agent/routes/webhooks.test.js.map +0 -1
  121. package/dist/src/session/pglite-session-store.d.ts +0 -23
  122. package/dist/src/session/pglite-session-store.js +0 -92
  123. package/dist/src/session/pglite-session-store.js.map +0 -1
  124. package/dist/src/stores/pglite-store-backend.d.ts +0 -39
  125. package/dist/src/stores/pglite-store-backend.js +0 -128
  126. package/dist/src/stores/pglite-store-backend.js.map +0 -1
  127. package/dist/src/stores/pglite-store-backend.test.d.ts +0 -6
  128. package/dist/src/stores/pglite-store-backend.test.js +0 -150
  129. package/dist/src/stores/pglite-store-backend.test.js.map +0 -1
  130. package/dist/src/stores/schema.d.ts +0 -593
  131. package/dist/src/stores/schema.js +0 -75
  132. package/dist/src/stores/schema.js.map +0 -1
  133. package/dist/src/tools/admin-file-tools.d.ts +0 -42
  134. package/dist/src/tools/admin-file-tools.js +0 -714
  135. package/dist/src/tools/admin-file-tools.js.map +0 -1
  136. package/dist/src/tools/admin-file-tools.test.d.ts +0 -6
  137. package/dist/src/tools/admin-file-tools.test.js +0 -523
  138. package/dist/src/tools/admin-file-tools.test.js.map +0 -1
  139. /package/dist/src/{agent/proactive/delivery-router.test.d.ts → __tests__/studio-integration.test.d.ts} +0 -0
@@ -1,250 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2026 Amodal Labs, Inc.
4
- * SPDX-License-Identifier: MIT
5
- */
6
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
- import { ProactiveRunner } from './proactive-runner.js';
8
- import { SSEEventType } from '../../types.js';
9
- import { createLogger } from '../../logger.js';
10
- const logger = createLogger({ component: 'test:proactive-runner' });
11
- // Mock delivery
12
- const { mockDeliverResult } = vi.hoisted(() => ({
13
- mockDeliverResult: vi.fn(),
14
- }));
15
- vi.mock('./delivery.js', () => ({
16
- deliverResult: mockDeliverResult,
17
- }));
18
- function makeAutomation(overrides) {
19
- return {
20
- name: 'test-auto',
21
- title: 'Test Automation',
22
- trigger: 'cron',
23
- schedule: '0 9 * * *',
24
- prompt: 'Check systems.',
25
- location: 'automations/test.json',
26
- ...overrides,
27
- };
28
- }
29
- function makeRepo(automations) {
30
- return {
31
- source: 'local',
32
- origin: '/test',
33
- config: {
34
- name: 'test',
35
- version: '1.0',
36
- models: { main: { provider: 'anthropic', model: 'claude-sonnet-4-20250514' } },
37
- },
38
- connections: new Map(),
39
- skills: [],
40
- agents: { subagents: [] },
41
- automations,
42
- knowledge: [],
43
- evals: [],
44
- tools: [],
45
- stores: [],
46
- };
47
- }
48
- // Mock session and session manager
49
- const mockSession = {
50
- id: 'test-session',
51
- provider: {},
52
- toolRegistry: { register: vi.fn(), get: vi.fn(), getTools: vi.fn(), names: vi.fn(() => []), subset: vi.fn(), size: 0 },
53
- permissionChecker: { check: vi.fn() },
54
- logger,
55
- systemPrompt: 'test',
56
- messages: [],
57
- usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },
58
- model: 'test-model',
59
- providerName: 'test',
60
- appId: 'local',
61
- metadata: {},
62
- createdAt: Date.now(),
63
- lastAccessedAt: Date.now(),
64
- maxTurns: 50,
65
- maxContextTokens: 200_000,
66
- };
67
- const mockToolContextFactory = vi.fn();
68
- function makeRunMessageMock() {
69
- return vi.fn().mockImplementation(async function* () {
70
- yield { type: SSEEventType.TextDelta, content: 'Test response', timestamp: new Date().toISOString() };
71
- yield { type: SSEEventType.Done, timestamp: new Date().toISOString() };
72
- });
73
- }
74
- function makeSessionManager(runMessageImpl) {
75
- return {
76
- create: vi.fn().mockReturnValue(mockSession),
77
- get: vi.fn(),
78
- has: vi.fn(),
79
- resume: vi.fn(),
80
- destroy: vi.fn().mockResolvedValue(undefined),
81
- persist: vi.fn().mockResolvedValue(undefined),
82
- listPersisted: vi.fn(),
83
- start: vi.fn(),
84
- shutdown: vi.fn(),
85
- cleanup: vi.fn(),
86
- runMessage: runMessageImpl ?? makeRunMessageMock(),
87
- size: 0,
88
- };
89
- }
90
- function makeConfig(overrides) {
91
- const sm = makeSessionManager();
92
- return {
93
- sessionManager: sm,
94
- createSessionComponents: vi.fn().mockReturnValue({
95
- session: mockSession,
96
- toolContextFactory: mockToolContextFactory,
97
- }),
98
- logger,
99
- ...overrides,
100
- };
101
- }
102
- describe('ProactiveRunner', () => {
103
- beforeEach(() => {
104
- vi.useFakeTimers();
105
- mockDeliverResult.mockResolvedValue(true);
106
- });
107
- afterEach(() => {
108
- vi.useRealTimers();
109
- });
110
- it('should list automations with running state', () => {
111
- const repo = makeRepo([
112
- makeAutomation({ name: 'a1' }),
113
- makeAutomation({ name: 'a2', trigger: 'webhook', schedule: undefined, prompt: 'Run on webhook.' }),
114
- ]);
115
- const runner = new ProactiveRunner(repo, makeConfig());
116
- const list = runner.listAutomations();
117
- expect(list).toHaveLength(2);
118
- expect(list[0]?.name).toBe('a1');
119
- expect(list[0]?.running).toBe(false);
120
- expect(list[1]?.name).toBe('a2');
121
- expect(list[1]?.running).toBe(true);
122
- });
123
- it('should start and stop individual cron automations', () => {
124
- const repo = makeRepo([
125
- makeAutomation({ name: 'cron-a', schedule: '*/5 * * * *' }),
126
- makeAutomation({ name: 'cron-b', schedule: '*/10 * * * *' }),
127
- ]);
128
- const runner = new ProactiveRunner(repo, makeConfig());
129
- const startResult = runner.startAutomation('cron-a');
130
- expect(startResult.success).toBe(true);
131
- const list = runner.listAutomations();
132
- expect(list.find((a) => a.name === 'cron-a')?.running).toBe(true);
133
- expect(list.find((a) => a.name === 'cron-b')?.running).toBe(false);
134
- const stopResult = runner.stopAutomation('cron-a');
135
- expect(stopResult.success).toBe(true);
136
- expect(runner.listAutomations().find((a) => a.name === 'cron-a')?.running).toBe(false);
137
- });
138
- it('should reject starting unknown automation', () => {
139
- const repo = makeRepo([]);
140
- const runner = new ProactiveRunner(repo, makeConfig());
141
- const result = runner.startAutomation('unknown');
142
- expect(result.success).toBe(false);
143
- expect(result.error).toContain('not found');
144
- });
145
- it('should reject starting already running automation', () => {
146
- const repo = makeRepo([makeAutomation({ name: 'a', schedule: '*/5 * * * *' })]);
147
- const runner = new ProactiveRunner(repo, makeConfig());
148
- runner.startAutomation('a');
149
- const result = runner.startAutomation('a');
150
- expect(result.success).toBe(false);
151
- expect(result.error).toContain('already running');
152
- runner.stop();
153
- });
154
- it('should reject starting webhook-triggered automation', () => {
155
- const repo = makeRepo([makeAutomation({ name: 'hook', trigger: 'webhook', schedule: undefined, prompt: 'Run on webhook.' })]);
156
- const runner = new ProactiveRunner(repo, makeConfig());
157
- const result = runner.startAutomation('hook');
158
- expect(result.success).toBe(false);
159
- expect(result.error).toContain('webhook-triggered');
160
- });
161
- it('should reject stopping automation that is not running', () => {
162
- const repo = makeRepo([makeAutomation({ name: 'a' })]);
163
- const runner = new ProactiveRunner(repo, makeConfig());
164
- const result = runner.stopAutomation('a');
165
- expect(result.success).toBe(false);
166
- expect(result.error).toContain('not running');
167
- });
168
- it('start() should start all cron automations', () => {
169
- const repo = makeRepo([
170
- makeAutomation({ name: 'cron-a', schedule: '*/5 * * * *' }),
171
- makeAutomation({ name: 'cron-b', schedule: '*/10 * * * *' }),
172
- makeAutomation({ name: 'hook', trigger: 'webhook', schedule: undefined, prompt: 'Run on webhook.' }),
173
- ]);
174
- const runner = new ProactiveRunner(repo, makeConfig());
175
- runner.start();
176
- const list = runner.listAutomations();
177
- expect(list.find((a) => a.name === 'cron-a')?.running).toBe(true);
178
- expect(list.find((a) => a.name === 'cron-b')?.running).toBe(true);
179
- runner.stop();
180
- });
181
- it('stop() should stop all cron automations', () => {
182
- const repo = makeRepo([
183
- makeAutomation({ name: 'cron-a', schedule: '*/5 * * * *' }),
184
- ]);
185
- const runner = new ProactiveRunner(repo, makeConfig());
186
- runner.start();
187
- runner.stop();
188
- expect(runner.listAutomations().find((a) => a.name === 'cron-a')?.running).toBe(false);
189
- });
190
- it('should handle webhook for webhook-triggered automation', async () => {
191
- const repo = makeRepo([
192
- makeAutomation({
193
- name: 'webhook-auto',
194
- trigger: 'webhook',
195
- schedule: undefined,
196
- prompt: 'Run on webhook when alert fires.',
197
- }),
198
- ]);
199
- const runner = new ProactiveRunner(repo, makeConfig());
200
- const result = await runner.handleWebhook('webhook-auto', { alert: 'high-cpu' });
201
- expect(result.matched).toBe(true);
202
- });
203
- it('should return not matched for unknown automation', async () => {
204
- const repo = makeRepo([]);
205
- const runner = new ProactiveRunner(repo, makeConfig());
206
- const result = await runner.handleWebhook('unknown', {});
207
- expect(result.matched).toBe(false);
208
- expect(result.error).toContain('not found');
209
- });
210
- it('should return not matched for non-webhook automation', async () => {
211
- const repo = makeRepo([makeAutomation({ name: 'cron-only' })]);
212
- const runner = new ProactiveRunner(repo, makeConfig());
213
- const result = await runner.handleWebhook('cron-only', {});
214
- expect(result.matched).toBe(false);
215
- expect(result.error).toContain('not webhook-triggered');
216
- });
217
- it('should trigger automation manually', async () => {
218
- const repo = makeRepo([makeAutomation({ name: 'manual' })]);
219
- const runner = new ProactiveRunner(repo, makeConfig());
220
- const result = await runner.triggerAutomation('manual');
221
- expect(result.success).toBe(true);
222
- });
223
- it('should return error when triggering unknown automation', async () => {
224
- const repo = makeRepo([]);
225
- const runner = new ProactiveRunner(repo, makeConfig());
226
- const result = await runner.triggerAutomation('unknown');
227
- expect(result.success).toBe(false);
228
- expect(result.error).toContain('not found');
229
- });
230
- it('should destroy session after automation run', async () => {
231
- const config = makeConfig();
232
- const repo = makeRepo([makeAutomation({ name: 'cleanup-test' })]);
233
- const runner = new ProactiveRunner(repo, config);
234
- await runner.triggerAutomation('cleanup-test');
235
- expect(config.sessionManager.destroy).toHaveBeenCalledWith('test-session');
236
- });
237
- it('should indicate webhook-triggered automations in list', () => {
238
- const repo = makeRepo([
239
- makeAutomation({ name: 'cron', prompt: 'Scheduled check.' }),
240
- makeAutomation({ name: 'hook', trigger: 'webhook', schedule: undefined, prompt: 'Run on webhook.' }),
241
- ]);
242
- const runner = new ProactiveRunner(repo, makeConfig());
243
- const list = runner.listAutomations();
244
- const cron = list.find((a) => a.name === 'cron');
245
- const hook = list.find((a) => a.name === 'hook');
246
- expect(cron?.webhookTriggered).toBe(false);
247
- expect(hook?.webhookTriggered).toBe(true);
248
- });
249
- });
250
- //# sourceMappingURL=proactive-runner.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"proactive-runner.test.js","sourceRoot":"","sources":["../../../../src/agent/proactive/proactive-runner.test.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2026 Amodal Labs, Inc.
4
- * SPDX-License-Identifier: MIT
5
- */
6
- export {};
@@ -1,207 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2026 Amodal Labs, Inc.
4
- * SPDX-License-Identifier: MIT
5
- */
6
- /**
7
- * Regression: admin-chat route crashed with an unhandled DOMException
8
- * [AbortError] when the SSE client disconnected mid-stream.
9
- *
10
- * Root cause: `handleStreaming` in states/streaming.ts iterates
11
- * `state.stream.fullStream` via for-await. When ctx.signal aborts, the
12
- * provider's fetch rejects, `fullStream.next()` throws, and the for-await
13
- * propagates that throw BEFORE `await state.stream.text` runs. Without
14
- * passive handlers attached to the text/usage derived promises, their
15
- * rejection escapes as an unhandled rejection and crashes the process.
16
- *
17
- * The fix attaches `Promise.resolve(state.stream.text).catch(() => {})`
18
- * (and same for usage) at the top of handleStreaming.
19
- *
20
- * This test exercises the real SessionManager + runAgent + admin-chat
21
- * route path, disconnects the client mid-stream, and asserts no
22
- * unhandled rejection surfaces. It fails if the passive handlers are
23
- * removed from streaming.ts.
24
- */
25
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
26
- import express from 'express';
27
- import http from 'node:http';
28
- import { createAdminChatRouter } from './admin-chat.js';
29
- import { StandaloneSessionManager } from '../../session/manager.js';
30
- import { createLogger } from '../../logger.js';
31
- import { createToolRegistry } from '../../tools/registry.js';
32
- function makeBundle() {
33
- return {
34
- source: 'local',
35
- origin: '/tmp/fake-repo',
36
- config: { name: 'test-agent', description: 'test' },
37
- };
38
- }
39
- function makeSharedResources() {
40
- return {
41
- storeBackend: {},
42
- mcpManager: {},
43
- logger: createLogger({ component: 'test:shared' }),
44
- toolExecutor: {},
45
- fieldScrubber: {},
46
- };
47
- }
48
- /**
49
- * Provider whose streamText returns a StreamTextResult that mirrors the
50
- * AI SDK's contract: fullStream yields text chunks (respecting abortSignal),
51
- * and text/usage are derived promises that reject when fullStream throws.
52
- * This matches the production provider's behavior on abort.
53
- */
54
- function abortAwareStreamingProvider() {
55
- return {
56
- model: 'test-model',
57
- provider: 'test-provider',
58
- languageModel: {},
59
- streamText(opts) {
60
- const signal = opts.abortSignal;
61
- let accumulated = '';
62
- let settleText;
63
- let rejectText;
64
- let settleUsage;
65
- let rejectUsage;
66
- const textPromise = new Promise((res, rej) => {
67
- settleText = res;
68
- rejectText = rej;
69
- });
70
- const usagePromise = new Promise((res, rej) => {
71
- settleUsage = res;
72
- rejectUsage = rej;
73
- });
74
- async function* innerStream() {
75
- for (let i = 0; i < 30; i++) {
76
- await new Promise((resolve, reject) => {
77
- const timer = setTimeout(resolve, 50);
78
- if (signal?.aborted) {
79
- clearTimeout(timer);
80
- reject(signal.reason);
81
- return;
82
- }
83
- signal?.addEventListener('abort', () => {
84
- clearTimeout(timer);
85
- reject(signal.reason);
86
- }, { once: true });
87
- });
88
- const chunk = `chunk${String(i)} `;
89
- accumulated += chunk;
90
- yield { type: 'text-delta', textDelta: chunk };
91
- }
92
- const usage = { inputTokens: 10, outputTokens: 5, totalTokens: 15 };
93
- yield { type: 'finish', usage };
94
- settleText(accumulated);
95
- settleUsage(usage);
96
- }
97
- const wrapped = (async function* () {
98
- try {
99
- for await (const ev of innerStream())
100
- yield ev;
101
- }
102
- catch (e) {
103
- rejectText(e);
104
- rejectUsage(e);
105
- throw e;
106
- }
107
- })();
108
- return {
109
- fullStream: wrapped,
110
- textStream: (async function* () { })(),
111
- text: textPromise,
112
- usage: usagePromise,
113
- responseMessages: textPromise.then((t) => [{ role: 'assistant', content: t }]),
114
- };
115
- },
116
- generateText: () => Promise.reject(new Error('unused')),
117
- };
118
- }
119
- async function startServer(sm) {
120
- const app = express();
121
- app.use(express.json());
122
- app.use(createAdminChatRouter({
123
- sessionManager: sm,
124
- shared: makeSharedResources(),
125
- getBundle: () => makeBundle(),
126
- getPort: () => null,
127
- }));
128
- return new Promise((resolve) => {
129
- const server = app.listen(0, '127.0.0.1', () => {
130
- const { port } = server.address();
131
- resolve({
132
- port,
133
- close: () => new Promise((r) => server.close(() => r())),
134
- });
135
- });
136
- });
137
- }
138
- /** POST to /config/chat, read the first chunk, then destroy the client socket. */
139
- async function postAndDisconnect(port, sessionId) {
140
- const body = JSON.stringify({ message: 'test', session_id: sessionId });
141
- return new Promise((resolve, reject) => {
142
- const req = http.request({
143
- host: '127.0.0.1',
144
- port,
145
- path: '/config/chat',
146
- method: 'POST',
147
- headers: {
148
- 'Content-Type': 'application/json',
149
- 'Content-Length': Buffer.byteLength(body).toString(),
150
- },
151
- }, (res) => {
152
- let bytesRead = 0;
153
- res.on('data', (chunk) => {
154
- bytesRead += chunk.length;
155
- if (bytesRead >= 30) {
156
- req.destroy();
157
- }
158
- });
159
- res.on('close', () => resolve());
160
- res.on('error', () => resolve());
161
- });
162
- req.on('error', (err) => {
163
- if (err.code === 'ECONNRESET') {
164
- resolve();
165
- }
166
- else {
167
- reject(err);
168
- }
169
- });
170
- req.write(body);
171
- req.end();
172
- });
173
- }
174
- describe('admin-chat route — client-disconnect abort handling', () => {
175
- let unhandled;
176
- let handler;
177
- beforeEach(() => {
178
- unhandled = [];
179
- handler = (err) => unhandled.push(err);
180
- process.on('unhandledRejection', handler);
181
- });
182
- afterEach(() => {
183
- process.off('unhandledRejection', handler);
184
- });
185
- it('does not leak unhandled rejection when client disconnects mid-stream', async () => {
186
- const logger = createLogger({ component: 'test:admin-chat-abort' });
187
- const sm = new StandaloneSessionManager({ logger, ttlMs: 60_000 });
188
- const session = sm.create({
189
- provider: abortAwareStreamingProvider(),
190
- toolRegistry: createToolRegistry(),
191
- permissionChecker: { check: () => ({ allowed: true }) },
192
- systemPrompt: 'test',
193
- appId: 'admin',
194
- });
195
- const server = await startServer(sm);
196
- try {
197
- await postAndDisconnect(server.port, session.id);
198
- await new Promise((r) => setTimeout(r, 500));
199
- expect(unhandled).toHaveLength(0);
200
- }
201
- finally {
202
- await server.close();
203
- await sm.shutdown();
204
- }
205
- });
206
- });
207
- //# sourceMappingURL=admin-chat-abort.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"admin-chat-abort.test.js","sourceRoot":"","sources":["../../../../src/agent/routes/admin-chat-abort.test.ts"],"names":[],"mappings":"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"}
@@ -1,28 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2026 Amodal Labs, Inc.
4
- * SPDX-License-Identifier: MIT
5
- */
6
- /**
7
- * Admin chat route.
8
- *
9
- * Creates admin sessions with admin agent skills/knowledge, isolated from
10
- * the primary agent. Uses StandaloneSessionManager + buildSessionComponents
11
- * with sessionType 'admin'.
12
- */
13
- import { Router } from 'express';
14
- import type { AgentBundle } from '@amodalai/types';
15
- import type { StandaloneSessionManager } from '../../session/manager.js';
16
- import type { SharedResources } from '../../routes/session-resolver.js';
17
- export interface AdminChatRouterOptions {
18
- sessionManager: StandaloneSessionManager;
19
- shared: SharedResources;
20
- /** The bundle for the current agent repo. */
21
- getBundle: () => AgentBundle | undefined;
22
- getPort?: () => number | null;
23
- }
24
- /**
25
- * Router for the admin/config chat. Creates admin sessions with admin agent
26
- * skills/knowledge, isolated from the primary agent.
27
- */
28
- export declare function createAdminChatRouter(options: AdminChatRouterOptions): Router;
@@ -1,110 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2026 Amodal Labs, Inc.
4
- * SPDX-License-Identifier: MIT
5
- */
6
- /**
7
- * Admin chat route.
8
- *
9
- * Creates admin sessions with admin agent skills/knowledge, isolated from
10
- * the primary agent. Uses StandaloneSessionManager + buildSessionComponents
11
- * with sessionType 'admin'.
12
- */
13
- import { Router } from 'express';
14
- import { ensureAdminAgent, loadAdminAgent } from '@amodalai/core';
15
- import { AgentChatRequestSchema } from '../agent-types.js';
16
- import { buildSessionComponents } from '../../session/session-builder.js';
17
- import { SSEEventType } from '../../types.js';
18
- import { SessionError } from '../../errors.js';
19
- import { asyncHandler } from '../../routes/route-helpers.js';
20
- function writeSSE(res, event) {
21
- res.write(`data: ${JSON.stringify(event)}\n\n`);
22
- }
23
- function ts() {
24
- return new Date().toISOString();
25
- }
26
- /**
27
- * Router for the admin/config chat. Creates admin sessions with admin agent
28
- * skills/knowledge, isolated from the primary agent.
29
- */
30
- export function createAdminChatRouter(options) {
31
- const router = Router();
32
- router.post('/config/chat', asyncHandler(async (req, res) => {
33
- const parsed = AgentChatRequestSchema.safeParse(req.body);
34
- if (!parsed.success) {
35
- res.status(400).json({ error: 'Invalid request', details: parsed.error.issues });
36
- return;
37
- }
38
- const { message, session_id: sessionId } = parsed.data;
39
- // Set up SSE
40
- res.setHeader('Content-Type', 'text/event-stream');
41
- res.setHeader('Cache-Control', 'no-cache');
42
- res.setHeader('Connection', 'keep-alive');
43
- res.flushHeaders();
44
- try {
45
- const bundle = options.getBundle();
46
- if (!bundle) {
47
- throw new SessionError('Admin sessions require a bundle', {
48
- sessionId: sessionId ?? 'new',
49
- context: { operation: 'admin_chat' },
50
- });
51
- }
52
- if (bundle.source !== 'local') {
53
- throw new SessionError('Admin sessions are only available for local repos', {
54
- sessionId: sessionId ?? 'new',
55
- context: { operation: 'admin_chat', source: bundle.source },
56
- });
57
- }
58
- // Check for existing in-memory session
59
- let session = sessionId ? options.sessionManager.get(sessionId) : undefined;
60
- let toolContextFactory = session?.toolContextFactory;
61
- if (!session) {
62
- // Load admin agent content
63
- const agentDir = await ensureAdminAgent(bundle.origin);
64
- const adminContent = await loadAdminAgent(agentDir);
65
- // Build components with admin content swapped in
66
- const components = buildSessionComponents({
67
- bundle,
68
- storeBackend: options.shared.storeBackend,
69
- mcpManager: options.shared.mcpManager,
70
- logger: options.shared.logger,
71
- toolExecutor: options.shared.toolExecutor,
72
- fieldScrubber: options.shared.fieldScrubber,
73
- sessionType: 'admin',
74
- adminContent,
75
- repoRoot: bundle.origin,
76
- getPort: options.getPort,
77
- appId: 'admin',
78
- });
79
- session = options.sessionManager.create({
80
- provider: components.provider,
81
- toolRegistry: components.toolRegistry,
82
- permissionChecker: components.permissionChecker,
83
- systemPrompt: components.systemPrompt,
84
- toolContextFactory: components.toolContextFactory,
85
- appId: 'admin',
86
- });
87
- toolContextFactory = components.toolContextFactory;
88
- }
89
- writeSSE(res, { type: SSEEventType.Init, session_id: session.id, timestamp: ts() });
90
- const controller = new AbortController();
91
- res.on('close', () => controller.abort());
92
- for await (const event of options.sessionManager.runMessage(session.id, message, {
93
- signal: controller.signal,
94
- buildToolContext: toolContextFactory,
95
- })) {
96
- if (controller.signal.aborted)
97
- break;
98
- writeSSE(res, event);
99
- }
100
- }
101
- catch (err) {
102
- const errMsg = err instanceof Error ? err.message : String(err);
103
- writeSSE(res, { type: SSEEventType.Error, message: `Admin agent unavailable: ${errMsg}`, timestamp: ts() });
104
- }
105
- writeSSE(res, { type: SSEEventType.Done, timestamp: ts() });
106
- res.end();
107
- }));
108
- return router;
109
- }
110
- //# sourceMappingURL=admin-chat.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"admin-chat.js","sourceRoot":"","sources":["../../../../src/agent/routes/admin-chat.ts"],"names":[],"mappings":"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"}