phantomx-tool-client 1.0.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 (34) hide show
  1. package/bin/tool-server.js +16 -0
  2. package/dist/Services/EditTool.d.ts +86 -0
  3. package/dist/Services/EditTool.d.ts.map +1 -0
  4. package/dist/Services/EditTool.js +516 -0
  5. package/dist/Services/EditTool.js.map +1 -0
  6. package/dist/Services/Logger.d.ts +32 -0
  7. package/dist/Services/Logger.d.ts.map +1 -0
  8. package/dist/Services/Logger.js +185 -0
  9. package/dist/Services/Logger.js.map +1 -0
  10. package/dist/Services/ReadFileTool.d.ts +49 -0
  11. package/dist/Services/ReadFileTool.d.ts.map +1 -0
  12. package/dist/Services/ReadFileTool.js +239 -0
  13. package/dist/Services/ReadFileTool.js.map +1 -0
  14. package/dist/__tests__/__mocks__/tool-server.mock.d.ts +4 -0
  15. package/dist/__tests__/__mocks__/tool-server.mock.d.ts.map +1 -0
  16. package/dist/__tests__/__mocks__/tool-server.mock.js +8 -0
  17. package/dist/__tests__/__mocks__/tool-server.mock.js.map +1 -0
  18. package/dist/__tests__/toolExecutionService_tempAI.test.d.ts +13 -0
  19. package/dist/__tests__/toolExecutionService_tempAI.test.d.ts.map +1 -0
  20. package/dist/__tests__/toolExecutionService_tempAI.test.js +491 -0
  21. package/dist/__tests__/toolExecutionService_tempAI.test.js.map +1 -0
  22. package/dist/githubOperationsHanlder.d.ts +274 -0
  23. package/dist/githubOperationsHanlder.d.ts.map +1 -0
  24. package/dist/githubOperationsHanlder.js +1487 -0
  25. package/dist/githubOperationsHanlder.js.map +1 -0
  26. package/dist/tool-server.d.ts +4 -0
  27. package/dist/tool-server.d.ts.map +1 -0
  28. package/dist/tool-server.js +190 -0
  29. package/dist/tool-server.js.map +1 -0
  30. package/dist/toolExecutionService.d.ts +28 -0
  31. package/dist/toolExecutionService.d.ts.map +1 -0
  32. package/dist/toolExecutionService.js +464 -0
  33. package/dist/toolExecutionService.js.map +1 -0
  34. package/package.json +58 -0
@@ -0,0 +1,491 @@
1
+ "use strict";
2
+ /**
3
+ * Test suite for executeSelfHostedTool in toolExecutionService.ts
4
+ *
5
+ * Strategy:
6
+ * - All tests inject a fully-mocked SelfHostedContext via the second argument
7
+ * of executeSelfHostedTool so no real file-system, bash, docker or GitHub
8
+ * calls are made.
9
+ * - GithubOperationsService is jest-mocked at the module level.
10
+ * - A few integration-style tests for executeCommand / executeHostCommand use
11
+ * real bash (available on Windows via WSL2).
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ const toolExecutionService_1 = require("../toolExecutionService");
15
+ // ─── Mock GithubOperationsService ────────────────────────────────────────────
16
+ jest.mock('../githubOperationsHanlder', () => {
17
+ return {
18
+ GithubOperationsService: jest.fn().mockImplementation(() => ({
19
+ getRepositoryList: jest.fn().mockResolvedValue({ repositories: ['repo1', 'repo2'], count: 2 }),
20
+ pullRepository: jest.fn().mockResolvedValue({ repoName: 'repo1', branchName: 'main', lastCommit: 'abc123', mergeConflicts: [] }),
21
+ pushRepository: jest.fn().mockResolvedValue({ success: true }),
22
+ checkRepositoryStatus: jest.fn().mockResolvedValue({ status: 'clean' }),
23
+ getRepositoryHistory: jest.fn().mockResolvedValue({ commits: [] }),
24
+ commitLocalChanges: jest.fn().mockResolvedValue({ commitHash: 'def456' }),
25
+ createPullRequest: jest.fn().mockResolvedValue({ prUrl: 'https://github.com/pr/1' }),
26
+ checkPullRequestExists: jest.fn().mockResolvedValue({ exists: false }),
27
+ getCommitDetails: jest.fn().mockResolvedValue({ hash: 'abc123', message: 'init' }),
28
+ getCommitList: jest.fn().mockResolvedValue({ commits: [] }),
29
+ getLatestCommitDiff: jest.fn().mockResolvedValue({ diff: '' }),
30
+ getCommitDiffByHash: jest.fn().mockResolvedValue({ diff: '' }),
31
+ mergeBranchIntoBranch: jest.fn().mockResolvedValue({ success: true }),
32
+ })),
33
+ };
34
+ });
35
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
36
+ /** Build a minimal valid payload */
37
+ const makePayload = (toolName, input = {}) => ({
38
+ id: 'test-agent-id',
39
+ toolCall: { id: 'tc-1', name: toolName, input },
40
+ });
41
+ /** A context where every method is a jest.fn() returning a preset value */
42
+ const makeMockContext = (overrides = {}) => ({
43
+ executeCommand: jest.fn().mockResolvedValue({ success: true, output: 'ok', error: '', code: 0 }),
44
+ executeHostCommand: jest.fn().mockResolvedValue({ success: true, output: 'host-ok', error: '', code: 0 }),
45
+ startBackgroundProcess: jest.fn().mockResolvedValue({ success: true, processId: 1, status: 'running', pid: 1234 }),
46
+ listBackgroundProcesses: jest.fn().mockReturnValue([{ id: 1, name: 'proc-1', status: 'running' }]),
47
+ getBackgroundProcessLogs: jest.fn().mockResolvedValue({ success: true, processId: 1, status: 'running', output: 'log line' }),
48
+ terminateBackgroundProcess: jest.fn().mockResolvedValue({ success: true, processId: 1, status: 'terminated' }),
49
+ startDockerContainer: jest.fn().mockResolvedValue({ success: true, output: 'started', error: '', command: 'docker compose up' }),
50
+ getDockerContainerStatus: jest.fn().mockResolvedValue('CONTAINER_ID my-app Up 2 minutes 0.0.0.0:3000->3000/tcp'),
51
+ basePath: process.cwd(),
52
+ contextKey: 'test-agent-id',
53
+ ...overrides,
54
+ });
55
+ // ═══════════════════════════════════════════════════════════════════════════════
56
+ // 1. PAYLOAD VALIDATION
57
+ // ═══════════════════════════════════════════════════════════════════════════════
58
+ describe('Payload validation', () => {
59
+ test('returns error when toolCall name is missing', async () => {
60
+ const payload = { id: 'agent-1', toolCall: { input: {} } };
61
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(payload, makeMockContext());
62
+ expect(result.success).toBe(false);
63
+ expect(result.error).toMatch(/missing tool name/i);
64
+ });
65
+ test('returns error when toolCall name is empty string', async () => {
66
+ const payload = { id: 'agent-1', toolCall: { name: '', input: {} } };
67
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(payload, makeMockContext());
68
+ expect(result.success).toBe(false);
69
+ expect(result.error).toMatch(/missing tool name/i);
70
+ });
71
+ test('returns error for unsupported tool name', async () => {
72
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('NonExistentTool'), makeMockContext());
73
+ expect(result.success).toBe(false);
74
+ expect(result.error).toMatch(/unsupported tool/i);
75
+ });
76
+ test('returns error for tavily tool (server-side only)', async () => {
77
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('tavily_search'), makeMockContext());
78
+ expect(result.success).toBe(false);
79
+ expect(result.error).toMatch(/server-side/i);
80
+ });
81
+ test('uses "default" context key when payload id is empty', async () => {
82
+ const payload = { id: '', toolCall: { name: 'ListBackgroundProcesses', input: {} } };
83
+ const ctx = makeMockContext();
84
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(payload, ctx);
85
+ expect(result.success).toBe(true);
86
+ });
87
+ });
88
+ // ═══════════════════════════════════════════════════════════════════════════════
89
+ // 2. Execute_commmand
90
+ // ═══════════════════════════════════════════════════════════════════════════════
91
+ describe('Execute_commmand', () => {
92
+ test('calls executeCommand with the given command and returns result', async () => {
93
+ const ctx = makeMockContext();
94
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Execute_commmand', { command: 'echo hello' }), ctx);
95
+ expect(result.success).toBe(true);
96
+ expect(ctx.executeCommand).toHaveBeenCalledWith('echo hello');
97
+ expect(result.result.output).toBe('ok');
98
+ });
99
+ test('does NOT call executeCommand when command input is missing', async () => {
100
+ const ctx = makeMockContext();
101
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Execute_commmand', {}), ctx);
102
+ // Falls through to unsupported tool branch
103
+ expect(ctx.executeCommand).not.toHaveBeenCalled();
104
+ expect(result.success).toBe(false);
105
+ });
106
+ test('propagates executeCommand failure result', async () => {
107
+ const ctx = makeMockContext({
108
+ executeCommand: jest.fn().mockResolvedValue({ success: false, output: '', error: 'permission denied', code: 1 }),
109
+ });
110
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Execute_commmand', { command: 'cat /etc/shadow' }), ctx);
111
+ expect(result.success).toBe(true); // outer wrapper succeeds
112
+ expect(result.result.success).toBe(false); // inner result carries the failure
113
+ expect(result.result.error).toBe('permission denied');
114
+ });
115
+ test('returns error when executeCommand throws', async () => {
116
+ const ctx = makeMockContext({
117
+ executeCommand: jest.fn().mockRejectedValue(new Error('spawn failed')),
118
+ });
119
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Execute_commmand', { command: 'bad' }), ctx);
120
+ expect(result.success).toBe(false);
121
+ expect(result.error).toBe('spawn failed');
122
+ });
123
+ });
124
+ // ═══════════════════════════════════════════════════════════════════════════════
125
+ // 3. Execute_commmand_host_machine
126
+ // ═══════════════════════════════════════════════════════════════════════════════
127
+ describe('Execute_commmand_host_machine', () => {
128
+ test('calls executeHostCommand with the given command', async () => {
129
+ const ctx = makeMockContext();
130
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Execute_commmand_host_machine', { command: 'whoami' }), ctx);
131
+ expect(result.success).toBe(true);
132
+ expect(ctx.executeHostCommand).toHaveBeenCalledWith('whoami');
133
+ expect(result.result.output).toBe('host-ok');
134
+ });
135
+ test('does NOT call executeHostCommand when command input is missing', async () => {
136
+ const ctx = makeMockContext();
137
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Execute_commmand_host_machine', {}), ctx);
138
+ expect(ctx.executeHostCommand).not.toHaveBeenCalled();
139
+ expect(result.success).toBe(false);
140
+ });
141
+ });
142
+ // ═══════════════════════════════════════════════════════════════════════════════
143
+ // 4. StartBackgroundProcess
144
+ // ═══════════════════════════════════════════════════════════════════════════════
145
+ describe('StartBackgroundProcess', () => {
146
+ test('starts a process and returns processId + status', async () => {
147
+ const ctx = makeMockContext();
148
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('StartBackgroundProcess', { command: 'sleep 60', processName: 'sleeper', workingDirectory: '/tmp' }), ctx);
149
+ expect(result.success).toBe(true);
150
+ expect(ctx.startBackgroundProcess).toHaveBeenCalledWith('sleep 60', 'sleeper', '/tmp');
151
+ expect(result.result.processId).toBe(1);
152
+ expect(result.result.status).toBe('running');
153
+ });
154
+ test('works with only command (no processName / workingDirectory)', async () => {
155
+ const ctx = makeMockContext();
156
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('StartBackgroundProcess', { command: 'node server.js' }), ctx);
157
+ expect(result.success).toBe(true);
158
+ expect(ctx.startBackgroundProcess).toHaveBeenCalledWith('node server.js', undefined, undefined);
159
+ });
160
+ test('returns error when startBackgroundProcess throws', async () => {
161
+ const ctx = makeMockContext({
162
+ startBackgroundProcess: jest.fn().mockRejectedValue(new Error('fork failed')),
163
+ });
164
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('StartBackgroundProcess', { command: 'bad' }), ctx);
165
+ expect(result.success).toBe(false);
166
+ expect(result.error).toBe('fork failed');
167
+ });
168
+ });
169
+ // ═══════════════════════════════════════════════════════════════════════════════
170
+ // 5. ListBackgroundProcesses
171
+ // ═══════════════════════════════════════════════════════════════════════════════
172
+ describe('ListBackgroundProcesses', () => {
173
+ test('returns list from context', async () => {
174
+ const ctx = makeMockContext();
175
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('ListBackgroundProcesses'), ctx);
176
+ expect(result.success).toBe(true);
177
+ expect(ctx.listBackgroundProcesses).toHaveBeenCalled();
178
+ expect(Array.isArray(result.result)).toBe(true);
179
+ expect(result.result[0].id).toBe(1);
180
+ });
181
+ test('returns empty array when no processes are running', async () => {
182
+ const ctx = makeMockContext({ listBackgroundProcesses: jest.fn().mockReturnValue([]) });
183
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('ListBackgroundProcesses'), ctx);
184
+ expect(result.success).toBe(true);
185
+ expect(result.result).toEqual([]);
186
+ });
187
+ });
188
+ // ═══════════════════════════════════════════════════════════════════════════════
189
+ // 6. GetBackgroundProcessLogs
190
+ // ═══════════════════════════════════════════════════════════════════════════════
191
+ describe('GetBackgroundProcessLogs', () => {
192
+ test('returns logs for a valid processId', async () => {
193
+ const ctx = makeMockContext();
194
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('GetBackgroundProcessLogs', { processId: 1, maxLines: 50, tailMode: true }), ctx);
195
+ expect(result.success).toBe(true);
196
+ expect(ctx.getBackgroundProcessLogs).toHaveBeenCalledWith(1, 50, true);
197
+ expect(result.result.output).toBe('log line');
198
+ });
199
+ test('returns error for unknown processId', async () => {
200
+ const ctx = makeMockContext({
201
+ getBackgroundProcessLogs: jest.fn().mockResolvedValue({ success: false, error: 'Background process 99 not found' }),
202
+ });
203
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('GetBackgroundProcessLogs', { processId: 99 }), ctx);
204
+ expect(result.success).toBe(true); // outer success
205
+ expect(result.result.success).toBe(false); // inner failure
206
+ expect(result.result.error).toMatch(/99 not found/);
207
+ });
208
+ test('works with default maxLines and tailMode (undefined)', async () => {
209
+ const ctx = makeMockContext();
210
+ await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('GetBackgroundProcessLogs', { processId: 1 }), ctx);
211
+ expect(ctx.getBackgroundProcessLogs).toHaveBeenCalledWith(1, undefined, undefined);
212
+ });
213
+ });
214
+ // ═══════════════════════════════════════════════════════════════════════════════
215
+ // 7. TerminateBackgroundProcess
216
+ // ═══════════════════════════════════════════════════════════════════════════════
217
+ describe('TerminateBackgroundProcess', () => {
218
+ test('terminates a running process successfully', async () => {
219
+ const ctx = makeMockContext();
220
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('TerminateBackgroundProcess', { processId: 1 }), ctx);
221
+ expect(result.success).toBe(true);
222
+ expect(ctx.terminateBackgroundProcess).toHaveBeenCalledWith(1);
223
+ expect(result.result.status).toBe('terminated');
224
+ });
225
+ test('returns error for unknown processId', async () => {
226
+ const ctx = makeMockContext({
227
+ terminateBackgroundProcess: jest.fn().mockResolvedValue({ success: false, error: 'Background process 99 not found' }),
228
+ });
229
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('TerminateBackgroundProcess', { processId: 99 }), ctx);
230
+ expect(result.success).toBe(true);
231
+ expect(result.result.success).toBe(false);
232
+ expect(result.result.error).toMatch(/99 not found/);
233
+ });
234
+ });
235
+ // ═══════════════════════════════════════════════════════════════════════════════
236
+ // 8. StartDockerContainer
237
+ // ═══════════════════════════════════════════════════════════════════════════════
238
+ describe('StartDockerContainer', () => {
239
+ test('calls startDockerContainer with full input and returns success', async () => {
240
+ const ctx = makeMockContext();
241
+ const input = {
242
+ composeFilePath: './docker-compose.yml',
243
+ detached: true,
244
+ buildImages: false,
245
+ forceRecreate: false,
246
+ serviceNames: ['web'],
247
+ environment: { NODE_ENV: 'production' },
248
+ };
249
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('StartDockerContainer', input), ctx);
250
+ expect(result.success).toBe(true);
251
+ expect(ctx.startDockerContainer).toHaveBeenCalledWith(input);
252
+ expect(result.result.success).toBe(true);
253
+ });
254
+ test('returns failure when compose file not found (mocked)', async () => {
255
+ const ctx = makeMockContext({
256
+ startDockerContainer: jest.fn().mockResolvedValue({ success: false, output: '', error: 'Docker Compose file not found at path: /bad/path', command: '' }),
257
+ });
258
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('StartDockerContainer', { composeFilePath: '/bad/path' }), ctx);
259
+ expect(result.success).toBe(true);
260
+ expect(result.result.success).toBe(false);
261
+ expect(result.result.error).toMatch(/not found/i);
262
+ });
263
+ test('returns error when startDockerContainer throws', async () => {
264
+ const ctx = makeMockContext({
265
+ startDockerContainer: jest.fn().mockRejectedValue(new Error('docker daemon not running')),
266
+ });
267
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('StartDockerContainer', { composeFilePath: './docker-compose.yml' }), ctx);
268
+ expect(result.success).toBe(false);
269
+ expect(result.error).toBe('docker daemon not running');
270
+ });
271
+ });
272
+ // ═══════════════════════════════════════════════════════════════════════════════
273
+ // 9. GetDockerContainerStatus
274
+ // ═══════════════════════════════════════════════════════════════════════════════
275
+ describe('GetDockerContainerStatus', () => {
276
+ test('returns table-format status by default', async () => {
277
+ const ctx = makeMockContext();
278
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('GetDockerContainerStatus', {}), ctx);
279
+ expect(result.success).toBe(true);
280
+ expect(ctx.getDockerContainerStatus).toHaveBeenCalledWith({});
281
+ expect(typeof result.result).toBe('string');
282
+ expect(result.result).toContain('my-app');
283
+ });
284
+ test('passes containerIds filter correctly', async () => {
285
+ const ctx = makeMockContext();
286
+ const input = { containerIds: ['abc123'], format: 'json' };
287
+ await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('GetDockerContainerStatus', input), ctx);
288
+ expect(ctx.getDockerContainerStatus).toHaveBeenCalledWith(input);
289
+ });
290
+ test('returns error when getDockerContainerStatus throws', async () => {
291
+ const ctx = makeMockContext({
292
+ getDockerContainerStatus: jest.fn().mockRejectedValue(new Error('docker not found')),
293
+ });
294
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('GetDockerContainerStatus', {}), ctx);
295
+ expect(result.success).toBe(false);
296
+ expect(result.error).toBe('docker not found');
297
+ });
298
+ });
299
+ // ═══════════════════════════════════════════════════════════════════════════════
300
+ // 10. GitHub Tools
301
+ // ═══════════════════════════════════════════════════════════════════════════════
302
+ describe('GitHub tools', () => {
303
+ test('Github_GetRepositoryList returns repositories', async () => {
304
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Github_GetRepositoryList'), makeMockContext());
305
+ expect(result.success).toBe(true);
306
+ expect(result.result.repositories).toEqual(['repo1', 'repo2']);
307
+ expect(result.result.count).toBe(2);
308
+ });
309
+ test('Github_PullRepository calls pullRepository with repoName', async () => {
310
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Github_PullRepository', { repoName: 'my-repo' }), makeMockContext());
311
+ expect(result.success).toBe(true);
312
+ expect(result.result.repoName).toBe('repo1');
313
+ });
314
+ test('Github_PushRepository calls pushRepository', async () => {
315
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Github_PushRepository', { repoName: 'my-repo' }), makeMockContext());
316
+ expect(result.success).toBe(true);
317
+ expect(result.result.success).toBe(true);
318
+ });
319
+ test('Github_CheckRepositoryStatus calls checkRepositoryStatus', async () => {
320
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Github_CheckRepositoryStatus', { repoName: 'my-repo' }), makeMockContext());
321
+ expect(result.success).toBe(true);
322
+ expect(result.result.status).toBe('clean');
323
+ });
324
+ test('Github_GetRepositoryHistory uses default branch and maxCommits', async () => {
325
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Github_GetRepositoryHistory', { repoName: 'my-repo' }), makeMockContext());
326
+ expect(result.success).toBe(true);
327
+ expect(result.result.commits).toEqual([]);
328
+ });
329
+ test('Github_GetRepositoryHistory respects provided branch and maxCommits', async () => {
330
+ const ctx = makeMockContext();
331
+ await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Github_GetRepositoryHistory', { repoName: 'my-repo', branch: 'dev', maxCommits: 5 }), ctx);
332
+ const { GithubOperationsService } = require('../githubOperationsHanlder');
333
+ const instance = GithubOperationsService.mock.results[0].value;
334
+ expect(instance.getRepositoryHistory).toHaveBeenCalledWith('my-repo', 'dev', 5);
335
+ });
336
+ test('Github_CommitLocalChanges calls commitLocalChanges', async () => {
337
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Github_CommitLocalChanges', { repoName: 'my-repo', commitMessage: 'fix: bug', remoteBranchName: 'main' }), makeMockContext());
338
+ expect(result.success).toBe(true);
339
+ expect(result.result.commitHash).toBe('def456');
340
+ });
341
+ test('Github_CommitLocalChanges uses default remoteBranchName "main"', async () => {
342
+ const ctx = makeMockContext();
343
+ await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Github_CommitLocalChanges', { repoName: 'my-repo', commitMessage: 'fix: bug' }), ctx);
344
+ const { GithubOperationsService } = require('../githubOperationsHanlder');
345
+ const instance = GithubOperationsService.mock.results[0].value;
346
+ expect(instance.commitLocalChanges).toHaveBeenCalledWith('my-repo', 'main', 'fix: bug', {}, undefined);
347
+ });
348
+ test('Github_CreatePullRequest calls createPullRequest', async () => {
349
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Github_CreatePullRequest', { repoName: 'my-repo', targetBranch: 'main', title: 'My PR', body: 'desc' }), makeMockContext());
350
+ expect(result.success).toBe(true);
351
+ expect(result.result.prUrl).toBe('https://github.com/pr/1');
352
+ });
353
+ test('Github_CheckPullRequestExists calls checkPullRequestExists', async () => {
354
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Github_CheckPullRequestExists', { repoName: 'my-repo', targetBranch: 'main' }), makeMockContext());
355
+ expect(result.success).toBe(true);
356
+ expect(result.result.exists).toBe(false);
357
+ });
358
+ test('Github_GetCommitDetails calls getCommitDetails', async () => {
359
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Github_GetCommitDetails', { repoName: 'my-repo', commitHash: 'abc123' }), makeMockContext());
360
+ expect(result.success).toBe(true);
361
+ expect(result.result.hash).toBe('abc123');
362
+ });
363
+ test('Github_GetCommitList uses default maxCommits of 100', async () => {
364
+ const ctx = makeMockContext();
365
+ await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Github_GetCommitList', { repoName: 'my-repo', branch: 'main' }), ctx);
366
+ const { GithubOperationsService } = require('../githubOperationsHanlder');
367
+ const instance = GithubOperationsService.mock.results[0].value;
368
+ expect(instance.getCommitList).toHaveBeenCalledWith('my-repo', 'main', 100);
369
+ });
370
+ test('Github_GetLatestCommitDiff calls getLatestCommitDiff', async () => {
371
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Github_GetLatestCommitDiff', { repoName: 'my-repo', branch: 'main' }), makeMockContext());
372
+ expect(result.success).toBe(true);
373
+ expect(result.result.diff).toBe('');
374
+ });
375
+ test('Github_GetCommitDiffByHash calls getCommitDiffByHash', async () => {
376
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Github_GetCommitDiffByHash', { repoName: 'my-repo', commitHash: 'abc123' }), makeMockContext());
377
+ expect(result.success).toBe(true);
378
+ });
379
+ test('Github_MergeBranchIntoBranch calls mergeBranchIntoBranch', async () => {
380
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Github_MergeBranchIntoBranch', { repoName: 'my-repo', sourceBranch: 'feature', targetBranch: 'main', pushToRemote: true }), makeMockContext());
381
+ expect(result.success).toBe(true);
382
+ expect(result.result.success).toBe(true);
383
+ });
384
+ test('Github_MergeBranchIntoBranch defaults pushToRemote to false', async () => {
385
+ const ctx = makeMockContext();
386
+ await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Github_MergeBranchIntoBranch', { repoName: 'my-repo', sourceBranch: 'feature', targetBranch: 'main' }), ctx);
387
+ const { GithubOperationsService } = require('../githubOperationsHanlder');
388
+ const instance = GithubOperationsService.mock.results[0].value;
389
+ expect(instance.mergeBranchIntoBranch).toHaveBeenCalledWith('my-repo', 'feature', 'main', false, undefined);
390
+ });
391
+ test('GitHub tool propagates thrown error correctly', async () => {
392
+ const { GithubOperationsService } = require('../githubOperationsHanlder');
393
+ const instance = GithubOperationsService.mock.results[0].value;
394
+ instance.getRepositoryList.mockRejectedValueOnce(new Error('GitHub API rate limit'));
395
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Github_GetRepositoryList'), makeMockContext());
396
+ expect(result.success).toBe(false);
397
+ expect(result.error).toBe('GitHub API rate limit');
398
+ });
399
+ });
400
+ // ═══════════════════════════════════════════════════════════════════════════════
401
+ // 11. Context persistence
402
+ // ═══════════════════════════════════════════════════════════════════════════════
403
+ describe('Context persistence', () => {
404
+ test('same contextKey reuses the same context across calls (no injected context)', async () => {
405
+ var _a;
406
+ // First call — starts a background process to populate the context store
407
+ const payload1 = makePayload('StartBackgroundProcess', { command: 'sleep 5', processName: 'persistenceTest' });
408
+ const r1 = await (0, toolExecutionService_1.executeSelfHostedTool)(payload1);
409
+ expect(r1.success).toBe(true);
410
+ const pid = (_a = r1.result) === null || _a === void 0 ? void 0 : _a.processId;
411
+ // Second call — list processes; must see the process started above
412
+ const payload2 = makePayload('ListBackgroundProcesses');
413
+ const r2 = await (0, toolExecutionService_1.executeSelfHostedTool)(payload2);
414
+ expect(r2.success).toBe(true);
415
+ const found = r2.result.some((p) => p.id === pid);
416
+ expect(found).toBe(true);
417
+ });
418
+ test('different contextKeys get isolated contexts', async () => {
419
+ var _a;
420
+ const payloadA = { id: 'agent-A', toolCall: { name: 'StartBackgroundProcess', input: { command: 'sleep 10', processName: 'procA' } } };
421
+ const payloadB = { id: 'agent-B', toolCall: { name: 'ListBackgroundProcesses', input: {} } };
422
+ await (0, toolExecutionService_1.executeSelfHostedTool)(payloadA);
423
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(payloadB);
424
+ // agent-B's context should NOT see agent-A's process
425
+ const procA = (_a = result.result) === null || _a === void 0 ? void 0 : _a.find((p) => p.name === 'procA');
426
+ expect(procA).toBeUndefined();
427
+ });
428
+ });
429
+ // ═══════════════════════════════════════════════════════════════════════════════
430
+ // 12. Integration — real bash via WSL2 (Execute_commmand)
431
+ // ═══════════════════════════════════════════════════════════════════════════════
432
+ describe('Integration: real bash execution (WSL2)', () => {
433
+ test('executes echo and returns correct output', async () => {
434
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Execute_commmand', { command: 'echo hello-world' }));
435
+ expect(result.success).toBe(true);
436
+ expect(result.result.output.trim()).toBe('hello-world');
437
+ expect(result.result.code).toBe(0);
438
+ });
439
+ test('captures stderr and non-zero exit code on failure', async () => {
440
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Execute_commmand', { command: 'ls /this-path-does-not-exist-xyz' }));
441
+ expect(result.success).toBe(true); // outer wrapper succeeds
442
+ expect(result.result.success).toBe(false); // command itself failed
443
+ expect(result.result.code).not.toBe(0);
444
+ expect(result.result.error.length).toBeGreaterThan(0);
445
+ });
446
+ test('executes multi-line pipeline command', async () => {
447
+ const result = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('Execute_commmand', { command: 'echo -e "a\\nb\\nc" | wc -l' }));
448
+ expect(result.success).toBe(true);
449
+ expect(result.result.output.trim()).toBe('3');
450
+ });
451
+ test('real StartBackgroundProcess starts and is visible in ListBackgroundProcesses', async () => {
452
+ const start = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('StartBackgroundProcess', { command: 'sleep 30', processName: 'integration-sleep' }));
453
+ expect(start.success).toBe(true);
454
+ const pid = start.result.processId;
455
+ const list = await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('ListBackgroundProcesses'));
456
+ expect(list.success).toBe(true);
457
+ const found = list.result.find((p) => p.id === pid);
458
+ expect(found).toBeDefined();
459
+ expect(found.name).toBe('integration-sleep');
460
+ // clean up
461
+ await (0, toolExecutionService_1.executeSelfHostedTool)(makePayload('TerminateBackgroundProcess', { processId: pid }));
462
+ });
463
+ test('GetBackgroundProcessLogs returns success and correct structure for a known process', async () => {
464
+ // Note: detached processes spawned inside Jest+WSL2 do not reliably deliver stdout
465
+ // data events back to the parent (unref() severs the event-loop tie).
466
+ // This test verifies the API contract (success, processId, status fields) and
467
+ // that unknown processId returns a proper error — output content is covered by
468
+ // the unit tests above which use a fully mocked context.
469
+ const agentId = 'integration-log-test-agent';
470
+ const startPayload = { id: agentId, toolCall: { name: 'StartBackgroundProcess', input: { command: 'echo log-output-test' } } };
471
+ const start = await (0, toolExecutionService_1.executeSelfHostedTool)(startPayload);
472
+ expect(start.success).toBe(true);
473
+ const pid = start.result.processId;
474
+ // wait for process to finish
475
+ await new Promise(r => setTimeout(r, 400));
476
+ const logsPayload = { id: agentId, toolCall: { name: 'GetBackgroundProcessLogs', input: { processId: pid, maxLines: 10, tailMode: true } } };
477
+ const logs = await (0, toolExecutionService_1.executeSelfHostedTool)(logsPayload);
478
+ // API contract assertions
479
+ expect(logs.success).toBe(true);
480
+ expect(logs.result).toHaveProperty('processId', pid);
481
+ expect(logs.result).toHaveProperty('status');
482
+ expect(logs.result).toHaveProperty('output');
483
+ expect(['running', 'exited', 'failed']).toContain(logs.result.status);
484
+ // unknown processId must return a structured error
485
+ const badLogs = await (0, toolExecutionService_1.executeSelfHostedTool)({ id: agentId, toolCall: { name: 'GetBackgroundProcessLogs', input: { processId: 99999 } } });
486
+ expect(badLogs.success).toBe(true);
487
+ expect(badLogs.result.success).toBe(false);
488
+ expect(badLogs.result.error).toMatch(/99999/);
489
+ });
490
+ });
491
+ //# sourceMappingURL=toolExecutionService_tempAI.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolExecutionService_tempAI.test.js","sourceRoot":"","sources":["../../src/__tests__/toolExecutionService_tempAI.test.ts"],"names":[],"mappings":"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"}