@augmentcode/auggie-sdk 0.1.6 → 0.1.7

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 (46) hide show
  1. package/dist/auggie/sdk-acp-client.d.ts +0 -102
  2. package/dist/auggie/sdk-acp-client.d.ts.map +1 -1
  3. package/dist/auggie/sdk-acp-client.js +1 -32
  4. package/dist/auggie/sdk-acp-client.js.map +1 -1
  5. package/dist/context/direct-context.d.ts +287 -0
  6. package/dist/context/direct-context.d.ts.map +1 -0
  7. package/dist/context/direct-context.js +624 -0
  8. package/dist/context/direct-context.js.map +1 -0
  9. package/dist/context/filesystem-context.d.ts +84 -0
  10. package/dist/context/filesystem-context.d.ts.map +1 -0
  11. package/dist/context/filesystem-context.js +198 -0
  12. package/dist/context/filesystem-context.js.map +1 -0
  13. package/dist/context/internal/__mocks__/api-client.d.ts +54 -0
  14. package/dist/context/internal/__mocks__/api-client.d.ts.map +1 -0
  15. package/dist/context/internal/__mocks__/api-client.js +96 -0
  16. package/dist/context/internal/__mocks__/api-client.js.map +1 -0
  17. package/dist/context/internal/api-client.d.ts +75 -0
  18. package/dist/context/internal/api-client.d.ts.map +1 -0
  19. package/dist/context/internal/api-client.js +218 -0
  20. package/dist/context/internal/api-client.js.map +1 -0
  21. package/dist/context/internal/blob-name-calculator.d.ts +14 -0
  22. package/dist/context/internal/blob-name-calculator.d.ts.map +1 -0
  23. package/dist/context/internal/blob-name-calculator.js +44 -0
  24. package/dist/context/internal/blob-name-calculator.js.map +1 -0
  25. package/dist/context/internal/retry-utils.d.ts +22 -0
  26. package/dist/context/internal/retry-utils.d.ts.map +1 -0
  27. package/dist/context/internal/retry-utils.js +88 -0
  28. package/dist/context/internal/retry-utils.js.map +1 -0
  29. package/dist/context/internal/search-utils.d.ts +8 -0
  30. package/dist/context/internal/search-utils.d.ts.map +1 -0
  31. package/dist/context/internal/search-utils.js +10 -0
  32. package/dist/context/internal/search-utils.js.map +1 -0
  33. package/dist/context/internal/session-reader.d.ts +17 -0
  34. package/dist/context/internal/session-reader.d.ts.map +1 -0
  35. package/dist/context/internal/session-reader.js +27 -0
  36. package/dist/context/internal/session-reader.js.map +1 -0
  37. package/dist/context/types.d.ts +113 -0
  38. package/dist/context/types.d.ts.map +1 -0
  39. package/dist/context/types.js +5 -0
  40. package/dist/context/types.js.map +1 -0
  41. package/dist/index.d.ts +6 -1
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +7 -0
  44. package/dist/index.js.map +1 -1
  45. package/dist/version.js.map +1 -1
  46. package/package.json +2 -1
@@ -0,0 +1,624 @@
1
+ import { readFile, writeFile } from "node:fs/promises";
2
+ import { Mutex } from "async-mutex";
3
+ import { ContextAPIClient } from "./internal/api-client";
4
+ import { BlobNameCalculator } from "./internal/blob-name-calculator";
5
+ import { retryWithBackoff } from "./internal/retry-utils";
6
+ import { formatSearchPrompt } from "./internal/search-utils";
7
+ import { readSessionFile } from "./internal/session-reader";
8
+ /**
9
+ * Direct Context - API-based indexing with import/export state
10
+ *
11
+ * ⚠️ **EXPERIMENTAL API** - This API is experimental and may change without notice.
12
+ *
13
+ * @experimental
14
+ *
15
+ * This class provides explicit file indexing via API calls with the ability
16
+ * to export and restore state to avoid re-indexing between sessions.
17
+ *
18
+ * ## Creating a Context
19
+ *
20
+ * **Start fresh:**
21
+ * ```typescript
22
+ * const context = await DirectContext.create();
23
+ * ```
24
+ *
25
+ * **Restore from saved state:**
26
+ * ```typescript
27
+ * const context = await DirectContext.importFromFile("state.json");
28
+ * // or
29
+ * const context = await DirectContext.import(stateObject);
30
+ * ```
31
+ *
32
+ * ## Indexing Flow
33
+ *
34
+ * Files are uploaded to the backend and then indexed asynchronously. You have
35
+ * explicit control over when to wait for indexing:
36
+ *
37
+ * **Option 1: Wait after each upload**
38
+ * ```typescript
39
+ * await context.addToIndex(files); // waits for indexing by default
40
+ * await context.search("query"); // files are already indexed
41
+ * ```
42
+ *
43
+ * **Option 2: Batch uploads then wait**
44
+ * ```typescript
45
+ * await context.addToIndex(files1, { waitForIndexing: false });
46
+ * await context.addToIndex(files2, { waitForIndexing: false });
47
+ * await context.waitForIndexing(); // wait for all files to be indexed
48
+ * await context.search("query"); // files are now indexed
49
+ * ```
50
+ *
51
+ * Note: `search()` and `searchAndAsk()` do not wait for indexing automatically.
52
+ *
53
+ * ## State Persistence
54
+ *
55
+ * **Export state:**
56
+ * ```typescript
57
+ * const state = context.export();
58
+ * // or save to file
59
+ * await context.exportToFile("state.json");
60
+ * ```
61
+ *
62
+ * **Import state:**
63
+ * ```typescript
64
+ * const context = await DirectContext.importFromFile("state.json");
65
+ * ```
66
+ */
67
+ export class DirectContext {
68
+ /**
69
+ * Create and initialize a new DirectContext instance
70
+ *
71
+ * Authentication priority:
72
+ * 1. options.apiKey / options.apiUrl
73
+ * 2. AUGMENT_API_TOKEN / AUGMENT_API_URL environment variables
74
+ * 3. ~/.augment/session.json (created by `auggie login`)
75
+ *
76
+ * @param options Configuration options
77
+ * @returns Promise that resolves to a DirectContext instance
78
+ */
79
+ static async create(options = {}) {
80
+ const { apiKey, apiUrl } = await DirectContext.resolveCredentials(options);
81
+ return new DirectContext(apiKey, apiUrl, options.debug ?? false);
82
+ }
83
+ /**
84
+ * Import a DirectContext instance from a saved state object
85
+ *
86
+ * @param state The state object to restore from
87
+ * @param options Configuration options
88
+ * @returns Promise that resolves to a DirectContext instance with restored state
89
+ */
90
+ static async import(state, options = {}) {
91
+ const { apiKey, apiUrl } = await DirectContext.resolveCredentials(options);
92
+ const instance = new DirectContext(apiKey, apiUrl, options.debug ?? false);
93
+ await instance.doImport(state);
94
+ return instance;
95
+ }
96
+ /**
97
+ * Import a DirectContext instance from a saved state file (Node.js only)
98
+ *
99
+ * @param filePath Path to the state file
100
+ * @param options Configuration options
101
+ * @returns Promise that resolves to a DirectContext instance with restored state
102
+ */
103
+ static async importFromFile(filePath, options = {}) {
104
+ const content = await readFile(filePath, "utf-8");
105
+ const state = JSON.parse(content);
106
+ return DirectContext.import(state, options);
107
+ }
108
+ /**
109
+ * Resolve API credentials from options, environment, or session file
110
+ */
111
+ static async resolveCredentials(options) {
112
+ let apiKey = options.apiKey || process.env.AUGMENT_API_TOKEN;
113
+ let apiUrl = options.apiUrl || process.env.AUGMENT_API_URL;
114
+ // If credentials not provided, try session.json
115
+ if (!(apiKey && apiUrl)) {
116
+ const session = await readSessionFile();
117
+ if (session) {
118
+ apiKey = apiKey || session.accessToken;
119
+ apiUrl = apiUrl || session.tenantURL;
120
+ }
121
+ }
122
+ // Validate we have credentials
123
+ if (!apiKey) {
124
+ throw new Error("API key is required. Provide it via:\n" +
125
+ "1. options.apiKey parameter\n" +
126
+ "2. AUGMENT_API_TOKEN environment variable\n" +
127
+ "3. Run 'auggie login' to create ~/.augment/session.json");
128
+ }
129
+ if (!apiUrl) {
130
+ throw new Error("API URL is required. Provide it via:\n" +
131
+ "1. options.apiUrl parameter\n" +
132
+ "2. AUGMENT_API_URL environment variable\n" +
133
+ "3. Run 'auggie login' to create ~/.augment/session.json");
134
+ }
135
+ return { apiKey, apiUrl };
136
+ }
137
+ /**
138
+ * Private constructor - use DirectContext.create() instead
139
+ * @param apiKey API key for authentication
140
+ * @param apiUrl API URL for the tenant
141
+ * @param debug Enable debug logging
142
+ */
143
+ constructor(apiKey, apiUrl, debug) {
144
+ /**
145
+ * State management:
146
+ *
147
+ * blobMap: Tracks all files that have been uploaded (path -> blobName).
148
+ * This includes both indexed and non-indexed blobs.
149
+ * Also, includes both checkpointed and non-checkpointed blobs.
150
+ *
151
+ * checkpointId: The current checkpoint ID from the backend.
152
+ * Checkpoints are named snapshots of the blob set for performance.
153
+ * Updated after each successful checkpoint operation.
154
+ *
155
+ * pendingAdded: Blob names that have been uploaded but not yet checkpointed.
156
+ * Accumulated until CHECKPOINT_THRESHOLD is reached.
157
+ *
158
+ * pendingDeleted: Blob names that have been removed but not yet checkpointed.
159
+ * Accumulated until CHECKPOINT_THRESHOLD is reached.
160
+ *
161
+ * Note: Checkpointing and indexing are independent operations.
162
+ * A blob can be checkpointed but not indexed, indexed but not checkpointed,
163
+ * both, or neither.
164
+ */
165
+ this.blobMap = new Map();
166
+ this.pendingAdded = new Set();
167
+ this.pendingDeleted = new Set();
168
+ // Mutex for serializing state-modifying operations (upload, checkpoint, etc.)
169
+ this.mutex = new Mutex();
170
+ // Mutex for serializing polling operations to prevent unbounded concurrent requests
171
+ // to the backend's findMissing endpoint. Without this, concurrent addToIndex() calls
172
+ // could result in many simultaneous polling loops hitting the backend.
173
+ this.pollingMutex = new Mutex();
174
+ this.debug = debug;
175
+ // Initialize API client
176
+ this.apiClient = new ContextAPIClient({
177
+ apiKey,
178
+ apiUrl,
179
+ debug,
180
+ });
181
+ // Initialize blob calculator
182
+ this.blobCalculator = new BlobNameCalculator(DirectContext.MAX_FILE_SIZE_BYTES);
183
+ }
184
+ /**
185
+ * Log a debug message if debug mode is enabled
186
+ */
187
+ log(message) {
188
+ if (this.debug) {
189
+ console.log(`[DirectContext] ${message}`);
190
+ }
191
+ }
192
+ /**
193
+ * Create a checkpoint if threshold is reached
194
+ */
195
+ async maybeCheckpoint() {
196
+ const pendingChanges = this.pendingAdded.size + this.pendingDeleted.size;
197
+ if (pendingChanges < DirectContext.CHECKPOINT_THRESHOLD) {
198
+ this.log(`Skipping checkpoint: ${pendingChanges} pending changes (threshold: ${DirectContext.CHECKPOINT_THRESHOLD})`);
199
+ return;
200
+ }
201
+ // Get blob names for checkpoint (both sets already contain blob names)
202
+ const addedBlobs = Array.from(this.pendingAdded);
203
+ const deletedBlobs = Array.from(this.pendingDeleted);
204
+ this.log(`Creating checkpoint: ${addedBlobs.length} added, ${deletedBlobs.length} deleted blobs`);
205
+ const blobs = {
206
+ checkpointId: this.checkpointId,
207
+ addedBlobs: addedBlobs.sort(),
208
+ deletedBlobs: deletedBlobs.sort(),
209
+ };
210
+ const result = await retryWithBackoff(() => this.apiClient.checkpointBlobs(blobs), this.debug);
211
+ this.checkpointId = result.newCheckpointId;
212
+ this.log(`Checkpoint created: ${this.checkpointId}`);
213
+ // Clear pending changes after successful checkpoint
214
+ this.pendingAdded.clear();
215
+ this.pendingDeleted.clear();
216
+ }
217
+ /**
218
+ * Get the list of indexed file paths
219
+ */
220
+ getIndexedPaths() {
221
+ return Array.from(this.blobMap.keys());
222
+ }
223
+ /**
224
+ * Add files to the index by uploading them to the backend.
225
+ *
226
+ * By default, this method waits for the uploaded files to be fully indexed
227
+ * on the backend before returning. Set `waitForIndexing: false` to return
228
+ * immediately after upload completes (indexing will continue asynchronously).
229
+ *
230
+ * @param files - Array of files to add to the index
231
+ * @param options - Optional configuration
232
+ * @param options.waitForIndexing - If true (default), waits for the newly added files to be indexed before returning
233
+ * @returns Result indicating which files were newly uploaded vs already uploaded
234
+ */
235
+ async addToIndex(files, options) {
236
+ const waitForIndexing = options?.waitForIndexing ?? true;
237
+ const result = await this.mutex.runExclusive(() => this.doAddToIndex(files));
238
+ if (waitForIndexing && result.newlyUploaded.length > 0) {
239
+ // Wait for the newly uploaded files to be indexed
240
+ // These paths are guaranteed to be in blobMap since they were just added in doAddToIndex
241
+ const newlyUploadedBlobNames = result.newlyUploaded
242
+ .map((path) => this.blobMap.get(path))
243
+ .filter((blobName) => blobName !== undefined);
244
+ await this.waitForSpecificBlobs(newlyUploadedBlobNames);
245
+ }
246
+ return result;
247
+ }
248
+ /**
249
+ * Check which blobs are missing or not yet indexed on the server
250
+ *
251
+ * @param blobNames - Array of blob names to check
252
+ * @param includeNonIndexed - If true, includes blobs that are uploaded but not yet indexed.
253
+ * If false, only returns blobs that need to be uploaded.
254
+ * @returns Array of blob names that are either missing or not indexed (depending on flag)
255
+ */
256
+ async findMissingBlobs(blobNames, includeNonIndexed = false) {
257
+ const allMissing = [];
258
+ for (let i = 0; i < blobNames.length; i += DirectContext.MAX_FIND_MISSING_SIZE) {
259
+ const batch = blobNames.slice(i, i + DirectContext.MAX_FIND_MISSING_SIZE);
260
+ const result = await retryWithBackoff(() => this.apiClient.findMissing(batch), this.debug);
261
+ allMissing.push(...result.unknownBlobNames);
262
+ if (includeNonIndexed) {
263
+ allMissing.push(...result.nonindexedBlobNames);
264
+ }
265
+ }
266
+ return allMissing;
267
+ }
268
+ /**
269
+ * Upload files in batches respecting backend limits
270
+ */
271
+ async batchUploadFiles(filesToUpload) {
272
+ const batches = [];
273
+ let currentBatch = [];
274
+ let currentBatchSize = 0;
275
+ for (const file of filesToUpload) {
276
+ const fileSize = Buffer.byteLength(file.text, "utf-8");
277
+ const wouldExceedCount = currentBatch.length >= DirectContext.MAX_BATCH_UPLOAD_SIZE;
278
+ const wouldExceedSize = currentBatchSize + fileSize > DirectContext.MAX_BATCH_CONTENT_BYTES;
279
+ if (wouldExceedCount || wouldExceedSize) {
280
+ if (currentBatch.length > 0) {
281
+ batches.push(currentBatch);
282
+ }
283
+ currentBatch = [file];
284
+ currentBatchSize = fileSize;
285
+ }
286
+ else {
287
+ currentBatch.push(file);
288
+ currentBatchSize += fileSize;
289
+ }
290
+ }
291
+ if (currentBatch.length > 0) {
292
+ batches.push(currentBatch);
293
+ }
294
+ for (const batch of batches) {
295
+ await retryWithBackoff(() => this.apiClient.batchUpload(batch), this.debug);
296
+ }
297
+ }
298
+ /**
299
+ * Validate that all files are within size limits
300
+ */
301
+ validateFileSizes(files) {
302
+ for (const file of files) {
303
+ const sizeBytes = Buffer.byteLength(file.contents, "utf-8");
304
+ if (sizeBytes > DirectContext.MAX_FILE_SIZE_BYTES) {
305
+ throw new Error(`File ${file.path} is too large (${sizeBytes} bytes). Maximum size is ${DirectContext.MAX_FILE_SIZE_BYTES} bytes (1MB).`);
306
+ }
307
+ }
308
+ }
309
+ /**
310
+ * Calculate blob names and prepare upload data for files
311
+ * Returns files that need uploading, new blob entries, and already uploaded files
312
+ */
313
+ prepareBlobsForUpload(files) {
314
+ const filesToUpload = [];
315
+ const newBlobEntries = [];
316
+ const alreadyUploaded = [];
317
+ for (const file of files) {
318
+ const blobName = this.blobCalculator.calculate(file.path, file.contents);
319
+ if (blobName) {
320
+ const existingBlobName = this.blobMap.get(file.path);
321
+ if (existingBlobName && existingBlobName === blobName) {
322
+ // File content hasn't changed
323
+ alreadyUploaded.push(file.path);
324
+ continue;
325
+ }
326
+ // Handle file replacement: if a file with this path already exists
327
+ if (existingBlobName) {
328
+ this.handleBlobReplacement(existingBlobName);
329
+ }
330
+ newBlobEntries.push([file.path, blobName]);
331
+ filesToUpload.push({
332
+ blobName,
333
+ pathName: file.path,
334
+ text: file.contents,
335
+ metadata: [],
336
+ });
337
+ }
338
+ }
339
+ return { filesToUpload, newBlobEntries, alreadyUploaded };
340
+ }
341
+ /**
342
+ * Handle replacing an existing blob (track deletion of old blob)
343
+ */
344
+ handleBlobReplacement(oldBlobName) {
345
+ // Check if the old blob is in pendingAdded
346
+ if (this.pendingAdded.has(oldBlobName)) {
347
+ // Old blob was added in this session, just remove it from pendingAdded
348
+ this.pendingAdded.delete(oldBlobName);
349
+ }
350
+ else {
351
+ // Old blob was from a previous checkpoint, add to deletedBlobs
352
+ this.pendingDeleted.add(oldBlobName);
353
+ }
354
+ }
355
+ /**
356
+ * Categorize files into newly uploaded vs already on server based on server response
357
+ */
358
+ categorizeFiles(newBlobEntries, // [path, blobName]
359
+ missingBlobSet) {
360
+ const newlyUploaded = [];
361
+ const alreadyOnServer = [];
362
+ for (const [path, blobName] of newBlobEntries) {
363
+ if (missingBlobSet.has(blobName)) {
364
+ newlyUploaded.push(path);
365
+ }
366
+ else {
367
+ alreadyOnServer.push(path);
368
+ }
369
+ }
370
+ return { newlyUploaded, alreadyOnServer };
371
+ }
372
+ /**
373
+ * Internal implementation of addToIndex
374
+ */
375
+ async doAddToIndex(files) {
376
+ this.log(`Adding ${files.length} files to index`);
377
+ // Validate file sizes
378
+ this.validateFileSizes(files);
379
+ // Calculate blob names and prepare uploads
380
+ const { filesToUpload, newBlobEntries, alreadyUploaded } = this.prepareBlobsForUpload(files);
381
+ if (newBlobEntries.length === 0) {
382
+ return { newlyUploaded: [], alreadyUploaded };
383
+ }
384
+ // Check which blobs the server already has
385
+ const blobNamesToCheck = newBlobEntries.map(([_, blobName]) => blobName);
386
+ this.log(`Checking ${blobNamesToCheck.length} blobs with server`);
387
+ const missingBlobNames = await this.findMissingBlobs(blobNamesToCheck);
388
+ const missingBlobSet = new Set(missingBlobNames);
389
+ this.log(`Server is missing ${missingBlobNames.length} blobs`);
390
+ // Categorize files
391
+ const { newlyUploaded, alreadyOnServer } = this.categorizeFiles(newBlobEntries, missingBlobSet);
392
+ // Upload only missing files
393
+ const filesToActuallyUpload = filesToUpload.filter((file) => missingBlobSet.has(file.blobName));
394
+ if (filesToActuallyUpload.length > 0) {
395
+ this.log(`Uploading ${filesToActuallyUpload.length} files to backend`);
396
+ await this.batchUploadFiles(filesToActuallyUpload);
397
+ this.log("Upload complete");
398
+ }
399
+ // Update blob tracking state
400
+ for (const [path, blobName] of newBlobEntries) {
401
+ this.pendingAdded.add(blobName);
402
+ this.pendingDeleted.delete(blobName);
403
+ this.blobMap.set(path, blobName);
404
+ }
405
+ await this.maybeCheckpoint();
406
+ return {
407
+ newlyUploaded,
408
+ alreadyUploaded: [...alreadyUploaded, ...alreadyOnServer],
409
+ };
410
+ }
411
+ /**
412
+ * Remove paths from the index
413
+ */
414
+ async removeFromIndex(paths) {
415
+ return await this.mutex.runExclusive(() => this.doRemoveFromIndex(paths));
416
+ }
417
+ /**
418
+ * Internal implementation of removeFromIndex
419
+ */
420
+ async doRemoveFromIndex(paths) {
421
+ for (const path of paths) {
422
+ const blobName = this.blobMap.get(path);
423
+ if (blobName) {
424
+ if (this.pendingAdded.has(blobName)) {
425
+ this.pendingAdded.delete(blobName);
426
+ }
427
+ else {
428
+ this.pendingDeleted.add(blobName);
429
+ }
430
+ this.blobMap.delete(path);
431
+ }
432
+ }
433
+ await this.maybeCheckpoint();
434
+ }
435
+ /**
436
+ * Clear the entire index
437
+ */
438
+ async clearIndex() {
439
+ return await this.mutex.runExclusive(() => this.doClearIndex());
440
+ }
441
+ /**
442
+ * Internal implementation of clearIndex
443
+ */
444
+ doClearIndex() {
445
+ this.log(`Clearing index (${this.blobMap.size} files)`);
446
+ this.checkpointId = undefined;
447
+ this.blobMap.clear();
448
+ this.pendingAdded.clear();
449
+ this.pendingDeleted.clear();
450
+ this.log("Index cleared");
451
+ return Promise.resolve();
452
+ }
453
+ /**
454
+ * Wait for specific blobs to be indexed on the backend
455
+ *
456
+ * This method is serialized via pollingMutex to prevent unbounded concurrent
457
+ * polling requests to the backend.
458
+ */
459
+ waitForSpecificBlobs(blobNames) {
460
+ return this.pollingMutex.runExclusive(async () => {
461
+ if (blobNames.length === 0) {
462
+ this.log("No blobs to wait for");
463
+ return;
464
+ }
465
+ this.log(`Waiting for ${blobNames.length} blobs to be indexed on backend`);
466
+ const initialPollIntervalMs = 3000;
467
+ const backoffThresholdMs = 60000;
468
+ const backoffPollIntervalMs = 60000;
469
+ const maxWaitTimeMs = 600000;
470
+ const startTime = Date.now();
471
+ while (true) {
472
+ // Check for blobs that are not yet indexed (either not uploaded or uploaded but not indexed)
473
+ const stillPending = await this.findMissingBlobs(blobNames, true);
474
+ if (stillPending.length === 0) {
475
+ this.log("All blobs indexed successfully");
476
+ return;
477
+ }
478
+ const elapsedMs = Date.now() - startTime;
479
+ this.log(`Still waiting for ${stillPending.length} blobs to be indexed (elapsed: ${Math.round(elapsedMs / 1000)}s)`);
480
+ if (elapsedMs >= maxWaitTimeMs) {
481
+ throw new Error(`Indexing timeout: Backend did not finish indexing within ${maxWaitTimeMs / 1000} seconds`);
482
+ }
483
+ const pollIntervalMs = elapsedMs < backoffThresholdMs
484
+ ? initialPollIntervalMs
485
+ : backoffPollIntervalMs;
486
+ await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
487
+ }
488
+ });
489
+ }
490
+ /**
491
+ * Wait for all indexed files to be fully indexed on the backend.
492
+ *
493
+ * This method polls the backend until all files that have been added to the index
494
+ * are confirmed to be indexed and searchable.
495
+ *
496
+ * @returns Promise that resolves when all files are indexed
497
+ * @throws Error if indexing times out (default: 10 minutes)
498
+ */
499
+ async waitForIndexing() {
500
+ const blobNames = Array.from(this.blobMap.values());
501
+ await this.waitForSpecificBlobs(blobNames);
502
+ }
503
+ /**
504
+ * Search the codebase using natural language and return formatted results.
505
+ *
506
+ * The results are returned as a formatted string designed for use in LLM prompts.
507
+ * The format includes file paths, line numbers, and code content in a structured,
508
+ * readable format that can be passed directly to LLM APIs like `generate()`.
509
+ *
510
+ * Note: This method does not wait for indexing. Ensure files are indexed before
511
+ * searching by either:
512
+ * - Using `addToIndex()` with `waitForIndexing: true` (default)
513
+ * - Calling `waitForIndexing()` explicitly before searching
514
+ *
515
+ * @param query - The search query describing what code you're looking for
516
+ * @param options - Optional search options
517
+ * @param options.maxOutputLength - Maximum character length of the formatted output (default: 20000, max: 80000)
518
+ * @returns A formatted string containing the search results, ready for LLM consumption
519
+ */
520
+ async search(query, options) {
521
+ this.log(`Searching for: "${query}"`);
522
+ if (this.blobMap.size === 0) {
523
+ throw new Error("Index not initialized. Add files to index first using addToIndex().");
524
+ }
525
+ const blobs = {
526
+ checkpointId: this.checkpointId,
527
+ addedBlobs: Array.from(this.pendingAdded).sort(),
528
+ deletedBlobs: Array.from(this.pendingDeleted).sort(),
529
+ };
530
+ this.log(`Executing search with checkpoint ${this.checkpointId || "(none)"}, ${this.blobMap.size} indexed files`);
531
+ const requestId = this.apiClient.createRequestId();
532
+ const result = await this.apiClient.agentCodebaseRetrieval(requestId, query, blobs, options?.maxOutputLength);
533
+ this.log("Search completed successfully");
534
+ return result.formattedRetrieval;
535
+ }
536
+ /**
537
+ * Search the indexed codebase and ask an LLM a question about the results.
538
+ *
539
+ * This is a convenience method that combines search() with an LLM call to answer
540
+ * questions about your codebase.
541
+ *
542
+ * Note: This method does not wait for indexing. Ensure files are indexed before
543
+ * searching by either:
544
+ * - Using `addToIndex()` with `waitForIndexing: true` (default)
545
+ * - Calling `waitForIndexing()` explicitly before searching
546
+ *
547
+ * @param searchQuery - The semantic search query to find relevant code (also used as the prompt if no separate prompt is provided)
548
+ * @param prompt - Optional prompt to ask the LLM about the search results. If not provided, searchQuery is used as the prompt.
549
+ * @returns The LLM's answer to your question
550
+ *
551
+ * @example
552
+ * ```typescript
553
+ * const answer = await context.searchAndAsk(
554
+ * "How does the authentication flow work?"
555
+ * );
556
+ * console.log(answer);
557
+ * ```
558
+ */
559
+ async searchAndAsk(searchQuery, prompt) {
560
+ const results = await this.search(searchQuery);
561
+ const llmPrompt = formatSearchPrompt(prompt ?? searchQuery, results);
562
+ return await this.apiClient.chat(llmPrompt);
563
+ }
564
+ /**
565
+ * Export the current state to a JSON object
566
+ */
567
+ export() {
568
+ // Convert blobMap to array of [blobName, path] tuples
569
+ const blobs = [];
570
+ for (const [path, blobName] of this.blobMap.entries()) {
571
+ blobs.push([blobName, path]);
572
+ }
573
+ // Export pending added blobs (blobs added since last checkpoint)
574
+ const addedBlobs = Array.from(this.pendingAdded);
575
+ // Export pending deleted blobs (blobs deleted since last checkpoint)
576
+ const deletedBlobs = Array.from(this.pendingDeleted);
577
+ return {
578
+ checkpointId: this.checkpointId,
579
+ addedBlobs,
580
+ deletedBlobs,
581
+ blobs,
582
+ };
583
+ }
584
+ /**
585
+ * Internal method to import state from a JSON object
586
+ */
587
+ async doImport(state) {
588
+ return await this.mutex.runExclusive(() => {
589
+ this.checkpointId = state.checkpointId;
590
+ this.blobMap.clear();
591
+ this.pendingAdded.clear();
592
+ this.pendingDeleted.clear();
593
+ // Restore blobMap from blobs array [blobName, path]
594
+ if (state.blobs) {
595
+ for (const [blobName, path] of state.blobs) {
596
+ this.blobMap.set(path, blobName);
597
+ }
598
+ }
599
+ // Restore pending added blobs - directly copy the array to set
600
+ if (state.addedBlobs && state.addedBlobs.length > 0) {
601
+ this.pendingAdded = new Set(state.addedBlobs);
602
+ }
603
+ // Restore pending deleted blobs - directly copy the array to set
604
+ if (state.deletedBlobs && state.deletedBlobs.length > 0) {
605
+ this.pendingDeleted = new Set(state.deletedBlobs);
606
+ }
607
+ this.log(`State imported: checkpoint ${this.checkpointId}, ${this.blobMap.size} files, ${this.pendingAdded.size} pending added, ${this.pendingDeleted.size} pending deleted`);
608
+ });
609
+ }
610
+ /**
611
+ * Export state to a file (Node.js only)
612
+ */
613
+ async exportToFile(filePath) {
614
+ const state = this.export();
615
+ await writeFile(filePath, JSON.stringify(state, null, 2), "utf-8");
616
+ this.log(`State saved to ${filePath}`);
617
+ }
618
+ }
619
+ DirectContext.MAX_FILE_SIZE_BYTES = 1048576; // 1MB
620
+ DirectContext.MAX_BATCH_UPLOAD_SIZE = 1000;
621
+ DirectContext.MAX_BATCH_CONTENT_BYTES = 2 * 1024 * 1024; // 2MB
622
+ DirectContext.MAX_FIND_MISSING_SIZE = 1000;
623
+ DirectContext.CHECKPOINT_THRESHOLD = 1000;
624
+ //# sourceMappingURL=direct-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direct-context.js","sourceRoot":"","sources":["../../src/context/direct-context.ts"],"names":[],"mappings":"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"}