@nanocollective/nanocoder 1.16.4 → 1.17.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 (211) hide show
  1. package/README.md +53 -19
  2. package/assets/nanocoder-vscode.vsix +0 -0
  3. package/dist/app.d.ts +6 -1
  4. package/dist/app.d.ts.map +1 -1
  5. package/dist/app.js +54 -18
  6. package/dist/app.js.map +1 -1
  7. package/dist/cli.js +13 -1
  8. package/dist/cli.js.map +1 -1
  9. package/dist/commands/init.d.ts.map +1 -1
  10. package/dist/commands/init.js +4 -29
  11. package/dist/commands/init.js.map +1 -1
  12. package/dist/commands/mcp.d.ts +6 -0
  13. package/dist/commands/mcp.d.ts.map +1 -1
  14. package/dist/commands/mcp.js +25 -3
  15. package/dist/commands/mcp.js.map +1 -1
  16. package/dist/components/tool-confirmation.d.ts.map +1 -1
  17. package/dist/components/tool-confirmation.js +5 -19
  18. package/dist/components/tool-confirmation.js.map +1 -1
  19. package/dist/components/vscode-extension-prompt.d.ts +12 -0
  20. package/dist/components/vscode-extension-prompt.d.ts.map +1 -0
  21. package/dist/components/vscode-extension-prompt.js +115 -0
  22. package/dist/components/vscode-extension-prompt.js.map +1 -0
  23. package/dist/config/themes.js +2 -2
  24. package/dist/hooks/useAppInitialization.d.ts +2 -0
  25. package/dist/hooks/useAppInitialization.d.ts.map +1 -1
  26. package/dist/hooks/useAppInitialization.js +55 -1
  27. package/dist/hooks/useAppInitialization.js.map +1 -1
  28. package/dist/hooks/useChatHandler.d.ts.map +1 -1
  29. package/dist/hooks/useChatHandler.js +10 -71
  30. package/dist/hooks/useChatHandler.js.map +1 -1
  31. package/dist/hooks/useDirectoryTrust.d.ts.map +1 -1
  32. package/dist/hooks/useDirectoryTrust.js +4 -4
  33. package/dist/hooks/useDirectoryTrust.js.map +1 -1
  34. package/dist/hooks/useModeHandlers.d.ts +2 -1
  35. package/dist/hooks/useModeHandlers.d.ts.map +1 -1
  36. package/dist/hooks/useModeHandlers.js +13 -1
  37. package/dist/hooks/useModeHandlers.js.map +1 -1
  38. package/dist/hooks/useToolHandler.d.ts +0 -1
  39. package/dist/hooks/useToolHandler.d.ts.map +1 -1
  40. package/dist/hooks/useToolHandler.js +15 -75
  41. package/dist/hooks/useToolHandler.js.map +1 -1
  42. package/dist/hooks/useVSCodeServer.d.ts +45 -0
  43. package/dist/hooks/useVSCodeServer.d.ts.map +1 -0
  44. package/dist/hooks/useVSCodeServer.js +144 -0
  45. package/dist/hooks/useVSCodeServer.js.map +1 -0
  46. package/dist/lsp/index.d.ts +12 -0
  47. package/dist/lsp/index.d.ts.map +1 -0
  48. package/dist/lsp/index.js +11 -0
  49. package/dist/lsp/index.js.map +1 -0
  50. package/dist/lsp/lsp-client.d.ts +78 -0
  51. package/dist/lsp/lsp-client.d.ts.map +1 -0
  52. package/dist/lsp/lsp-client.js +378 -0
  53. package/dist/lsp/lsp-client.js.map +1 -0
  54. package/dist/lsp/lsp-client.spec.d.ts +2 -0
  55. package/dist/lsp/lsp-client.spec.d.ts.map +1 -0
  56. package/dist/lsp/lsp-client.spec.js +395 -0
  57. package/dist/lsp/lsp-client.spec.js.map +1 -0
  58. package/dist/lsp/lsp-manager.d.ts +124 -0
  59. package/dist/lsp/lsp-manager.d.ts.map +1 -0
  60. package/dist/lsp/lsp-manager.js +313 -0
  61. package/dist/lsp/lsp-manager.js.map +1 -0
  62. package/dist/lsp/lsp-manager.spec.d.ts +2 -0
  63. package/dist/lsp/lsp-manager.spec.d.ts.map +1 -0
  64. package/dist/lsp/lsp-manager.spec.js +388 -0
  65. package/dist/lsp/lsp-manager.spec.js.map +1 -0
  66. package/dist/lsp/protocol.d.ts +313 -0
  67. package/dist/lsp/protocol.d.ts.map +1 -0
  68. package/dist/lsp/protocol.js +70 -0
  69. package/dist/lsp/protocol.js.map +1 -0
  70. package/dist/lsp/protocol.spec.d.ts +2 -0
  71. package/dist/lsp/protocol.spec.d.ts.map +1 -0
  72. package/dist/lsp/protocol.spec.js +406 -0
  73. package/dist/lsp/protocol.spec.js.map +1 -0
  74. package/dist/lsp/server-discovery.d.ts +35 -0
  75. package/dist/lsp/server-discovery.d.ts.map +1 -0
  76. package/dist/lsp/server-discovery.js +291 -0
  77. package/dist/lsp/server-discovery.js.map +1 -0
  78. package/dist/lsp/server-discovery.spec.d.ts +2 -0
  79. package/dist/lsp/server-discovery.spec.d.ts.map +1 -0
  80. package/dist/lsp/server-discovery.spec.js +375 -0
  81. package/dist/lsp/server-discovery.spec.js.map +1 -0
  82. package/dist/mcp/mcp-client.d.ts +18 -0
  83. package/dist/mcp/mcp-client.d.ts.map +1 -1
  84. package/dist/mcp/mcp-client.js +59 -23
  85. package/dist/mcp/mcp-client.js.map +1 -1
  86. package/dist/mcp/mcp-client.spec.d.ts +2 -0
  87. package/dist/mcp/mcp-client.spec.d.ts.map +1 -0
  88. package/dist/mcp/mcp-client.spec.js +64 -0
  89. package/dist/mcp/mcp-client.spec.js.map +1 -0
  90. package/dist/mcp/transport-factory.d.ts +39 -0
  91. package/dist/mcp/transport-factory.d.ts.map +1 -0
  92. package/dist/mcp/transport-factory.js +176 -0
  93. package/dist/mcp/transport-factory.js.map +1 -0
  94. package/dist/mcp/transport-factory.spec.d.ts +2 -0
  95. package/dist/mcp/transport-factory.spec.d.ts.map +1 -0
  96. package/dist/mcp/transport-factory.spec.js +303 -0
  97. package/dist/mcp/transport-factory.spec.js.map +1 -0
  98. package/dist/message-handler.d.ts.map +1 -1
  99. package/dist/message-handler.js +6 -11
  100. package/dist/message-handler.js.map +1 -1
  101. package/dist/models/models-dev-client.spec.js +1 -0
  102. package/dist/models/models-dev-client.spec.js.map +1 -1
  103. package/dist/tools/create-file.d.ts.map +1 -1
  104. package/dist/tools/create-file.js +37 -3
  105. package/dist/tools/create-file.js.map +1 -1
  106. package/dist/tools/delete-lines.d.ts.map +1 -1
  107. package/dist/tools/delete-lines.js +41 -1
  108. package/dist/tools/delete-lines.js.map +1 -1
  109. package/dist/tools/index.d.ts.map +1 -1
  110. package/dist/tools/index.js +2 -0
  111. package/dist/tools/index.js.map +1 -1
  112. package/dist/tools/insert-lines.d.ts.map +1 -1
  113. package/dist/tools/insert-lines.js +40 -1
  114. package/dist/tools/insert-lines.js.map +1 -1
  115. package/dist/tools/lsp-get-diagnostics.d.ts +3 -0
  116. package/dist/tools/lsp-get-diagnostics.d.ts.map +1 -0
  117. package/dist/tools/lsp-get-diagnostics.js +182 -0
  118. package/dist/tools/lsp-get-diagnostics.js.map +1 -0
  119. package/dist/tools/replace-lines.d.ts.map +1 -1
  120. package/dist/tools/replace-lines.js +44 -1
  121. package/dist/tools/replace-lines.js.map +1 -1
  122. package/dist/tools/tool-manager.d.ts +17 -0
  123. package/dist/tools/tool-manager.d.ts.map +1 -1
  124. package/dist/tools/tool-manager.js +12 -0
  125. package/dist/tools/tool-manager.js.map +1 -1
  126. package/dist/types/config.d.ts +27 -0
  127. package/dist/types/config.d.ts.map +1 -1
  128. package/dist/types/mcp.d.ts +23 -1
  129. package/dist/types/mcp.d.ts.map +1 -1
  130. package/dist/utils/error-formatter.d.ts +22 -0
  131. package/dist/utils/error-formatter.d.ts.map +1 -0
  132. package/dist/utils/error-formatter.js +27 -0
  133. package/dist/utils/error-formatter.js.map +1 -0
  134. package/dist/utils/error-formatter.spec.d.ts +2 -0
  135. package/dist/utils/error-formatter.spec.d.ts.map +1 -0
  136. package/dist/utils/error-formatter.spec.js +147 -0
  137. package/dist/utils/error-formatter.spec.js.map +1 -0
  138. package/dist/utils/fuzzy-matching.spec.js +1 -0
  139. package/dist/utils/fuzzy-matching.spec.js.map +1 -1
  140. package/dist/utils/tool-args-parser.d.ts +37 -0
  141. package/dist/utils/tool-args-parser.d.ts.map +1 -0
  142. package/dist/utils/tool-args-parser.js +50 -0
  143. package/dist/utils/tool-args-parser.js.map +1 -0
  144. package/dist/utils/tool-args-parser.spec.d.ts +2 -0
  145. package/dist/utils/tool-args-parser.spec.d.ts.map +1 -0
  146. package/dist/utils/tool-args-parser.spec.js +111 -0
  147. package/dist/utils/tool-args-parser.spec.js.map +1 -0
  148. package/dist/utils/tool-cancellation.d.ts +21 -0
  149. package/dist/utils/tool-cancellation.d.ts.map +1 -0
  150. package/dist/utils/tool-cancellation.js +27 -0
  151. package/dist/utils/tool-cancellation.js.map +1 -0
  152. package/dist/utils/tool-cancellation.spec.d.ts +2 -0
  153. package/dist/utils/tool-cancellation.spec.d.ts.map +1 -0
  154. package/dist/utils/tool-cancellation.spec.js +186 -0
  155. package/dist/utils/tool-cancellation.spec.js.map +1 -0
  156. package/dist/utils/tool-result-display.d.ts +15 -0
  157. package/dist/utils/tool-result-display.d.ts.map +1 -0
  158. package/dist/utils/tool-result-display.js +51 -0
  159. package/dist/utils/tool-result-display.js.map +1 -0
  160. package/dist/vscode/extension-installer.d.ts +24 -0
  161. package/dist/vscode/extension-installer.d.ts.map +1 -0
  162. package/dist/vscode/extension-installer.js +110 -0
  163. package/dist/vscode/extension-installer.js.map +1 -0
  164. package/dist/vscode/extension-installer.spec.d.ts +2 -0
  165. package/dist/vscode/extension-installer.spec.d.ts.map +1 -0
  166. package/dist/vscode/extension-installer.spec.js +132 -0
  167. package/dist/vscode/extension-installer.spec.js.map +1 -0
  168. package/dist/vscode/index.d.ts +14 -0
  169. package/dist/vscode/index.d.ts.map +1 -0
  170. package/dist/vscode/index.js +14 -0
  171. package/dist/vscode/index.js.map +1 -0
  172. package/dist/vscode/protocol.d.ts +101 -0
  173. package/dist/vscode/protocol.d.ts.map +1 -0
  174. package/dist/vscode/protocol.js +7 -0
  175. package/dist/vscode/protocol.js.map +1 -0
  176. package/dist/vscode/protocol.spec.d.ts +2 -0
  177. package/dist/vscode/protocol.spec.d.ts.map +1 -0
  178. package/dist/vscode/protocol.spec.js +354 -0
  179. package/dist/vscode/protocol.spec.js.map +1 -0
  180. package/dist/vscode/vscode-server.d.ts +118 -0
  181. package/dist/vscode/vscode-server.d.ts.map +1 -0
  182. package/dist/vscode/vscode-server.js +303 -0
  183. package/dist/vscode/vscode-server.js.map +1 -0
  184. package/dist/vscode/vscode-server.spec.d.ts +2 -0
  185. package/dist/vscode/vscode-server.spec.d.ts.map +1 -0
  186. package/dist/vscode/vscode-server.spec.js +487 -0
  187. package/dist/vscode/vscode-server.spec.js.map +1 -0
  188. package/dist/wizard/steps/mcp-step.d.ts.map +1 -1
  189. package/dist/wizard/steps/mcp-step.js +139 -72
  190. package/dist/wizard/steps/mcp-step.js.map +1 -1
  191. package/dist/wizard/steps/summary-step.d.ts.map +1 -1
  192. package/dist/wizard/steps/summary-step.js +58 -2
  193. package/dist/wizard/steps/summary-step.js.map +1 -1
  194. package/dist/wizard/templates/mcp-templates.d.ts +20 -2
  195. package/dist/wizard/templates/mcp-templates.d.ts.map +1 -1
  196. package/dist/wizard/templates/mcp-templates.js +351 -7
  197. package/dist/wizard/templates/mcp-templates.js.map +1 -1
  198. package/dist/wizard/templates/mcp-templates.spec.js +257 -0
  199. package/dist/wizard/templates/mcp-templates.spec.js.map +1 -1
  200. package/dist/wizard/validation-array.spec.d.ts +2 -0
  201. package/dist/wizard/validation-array.spec.d.ts.map +1 -0
  202. package/dist/wizard/validation-array.spec.js +221 -0
  203. package/dist/wizard/validation-array.spec.js.map +1 -0
  204. package/dist/wizard/validation.d.ts +26 -1
  205. package/dist/wizard/validation.d.ts.map +1 -1
  206. package/dist/wizard/validation.js +15 -2
  207. package/dist/wizard/validation.js.map +1 -1
  208. package/dist/wizard/validation.spec.js +13 -5
  209. package/dist/wizard/validation.spec.js.map +1 -1
  210. package/package.json +7 -3
  211. package/source/app/prompts/main-prompt.md +6 -0
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Create cancellation results for tool calls
3
+ * Used when user cancels tool execution to maintain conversation state integrity
4
+ *
5
+ * This utility eliminates duplication of cancellation result creation logic
6
+ *
7
+ * @param toolCalls - Array of tool calls that were cancelled
8
+ * @returns Array of tool results indicating cancellation
9
+ *
10
+ * @example
11
+ * const cancellationResults = createCancellationResults(pendingToolCalls);
12
+ * const toolMessages = cancellationResults.map(result => ({
13
+ * role: 'tool' as const,
14
+ * content: result.content,
15
+ * tool_call_id: result.tool_call_id,
16
+ * name: result.name,
17
+ * }));
18
+ */
19
+ export function createCancellationResults(toolCalls) {
20
+ return toolCalls.map(toolCall => ({
21
+ tool_call_id: toolCall.id,
22
+ role: 'tool',
23
+ name: toolCall.function.name,
24
+ content: 'Tool execution was cancelled by the user.',
25
+ }));
26
+ }
27
+ //# sourceMappingURL=tool-cancellation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-cancellation.js","sourceRoot":"","sources":["../../source/utils/tool-cancellation.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,yBAAyB,CAAC,SAAqB;IAC9D,OAAO,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACjC,YAAY,EAAE,QAAQ,CAAC,EAAE;QACzB,IAAI,EAAE,MAAe;QACrB,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI;QAC5B,OAAO,EAAE,2CAA2C;KACpD,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tool-cancellation.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-cancellation.spec.d.ts","sourceRoot":"","sources":["../../source/utils/tool-cancellation.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,186 @@
1
+ import test from 'ava';
2
+ import { createCancellationResults } from './tool-cancellation.js';
3
+ console.log(`\ntool-cancellation.spec.ts`);
4
+ // Helper to create mock tool calls
5
+ function createMockToolCall(id, name, args = {}) {
6
+ return {
7
+ id,
8
+ function: {
9
+ name,
10
+ arguments: args,
11
+ },
12
+ };
13
+ }
14
+ // Basic functionality tests
15
+ test('createCancellationResults - creates result for single tool call', t => {
16
+ const toolCalls = [createMockToolCall('call-1', 'ReadFile', { path: '/test' })];
17
+ const results = createCancellationResults(toolCalls);
18
+ t.is(results.length, 1);
19
+ t.is(results[0].tool_call_id, 'call-1');
20
+ t.is(results[0].role, 'tool');
21
+ t.is(results[0].name, 'ReadFile');
22
+ t.is(results[0].content, 'Tool execution was cancelled by the user.');
23
+ });
24
+ test('createCancellationResults - creates results for multiple tool calls', t => {
25
+ const toolCalls = [
26
+ createMockToolCall('call-1', 'ReadFile', { path: '/test1' }),
27
+ createMockToolCall('call-2', 'WriteFile', { path: '/test2' }),
28
+ createMockToolCall('call-3', 'ExecuteBash', { command: 'ls' }),
29
+ ];
30
+ const results = createCancellationResults(toolCalls);
31
+ t.is(results.length, 3);
32
+ t.is(results[0].tool_call_id, 'call-1');
33
+ t.is(results[1].tool_call_id, 'call-2');
34
+ t.is(results[2].tool_call_id, 'call-3');
35
+ });
36
+ test('createCancellationResults - handles empty array', t => {
37
+ const toolCalls = [];
38
+ const results = createCancellationResults(toolCalls);
39
+ t.is(results.length, 0);
40
+ t.deepEqual(results, []);
41
+ });
42
+ // Field mapping tests
43
+ test('createCancellationResults - correctly maps tool_call_id from id', t => {
44
+ const toolCalls = [createMockToolCall('unique-id-123', 'SomeTool')];
45
+ const results = createCancellationResults(toolCalls);
46
+ t.is(results[0].tool_call_id, 'unique-id-123');
47
+ });
48
+ test('createCancellationResults - correctly maps name from function.name', t => {
49
+ const toolCalls = [createMockToolCall('call-1', 'CustomToolName')];
50
+ const results = createCancellationResults(toolCalls);
51
+ t.is(results[0].name, 'CustomToolName');
52
+ });
53
+ test('createCancellationResults - sets role to "tool"', t => {
54
+ const toolCalls = [createMockToolCall('call-1', 'AnyTool')];
55
+ const results = createCancellationResults(toolCalls);
56
+ t.is(results[0].role, 'tool');
57
+ });
58
+ test('createCancellationResults - sets consistent cancellation message', t => {
59
+ const toolCalls = [
60
+ createMockToolCall('call-1', 'Tool1'),
61
+ createMockToolCall('call-2', 'Tool2'),
62
+ ];
63
+ const results = createCancellationResults(toolCalls);
64
+ // All results should have the same cancellation message
65
+ t.is(results[0].content, 'Tool execution was cancelled by the user.');
66
+ t.is(results[1].content, 'Tool execution was cancelled by the user.');
67
+ });
68
+ // Edge cases with tool names
69
+ test('createCancellationResults - handles tools with special characters in name', t => {
70
+ const toolCalls = [createMockToolCall('call-1', 'Tool_With_Underscores')];
71
+ const results = createCancellationResults(toolCalls);
72
+ t.is(results[0].name, 'Tool_With_Underscores');
73
+ });
74
+ test('createCancellationResults - handles tools with numbers in name', t => {
75
+ const toolCalls = [createMockToolCall('call-1', 'Tool123')];
76
+ const results = createCancellationResults(toolCalls);
77
+ t.is(results[0].name, 'Tool123');
78
+ });
79
+ test('createCancellationResults - handles tools with camelCase name', t => {
80
+ const toolCalls = [createMockToolCall('call-1', 'readFileContents')];
81
+ const results = createCancellationResults(toolCalls);
82
+ t.is(results[0].name, 'readFileContents');
83
+ });
84
+ // Edge cases with tool call IDs
85
+ test('createCancellationResults - handles very long tool call IDs', t => {
86
+ const longId = 'a'.repeat(1000);
87
+ const toolCalls = [createMockToolCall(longId, 'SomeTool')];
88
+ const results = createCancellationResults(toolCalls);
89
+ t.is(results[0].tool_call_id, longId);
90
+ });
91
+ test('createCancellationResults - handles UUID-style IDs', t => {
92
+ const uuid = '550e8400-e29b-41d4-a716-446655440000';
93
+ const toolCalls = [createMockToolCall(uuid, 'SomeTool')];
94
+ const results = createCancellationResults(toolCalls);
95
+ t.is(results[0].tool_call_id, uuid);
96
+ });
97
+ // Arguments handling (should be ignored in cancellation)
98
+ test('createCancellationResults - ignores tool arguments', t => {
99
+ const complexArgs = {
100
+ path: '/very/long/path',
101
+ options: { recursive: true, force: true },
102
+ metadata: { created: new Date(), author: 'test' },
103
+ };
104
+ const toolCalls = [createMockToolCall('call-1', 'ComplexTool', complexArgs)];
105
+ const results = createCancellationResults(toolCalls);
106
+ // Result should not include arguments
107
+ t.false('arguments' in results[0]);
108
+ // Only expected fields should be present
109
+ t.is(Object.keys(results[0]).length, 4); // tool_call_id, role, name, content
110
+ });
111
+ // Multiple tool calls with same name
112
+ test('createCancellationResults - handles multiple calls to same tool', t => {
113
+ const toolCalls = [
114
+ createMockToolCall('call-1', 'ReadFile', { path: '/file1' }),
115
+ createMockToolCall('call-2', 'ReadFile', { path: '/file2' }),
116
+ createMockToolCall('call-3', 'ReadFile', { path: '/file3' }),
117
+ ];
118
+ const results = createCancellationResults(toolCalls);
119
+ t.is(results.length, 3);
120
+ // All should have same name but different IDs
121
+ t.is(results[0].name, 'ReadFile');
122
+ t.is(results[1].name, 'ReadFile');
123
+ t.is(results[2].name, 'ReadFile');
124
+ t.is(results[0].tool_call_id, 'call-1');
125
+ t.is(results[1].tool_call_id, 'call-2');
126
+ t.is(results[2].tool_call_id, 'call-3');
127
+ });
128
+ // Result structure validation
129
+ test('createCancellationResults - result has correct structure', t => {
130
+ const toolCalls = [createMockToolCall('call-1', 'TestTool')];
131
+ const results = createCancellationResults(toolCalls);
132
+ const result = results[0];
133
+ t.true('tool_call_id' in result);
134
+ t.true('role' in result);
135
+ t.true('name' in result);
136
+ t.true('content' in result);
137
+ t.is(typeof result.tool_call_id, 'string');
138
+ t.is(typeof result.role, 'string');
139
+ t.is(typeof result.name, 'string');
140
+ t.is(typeof result.content, 'string');
141
+ });
142
+ // Array immutability test
143
+ test('createCancellationResults - does not modify input array', t => {
144
+ const toolCalls = [
145
+ createMockToolCall('call-1', 'Tool1'),
146
+ createMockToolCall('call-2', 'Tool2'),
147
+ ];
148
+ const originalLength = toolCalls.length;
149
+ const originalFirstId = toolCalls[0].id;
150
+ createCancellationResults(toolCalls);
151
+ t.is(toolCalls.length, originalLength);
152
+ t.is(toolCalls[0].id, originalFirstId);
153
+ });
154
+ // Real-world scenario test
155
+ test('createCancellationResults - realistic multi-tool cancellation', t => {
156
+ const toolCalls = [
157
+ createMockToolCall('tc-001', 'ReadFile', {
158
+ path: '/project/config.json',
159
+ }),
160
+ createMockToolCall('tc-002', 'FindFiles', {
161
+ pattern: '**/*.ts',
162
+ path: '/project',
163
+ }),
164
+ createMockToolCall('tc-003', 'ExecuteBash', {
165
+ command: 'npm test',
166
+ }),
167
+ createMockToolCall('tc-004', 'WriteFile', {
168
+ path: '/output.txt',
169
+ content: 'test',
170
+ }),
171
+ ];
172
+ const results = createCancellationResults(toolCalls);
173
+ t.is(results.length, 4);
174
+ // Verify all have correct structure and cancellation message
175
+ results.forEach((result, index) => {
176
+ t.is(result.tool_call_id, `tc-00${index + 1}`);
177
+ t.is(result.role, 'tool');
178
+ t.is(result.content, 'Tool execution was cancelled by the user.');
179
+ });
180
+ // Verify specific tool names are preserved
181
+ t.is(results[0].name, 'ReadFile');
182
+ t.is(results[1].name, 'FindFiles');
183
+ t.is(results[2].name, 'ExecuteBash');
184
+ t.is(results[3].name, 'WriteFile');
185
+ });
186
+ //# sourceMappingURL=tool-cancellation.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-cancellation.spec.js","sourceRoot":"","sources":["../../source/utils/tool-cancellation.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import type { ToolCall, ToolResult } from '../types/index.js';
3
+ import type { ToolManager } from '../tools/tool-manager.js';
4
+ /**
5
+ * Display tool result with proper formatting
6
+ * Extracted to eliminate duplication between useChatHandler and useToolHandler
7
+ *
8
+ * @param toolCall - The tool call that was executed
9
+ * @param result - The result from tool execution
10
+ * @param toolManager - The tool manager instance (for formatters)
11
+ * @param addToChatQueue - Function to add components to chat queue
12
+ * @param componentKeyCounter - Counter for generating unique React keys
13
+ */
14
+ export declare function displayToolResult(toolCall: ToolCall, result: ToolResult, toolManager: ToolManager | null, addToChatQueue: (component: React.ReactNode) => void, componentKeyCounter: number): Promise<void>;
15
+ //# sourceMappingURL=tool-result-display.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-result-display.d.ts","sourceRoot":"","sources":["../../source/utils/tool-result-display.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAC,QAAQ,EAAE,UAAU,EAAC,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,sBAAsB,CAAC;AAKtD;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACtC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,WAAW,GAAG,IAAI,EAC/B,cAAc,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,EACpD,mBAAmB,EAAE,MAAM,GACzB,OAAO,CAAC,IAAI,CAAC,CAqEf"}
@@ -0,0 +1,51 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { parseToolArguments } from '../utils/tool-args-parser.js';
4
+ import ToolMessage from '../components/tool-message.js';
5
+ import ErrorMessage from '../components/error-message.js';
6
+ /**
7
+ * Display tool result with proper formatting
8
+ * Extracted to eliminate duplication between useChatHandler and useToolHandler
9
+ *
10
+ * @param toolCall - The tool call that was executed
11
+ * @param result - The result from tool execution
12
+ * @param toolManager - The tool manager instance (for formatters)
13
+ * @param addToChatQueue - Function to add components to chat queue
14
+ * @param componentKeyCounter - Counter for generating unique React keys
15
+ */
16
+ export async function displayToolResult(toolCall, result, toolManager, addToChatQueue, componentKeyCounter) {
17
+ // Check if this is an error result
18
+ const isError = result.content.startsWith('Error: ');
19
+ if (isError) {
20
+ // Display as error message
21
+ const errorMessage = result.content.replace(/^Error: /, '');
22
+ addToChatQueue(_jsx(ErrorMessage, { message: errorMessage, hideBox: true }, `tool-error-${result.tool_call_id}-${componentKeyCounter}-${Date.now()}`));
23
+ return;
24
+ }
25
+ if (toolManager) {
26
+ const formatter = toolManager.getToolFormatter(result.name);
27
+ if (formatter) {
28
+ try {
29
+ const parsedArgs = parseToolArguments(toolCall.function.arguments);
30
+ const formattedResult = await formatter(parsedArgs, result.content);
31
+ if (React.isValidElement(formattedResult)) {
32
+ addToChatQueue(React.cloneElement(formattedResult, {
33
+ key: `tool-result-${result.tool_call_id}-${componentKeyCounter}-${Date.now()}`,
34
+ }));
35
+ }
36
+ else {
37
+ addToChatQueue(_jsx(ToolMessage, { title: `⚒ ${result.name}`, message: String(formattedResult), hideBox: true }, `tool-result-${result.tool_call_id}-${componentKeyCounter}-${Date.now()}`));
38
+ }
39
+ }
40
+ catch {
41
+ // If formatter fails, show raw result
42
+ addToChatQueue(_jsx(ToolMessage, { title: `⚒ ${result.name}`, message: result.content, hideBox: true }, `tool-result-${result.tool_call_id}-${componentKeyCounter}`));
43
+ }
44
+ }
45
+ else {
46
+ // No formatter, show raw result
47
+ addToChatQueue(_jsx(ToolMessage, { title: `⚒ ${result.name}`, message: result.content, hideBox: true }, `tool-result-${result.tool_call_id}-${componentKeyCounter}`));
48
+ }
49
+ }
50
+ }
51
+ //# sourceMappingURL=tool-result-display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-result-display.js","sourceRoot":"","sources":["../../source/utils/tool-result-display.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAC,kBAAkB,EAAC,MAAM,0BAA0B,CAAC;AAC5D,OAAO,WAAW,MAAM,2BAA2B,CAAC;AACpD,OAAO,YAAY,MAAM,4BAA4B,CAAC;AAEtD;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACtC,QAAkB,EAClB,MAAkB,EAClB,WAA+B,EAC/B,cAAoD,EACpD,mBAA2B;IAE3B,mCAAmC;IACnC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAErD,IAAI,OAAO,EAAE,CAAC;QACb,2BAA2B;QAC3B,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC5D,cAAc,CACb,KAAC,YAAY,IAIZ,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,IAAI,IAJR,cACJ,MAAM,CAAC,YACR,IAAI,mBAAmB,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAGtC,CACF,CAAC;QACF,OAAO;IACR,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,SAAS,EAAE,CAAC;YACf,IAAI,CAAC;gBACJ,MAAM,UAAU,GAAG,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACnE,MAAM,eAAe,GAAG,MAAM,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;gBAEpE,IAAI,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,CAAC;oBAC3C,cAAc,CACb,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE;wBACnC,GAAG,EAAE,eACJ,MAAM,CAAC,YACR,IAAI,mBAAmB,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE;qBACvC,CAAC,CACF,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACP,cAAc,CACb,KAAC,WAAW,IAIX,KAAK,EAAE,KAAK,MAAM,CAAC,IAAI,EAAE,EACzB,OAAO,EAAE,MAAM,CAAC,eAAe,CAAC,EAChC,OAAO,EAAE,IAAI,IALR,eACJ,MAAM,CAAC,YACR,IAAI,mBAAmB,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAItC,CACF,CAAC;gBACH,CAAC;YACF,CAAC;YAAC,MAAM,CAAC;gBACR,sCAAsC;gBACtC,cAAc,CACb,KAAC,WAAW,IAEX,KAAK,EAAE,KAAK,MAAM,CAAC,IAAI,EAAE,EACzB,OAAO,EAAE,MAAM,CAAC,OAAO,EACvB,OAAO,EAAE,IAAI,IAHR,eAAe,MAAM,CAAC,YAAY,IAAI,mBAAmB,EAAE,CAI/D,CACF,CAAC;YACH,CAAC;QACF,CAAC;aAAM,CAAC;YACP,gCAAgC;YAChC,cAAc,CACb,KAAC,WAAW,IAEX,KAAK,EAAE,KAAK,MAAM,CAAC,IAAI,EAAE,EACzB,OAAO,EAAE,MAAM,CAAC,OAAO,EACvB,OAAO,EAAE,IAAI,IAHR,eAAe,MAAM,CAAC,YAAY,IAAI,mBAAmB,EAAE,CAI/D,CACF,CAAC;QACH,CAAC;IACF,CAAC;AACF,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * VS Code extension installation utilities
3
+ */
4
+ /**
5
+ * Get the path to the bundled VSIX file
6
+ */
7
+ export declare function getVsixPath(): string;
8
+ /**
9
+ * Check if the VS Code CLI is available
10
+ */
11
+ export declare function isVSCodeCliAvailable(): boolean;
12
+ /**
13
+ * Check if the nanocoder VS Code extension is installed
14
+ */
15
+ export declare function isExtensionInstalled(): boolean;
16
+ /**
17
+ * Install the VS Code extension from the bundled VSIX
18
+ * Returns a promise that resolves when installation is complete
19
+ */
20
+ export declare function installExtension(): Promise<{
21
+ success: boolean;
22
+ message: string;
23
+ }>;
24
+ //# sourceMappingURL=extension-installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-installer.d.ts","sourceRoot":"","sources":["../../source/vscode/extension-installer.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAepC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAO9C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAU9C;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CAChB,CAAC,CA6DD"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * VS Code extension installation utilities
3
+ */
4
+ import { execSync, spawn } from 'child_process';
5
+ import { existsSync } from 'fs';
6
+ import { join, dirname } from 'path';
7
+ import { fileURLToPath } from 'url';
8
+ const __dirname = dirname(fileURLToPath(import.meta.url));
9
+ /**
10
+ * Get the path to the bundled VSIX file
11
+ */
12
+ export function getVsixPath() {
13
+ // In development: assets folder is at project root
14
+ // In production (npm install): assets folder is in package root
15
+ const possiblePaths = [
16
+ join(__dirname, '../../assets/nanocoder-vscode.vsix'), // development
17
+ join(__dirname, '../../../assets/nanocoder-vscode.vsix'), // npm installed
18
+ ];
19
+ for (const path of possiblePaths) {
20
+ if (existsSync(path)) {
21
+ return path;
22
+ }
23
+ }
24
+ throw new Error('VS Code extension VSIX not found in package');
25
+ }
26
+ /**
27
+ * Check if the VS Code CLI is available
28
+ */
29
+ export function isVSCodeCliAvailable() {
30
+ try {
31
+ execSync('code --version', { stdio: 'ignore' });
32
+ return true;
33
+ }
34
+ catch {
35
+ return false;
36
+ }
37
+ }
38
+ /**
39
+ * Check if the nanocoder VS Code extension is installed
40
+ */
41
+ export function isExtensionInstalled() {
42
+ try {
43
+ const output = execSync('code --list-extensions', {
44
+ encoding: 'utf-8',
45
+ stdio: ['pipe', 'pipe', 'ignore'],
46
+ });
47
+ return output.toLowerCase().includes('nanocollective.nanocoder-vscode');
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ }
53
+ /**
54
+ * Install the VS Code extension from the bundled VSIX
55
+ * Returns a promise that resolves when installation is complete
56
+ */
57
+ export async function installExtension() {
58
+ if (!isVSCodeCliAvailable()) {
59
+ return {
60
+ success: false,
61
+ message: 'VS Code CLI not found. Please install the "code" command:\n' +
62
+ ' 1. Open VS Code\n' +
63
+ ' 2. Press Cmd+Shift+P (Mac) or Ctrl+Shift+P (Windows/Linux)\n' +
64
+ ' 3. Type "Shell Command: Install \'code\' command in PATH"',
65
+ };
66
+ }
67
+ try {
68
+ const vsixPath = getVsixPath();
69
+ return new Promise(resolve => {
70
+ const child = spawn('code', ['--install-extension', vsixPath], {
71
+ stdio: ['ignore', 'pipe', 'pipe'],
72
+ });
73
+ let stdout = '';
74
+ let stderr = '';
75
+ child.stdout?.on('data', (data) => {
76
+ stdout += data.toString();
77
+ });
78
+ child.stderr?.on('data', (data) => {
79
+ stderr += data.toString();
80
+ });
81
+ child.on('close', code => {
82
+ if (code === 0) {
83
+ resolve({
84
+ success: true,
85
+ message: 'VS Code extension installed successfully! Please reload VS Code to activate it.',
86
+ });
87
+ }
88
+ else {
89
+ resolve({
90
+ success: false,
91
+ message: `Failed to install extension: ${stderr || stdout}`,
92
+ });
93
+ }
94
+ });
95
+ child.on('error', error => {
96
+ resolve({
97
+ success: false,
98
+ message: `Failed to install extension: ${error.message}`,
99
+ });
100
+ });
101
+ });
102
+ }
103
+ catch (error) {
104
+ return {
105
+ success: false,
106
+ message: `Failed to install extension: ${error instanceof Error ? error.message : String(error)}`,
107
+ };
108
+ }
109
+ }
110
+ //# sourceMappingURL=extension-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-installer.js","sourceRoot":"","sources":["../../source/vscode/extension-installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=extension-installer.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-installer.spec.d.ts","sourceRoot":"","sources":["../../source/vscode/extension-installer.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,132 @@
1
+ import test from 'ava';
2
+ import { isVSCodeCliAvailable, isExtensionInstalled, installExtension, getVsixPath, } from './extension-installer.js';
3
+ // ============================================================================
4
+ // Tests for isVSCodeCliAvailable
5
+ // ============================================================================
6
+ test('isVSCodeCliAvailable returns a boolean', t => {
7
+ const result = isVSCodeCliAvailable();
8
+ t.is(typeof result, 'boolean');
9
+ });
10
+ test('isVSCodeCliAvailable does not throw', t => {
11
+ t.notThrows(() => {
12
+ isVSCodeCliAvailable();
13
+ });
14
+ });
15
+ // ============================================================================
16
+ // Tests for isExtensionInstalled
17
+ // ============================================================================
18
+ test('isExtensionInstalled returns a boolean', t => {
19
+ const result = isExtensionInstalled();
20
+ t.is(typeof result, 'boolean');
21
+ });
22
+ test('isExtensionInstalled does not throw', t => {
23
+ t.notThrows(() => {
24
+ isExtensionInstalled();
25
+ });
26
+ });
27
+ // Note: We can't easily test the true case for isExtensionInstalled
28
+ // without actually having VS Code and the extension installed
29
+ // ============================================================================
30
+ // Tests for installExtension
31
+ // ============================================================================
32
+ test('installExtension returns a promise', async (t) => {
33
+ const result = installExtension();
34
+ t.true(result instanceof Promise);
35
+ // Wait for the promise to settle
36
+ await result.catch(() => { });
37
+ });
38
+ test('installExtension returns object with success and message', async (t) => {
39
+ const result = await installExtension();
40
+ t.is(typeof result.success, 'boolean');
41
+ t.is(typeof result.message, 'string');
42
+ t.true(result.message.length > 0);
43
+ });
44
+ // If VS Code CLI is not available, installExtension should return appropriate message
45
+ test('installExtension handles missing VS Code CLI gracefully', async (t) => {
46
+ // This test documents expected behavior - if code CLI is missing,
47
+ // installExtension should return a helpful message
48
+ const result = await installExtension();
49
+ if (!isVSCodeCliAvailable()) {
50
+ t.false(result.success);
51
+ t.true(result.message.includes('VS Code CLI'));
52
+ }
53
+ else {
54
+ // If VS Code is available, the result depends on whether VSIX exists
55
+ t.is(typeof result.success, 'boolean');
56
+ }
57
+ });
58
+ // ============================================================================
59
+ // Tests for getVsixPath
60
+ // ============================================================================
61
+ test('getVsixPath returns a string when VSIX exists', t => {
62
+ try {
63
+ const path = getVsixPath();
64
+ t.is(typeof path, 'string');
65
+ t.true(path.includes('nanocoder-vscode.vsix'));
66
+ }
67
+ catch (error) {
68
+ // VSIX may not exist in all environments (e.g., before build)
69
+ t.true(error instanceof Error);
70
+ t.true(error.message.includes('VSIX not found'));
71
+ }
72
+ });
73
+ test('getVsixPath throws when VSIX does not exist', t => {
74
+ // Since we can't guarantee VSIX exists in test environment,
75
+ // we just verify the function throws the expected error type
76
+ try {
77
+ getVsixPath();
78
+ // If it doesn't throw, the VSIX exists - that's fine
79
+ t.pass();
80
+ }
81
+ catch (error) {
82
+ t.true(error instanceof Error);
83
+ t.regex(error.message, /VSIX not found/);
84
+ }
85
+ });
86
+ // ============================================================================
87
+ // Integration-style tests (behavior documentation)
88
+ // ============================================================================
89
+ test('installExtension with VSIX missing returns appropriate error', async (t) => {
90
+ // This test documents the expected behavior when VSIX is missing
91
+ // but VS Code CLI is available
92
+ if (!isVSCodeCliAvailable()) {
93
+ t.pass(); // Skip if VS Code not available
94
+ return;
95
+ }
96
+ const result = await installExtension();
97
+ // If VSIX doesn't exist, should fail with appropriate message
98
+ if (!result.success) {
99
+ t.true(result.message.includes('Failed') || result.message.includes('not found'));
100
+ }
101
+ else {
102
+ // If it succeeded, the extension was installed
103
+ t.true(result.message.includes('success'));
104
+ }
105
+ });
106
+ // ============================================================================
107
+ // Type safety tests
108
+ // ============================================================================
109
+ test('isVSCodeCliAvailable has correct return type', t => {
110
+ const result = isVSCodeCliAvailable();
111
+ t.is(typeof result, 'boolean');
112
+ });
113
+ test('isExtensionInstalled has correct return type', t => {
114
+ const result = isExtensionInstalled();
115
+ t.is(typeof result, 'boolean');
116
+ });
117
+ test('installExtension has correct return type', async (t) => {
118
+ const result = await installExtension();
119
+ t.is(typeof result.success, 'boolean');
120
+ t.is(typeof result.message, 'string');
121
+ });
122
+ test('getVsixPath has correct return type when successful', t => {
123
+ try {
124
+ const result = getVsixPath();
125
+ t.is(typeof result, 'string');
126
+ }
127
+ catch {
128
+ // Expected if VSIX doesn't exist
129
+ t.pass();
130
+ }
131
+ });
132
+ //# sourceMappingURL=extension-installer.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-installer.spec.js","sourceRoot":"","sources":["../../source/vscode/extension-installer.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * VS Code integration module
3
+ *
4
+ * Provides WebSocket-based communication between the nanocoder CLI
5
+ * and the VS Code extension for:
6
+ * - Live diff previews
7
+ * - File change approvals
8
+ * - Chat integration
9
+ * - Diagnostics sharing
10
+ */
11
+ export { VSCodeServer, getVSCodeServer, isVSCodeConnected, sendFileChangeToVSCode, closeDiffInVSCode, closeAllDiffsInVSCode, type VSCodeServerCallbacks, type PromptHandler, type MessageHandler, } from './vscode-server.js';
12
+ export { type ServerMessage, type ClientMessage, type FileChangeMessage, type ToolCallMessage, type AssistantMessage, type StatusMessage, type ConnectionAckMessage, type DiagnosticsRequestMessage, type SendPromptMessage, type ApplyChangeMessage, type RejectChangeMessage, type GetStatusMessage, type ContextMessage, type DiagnosticsResponseMessage, type DiagnosticInfo, type PendingChange, PROTOCOL_VERSION, DEFAULT_PORT, } from './protocol.js';
13
+ export { isVSCodeCliAvailable, isExtensionInstalled, installExtension, getVsixPath, } from './extension-installer.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/vscode/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACN,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,cAAc,GACnB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACN,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,0BAA0B,EAC/B,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,gBAAgB,EAChB,YAAY,GACZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EACN,oBAAoB,EACpB,oBAAoB,EACpB,gBAAgB,EAChB,WAAW,GACX,MAAM,uBAAuB,CAAC"}