@bytespell/amux 0.0.11 → 0.0.13

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 (89) hide show
  1. package/.claude/settings.local.json +11 -0
  2. package/CLAUDE.md +104 -0
  3. package/LICENSE +21 -0
  4. package/README.md +215 -0
  5. package/dist/cli.d.ts +14 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +118 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/client.d.ts +68 -0
  10. package/dist/client.d.ts.map +1 -0
  11. package/dist/client.js +135 -0
  12. package/dist/client.js.map +1 -0
  13. package/dist/index.d.ts +41 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +44 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/{lib/mentions.d.ts → message-parser.d.ts} +3 -5
  18. package/dist/message-parser.d.ts.map +1 -0
  19. package/dist/message-parser.js +45 -0
  20. package/dist/message-parser.js.map +1 -0
  21. package/dist/message-parser.test.d.ts +2 -0
  22. package/dist/message-parser.test.d.ts.map +1 -0
  23. package/dist/message-parser.test.js +188 -0
  24. package/dist/message-parser.test.js.map +1 -0
  25. package/dist/server.d.ts +24 -0
  26. package/dist/server.d.ts.map +1 -0
  27. package/dist/server.js +356 -0
  28. package/dist/server.js.map +1 -0
  29. package/dist/session-updates.d.ts +26 -0
  30. package/dist/session-updates.d.ts.map +1 -0
  31. package/dist/session-updates.js +68 -0
  32. package/dist/session-updates.js.map +1 -0
  33. package/dist/session-updates.test.d.ts +2 -0
  34. package/dist/session-updates.test.d.ts.map +1 -0
  35. package/dist/session-updates.test.js +223 -0
  36. package/dist/session-updates.test.js.map +1 -0
  37. package/dist/session.d.ts +208 -0
  38. package/dist/session.d.ts.map +1 -0
  39. package/dist/session.js +580 -0
  40. package/dist/session.js.map +1 -0
  41. package/dist/state.d.ts +74 -0
  42. package/dist/state.d.ts.map +1 -0
  43. package/dist/state.js +250 -0
  44. package/dist/state.js.map +1 -0
  45. package/dist/terminal.d.ts +47 -0
  46. package/dist/terminal.d.ts.map +1 -0
  47. package/dist/terminal.js +137 -0
  48. package/dist/terminal.js.map +1 -0
  49. package/dist/types.d.ts +64 -2
  50. package/dist/types.d.ts.map +1 -0
  51. package/dist/types.js +16 -31
  52. package/dist/types.js.map +1 -1
  53. package/dist/ws-adapter.d.ts +39 -0
  54. package/dist/ws-adapter.d.ts.map +1 -0
  55. package/dist/ws-adapter.js +198 -0
  56. package/dist/ws-adapter.js.map +1 -0
  57. package/package.json +47 -24
  58. package/src/client.ts +162 -0
  59. package/src/index.ts +66 -0
  60. package/src/message-parser.test.ts +207 -0
  61. package/src/message-parser.ts +54 -0
  62. package/src/session-updates.test.ts +265 -0
  63. package/src/session-updates.ts +87 -0
  64. package/src/session.ts +737 -0
  65. package/src/state.ts +287 -0
  66. package/src/terminal.ts +164 -0
  67. package/src/types.ts +88 -0
  68. package/src/ws-adapter.ts +245 -0
  69. package/tsconfig.json +22 -0
  70. package/vitest.config.ts +7 -0
  71. package/dist/chunk-5IPYOXBE.js +0 -32
  72. package/dist/chunk-5IPYOXBE.js.map +0 -1
  73. package/dist/chunk-C73RKCTS.js +0 -36
  74. package/dist/chunk-C73RKCTS.js.map +0 -1
  75. package/dist/chunk-VVXT4HQM.js +0 -779
  76. package/dist/chunk-VVXT4HQM.js.map +0 -1
  77. package/dist/lib/logger.d.ts +0 -24
  78. package/dist/lib/logger.js +0 -17
  79. package/dist/lib/logger.js.map +0 -1
  80. package/dist/lib/mentions.js +0 -7
  81. package/dist/lib/mentions.js.map +0 -1
  82. package/dist/streams/backends/index.d.ts +0 -88
  83. package/dist/streams/backends/index.js +0 -13
  84. package/dist/streams/backends/index.js.map +0 -1
  85. package/dist/streams/manager.d.ts +0 -55
  86. package/dist/streams/manager.js +0 -248
  87. package/dist/streams/manager.js.map +0 -1
  88. package/dist/types-DCRtrjjj.d.ts +0 -192
  89. package/scripts/fix-pty.cjs +0 -21
package/dist/server.js ADDED
@@ -0,0 +1,356 @@
1
+ import express from 'express';
2
+ import { createServer } from 'http';
3
+ import { WebSocketServer, WebSocket } from 'ws';
4
+ import path from 'path';
5
+ import fs from 'fs';
6
+ import os from 'os';
7
+ import { AgentSession } from './session.js';
8
+ import { StateManager } from './state.js';
9
+ /**
10
+ * Create an amux server with full Express + WebSocket setup.
11
+ * This is the "batteries included" API for building agent-powered plugins.
12
+ */
13
+ export function createAmuxServer(config = {}) {
14
+ const PORT = config.port ?? (process.env.PORT ? parseInt(process.env.PORT, 10) : 3000);
15
+ const INSTANCE_ID = process.env.INSTANCE_ID ?? 'default';
16
+ const basePath = config.basePath ?? process.cwd();
17
+ const isDev = config.dev ?? !config.staticDir;
18
+ const app = express();
19
+ const server = createServer(app);
20
+ const clients = new Set();
21
+ // State manager
22
+ const stateManager = new StateManager(config.stateDir);
23
+ // Broadcast function
24
+ function broadcast(message) {
25
+ const msgStr = JSON.stringify(message);
26
+ for (const client of clients) {
27
+ if (client.readyState === WebSocket.OPEN) {
28
+ client.send(msgStr);
29
+ }
30
+ }
31
+ }
32
+ // Create agent session
33
+ const agentSession = new AgentSession({
34
+ instanceId: INSTANCE_ID,
35
+ basePath,
36
+ broadcast,
37
+ systemContext: config.systemContext,
38
+ fixedCwd: config.fixedCwd,
39
+ agentType: config.agentType,
40
+ stateDir: config.stateDir,
41
+ });
42
+ // Allow embedding in iframes
43
+ app.use((_req, res, next) => {
44
+ res.removeHeader('X-Frame-Options');
45
+ res.setHeader('Content-Security-Policy', 'frame-ancestors *');
46
+ next();
47
+ });
48
+ app.use(express.json());
49
+ // --- HTTP API Routes ---
50
+ // Health check
51
+ app.get('/api/health', (_req, res) => {
52
+ res.json({ status: 'ok' });
53
+ });
54
+ // List directories for picker
55
+ app.get('/api/directories', (req, res) => {
56
+ const dirPath = req.query.path || os.homedir();
57
+ try {
58
+ const stats = fs.statSync(dirPath);
59
+ if (!stats.isDirectory()) {
60
+ res.status(400).json({ error: 'Not a directory' });
61
+ return;
62
+ }
63
+ const entries = fs.readdirSync(dirPath, { withFileTypes: true });
64
+ const directories = entries
65
+ .filter(e => e.isDirectory() && !e.name.startsWith('.'))
66
+ .map(e => e.name)
67
+ .sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));
68
+ const response = {
69
+ path: dirPath,
70
+ parent: path.dirname(dirPath),
71
+ directories,
72
+ isRoot: dirPath === '/' || dirPath === path.dirname(dirPath),
73
+ };
74
+ res.json(response);
75
+ }
76
+ catch (err) {
77
+ res.status(400).json({ error: err.message });
78
+ }
79
+ });
80
+ // Get replay history
81
+ app.get('/api/history', (_req, res) => {
82
+ const history = stateManager.loadHistory(agentSession.sessionId);
83
+ res.json({ history, sessionId: agentSession.sessionId });
84
+ });
85
+ // Clear history
86
+ app.delete('/api/history', (_req, res) => {
87
+ stateManager.clearHistory(agentSession.sessionId);
88
+ res.json({ success: true });
89
+ });
90
+ // Get available agents
91
+ app.get('/api/agents', (_req, res) => {
92
+ const agents = agentSession.getAvailableAgents().map(a => ({
93
+ ...a,
94
+ current: a.id === agentSession.agentType,
95
+ }));
96
+ res.json({ agents, currentAgent: agentSession.agentType });
97
+ });
98
+ // --- WebSocket Setup ---
99
+ const wss = new WebSocketServer({ server, path: '/ws' });
100
+ wss.on('connection', (ws) => {
101
+ console.log('[amux] Client connected');
102
+ clients.add(ws);
103
+ // Send current state to new client
104
+ if (agentSession.isConnected) {
105
+ ws.send(JSON.stringify({
106
+ type: 'ready',
107
+ cwd: agentSession.cwd,
108
+ sessionId: agentSession.sessionId,
109
+ capabilities: agentSession.agentCapabilities,
110
+ agent: agentSession.getAgentInfo(),
111
+ availableAgents: agentSession.getAvailableAgents(),
112
+ systemContext: agentSession.systemContext ? true : undefined,
113
+ }));
114
+ // Send history to hydrate the chat UI
115
+ const history = stateManager.loadHistory(agentSession.sessionId);
116
+ if (history.length > 0) {
117
+ ws.send(JSON.stringify({
118
+ type: 'history_replay',
119
+ previousSessionId: agentSession.sessionId,
120
+ events: history,
121
+ eventCount: history.length,
122
+ }));
123
+ }
124
+ }
125
+ else {
126
+ ws.send(JSON.stringify({ type: 'connecting' }));
127
+ }
128
+ ws.on('message', async (message) => {
129
+ try {
130
+ const msg = JSON.parse(message.toString());
131
+ await handleWsMessage(ws, msg, agentSession);
132
+ }
133
+ catch (err) {
134
+ console.error('[amux] Invalid message:', err);
135
+ }
136
+ });
137
+ ws.on('close', () => {
138
+ console.log('[amux] Client disconnected');
139
+ clients.delete(ws);
140
+ });
141
+ ws.on('error', (err) => {
142
+ console.error('[amux] WebSocket error:', err);
143
+ clients.delete(ws);
144
+ });
145
+ });
146
+ /**
147
+ * Handle WebSocket messages
148
+ */
149
+ async function handleWsMessage(ws, msg, session) {
150
+ switch (msg.type) {
151
+ case 'prompt':
152
+ if (!session.isConnected || !session.sessionId) {
153
+ ws.send(JSON.stringify({ type: 'error', message: 'Agent not ready' }));
154
+ return;
155
+ }
156
+ try {
157
+ await session.prompt(msg.message);
158
+ }
159
+ catch {
160
+ // Error already broadcast by session
161
+ }
162
+ break;
163
+ case 'cancel':
164
+ await session.cancel();
165
+ break;
166
+ case 'permission_response':
167
+ session.handlePermissionResponse(msg.requestId, msg.optionId);
168
+ break;
169
+ case 'change_cwd':
170
+ if (msg.path) {
171
+ try {
172
+ const stats = fs.statSync(msg.path);
173
+ if (stats.isDirectory()) {
174
+ await session.changeCwd(msg.path);
175
+ }
176
+ else {
177
+ ws.send(JSON.stringify({ type: 'error', message: 'Path is not a directory' }));
178
+ }
179
+ }
180
+ catch (err) {
181
+ ws.send(JSON.stringify({ type: 'error', message: `Invalid path: ${err.message}` }));
182
+ }
183
+ }
184
+ break;
185
+ case 'new_session':
186
+ try {
187
+ await session.newSession();
188
+ }
189
+ catch (err) {
190
+ ws.send(JSON.stringify({ type: 'error', message: `Failed to create session: ${err.message}` }));
191
+ }
192
+ break;
193
+ case 'set_mode':
194
+ if (msg.modeId) {
195
+ try {
196
+ await session.setMode(msg.modeId);
197
+ }
198
+ catch (err) {
199
+ ws.send(JSON.stringify({ type: 'error', message: `Failed to set mode: ${err.message}` }));
200
+ }
201
+ }
202
+ break;
203
+ case 'set_model':
204
+ if (msg.modelId) {
205
+ try {
206
+ await session.setModel(msg.modelId);
207
+ }
208
+ catch (err) {
209
+ ws.send(JSON.stringify({ type: 'error', message: `Failed to set model: ${err.message}` }));
210
+ }
211
+ }
212
+ break;
213
+ case 'change_agent':
214
+ if (msg.agentType) {
215
+ try {
216
+ await session.changeAgent(msg.agentType);
217
+ }
218
+ catch (err) {
219
+ ws.send(JSON.stringify({ type: 'error', message: `${err.message}` }));
220
+ }
221
+ }
222
+ break;
223
+ case 'get_history': {
224
+ const history = stateManager.loadHistory(session.sessionId);
225
+ ws.send(JSON.stringify({ type: 'history', events: history, sessionId: session.sessionId }));
226
+ break;
227
+ }
228
+ case 'list_sessions':
229
+ try {
230
+ const sessions = await session.listSessions();
231
+ ws.send(JSON.stringify({ type: 'sessions', sessions }));
232
+ }
233
+ catch (err) {
234
+ ws.send(JSON.stringify({ type: 'error', message: `Failed to list sessions: ${err.message}` }));
235
+ }
236
+ break;
237
+ case 'switch_session':
238
+ if (msg.sessionId) {
239
+ try {
240
+ await session.switchSession(msg.sessionId);
241
+ }
242
+ catch (err) {
243
+ ws.send(JSON.stringify({ type: 'error', message: `Failed to switch session: ${err.message}` }));
244
+ }
245
+ }
246
+ break;
247
+ }
248
+ }
249
+ // Start function
250
+ async function start() {
251
+ // Setup static serving
252
+ if (isDev && !config.staticDir) {
253
+ // In dev mode without static dir, just serve API
254
+ console.log('[amux] Running in API-only mode (no static files)');
255
+ }
256
+ else if (config.staticDir) {
257
+ app.use(express.static(config.staticDir));
258
+ app.get('/{*splat}', (_req, res) => {
259
+ res.sendFile(path.join(config.staticDir, 'index.html'));
260
+ });
261
+ }
262
+ // Start the agent
263
+ await agentSession.spawnAgent();
264
+ // Start HTTP server
265
+ server.listen(PORT, () => {
266
+ console.log(`[amux] Running on port ${PORT}`);
267
+ });
268
+ }
269
+ // Shutdown function
270
+ function shutdown() {
271
+ console.log('[amux] Shutting down');
272
+ agentSession.shutdown();
273
+ for (const ws of clients)
274
+ ws.close();
275
+ wss.close();
276
+ server.close();
277
+ }
278
+ // Handle SIGTERM
279
+ process.on('SIGTERM', () => {
280
+ shutdown();
281
+ process.exit(0);
282
+ });
283
+ return { app, server, start, shutdown };
284
+ }
285
+ /**
286
+ * Attach amux to an existing Express app and HTTP server.
287
+ * For when you want more control over the server setup.
288
+ */
289
+ export function attachAmux(_app, server, config) {
290
+ const INSTANCE_ID = process.env.INSTANCE_ID ?? 'default';
291
+ const basePath = config.basePath ?? process.cwd();
292
+ const clients = new Set();
293
+ // State manager
294
+ const stateManager = new StateManager(config.stateDir);
295
+ // Broadcast function
296
+ function broadcast(message) {
297
+ const msgStr = JSON.stringify(message);
298
+ for (const client of clients) {
299
+ if (client.readyState === WebSocket.OPEN) {
300
+ client.send(msgStr);
301
+ }
302
+ }
303
+ }
304
+ // Create agent session
305
+ const agentSession = new AgentSession({
306
+ instanceId: INSTANCE_ID,
307
+ basePath,
308
+ broadcast,
309
+ systemContext: config.systemContext,
310
+ fixedCwd: config.fixedCwd,
311
+ agentType: config.agentType,
312
+ stateDir: config.stateDir,
313
+ });
314
+ // WebSocket setup
315
+ const wss = new WebSocketServer({ server, path: '/ws' });
316
+ wss.on('connection', (ws) => {
317
+ console.log('[amux] Client connected');
318
+ clients.add(ws);
319
+ if (agentSession.isConnected) {
320
+ ws.send(JSON.stringify({
321
+ type: 'ready',
322
+ cwd: agentSession.cwd,
323
+ sessionId: agentSession.sessionId,
324
+ capabilities: agentSession.agentCapabilities,
325
+ agent: agentSession.getAgentInfo(),
326
+ availableAgents: agentSession.getAvailableAgents(),
327
+ }));
328
+ const history = stateManager.loadHistory(agentSession.sessionId);
329
+ if (history.length > 0) {
330
+ ws.send(JSON.stringify({
331
+ type: 'history_replay',
332
+ previousSessionId: agentSession.sessionId,
333
+ events: history,
334
+ eventCount: history.length,
335
+ }));
336
+ }
337
+ }
338
+ else {
339
+ ws.send(JSON.stringify({ type: 'connecting' }));
340
+ }
341
+ ws.on('close', () => {
342
+ clients.delete(ws);
343
+ });
344
+ });
345
+ async function start() {
346
+ await agentSession.spawnAgent();
347
+ }
348
+ function shutdown() {
349
+ agentSession.shutdown();
350
+ for (const ws of clients)
351
+ ws.close();
352
+ wss.close();
353
+ }
354
+ return { agentSession, start, shutdown };
355
+ }
356
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type * as acp from '@agentclientprotocol/sdk';
2
+ /**
3
+ * Type guard for tool_call session updates
4
+ */
5
+ export declare function isToolCallUpdate(update: acp.SessionUpdate): update is acp.ToolCall & {
6
+ sessionUpdate: 'tool_call';
7
+ };
8
+ /**
9
+ * Type guard for tool_call_update session updates
10
+ */
11
+ export declare function isToolCallUpdateMessage(update: acp.SessionUpdate): update is acp.ToolCallUpdate & {
12
+ sessionUpdate: 'tool_call_update';
13
+ };
14
+ /**
15
+ * Type guard for diff content items
16
+ */
17
+ export declare function isDiffContent(item: acp.ToolCallContent): item is acp.Diff & {
18
+ type: 'diff';
19
+ };
20
+ /**
21
+ * Normalize ACP session updates.
22
+ * Claude sends Edit/Write diffs as {newText, oldText, path} instead of unified diff.
23
+ * We convert these to standard unified diff format so the UI doesn't need agent-specific logic.
24
+ */
25
+ export declare function normalizeSessionUpdate(update: acp.SessionUpdate): acp.SessionUpdate;
26
+ //# sourceMappingURL=session-updates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-updates.d.ts","sourceRoot":"","sources":["../src/session-updates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,0BAA0B,CAAC;AAErD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,GAAG,CAAC,aAAa,GACxB,MAAM,IAAI,GAAG,CAAC,QAAQ,GAAG;IAAE,aAAa,EAAE,WAAW,CAAA;CAAE,CAEzD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,GAAG,CAAC,aAAa,GACxB,MAAM,IAAI,GAAG,CAAC,cAAc,GAAG;IAAE,aAAa,EAAE,kBAAkB,CAAA;CAAE,CAEtE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,GAAG,CAAC,eAAe,GACxB,IAAI,IAAI,GAAG,CAAC,IAAI,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAErC;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,GAAG,CAAC,aAAa,GACxB,GAAG,CAAC,aAAa,CAkDnB"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Type guard for tool_call session updates
3
+ */
4
+ export function isToolCallUpdate(update) {
5
+ return update.sessionUpdate === 'tool_call';
6
+ }
7
+ /**
8
+ * Type guard for tool_call_update session updates
9
+ */
10
+ export function isToolCallUpdateMessage(update) {
11
+ return update.sessionUpdate === 'tool_call_update';
12
+ }
13
+ /**
14
+ * Type guard for diff content items
15
+ */
16
+ export function isDiffContent(item) {
17
+ return item.type === 'diff';
18
+ }
19
+ /**
20
+ * Normalize ACP session updates.
21
+ * Claude sends Edit/Write diffs as {newText, oldText, path} instead of unified diff.
22
+ * We convert these to standard unified diff format so the UI doesn't need agent-specific logic.
23
+ */
24
+ export function normalizeSessionUpdate(update) {
25
+ // Only process tool_call and tool_call_update events with content arrays
26
+ if (!isToolCallUpdate(update) && !isToolCallUpdateMessage(update)) {
27
+ return update;
28
+ }
29
+ const content = update.content;
30
+ if (!content || !Array.isArray(content)) {
31
+ return update;
32
+ }
33
+ // Check for diff items that need normalization
34
+ const normalizedContent = content.map((item) => {
35
+ if (!isDiffContent(item))
36
+ return item;
37
+ const diffItem = item;
38
+ const newText = diffItem.newText;
39
+ const oldText = diffItem.oldText;
40
+ const filePath = diffItem.path ?? 'file';
41
+ // Generate unified diff
42
+ const oldLines = oldText ? oldText.split('\n') : [];
43
+ const newLines = newText.split('\n');
44
+ let unifiedDiff = `Index: ${filePath}\n`;
45
+ unifiedDiff += '===================================================================\n';
46
+ unifiedDiff += `--- ${filePath}\n`;
47
+ unifiedDiff += `+++ ${filePath}\n`;
48
+ unifiedDiff += `@@ -${oldLines.length > 0 ? 1 : 0},${oldLines.length} +1,${newLines.length} @@\n`;
49
+ for (const line of oldLines) {
50
+ unifiedDiff += `-${line}\n`;
51
+ }
52
+ for (const line of newLines) {
53
+ unifiedDiff += `+${line}\n`;
54
+ }
55
+ // Return normalized diff item
56
+ return {
57
+ type: 'diff',
58
+ newText: unifiedDiff,
59
+ oldText: '',
60
+ path: filePath,
61
+ };
62
+ });
63
+ return {
64
+ ...update,
65
+ content: normalizedContent,
66
+ };
67
+ }
68
+ //# sourceMappingURL=session-updates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-updates.js","sourceRoot":"","sources":["../src/session-updates.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAyB;IAEzB,OAAO,MAAM,CAAC,aAAa,KAAK,WAAW,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAyB;IAEzB,OAAO,MAAM,CAAC,aAAa,KAAK,kBAAkB,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAyB;IAEzB,OAAO,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;AAC9B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAAyB;IAEzB,yEAAyE;IACzE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC;QAClE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC/B,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,+CAA+C;IAC/C,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAuB,EAAE;QAClE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC;QACtB,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;QACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;QACjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,IAAI,MAAM,CAAC;QAEzC,wBAAwB;QACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAErC,IAAI,WAAW,GAAG,UAAU,QAAQ,IAAI,CAAC;QACzC,WAAW,IAAI,uEAAuE,CAAC;QACvF,WAAW,IAAI,OAAO,QAAQ,IAAI,CAAC;QACnC,WAAW,IAAI,OAAO,QAAQ,IAAI,CAAC;QACnC,WAAW,IAAI,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,OAAO,QAAQ,CAAC,MAAM,OAAO,CAAC;QAElG,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,WAAW,IAAI,IAAI,IAAI,IAAI,CAAC;QAC9B,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,WAAW,IAAI,IAAI,IAAI,IAAI,CAAC;QAC9B,CAAC;QAED,8BAA8B;QAC9B,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,WAAW;YACpB,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,QAAQ;SACf,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,MAAM;QACT,OAAO,EAAE,iBAAiB;KAC3B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session-updates.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-updates.test.d.ts","sourceRoot":"","sources":["../src/session-updates.test.ts"],"names":[],"mappings":""}