kumo-cli 1.0.2 → 1.0.4

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 (135) hide show
  1. package/README.md +13 -5
  2. package/dist/auth/credentialsStore.js +61 -14
  3. package/dist/auth/credentialsStore.js.map +1 -1
  4. package/dist/auth/credentialsStore.test.js +60 -0
  5. package/dist/auth/credentialsStore.test.js.map +1 -0
  6. package/dist/claude/fileHistory.js +35 -0
  7. package/dist/claude/fileHistory.js.map +1 -0
  8. package/dist/claude/sessionScanner.js +7 -95
  9. package/dist/claude/sessionScanner.js.map +1 -1
  10. package/dist/claude/sessionScanner.test.js +24 -0
  11. package/dist/claude/sessionScanner.test.js.map +1 -0
  12. package/dist/claude/transcriptParser.js +83 -0
  13. package/dist/claude/transcriptParser.js.map +1 -0
  14. package/dist/claude/transcriptParser.test.js +78 -0
  15. package/dist/claude/transcriptParser.test.js.map +1 -0
  16. package/dist/commands/agentPrompt.js +18 -0
  17. package/dist/commands/agentPrompt.js.map +1 -0
  18. package/dist/commands/cliArgs.js +56 -0
  19. package/dist/commands/cliArgs.js.map +1 -0
  20. package/dist/commands/cliArgs.test.js +25 -0
  21. package/dist/commands/cliArgs.test.js.map +1 -0
  22. package/dist/core/logger.js +7 -2
  23. package/dist/core/logger.js.map +1 -1
  24. package/dist/core/projectFileWatcher.js +56 -0
  25. package/dist/core/projectFileWatcher.js.map +1 -0
  26. package/dist/handlers/fileHandlerPayloads.js +72 -0
  27. package/dist/handlers/fileHandlerPayloads.js.map +1 -0
  28. package/dist/handlers/fileHandlerPayloads.test.js +55 -0
  29. package/dist/handlers/fileHandlerPayloads.test.js.map +1 -0
  30. package/dist/handlers/fileHandlers.js +74 -0
  31. package/dist/handlers/fileHandlers.js.map +1 -0
  32. package/dist/handlers/messageRouter.js +8 -203
  33. package/dist/handlers/messageRouter.js.map +1 -1
  34. package/dist/handlers/router.types.js +2 -0
  35. package/dist/handlers/router.types.js.map +1 -0
  36. package/dist/handlers/runtimeHandlers.js +55 -0
  37. package/dist/handlers/runtimeHandlers.js.map +1 -0
  38. package/dist/handlers/sessionHandlers.js +68 -0
  39. package/dist/handlers/sessionHandlers.js.map +1 -0
  40. package/dist/handlers/terminalHandlers.js +40 -0
  41. package/dist/handlers/terminalHandlers.js.map +1 -0
  42. package/dist/index.js +59 -145
  43. package/dist/index.js.map +1 -1
  44. package/dist/pty/notificationDetector.js +29 -0
  45. package/dist/pty/notificationDetector.js.map +1 -0
  46. package/dist/pty/notificationDetector.test.js +24 -0
  47. package/dist/pty/notificationDetector.test.js.map +1 -0
  48. package/dist/pty/ptyMenuParser.js +11 -277
  49. package/dist/pty/ptyMenuParser.js.map +1 -1
  50. package/dist/pty/ptyMenuParser.test.js +26 -0
  51. package/dist/pty/ptyMenuParser.test.js.map +1 -0
  52. package/dist/pty/selectionMenuDetector.js +49 -0
  53. package/dist/pty/selectionMenuDetector.js.map +1 -0
  54. package/dist/pty/selectionMenuDetector.test.js +62 -0
  55. package/dist/pty/selectionMenuDetector.test.js.map +1 -0
  56. package/dist/pty/selectionMenuMeta.js +54 -0
  57. package/dist/pty/selectionMenuMeta.js.map +1 -0
  58. package/dist/pty/selectionMenuMeta.test.js +26 -0
  59. package/dist/pty/selectionMenuMeta.test.js.map +1 -0
  60. package/dist/pty/selectionMenuParser.js +83 -0
  61. package/dist/pty/selectionMenuParser.js.map +1 -0
  62. package/dist/pty/selectionMenuParser.test.js +30 -0
  63. package/dist/pty/selectionMenuParser.test.js.map +1 -0
  64. package/dist/pty/statusSessionDetector.js +28 -0
  65. package/dist/pty/statusSessionDetector.js.map +1 -0
  66. package/dist/pty/statusSessionDetector.test.js +23 -0
  67. package/dist/pty/statusSessionDetector.test.js.map +1 -0
  68. package/dist/pty/terminalManager.js +11 -6
  69. package/dist/pty/terminalManager.js.map +1 -1
  70. package/dist/pty/textInputDetector.js +60 -0
  71. package/dist/pty/textInputDetector.js.map +1 -0
  72. package/dist/pty/textInputDetector.test.js +32 -0
  73. package/dist/pty/textInputDetector.test.js.map +1 -0
  74. package/dist/services/bootstrapService.js +28 -0
  75. package/dist/services/bootstrapService.js.map +1 -0
  76. package/dist/services/claudeAdapterProxy.js +104 -0
  77. package/dist/services/claudeAdapterProxy.js.map +1 -0
  78. package/dist/services/claudeMenuBridge.js +116 -0
  79. package/dist/services/claudeMenuBridge.js.map +1 -0
  80. package/dist/services/claudeMenuBridge.test.js +90 -0
  81. package/dist/services/claudeMenuBridge.test.js.map +1 -0
  82. package/dist/services/claudeService.js +7 -79
  83. package/dist/services/claudeService.js.map +1 -1
  84. package/dist/services/claudeService.test.js +39 -0
  85. package/dist/services/claudeService.test.js.map +1 -0
  86. package/dist/services/cliRuntime.js +49 -0
  87. package/dist/services/cliRuntime.js.map +1 -0
  88. package/dist/services/cliRuntime.test.js +55 -0
  89. package/dist/services/cliRuntime.test.js.map +1 -0
  90. package/dist/services/fileService.js +22 -24
  91. package/dist/services/fileService.js.map +1 -1
  92. package/dist/services/modelAdapter.test.js +47 -0
  93. package/dist/services/modelAdapter.test.js.map +1 -0
  94. package/dist/services/modelArgs.test.js +64 -0
  95. package/dist/services/modelArgs.test.js.map +1 -0
  96. package/dist/services/modelBaseUrl.test.js +32 -0
  97. package/dist/services/modelBaseUrl.test.js.map +1 -0
  98. package/dist/services/modelService.js +54 -12
  99. package/dist/services/modelService.js.map +1 -1
  100. package/dist/services/modelService.test.js +136 -0
  101. package/dist/services/modelService.test.js.map +1 -0
  102. package/dist/services/notificationDedupe.js +23 -0
  103. package/dist/services/notificationDedupe.js.map +1 -0
  104. package/dist/services/notificationDedupe.test.js +20 -0
  105. package/dist/services/notificationDedupe.test.js.map +1 -0
  106. package/dist/services/pairingService.js +17 -8
  107. package/dist/services/pairingService.js.map +1 -1
  108. package/dist/services/sessionListService.js +19 -0
  109. package/dist/services/sessionListService.js.map +1 -0
  110. package/dist/services/sessionListService.test.js +22 -0
  111. package/dist/services/sessionListService.test.js.map +1 -0
  112. package/dist/services/sessionService.js +8 -45
  113. package/dist/services/sessionService.js.map +1 -1
  114. package/dist/services/tunnelHelpers.js +69 -0
  115. package/dist/services/tunnelHelpers.js.map +1 -0
  116. package/dist/services/tunnelHelpers.test.js +42 -0
  117. package/dist/services/tunnelHelpers.test.js.map +1 -0
  118. package/dist/services/tunnelService.js +69 -25
  119. package/dist/services/tunnelService.js.map +1 -1
  120. package/dist/services/tunnelService.test.js +91 -0
  121. package/dist/services/tunnelService.test.js.map +1 -0
  122. package/dist/transport/webrtcTransport.js +145 -0
  123. package/dist/transport/webrtcTransport.js.map +1 -0
  124. package/dist/transport/webrtcTransport.test.js +104 -0
  125. package/dist/transport/webrtcTransport.test.js.map +1 -0
  126. package/dist/transport/webrtcTypes.js +29 -0
  127. package/dist/transport/webrtcTypes.js.map +1 -0
  128. package/dist/transport/webrtcTypes.test.js +20 -0
  129. package/dist/transport/webrtcTypes.test.js.map +1 -0
  130. package/dist/transport/wsClient.js +16 -3
  131. package/dist/transport/wsClient.js.map +1 -1
  132. package/dist/utils/safePath.js +18 -6
  133. package/dist/utils/safePath.js.map +1 -1
  134. package/package.json +8 -2
  135. package/scripts/run-tests.mjs +45 -0
@@ -0,0 +1,90 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { ClaudeMenuBridge } from './claudeMenuBridge.js';
4
+ function createBridge(sent) {
5
+ return new ClaudeMenuBridge((data) => sent.push(data), () => 'high', () => 'E:\\Data\\new_journey\\kumo\\cli');
6
+ }
7
+ function createProcessRecorder() {
8
+ const writes = [];
9
+ return {
10
+ process: {
11
+ write(data) {
12
+ writes.push(data);
13
+ },
14
+ },
15
+ writes,
16
+ };
17
+ }
18
+ test('auto accepts bypass permissions dialog without sending prompt options', () => {
19
+ const sent = [];
20
+ const bridge = createBridge(sent);
21
+ const recorder = createProcessRecorder();
22
+ bridge.handleElement({
23
+ type: 'selection',
24
+ title: 'Bypass Permissions',
25
+ options: [
26
+ { index: 0, label: 'Yes', isSelected: false },
27
+ { index: 1, label: 'No', isSelected: true },
28
+ ],
29
+ selectedIndex: 1,
30
+ }, recorder.process);
31
+ assert.deepEqual(recorder.writes, ['\x1b[A', '\r']);
32
+ assert.equal(sent.length, 0);
33
+ });
34
+ test('auto accepts custom api key dialog only once', () => {
35
+ const sent = [];
36
+ const bridge = createBridge(sent);
37
+ const recorder = createProcessRecorder();
38
+ const element = {
39
+ type: 'selection',
40
+ title: 'Detected a custom API key',
41
+ options: [
42
+ { index: 0, label: 'Yes', isSelected: true },
43
+ { index: 1, label: 'No', isSelected: false },
44
+ ],
45
+ selectedIndex: 0,
46
+ };
47
+ bridge.handleElement(element, recorder.process);
48
+ bridge.handleElement(element, recorder.process);
49
+ assert.deepEqual(recorder.writes, ['\r']);
50
+ assert.equal(sent.length, 1);
51
+ assert.equal(sent[0]?.type, 'prompt_options');
52
+ });
53
+ test('login warning sends both notification and logged-out status', () => {
54
+ const sent = [];
55
+ const bridge = createBridge(sent);
56
+ bridge.handleElement({
57
+ type: 'notification',
58
+ level: 'warning',
59
+ message: 'Not logged in · Run /login',
60
+ }, null);
61
+ assert.deepEqual(sent, [
62
+ { type: 'notification', level: 'warning', message: 'Not logged in · Run /login' },
63
+ { type: 'cli_status', loggedIn: false, effort: 'high', workingDir: 'E:\\Data\\new_journey\\kumo\\cli' },
64
+ ]);
65
+ });
66
+ test('selection prompts receive stable incremental ids', () => {
67
+ const sent = [];
68
+ const bridge = createBridge(sent);
69
+ bridge.handleElement({
70
+ type: 'selection',
71
+ title: 'Select model',
72
+ options: [
73
+ { index: 0, label: 'Sonnet', isSelected: true },
74
+ { index: 1, label: 'Opus', isSelected: false },
75
+ ],
76
+ selectedIndex: 0,
77
+ }, null);
78
+ bridge.handleElement({
79
+ type: 'selection',
80
+ title: 'Select effort',
81
+ options: [
82
+ { index: 0, label: 'High', isSelected: true },
83
+ { index: 1, label: 'Max', isSelected: false },
84
+ ],
85
+ selectedIndex: 0,
86
+ }, null);
87
+ assert.equal(sent[0]?.id, 'menu-1');
88
+ assert.equal(sent[1]?.id, 'menu-2');
89
+ });
90
+ //# sourceMappingURL=claudeMenuBridge.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claudeMenuBridge.test.js","sourceRoot":"","sources":["../../src/services/claudeMenuBridge.test.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import { PtyMenuParser } from '../pty/ptyMenuParser.js';
3
3
  import { PtySnapshotRenderer } from '../pty/ptySnapshotRenderer.js';
4
4
  import { PtyBuffer } from '../utils/ptyBuffer.js';
5
5
  import { log, debugWrite } from '../core/logger.js';
6
- const LOGIN_WARNING_MESSAGE = 'Not logged in · Run /login';
6
+ import { ClaudeMenuBridge } from './claudeMenuBridge.js';
7
7
  // manage the lifecycle of a claude pty process plus its snapshot/parser
8
8
  export class ClaudeService {
9
9
  send;
@@ -13,10 +13,9 @@ export class ClaudeService {
13
13
  process = null;
14
14
  cleanup = null;
15
15
  isRespawning = false;
16
- autoAcceptedApiKeyDialog = false;
17
- menuIdCounter = 0;
18
16
  pendingSelectNudgeTimer = null;
19
17
  menuParser;
18
+ menuBridge;
20
19
  snapshotRenderer;
21
20
  buffer;
22
21
  lastWsSendAt = 0;
@@ -30,6 +29,7 @@ export class ClaudeService {
30
29
  this.getDeviceToken = getDeviceToken;
31
30
  this.snapshotRenderer = new PtySnapshotRenderer(process.stdout.columns ?? 120, process.stdout.rows ?? 30);
32
31
  this.buffer = new PtyBuffer(this.snapshotRenderer);
32
+ this.menuBridge = new ClaudeMenuBridge(this.send, () => this.effort.getEffective(), () => process.cwd());
33
33
  this.menuParser = new PtyMenuParser((el) => this.handleMenuElement(el));
34
34
  }
35
35
  // expose a wrapper so wsClient can stamp the last-send timestamp here
@@ -115,15 +115,15 @@ export class ClaudeService {
115
115
  }
116
116
  this.cleanup?.();
117
117
  this.cleanup = null;
118
- this.autoAcceptedApiKeyDialog = false;
118
+ this.menuBridge.reset();
119
119
  this.resetSnapshot();
120
120
  this.args = await this.model.ensureBeforeSpawn(this.args, this.getDeviceToken());
121
121
  this.args = this.effort.ensureBeforeSpawn(this.args);
122
- const { pty, cleanup } = spawnClaude([...this.args, '--settings', this.settingsPath], (active) => this.send({ type: 'thinking', active }), (data) => { debugWrite(data); this.menuParser.feed(data); this.buffer.feed(data); }, (cols, rows) => this.menuParser.resize(cols, rows), (p) => { this.process = p; }, undefined, this.model.buildEnv());
122
+ const env = await this.model.buildEnv();
123
+ const { pty, cleanup } = spawnClaude([...this.args, '--settings', this.settingsPath], (active) => this.send({ type: 'thinking', active }), (data) => { debugWrite(data); this.menuParser.feed(data); this.buffer.feed(data); }, (cols, rows) => this.menuParser.resize(cols, rows), (p) => { this.process = p; }, undefined, env);
123
124
  this.cleanup = cleanup;
124
125
  this.send({
125
126
  type: 'cli_status',
126
- model: this.model.getCurrent()?.model,
127
127
  effort: this.effort.getEffective(),
128
128
  workingDir: process.cwd(),
129
129
  });
@@ -140,79 +140,7 @@ export class ClaudeService {
140
140
  }
141
141
  // handle a parsed pty menu element and translate into ws message
142
142
  handleMenuElement(element) {
143
- switch (element.type) {
144
- case 'selection': {
145
- if (element.options.length === 0) {
146
- log(`[parser] ignoring empty menu`);
147
- break;
148
- }
149
- if (element.title.includes('Bypass Permissions')) {
150
- if (this.tryAcceptYes(element, 'auto-accepted bypass permissions dialog'))
151
- break;
152
- }
153
- if (!this.autoAcceptedApiKeyDialog &&
154
- (element.title.includes('Detected a custom API key') || element.title.includes('Do you want to use this API key'))) {
155
- if (this.tryAcceptYes(element, 'auto-accepted custom api key dialog', true)) {
156
- this.autoAcceptedApiKeyDialog = true;
157
- break;
158
- }
159
- }
160
- this.menuIdCounter++;
161
- const id = `menu-${this.menuIdCounter}`;
162
- log(`[parser] menu detected: "${element.title}" (${element.options.length} opts, selected: ${element.selectedIndex})`);
163
- log(`[parser] options: ${JSON.stringify(element.options)}`);
164
- this.send({
165
- type: 'prompt_options',
166
- id,
167
- title: element.title,
168
- description: element.description,
169
- options: element.options,
170
- selectedIndex: element.selectedIndex,
171
- hint: element.hint,
172
- footer: element.footer,
173
- });
174
- break;
175
- }
176
- case 'input':
177
- log(`[parser] input: "${element.label}" = "${element.value}"`);
178
- this.send({ type: 'text_input', label: element.label, value: element.value, placeholder: element.placeholder, cursorPosition: element.cursorPosition });
179
- break;
180
- case 'notification':
181
- log(`[parser] notification: [${element.level}] ${element.message}`);
182
- this.send({ type: 'notification', level: element.level, message: element.message });
183
- if (element.level === 'warning' && element.message.trim().toLowerCase() === LOGIN_WARNING_MESSAGE.toLowerCase()) {
184
- const effort = this.effort.getEffective();
185
- this.send({ type: 'cli_status', loggedIn: false, model: 'no model', effort, workingDir: process.cwd() });
186
- }
187
- break;
188
- case 'status': {
189
- const effort = element.effort ?? this.effort.getEffective();
190
- log(`[parser] status: model=${element.model}, effort=${effort}, logged=${element.loggedIn}`);
191
- this.send({ type: 'cli_status', loggedIn: element.loggedIn, model: element.model, effort, workingDir: element.workingDir });
192
- break;
193
- }
194
- case 'session':
195
- log(`[parser] session: ${element.sessionId}`);
196
- this.send({ type: 'session_info', sessionId: element.sessionId, resumeCommand: element.resumeCommand });
197
- break;
198
- case 'prompt':
199
- break;
200
- }
201
- }
202
- // try to auto-press "yes" inside a selection dialog
203
- tryAcceptYes(element, logMsg, exact = false) {
204
- const yesIndex = element.options.findIndex((o) => exact
205
- ? o.label.trim().toLowerCase() === 'yes'
206
- : o.label.trim().toLowerCase().includes('yes'));
207
- if (yesIndex < 0 || !this.process)
208
- return false;
209
- const delta = yesIndex - element.selectedIndex;
210
- const key = delta < 0 ? '\x1b[A' : '\x1b[B';
211
- for (let i = 0; i < Math.abs(delta); i++)
212
- this.process.write(key);
213
- this.process.write('\r');
214
- log(`[parser] ${logMsg}`);
215
- return true;
143
+ this.menuBridge.handleElement(element, this.process);
216
144
  }
217
145
  }
218
146
  //# sourceMappingURL=claudeService.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"claudeService.js","sourceRoot":"","sources":["../../src/services/claudeService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claudeService.js","sourceRoot":"","sources":["../../src/services/claudeService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { ClaudeService } from './claudeService.js';
4
+ import { ModelService } from './modelService.js';
5
+ import { EffortService } from './effortService.js';
6
+ function createService(sent) {
7
+ return new ClaudeService((data) => sent.push(data), new ModelService(), new EffortService(), () => undefined);
8
+ }
9
+ test('dedupes same notification within 5 minutes', () => {
10
+ const sent = [];
11
+ const service = createService(sent);
12
+ const now = new Date('2026-05-29T10:09:17.389Z').getTime();
13
+ const originalNow = Date.now;
14
+ const handleMenuElement = Reflect.get(service, 'handleMenuElement');
15
+ Date.now = () => now;
16
+ handleMenuElement.call(service, { type: 'notification', level: 'error', message: 'IDE extension install failed (see /status for info)' });
17
+ handleMenuElement.call(service, { type: 'notification', level: 'error', message: ' IDE extension install failed (see /status for info) ' });
18
+ Date.now = originalNow;
19
+ assert.equal(sent.length, 1);
20
+ assert.deepEqual(sent[0], {
21
+ type: 'notification',
22
+ level: 'error',
23
+ message: 'IDE extension install failed (see /status for info)',
24
+ });
25
+ });
26
+ test('allows same notification again after 5 minutes', () => {
27
+ const sent = [];
28
+ const service = createService(sent);
29
+ const base = new Date('2026-05-29T10:09:17.389Z').getTime();
30
+ const originalNow = Date.now;
31
+ const handleMenuElement = Reflect.get(service, 'handleMenuElement');
32
+ Date.now = () => base;
33
+ handleMenuElement.call(service, { type: 'notification', level: 'error', message: 'IDE extension install failed (see /status for info)' });
34
+ Date.now = () => base + 5 * 60 * 1000 + 1;
35
+ handleMenuElement.call(service, { type: 'notification', level: 'error', message: 'IDE extension install failed (see /status for info)' });
36
+ Date.now = originalNow;
37
+ assert.equal(sent.length, 2);
38
+ });
39
+ //# sourceMappingURL=claudeService.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claudeService.test.js","sourceRoot":"","sources":["../../src/services/claudeService.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAInD,SAAS,aAAa,CAAC,IAAmB;IACxC,OAAO,IAAI,aAAa,CACtB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAmB,CAAC,EACxC,IAAI,YAAY,EAAE,EAClB,IAAI,aAAa,EAAE,EACnB,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;AACJ,CAAC;AAED,IAAI,CAAC,4CAA4C,EAAE,GAAG,EAAE;IACtD,MAAM,IAAI,GAAkB,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,0BAA0B,CAAC,CAAC,OAAO,EAAE,CAAC;IAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC;IAC7B,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,mBAAmB,CAA+B,CAAC;IAElG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC;IACrB,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,qDAAqD,EAAE,CAAC,CAAC;IAC1I,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,yDAAyD,EAAE,CAAC,CAAC;IAE9I,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC;IAEvB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7B,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;QACxB,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,qDAAqD;KAC/D,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC1D,MAAM,IAAI,GAAkB,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,0BAA0B,CAAC,CAAC,OAAO,EAAE,CAAC;IAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC;IAC7B,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,mBAAmB,CAA+B,CAAC;IAElG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;IACtB,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,qDAAqD,EAAE,CAAC,CAAC;IAE1I,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC;IAC1C,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,qDAAqD,EAAE,CAAC,CAAC;IAE1I,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC;IAEvB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { log } from '../core/logger.js';
2
+ import { SessionScanner } from '../claude/sessionScanner.js';
3
+ import { loadSessionList } from './sessionListService.js';
4
+ // ensure claude always runs with the permissions bypass flag expected by the app flow
5
+ export function ensureClaudeArgs(args) {
6
+ return args.includes('--dangerously-skip-permissions') ? [...args] : [...args, '--dangerously-skip-permissions'];
7
+ }
8
+ // create the hook-server callback that keeps scanner state, prompt replay, and assistant completion in sync
9
+ export function createSessionStartHandler(params) {
10
+ return (sessionId) => {
11
+ params.state.currentSessionId = sessionId;
12
+ params.resetSnapshot();
13
+ params.send({ type: 'session_start', sessionId });
14
+ params.state.scanner?.stop();
15
+ params.state.scanner = (params.scannerFactory?.(sessionId, params.state.startScannerAtEnd) ?? new SessionScanner(sessionId, params.state.startScannerAtEnd));
16
+ params.state.startScannerAtEnd = false;
17
+ params.state.scanner.on('message', (message) => {
18
+ params.send({ type: 'transcript', message });
19
+ if (message.role === 'assistant' && message.stopReason === 'end_turn') {
20
+ log(`[scanner] assistant_done detected, stopReason=${message.stopReason}`);
21
+ params.send({ type: 'assistant_done' });
22
+ }
23
+ });
24
+ params.state.scanner.start();
25
+ if (!params.state.pendingPrompt)
26
+ return;
27
+ const queuedPrompt = params.state.pendingPrompt;
28
+ params.state.pendingPrompt = null;
29
+ params.dispatchPrompt(queuedPrompt);
30
+ };
31
+ }
32
+ // create the ws onOpen hook that registers the cli, refreshes sessions, and restarts file watching
33
+ export function createWsOpenHandler(params) {
34
+ return async () => {
35
+ const credentials = params.credentials();
36
+ params.send({
37
+ type: 'register',
38
+ clientType: 'cli',
39
+ deviceToken: credentials?.deviceToken,
40
+ deviceUuid: credentials?.deviceUuid,
41
+ cwd: process.cwd(),
42
+ });
43
+ params.resetMenu();
44
+ params.restartWatcher();
45
+ const sessions = await loadSessionList(undefined, params.currentSessionId());
46
+ params.send({ type: 'session_list', sessions });
47
+ };
48
+ }
49
+ //# sourceMappingURL=cliRuntime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliRuntime.js","sourceRoot":"","sources":["../../src/services/cliRuntime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAW1D,sFAAsF;AACtF,MAAM,UAAU,gBAAgB,CAAC,IAAc;IAC7C,OAAO,IAAI,CAAC,QAAQ,CAAC,gCAAgC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,gCAAgC,CAAC,CAAC;AACnH,CAAC;AAED,4GAA4G;AAC5G,MAAM,UAAU,yBAAyB,CAAC,MAMzC;IACC,OAAO,CAAC,SAAiB,EAAE,EAAE;QAC3B,MAAM,CAAC,KAAK,CAAC,gBAAgB,GAAG,SAAS,CAAC;QAC1C,MAAM,CAAC,aAAa,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,IAAI,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAmB,CAAC;QAC/K,MAAM,CAAC,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;YAC7C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;YAC7C,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;gBACtE,GAAG,CAAC,iDAAiD,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;gBAC3E,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa;YAAE,OAAO;QACxC,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;QAClC,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC,CAAC;AACJ,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,mBAAmB,CAAC,MAMnC;IACC,OAAO,KAAK,IAAI,EAAE;QAChB,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,KAAK;YACjB,WAAW,EAAE,WAAW,EAAE,WAAW;YACrC,UAAU,EAAE,WAAW,EAAE,UAAU;YACnC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,SAAS,EAAE,CAAC;QACnB,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC7E,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,55 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { createSessionStartHandler, createWsOpenHandler, ensureClaudeArgs } from './cliRuntime.js';
4
+ test('ensureClaudeArgs appends the bypass flag only once', () => {
5
+ assert.deepEqual(ensureClaudeArgs(['--debug']), ['--debug', '--dangerously-skip-permissions']);
6
+ assert.deepEqual(ensureClaudeArgs(['--dangerously-skip-permissions']), ['--dangerously-skip-permissions']);
7
+ });
8
+ test('createSessionStartHandler replays pending prompt and announces assistant completion', async () => {
9
+ const sent = [];
10
+ const dispatched = [];
11
+ const state = {
12
+ currentSessionId: null,
13
+ pendingPrompt: 'hello',
14
+ startScannerAtEnd: false,
15
+ scanner: null,
16
+ };
17
+ const handler = createSessionStartHandler({
18
+ state,
19
+ send: (data) => sent.push(data),
20
+ resetSnapshot: () => { },
21
+ dispatchPrompt: (text) => dispatched.push(text),
22
+ scannerFactory: () => ({
23
+ stop() { },
24
+ on(_event, handler) {
25
+ handler({ role: 'assistant', stopReason: 'end_turn' });
26
+ return this;
27
+ },
28
+ start() { },
29
+ }),
30
+ });
31
+ handler('session-1');
32
+ assert.equal(state.currentSessionId, 'session-1');
33
+ assert.equal(state.pendingPrompt, null);
34
+ assert.equal(dispatched[0], 'hello');
35
+ assert.equal(sent[0]?.type, 'session_start');
36
+ });
37
+ test('createWsOpenHandler registers the cli and sends a session list', async () => {
38
+ const sent = [];
39
+ let menuReset = false;
40
+ let watcherRestarted = false;
41
+ const handler = createWsOpenHandler({
42
+ send: (data) => sent.push(data),
43
+ credentials: () => ({ deviceUuid: 'device-1', deviceToken: 'token-1', serverUrl: 'http://localhost' }),
44
+ currentSessionId: () => 'session-1',
45
+ resetMenu: () => { menuReset = true; },
46
+ restartWatcher: () => { watcherRestarted = true; },
47
+ });
48
+ await handler();
49
+ assert.equal(sent[0]?.type, 'register');
50
+ assert.equal(sent[0]?.deviceToken, 'token-1');
51
+ assert.equal(sent.at(-1)?.type, 'session_list');
52
+ assert.equal(menuReset, true);
53
+ assert.equal(watcherRestarted, true);
54
+ });
55
+ //# sourceMappingURL=cliRuntime.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliRuntime.test.js","sourceRoot":"","sources":["../../src/services/cliRuntime.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,gBAAgB,EAA4B,MAAM,iBAAiB,CAAC;AAE7H,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;IAC9D,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,gCAAgC,CAAC,CAAC,CAAC;IAC/F,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,gCAAgC,CAAC,CAAC,EAAE,CAAC,gCAAgC,CAAC,CAAC,CAAC;AAC7G,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;IACrG,MAAM,IAAI,GAA8B,EAAE,CAAC;IAC3C,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,KAAK,GAAwB;QACjC,gBAAgB,EAAE,IAAI;QACtB,aAAa,EAAE,OAAO;QACtB,iBAAiB,EAAE,KAAK;QACxB,OAAO,EAAE,IAAI;KACd,CAAC;IAEF,MAAM,OAAO,GAAG,yBAAyB,CAAC;QACxC,KAAK;QACL,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAA+B,CAAC;QAC1D,aAAa,EAAE,GAAG,EAAE,GAAE,CAAC;QACvB,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/C,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;YACrB,IAAI,KAAI,CAAC;YACT,EAAE,CAAC,MAAc,EAAE,OAAmD;gBACpE,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;gBACvD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,KAAK,KAAI,CAAC;SACD,CAAA;KACZ,CAAC,CAAC;IAEH,OAAO,CAAC,WAAW,CAAC,CAAC;IAErB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACrC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;AAC/C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;IAChF,MAAM,IAAI,GAA8B,EAAE,CAAC;IAC3C,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAE7B,MAAM,OAAO,GAAG,mBAAmB,CAAC;QAClC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAA+B,CAAC;QAC1D,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;QACtG,gBAAgB,EAAE,GAAG,EAAE,CAAC,WAAW;QACnC,SAAS,EAAE,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC;QACtC,cAAc,EAAE,GAAG,EAAE,GAAG,gBAAgB,GAAG,IAAI,CAAC,CAAC,CAAC;KACnD,CAAC,CAAC;IAEH,MAAM,OAAO,EAAE,CAAC;IAEhB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACxC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC9B,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC"}
@@ -16,12 +16,12 @@ function guard(fn) {
16
16
  }
17
17
  }
18
18
  // list directory entries (non-hidden) sorted dirs first
19
- export function list(requestedPath) {
19
+ export function list(requestedPath, cwd) {
20
20
  return guard(() => {
21
- const projectRoot = process.cwd();
22
- const resolved = safePath(requestedPath || '.');
23
- if (!resolved.startsWith(projectRoot))
24
- throw new Error('path traversal blocked');
21
+ const projectRoot = cwd && path.isAbsolute(cwd) ? safePath(cwd) : process.cwd();
22
+ const resolved = requestedPath
23
+ ? safePath(requestedPath, projectRoot)
24
+ : projectRoot;
25
25
  const entries = fs.readdirSync(resolved, { withFileTypes: true })
26
26
  .filter((e) => !e.name.startsWith('.'))
27
27
  .map((e) => ({
@@ -34,21 +34,18 @@ export function list(requestedPath) {
34
34
  return { entries, projectName: path.basename(projectRoot) };
35
35
  });
36
36
  }
37
- export function read(filePath) {
38
- return guard(() => fs.readFileSync(safePath(filePath), 'utf-8'));
37
+ export function read(filePath, cwd) {
38
+ return guard(() => fs.readFileSync(safePath(filePath, cwd), 'utf-8'));
39
39
  }
40
- export function write(filePath, content) {
40
+ export function write(filePath, content, cwd) {
41
41
  return guard(() => {
42
- const projectRoot = process.cwd();
43
- const resolved = path.resolve(projectRoot, path.normalize(filePath || '.'));
44
- if (!resolved.startsWith(projectRoot))
45
- throw new Error('path traversal blocked');
42
+ const resolved = safePath(filePath, cwd);
46
43
  fs.writeFileSync(resolved, content, 'utf-8');
47
44
  });
48
45
  }
49
- export function create(targetPath, isDir) {
46
+ export function create(targetPath, isDir, cwd) {
50
47
  return guard(() => {
51
- const resolved = safePath(targetPath);
48
+ const resolved = safePath(targetPath, cwd);
52
49
  if (isDir)
53
50
  fs.mkdirSync(resolved, { recursive: true });
54
51
  else {
@@ -57,23 +54,24 @@ export function create(targetPath, isDir) {
57
54
  }
58
55
  });
59
56
  }
60
- export function remove(targetPath) {
61
- return guard(() => fs.rmSync(safePath(targetPath), { recursive: true, force: true }));
57
+ export function remove(targetPath, cwd) {
58
+ return guard(() => fs.rmSync(safePath(targetPath, cwd), { recursive: true, force: false }));
62
59
  }
63
- export function rename(oldPath, newName) {
60
+ export function rename(oldPath, newName, cwd) {
64
61
  return guard(() => {
65
- const resolvedOld = safePath(oldPath);
62
+ const projectRoot = cwd ? path.resolve(cwd) : process.cwd();
63
+ const resolvedOld = safePath(oldPath, projectRoot);
66
64
  const resolvedNew = path.join(path.dirname(resolvedOld), newName);
67
- safePath(path.relative(process.cwd(), resolvedNew));
65
+ safePath(path.relative(projectRoot, resolvedNew), projectRoot);
68
66
  fs.renameSync(resolvedOld, resolvedNew);
69
- return { newPath: path.relative(process.cwd(), resolvedNew).replace(/\\/g, '/') };
67
+ return { newPath: path.relative(projectRoot, resolvedNew).replace(/\\/g, '/') };
70
68
  });
71
69
  }
72
- export function copy(src, dest) {
73
- return guard(() => copyRecursive(safePath(src), safePath(dest)));
70
+ export function copy(src, dest, cwd) {
71
+ return guard(() => copyRecursive(safePath(src, cwd), safePath(dest, cwd)));
74
72
  }
75
- export function move(src, dest) {
76
- return guard(() => fs.renameSync(safePath(src), safePath(dest)));
73
+ export function move(src, dest, cwd) {
74
+ return guard(() => fs.renameSync(safePath(src, cwd), safePath(dest, cwd)));
77
75
  }
78
76
  // recursive case-insensitive name search, bounded by limit
79
77
  export function search(query, basePath, limit) {
@@ -1 +1 @@
1
- {"version":3,"file":"fileService.js","sourceRoot":"","sources":["../../src/services/fileService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fileService.js","sourceRoot":"","sources":["../../src/services/fileService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { convertRequestToOpenAI } from 'claude-adapter';
4
+ test('xml tool format avoids tool role messages for strict providers', () => {
5
+ const request = {
6
+ model: 'claude-sonnet-4',
7
+ max_tokens: 128,
8
+ messages: [
9
+ { role: 'user', content: 'list files' },
10
+ {
11
+ role: 'assistant',
12
+ content: [
13
+ {
14
+ type: 'tool_use',
15
+ id: 'toolu_1',
16
+ name: 'ls',
17
+ input: { path: '.' },
18
+ },
19
+ ],
20
+ },
21
+ {
22
+ role: 'user',
23
+ content: [
24
+ {
25
+ type: 'tool_result',
26
+ tool_use_id: 'toolu_1',
27
+ content: 'package.json',
28
+ },
29
+ ],
30
+ },
31
+ ],
32
+ tools: [
33
+ {
34
+ name: 'ls',
35
+ description: 'list files',
36
+ input_schema: {
37
+ type: 'object',
38
+ properties: { path: { type: 'string' } },
39
+ },
40
+ },
41
+ ],
42
+ };
43
+ const converted = convertRequestToOpenAI(request, 'deepseek-v4-flash-free', 'xml');
44
+ assert.deepEqual([...new Set(converted.messages.map((message) => message.role))].sort(), ['assistant', 'system', 'user']);
45
+ assert.equal(converted.messages.some((message) => message.role === 'tool'), false);
46
+ });
47
+ //# sourceMappingURL=modelAdapter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelAdapter.test.js","sourceRoot":"","sources":["../../src/services/modelAdapter.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAGxD,IAAI,CAAC,gEAAgE,EAAE,GAAG,EAAE;IAC1E,MAAM,OAAO,GAA4B;QACvC,KAAK,EAAE,iBAAiB;QACxB,UAAU,EAAE,GAAG;QACf,QAAQ,EAAE;YACR,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE;YACvC;gBACE,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,UAAU;wBAChB,EAAE,EAAE,SAAS;wBACb,IAAI,EAAE,IAAI;wBACV,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE;qBACrB;iBACF;aACF;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,aAAa;wBACnB,WAAW,EAAE,SAAS;wBACtB,OAAO,EAAE,cAAc;qBACxB;iBACF;aACF;SACF;QACD,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,IAAI;gBACV,WAAW,EAAE,YAAY;gBACzB,YAAY,EAAE;oBACZ,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;iBACzC;aACF;SACF;KACF,CAAC;IACF,MAAM,SAAS,GAAG,sBAAsB,CAAC,OAAO,EAAE,wBAAwB,EAAE,KAAK,CAAC,CAAC;IACnF,MAAM,CAAC,SAAS,CACd,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EACtE,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,CAChC,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;AACrF,CAAC,CAAC,CAAC"}