@execufunction/mcp-server 0.2.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.
- package/README.md +182 -0
- package/dist/exfClient.d.ts +565 -0
- package/dist/exfClient.d.ts.map +1 -0
- package/dist/exfClient.js +595 -0
- package/dist/exfClient.js.map +1 -0
- package/dist/gitService.d.ts +121 -0
- package/dist/gitService.d.ts.map +1 -0
- package/dist/gitService.js +451 -0
- package/dist/gitService.js.map +1 -0
- package/dist/incrementalIndexer.d.ts +42 -0
- package/dist/incrementalIndexer.d.ts.map +1 -0
- package/dist/incrementalIndexer.js +445 -0
- package/dist/incrementalIndexer.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1868 -0
- package/dist/index.js.map +1 -0
- package/dist/localIndexer.d.ts +33 -0
- package/dist/localIndexer.d.ts.map +1 -0
- package/dist/localIndexer.js +323 -0
- package/dist/localIndexer.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,595 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ExecuFunction API Client
|
|
4
|
+
*
|
|
5
|
+
* HTTP client for communicating with the ExecuFunction API.
|
|
6
|
+
* Uses PAT (Personal Access Token) for authentication.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.ExfClient = void 0;
|
|
10
|
+
exports.generateIdempotencyKey = generateIdempotencyKey;
|
|
11
|
+
exports.createClientFromEnv = createClientFromEnv;
|
|
12
|
+
const crypto_1 = require("crypto");
|
|
13
|
+
const fs_1 = require("fs");
|
|
14
|
+
const path_1 = require("path");
|
|
15
|
+
/**
|
|
16
|
+
* Generate a unique idempotency key for task mutations.
|
|
17
|
+
* Format: {prefix}-{timestamp}-{uuid} for traceability.
|
|
18
|
+
*/
|
|
19
|
+
function generateIdempotencyKey(prefix = 'mcp') {
|
|
20
|
+
return `${prefix}-${Date.now()}-${(0, crypto_1.randomUUID)()}`;
|
|
21
|
+
}
|
|
22
|
+
class ExfClient {
|
|
23
|
+
apiUrl;
|
|
24
|
+
pat;
|
|
25
|
+
constructor(config) {
|
|
26
|
+
this.apiUrl = config.apiUrl.replace(/\/$/, ''); // Remove trailing slash
|
|
27
|
+
this.pat = config.pat;
|
|
28
|
+
}
|
|
29
|
+
async request(method, path, body, extraHeaders, retryCount = 0) {
|
|
30
|
+
const url = `${this.apiUrl}${path}`;
|
|
31
|
+
const maxRetries = 3;
|
|
32
|
+
const baseDelay = 1000; // 1 second
|
|
33
|
+
try {
|
|
34
|
+
const response = await fetch(url, {
|
|
35
|
+
method,
|
|
36
|
+
headers: {
|
|
37
|
+
'Authorization': `Bearer ${this.pat}`,
|
|
38
|
+
'Content-Type': 'application/json',
|
|
39
|
+
'Accept': 'application/json',
|
|
40
|
+
...extraHeaders,
|
|
41
|
+
},
|
|
42
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
43
|
+
});
|
|
44
|
+
const statusCode = response.status;
|
|
45
|
+
if (!response.ok) {
|
|
46
|
+
const errorText = await response.text();
|
|
47
|
+
let errorMessage;
|
|
48
|
+
try {
|
|
49
|
+
const errorJson = JSON.parse(errorText);
|
|
50
|
+
errorMessage = errorJson.error || errorJson.message || errorText;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
errorMessage = errorText || `HTTP ${statusCode}`;
|
|
54
|
+
}
|
|
55
|
+
// Retry on rate limit (429) or server errors (5xx)
|
|
56
|
+
if ((statusCode === 429 || statusCode >= 500) && retryCount < maxRetries) {
|
|
57
|
+
const delay = baseDelay * Math.pow(2, retryCount); // Exponential backoff
|
|
58
|
+
const jitter = Math.random() * 500; // Add jitter to prevent thundering herd
|
|
59
|
+
await new Promise(resolve => setTimeout(resolve, delay + jitter));
|
|
60
|
+
return this.request(method, path, body, extraHeaders, retryCount + 1);
|
|
61
|
+
}
|
|
62
|
+
return { error: errorMessage, statusCode };
|
|
63
|
+
}
|
|
64
|
+
const data = await response.json();
|
|
65
|
+
return { data, statusCode };
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
69
|
+
// Retry on network errors
|
|
70
|
+
if (retryCount < maxRetries) {
|
|
71
|
+
const delay = baseDelay * Math.pow(2, retryCount);
|
|
72
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
73
|
+
return this.request(method, path, body, extraHeaders, retryCount + 1);
|
|
74
|
+
}
|
|
75
|
+
return { error: `Network error: ${message}`, statusCode: 0 };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// ===========================================================================
|
|
79
|
+
// Projects
|
|
80
|
+
// ===========================================================================
|
|
81
|
+
async listProjects(options) {
|
|
82
|
+
const params = new URLSearchParams();
|
|
83
|
+
if (options?.status)
|
|
84
|
+
params.set('status', options.status);
|
|
85
|
+
if (options?.includeArchived)
|
|
86
|
+
params.set('includeArchived', 'true');
|
|
87
|
+
const query = params.toString();
|
|
88
|
+
return this.request('GET', `/api/v1/projects${query ? `?${query}` : ''}`);
|
|
89
|
+
}
|
|
90
|
+
async getProject(projectId) {
|
|
91
|
+
return this.request('GET', `/api/v1/projects/${projectId}`);
|
|
92
|
+
}
|
|
93
|
+
async getProjectContext(projectId) {
|
|
94
|
+
return this.request('GET', `/api/v1/projects/${projectId}/context`);
|
|
95
|
+
}
|
|
96
|
+
// ===========================================================================
|
|
97
|
+
// Tasks
|
|
98
|
+
// ===========================================================================
|
|
99
|
+
async listTasks(options) {
|
|
100
|
+
const params = new URLSearchParams();
|
|
101
|
+
if (options?.projectId)
|
|
102
|
+
params.set('projectId', options.projectId);
|
|
103
|
+
if (options?.status)
|
|
104
|
+
params.set('status', options.status);
|
|
105
|
+
if (options?.limit)
|
|
106
|
+
params.set('limit', options.limit.toString());
|
|
107
|
+
const query = params.toString();
|
|
108
|
+
return this.request('GET', `/api/v1/tasks${query ? `?${query}` : ''}`);
|
|
109
|
+
}
|
|
110
|
+
async createTask(task, idempotencyKey) {
|
|
111
|
+
return this.request('POST', '/api/v1/tasks', task, {
|
|
112
|
+
'Idempotency-Key': idempotencyKey || generateIdempotencyKey(),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
async updateTask(taskId, updates, idempotencyKey) {
|
|
116
|
+
return this.request('PATCH', `/api/v1/tasks/${taskId}`, updates, {
|
|
117
|
+
'Idempotency-Key': idempotencyKey || generateIdempotencyKey(),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Mark a task as completed.
|
|
122
|
+
* Uses PATCH with status: 'completed' (backend has no dedicated /complete endpoint).
|
|
123
|
+
*/
|
|
124
|
+
async completeTask(taskId, idempotencyKey) {
|
|
125
|
+
return this.request('PATCH', `/api/v1/tasks/${taskId}`, {
|
|
126
|
+
status: 'completed',
|
|
127
|
+
}, {
|
|
128
|
+
'Idempotency-Key': idempotencyKey || generateIdempotencyKey(),
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
async getTask(taskId) {
|
|
132
|
+
return this.request('GET', `/api/v1/tasks/${taskId}`);
|
|
133
|
+
}
|
|
134
|
+
async deleteTask(taskId) {
|
|
135
|
+
return this.request('DELETE', `/api/v1/tasks/${taskId}`);
|
|
136
|
+
}
|
|
137
|
+
// ===========================================================================
|
|
138
|
+
// Projects (mutations)
|
|
139
|
+
// ===========================================================================
|
|
140
|
+
async createProject(project) {
|
|
141
|
+
return this.request('POST', '/api/v1/projects', project);
|
|
142
|
+
}
|
|
143
|
+
async updateProject(projectId, updates) {
|
|
144
|
+
return this.request('PATCH', `/api/v1/projects/${projectId}`, updates);
|
|
145
|
+
}
|
|
146
|
+
async archiveProject(projectId) {
|
|
147
|
+
return this.request('POST', `/api/v1/projects/${projectId}/archive`);
|
|
148
|
+
}
|
|
149
|
+
// ===========================================================================
|
|
150
|
+
// Knowledge / Notes
|
|
151
|
+
// ===========================================================================
|
|
152
|
+
async searchNotes(query, options) {
|
|
153
|
+
const params = new URLSearchParams({ q: query });
|
|
154
|
+
if (options?.projectId)
|
|
155
|
+
params.set('projectId', options.projectId);
|
|
156
|
+
if (options?.limit)
|
|
157
|
+
params.set('limit', options.limit.toString());
|
|
158
|
+
return this.request('GET', `/api/v1/notes/search?${params.toString()}`);
|
|
159
|
+
}
|
|
160
|
+
async createNote(note, idempotencyKey) {
|
|
161
|
+
return this.request('POST', '/api/v1/notes', {
|
|
162
|
+
title: note.title,
|
|
163
|
+
content: note.content,
|
|
164
|
+
noteType: note.noteType || 'note',
|
|
165
|
+
projectId: note.projectId,
|
|
166
|
+
}, {
|
|
167
|
+
'Idempotency-Key': idempotencyKey || generateIdempotencyKey(),
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
async getNote(noteId) {
|
|
171
|
+
return this.request('GET', `/api/v1/notes/${noteId}`);
|
|
172
|
+
}
|
|
173
|
+
async updateNote(noteId, updates, idempotencyKey) {
|
|
174
|
+
const body = {};
|
|
175
|
+
if (updates.title)
|
|
176
|
+
body.title = updates.title;
|
|
177
|
+
if (updates.noteType)
|
|
178
|
+
body.noteType = updates.noteType;
|
|
179
|
+
if (updates.content !== undefined)
|
|
180
|
+
body.content = updates.content;
|
|
181
|
+
return this.request('PATCH', `/api/v1/notes/${noteId}`, body, {
|
|
182
|
+
'Idempotency-Key': idempotencyKey || generateIdempotencyKey(),
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
async deleteNote(noteId) {
|
|
186
|
+
return this.request('DELETE', `/api/v1/notes/${noteId}`);
|
|
187
|
+
}
|
|
188
|
+
async listNotes(options) {
|
|
189
|
+
const params = new URLSearchParams();
|
|
190
|
+
if (options?.projectId)
|
|
191
|
+
params.set('projectId', options.projectId);
|
|
192
|
+
if (options?.noteType)
|
|
193
|
+
params.set('noteType', options.noteType);
|
|
194
|
+
if (options?.limit)
|
|
195
|
+
params.set('limit', options.limit.toString());
|
|
196
|
+
const query = params.toString();
|
|
197
|
+
return this.request('GET', `/api/v1/notes${query ? `?${query}` : ''}`);
|
|
198
|
+
}
|
|
199
|
+
// ===========================================================================
|
|
200
|
+
// Datasets
|
|
201
|
+
// ===========================================================================
|
|
202
|
+
async listDatasets(limit) {
|
|
203
|
+
const params = new URLSearchParams();
|
|
204
|
+
if (limit)
|
|
205
|
+
params.set('limit', limit.toString());
|
|
206
|
+
const query = params.toString();
|
|
207
|
+
return this.request('GET', `/api/v1/datasets${query ? `?${query}` : ''}`);
|
|
208
|
+
}
|
|
209
|
+
async createDataset(input) {
|
|
210
|
+
return this.request('POST', '/api/v1/datasets', input);
|
|
211
|
+
}
|
|
212
|
+
async queryDataset(datasetId, input) {
|
|
213
|
+
return this.request('POST', `/api/v1/datasets/${datasetId}/query`, input || {});
|
|
214
|
+
}
|
|
215
|
+
async mutateDataset(datasetId, input) {
|
|
216
|
+
if (input.operation === 'create') {
|
|
217
|
+
return this.request('POST', `/api/v1/datasets/${datasetId}/records`, { records: input.records || [] });
|
|
218
|
+
}
|
|
219
|
+
if (input.operation === 'update') {
|
|
220
|
+
return this.request('PATCH', `/api/v1/datasets/${datasetId}/records/${input.recordId}`, { fields: input.fields || {} });
|
|
221
|
+
}
|
|
222
|
+
return this.request('DELETE', `/api/v1/datasets/${datasetId}/records/${input.recordId}`);
|
|
223
|
+
}
|
|
224
|
+
async modifyDatasetSchema(datasetId, input) {
|
|
225
|
+
return this.request('POST', `/api/v1/datasets/${datasetId}/schema`, input);
|
|
226
|
+
}
|
|
227
|
+
async summarizeDataset(datasetId) {
|
|
228
|
+
return this.request('POST', `/api/v1/datasets/${datasetId}/summarize`, {});
|
|
229
|
+
}
|
|
230
|
+
// ===========================================================================
|
|
231
|
+
// Ontology
|
|
232
|
+
// ===========================================================================
|
|
233
|
+
async findObjects(input) {
|
|
234
|
+
return this.request('POST', '/api/v1/ontology/objects/find', input);
|
|
235
|
+
}
|
|
236
|
+
async getObjectLinks(objectRecordId, options) {
|
|
237
|
+
const params = new URLSearchParams();
|
|
238
|
+
if (options?.depth)
|
|
239
|
+
params.set('depth', options.depth.toString());
|
|
240
|
+
if (options?.limit)
|
|
241
|
+
params.set('limit', options.limit.toString());
|
|
242
|
+
const query = params.toString();
|
|
243
|
+
return this.request('GET', `/api/v1/ontology/objects/${objectRecordId}/links${query ? `?${query}` : ''}`);
|
|
244
|
+
}
|
|
245
|
+
async runObjectAction(input) {
|
|
246
|
+
return this.request('POST', '/api/v1/ontology/actions/run', input);
|
|
247
|
+
}
|
|
248
|
+
// ===========================================================================
|
|
249
|
+
// People
|
|
250
|
+
// ===========================================================================
|
|
251
|
+
async searchPeople(query, limit) {
|
|
252
|
+
const params = new URLSearchParams({ search: query });
|
|
253
|
+
if (limit)
|
|
254
|
+
params.set('limit', limit.toString());
|
|
255
|
+
return this.request('GET', `/api/v1/people?${params.toString()}`);
|
|
256
|
+
}
|
|
257
|
+
async listPeople(limit) {
|
|
258
|
+
const params = new URLSearchParams();
|
|
259
|
+
if (limit)
|
|
260
|
+
params.set('limit', limit.toString());
|
|
261
|
+
const query = params.toString();
|
|
262
|
+
return this.request('GET', `/api/v1/people${query ? `?${query}` : ''}`);
|
|
263
|
+
}
|
|
264
|
+
// ===========================================================================
|
|
265
|
+
// Calendar
|
|
266
|
+
// ===========================================================================
|
|
267
|
+
async listCalendarEvents(options) {
|
|
268
|
+
const params = new URLSearchParams();
|
|
269
|
+
if (options?.startDate)
|
|
270
|
+
params.set('startDate', options.startDate);
|
|
271
|
+
if (options?.endDate)
|
|
272
|
+
params.set('endDate', options.endDate);
|
|
273
|
+
if (options?.limit)
|
|
274
|
+
params.set('limit', options.limit.toString());
|
|
275
|
+
const query = params.toString();
|
|
276
|
+
return this.request('GET', `/api/v1/calendar/events${query ? `?${query}` : ''}`);
|
|
277
|
+
}
|
|
278
|
+
// Note: findFreeSlots and createCalendarEvent are not yet implemented in the backend
|
|
279
|
+
async findFreeSlots(_options) {
|
|
280
|
+
return {
|
|
281
|
+
error: 'Calendar free slots feature not yet implemented. Use listCalendarEvents to see your schedule.',
|
|
282
|
+
statusCode: 501
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
async createCalendarEvent(event) {
|
|
286
|
+
return this.request('POST', '/api/v1/calendar/events', {
|
|
287
|
+
title: event.title,
|
|
288
|
+
start: event.startTime,
|
|
289
|
+
end: event.endTime,
|
|
290
|
+
description: event.description,
|
|
291
|
+
location: event.location,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
async updateCalendarEvent(eventId, updates) {
|
|
295
|
+
const body = {};
|
|
296
|
+
if (updates.title)
|
|
297
|
+
body.title = updates.title;
|
|
298
|
+
if (updates.startTime)
|
|
299
|
+
body.start = updates.startTime;
|
|
300
|
+
if (updates.endTime)
|
|
301
|
+
body.end = updates.endTime;
|
|
302
|
+
if (updates.description !== undefined)
|
|
303
|
+
body.description = updates.description;
|
|
304
|
+
if (updates.location !== undefined)
|
|
305
|
+
body.location = updates.location;
|
|
306
|
+
return this.request('PATCH', `/api/v1/calendar/events/${eventId}`, body);
|
|
307
|
+
}
|
|
308
|
+
async deleteCalendarEvent(eventId) {
|
|
309
|
+
return this.request('DELETE', `/api/v1/calendar/events/${eventId}`);
|
|
310
|
+
}
|
|
311
|
+
// ===========================================================================
|
|
312
|
+
// Codebase Indexing
|
|
313
|
+
// ===========================================================================
|
|
314
|
+
async listCodeRepositories() {
|
|
315
|
+
return this.request('GET', '/api/v1/code/repositories');
|
|
316
|
+
}
|
|
317
|
+
async getCodeRepository(repositoryId) {
|
|
318
|
+
return this.request('GET', `/api/v1/code/repositories/${repositoryId}`);
|
|
319
|
+
}
|
|
320
|
+
async createCodeRepository(repo) {
|
|
321
|
+
return this.request('POST', '/api/v1/code/repositories', repo);
|
|
322
|
+
}
|
|
323
|
+
async deleteCodeRepository(repositoryId) {
|
|
324
|
+
return this.request('DELETE', `/api/v1/code/repositories/${repositoryId}`);
|
|
325
|
+
}
|
|
326
|
+
async triggerCodeIndexing(repositoryId) {
|
|
327
|
+
return this.request('POST', `/api/v1/code/repositories/${repositoryId}/index`);
|
|
328
|
+
}
|
|
329
|
+
async updateIndexingProgress(repositoryId, progress) {
|
|
330
|
+
return this.request('PATCH', `/api/v1/code/repositories/${repositoryId}/progress`, progress);
|
|
331
|
+
}
|
|
332
|
+
async uploadFileContent(repositoryId, file) {
|
|
333
|
+
return this.request('POST', `/api/v1/code/files/${repositoryId}/content`, file);
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Upload multiple files in a single request (much faster)
|
|
337
|
+
* Max 100 files per batch
|
|
338
|
+
*/
|
|
339
|
+
async uploadFilesBatch(repositoryId, files) {
|
|
340
|
+
return this.request('POST', `/api/v1/code/files/${repositoryId}/batch`, { files });
|
|
341
|
+
}
|
|
342
|
+
async finalizeCodeIndexing(repositoryId, options) {
|
|
343
|
+
return this.request('POST', `/api/v1/code/repositories/${repositoryId}/finalize`, options ?? {});
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Update repository commit SHA after indexing (Decision 5: MVP single branch)
|
|
347
|
+
*/
|
|
348
|
+
async updateRepositoryCommit(repositoryId, commit) {
|
|
349
|
+
return this.request('PATCH', `/api/v1/code/repositories/${repositoryId}`, {
|
|
350
|
+
gitCommitSha: commit.sha,
|
|
351
|
+
gitBranch: commit.branch,
|
|
352
|
+
indexFallbackReason: commit.indexFallbackReason,
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
async getLatestCodeSnapshot(repositoryId, options) {
|
|
356
|
+
const params = new URLSearchParams();
|
|
357
|
+
if (options?.branch)
|
|
358
|
+
params.set('branch', options.branch);
|
|
359
|
+
if (options?.committedOnly !== undefined)
|
|
360
|
+
params.set('committedOnly', String(options.committedOnly));
|
|
361
|
+
const query = params.toString();
|
|
362
|
+
return this.request('GET', `/api/v1/code/repositories/${repositoryId}/snapshots/latest${query ? `?${query}` : ''}`);
|
|
363
|
+
}
|
|
364
|
+
async getCodeSnapshot(snapshotId) {
|
|
365
|
+
return this.request('GET', `/api/v1/code/snapshots/${snapshotId}`);
|
|
366
|
+
}
|
|
367
|
+
async createSnapshotArchiveUrl(snapshotId, options) {
|
|
368
|
+
return this.request('POST', `/api/v1/code/snapshots/${snapshotId}/archive-url`, options ?? {});
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Upload files with commit metadata (Decision 1: extended batch endpoint)
|
|
372
|
+
* Supports incremental indexing with commit context for task linking
|
|
373
|
+
*/
|
|
374
|
+
async uploadFilesWithCommit(repositoryId, data) {
|
|
375
|
+
return this.request('POST', `/api/v1/code/files/${repositoryId}/batch`, data);
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Rename a file (Decision 4: keep file_id stable)
|
|
379
|
+
*/
|
|
380
|
+
async renameFile(repositoryId, oldPath, newPath) {
|
|
381
|
+
return this.request('PATCH', `/api/v1/code/files/${repositoryId}/rename`, { oldPath, newPath });
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Record a commit with file changes (Phase 3 Hardening: multi-commit support)
|
|
385
|
+
* Records commit metadata without uploading file content
|
|
386
|
+
*/
|
|
387
|
+
async recordCommit(repositoryId, commit) {
|
|
388
|
+
return this.request('POST', `/api/v1/code/repositories/${repositoryId}/commits`, commit);
|
|
389
|
+
}
|
|
390
|
+
async searchCode(options) {
|
|
391
|
+
return this.request('POST', '/api/v1/code/search', options);
|
|
392
|
+
}
|
|
393
|
+
// ===========================================================================
|
|
394
|
+
// Developer Expertise (Phase 4)
|
|
395
|
+
// ===========================================================================
|
|
396
|
+
/**
|
|
397
|
+
* Compute developer expertise for a repository
|
|
398
|
+
*/
|
|
399
|
+
async computeExpertise(repositoryId) {
|
|
400
|
+
return this.request('POST', `/api/v1/code/repositories/${repositoryId}/expertise/compute`);
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Query "who knows" about a code area
|
|
404
|
+
*/
|
|
405
|
+
async whoKnows(repositoryId, codeArea, limit) {
|
|
406
|
+
const params = new URLSearchParams({ codeArea });
|
|
407
|
+
if (limit)
|
|
408
|
+
params.append('limit', limit.toString());
|
|
409
|
+
return this.request('GET', `/api/v1/code/repositories/${repositoryId}/expertise/who-knows?${params.toString()}`);
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Link a task to code manually
|
|
413
|
+
*/
|
|
414
|
+
async linkTaskToCode(taskId, data) {
|
|
415
|
+
return this.request('POST', `/api/v1/code/tasks/${taskId}/links`, data);
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Get commit history for a repository
|
|
419
|
+
*/
|
|
420
|
+
async getCommits(repositoryId, options) {
|
|
421
|
+
const params = new URLSearchParams();
|
|
422
|
+
if (options?.path)
|
|
423
|
+
params.append('path', options.path);
|
|
424
|
+
if (options?.limit)
|
|
425
|
+
params.append('limit', options.limit.toString());
|
|
426
|
+
const query = params.toString() ? `?${params.toString()}` : '';
|
|
427
|
+
return this.request('GET', `/api/v1/code/repositories/${repositoryId}/commits${query}`);
|
|
428
|
+
}
|
|
429
|
+
// ===========================================================================
|
|
430
|
+
// Code Memories
|
|
431
|
+
// ===========================================================================
|
|
432
|
+
async storeCodeMemory(memory) {
|
|
433
|
+
return this.request('POST', '/api/v1/code/memories', memory);
|
|
434
|
+
}
|
|
435
|
+
async searchCodeMemories(options) {
|
|
436
|
+
return this.request('POST', '/api/v1/code/memories/search', options);
|
|
437
|
+
}
|
|
438
|
+
async listCodeMemories(options) {
|
|
439
|
+
const params = new URLSearchParams();
|
|
440
|
+
if (options?.repositoryId)
|
|
441
|
+
params.set('repositoryId', options.repositoryId);
|
|
442
|
+
if (options?.limit)
|
|
443
|
+
params.set('limit', options.limit.toString());
|
|
444
|
+
const query = params.toString();
|
|
445
|
+
return this.request('GET', `/api/v1/code/memories${query ? `?${query}` : ''}`);
|
|
446
|
+
}
|
|
447
|
+
async deleteCodeMemory(memoryId) {
|
|
448
|
+
return this.request('DELETE', `/api/v1/code/memories/${memoryId}`);
|
|
449
|
+
}
|
|
450
|
+
// ===========================================================================
|
|
451
|
+
// Document Upload
|
|
452
|
+
// ===========================================================================
|
|
453
|
+
async requestMultipart(path, formData) {
|
|
454
|
+
const url = `${this.apiUrl}${path}`;
|
|
455
|
+
try {
|
|
456
|
+
const response = await fetch(url, {
|
|
457
|
+
method: 'POST',
|
|
458
|
+
headers: {
|
|
459
|
+
'Authorization': `Bearer ${this.pat}`,
|
|
460
|
+
'Accept': 'application/json',
|
|
461
|
+
},
|
|
462
|
+
body: formData,
|
|
463
|
+
});
|
|
464
|
+
const statusCode = response.status;
|
|
465
|
+
if (!response.ok) {
|
|
466
|
+
const errorText = await response.text();
|
|
467
|
+
let errorMessage;
|
|
468
|
+
try {
|
|
469
|
+
const errorJson = JSON.parse(errorText);
|
|
470
|
+
errorMessage = errorJson.error || errorJson.message || errorText;
|
|
471
|
+
}
|
|
472
|
+
catch {
|
|
473
|
+
errorMessage = errorText || `HTTP ${statusCode}`;
|
|
474
|
+
}
|
|
475
|
+
return { error: errorMessage, statusCode };
|
|
476
|
+
}
|
|
477
|
+
const data = await response.json();
|
|
478
|
+
return { data, statusCode };
|
|
479
|
+
}
|
|
480
|
+
catch (err) {
|
|
481
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
482
|
+
return { error: `Network error: ${message}`, statusCode: 0 };
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Upload a document (PDF, Markdown, or text) into Knowledge as a note.
|
|
487
|
+
* PDFs are first converted to markdown via the backend import endpoint.
|
|
488
|
+
*/
|
|
489
|
+
async uploadDocument(options) {
|
|
490
|
+
let fileBuffer;
|
|
491
|
+
let filename;
|
|
492
|
+
let contentType;
|
|
493
|
+
if (options.filePath) {
|
|
494
|
+
fileBuffer = (0, fs_1.readFileSync)(options.filePath);
|
|
495
|
+
filename = options.filename || (0, path_1.basename)(options.filePath);
|
|
496
|
+
contentType = options.contentType || mimeFromExt((0, path_1.extname)(filename));
|
|
497
|
+
}
|
|
498
|
+
else if (options.content && options.filename) {
|
|
499
|
+
filename = options.filename;
|
|
500
|
+
contentType = options.contentType || mimeFromExt((0, path_1.extname)(filename));
|
|
501
|
+
if (contentType === 'application/pdf') {
|
|
502
|
+
fileBuffer = Buffer.from(options.content, 'base64');
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
else {
|
|
506
|
+
return { error: 'Either filePath or content+filename is required', statusCode: 400 };
|
|
507
|
+
}
|
|
508
|
+
const title = options.title || filename.replace(/\.[^.]+$/, '');
|
|
509
|
+
if (contentType === 'application/pdf') {
|
|
510
|
+
// Upload PDF to backend conversion endpoint, get markdown back
|
|
511
|
+
const formData = new FormData();
|
|
512
|
+
const blob = new Blob([new Uint8Array(fileBuffer)], { type: 'application/pdf' });
|
|
513
|
+
formData.append('file', blob, filename);
|
|
514
|
+
const pdfResult = await this.requestMultipart('/api/v1/import/pdf', formData);
|
|
515
|
+
if (pdfResult.error) {
|
|
516
|
+
return { error: `PDF conversion failed: ${pdfResult.error}`, statusCode: pdfResult.statusCode };
|
|
517
|
+
}
|
|
518
|
+
const markdown = pdfResult.data?.markdown || '';
|
|
519
|
+
return this.createNote({
|
|
520
|
+
title,
|
|
521
|
+
content: markdown,
|
|
522
|
+
noteType: options.noteType || 'reference',
|
|
523
|
+
projectId: options.projectId,
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
// Markdown or plain text — create note directly
|
|
527
|
+
let textContent;
|
|
528
|
+
if (fileBuffer) {
|
|
529
|
+
textContent = fileBuffer.toString('utf-8');
|
|
530
|
+
}
|
|
531
|
+
else {
|
|
532
|
+
textContent = options.content;
|
|
533
|
+
}
|
|
534
|
+
return this.createNote({
|
|
535
|
+
title,
|
|
536
|
+
content: textContent,
|
|
537
|
+
noteType: options.noteType || 'note',
|
|
538
|
+
projectId: options.projectId,
|
|
539
|
+
});
|
|
540
|
+
}
|
|
541
|
+
// ===========================================================================
|
|
542
|
+
// Vault / Secrets Management
|
|
543
|
+
// ===========================================================================
|
|
544
|
+
async listVaultEntries(options) {
|
|
545
|
+
const params = new URLSearchParams();
|
|
546
|
+
if (options?.entryType)
|
|
547
|
+
params.set('entryType', options.entryType);
|
|
548
|
+
if (options?.category)
|
|
549
|
+
params.set('category', options.category);
|
|
550
|
+
if (options?.search)
|
|
551
|
+
params.set('search', options.search);
|
|
552
|
+
if (options?.limit)
|
|
553
|
+
params.set('limit', options.limit.toString());
|
|
554
|
+
const query = params.toString();
|
|
555
|
+
return this.request('GET', `/api/v1/vault/entries${query ? `?${query}` : ''}`);
|
|
556
|
+
}
|
|
557
|
+
async createVaultEntry(entry) {
|
|
558
|
+
return this.request('POST', '/api/v1/vault/entries', entry);
|
|
559
|
+
}
|
|
560
|
+
async readVaultSecret(entryId) {
|
|
561
|
+
return this.request('GET', `/api/v1/vault/entries/${entryId}/secret`);
|
|
562
|
+
}
|
|
563
|
+
async updateVaultEntry(entryId, updates) {
|
|
564
|
+
return this.request('PATCH', `/api/v1/vault/entries/${entryId}`, updates);
|
|
565
|
+
}
|
|
566
|
+
async searchVaultEntries(query, limit) {
|
|
567
|
+
const params = new URLSearchParams({ search: query });
|
|
568
|
+
if (limit)
|
|
569
|
+
params.set('limit', limit.toString());
|
|
570
|
+
return this.request('GET', `/api/v1/vault/entries?${params.toString()}`);
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
exports.ExfClient = ExfClient;
|
|
574
|
+
function mimeFromExt(ext) {
|
|
575
|
+
switch (ext.toLowerCase()) {
|
|
576
|
+
case '.pdf': return 'application/pdf';
|
|
577
|
+
case '.md':
|
|
578
|
+
case '.markdown': return 'text/markdown';
|
|
579
|
+
case '.txt': return 'text/plain';
|
|
580
|
+
default: return 'text/plain';
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
// Create client from environment variables
|
|
584
|
+
function createClientFromEnv() {
|
|
585
|
+
const apiUrl = process.env.EXF_API_URL;
|
|
586
|
+
const pat = process.env.EXF_PAT;
|
|
587
|
+
if (!apiUrl) {
|
|
588
|
+
throw new Error('EXF_API_URL environment variable is required');
|
|
589
|
+
}
|
|
590
|
+
if (!pat) {
|
|
591
|
+
throw new Error('EXF_PAT environment variable is required');
|
|
592
|
+
}
|
|
593
|
+
return new ExfClient({ apiUrl, pat });
|
|
594
|
+
}
|
|
595
|
+
//# sourceMappingURL=exfClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exfClient.js","sourceRoot":"","sources":["../src/exfClient.ts"],"names":[],"mappings":"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"}
|