@amodalai/runtime 0.2.10 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/__fixtures__/e2e.test.js +2 -2
- package/dist/src/__fixtures__/e2e.test.js.map +1 -1
- package/dist/src/__fixtures__/smoke.test.js +0 -88
- package/dist/src/__fixtures__/smoke.test.js.map +1 -1
- package/dist/src/__tests__/studio-integration.test.js +298 -0
- package/dist/src/__tests__/studio-integration.test.js.map +1 -0
- package/dist/src/agent/agent-types.d.ts +4 -0
- package/dist/src/agent/feedback-store.d.ts +11 -10
- package/dist/src/agent/feedback-store.js +147 -75
- package/dist/src/agent/feedback-store.js.map +1 -1
- package/dist/src/agent/local-server.js +30 -111
- package/dist/src/agent/local-server.js.map +1 -1
- package/dist/src/agent/local-server.test.js +17 -1
- package/dist/src/agent/local-server.test.js.map +1 -1
- package/dist/src/agent/routes/context.d.ts +24 -0
- package/dist/src/agent/routes/context.js +30 -0
- package/dist/src/agent/routes/context.js.map +1 -0
- package/dist/src/agent/routes/feedback.js +28 -56
- package/dist/src/agent/routes/feedback.js.map +1 -1
- package/dist/src/api/create-agent.js +8 -4
- package/dist/src/api/create-agent.js.map +1 -1
- package/dist/src/api/types.d.ts +1 -1
- package/dist/src/channels/channel-session-mapper.js +1 -1
- package/dist/src/channels/channel-session-mapper.js.map +1 -1
- package/dist/src/config.d.ts +2 -2
- package/dist/src/config.js +2 -1
- package/dist/src/config.js.map +1 -1
- package/dist/src/config.test.js +1 -1
- package/dist/src/config.test.js.map +1 -1
- package/dist/src/errors.d.ts +2 -2
- package/dist/src/errors.js +2 -2
- package/dist/src/index.d.ts +0 -3
- package/dist/src/index.js +0 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/session/drizzle-session-store.d.ts +4 -6
- package/dist/src/session/drizzle-session-store.js +15 -5
- package/dist/src/session/drizzle-session-store.js.map +1 -1
- package/dist/src/session/manager.js +1 -1
- package/dist/src/session/manager.test.js +7 -5
- package/dist/src/session/manager.test.js.map +1 -1
- package/dist/src/session/postgres-session-store.d.ts +3 -24
- package/dist/src/session/postgres-session-store.js +9 -128
- package/dist/src/session/postgres-session-store.js.map +1 -1
- package/dist/src/session/session-builder.d.ts +0 -4
- package/dist/src/session/session-builder.js +2 -9
- package/dist/src/session/session-builder.js.map +1 -1
- package/dist/src/session/session-builder.test.js +0 -25
- package/dist/src/session/session-builder.test.js.map +1 -1
- package/dist/src/session/session-store-selector.d.ts +11 -26
- package/dist/src/session/session-store-selector.js +3 -48
- package/dist/src/session/session-store-selector.js.map +1 -1
- package/dist/src/session/session-store-selector.test.js +5 -57
- package/dist/src/session/session-store-selector.test.js.map +1 -1
- package/dist/src/session/store.d.ts +8 -14
- package/dist/src/session/store.js +8 -10
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/store.test.js +6 -126
- package/dist/src/session/store.test.js.map +1 -1
- package/dist/src/session/tool-context-factory.js +1 -1
- package/dist/src/session/tool-context-factory.js.map +1 -1
- package/dist/src/stores/drizzle-store-backend.d.ts +5 -0
- package/dist/src/stores/drizzle-store-backend.js +23 -3
- package/dist/src/stores/drizzle-store-backend.js.map +1 -1
- package/dist/src/stores/drizzle-store-backend.test.js +10 -58
- package/dist/src/stores/drizzle-store-backend.test.js.map +1 -1
- package/dist/src/stores/index.d.ts +0 -2
- package/dist/src/stores/index.js +0 -1
- package/dist/src/stores/index.js.map +1 -1
- package/dist/src/stores/postgres-store-backend.d.ts +5 -15
- package/dist/src/stores/postgres-store-backend.js +14 -72
- package/dist/src/stores/postgres-store-backend.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -6
- package/dist/src/agent/automation-bridge.d.ts +0 -33
- package/dist/src/agent/automation-bridge.js +0 -50
- package/dist/src/agent/automation-bridge.js.map +0 -1
- package/dist/src/agent/automation-bridge.test.d.ts +0 -6
- package/dist/src/agent/automation-bridge.test.js +0 -130
- package/dist/src/agent/automation-bridge.test.js.map +0 -1
- package/dist/src/agent/eval-store.d.ts +0 -50
- package/dist/src/agent/eval-store.js +0 -137
- package/dist/src/agent/eval-store.js.map +0 -1
- package/dist/src/agent/proactive/delivery-router.d.ts +0 -68
- package/dist/src/agent/proactive/delivery-router.js +0 -337
- package/dist/src/agent/proactive/delivery-router.js.map +0 -1
- package/dist/src/agent/proactive/delivery-router.test.js +0 -455
- package/dist/src/agent/proactive/delivery-router.test.js.map +0 -1
- package/dist/src/agent/proactive/delivery.d.ts +0 -21
- package/dist/src/agent/proactive/delivery.js +0 -68
- package/dist/src/agent/proactive/delivery.js.map +0 -1
- package/dist/src/agent/proactive/delivery.test.d.ts +0 -6
- package/dist/src/agent/proactive/delivery.test.js +0 -65
- package/dist/src/agent/proactive/delivery.test.js.map +0 -1
- package/dist/src/agent/proactive/proactive-runner.d.ts +0 -129
- package/dist/src/agent/proactive/proactive-runner.js +0 -301
- package/dist/src/agent/proactive/proactive-runner.js.map +0 -1
- package/dist/src/agent/proactive/proactive-runner.test.d.ts +0 -6
- package/dist/src/agent/proactive/proactive-runner.test.js +0 -250
- package/dist/src/agent/proactive/proactive-runner.test.js.map +0 -1
- package/dist/src/agent/routes/admin-chat-abort.test.d.ts +0 -6
- package/dist/src/agent/routes/admin-chat-abort.test.js +0 -207
- package/dist/src/agent/routes/admin-chat-abort.test.js.map +0 -1
- package/dist/src/agent/routes/admin-chat.d.ts +0 -28
- package/dist/src/agent/routes/admin-chat.js +0 -110
- package/dist/src/agent/routes/admin-chat.js.map +0 -1
- package/dist/src/agent/routes/automations.d.ts +0 -19
- package/dist/src/agent/routes/automations.js +0 -86
- package/dist/src/agent/routes/automations.js.map +0 -1
- package/dist/src/agent/routes/automations.test.d.ts +0 -6
- package/dist/src/agent/routes/automations.test.js +0 -117
- package/dist/src/agent/routes/automations.test.js.map +0 -1
- package/dist/src/agent/routes/evals.d.ts +0 -17
- package/dist/src/agent/routes/evals.js +0 -389
- package/dist/src/agent/routes/evals.js.map +0 -1
- package/dist/src/agent/routes/webhooks.d.ts +0 -17
- package/dist/src/agent/routes/webhooks.js +0 -63
- package/dist/src/agent/routes/webhooks.js.map +0 -1
- package/dist/src/agent/routes/webhooks.test.d.ts +0 -6
- package/dist/src/agent/routes/webhooks.test.js +0 -100
- package/dist/src/agent/routes/webhooks.test.js.map +0 -1
- package/dist/src/session/pglite-session-store.d.ts +0 -23
- package/dist/src/session/pglite-session-store.js +0 -92
- package/dist/src/session/pglite-session-store.js.map +0 -1
- package/dist/src/stores/pglite-store-backend.d.ts +0 -39
- package/dist/src/stores/pglite-store-backend.js +0 -128
- package/dist/src/stores/pglite-store-backend.js.map +0 -1
- package/dist/src/stores/pglite-store-backend.test.d.ts +0 -6
- package/dist/src/stores/pglite-store-backend.test.js +0 -150
- package/dist/src/stores/pglite-store-backend.test.js.map +0 -1
- package/dist/src/stores/schema.d.ts +0 -593
- package/dist/src/stores/schema.js +0 -75
- package/dist/src/stores/schema.js.map +0 -1
- package/dist/src/tools/admin-file-tools.d.ts +0 -42
- package/dist/src/tools/admin-file-tools.js +0 -714
- package/dist/src/tools/admin-file-tools.js.map +0 -1
- package/dist/src/tools/admin-file-tools.test.d.ts +0 -6
- package/dist/src/tools/admin-file-tools.test.js +0 -523
- package/dist/src/tools/admin-file-tools.test.js.map +0 -1
- /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":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAC,MAAM,QAAQ,CAAC;AACvE,OAAO,EAAC,eAAe,EAAC,MAAM,uBAAuB,CAAC;AAGtD,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAE7C,MAAM,MAAM,GAAG,YAAY,CAAC,EAAC,SAAS,EAAE,uBAAuB,EAAC,CAAC,CAAC;AAElE,gBAAgB;AAChB,MAAM,EAAC,iBAAiB,EAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC5C,iBAAiB,EAAE,EAAE,CAAC,EAAE,EAAE;CAC3B,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9B,aAAa,EAAE,iBAAiB;CACjC,CAAC,CAAC,CAAC;AAEJ,SAAS,cAAc,CAAC,SAAqC;IAC3D,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,iBAAiB;QACxB,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE,WAAW;QACrB,MAAM,EAAE,gBAAgB;QACxB,QAAQ,EAAE,uBAAuB;QACjC,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,WAA+B;IAC/C,OAAO;QACL,MAAM,EAAE,OAAO;QACf,MAAM,EAAE,OAAO;QACf,MAAM,EAAE;YACN,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,EAAC,IAAI,EAAE,EAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,0BAA0B,EAAC,EAAC;SAC3E;QACD,WAAW,EAAE,IAAI,GAAG,EAAE;QACtB,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,EAAC,SAAS,EAAE,EAAE,EAAC;QACvB,WAAW;QACX,SAAS,EAAE,EAAE;QACb,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,EAAE;KACX,CAAC;AACJ,CAAC;AAED,mCAAmC;AACnC,MAAM,WAAW,GAAY;IAC3B,EAAE,EAAE,cAAc;IAClB,QAAQ,EAAE,EAAyB;IACnC,YAAY,EAAE,EAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAC;IACpH,iBAAiB,EAAE,EAAC,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAC;IACnC,MAAM;IACN,YAAY,EAAE,MAAM;IACpB,QAAQ,EAAE,EAAE;IACZ,KAAK,EAAE,EAAC,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAC;IACxD,KAAK,EAAE,YAAY;IACnB,YAAY,EAAE,MAAM;IACpB,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,EAAE;IACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;IACrB,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE;IAC1B,QAAQ,EAAE,EAAE;IACZ,gBAAgB,EAAE,OAAO;CAC1B,CAAC;AAEF,MAAM,sBAAsB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAEvC,SAAS,kBAAkB;IACzB,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,SAAS,CAAC;QAC/C,MAAM,EAAC,IAAI,EAAE,YAAY,CAAC,SAAS,EAAE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAC,CAAC;QACpG,MAAM,EAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,cAAyC;IACnE,OAAO;QACL,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,WAAW,CAAC;QAC5C,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;QACZ,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;QACZ,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;QACf,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAC7C,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAC7C,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;QACtB,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;QACd,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;QACjB,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;QAChB,UAAU,EAAE,cAAc,IAAI,kBAAkB,EAAE;QAClD,IAAI,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAKD,SAAS,UAAU,CAAC,SAAmC;IACrD,MAAM,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAChC,OAAO;QACL,cAAc,EAAE,EAAE;QAClB,uBAAuB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;YAC/C,OAAO,EAAE,WAAW;YACpB,kBAAkB,EAAE,sBAAsB;SAC3C,CAAC;QACF,MAAM;QACN,GAAG,SAAS;KACuB,CAAC;AACxC,CAAC;AAED,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,iBAAiB,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,IAAI,GAAG,QAAQ,CAAC;YACpB,cAAc,CAAC,EAAC,IAAI,EAAE,IAAI,EAAC,CAAC;YAC5B,cAAc,CAAC,EAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAC,CAAC;SACjG,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAEvD,MAAM,IAAI,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,IAAI,GAAG,QAAQ,CAAC;YACpB,cAAc,CAAC,EAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAC,CAAC;YACzD,cAAc,CAAC,EAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAC,CAAC;SAC3D,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAEvD,MAAM,WAAW,GAAG,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEvC,MAAM,IAAI,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEnE,MAAM,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,cAAc,CAAC,EAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,aAAa,EAAC,CAAC,CAAC,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAEvD,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAElD,MAAM,CAAC,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,cAAc,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAC,CAAC,CAAC,CAAC,CAAC;QAC5H,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,cAAc,CAAC,EAAC,IAAI,EAAE,GAAG,EAAC,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,IAAI,GAAG,QAAQ,CAAC;YACpB,cAAc,CAAC,EAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAC,CAAC;YACzD,cAAc,CAAC,EAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAC,CAAC;YAC1D,cAAc,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAC,CAAC;SACnG,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,EAAE,CAAC;QAEf,MAAM,IAAI,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAElE,MAAM,CAAC,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,IAAI,GAAG,QAAQ,CAAC;YACpB,cAAc,CAAC,EAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAC,CAAC;SAC1D,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,EAAE,CAAC;QAEd,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,IAAI,GAAG,QAAQ,CAAC;YACpB,cAAc,CAAC;gBACb,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,SAAS;gBAClB,QAAQ,EAAE,SAAS;gBACnB,MAAM,EAAE,kCAAkC;aAC3C,CAAC;SACH,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,cAAc,EAAE,EAAC,KAAK,EAAE,UAAU,EAAC,CAAC,CAAC;QAC/E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,cAAc,CAAC,EAAC,IAAI,EAAE,WAAW,EAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,cAAc,CAAC,EAAC,IAAI,EAAE,QAAQ,EAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,cAAc,CAAC,EAAC,IAAI,EAAE,cAAc,EAAC,CAAC,CAAC,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEjD,MAAM,MAAM,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,IAAI,GAAG,QAAQ,CAAC;YACpB,cAAc,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAC,CAAC;YAC1D,cAAc,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAC,CAAC;SACnG,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAEvD,MAAM,IAAI,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QACjD,MAAM,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -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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"}
|