shennian 0.1.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.
Files changed (107) hide show
  1. package/README.md +42 -0
  2. package/dist/bin/shennian.d.ts +3 -0
  3. package/dist/bin/shennian.d.ts.map +1 -0
  4. package/dist/bin/shennian.js +3 -0
  5. package/dist/bin/shennian.js.map +1 -0
  6. package/dist/src/__tests__/agents-e2e.d.ts +20 -0
  7. package/dist/src/__tests__/agents-e2e.d.ts.map +1 -0
  8. package/dist/src/__tests__/agents-e2e.js +145 -0
  9. package/dist/src/__tests__/agents-e2e.js.map +1 -0
  10. package/dist/src/__tests__/config.test.d.ts +2 -0
  11. package/dist/src/__tests__/config.test.d.ts.map +1 -0
  12. package/dist/src/__tests__/config.test.js +60 -0
  13. package/dist/src/__tests__/config.test.js.map +1 -0
  14. package/dist/src/__tests__/e2e-relay.d.ts +19 -0
  15. package/dist/src/__tests__/e2e-relay.d.ts.map +1 -0
  16. package/dist/src/__tests__/e2e-relay.js +218 -0
  17. package/dist/src/__tests__/e2e-relay.js.map +1 -0
  18. package/dist/src/__tests__/session-manager.test.d.ts +2 -0
  19. package/dist/src/__tests__/session-manager.test.d.ts.map +1 -0
  20. package/dist/src/__tests__/session-manager.test.js +151 -0
  21. package/dist/src/__tests__/session-manager.test.js.map +1 -0
  22. package/dist/src/__tests__/session-store.test.d.ts +2 -0
  23. package/dist/src/__tests__/session-store.test.d.ts.map +1 -0
  24. package/dist/src/__tests__/session-store.test.js +106 -0
  25. package/dist/src/__tests__/session-store.test.js.map +1 -0
  26. package/dist/src/agents/adapter.d.ts +40 -0
  27. package/dist/src/agents/adapter.d.ts.map +1 -0
  28. package/dist/src/agents/adapter.js +17 -0
  29. package/dist/src/agents/adapter.js.map +1 -0
  30. package/dist/src/agents/claude.d.ts +20 -0
  31. package/dist/src/agents/claude.d.ts.map +1 -0
  32. package/dist/src/agents/claude.js +188 -0
  33. package/dist/src/agents/claude.js.map +1 -0
  34. package/dist/src/agents/codex.d.ts +19 -0
  35. package/dist/src/agents/codex.d.ts.map +1 -0
  36. package/dist/src/agents/codex.js +289 -0
  37. package/dist/src/agents/codex.js.map +1 -0
  38. package/dist/src/agents/cursor.d.ts +18 -0
  39. package/dist/src/agents/cursor.d.ts.map +1 -0
  40. package/dist/src/agents/cursor.js +202 -0
  41. package/dist/src/agents/cursor.js.map +1 -0
  42. package/dist/src/agents/custom.d.ts +35 -0
  43. package/dist/src/agents/custom.d.ts.map +1 -0
  44. package/dist/src/agents/custom.js +247 -0
  45. package/dist/src/agents/custom.js.map +1 -0
  46. package/dist/src/agents/detect.d.ts +8 -0
  47. package/dist/src/agents/detect.d.ts.map +1 -0
  48. package/dist/src/agents/detect.js +46 -0
  49. package/dist/src/agents/detect.js.map +1 -0
  50. package/dist/src/agents/gemini.d.ts +18 -0
  51. package/dist/src/agents/gemini.d.ts.map +1 -0
  52. package/dist/src/agents/gemini.js +167 -0
  53. package/dist/src/agents/gemini.js.map +1 -0
  54. package/dist/src/agents/openclaw.d.ts +19 -0
  55. package/dist/src/agents/openclaw.d.ts.map +1 -0
  56. package/dist/src/agents/openclaw.js +202 -0
  57. package/dist/src/agents/openclaw.js.map +1 -0
  58. package/dist/src/commands/agent.d.ts +3 -0
  59. package/dist/src/commands/agent.d.ts.map +1 -0
  60. package/dist/src/commands/agent.js +148 -0
  61. package/dist/src/commands/agent.js.map +1 -0
  62. package/dist/src/commands/daemon.d.ts +14 -0
  63. package/dist/src/commands/daemon.d.ts.map +1 -0
  64. package/dist/src/commands/daemon.js +326 -0
  65. package/dist/src/commands/daemon.js.map +1 -0
  66. package/dist/src/commands/pair.d.ts +9 -0
  67. package/dist/src/commands/pair.d.ts.map +1 -0
  68. package/dist/src/commands/pair.js +162 -0
  69. package/dist/src/commands/pair.js.map +1 -0
  70. package/dist/src/config/index.d.ts +27 -0
  71. package/dist/src/config/index.d.ts.map +1 -0
  72. package/dist/src/config/index.js +24 -0
  73. package/dist/src/config/index.js.map +1 -0
  74. package/dist/src/fs/handler.d.ts +27 -0
  75. package/dist/src/fs/handler.d.ts.map +1 -0
  76. package/dist/src/fs/handler.js +113 -0
  77. package/dist/src/fs/handler.js.map +1 -0
  78. package/dist/src/fs/multimodal.d.ts +5 -0
  79. package/dist/src/fs/multimodal.d.ts.map +1 -0
  80. package/dist/src/fs/multimodal.js +39 -0
  81. package/dist/src/fs/multimodal.js.map +1 -0
  82. package/dist/src/fs/security.d.ts +3 -0
  83. package/dist/src/fs/security.d.ts.map +1 -0
  84. package/dist/src/fs/security.js +28 -0
  85. package/dist/src/fs/security.js.map +1 -0
  86. package/dist/src/index.d.ts +2 -0
  87. package/dist/src/index.d.ts.map +1 -0
  88. package/dist/src/index.js +132 -0
  89. package/dist/src/index.js.map +1 -0
  90. package/dist/src/region.d.ts +19 -0
  91. package/dist/src/region.d.ts.map +1 -0
  92. package/dist/src/region.js +87 -0
  93. package/dist/src/region.js.map +1 -0
  94. package/dist/src/relay/client.d.ts +38 -0
  95. package/dist/src/relay/client.d.ts.map +1 -0
  96. package/dist/src/relay/client.js +196 -0
  97. package/dist/src/relay/client.js.map +1 -0
  98. package/dist/src/session/manager.d.ts +23 -0
  99. package/dist/src/session/manager.d.ts.map +1 -0
  100. package/dist/src/session/manager.js +202 -0
  101. package/dist/src/session/manager.js.map +1 -0
  102. package/dist/src/session/store.d.ts +8 -0
  103. package/dist/src/session/store.d.ts.map +1 -0
  104. package/dist/src/session/store.js +47 -0
  105. package/dist/src/session/store.js.map +1 -0
  106. package/dist/tsconfig.tsbuildinfo +1 -0
  107. package/package.json +54 -0
package/README.md ADDED
@@ -0,0 +1,42 @@
1
+ # @shennian/cli
2
+
3
+ > Shennian AI Agent 移动控制台的本机 daemon / CLI
4
+ >
5
+ > **架构设计** → [docs/architecture/cli/](../../docs/architecture/cli/)
6
+ > - [Daemon 架构](../../docs/architecture/cli/daemon.md) — 模块拓扑、数据流、守护进程
7
+ > - [Agent Adapters](../../docs/architecture/cli/agent-adapters.md) — 5 种 agent 的适配与归一化
8
+ > - [开源 Agent Protocol](../../docs/architecture/cli/agent-protocol.md) — 第三方 agent 接入协议
9
+ >
10
+ > **开源协议 & SDK** → [packages/agent-protocol/](../agent-protocol/)
11
+
12
+ ## 常用命令
13
+
14
+ | 命令 | 说明 |
15
+ |------|------|
16
+ | `shennian` | 智能启动:必要时 pair 再启动 daemon |
17
+ | `shennian pair` | 重新与账号 / server 配对 |
18
+ | `shennian daemon status` | 查看 daemon 运行状态 |
19
+ | `shennian config` | 查看本地配置 |
20
+
21
+ ## 开发
22
+
23
+ ```bash
24
+ pnpm build # tsc 编译
25
+ pnpm dev # tsc --watch
26
+ ```
27
+
28
+ ## 测试
29
+
30
+ ```bash
31
+ cd packages/cli
32
+
33
+ # 全部 agent E2E
34
+ npx tsx src/__tests__/agents-e2e.ts
35
+
36
+ # 单个 agent
37
+ npx tsx src/__tests__/agents-e2e.ts claude
38
+ ```
39
+
40
+ ## 依赖
41
+
42
+ - `@shennian/wire` — 协议类型定义
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import '../src/index.js';
3
+ //# sourceMappingURL=shennian.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shennian.d.ts","sourceRoot":"","sources":["../../bin/shennian.ts"],"names":[],"mappings":";AACA,OAAO,iBAAiB,CAAA"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import '../src/index.js';
3
+ //# sourceMappingURL=shennian.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shennian.js","sourceRoot":"","sources":["../../bin/shennian.ts"],"names":[],"mappings":";AACA,OAAO,iBAAiB,CAAA"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @arch docs/architecture/cli/agent-adapters.md
3
+ * @covers src/agents/adapter.ts
4
+ * @covers src/agents/claude.ts, codex.ts, gemini.ts, cursor.ts, openclaw.ts
5
+ * @covers src/agents/custom.ts
6
+ *
7
+ * E2E smoke test for all agent adapters (built-in + custom).
8
+ *
9
+ * Usage: npx tsx src/__tests__/agents-e2e.ts [agent-name]
10
+ *
11
+ * Each adapter is asked: "严格返回一个hello,只有hello,不要解释"
12
+ * Pass criteria: at least one `delta` event whose text contains "hello" (case-insensitive),
13
+ * followed by a `final` event, within TIMEOUT_MS.
14
+ */
15
+ import '../agents/claude.js';
16
+ import '../agents/codex.js';
17
+ import '../agents/gemini.js';
18
+ import '../agents/cursor.js';
19
+ import '../agents/openclaw.js';
20
+ //# sourceMappingURL=agents-e2e.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-e2e.d.ts","sourceRoot":"","sources":["../../../src/__tests__/agents-e2e.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,qBAAqB,CAAA;AAC5B,OAAO,oBAAoB,CAAA;AAC3B,OAAO,qBAAqB,CAAA;AAC5B,OAAO,qBAAqB,CAAA;AAC5B,OAAO,uBAAuB,CAAA"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * @arch docs/architecture/cli/agent-adapters.md
3
+ * @covers src/agents/adapter.ts
4
+ * @covers src/agents/claude.ts, codex.ts, gemini.ts, cursor.ts, openclaw.ts
5
+ * @covers src/agents/custom.ts
6
+ *
7
+ * E2E smoke test for all agent adapters (built-in + custom).
8
+ *
9
+ * Usage: npx tsx src/__tests__/agents-e2e.ts [agent-name]
10
+ *
11
+ * Each adapter is asked: "严格返回一个hello,只有hello,不要解释"
12
+ * Pass criteria: at least one `delta` event whose text contains "hello" (case-insensitive),
13
+ * followed by a `final` event, within TIMEOUT_MS.
14
+ */
15
+ import path from 'node:path';
16
+ import { fileURLToPath } from 'node:url';
17
+ import '../agents/claude.js';
18
+ import '../agents/codex.js';
19
+ import '../agents/gemini.js';
20
+ import '../agents/cursor.js';
21
+ import '../agents/openclaw.js';
22
+ import { registerCustomAgent } from '../agents/custom.js';
23
+ import { createAgent, getRegisteredAgents } from '../agents/adapter.js';
24
+ // Register the built-in example agent as a custom agent for e2e testing.
25
+ // This verifies the full custom agent path: caps probe → CustomAgentAdapter → spawn → JSONL parse.
26
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
27
+ const helloAgentPath = path.resolve(__dirname, '../../../agent-protocol/examples/node/hello-spawn.mjs');
28
+ registerCustomAgent('hello', {
29
+ command: `node ${helloAgentPath}`,
30
+ caps: { name: 'Hello Agent', model: 'hello-v1', mode: 'spawn', version: '1.0.0' },
31
+ });
32
+ const PROMPT = '严格返回一个hello,只有hello,不要解释';
33
+ const TIMEOUT_MS = 60_000;
34
+ const WORK_DIR = '/tmp';
35
+ async function testAgent(agentType) {
36
+ const start = Date.now();
37
+ const events = [];
38
+ let collectedText = '';
39
+ const adapter = createAgent(agentType);
40
+ if (!adapter) {
41
+ return {
42
+ agent: agentType,
43
+ status: 'skip',
44
+ events: [],
45
+ collectedText: '',
46
+ errorMessage: `createAgent("${agentType}") returned null`,
47
+ durationMs: Date.now() - start,
48
+ };
49
+ }
50
+ return new Promise((resolve) => {
51
+ let resolved = false;
52
+ const done = (status, errorMessage) => {
53
+ if (resolved)
54
+ return;
55
+ resolved = true;
56
+ adapter.stop().catch(() => { });
57
+ resolve({
58
+ agent: agentType,
59
+ status,
60
+ events,
61
+ collectedText,
62
+ errorMessage,
63
+ durationMs: Date.now() - start,
64
+ });
65
+ };
66
+ const timer = setTimeout(() => {
67
+ done('timeout', `Timed out after ${TIMEOUT_MS}ms. Collected text: "${collectedText}"`);
68
+ }, TIMEOUT_MS);
69
+ adapter.on('agentEvent', (event) => {
70
+ events.push(event);
71
+ if (event.state === 'delta' && event.text) {
72
+ collectedText += event.text;
73
+ }
74
+ if (event.state === 'final') {
75
+ clearTimeout(timer);
76
+ const hasHello = collectedText.toLowerCase().includes('hello');
77
+ done(hasHello ? 'pass' : 'fail', hasHello ? undefined : `No "hello" in output: "${collectedText}"`);
78
+ }
79
+ if (event.state === 'error') {
80
+ clearTimeout(timer);
81
+ done('error', event.message ?? 'unknown agent error');
82
+ }
83
+ });
84
+ adapter.on('error', (err) => {
85
+ clearTimeout(timer);
86
+ done('error', err.message);
87
+ });
88
+ adapter.start(`test-${agentType}-${Date.now()}`, WORK_DIR)
89
+ .then(() => adapter.send(PROMPT))
90
+ .catch((err) => {
91
+ clearTimeout(timer);
92
+ done('error', err instanceof Error ? err.message : String(err));
93
+ });
94
+ });
95
+ }
96
+ async function main() {
97
+ const filterArg = process.argv[2];
98
+ const allAgents = getRegisteredAgents();
99
+ const toTest = filterArg
100
+ ? allAgents.filter((a) => a === filterArg)
101
+ : allAgents;
102
+ if (toTest.length === 0) {
103
+ console.error(`No matching agent. Available: ${allAgents.join(', ')}`);
104
+ process.exit(1);
105
+ }
106
+ console.log(`\n🧪 Agent E2E Test — Testing ${toTest.length} adapter(s)\n`);
107
+ console.log(` Prompt: "${PROMPT}"`);
108
+ console.log(` Timeout: ${TIMEOUT_MS / 1000}s per agent\n`);
109
+ const results = [];
110
+ for (const agentType of toTest) {
111
+ process.stdout.write(` ⏳ ${agentType} ... `);
112
+ const result = await testAgent(agentType);
113
+ results.push(result);
114
+ const icon = result.status === 'pass' ? '✅' :
115
+ result.status === 'skip' ? '⏭️' :
116
+ result.status === 'timeout' ? '⏰' : '❌';
117
+ console.log(`${icon} ${result.status} (${(result.durationMs / 1000).toFixed(1)}s)`);
118
+ if (result.errorMessage) {
119
+ console.log(` → ${result.errorMessage}`);
120
+ }
121
+ if (result.status === 'pass') {
122
+ console.log(` → "${result.collectedText.trim().slice(0, 80)}"`);
123
+ }
124
+ }
125
+ console.log('\n' + '─'.repeat(50));
126
+ console.log('Summary:');
127
+ for (const r of results) {
128
+ const icon = r.status === 'pass' ? '✅' : r.status === 'skip' ? '⏭️' : '❌';
129
+ console.log(` ${icon} ${r.agent}: ${r.status}`);
130
+ }
131
+ const failed = results.filter((r) => r.status !== 'pass' && r.status !== 'skip');
132
+ if (failed.length > 0) {
133
+ console.log(`\n${failed.length} agent(s) need fixing.`);
134
+ process.exit(1);
135
+ }
136
+ else {
137
+ console.log('\nAll agents passed! 🎉');
138
+ process.exit(0);
139
+ }
140
+ }
141
+ main().catch((err) => {
142
+ console.error('Fatal:', err);
143
+ process.exit(1);
144
+ });
145
+ //# sourceMappingURL=agents-e2e.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-e2e.js","sourceRoot":"","sources":["../../../src/__tests__/agents-e2e.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,60 @@
1
+ // @arch docs/architecture/cli/daemon.md
2
+ // @covers src/config/index.ts
3
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
4
+ import fs from 'node:fs';
5
+ import path from 'node:path';
6
+ import os from 'node:os';
7
+ let tmpDir;
8
+ let origHome;
9
+ beforeEach(() => {
10
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'shennian-test-'));
11
+ origHome = process.env.HOME ?? os.homedir();
12
+ process.env.HOME = tmpDir;
13
+ });
14
+ afterEach(() => {
15
+ process.env.HOME = origHome;
16
+ fs.rmSync(tmpDir, { recursive: true, force: true });
17
+ });
18
+ describe('loadConfig / saveConfig', () => {
19
+ it('returns empty config when no file exists', async () => {
20
+ const configDir = path.join(tmpDir, '.shennian');
21
+ const configFile = path.join(configDir, 'config.json');
22
+ expect(fs.existsSync(configFile)).toBe(false);
23
+ const config = loadConfigFromPath(configFile);
24
+ expect(config).toEqual({});
25
+ });
26
+ it('saves and loads config correctly', () => {
27
+ const configDir = path.join(tmpDir, '.shennian');
28
+ const configFile = path.join(configDir, 'config.json');
29
+ fs.mkdirSync(configDir, { recursive: true });
30
+ const config = {
31
+ defaultProvider: 'anthropic',
32
+ defaultModel: 'claude-4',
33
+ machineId: 'test-machine',
34
+ };
35
+ fs.writeFileSync(configFile, JSON.stringify(config, null, 2));
36
+ const loaded = loadConfigFromPath(configFile);
37
+ expect(loaded.defaultProvider).toBe('anthropic');
38
+ expect(loaded.defaultModel).toBe('claude-4');
39
+ expect(loaded.machineId).toBe('test-machine');
40
+ });
41
+ it('returns empty config on invalid JSON', () => {
42
+ const configDir = path.join(tmpDir, '.shennian');
43
+ const configFile = path.join(configDir, 'config.json');
44
+ fs.mkdirSync(configDir, { recursive: true });
45
+ fs.writeFileSync(configFile, 'not-json{{{');
46
+ const config = loadConfigFromPath(configFile);
47
+ expect(config).toEqual({});
48
+ });
49
+ });
50
+ function loadConfigFromPath(configFile) {
51
+ try {
52
+ if (!fs.existsSync(configFile))
53
+ return {};
54
+ return JSON.parse(fs.readFileSync(configFile, 'utf-8'));
55
+ }
56
+ catch {
57
+ return {};
58
+ }
59
+ }
60
+ //# sourceMappingURL=config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../../src/__tests__/config.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @arch docs/architecture/cli/daemon.md
3
+ * @covers src/relay/client.ts
4
+ * @covers src/session/manager.ts
5
+ *
6
+ * Full-chain E2E test: Web client → Server relay → Daemon → Agent → Response.
7
+ *
8
+ * Usage:
9
+ * USER_TOKEN=<jwt> npx tsx src/__tests__/e2e-relay.ts
10
+ *
11
+ * This script:
12
+ * 1. Creates a session via REST API
13
+ * 2. Connects as a WebSocket client to the relay
14
+ * 3. Sends a chat.send request
15
+ * 4. Waits for agent response events
16
+ * 5. Validates the response contains expected text
17
+ */
18
+ export {};
19
+ //# sourceMappingURL=e2e-relay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2e-relay.d.ts","sourceRoot":"","sources":["../../../src/__tests__/e2e-relay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
@@ -0,0 +1,218 @@
1
+ /**
2
+ * @arch docs/architecture/cli/daemon.md
3
+ * @covers src/relay/client.ts
4
+ * @covers src/session/manager.ts
5
+ *
6
+ * Full-chain E2E test: Web client → Server relay → Daemon → Agent → Response.
7
+ *
8
+ * Usage:
9
+ * USER_TOKEN=<jwt> npx tsx src/__tests__/e2e-relay.ts
10
+ *
11
+ * This script:
12
+ * 1. Creates a session via REST API
13
+ * 2. Connects as a WebSocket client to the relay
14
+ * 3. Sends a chat.send request
15
+ * 4. Waits for agent response events
16
+ * 5. Validates the response contains expected text
17
+ */
18
+ import WebSocket from 'ws';
19
+ const SERVER = process.env.SERVER_URL ?? 'https://shennian.ai';
20
+ const USER_TOKEN = process.env.USER_TOKEN;
21
+ const MACHINE_ID = process.env.MACHINE_ID;
22
+ const AGENT_TYPES = (process.env.AGENT_TYPE ?? 'claude').split(',').map(s => s.trim()).filter(Boolean);
23
+ const PROMPT = '严格返回一个hello,只有hello,不要解释';
24
+ const TIMEOUT_MS = 90_000;
25
+ if (!USER_TOKEN) {
26
+ console.error('❌ Set USER_TOKEN env var (JWT access token)');
27
+ process.exit(1);
28
+ }
29
+ const WS_BASE = SERVER.replace(/^https:/, 'wss:').replace(/^http:/, 'ws:');
30
+ const API_BASE = SERVER.endsWith('/api') ? SERVER : `${SERVER}/api`;
31
+ let idCounter = 0;
32
+ function nextId() {
33
+ return `test_${Date.now()}_${++idCounter}`;
34
+ }
35
+ async function api(path, opts = {}) {
36
+ const url = `${API_BASE}${path}`;
37
+ const res = await fetch(url, {
38
+ ...opts,
39
+ headers: {
40
+ 'Content-Type': 'application/json',
41
+ Authorization: `Bearer ${USER_TOKEN}`,
42
+ ...opts.headers,
43
+ },
44
+ });
45
+ if (!res.ok) {
46
+ const text = await res.text();
47
+ throw new Error(`API ${res.status}: ${text}`);
48
+ }
49
+ return res.json();
50
+ }
51
+ async function getMachineId() {
52
+ if (MACHINE_ID)
53
+ return MACHINE_ID;
54
+ const data = await api('/machines');
55
+ const machine = data.machines.find((m) => m.online) ?? data.machines[0];
56
+ if (!machine)
57
+ throw new Error('No machines found for this user');
58
+ console.log(` Machine: ${machine.id} (online: ${machine.online})`);
59
+ return machine.id;
60
+ }
61
+ async function createSession(machineId, agentType) {
62
+ const data = await api('/sessions', {
63
+ method: 'POST',
64
+ body: JSON.stringify({ machineId, agentType, workDir: '/tmp' }),
65
+ });
66
+ console.log(` Session: ${data.session.id}`);
67
+ return data.session.id;
68
+ }
69
+ function connectRelay(machineId) {
70
+ return new Promise((resolve, reject) => {
71
+ const url = `${WS_BASE}/relay/${machineId}?token=${encodeURIComponent(USER_TOKEN)}`;
72
+ const ws = new WebSocket(url);
73
+ const events = [];
74
+ const pending = new Map();
75
+ ws.on('open', () => {
76
+ console.log(' ✅ WebSocket connected');
77
+ resolve({
78
+ ws,
79
+ events,
80
+ send: (frame) => {
81
+ return new Promise((res, rej) => {
82
+ const id = nextId();
83
+ const req = { ...frame, id };
84
+ pending.set(id, { resolve: res, reject: rej });
85
+ setTimeout(() => {
86
+ if (pending.has(id)) {
87
+ pending.delete(id);
88
+ rej(new Error(`Request ${id} timed out`));
89
+ }
90
+ }, 30_000);
91
+ ws.send(JSON.stringify(req));
92
+ });
93
+ },
94
+ close: () => ws.close(),
95
+ });
96
+ });
97
+ ws.on('message', (data) => {
98
+ const frame = JSON.parse(data.toString());
99
+ if (frame.type === 'res') {
100
+ const p = pending.get(frame.id);
101
+ if (p) {
102
+ pending.delete(frame.id);
103
+ p.resolve(frame);
104
+ }
105
+ }
106
+ else if (frame.type === 'event' && frame.event !== 'tick') {
107
+ events.push(frame);
108
+ }
109
+ });
110
+ ws.on('error', (err) => reject(err));
111
+ ws.on('close', (code, reason) => {
112
+ console.log(` WebSocket closed: ${code} ${reason}`);
113
+ });
114
+ });
115
+ }
116
+ async function runForAgent(machineId, agentType, relay) {
117
+ const { send, events } = relay;
118
+ console.log(`\n── Testing agent: ${agentType} ──`);
119
+ // Create session
120
+ console.log(' Creating session...');
121
+ const sessionId = await createSession(machineId, agentType);
122
+ // Send message
123
+ console.log(` Sending: "${PROMPT}"`);
124
+ const res = await send({
125
+ type: 'req',
126
+ method: 'chat.send',
127
+ params: { sessionId, text: PROMPT, agentType, workDir: '/tmp' },
128
+ });
129
+ console.log(` ACK: ok=${res.ok}${res.error ? ` error=${res.error}` : ''}`);
130
+ if (!res.ok) {
131
+ console.error(` ❌ chat.send failed for ${agentType}`);
132
+ return false;
133
+ }
134
+ // Wait for agent response
135
+ console.log(' Waiting for agent response...');
136
+ const startWait = Date.now();
137
+ let collectedText = '';
138
+ let gotFinal = false;
139
+ let gotError = '';
140
+ await new Promise((resolve) => {
141
+ const check = setInterval(() => {
142
+ for (const evt of events) {
143
+ const payload = evt.payload;
144
+ if (!payload)
145
+ continue;
146
+ if (payload.state === 'delta' && typeof payload.text === 'string') {
147
+ collectedText += payload.text;
148
+ }
149
+ if (payload.state === 'final') {
150
+ gotFinal = true;
151
+ }
152
+ if (payload.state === 'error') {
153
+ gotError = String(payload.message ?? 'unknown error');
154
+ console.log(` ⚠ Agent error: ${gotError}`);
155
+ }
156
+ }
157
+ events.length = 0;
158
+ const elapsed = Date.now() - startWait;
159
+ if (gotFinal || gotError || elapsed > TIMEOUT_MS) {
160
+ clearInterval(check);
161
+ resolve();
162
+ }
163
+ }, 500);
164
+ });
165
+ console.log(` Collected text: "${collectedText.trim().slice(0, 200)}"`);
166
+ console.log(` Got final: ${gotFinal} | Duration: ${((Date.now() - startWait) / 1000).toFixed(1)}s`);
167
+ const hasHello = collectedText.toLowerCase().includes('hello');
168
+ if (hasHello && gotFinal) {
169
+ console.log(` ✅ PASS — ${agentType}`);
170
+ return true;
171
+ }
172
+ else if (gotError) {
173
+ console.log(` ❌ FAIL — ${agentType}: ${gotError}`);
174
+ return false;
175
+ }
176
+ else if (Date.now() - startWait >= TIMEOUT_MS) {
177
+ console.log(` ❌ FAIL — ${agentType}: timed out`);
178
+ return false;
179
+ }
180
+ else {
181
+ console.log(` ❌ FAIL — ${agentType}: response didn't contain "hello"`);
182
+ return false;
183
+ }
184
+ }
185
+ async function main() {
186
+ console.log('\n🔗 Full-chain E2E Relay Test\n');
187
+ console.log(` Agents to test: ${AGENT_TYPES.join(', ')}`);
188
+ console.log('\n1️⃣ Finding machine...');
189
+ const machineId = await getMachineId();
190
+ console.log('2️⃣ Connecting to relay...');
191
+ const relay = await connectRelay(machineId);
192
+ const results = {};
193
+ for (const agentType of AGENT_TYPES) {
194
+ results[agentType] = await runForAgent(machineId, agentType, relay);
195
+ }
196
+ relay.close();
197
+ console.log('\n' + '═'.repeat(50));
198
+ console.log('Results:');
199
+ let allPassed = true;
200
+ for (const [agent, passed] of Object.entries(results)) {
201
+ console.log(` ${passed ? '✅' : '❌'} ${agent}`);
202
+ if (!passed)
203
+ allPassed = false;
204
+ }
205
+ if (allPassed) {
206
+ console.log('\n✅ ALL PASSED\n');
207
+ process.exit(0);
208
+ }
209
+ else {
210
+ console.log('\n❌ SOME TESTS FAILED\n');
211
+ process.exit(1);
212
+ }
213
+ }
214
+ main().catch((err) => {
215
+ console.error('Fatal:', err);
216
+ process.exit(1);
217
+ });
218
+ //# sourceMappingURL=e2e-relay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2e-relay.js","sourceRoot":"","sources":["../../../src/__tests__/e2e-relay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,SAAS,MAAM,IAAI,CAAA;AAG1B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,qBAAqB,CAAA;AAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;AACzC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;AACzC,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;AACtG,MAAM,MAAM,GAAG,0BAA0B,CAAA;AACzC,MAAM,UAAU,GAAG,MAAM,CAAA;AAEzB,IAAI,CAAC,UAAU,EAAE,CAAC;IAChB,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;AAC1E,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,MAAM,CAAA;AAEnE,IAAI,SAAS,GAAG,CAAC,CAAA;AACjB,SAAS,MAAM;IACb,OAAO,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;AAC5C,CAAC;AAED,KAAK,UAAU,GAAG,CAAI,IAAY,EAAE,OAAoB,EAAE;IACxD,MAAM,GAAG,GAAG,GAAG,QAAQ,GAAG,IAAI,EAAE,CAAA;IAChC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,GAAG,IAAI;QACP,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,UAAU,EAAE;YACrC,GAAG,IAAI,CAAC,OAAO;SAChB;KACF,CAAC,CAAA;IACF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QAC7B,MAAM,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAA;IAC/C,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAA;AACjC,CAAC;AAED,KAAK,UAAU,YAAY;IACzB,IAAI,UAAU;QAAE,OAAO,UAAU,CAAA;IACjC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAkD,WAAW,CAAC,CAAA;IACpF,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;IACvE,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IAChE,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,EAAE,aAAa,OAAO,CAAC,MAAM,GAAG,CAAC,CAAA;IACnE,OAAO,OAAO,CAAC,EAAE,CAAA;AACnB,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,SAAiB,EAAE,SAAiB;IAC/D,MAAM,IAAI,GAAG,MAAM,GAAG,CAA8B,WAAW,EAAE;QAC/D,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;KAChE,CAAC,CAAA;IACF,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;IAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAA;AACxB,CAAC;AAED,SAAS,YAAY,CAAC,SAAiB;IAMrC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,GAAG,OAAO,UAAU,SAAS,UAAU,kBAAkB,CAAC,UAAW,CAAC,EAAE,CAAA;QACpF,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAAA;QAC7B,MAAM,MAAM,GAAiB,EAAE,CAAA;QAC/B,MAAM,OAAO,GAAG,IAAI,GAAG,EAA0E,CAAA;QAEjG,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACjB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;YACtC,OAAO,CAAC;gBACN,EAAE;gBACF,MAAM;gBACN,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;oBACd,OAAO,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;wBAC9B,MAAM,EAAE,GAAG,MAAM,EAAE,CAAA;wBACnB,MAAM,GAAG,GAAG,EAAE,GAAG,KAAK,EAAE,EAAE,EAAc,CAAA;wBACxC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;wBAC9C,UAAU,CAAC,GAAG,EAAE;4BACd,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gCACpB,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;gCAClB,GAAG,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAA;4BAC3C,CAAC;wBACH,CAAC,EAAE,MAAM,CAAC,CAAA;wBACV,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAA;oBAC9B,CAAC,CAAC,CAAA;gBACJ,CAAC;gBACD,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE;aACxB,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAU,CAAA;YAClD,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBACzB,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;gBAC/B,IAAI,CAAC,EAAE,CAAC;oBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;oBACxB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;gBAClB,CAAC;YACH,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;gBAC5D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACpB,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QACpC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAC9B,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,IAAI,MAAM,EAAE,CAAC,CAAA;QACtD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,SAAiB,EAAE,SAAiB,EAAE,KAA+C;IAC9G,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;IAE9B,OAAO,CAAC,GAAG,CAAC,uBAAuB,SAAS,KAAK,CAAC,CAAA;IAElD,iBAAiB;IACjB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;IACpC,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;IAE3D,eAAe;IACf,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,GAAG,CAAC,CAAA;IACrC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC;QACrB,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE;KAChE,CAAC,CAAA;IACF,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAC3E,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,4BAA4B,SAAS,EAAE,CAAC,CAAA;QACtD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,0BAA0B;IAC1B,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAA;IAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC5B,IAAI,aAAa,GAAG,EAAE,CAAA;IACtB,IAAI,QAAQ,GAAG,KAAK,CAAA;IACpB,IAAI,QAAQ,GAAG,EAAE,CAAA;IAEjB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,GAAG,CAAC,OAA8C,CAAA;gBAClE,IAAI,CAAC,OAAO;oBAAE,SAAQ;gBACtB,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAClE,aAAa,IAAI,OAAO,CAAC,IAAI,CAAA;gBAC/B,CAAC;gBACD,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;oBAC9B,QAAQ,GAAG,IAAI,CAAA;gBACjB,CAAC;gBACD,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;oBAC9B,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC,CAAA;oBACrD,OAAO,CAAC,GAAG,CAAC,oBAAoB,QAAQ,EAAE,CAAC,CAAA;gBAC7C,CAAC;YACH,CAAC;YACD,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;YAEjB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAA;YACtC,IAAI,QAAQ,IAAI,QAAQ,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;gBACjD,aAAa,CAAC,KAAK,CAAC,CAAA;gBACpB,OAAO,EAAE,CAAA;YACX,CAAC;QACH,CAAC,EAAE,GAAG,CAAC,CAAA;IACT,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,GAAG,CAAC,sBAAsB,aAAa,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAA;IACxE,OAAO,CAAC,GAAG,CAAC,gBAAgB,QAAQ,gBAAgB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IAEpG,MAAM,QAAQ,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC9D,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,cAAc,SAAS,EAAE,CAAC,CAAA;QACtC,OAAO,IAAI,CAAA;IACb,CAAC;SAAM,IAAI,QAAQ,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,cAAc,SAAS,KAAK,QAAQ,EAAE,CAAC,CAAA;QACnD,OAAO,KAAK,CAAA;IACd,CAAC;SAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,UAAU,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,cAAc,SAAS,aAAa,CAAC,CAAA;QACjD,OAAO,KAAK,CAAA;IACd,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,cAAc,SAAS,mCAAmC,CAAC,CAAA;QACvE,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAA;IAC/C,OAAO,CAAC,GAAG,CAAC,qBAAqB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAE1D,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;IACxC,MAAM,SAAS,GAAG,MAAM,YAAY,EAAE,CAAA;IAEtC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAA;IAC1C,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,CAAA;IAE3C,MAAM,OAAO,GAA4B,EAAE,CAAA;IAC3C,KAAK,MAAM,SAAS,IAAI,WAAW,EAAE,CAAC;QACpC,OAAO,CAAC,SAAS,CAAC,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAA;IACrE,CAAC;IAED,KAAK,CAAC,KAAK,EAAE,CAAA;IAEb,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;IAClC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IACvB,IAAI,SAAS,GAAG,IAAI,CAAA;IACpB,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC,CAAA;QAC/C,IAAI,CAAC,MAAM;YAAE,SAAS,GAAG,KAAK,CAAA;IAChC,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;QAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session-manager.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/session-manager.test.ts"],"names":[],"mappings":""}