@ddse/acm-aicoder 0.5.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 (165) hide show
  1. package/.aicoder/index.json +304 -0
  2. package/AICODER_IMPLEMENTATION_PLAN_PHASE2.md +284 -0
  3. package/LICENSE +21 -0
  4. package/README.md +490 -0
  5. package/bin/interactive.tsx +232 -0
  6. package/dist/bin/interactive.d.ts +3 -0
  7. package/dist/bin/interactive.d.ts.map +1 -0
  8. package/dist/bin/interactive.js +155 -0
  9. package/dist/bin/interactive.js.map +1 -0
  10. package/dist/src/config/providers.d.ts +15 -0
  11. package/dist/src/config/providers.d.ts.map +1 -0
  12. package/dist/src/config/providers.js +142 -0
  13. package/dist/src/config/providers.js.map +1 -0
  14. package/dist/src/config/session.d.ts +25 -0
  15. package/dist/src/config/session.d.ts.map +1 -0
  16. package/dist/src/config/session.js +97 -0
  17. package/dist/src/config/session.js.map +1 -0
  18. package/dist/src/context/bm25.d.ts +68 -0
  19. package/dist/src/context/bm25.d.ts.map +1 -0
  20. package/dist/src/context/bm25.js +131 -0
  21. package/dist/src/context/bm25.js.map +1 -0
  22. package/dist/src/context/code-search.d.ts +30 -0
  23. package/dist/src/context/code-search.d.ts.map +1 -0
  24. package/dist/src/context/code-search.js +150 -0
  25. package/dist/src/context/code-search.js.map +1 -0
  26. package/dist/src/context/context-pack.d.ts +25 -0
  27. package/dist/src/context/context-pack.d.ts.map +1 -0
  28. package/dist/src/context/context-pack.js +92 -0
  29. package/dist/src/context/context-pack.js.map +1 -0
  30. package/dist/src/context/dependency-mapper.d.ts +10 -0
  31. package/dist/src/context/dependency-mapper.d.ts.map +1 -0
  32. package/dist/src/context/dependency-mapper.js +62 -0
  33. package/dist/src/context/dependency-mapper.js.map +1 -0
  34. package/dist/src/context/index.d.ts +8 -0
  35. package/dist/src/context/index.d.ts.map +1 -0
  36. package/dist/src/context/index.js +9 -0
  37. package/dist/src/context/index.js.map +1 -0
  38. package/dist/src/context/symbol-extractor.d.ts +26 -0
  39. package/dist/src/context/symbol-extractor.d.ts.map +1 -0
  40. package/dist/src/context/symbol-extractor.js +129 -0
  41. package/dist/src/context/symbol-extractor.js.map +1 -0
  42. package/dist/src/context/test-mapper.d.ts +16 -0
  43. package/dist/src/context/test-mapper.d.ts.map +1 -0
  44. package/dist/src/context/test-mapper.js +66 -0
  45. package/dist/src/context/test-mapper.js.map +1 -0
  46. package/dist/src/context/types.d.ts +61 -0
  47. package/dist/src/context/types.d.ts.map +1 -0
  48. package/dist/src/context/types.js +3 -0
  49. package/dist/src/context/types.js.map +1 -0
  50. package/dist/src/context/workspace-indexer.d.ts +39 -0
  51. package/dist/src/context/workspace-indexer.d.ts.map +1 -0
  52. package/dist/src/context/workspace-indexer.js +222 -0
  53. package/dist/src/context/workspace-indexer.js.map +1 -0
  54. package/dist/src/index.d.ts +5 -0
  55. package/dist/src/index.d.ts.map +1 -0
  56. package/dist/src/index.js +6 -0
  57. package/dist/src/index.js.map +1 -0
  58. package/dist/src/registries.d.ts +34 -0
  59. package/dist/src/registries.d.ts.map +1 -0
  60. package/dist/src/registries.js +87 -0
  61. package/dist/src/registries.js.map +1 -0
  62. package/dist/src/runtime/budget-manager.d.ts +42 -0
  63. package/dist/src/runtime/budget-manager.d.ts.map +1 -0
  64. package/dist/src/runtime/budget-manager.js +82 -0
  65. package/dist/src/runtime/budget-manager.js.map +1 -0
  66. package/dist/src/runtime/interactive-runtime.d.ts +39 -0
  67. package/dist/src/runtime/interactive-runtime.d.ts.map +1 -0
  68. package/dist/src/runtime/interactive-runtime.js +321 -0
  69. package/dist/src/runtime/interactive-runtime.js.map +1 -0
  70. package/dist/src/tasks-v2/analysis-tasks.d.ts +117 -0
  71. package/dist/src/tasks-v2/analysis-tasks.d.ts.map +1 -0
  72. package/dist/src/tasks-v2/analysis-tasks.js +209 -0
  73. package/dist/src/tasks-v2/analysis-tasks.js.map +1 -0
  74. package/dist/src/tasks-v2/developer-tasks.d.ts +226 -0
  75. package/dist/src/tasks-v2/developer-tasks.d.ts.map +1 -0
  76. package/dist/src/tasks-v2/developer-tasks.js +322 -0
  77. package/dist/src/tasks-v2/developer-tasks.js.map +1 -0
  78. package/dist/src/tasks-v2/index.d.ts +3 -0
  79. package/dist/src/tasks-v2/index.d.ts.map +1 -0
  80. package/dist/src/tasks-v2/index.js +4 -0
  81. package/dist/src/tasks-v2/index.js.map +1 -0
  82. package/dist/src/tools-v2/edit-tools.d.ts +67 -0
  83. package/dist/src/tools-v2/edit-tools.d.ts.map +1 -0
  84. package/dist/src/tools-v2/edit-tools.js +117 -0
  85. package/dist/src/tools-v2/edit-tools.js.map +1 -0
  86. package/dist/src/tools-v2/index.d.ts +6 -0
  87. package/dist/src/tools-v2/index.d.ts.map +1 -0
  88. package/dist/src/tools-v2/index.js +7 -0
  89. package/dist/src/tools-v2/index.js.map +1 -0
  90. package/dist/src/tools-v2/read-tools.d.ts +129 -0
  91. package/dist/src/tools-v2/read-tools.d.ts.map +1 -0
  92. package/dist/src/tools-v2/read-tools.js +216 -0
  93. package/dist/src/tools-v2/read-tools.js.map +1 -0
  94. package/dist/src/tools-v2/search-tools.d.ts +73 -0
  95. package/dist/src/tools-v2/search-tools.d.ts.map +1 -0
  96. package/dist/src/tools-v2/search-tools.js +132 -0
  97. package/dist/src/tools-v2/search-tools.js.map +1 -0
  98. package/dist/src/tools-v2/test-tools.d.ts +59 -0
  99. package/dist/src/tools-v2/test-tools.d.ts.map +1 -0
  100. package/dist/src/tools-v2/test-tools.js +111 -0
  101. package/dist/src/tools-v2/test-tools.js.map +1 -0
  102. package/dist/src/tools-v2/workspace-context.d.ts +65 -0
  103. package/dist/src/tools-v2/workspace-context.d.ts.map +1 -0
  104. package/dist/src/tools-v2/workspace-context.js +336 -0
  105. package/dist/src/tools-v2/workspace-context.js.map +1 -0
  106. package/dist/src/ui/App.d.ts +9 -0
  107. package/dist/src/ui/App.d.ts.map +1 -0
  108. package/dist/src/ui/App.js +257 -0
  109. package/dist/src/ui/App.js.map +1 -0
  110. package/dist/src/ui/components/ChatPane.d.ts +12 -0
  111. package/dist/src/ui/components/ChatPane.d.ts.map +1 -0
  112. package/dist/src/ui/components/ChatPane.js +41 -0
  113. package/dist/src/ui/components/ChatPane.js.map +1 -0
  114. package/dist/src/ui/components/EventsPane.d.ts +12 -0
  115. package/dist/src/ui/components/EventsPane.d.ts.map +1 -0
  116. package/dist/src/ui/components/EventsPane.js +48 -0
  117. package/dist/src/ui/components/EventsPane.js.map +1 -0
  118. package/dist/src/ui/components/GoalsTasksPane.d.ts +18 -0
  119. package/dist/src/ui/components/GoalsTasksPane.d.ts.map +1 -0
  120. package/dist/src/ui/components/GoalsTasksPane.js +83 -0
  121. package/dist/src/ui/components/GoalsTasksPane.js.map +1 -0
  122. package/dist/src/ui/store.d.ts +74 -0
  123. package/dist/src/ui/store.d.ts.map +1 -0
  124. package/dist/src/ui/store.js +260 -0
  125. package/dist/src/ui/store.js.map +1 -0
  126. package/dist/tests/integration.test.d.ts +2 -0
  127. package/dist/tests/integration.test.d.ts.map +1 -0
  128. package/dist/tests/integration.test.js +415 -0
  129. package/dist/tests/integration.test.js.map +1 -0
  130. package/dist/tsconfig.tsbuildinfo +1 -0
  131. package/docs/AICODER.png +0 -0
  132. package/docs/INTERACTIVE_CLI_GUIDE.md +201 -0
  133. package/docs/TUI_MOCKUP.md +180 -0
  134. package/package.json +52 -0
  135. package/src/config/providers.ts +174 -0
  136. package/src/config/session.ts +143 -0
  137. package/src/context/bm25.ts +173 -0
  138. package/src/context/code-search.ts +188 -0
  139. package/src/context/context-pack.ts +133 -0
  140. package/src/context/dependency-mapper.ts +72 -0
  141. package/src/context/index.ts +8 -0
  142. package/src/context/symbol-extractor.ts +149 -0
  143. package/src/context/test-mapper.ts +77 -0
  144. package/src/context/types.ts +69 -0
  145. package/src/context/workspace-indexer.ts +249 -0
  146. package/src/index.ts +5 -0
  147. package/src/registries.ts +118 -0
  148. package/src/runtime/budget-manager.ts +118 -0
  149. package/src/runtime/interactive-runtime.ts +423 -0
  150. package/src/tasks-v2/analysis-tasks.ts +311 -0
  151. package/src/tasks-v2/developer-tasks.ts +437 -0
  152. package/src/tasks-v2/index.ts +3 -0
  153. package/src/tools-v2/edit-tools.ts +153 -0
  154. package/src/tools-v2/index.ts +6 -0
  155. package/src/tools-v2/read-tools.ts +286 -0
  156. package/src/tools-v2/search-tools.ts +175 -0
  157. package/src/tools-v2/test-tools.ts +147 -0
  158. package/src/tools-v2/workspace-context.ts +428 -0
  159. package/src/ui/App.tsx +392 -0
  160. package/src/ui/components/ChatPane.tsx +84 -0
  161. package/src/ui/components/EventsPane.tsx +81 -0
  162. package/src/ui/components/GoalsTasksPane.tsx +149 -0
  163. package/src/ui/store.ts +362 -0
  164. package/tests/integration.test.ts +537 -0
  165. package/tsconfig.json +22 -0
@@ -0,0 +1,415 @@
1
+ // Integration tests for ACM AI Coder (Phase 2)
2
+ import { FileReadToolV2, FileReadLinesTool, FileStatTool, CodeEditToolV2, DiffTool, AnalyzeWorkspaceTask, GenerateUnitTestsTask, SimpleCapabilityRegistry, SimpleToolRegistry, WorkspaceContextRetrievalTool, } from '../src/index.js';
3
+ import { MemoryLedger, executePlan } from '@ddse/acm-runtime';
4
+ import { Nucleus, Task, ExternalContextProviderAdapter, } from '@ddse/acm-sdk';
5
+ import * as fs from 'fs/promises';
6
+ import * as path from 'path';
7
+ console.log('Running ACM AI Coder Integration Tests (Phase 2)');
8
+ console.log('='.repeat(60));
9
+ const TEMP_ROOT = '/tmp/acm-aicoder-test';
10
+ async function cleanup() {
11
+ await fs.rm(TEMP_ROOT, { recursive: true, force: true });
12
+ }
13
+ class TestNucleus extends Nucleus {
14
+ scope;
15
+ constructor(config) {
16
+ super(config);
17
+ }
18
+ async preflight() {
19
+ return { status: 'OK' };
20
+ }
21
+ async invoke() {
22
+ return { toolCalls: [] };
23
+ }
24
+ async postcheck() {
25
+ return { status: 'COMPLETE' };
26
+ }
27
+ recordInference(promptDigest) {
28
+ return {
29
+ id: `test-nucleus-${Date.now()}`,
30
+ ts: Date.now(),
31
+ type: 'NUCLEUS_INFERENCE',
32
+ details: { promptDigest },
33
+ };
34
+ }
35
+ getInternalContext() {
36
+ return this.scope;
37
+ }
38
+ setInternalContext(scope) {
39
+ this.scope = scope;
40
+ }
41
+ }
42
+ const testNucleusFactory = config => new TestNucleus(config);
43
+ const nucleusConfig = {
44
+ llmCall: {
45
+ provider: 'test',
46
+ model: 'stub',
47
+ },
48
+ };
49
+ class ContextRequestNucleus extends Nucleus {
50
+ scope;
51
+ requested = false;
52
+ constructor(config) {
53
+ super(config);
54
+ }
55
+ async preflight() {
56
+ if (!this.requested) {
57
+ this.requested = true;
58
+ return {
59
+ status: 'NEEDS_CONTEXT',
60
+ retrievalDirectives: [
61
+ 'workspace.context:{"operations":[{"type":"search","query":"betaHelper","includeContext":true}]}'
62
+ ],
63
+ };
64
+ }
65
+ return { status: 'OK' };
66
+ }
67
+ async invoke() {
68
+ return { toolCalls: [] };
69
+ }
70
+ async postcheck() {
71
+ return { status: 'COMPLETE' };
72
+ }
73
+ recordInference(promptDigest) {
74
+ return {
75
+ id: `context-nucleus-${Date.now()}`,
76
+ ts: Date.now(),
77
+ type: 'NUCLEUS_INFERENCE',
78
+ details: { promptDigest },
79
+ };
80
+ }
81
+ getInternalContext() {
82
+ return this.scope;
83
+ }
84
+ setInternalContext(scope) {
85
+ this.scope = scope;
86
+ }
87
+ }
88
+ const contextRequestNucleusFactory = config => new ContextRequestNucleus(config);
89
+ class ContextRetrievalTask extends Task {
90
+ constructor() {
91
+ super('context-retrieval', 'context_noop');
92
+ }
93
+ async execute() {
94
+ return { acknowledged: true };
95
+ }
96
+ verification() {
97
+ return ['output.acknowledged === true'];
98
+ }
99
+ }
100
+ // Test 1: FileReadToolV2 + FileStatTool
101
+ async function testFileReadToolV2() {
102
+ console.log('Testing FileReadToolV2 and FileStatTool...');
103
+ const dir = path.join(TEMP_ROOT, 'read');
104
+ const filePath = path.join(dir, 'sample.ts');
105
+ await fs.mkdir(dir, { recursive: true });
106
+ await fs.writeFile(filePath, "export const hello = () => 'world';\n");
107
+ const statTool = new FileStatTool();
108
+ const stat = await statTool.call({ path: filePath });
109
+ if (!stat.exists || stat.size === 0) {
110
+ throw new Error('FileStatTool failed to report existing file');
111
+ }
112
+ const readTool = new FileReadToolV2();
113
+ const result = await readTool.call({ path: filePath });
114
+ if (!result.content.includes('hello = () =>')) {
115
+ throw new Error('FileReadToolV2 failed to read file content');
116
+ }
117
+ if (!result.eof) {
118
+ throw new Error('FileReadToolV2 should reach EOF for small file');
119
+ }
120
+ console.log('✅ FileReadToolV2 test passed');
121
+ }
122
+ // Test 2: CodeEditToolV2 writes content (with backup)
123
+ async function testCodeEditToolV2() {
124
+ console.log('Testing CodeEditToolV2...');
125
+ const dir = path.join(TEMP_ROOT, 'edit');
126
+ const filePath = path.join(dir, 'edit.ts');
127
+ await fs.mkdir(dir, { recursive: true });
128
+ await fs.writeFile(filePath, '// original\n');
129
+ const tool = new CodeEditToolV2();
130
+ const response = await tool.call({
131
+ path: filePath,
132
+ content: '// updated\nexport const value = 42;\n',
133
+ backup: true,
134
+ });
135
+ if (!response.success) {
136
+ throw new Error('CodeEditToolV2 did not report success');
137
+ }
138
+ const updated = await fs.readFile(filePath, 'utf-8');
139
+ if (!updated.includes('value = 42')) {
140
+ throw new Error('CodeEditToolV2 did not write expected content');
141
+ }
142
+ if (!response.backupPath) {
143
+ throw new Error('CodeEditToolV2 should create a backup when requested');
144
+ }
145
+ console.log('✅ CodeEditToolV2 test passed');
146
+ }
147
+ // Test 3: DiffTool generates a diff
148
+ async function testDiffTool() {
149
+ console.log('Testing DiffTool...');
150
+ const diffTool = new DiffTool();
151
+ const diff = await diffTool.call({
152
+ aContent: 'const a = 1;\n',
153
+ bContent: 'const a = 2;\n',
154
+ });
155
+ if (!diff.diff.includes('---') || !diff.diff.includes('+++')) {
156
+ throw new Error('DiffTool output missing headers');
157
+ }
158
+ console.log('✅ DiffTool test passed');
159
+ }
160
+ // Test 4: AnalyzeWorkspaceTask over small project
161
+ async function testAnalyzeWorkspaceTask() {
162
+ console.log('Testing AnalyzeWorkspaceTask...');
163
+ const workspace = path.join(TEMP_ROOT, 'workspace');
164
+ await fs.mkdir(workspace, { recursive: true });
165
+ await fs.writeFile(path.join(workspace, 'file1.ts'), 'export const foo = 1;\n');
166
+ await fs.writeFile(path.join(workspace, 'file2.ts'), '// TODO: implement\n');
167
+ const goal = {
168
+ id: 'goal-analyze',
169
+ intent: 'Analyze the workspace',
170
+ };
171
+ const context = {
172
+ id: 'ctx-analyze',
173
+ facts: { path: workspace },
174
+ version: '1.0',
175
+ };
176
+ const plan = {
177
+ id: 'plan-analyze',
178
+ contextRef: 'ref-analyze',
179
+ capabilityMapVersion: '1.0',
180
+ tasks: [
181
+ {
182
+ id: 't1',
183
+ capability: 'analyze_workspace',
184
+ input: { path: workspace },
185
+ },
186
+ ],
187
+ edges: [],
188
+ };
189
+ const capabilityRegistry = new SimpleCapabilityRegistry();
190
+ capabilityRegistry.register({ name: 'analyze_workspace', sideEffects: false }, new AnalyzeWorkspaceTask());
191
+ const toolRegistry = new SimpleToolRegistry();
192
+ const ledger = new MemoryLedger();
193
+ const result = await executePlan({
194
+ goal,
195
+ context,
196
+ plan,
197
+ capabilityRegistry,
198
+ toolRegistry,
199
+ ledger,
200
+ nucleusFactory: testNucleusFactory,
201
+ nucleusConfig,
202
+ });
203
+ const record = result.outputsByTask.t1;
204
+ const output = record?.output;
205
+ if (!output || output.totalFiles < 2) {
206
+ throw new Error('AnalyzeWorkspaceTask should report indexed files');
207
+ }
208
+ console.log('✅ AnalyzeWorkspaceTask test passed');
209
+ }
210
+ async function testWorkspaceContextTool() {
211
+ console.log('Testing WorkspaceContextRetrievalTool...');
212
+ const workspace = path.join(TEMP_ROOT, 'workspace-context-tool');
213
+ const sourceDir = path.join(workspace, 'src');
214
+ await fs.mkdir(sourceDir, { recursive: true });
215
+ await fs.writeFile(path.join(sourceDir, 'alpha.ts'), `export function alphaHelper() {\n return 'context';\n}\n`);
216
+ const tool = new WorkspaceContextRetrievalTool(workspace);
217
+ const artifacts = await tool.call({
218
+ directive: 'workspace.context',
219
+ operations: [
220
+ { type: 'search', query: 'alphaHelper', includeContext: true },
221
+ { type: 'grep', pattern: 'alphaHelper', maxResults: 10 },
222
+ { type: 'file', path: 'src/alpha.ts', startLine: 1, endLine: 3 },
223
+ ],
224
+ });
225
+ if (!artifacts || artifacts.length === 0) {
226
+ throw new Error('WorkspaceContextRetrievalTool should return artifacts');
227
+ }
228
+ const snippet = artifacts.find(a => a.type === 'workspace.snippet');
229
+ if (!snippet || !String(snippet.content?.snippet ?? '').includes('alphaHelper')) {
230
+ throw new Error('Expected workspace snippet for alphaHelper');
231
+ }
232
+ const match = artifacts.find(a => a.type === 'workspace.match');
233
+ if (!match) {
234
+ throw new Error('Expected workspace match artifact from grep operation');
235
+ }
236
+ const fileArtifact = artifacts.find(a => a.type === 'workspace.file');
237
+ if (!fileArtifact) {
238
+ throw new Error('Expected workspace file artifact for direct file request');
239
+ }
240
+ console.log('✅ WorkspaceContextRetrievalTool test passed');
241
+ }
242
+ // Test 5: GenerateUnitTestsTask writes scaffold
243
+ async function testGenerateUnitTestsTask() {
244
+ console.log('Testing GenerateUnitTestsTask...');
245
+ const workspace = path.join(TEMP_ROOT, 'unit-tests');
246
+ const sourceFile = path.join(workspace, 'src', 'thing.ts');
247
+ await fs.mkdir(path.dirname(sourceFile), { recursive: true });
248
+ await fs.writeFile(sourceFile, 'export function thing() { return 1; }\n');
249
+ const goal = {
250
+ id: 'goal-tests',
251
+ intent: 'Generate tests for thing',
252
+ };
253
+ const context = {
254
+ id: 'ctx-tests',
255
+ facts: { path: workspace },
256
+ version: '1.0',
257
+ };
258
+ const plan = {
259
+ id: 'plan-tests',
260
+ contextRef: 'ref-tests',
261
+ capabilityMapVersion: '1.0',
262
+ tasks: [
263
+ {
264
+ id: 't1',
265
+ capability: 'generate_unit_tests',
266
+ input: {
267
+ targetPath: sourceFile,
268
+ symbolName: 'thing',
269
+ },
270
+ },
271
+ ],
272
+ edges: [],
273
+ };
274
+ const capabilityRegistry = new SimpleCapabilityRegistry();
275
+ capabilityRegistry.register({ name: 'generate_unit_tests', sideEffects: true }, new GenerateUnitTestsTask());
276
+ const toolRegistry = new SimpleToolRegistry();
277
+ toolRegistry.register(new FileReadLinesTool());
278
+ toolRegistry.register(new CodeEditToolV2());
279
+ const ledger = new MemoryLedger();
280
+ const result = await executePlan({
281
+ goal,
282
+ context,
283
+ plan,
284
+ capabilityRegistry,
285
+ toolRegistry,
286
+ ledger,
287
+ nucleusFactory: testNucleusFactory,
288
+ nucleusConfig,
289
+ });
290
+ const record = result.outputsByTask.t1;
291
+ const output = record?.output;
292
+ if (!output || !output.implemented) {
293
+ throw new Error('GenerateUnitTestsTask should implement tests');
294
+ }
295
+ const generated = await fs.readFile(output.testPath, 'utf-8');
296
+ if (!generated.includes('describe')) {
297
+ throw new Error('Generated test file missing scaffold');
298
+ }
299
+ console.log('✅ GenerateUnitTestsTask test passed');
300
+ }
301
+ async function testContextProviderIntegration() {
302
+ console.log('Testing ExternalContextProviderAdapter with workspace context tool...');
303
+ const workspace = path.join(TEMP_ROOT, 'context-provider');
304
+ await fs.mkdir(workspace, { recursive: true });
305
+ await fs.writeFile(path.join(workspace, 'beta.ts'), `export const betaHelper = () => 42;\n`);
306
+ const goal = {
307
+ id: 'goal-context',
308
+ intent: 'Verify context retrieval',
309
+ };
310
+ const context = {
311
+ id: 'ctx-context',
312
+ facts: { path: workspace },
313
+ version: '1.0',
314
+ };
315
+ const plan = {
316
+ id: 'plan-context',
317
+ contextRef: 'ref-context',
318
+ capabilityMapVersion: '1.0',
319
+ tasks: [
320
+ {
321
+ id: 't1',
322
+ capability: 'context_noop',
323
+ input: {},
324
+ },
325
+ ],
326
+ edges: [],
327
+ };
328
+ const capabilityRegistry = new SimpleCapabilityRegistry();
329
+ capabilityRegistry.register({ name: 'context_noop', sideEffects: false }, new ContextRetrievalTask());
330
+ const toolRegistry = new SimpleToolRegistry();
331
+ const workspaceContextTool = new WorkspaceContextRetrievalTool(workspace);
332
+ toolRegistry.register(workspaceContextTool);
333
+ const contextProvider = new ExternalContextProviderAdapter();
334
+ contextProvider.register(workspaceContextTool, {
335
+ match: directive => directive.startsWith('workspace.context'),
336
+ buildInput: directive => {
337
+ const payload = directive.slice(directive.indexOf(':') + 1).trim();
338
+ let operations = [];
339
+ if (payload) {
340
+ try {
341
+ const parsed = JSON.parse(payload);
342
+ if (Array.isArray(parsed.operations)) {
343
+ operations = parsed.operations;
344
+ }
345
+ }
346
+ catch {
347
+ operations = [];
348
+ }
349
+ }
350
+ return {
351
+ directive,
352
+ operations,
353
+ };
354
+ },
355
+ autoPromote: true,
356
+ maxArtifacts: 16,
357
+ });
358
+ const ledger = new MemoryLedger();
359
+ const result = await executePlan({
360
+ goal,
361
+ context,
362
+ plan,
363
+ capabilityRegistry,
364
+ toolRegistry,
365
+ ledger,
366
+ nucleusFactory: contextRequestNucleusFactory,
367
+ nucleusConfig,
368
+ contextProvider,
369
+ });
370
+ const record = result.outputsByTask.t1;
371
+ const output = record?.output;
372
+ if (!output || output.acknowledged !== true) {
373
+ throw new Error('Context retrieval task did not complete successfully');
374
+ }
375
+ const contextEntries = ledger
376
+ .getEntries()
377
+ .filter(entry => entry.type === 'CONTEXT_INTERNALIZED');
378
+ if (contextEntries.length < 2) {
379
+ throw new Error('Context provider should emit requested and resolved ledger entries');
380
+ }
381
+ const statuses = contextEntries.map(entry => entry.details?.status);
382
+ if (!statuses.includes('requested') || !statuses.includes('resolved')) {
383
+ throw new Error('Context provider did not resolve retrieval directives');
384
+ }
385
+ console.log('✅ ExternalContextProviderAdapter integration test passed');
386
+ }
387
+ // Run all tests sequentially
388
+ async function runTests() {
389
+ try {
390
+ await cleanup();
391
+ await testFileReadToolV2();
392
+ await testCodeEditToolV2();
393
+ await testDiffTool();
394
+ await testAnalyzeWorkspaceTask();
395
+ await testWorkspaceContextTool();
396
+ await testGenerateUnitTestsTask();
397
+ await testContextProviderIntegration();
398
+ console.log('='.repeat(60));
399
+ console.log('Results: All tests passed! ✅');
400
+ }
401
+ catch (error) {
402
+ console.log('='.repeat(60));
403
+ console.log('Results: Test failed ❌');
404
+ console.error(error?.message ?? error);
405
+ if (error?.stack) {
406
+ console.error(error.stack);
407
+ }
408
+ process.exit(1);
409
+ }
410
+ finally {
411
+ await cleanup();
412
+ }
413
+ }
414
+ runTests();
415
+ //# sourceMappingURL=integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../../tests/integration.test.ts"],"names":[],"mappings":"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"}