memorix 1.8.8 → 1.9.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 (66) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +15 -1
  3. package/README.zh-CN.md +15 -1
  4. package/dist/cli/index.js +3722 -1599
  5. package/dist/cli/memcode.js +0 -0
  6. package/dist/index.js +634 -363
  7. package/dist/maintenance-runner.js +285 -103
  8. package/dist/media-audio-runner.js +285 -103
  9. package/dist/media-video-runner.js +285 -103
  10. package/dist/memcode-runtime/CHANGELOG.md +36 -0
  11. package/dist/sdk.js +627 -356
  12. package/dist/vector-backfill-runner.d.ts +4 -1
  13. package/dist/vector-backfill-runner.js +288 -104
  14. package/docs/AGENT_OPERATOR_PLAYBOOK.md +4 -2
  15. package/docs/API_REFERENCE.md +14 -0
  16. package/docs/CONFIGURATION.md +46 -0
  17. package/docs/DEVELOPMENT.md +2 -2
  18. package/docs/INTEGRATIONS.md +1 -0
  19. package/docs/MULTI-DEVICE-SYNC-RESEARCH.md +344 -0
  20. package/docs/PERFORMANCE.md +32 -0
  21. package/docs/README.md +4 -2
  22. package/docs/hooks-architecture.md +18 -13
  23. package/llms-full.txt +4 -1
  24. package/llms.txt +3 -1
  25. package/package.json +2 -1
  26. package/plugins/antigravity/memorix/plugin.json +1 -1
  27. package/plugins/claude/memorix/.claude-plugin/plugin.json +1 -1
  28. package/plugins/codebuddy/memorix/.codebuddy-plugin/plugin.json +1 -1
  29. package/plugins/codex/memorix/.codex-plugin/plugin.json +1 -1
  30. package/plugins/copilot/memorix/plugin.json +1 -1
  31. package/plugins/gemini/memorix/gemini-extension.json +1 -1
  32. package/plugins/hermes/memorix/plugin.yaml +1 -1
  33. package/plugins/omp/memorix/package.json +1 -1
  34. package/plugins/openclaw/memorix/.codex-plugin/plugin.json +1 -1
  35. package/plugins/pi/memorix/package.json +1 -1
  36. package/server.json +2 -2
  37. package/src/cli/command-guide.ts +9 -1
  38. package/src/cli/commands/agent-integrations.ts +2 -1
  39. package/src/cli/commands/hooks-install.ts +2 -0
  40. package/src/cli/commands/integrate.ts +2 -0
  41. package/src/cli/commands/serve-http.ts +11 -0
  42. package/src/cli/commands/setup.ts +11 -4
  43. package/src/cli/commands/sync-store.ts +191 -0
  44. package/src/cli/commands/sync.ts +8 -0
  45. package/src/hooks/handler.ts +6 -0
  46. package/src/hooks/installers/index.ts +181 -6
  47. package/src/hooks/normalizer.ts +60 -1
  48. package/src/hooks/types.ts +3 -1
  49. package/src/integrations/registry.ts +9 -0
  50. package/src/memory/observations.ts +15 -2
  51. package/src/runtime/maintenance-targets.ts +6 -0
  52. package/src/runtime/vector-backfill-runner.ts +185 -7
  53. package/src/store/orama-store.ts +85 -102
  54. package/src/sync/adapters/fs.ts +179 -0
  55. package/src/sync/adapters/github.ts +258 -0
  56. package/src/sync/adapters/object-store.ts +267 -0
  57. package/src/sync/adapters/postgres.ts +269 -0
  58. package/src/sync/engine.ts +353 -0
  59. package/src/sync/journal.ts +162 -0
  60. package/src/sync/merge.ts +116 -0
  61. package/src/sync/namespace.ts +15 -0
  62. package/src/sync/paging.ts +45 -0
  63. package/src/sync/policy.ts +37 -0
  64. package/src/sync/remote-factory.ts +49 -0
  65. package/src/sync/store-port.ts +288 -0
  66. package/src/sync/types.ts +183 -0
package/dist/sdk.js CHANGED
@@ -4205,7 +4205,7 @@ function toProviderInput(input, baseUrl) {
4205
4205
  return { type: input.modality, url: input.url };
4206
4206
  }
4207
4207
  function parseCacheJsonInWorker(filePath) {
4208
- return new Promise((resolve4, reject) => {
4208
+ return new Promise((resolve5, reject) => {
4209
4209
  void import("worker_threads").then(({ Worker }) => {
4210
4210
  const worker = new Worker(
4211
4211
  `
@@ -4226,7 +4226,7 @@ function parseCacheJsonInWorker(filePath) {
4226
4226
  worker.once("message", (msg) => {
4227
4227
  void worker.terminate();
4228
4228
  if (msg?.ok && Array.isArray(msg.entries)) {
4229
- resolve4(msg.entries);
4229
+ resolve5(msg.entries);
4230
4230
  return;
4231
4231
  }
4232
4232
  reject(new Error(msg?.error || "embedding cache worker parse failed"));
@@ -4290,8 +4290,8 @@ async function streamJsonArrayToJsonl(filePath, tmpPath) {
4290
4290
  let count2 = 0;
4291
4291
  const writeLine = async (line) => {
4292
4292
  if (!out.write(line)) {
4293
- await new Promise((resolve4, reject) => {
4294
- out.once("drain", resolve4);
4293
+ await new Promise((resolve5, reject) => {
4294
+ out.once("drain", resolve5);
4295
4295
  out.once("error", reject);
4296
4296
  });
4297
4297
  }
@@ -4323,7 +4323,7 @@ async function streamJsonArrayToJsonl(filePath, tmpPath) {
4323
4323
  `);
4324
4324
  count2 += 1;
4325
4325
  if (count2 % 50 === 0) {
4326
- await new Promise((resolve4) => setImmediate(resolve4));
4326
+ await new Promise((resolve5) => setImmediate(resolve5));
4327
4327
  }
4328
4328
  }
4329
4329
  }
@@ -4332,8 +4332,8 @@ async function streamJsonArrayToJsonl(filePath, tmpPath) {
4332
4332
  }
4333
4333
  }
4334
4334
  } finally {
4335
- await new Promise((resolve4, reject) => {
4336
- out.end(() => resolve4());
4335
+ await new Promise((resolve5, reject) => {
4336
+ out.end(() => resolve5());
4337
4337
  out.once("error", reject);
4338
4338
  });
4339
4339
  }
@@ -4378,7 +4378,7 @@ async function loadCacheJsonl(filePath) {
4378
4378
  } catch {
4379
4379
  }
4380
4380
  if (onDiskCount % 250 === 0) {
4381
- await new Promise((resolve4) => setImmediate(resolve4));
4381
+ await new Promise((resolve5) => setImmediate(resolve5));
4382
4382
  }
4383
4383
  }
4384
4384
  diskCacheEntryCount = onDiskCount;
@@ -4623,7 +4623,7 @@ async function saveDiskCacheNow() {
4623
4623
  return;
4624
4624
  }
4625
4625
  const tmpPath = `${jsonlPath}.tmp`;
4626
- await new Promise((resolve4, reject) => {
4626
+ await new Promise((resolve5, reject) => {
4627
4627
  const out = createWriteStream(tmpPath);
4628
4628
  const entries = cache3.entries();
4629
4629
  const writeBatch = () => {
@@ -4642,7 +4642,7 @@ async function saveDiskCacheNow() {
4642
4642
  }
4643
4643
  setImmediate(writeBatch);
4644
4644
  };
4645
- out.on("finish", resolve4);
4645
+ out.on("finish", resolve5);
4646
4646
  out.on("error", reject);
4647
4647
  writeBatch();
4648
4648
  });
@@ -4746,7 +4746,7 @@ function abortError() {
4746
4746
  }
4747
4747
  function raceWithAbort(promise, signal) {
4748
4748
  if (signal.aborted) return Promise.reject(abortError());
4749
- return new Promise((resolve4, reject) => {
4749
+ return new Promise((resolve5, reject) => {
4750
4750
  const onAbort = () => {
4751
4751
  signal.removeEventListener("abort", onAbort);
4752
4752
  reject(abortError());
@@ -4755,7 +4755,7 @@ function raceWithAbort(promise, signal) {
4755
4755
  promise.then(
4756
4756
  (value) => {
4757
4757
  signal.removeEventListener("abort", onAbort);
4758
- resolve4(value);
4758
+ resolve5(value);
4759
4759
  },
4760
4760
  (error) => {
4761
4761
  signal.removeEventListener("abort", onAbort);
@@ -4766,12 +4766,12 @@ function raceWithAbort(promise, signal) {
4766
4766
  }
4767
4767
  async function waitForRetry(waitMs, signal) {
4768
4768
  if (!signal) {
4769
- await new Promise((resolve4) => setTimeout(resolve4, waitMs));
4769
+ await new Promise((resolve5) => setTimeout(resolve5, waitMs));
4770
4770
  return;
4771
4771
  }
4772
4772
  const abortSignal = signal;
4773
4773
  if (abortSignal.aborted) throw new Error("Embedding API retry aborted");
4774
- await new Promise((resolve4, reject) => {
4774
+ await new Promise((resolve5, reject) => {
4775
4775
  const timer = setTimeout(done, waitMs);
4776
4776
  const onAbort = () => {
4777
4777
  clearTimeout(timer);
@@ -4780,7 +4780,7 @@ async function waitForRetry(waitMs, signal) {
4780
4780
  };
4781
4781
  function done() {
4782
4782
  abortSignal.removeEventListener("abort", onAbort);
4783
- resolve4();
4783
+ resolve5();
4784
4784
  }
4785
4785
  abortSignal.addEventListener("abort", onAbort, { once: true });
4786
4786
  });
@@ -6589,12 +6589,12 @@ var init_policy = __esm({
6589
6589
 
6590
6590
  // src/timeout.ts
6591
6591
  function withTimeout(promise, ms, label) {
6592
- return new Promise((resolve4, reject) => {
6592
+ return new Promise((resolve5, reject) => {
6593
6593
  const timer = setTimeout(() => reject(new Error(`${label} timed out after ${ms}ms`)), ms);
6594
6594
  promise.then(
6595
6595
  (value) => {
6596
6596
  clearTimeout(timer);
6597
- resolve4(value);
6597
+ resolve5(value);
6598
6598
  },
6599
6599
  (error) => {
6600
6600
  clearTimeout(timer);
@@ -6606,7 +6606,7 @@ function withTimeout(promise, ms, label) {
6606
6606
  function withTimeoutSignal(operation, ms, label, parentSignal) {
6607
6607
  const controller = new AbortController();
6608
6608
  const signal = parentSignal ? AbortSignal.any([parentSignal, controller.signal]) : controller.signal;
6609
- return new Promise((resolve4, reject) => {
6609
+ return new Promise((resolve5, reject) => {
6610
6610
  let settled = false;
6611
6611
  let timedOut = false;
6612
6612
  let timer;
@@ -6643,7 +6643,7 @@ function withTimeoutSignal(operation, ms, label, parentSignal) {
6643
6643
  if (settled) return;
6644
6644
  settled = true;
6645
6645
  cleanup();
6646
- resolve4(value);
6646
+ resolve5(value);
6647
6647
  },
6648
6648
  (error) => {
6649
6649
  if (settled) return;
@@ -7280,6 +7280,14 @@ __export(orama_store_exports, {
7280
7280
  updateObservationMetadata: () => updateObservationMetadata
7281
7281
  });
7282
7282
  import { create, insert as insert2, insertMultiple, search, remove as remove2, update, count, getByID } from "@orama/orama";
7283
+ function rememberSearchMode(key, value) {
7284
+ if (!lastSearchModeByProject.has(key) && lastSearchModeByProject.size >= MAX_SEARCH_MODE_KEYS) {
7285
+ const oldest = lastSearchModeByProject.keys().next().value;
7286
+ if (oldest !== void 0) lastSearchModeByProject.delete(oldest);
7287
+ }
7288
+ lastSearchModeByProject.delete(key);
7289
+ lastSearchModeByProject.set(key, value);
7290
+ }
7283
7291
  function getLastSearchMode(projectId) {
7284
7292
  return lastSearchModeByProject.get(projectId ?? SEARCH_MODE_DEFAULT_KEY) ?? "fulltext";
7285
7293
  }
@@ -7292,9 +7300,6 @@ function makeEntryKey(projectId, observationId2) {
7292
7300
  function rememberObservationDoc(doc) {
7293
7301
  const publicDoc = { ...doc };
7294
7302
  delete publicDoc.embedding;
7295
- if (doc.projectId && typeof doc.observationId === "number") {
7296
- docByObservationKey.set(makeEntryKey(doc.projectId, doc.observationId), publicDoc);
7297
- }
7298
7303
  return publicDoc;
7299
7304
  }
7300
7305
  function isCommandLikeQuery(query) {
@@ -7398,7 +7403,6 @@ async function resetDb() {
7398
7403
  indexEmbeddingProvider = null;
7399
7404
  deferredCachedVectorHydration = null;
7400
7405
  lastSearchModeByProject.clear();
7401
- docByObservationKey.clear();
7402
7406
  }
7403
7407
  function isEmbeddingEnabled() {
7404
7408
  return embeddingEnabled;
@@ -7461,78 +7465,72 @@ function isCompatibleCachedVector(vector) {
7461
7465
  vector && embeddingDimensions !== null && vector.length === embeddingDimensions && vector.every(Number.isFinite)
7462
7466
  );
7463
7467
  }
7464
- async function attachCachedVectors(database, candidates) {
7465
- const cachedVectors = await getCachedEmbeddings(
7466
- candidates.map(({ observation }) => observationEmbeddingText(observation))
7467
- );
7468
- if (db !== database) return;
7469
- for (let index = 0; index < candidates.length; index++) {
7470
- const vector = cachedVectors[index];
7471
- if (!isCompatibleCachedVector(vector)) continue;
7472
- const existing = getByID(database, candidates[index].id);
7473
- if (!existing || documentEmbeddingText(existing) !== observationEmbeddingText(candidates[index].observation)) continue;
7474
- try {
7475
- await update(database, candidates[index].id, { ...existing, embedding: vector });
7476
- } catch {
7477
- }
7478
- if (index % 50 === 0) {
7479
- await new Promise((resolve4) => setImmediate(resolve4));
7468
+ async function attachCachedVectors(database, observations2) {
7469
+ const batchSize = 200;
7470
+ for (let start = 0; start < observations2.length; start += batchSize) {
7471
+ const batch = observations2.slice(start, start + batchSize);
7472
+ const cachedVectors = await getCachedEmbeddings(batch.map(observationEmbeddingText));
7473
+ if (db !== database) return;
7474
+ for (let index = 0; index < batch.length; index++) {
7475
+ const vector = cachedVectors[index];
7476
+ if (!isCompatibleCachedVector(vector)) continue;
7477
+ const id = makeOramaObservationId(batch[index].projectId, batch[index].id);
7478
+ const existing = getByID(database, id);
7479
+ if (!existing || documentEmbeddingText(existing) !== observationEmbeddingText(batch[index])) continue;
7480
+ try {
7481
+ await update(database, id, { ...existing, embedding: vector });
7482
+ } catch {
7483
+ }
7480
7484
  }
7485
+ await new Promise((resolve5) => setImmediate(resolve5));
7481
7486
  }
7482
7487
  }
7483
7488
  async function hydrateIndex(observations2, options = {}) {
7484
7489
  const database = await getDb({ allowNetworkProbe: options.allowNetworkProbe });
7485
- const candidates = [];
7486
- for (const observation of observations2) {
7487
- if (!observation || !observation.id || !observation.projectId) continue;
7488
- const id = makeOramaObservationId(observation.projectId, observation.id);
7489
- if (getByID(database, id)) continue;
7490
- candidates.push({ observation, id });
7491
- }
7492
7490
  const deferCachedVectors = options.deferCachedVectors === true && Boolean(indexEmbeddingProvider?.getCachedEmbeddings);
7493
- const cachedVectors = deferCachedVectors ? candidates.map(() => null) : await getCachedEmbeddings(candidates.map(({ observation }) => observationEmbeddingText(observation)));
7494
- const documents = [];
7495
- for (let index = 0; index < candidates.length; index++) {
7496
- const { observation: obs, id } = candidates[index];
7497
- try {
7498
- const vector = cachedVectors[index];
7499
- const compatibleVector = isCompatibleCachedVector(vector) ? vector : null;
7500
- const doc = {
7501
- id,
7502
- observationId: obs.id,
7503
- entityName: obs.entityName || "",
7504
- type: obs.type || "discovery",
7505
- title: obs.title || "",
7506
- narrative: obs.narrative || "",
7507
- facts: Array.isArray(obs.facts) ? obs.facts.join(" ") : "",
7508
- filesModified: Array.isArray(obs.filesModified) ? obs.filesModified.join(" ") : "",
7509
- concepts: Array.isArray(obs.concepts) ? obs.concepts.join(" ") : "",
7510
- tokens: obs.tokens ?? 0,
7511
- createdAt: obs.createdAt || "",
7512
- projectId: obs.projectId,
7513
- accessCount: obs.accessCount ?? 0,
7514
- lastAccessedAt: obs.lastAccessedAt || "",
7515
- status: obs.status ?? "active",
7516
- source: obs.source || "agent",
7517
- sourceDetail: obs.sourceDetail ?? "",
7518
- valueCategory: obs.valueCategory ?? "",
7519
- admissionState: obs.admissionState ?? "",
7520
- admissionReason: obs.admissionReason ?? "",
7521
- visibility: obs.visibility ?? "project",
7522
- createdByAgentId: obs.createdByAgentId ?? "",
7523
- sharedWithAgentIds: JSON.stringify(obs.sharedWithAgentIds ?? []),
7524
- documentType: "observation",
7525
- knowledgeLayer: resolveKnowledgeLayer("observation", obs.sourceDetail, obs.source),
7526
- ...compatibleVector ? { embedding: compatibleVector } : {}
7527
- };
7528
- documents.push(doc);
7529
- } catch {
7530
- }
7531
- }
7532
7491
  let inserted = 0;
7533
7492
  const hydrationBatchSize = 200;
7534
- for (let start = 0; start < documents.length; start += hydrationBatchSize) {
7535
- const batch = documents.slice(start, start + hydrationBatchSize);
7493
+ for (let start = 0; start < observations2.length; start += hydrationBatchSize) {
7494
+ const batchObservations = observations2.slice(start, start + hydrationBatchSize).filter((observation) => observation && observation.id && observation.projectId).filter((observation) => !getByID(database, makeOramaObservationId(observation.projectId, observation.id)));
7495
+ if (batchObservations.length === 0) continue;
7496
+ const cachedVectors = deferCachedVectors || options.skipCachedVectors ? batchObservations.map(() => null) : await getCachedEmbeddings(batchObservations.map(observationEmbeddingText));
7497
+ const batch = [];
7498
+ for (let index = 0; index < batchObservations.length; index++) {
7499
+ const obs = batchObservations[index];
7500
+ try {
7501
+ const compatibleVector = isCompatibleCachedVector(cachedVectors[index]) ? cachedVectors[index] : null;
7502
+ batch.push({
7503
+ id: makeOramaObservationId(obs.projectId, obs.id),
7504
+ observationId: obs.id,
7505
+ entityName: obs.entityName || "",
7506
+ type: obs.type || "discovery",
7507
+ title: obs.title || "",
7508
+ narrative: obs.narrative || "",
7509
+ facts: Array.isArray(obs.facts) ? obs.facts.join(" ") : "",
7510
+ filesModified: Array.isArray(obs.filesModified) ? obs.filesModified.join(" ") : "",
7511
+ concepts: Array.isArray(obs.concepts) ? obs.concepts.join(" ") : "",
7512
+ tokens: obs.tokens ?? 0,
7513
+ createdAt: obs.createdAt || "",
7514
+ projectId: obs.projectId,
7515
+ accessCount: obs.accessCount ?? 0,
7516
+ lastAccessedAt: obs.lastAccessedAt || "",
7517
+ status: obs.status ?? "active",
7518
+ source: obs.source || "agent",
7519
+ sourceDetail: obs.sourceDetail ?? "",
7520
+ valueCategory: obs.valueCategory ?? "",
7521
+ admissionState: obs.admissionState ?? "",
7522
+ admissionReason: obs.admissionReason ?? "",
7523
+ visibility: obs.visibility ?? "project",
7524
+ createdByAgentId: obs.createdByAgentId ?? "",
7525
+ sharedWithAgentIds: JSON.stringify(obs.sharedWithAgentIds ?? []),
7526
+ documentType: "observation",
7527
+ knowledgeLayer: resolveKnowledgeLayer("observation", obs.sourceDetail, obs.source),
7528
+ ...compatibleVector ? { embedding: compatibleVector } : {}
7529
+ });
7530
+ } catch {
7531
+ }
7532
+ }
7533
+ if (batch.length === 0) continue;
7536
7534
  try {
7537
7535
  await insertMultiple(database, batch, batch.length);
7538
7536
  for (const doc of batch) rememberObservationDoc(doc);
@@ -7552,9 +7550,9 @@ async function hydrateIndex(observations2, options = {}) {
7552
7550
  }
7553
7551
  }
7554
7552
  }
7555
- await new Promise((resolve4) => setImmediate(resolve4));
7553
+ await new Promise((resolve5) => setImmediate(resolve5));
7556
7554
  }
7557
- deferredCachedVectorHydration = options.skipCachedVectors ? null : deferCachedVectors ? attachCachedVectors(database, candidates).catch(() => {
7555
+ deferredCachedVectorHydration = options.skipCachedVectors ? null : deferCachedVectors ? attachCachedVectors(database, observations2).catch(() => {
7558
7556
  }) : null;
7559
7557
  return inserted;
7560
7558
  }
@@ -7591,12 +7589,6 @@ async function updateObservationMetadata(projectId, observationId2, patch) {
7591
7589
  async function removeObservation(oramaId) {
7592
7590
  const database = await getDb();
7593
7591
  await remove2(database, oramaId);
7594
- for (const [key, doc] of docByObservationKey.entries()) {
7595
- if (doc.id === oramaId) {
7596
- docByObservationKey.delete(key);
7597
- break;
7598
- }
7599
- }
7600
7592
  }
7601
7593
  async function searchObservations(options) {
7602
7594
  const perf = !!process.env.MEMORIX_PERF;
@@ -7611,7 +7603,7 @@ async function searchObservations(options) {
7611
7603
  const modeKey = options.projectId ?? SEARCH_MODE_DEFAULT_KEY;
7612
7604
  const quality = options.quality ?? "balanced";
7613
7605
  const database = await getDb();
7614
- lastSearchModeByProject.set(
7606
+ rememberSearchMode(
7615
7607
  modeKey,
7616
7608
  quality === "fast" ? "fulltext (fast profile)" : embeddingEnabled ? "hybrid" : "fulltext"
7617
7609
  );
@@ -7678,7 +7670,7 @@ async function searchObservations(options) {
7678
7670
  if (provider2) {
7679
7671
  const activeVectorDimensions = getVectorDimensions();
7680
7672
  if (activeVectorDimensions !== null && provider2.dimensions !== activeVectorDimensions) {
7681
- lastSearchModeByProject.set(
7673
+ rememberSearchMode(
7682
7674
  modeKey,
7683
7675
  `fulltext (embedding dimension mismatch: provider ${provider2.dimensions}d vs index ${activeVectorDimensions}d)`
7684
7676
  );
@@ -7703,7 +7695,7 @@ async function searchObservations(options) {
7703
7695
  mark("embedding");
7704
7696
  const cjkRatio = (originalQuery.match(/[\u4e00-\u9fff\u3040-\u309f\u30a0-\u30ff\uac00-\ud7af]/g) || []).length / originalQuery.length;
7705
7697
  const isCJKHeavy = cjkRatio > 0.3;
7706
- lastSearchModeByProject.set(modeKey, "hybrid");
7698
+ rememberSearchMode(modeKey, "hybrid");
7707
7699
  searchParams = {
7708
7700
  ...searchParams,
7709
7701
  mode: "hybrid",
@@ -7719,7 +7711,7 @@ async function searchObservations(options) {
7719
7711
  }
7720
7712
  }
7721
7713
  } catch (error) {
7722
- lastSearchModeByProject.set(modeKey, "fulltext (embedding unavailable)");
7714
+ rememberSearchMode(modeKey, "fulltext (embedding unavailable)");
7723
7715
  console.error("[memorix] Embedding failed or timed out, falling back to fulltext search");
7724
7716
  }
7725
7717
  }
@@ -7729,7 +7721,7 @@ async function searchObservations(options) {
7729
7721
  results = await search(database, searchParams);
7730
7722
  } catch (error) {
7731
7723
  if (queryVector && isVectorDimensionMismatchError(error)) {
7732
- lastSearchModeByProject.set(modeKey, "fulltext (embedding dimension mismatch)");
7724
+ rememberSearchMode(modeKey, "fulltext (embedding dimension mismatch)");
7733
7725
  console.error("[memorix] Vector search dimension mismatch detected, retrying without embeddings");
7734
7726
  results = await search(database, stripVectorSearchParams(searchParams));
7735
7727
  } else {
@@ -7751,7 +7743,7 @@ async function searchObservations(options) {
7751
7743
  },
7752
7744
  similarity: 0.25
7753
7745
  };
7754
- lastSearchModeByProject.set(modeKey, "vector-only (hybrid empty fallback)");
7746
+ rememberSearchMode(modeKey, "vector-only (hybrid empty fallback)");
7755
7747
  results = await search(database, vectorOnlyParams);
7756
7748
  } catch {
7757
7749
  }
@@ -7992,7 +7984,7 @@ async function searchObservations(options) {
7992
7984
  const rerankedTop = neural.map((row) => candidateMap.get(row.id)).filter((entry) => entry != null);
7993
7985
  if (rerankedTop.length > 0) {
7994
7986
  intermediate = [...rerankedTop, ...intermediate.slice(RERANK_TOP_K)];
7995
- lastSearchModeByProject.set(modeKey, (lastSearchModeByProject.get(modeKey) ?? "fulltext") + " + neural rerank");
7987
+ rememberSearchMode(modeKey, (lastSearchModeByProject.get(modeKey) ?? "fulltext") + " + neural rerank");
7996
7988
  mark("rerank(usedNeural=true)");
7997
7989
  }
7998
7990
  }
@@ -8009,7 +8001,7 @@ async function searchObservations(options) {
8009
8001
  );
8010
8002
  mark(`rerank(usedLLM=${usedLLM})`);
8011
8003
  if (usedLLM) {
8012
- lastSearchModeByProject.set(modeKey, (lastSearchModeByProject.get(modeKey) ?? "fulltext") + " + LLM rerank");
8004
+ rememberSearchMode(modeKey, (lastSearchModeByProject.get(modeKey) ?? "fulltext") + " + LLM rerank");
8013
8005
  const rerankedTop = reranked.map((row) => candidateMap.get(row.id)).filter((entry) => entry != null);
8014
8006
  if (rerankedTop.length > 0) {
8015
8007
  intermediate = [...rerankedTop, ...intermediate.slice(RERANK_TOP_K)];
@@ -8082,13 +8074,6 @@ async function getObservationsByIds(ids, projectId) {
8082
8074
  const database = await getDb();
8083
8075
  const results = [];
8084
8076
  for (const id of ids) {
8085
- if (projectId) {
8086
- const cached = docByObservationKey.get(makeEntryKey(projectId, id));
8087
- if (cached) {
8088
- results.push(cached);
8089
- continue;
8090
- }
8091
- }
8092
8077
  const searchResult = await search(database, {
8093
8078
  term: "",
8094
8079
  includeVectors: true,
@@ -8188,7 +8173,7 @@ function formatTime(isoDate) {
8188
8173
  return isoDate;
8189
8174
  }
8190
8175
  }
8191
- var db, dbInitPromise, dbGeneration, embeddingEnabled, embeddingDimensions, indexEmbeddingProvider, deferredCachedVectorHydration, docByObservationKey, NON_CJK_HYBRID_SIMILARITY, lastSearchModeByProject, SEARCH_MODE_DEFAULT_KEY, COMMAND_LOG_TITLE2, COMMAND_STYLE_TITLE, COMMAND_LIKE_QUERY2, COMMAND_INTENT_QUERY, NATURAL_LANGUAGE_MARKERS;
8176
+ var db, dbInitPromise, dbGeneration, embeddingEnabled, embeddingDimensions, indexEmbeddingProvider, deferredCachedVectorHydration, NON_CJK_HYBRID_SIMILARITY, lastSearchModeByProject, SEARCH_MODE_DEFAULT_KEY, MAX_SEARCH_MODE_KEYS, COMMAND_LOG_TITLE2, COMMAND_STYLE_TITLE, COMMAND_LIKE_QUERY2, COMMAND_INTENT_QUERY, NATURAL_LANGUAGE_MARKERS;
8192
8177
  var init_orama_store = __esm({
8193
8178
  "src/store/orama-store.ts"() {
8194
8179
  "use strict";
@@ -8209,10 +8194,10 @@ var init_orama_store = __esm({
8209
8194
  embeddingDimensions = null;
8210
8195
  indexEmbeddingProvider = null;
8211
8196
  deferredCachedVectorHydration = null;
8212
- docByObservationKey = /* @__PURE__ */ new Map();
8213
8197
  NON_CJK_HYBRID_SIMILARITY = 0.45;
8214
8198
  lastSearchModeByProject = /* @__PURE__ */ new Map();
8215
8199
  SEARCH_MODE_DEFAULT_KEY = "__global__";
8200
+ MAX_SEARCH_MODE_KEYS = 4096;
8216
8201
  COMMAND_LOG_TITLE2 = /^(Ran:|Command:|Executed:)\s/i;
8217
8202
  COMMAND_STYLE_TITLE = /(\bfindstr\b|\bSelect-String\b|\bGet-Content\b|\bnpx\s+vitest\b|\bnpx\s+tsc\b|\b2>&1\b)/i;
8218
8203
  COMMAND_LIKE_QUERY2 = /\b(git|npm|npx|pnpm|yarn|node|bash|powershell|curl|memorix)\b/i;
@@ -9640,6 +9625,60 @@ var init_evidence_store = __esm({
9640
9625
  }
9641
9626
  });
9642
9627
 
9628
+ // src/runtime/maintenance-targets.ts
9629
+ var maintenance_targets_exports = {};
9630
+ __export(maintenance_targets_exports, {
9631
+ MaintenanceTargetStore: () => MaintenanceTargetStore
9632
+ });
9633
+ function rowToTarget(row) {
9634
+ return {
9635
+ projectId: row.project_id,
9636
+ projectRoot: row.project_root,
9637
+ dataDir: row.data_dir,
9638
+ updatedAt: Number(row.updated_at)
9639
+ };
9640
+ }
9641
+ var MaintenanceTargetStore;
9642
+ var init_maintenance_targets = __esm({
9643
+ "src/runtime/maintenance-targets.ts"() {
9644
+ "use strict";
9645
+ init_esm_shims();
9646
+ init_sqlite_db();
9647
+ MaintenanceTargetStore = class {
9648
+ db;
9649
+ constructor(dataDir) {
9650
+ this.db = getDatabase(dataDir);
9651
+ }
9652
+ register(input) {
9653
+ if (!input.projectId.trim()) throw new Error("Maintenance target requires a project ID");
9654
+ if (!input.projectRoot.trim()) throw new Error("Maintenance target requires a project root");
9655
+ if (!input.dataDir.trim()) throw new Error("Maintenance target requires a data directory");
9656
+ const now3 = input.now ?? Date.now();
9657
+ this.db.prepare(`
9658
+ INSERT INTO maintenance_targets (project_id, project_root, data_dir, updated_at)
9659
+ VALUES (?, ?, ?, ?)
9660
+ ON CONFLICT(project_id) DO UPDATE SET
9661
+ project_root = excluded.project_root,
9662
+ data_dir = excluded.data_dir,
9663
+ updated_at = excluded.updated_at
9664
+ `).run(input.projectId, input.projectRoot, input.dataDir, now3);
9665
+ return this.get(input.projectId);
9666
+ }
9667
+ get(projectId) {
9668
+ const row = this.db.prepare(`
9669
+ SELECT * FROM maintenance_targets WHERE project_id = ?
9670
+ `).get(projectId);
9671
+ return row ? rowToTarget(row) : void 0;
9672
+ }
9673
+ list() {
9674
+ return this.db.prepare(`
9675
+ SELECT * FROM maintenance_targets ORDER BY updated_at DESC
9676
+ `).all().map(rowToTarget);
9677
+ }
9678
+ };
9679
+ }
9680
+ });
9681
+
9643
9682
  // src/runtime/isolated-maintenance.ts
9644
9683
  import { spawn } from "child_process";
9645
9684
  import { existsSync as existsSync8 } from "fs";
@@ -9697,7 +9736,7 @@ function validateRequest(request) {
9697
9736
  }
9698
9737
  }
9699
9738
  function collectOutput(stream2, limit2, onOverflow) {
9700
- return new Promise((resolve4, reject) => {
9739
+ return new Promise((resolve5, reject) => {
9701
9740
  let value = "";
9702
9741
  let size = 0;
9703
9742
  stream2.setEncoding("utf8");
@@ -9711,7 +9750,7 @@ function collectOutput(stream2, limit2, onOverflow) {
9711
9750
  value += chunk;
9712
9751
  });
9713
9752
  stream2.on("error", reject);
9714
- stream2.on("end", () => resolve4(value));
9753
+ stream2.on("end", () => resolve5(value));
9715
9754
  });
9716
9755
  }
9717
9756
  async function runMaintenanceInChildProcess(request, options = {}) {
@@ -9722,7 +9761,7 @@ async function runMaintenanceInChildProcess(request, options = {}) {
9722
9761
  }
9723
9762
  const timeoutMs = Number.isFinite(options.timeoutMs) ? Math.max(1e3, Math.floor(options.timeoutMs)) : DEFAULT_TIMEOUT_MS;
9724
9763
  const env2 = { ...process.env, ...options.env };
9725
- return new Promise((resolve4, reject) => {
9764
+ return new Promise((resolve5, reject) => {
9726
9765
  let settled = false;
9727
9766
  let child;
9728
9767
  try {
@@ -9762,7 +9801,7 @@ async function runMaintenanceInChildProcess(request, options = {}) {
9762
9801
  )));
9763
9802
  return;
9764
9803
  }
9765
- settle(() => resolve4(parseMaintenanceRunnerOutput(out)));
9804
+ settle(() => resolve5(parseMaintenanceRunnerOutput(out)));
9766
9805
  } catch (error) {
9767
9806
  settle(() => reject(error));
9768
9807
  }
@@ -19905,7 +19944,7 @@ var init_sleep = __esm({
19905
19944
  "node_modules/openai/internal/utils/sleep.mjs"() {
19906
19945
  "use strict";
19907
19946
  init_esm_shims();
19908
- sleep = (ms) => new Promise((resolve4) => setTimeout(resolve4, ms));
19947
+ sleep = (ms) => new Promise((resolve5) => setTimeout(resolve5, ms));
19909
19948
  }
19910
19949
  });
19911
19950
 
@@ -21094,8 +21133,8 @@ var init_api_promise = __esm({
21094
21133
  init_parse();
21095
21134
  APIPromise = class _APIPromise extends Promise {
21096
21135
  constructor(client, responsePromise, parseResponse2 = defaultParseResponse) {
21097
- super((resolve4) => {
21098
- resolve4(null);
21136
+ super((resolve5) => {
21137
+ resolve5(null);
21099
21138
  });
21100
21139
  this.responsePromise = responsePromise;
21101
21140
  this.parseResponse = parseResponse2;
@@ -21739,12 +21778,12 @@ var init_EventStream = __esm({
21739
21778
  _EventStream_errored.set(this, false);
21740
21779
  _EventStream_aborted.set(this, false);
21741
21780
  _EventStream_catchingPromiseCreated.set(this, false);
21742
- __classPrivateFieldSet(this, _EventStream_connectedPromise, new Promise((resolve4, reject) => {
21743
- __classPrivateFieldSet(this, _EventStream_resolveConnectedPromise, resolve4, "f");
21781
+ __classPrivateFieldSet(this, _EventStream_connectedPromise, new Promise((resolve5, reject) => {
21782
+ __classPrivateFieldSet(this, _EventStream_resolveConnectedPromise, resolve5, "f");
21744
21783
  __classPrivateFieldSet(this, _EventStream_rejectConnectedPromise, reject, "f");
21745
21784
  }), "f");
21746
- __classPrivateFieldSet(this, _EventStream_endPromise, new Promise((resolve4, reject) => {
21747
- __classPrivateFieldSet(this, _EventStream_resolveEndPromise, resolve4, "f");
21785
+ __classPrivateFieldSet(this, _EventStream_endPromise, new Promise((resolve5, reject) => {
21786
+ __classPrivateFieldSet(this, _EventStream_resolveEndPromise, resolve5, "f");
21748
21787
  __classPrivateFieldSet(this, _EventStream_rejectEndPromise, reject, "f");
21749
21788
  }), "f");
21750
21789
  __classPrivateFieldGet(this, _EventStream_connectedPromise, "f").catch(() => {
@@ -21828,11 +21867,11 @@ var init_EventStream = __esm({
21828
21867
  * const message = await stream.emitted('message') // rejects if the stream errors
21829
21868
  */
21830
21869
  emitted(event) {
21831
- return new Promise((resolve4, reject) => {
21870
+ return new Promise((resolve5, reject) => {
21832
21871
  __classPrivateFieldSet(this, _EventStream_catchingPromiseCreated, true, "f");
21833
21872
  if (event !== "error")
21834
21873
  this.once("error", reject);
21835
- this.once(event, resolve4);
21874
+ this.once(event, resolve5);
21836
21875
  });
21837
21876
  }
21838
21877
  async done() {
@@ -22901,7 +22940,7 @@ var init_ChatCompletionStream = __esm({
22901
22940
  if (done) {
22902
22941
  return { value: void 0, done: true };
22903
22942
  }
22904
- return new Promise((resolve4, reject) => readQueue.push({ resolve: resolve4, reject })).then((chunk2) => chunk2 ? { value: chunk2, done: false } : { value: void 0, done: true });
22943
+ return new Promise((resolve5, reject) => readQueue.push({ resolve: resolve5, reject })).then((chunk2) => chunk2 ? { value: chunk2, done: false } : { value: void 0, done: true });
22905
22944
  }
22906
22945
  const chunk = pushQueue.shift();
22907
22946
  return { value: chunk, done: false };
@@ -23884,7 +23923,7 @@ var init_AssistantStream = __esm({
23884
23923
  if (done) {
23885
23924
  return { value: void 0, done: true };
23886
23925
  }
23887
- return new Promise((resolve4, reject) => readQueue.push({ resolve: resolve4, reject })).then((chunk2) => chunk2 ? { value: chunk2, done: false } : { value: void 0, done: true });
23926
+ return new Promise((resolve5, reject) => readQueue.push({ resolve: resolve5, reject })).then((chunk2) => chunk2 ? { value: chunk2, done: false } : { value: void 0, done: true });
23888
23927
  }
23889
23928
  const chunk = pushQueue.shift();
23890
23929
  return { value: chunk, done: false };
@@ -26173,7 +26212,7 @@ var init_ResponseStream = __esm({
26173
26212
  if (done) {
26174
26213
  return { value: void 0, done: true };
26175
26214
  }
26176
- return new Promise((resolve4, reject) => readQueue.push({ resolve: resolve4, reject })).then((event2) => event2 ? { value: event2, done: false } : { value: void 0, done: true });
26215
+ return new Promise((resolve5, reject) => readQueue.push({ resolve: resolve5, reject })).then((event2) => event2 ? { value: event2, done: false } : { value: void 0, done: true });
26177
26216
  }
26178
26217
  const event = pushQueue.shift();
26179
26218
  return { value: event, done: false };
@@ -46383,8 +46422,8 @@ var init_event_stream = __esm({
46383
46422
  constructor(isComplete, extractResult) {
46384
46423
  this.isComplete = isComplete;
46385
46424
  this.extractResult = extractResult;
46386
- this.finalResultPromise = new Promise((resolve4) => {
46387
- this.resolveFinalResult = resolve4;
46425
+ this.finalResultPromise = new Promise((resolve5) => {
46426
+ this.resolveFinalResult = resolve5;
46388
46427
  });
46389
46428
  }
46390
46429
  push(event) {
@@ -46418,7 +46457,7 @@ var init_event_stream = __esm({
46418
46457
  } else if (this.done) {
46419
46458
  return;
46420
46459
  } else {
46421
- const result = await new Promise((resolve4) => this.waiting.push(resolve4));
46460
+ const result = await new Promise((resolve5) => this.waiting.push(resolve5));
46422
46461
  if (result.done)
46423
46462
  return;
46424
46463
  yield result.value;
@@ -46689,7 +46728,7 @@ var init_sleep2 = __esm({
46689
46728
  "node_modules/@anthropic-ai/sdk/internal/utils/sleep.mjs"() {
46690
46729
  "use strict";
46691
46730
  init_esm_shims();
46692
- sleep2 = (ms) => new Promise((resolve4) => setTimeout(resolve4, ms));
46731
+ sleep2 = (ms) => new Promise((resolve5) => setTimeout(resolve5, ms));
46693
46732
  }
46694
46733
  });
46695
46734
 
@@ -47489,8 +47528,8 @@ var init_api_promise2 = __esm({
47489
47528
  init_parse2();
47490
47529
  APIPromise2 = class _APIPromise extends Promise {
47491
47530
  constructor(client, responsePromise, parseResponse2 = defaultParseResponse2) {
47492
- super((resolve4) => {
47493
- resolve4(null);
47531
+ super((resolve5) => {
47532
+ resolve5(null);
47494
47533
  });
47495
47534
  this.responsePromise = responsePromise;
47496
47535
  this.parseResponse = parseResponse2;
@@ -49451,12 +49490,12 @@ var init_BetaMessageStream = __esm({
49451
49490
  }
49452
49491
  return this._emit("error", new AnthropicError(String(error)));
49453
49492
  });
49454
- __classPrivateFieldSet2(this, _BetaMessageStream_connectedPromise, new Promise((resolve4, reject) => {
49455
- __classPrivateFieldSet2(this, _BetaMessageStream_resolveConnectedPromise, resolve4, "f");
49493
+ __classPrivateFieldSet2(this, _BetaMessageStream_connectedPromise, new Promise((resolve5, reject) => {
49494
+ __classPrivateFieldSet2(this, _BetaMessageStream_resolveConnectedPromise, resolve5, "f");
49456
49495
  __classPrivateFieldSet2(this, _BetaMessageStream_rejectConnectedPromise, reject, "f");
49457
49496
  }), "f");
49458
- __classPrivateFieldSet2(this, _BetaMessageStream_endPromise, new Promise((resolve4, reject) => {
49459
- __classPrivateFieldSet2(this, _BetaMessageStream_resolveEndPromise, resolve4, "f");
49497
+ __classPrivateFieldSet2(this, _BetaMessageStream_endPromise, new Promise((resolve5, reject) => {
49498
+ __classPrivateFieldSet2(this, _BetaMessageStream_resolveEndPromise, resolve5, "f");
49460
49499
  __classPrivateFieldSet2(this, _BetaMessageStream_rejectEndPromise, reject, "f");
49461
49500
  }), "f");
49462
49501
  __classPrivateFieldGet2(this, _BetaMessageStream_connectedPromise, "f").catch(() => {
@@ -49626,11 +49665,11 @@ var init_BetaMessageStream = __esm({
49626
49665
  * const message = await stream.emitted('message') // rejects if the stream errors
49627
49666
  */
49628
49667
  emitted(event) {
49629
- return new Promise((resolve4, reject) => {
49668
+ return new Promise((resolve5, reject) => {
49630
49669
  __classPrivateFieldSet2(this, _BetaMessageStream_catchingPromiseCreated, true, "f");
49631
49670
  if (event !== "error")
49632
49671
  this.once("error", reject);
49633
- this.once(event, resolve4);
49672
+ this.once(event, resolve5);
49634
49673
  });
49635
49674
  }
49636
49675
  async done() {
@@ -49973,7 +50012,7 @@ var init_BetaMessageStream = __esm({
49973
50012
  if (done) {
49974
50013
  return { value: void 0, done: true };
49975
50014
  }
49976
- return new Promise((resolve4, reject) => readQueue.push({ resolve: resolve4, reject })).then((chunk2) => chunk2 ? { value: chunk2, done: false } : { value: void 0, done: true });
50015
+ return new Promise((resolve5, reject) => readQueue.push({ resolve: resolve5, reject })).then((chunk2) => chunk2 ? { value: chunk2, done: false } : { value: void 0, done: true });
49977
50016
  }
49978
50017
  const chunk = pushQueue.shift();
49979
50018
  return { value: chunk, done: false };
@@ -50048,13 +50087,13 @@ Wrap your summary in <summary></summary> tags.`;
50048
50087
 
50049
50088
  // node_modules/@anthropic-ai/sdk/lib/tools/BetaToolRunner.mjs
50050
50089
  function promiseWithResolvers() {
50051
- let resolve4;
50090
+ let resolve5;
50052
50091
  let reject;
50053
50092
  const promise = new Promise((res, rej) => {
50054
- resolve4 = res;
50093
+ resolve5 = res;
50055
50094
  reject = rej;
50056
50095
  });
50057
- return { promise, resolve: resolve4, reject };
50096
+ return { promise, resolve: resolve5, reject };
50058
50097
  }
50059
50098
  async function generateToolResponse(params, lastMessage = params.messages.at(-1), requestOptions) {
50060
50099
  if (!lastMessage || lastMessage.role !== "assistant" || !lastMessage.content || typeof lastMessage.content === "string") {
@@ -51912,12 +51951,12 @@ var init_MessageStream = __esm({
51912
51951
  }
51913
51952
  return this._emit("error", new AnthropicError(String(error)));
51914
51953
  });
51915
- __classPrivateFieldSet2(this, _MessageStream_connectedPromise, new Promise((resolve4, reject) => {
51916
- __classPrivateFieldSet2(this, _MessageStream_resolveConnectedPromise, resolve4, "f");
51954
+ __classPrivateFieldSet2(this, _MessageStream_connectedPromise, new Promise((resolve5, reject) => {
51955
+ __classPrivateFieldSet2(this, _MessageStream_resolveConnectedPromise, resolve5, "f");
51917
51956
  __classPrivateFieldSet2(this, _MessageStream_rejectConnectedPromise, reject, "f");
51918
51957
  }), "f");
51919
- __classPrivateFieldSet2(this, _MessageStream_endPromise, new Promise((resolve4, reject) => {
51920
- __classPrivateFieldSet2(this, _MessageStream_resolveEndPromise, resolve4, "f");
51958
+ __classPrivateFieldSet2(this, _MessageStream_endPromise, new Promise((resolve5, reject) => {
51959
+ __classPrivateFieldSet2(this, _MessageStream_resolveEndPromise, resolve5, "f");
51921
51960
  __classPrivateFieldSet2(this, _MessageStream_rejectEndPromise, reject, "f");
51922
51961
  }), "f");
51923
51962
  __classPrivateFieldGet2(this, _MessageStream_connectedPromise, "f").catch(() => {
@@ -52087,11 +52126,11 @@ var init_MessageStream = __esm({
52087
52126
  * const message = await stream.emitted('message') // rejects if the stream errors
52088
52127
  */
52089
52128
  emitted(event) {
52090
- return new Promise((resolve4, reject) => {
52129
+ return new Promise((resolve5, reject) => {
52091
52130
  __classPrivateFieldSet2(this, _MessageStream_catchingPromiseCreated, true, "f");
52092
52131
  if (event !== "error")
52093
52132
  this.once("error", reject);
52094
- this.once(event, resolve4);
52133
+ this.once(event, resolve5);
52095
52134
  });
52096
52135
  }
52097
52136
  async done() {
@@ -52409,7 +52448,7 @@ var init_MessageStream = __esm({
52409
52448
  if (done) {
52410
52449
  return { value: void 0, done: true };
52411
52450
  }
52412
- return new Promise((resolve4, reject) => readQueue.push({ resolve: resolve4, reject })).then((chunk2) => chunk2 ? { value: chunk2, done: false } : { value: void 0, done: true });
52451
+ return new Promise((resolve5, reject) => readQueue.push({ resolve: resolve5, reject })).then((chunk2) => chunk2 ? { value: chunk2, done: false } : { value: void 0, done: true });
52413
52452
  }
52414
52453
  const chunk = pushQueue.shift();
52415
52454
  return { value: chunk, done: false };
@@ -55787,7 +55826,7 @@ var require_p_retry = __commonJS({
55787
55826
  return error;
55788
55827
  };
55789
55828
  var isNetworkError = (errorMessage) => networkErrorMsgs.includes(errorMessage);
55790
- var pRetry2 = (input, options) => new Promise((resolve4, reject) => {
55829
+ var pRetry2 = (input, options) => new Promise((resolve5, reject) => {
55791
55830
  options = {
55792
55831
  onFailedAttempt: () => {
55793
55832
  },
@@ -55797,7 +55836,7 @@ var require_p_retry = __commonJS({
55797
55836
  const operation = retry2.operation(options);
55798
55837
  operation.attempt(async (attemptNumber) => {
55799
55838
  try {
55800
- resolve4(await input(attemptNumber));
55839
+ resolve5(await input(attemptNumber));
55801
55840
  } catch (error) {
55802
55841
  if (!(error instanceof Error)) {
55803
55842
  reject(new TypeError(`Non-error was thrown: "${error}". You should only throw errors.`));
@@ -56335,8 +56374,8 @@ var require_retry3 = __commonJS({
56335
56374
  }
56336
56375
  const delay2 = getNextRetryDelay(config);
56337
56376
  err.config.retryConfig.currentRetryAttempt += 1;
56338
- const backoff = config.retryBackoff ? config.retryBackoff(err, delay2) : new Promise((resolve4) => {
56339
- setTimeout(resolve4, delay2);
56377
+ const backoff = config.retryBackoff ? config.retryBackoff(err, delay2) : new Promise((resolve5) => {
56378
+ setTimeout(resolve5, delay2);
56340
56379
  });
56341
56380
  if (config.onRetryAttempt) {
56342
56381
  await config.onRetryAttempt(err);
@@ -57253,8 +57292,8 @@ var require_helpers = __commonJS({
57253
57292
  function req(url, opts = {}) {
57254
57293
  const href = typeof url === "string" ? url : url.href;
57255
57294
  const req2 = (href.startsWith("https:") ? https2 : http3).request(url, opts);
57256
- const promise = new Promise((resolve4, reject) => {
57257
- req2.once("response", resolve4).once("error", reject).end();
57295
+ const promise = new Promise((resolve5, reject) => {
57296
+ req2.once("response", resolve5).once("error", reject).end();
57258
57297
  });
57259
57298
  req2.then = promise.then.bind(promise);
57260
57299
  return req2;
@@ -57433,7 +57472,7 @@ var require_parse_proxy_response = __commonJS({
57433
57472
  var debug_1 = __importDefault(require_src());
57434
57473
  var debug = (0, debug_1.default)("https-proxy-agent:parse-proxy-response");
57435
57474
  function parseProxyResponse(socket) {
57436
- return new Promise((resolve4, reject) => {
57475
+ return new Promise((resolve5, reject) => {
57437
57476
  let buffersLength = 0;
57438
57477
  const buffers = [];
57439
57478
  function read() {
@@ -57499,7 +57538,7 @@ var require_parse_proxy_response = __commonJS({
57499
57538
  }
57500
57539
  debug("got proxy server response: %o %o", firstLine, headers);
57501
57540
  cleanup();
57502
- resolve4({
57541
+ resolve5({
57503
57542
  connect: {
57504
57543
  statusCode,
57505
57544
  statusText,
@@ -57746,7 +57785,7 @@ var require_ponyfill_es2018 = __commonJS({
57746
57785
  return new originalPromise(executor);
57747
57786
  }
57748
57787
  function promiseResolvedWith(value) {
57749
- return newPromise((resolve4) => resolve4(value));
57788
+ return newPromise((resolve5) => resolve5(value));
57750
57789
  }
57751
57790
  function promiseRejectedWith(reason) {
57752
57791
  return originalPromiseReject(reason);
@@ -57916,8 +57955,8 @@ var require_ponyfill_es2018 = __commonJS({
57916
57955
  return new TypeError("Cannot " + name + " a stream using a released reader");
57917
57956
  }
57918
57957
  function defaultReaderClosedPromiseInitialize(reader2) {
57919
- reader2._closedPromise = newPromise((resolve4, reject) => {
57920
- reader2._closedPromise_resolve = resolve4;
57958
+ reader2._closedPromise = newPromise((resolve5, reject) => {
57959
+ reader2._closedPromise_resolve = resolve5;
57921
57960
  reader2._closedPromise_reject = reject;
57922
57961
  });
57923
57962
  }
@@ -58091,8 +58130,8 @@ var require_ponyfill_es2018 = __commonJS({
58091
58130
  }
58092
58131
  let resolvePromise;
58093
58132
  let rejectPromise;
58094
- const promise = newPromise((resolve4, reject) => {
58095
- resolvePromise = resolve4;
58133
+ const promise = newPromise((resolve5, reject) => {
58134
+ resolvePromise = resolve5;
58096
58135
  rejectPromise = reject;
58097
58136
  });
58098
58137
  const readRequest = {
@@ -58197,8 +58236,8 @@ var require_ponyfill_es2018 = __commonJS({
58197
58236
  const reader2 = this._reader;
58198
58237
  let resolvePromise;
58199
58238
  let rejectPromise;
58200
- const promise = newPromise((resolve4, reject) => {
58201
- resolvePromise = resolve4;
58239
+ const promise = newPromise((resolve5, reject) => {
58240
+ resolvePromise = resolve5;
58202
58241
  rejectPromise = reject;
58203
58242
  });
58204
58243
  const readRequest = {
@@ -59217,8 +59256,8 @@ var require_ponyfill_es2018 = __commonJS({
59217
59256
  }
59218
59257
  let resolvePromise;
59219
59258
  let rejectPromise;
59220
- const promise = newPromise((resolve4, reject) => {
59221
- resolvePromise = resolve4;
59259
+ const promise = newPromise((resolve5, reject) => {
59260
+ resolvePromise = resolve5;
59222
59261
  rejectPromise = reject;
59223
59262
  });
59224
59263
  const readIntoRequest = {
@@ -59530,10 +59569,10 @@ var require_ponyfill_es2018 = __commonJS({
59530
59569
  wasAlreadyErroring = true;
59531
59570
  reason = void 0;
59532
59571
  }
59533
- const promise = newPromise((resolve4, reject) => {
59572
+ const promise = newPromise((resolve5, reject) => {
59534
59573
  stream2._pendingAbortRequest = {
59535
59574
  _promise: void 0,
59536
- _resolve: resolve4,
59575
+ _resolve: resolve5,
59537
59576
  _reject: reject,
59538
59577
  _reason: reason,
59539
59578
  _wasAlreadyErroring: wasAlreadyErroring
@@ -59550,9 +59589,9 @@ var require_ponyfill_es2018 = __commonJS({
59550
59589
  if (state === "closed" || state === "errored") {
59551
59590
  return promiseRejectedWith(new TypeError(`The stream (in ${state} state) is not in the writable state and cannot be closed`));
59552
59591
  }
59553
- const promise = newPromise((resolve4, reject) => {
59592
+ const promise = newPromise((resolve5, reject) => {
59554
59593
  const closeRequest = {
59555
- _resolve: resolve4,
59594
+ _resolve: resolve5,
59556
59595
  _reject: reject
59557
59596
  };
59558
59597
  stream2._closeRequest = closeRequest;
@@ -59565,9 +59604,9 @@ var require_ponyfill_es2018 = __commonJS({
59565
59604
  return promise;
59566
59605
  }
59567
59606
  function WritableStreamAddWriteRequest(stream2) {
59568
- const promise = newPromise((resolve4, reject) => {
59607
+ const promise = newPromise((resolve5, reject) => {
59569
59608
  const writeRequest = {
59570
- _resolve: resolve4,
59609
+ _resolve: resolve5,
59571
59610
  _reject: reject
59572
59611
  };
59573
59612
  stream2._writeRequests.push(writeRequest);
@@ -60183,8 +60222,8 @@ var require_ponyfill_es2018 = __commonJS({
60183
60222
  return new TypeError("Cannot " + name + " a stream using a released writer");
60184
60223
  }
60185
60224
  function defaultWriterClosedPromiseInitialize(writer) {
60186
- writer._closedPromise = newPromise((resolve4, reject) => {
60187
- writer._closedPromise_resolve = resolve4;
60225
+ writer._closedPromise = newPromise((resolve5, reject) => {
60226
+ writer._closedPromise_resolve = resolve5;
60188
60227
  writer._closedPromise_reject = reject;
60189
60228
  writer._closedPromiseState = "pending";
60190
60229
  });
@@ -60220,8 +60259,8 @@ var require_ponyfill_es2018 = __commonJS({
60220
60259
  writer._closedPromiseState = "resolved";
60221
60260
  }
60222
60261
  function defaultWriterReadyPromiseInitialize(writer) {
60223
- writer._readyPromise = newPromise((resolve4, reject) => {
60224
- writer._readyPromise_resolve = resolve4;
60262
+ writer._readyPromise = newPromise((resolve5, reject) => {
60263
+ writer._readyPromise_resolve = resolve5;
60225
60264
  writer._readyPromise_reject = reject;
60226
60265
  });
60227
60266
  writer._readyPromiseState = "pending";
@@ -60308,7 +60347,7 @@ var require_ponyfill_es2018 = __commonJS({
60308
60347
  source._disturbed = true;
60309
60348
  let shuttingDown = false;
60310
60349
  let currentWrite = promiseResolvedWith(void 0);
60311
- return newPromise((resolve4, reject) => {
60350
+ return newPromise((resolve5, reject) => {
60312
60351
  let abortAlgorithm;
60313
60352
  if (signal !== void 0) {
60314
60353
  abortAlgorithm = () => {
@@ -60453,7 +60492,7 @@ var require_ponyfill_es2018 = __commonJS({
60453
60492
  if (isError) {
60454
60493
  reject(error);
60455
60494
  } else {
60456
- resolve4(void 0);
60495
+ resolve5(void 0);
60457
60496
  }
60458
60497
  return null;
60459
60498
  }
@@ -60734,8 +60773,8 @@ var require_ponyfill_es2018 = __commonJS({
60734
60773
  let branch1;
60735
60774
  let branch2;
60736
60775
  let resolveCancelPromise;
60737
- const cancelPromise = newPromise((resolve4) => {
60738
- resolveCancelPromise = resolve4;
60776
+ const cancelPromise = newPromise((resolve5) => {
60777
+ resolveCancelPromise = resolve5;
60739
60778
  });
60740
60779
  function pullAlgorithm() {
60741
60780
  if (reading) {
@@ -60826,8 +60865,8 @@ var require_ponyfill_es2018 = __commonJS({
60826
60865
  let branch1;
60827
60866
  let branch2;
60828
60867
  let resolveCancelPromise;
60829
- const cancelPromise = newPromise((resolve4) => {
60830
- resolveCancelPromise = resolve4;
60868
+ const cancelPromise = newPromise((resolve5) => {
60869
+ resolveCancelPromise = resolve5;
60831
60870
  });
60832
60871
  function forwardReaderError(thisReader) {
60833
60872
  uponRejection(thisReader._closedPromise, (r2) => {
@@ -61607,8 +61646,8 @@ var require_ponyfill_es2018 = __commonJS({
61607
61646
  const writableHighWaterMark = ExtractHighWaterMark(writableStrategy, 1);
61608
61647
  const writableSizeAlgorithm = ExtractSizeAlgorithm(writableStrategy);
61609
61648
  let startPromise_resolve;
61610
- const startPromise = newPromise((resolve4) => {
61611
- startPromise_resolve = resolve4;
61649
+ const startPromise = newPromise((resolve5) => {
61650
+ startPromise_resolve = resolve5;
61612
61651
  });
61613
61652
  InitializeTransformStream(this, startPromise, writableHighWaterMark, writableSizeAlgorithm, readableHighWaterMark, readableSizeAlgorithm);
61614
61653
  SetUpTransformStreamDefaultControllerFromTransformer(this, transformer);
@@ -61701,8 +61740,8 @@ var require_ponyfill_es2018 = __commonJS({
61701
61740
  if (stream2._backpressureChangePromise !== void 0) {
61702
61741
  stream2._backpressureChangePromise_resolve();
61703
61742
  }
61704
- stream2._backpressureChangePromise = newPromise((resolve4) => {
61705
- stream2._backpressureChangePromise_resolve = resolve4;
61743
+ stream2._backpressureChangePromise = newPromise((resolve5) => {
61744
+ stream2._backpressureChangePromise_resolve = resolve5;
61706
61745
  });
61707
61746
  stream2._backpressure = backpressure;
61708
61747
  }
@@ -61870,8 +61909,8 @@ var require_ponyfill_es2018 = __commonJS({
61870
61909
  return controller._finishPromise;
61871
61910
  }
61872
61911
  const readable = stream2._readable;
61873
- controller._finishPromise = newPromise((resolve4, reject) => {
61874
- controller._finishPromise_resolve = resolve4;
61912
+ controller._finishPromise = newPromise((resolve5, reject) => {
61913
+ controller._finishPromise_resolve = resolve5;
61875
61914
  controller._finishPromise_reject = reject;
61876
61915
  });
61877
61916
  const cancelPromise = controller._cancelAlgorithm(reason);
@@ -61897,8 +61936,8 @@ var require_ponyfill_es2018 = __commonJS({
61897
61936
  return controller._finishPromise;
61898
61937
  }
61899
61938
  const readable = stream2._readable;
61900
- controller._finishPromise = newPromise((resolve4, reject) => {
61901
- controller._finishPromise_resolve = resolve4;
61939
+ controller._finishPromise = newPromise((resolve5, reject) => {
61940
+ controller._finishPromise_resolve = resolve5;
61902
61941
  controller._finishPromise_reject = reject;
61903
61942
  });
61904
61943
  const flushPromise = controller._flushAlgorithm();
@@ -61928,8 +61967,8 @@ var require_ponyfill_es2018 = __commonJS({
61928
61967
  return controller._finishPromise;
61929
61968
  }
61930
61969
  const writable = stream2._writable;
61931
- controller._finishPromise = newPromise((resolve4, reject) => {
61932
- controller._finishPromise_resolve = resolve4;
61970
+ controller._finishPromise = newPromise((resolve5, reject) => {
61971
+ controller._finishPromise_resolve = resolve5;
61933
61972
  controller._finishPromise_reject = reject;
61934
61973
  });
61935
61974
  const cancelPromise = controller._cancelAlgorithm(reason);
@@ -63916,7 +63955,7 @@ import zlib from "zlib";
63916
63955
  import Stream4, { PassThrough as PassThrough2, pipeline as pump } from "stream";
63917
63956
  import { Buffer as Buffer3 } from "buffer";
63918
63957
  async function fetch2(url, options_) {
63919
- return new Promise((resolve4, reject) => {
63958
+ return new Promise((resolve5, reject) => {
63920
63959
  const request = new Request2(url, options_);
63921
63960
  const { parsedURL, options } = getNodeRequestOptions(request);
63922
63961
  if (!supportedSchemas.has(parsedURL.protocol)) {
@@ -63925,7 +63964,7 @@ async function fetch2(url, options_) {
63925
63964
  if (parsedURL.protocol === "data:") {
63926
63965
  const data = dist_default(request.url);
63927
63966
  const response2 = new Response2(data, { headers: { "Content-Type": data.typeFull } });
63928
- resolve4(response2);
63967
+ resolve5(response2);
63929
63968
  return;
63930
63969
  }
63931
63970
  const send = (parsedURL.protocol === "https:" ? https : http2).request;
@@ -64047,7 +64086,7 @@ async function fetch2(url, options_) {
64047
64086
  if (responseReferrerPolicy) {
64048
64087
  requestOptions.referrerPolicy = responseReferrerPolicy;
64049
64088
  }
64050
- resolve4(fetch2(new Request2(locationURL, requestOptions)));
64089
+ resolve5(fetch2(new Request2(locationURL, requestOptions)));
64051
64090
  finalize();
64052
64091
  return;
64053
64092
  }
@@ -64080,7 +64119,7 @@ async function fetch2(url, options_) {
64080
64119
  const codings = headers.get("Content-Encoding");
64081
64120
  if (!request.compress || request.method === "HEAD" || codings === null || response_.statusCode === 204 || response_.statusCode === 304) {
64082
64121
  response = new Response2(body, responseOptions);
64083
- resolve4(response);
64122
+ resolve5(response);
64084
64123
  return;
64085
64124
  }
64086
64125
  const zlibOptions = {
@@ -64094,7 +64133,7 @@ async function fetch2(url, options_) {
64094
64133
  }
64095
64134
  });
64096
64135
  response = new Response2(body, responseOptions);
64097
- resolve4(response);
64136
+ resolve5(response);
64098
64137
  return;
64099
64138
  }
64100
64139
  if (codings === "deflate" || codings === "x-deflate") {
@@ -64118,12 +64157,12 @@ async function fetch2(url, options_) {
64118
64157
  });
64119
64158
  }
64120
64159
  response = new Response2(body, responseOptions);
64121
- resolve4(response);
64160
+ resolve5(response);
64122
64161
  });
64123
64162
  raw.once("end", () => {
64124
64163
  if (!response) {
64125
64164
  response = new Response2(body, responseOptions);
64126
- resolve4(response);
64165
+ resolve5(response);
64127
64166
  }
64128
64167
  });
64129
64168
  return;
@@ -64135,11 +64174,11 @@ async function fetch2(url, options_) {
64135
64174
  }
64136
64175
  });
64137
64176
  response = new Response2(body, responseOptions);
64138
- resolve4(response);
64177
+ resolve5(response);
64139
64178
  return;
64140
64179
  }
64141
64180
  response = new Response2(body, responseOptions);
64142
- resolve4(response);
64181
+ resolve5(response);
64143
64182
  });
64144
64183
  writeToStream(request_, request).catch(reject);
64145
64184
  });
@@ -70262,7 +70301,7 @@ var require_jwtaccess = __commonJS({
70262
70301
  }
70263
70302
  }
70264
70303
  fromStreamAsync(inputStream) {
70265
- return new Promise((resolve4, reject) => {
70304
+ return new Promise((resolve5, reject) => {
70266
70305
  if (!inputStream) {
70267
70306
  reject(new Error("Must pass in a stream containing the service account auth settings."));
70268
70307
  }
@@ -70271,7 +70310,7 @@ var require_jwtaccess = __commonJS({
70271
70310
  try {
70272
70311
  const data = JSON.parse(s2);
70273
70312
  this.fromJSON(data);
70274
- resolve4();
70313
+ resolve5();
70275
70314
  } catch (err) {
70276
70315
  reject(err);
70277
70316
  }
@@ -70511,7 +70550,7 @@ var require_jwtclient = __commonJS({
70511
70550
  }
70512
70551
  }
70513
70552
  fromStreamAsync(inputStream) {
70514
- return new Promise((resolve4, reject) => {
70553
+ return new Promise((resolve5, reject) => {
70515
70554
  if (!inputStream) {
70516
70555
  throw new Error("Must pass in a stream containing the service account auth settings.");
70517
70556
  }
@@ -70520,7 +70559,7 @@ var require_jwtclient = __commonJS({
70520
70559
  try {
70521
70560
  const data = JSON.parse(s2);
70522
70561
  this.fromJSON(data);
70523
- resolve4();
70562
+ resolve5();
70524
70563
  } catch (e2) {
70525
70564
  reject(e2);
70526
70565
  }
@@ -70654,7 +70693,7 @@ var require_refreshclient = __commonJS({
70654
70693
  }
70655
70694
  }
70656
70695
  async fromStreamAsync(inputStream) {
70657
- return new Promise((resolve4, reject) => {
70696
+ return new Promise((resolve5, reject) => {
70658
70697
  if (!inputStream) {
70659
70698
  return reject(new Error("Must pass in a stream containing the user refresh token."));
70660
70699
  }
@@ -70663,7 +70702,7 @@ var require_refreshclient = __commonJS({
70663
70702
  try {
70664
70703
  const data = JSON.parse(s2);
70665
70704
  this.fromJSON(data);
70666
- return resolve4();
70705
+ return resolve5();
70667
70706
  } catch (err) {
70668
70707
  return reject(err);
70669
70708
  }
@@ -72509,7 +72548,7 @@ var require_pluggable_auth_handler = __commonJS({
72509
72548
  * @return A promise that resolves with the executable response.
72510
72549
  */
72511
72550
  retrieveResponseFromExecutable(envMap) {
72512
- return new Promise((resolve4, reject) => {
72551
+ return new Promise((resolve5, reject) => {
72513
72552
  const child = childProcess.spawn(this.commandComponents[0], this.commandComponents.slice(1), {
72514
72553
  env: { ...process.env, ...Object.fromEntries(envMap) }
72515
72554
  });
@@ -72531,7 +72570,7 @@ var require_pluggable_auth_handler = __commonJS({
72531
72570
  try {
72532
72571
  const responseJson = JSON.parse(output);
72533
72572
  const response = new executable_response_1.ExecutableResponse(responseJson);
72534
- return resolve4(response);
72573
+ return resolve5(response);
72535
72574
  } catch (error) {
72536
72575
  if (error instanceof executable_response_1.ExecutableResponseError) {
72537
72576
  return reject(error);
@@ -73726,7 +73765,7 @@ var require_googleauth = __commonJS({
73726
73765
  }
73727
73766
  }
73728
73767
  fromStreamAsync(inputStream, options) {
73729
- return new Promise((resolve4, reject) => {
73768
+ return new Promise((resolve5, reject) => {
73730
73769
  if (!inputStream) {
73731
73770
  throw new Error("Must pass in a stream containing the Google auth settings.");
73732
73771
  }
@@ -73736,7 +73775,7 @@ var require_googleauth = __commonJS({
73736
73775
  try {
73737
73776
  const data = JSON.parse(chunks.join(""));
73738
73777
  const r2 = this._cacheClientFromJSON(data, options);
73739
- return resolve4(r2);
73778
+ return resolve5(r2);
73740
73779
  } catch (err) {
73741
73780
  if (!this.keyFilename)
73742
73781
  throw err;
@@ -73746,7 +73785,7 @@ var require_googleauth = __commonJS({
73746
73785
  });
73747
73786
  this.cachedCredential = client;
73748
73787
  this.setGapicJWTValues(client);
73749
- return resolve4(client);
73788
+ return resolve5(client);
73750
73789
  }
73751
73790
  } catch (err) {
73752
73791
  return reject(err);
@@ -73782,17 +73821,17 @@ var require_googleauth = __commonJS({
73782
73821
  * Run the Google Cloud SDK command that prints the default project ID
73783
73822
  */
73784
73823
  async getDefaultServiceProjectId() {
73785
- return new Promise((resolve4) => {
73824
+ return new Promise((resolve5) => {
73786
73825
  (0, child_process_1.exec)("gcloud config config-helper --format json", (err, stdout) => {
73787
73826
  if (!err && stdout) {
73788
73827
  try {
73789
73828
  const projectId = JSON.parse(stdout).configuration.properties.core.project;
73790
- resolve4(projectId);
73829
+ resolve5(projectId);
73791
73830
  return;
73792
73831
  } catch (e2) {
73793
73832
  }
73794
73833
  }
73795
- resolve4(null);
73834
+ resolve5(null);
73796
73835
  });
73797
73836
  });
73798
73837
  }
@@ -81470,14 +81509,14 @@ function __asyncValues(o) {
81470
81509
  }, i2);
81471
81510
  function verb(n) {
81472
81511
  i2[n] = o[n] && function(v) {
81473
- return new Promise(function(resolve4, reject) {
81474
- v = o[n](v), settle(resolve4, reject, v.done, v.value);
81512
+ return new Promise(function(resolve5, reject) {
81513
+ v = o[n](v), settle(resolve5, reject, v.done, v.value);
81475
81514
  });
81476
81515
  };
81477
81516
  }
81478
- function settle(resolve4, reject, d, v) {
81517
+ function settle(resolve5, reject, d, v) {
81479
81518
  Promise.resolve(v).then(function(v2) {
81480
- resolve4({ value: v2, done: d });
81519
+ resolve5({ value: v2, done: d });
81481
81520
  }, reject);
81482
81521
  }
81483
81522
  }
@@ -91847,8 +91886,8 @@ var init_node = __esm({
91847
91886
  const url = `${websocketBaseUrl}/ws/google.ai.generativelanguage.${apiVersion}.GenerativeService.BidiGenerateMusic?key=${apiKey}`;
91848
91887
  let onopenResolve = () => {
91849
91888
  };
91850
- const onopenPromise = new Promise((resolve4) => {
91851
- onopenResolve = resolve4;
91889
+ const onopenPromise = new Promise((resolve5) => {
91890
+ onopenResolve = resolve5;
91852
91891
  });
91853
91892
  const callbacks = params.callbacks;
91854
91893
  const onopenAwaitedCallback = function() {
@@ -92054,8 +92093,8 @@ var init_node = __esm({
92054
92093
  }
92055
92094
  let onopenResolve = () => {
92056
92095
  };
92057
- const onopenPromise = new Promise((resolve4) => {
92058
- onopenResolve = resolve4;
92096
+ const onopenPromise = new Promise((resolve5) => {
92097
+ onopenResolve = resolve5;
92059
92098
  });
92060
92099
  const callbacks = params.callbacks;
92061
92100
  const onopenAwaitedCallback = function() {
@@ -94403,7 +94442,7 @@ var init_node = __esm({
94403
94442
  return void 0;
94404
94443
  }
94405
94444
  };
94406
- sleep$1 = (ms) => new Promise((resolve4) => setTimeout(resolve4, ms));
94445
+ sleep$1 = (ms) => new Promise((resolve5) => setTimeout(resolve5, ms));
94407
94446
  FallbackEncoder3 = ({ headers, body }) => {
94408
94447
  return {
94409
94448
  bodyHeaders: {
@@ -94912,8 +94951,8 @@ ${underline}`);
94912
94951
  };
94913
94952
  APIPromise3 = class _APIPromise extends Promise {
94914
94953
  constructor(client, responsePromise, parseResponse2 = defaultParseResponse3) {
94915
- super((resolve4) => {
94916
- resolve4(null);
94954
+ super((resolve5) => {
94955
+ resolve5(null);
94917
94956
  });
94918
94957
  this.responsePromise = responsePromise;
94919
94958
  this.parseResponse = parseResponse2;
@@ -98144,7 +98183,7 @@ function retryIntervalFromResponse(res) {
98144
98183
  return 0;
98145
98184
  }
98146
98185
  async function delay(delay2) {
98147
- return new Promise((resolve4) => setTimeout(resolve4, delay2));
98186
+ return new Promise((resolve5) => setTimeout(resolve5, delay2));
98148
98187
  }
98149
98188
  var defaultBackoff, PermanentError, TemporaryError, codeRangeRE2;
98150
98189
  var init_retries = __esm({
@@ -135723,12 +135762,12 @@ function capRetryDelayMs(delayMs, options) {
135723
135762
  return maxRetryDelayMs > 0 ? Math.min(delayMs, maxRetryDelayMs) : delayMs;
135724
135763
  }
135725
135764
  function sleep4(ms, signal) {
135726
- return new Promise((resolve4, reject) => {
135765
+ return new Promise((resolve5, reject) => {
135727
135766
  if (signal?.aborted) {
135728
135767
  reject(new Error("Request was aborted"));
135729
135768
  return;
135730
135769
  }
135731
- const timeout = setTimeout(resolve4, ms);
135770
+ const timeout = setTimeout(resolve5, ms);
135732
135771
  signal?.addEventListener("abort", () => {
135733
135772
  clearTimeout(timeout);
135734
135773
  reject(new Error("Request was aborted"));
@@ -136060,7 +136099,7 @@ async function connectWebSocket(url, headers, signal, connectTimeoutMs = DEFAULT
136060
136099
  }
136061
136100
  const wsHeaders = headersToRecord(headers);
136062
136101
  delete wsHeaders["OpenAI-Beta"];
136063
- return new Promise((resolve4, reject) => {
136102
+ return new Promise((resolve5, reject) => {
136064
136103
  let settled = false;
136065
136104
  let timeout;
136066
136105
  let socket;
@@ -136095,7 +136134,7 @@ async function connectWebSocket(url, headers, signal, connectTimeoutMs = DEFAULT
136095
136134
  return;
136096
136135
  settled = true;
136097
136136
  cleanup();
136098
- resolve4(socket);
136137
+ resolve5(socket);
136099
136138
  };
136100
136139
  const onError = (event) => {
136101
136140
  fail2(extractWebSocketError(event));
@@ -136252,9 +136291,9 @@ async function* parseWebSocket(socket, signal, idleTimeoutMs) {
136252
136291
  const wake = () => {
136253
136292
  if (!pending)
136254
136293
  return;
136255
- const resolve4 = pending;
136294
+ const resolve5 = pending;
136256
136295
  pending = null;
136257
- resolve4();
136296
+ resolve5();
136258
136297
  };
136259
136298
  const onMessage = (event) => {
136260
136299
  void (async () => {
@@ -136321,8 +136360,8 @@ async function* parseWebSocket(socket, signal, idleTimeoutMs) {
136321
136360
  if (done)
136322
136361
  break;
136323
136362
  let timeout;
136324
- await new Promise((resolve4, reject) => {
136325
- pending = resolve4;
136363
+ await new Promise((resolve5, reject) => {
136364
+ pending = resolve5;
136326
136365
  if (idleTimeoutMs !== void 0 && idleTimeoutMs > 0) {
136327
136366
  timeout = setTimeout(() => {
136328
136367
  const error = new Error(`WebSocket idle timeout after ${idleTimeoutMs}ms`);
@@ -152176,10 +152215,21 @@ __export(vector_backfill_runner_exports, {
152176
152215
  launchDetachedVectorBackfill: () => launchDetachedVectorBackfill,
152177
152216
  main: () => main,
152178
152217
  parseVectorBackfillRequest: () => parseVectorBackfillRequest,
152179
- resolveVectorBackfillRunnerPath: () => resolveVectorBackfillRunnerPath
152218
+ releaseVectorBackfillLock: () => releaseVectorBackfillLock,
152219
+ resolveVectorBackfillRunnerPath: () => resolveVectorBackfillRunnerPath,
152220
+ vectorBackfillLockPath: () => vectorBackfillLockPath
152180
152221
  });
152181
152222
  import { spawn as spawn4 } from "child_process";
152182
- import { existsSync as existsSync12 } from "fs";
152223
+ import {
152224
+ closeSync,
152225
+ existsSync as existsSync12,
152226
+ mkdirSync as mkdirSync2,
152227
+ openSync,
152228
+ readFileSync as readFileSync9,
152229
+ statSync as statSync4,
152230
+ unlinkSync,
152231
+ writeFileSync as writeFileSync2
152232
+ } from "fs";
152183
152233
  import path24 from "path";
152184
152234
  import { fileURLToPath as fileURLToPath5 } from "url";
152185
152235
  function isNonEmptyString(value) {
@@ -152206,10 +152256,104 @@ function parseVectorBackfillRequest(raw) {
152206
152256
  dataDir: value.dataDir
152207
152257
  };
152208
152258
  }
152259
+ function vectorBackfillLockPath(dataDir) {
152260
+ return path24.join(dataDir, VECTOR_BACKFILL_LOCK_FILE);
152261
+ }
152262
+ function processIsAlive(pid) {
152263
+ if (!Number.isSafeInteger(pid) || pid == null || pid <= 0) return false;
152264
+ try {
152265
+ process.kill(pid, 0);
152266
+ return true;
152267
+ } catch (error) {
152268
+ return error.code === "EPERM";
152269
+ }
152270
+ }
152271
+ function readVectorBackfillLock(lockPath) {
152272
+ try {
152273
+ const value = JSON.parse(readFileSync9(lockPath, "utf8"));
152274
+ if (typeof value.parentPid !== "number" || !Number.isSafeInteger(value.parentPid) || typeof value.startedAt !== "number" || !Number.isFinite(value.startedAt) || typeof value.projectId !== "string") return void 0;
152275
+ return {
152276
+ parentPid: value.parentPid,
152277
+ ...typeof value.childPid === "number" ? { childPid: value.childPid } : {},
152278
+ startedAt: value.startedAt,
152279
+ projectId: value.projectId
152280
+ };
152281
+ } catch {
152282
+ return void 0;
152283
+ }
152284
+ }
152285
+ function writeVectorBackfillLock(lockPath, value) {
152286
+ writeFileSync2(lockPath, `${JSON.stringify(value)}
152287
+ `, "utf8");
152288
+ }
152289
+ function acquireVectorBackfillLock(dataDir, projectId, preferredPath) {
152290
+ const lockPath = preferredPath ?? vectorBackfillLockPath(dataDir);
152291
+ mkdirSync2(path24.dirname(lockPath), { recursive: true });
152292
+ const initial = {
152293
+ parentPid: process.pid,
152294
+ startedAt: Date.now(),
152295
+ projectId
152296
+ };
152297
+ for (let attempt = 0; attempt < 2; attempt++) {
152298
+ try {
152299
+ const fd = openSync(lockPath, "wx");
152300
+ try {
152301
+ writeFileSync2(fd, `${JSON.stringify(initial)}
152302
+ `, "utf8");
152303
+ } finally {
152304
+ closeSync(fd);
152305
+ }
152306
+ return {
152307
+ path: lockPath,
152308
+ setChildPid(pid) {
152309
+ try {
152310
+ writeVectorBackfillLock(lockPath, { ...initial, childPid: pid });
152311
+ } catch {
152312
+ }
152313
+ },
152314
+ release() {
152315
+ try {
152316
+ unlinkSync(lockPath);
152317
+ } catch {
152318
+ }
152319
+ }
152320
+ };
152321
+ } catch (error) {
152322
+ if (error.code !== "EEXIST") return void 0;
152323
+ const existing = readVectorBackfillLock(lockPath);
152324
+ const ownerAlive = existing && (processIsAlive(existing.childPid) || processIsAlive(existing.parentPid));
152325
+ if (ownerAlive) return void 0;
152326
+ let stale = false;
152327
+ try {
152328
+ stale = Date.now() - statSync4(lockPath).mtimeMs >= STALE_LOCK_RECOVERY_MS;
152329
+ } catch {
152330
+ stale = false;
152331
+ }
152332
+ if (!existing && !stale) return void 0;
152333
+ try {
152334
+ unlinkSync(lockPath);
152335
+ } catch {
152336
+ return void 0;
152337
+ }
152338
+ }
152339
+ }
152340
+ return void 0;
152341
+ }
152342
+ function releaseVectorBackfillLock(lockPath = process.env.MEMORIX_VECTOR_BACKFILL_LOCK) {
152343
+ if (!lockPath) return;
152344
+ const lock = readVectorBackfillLock(lockPath);
152345
+ if (lock && lock.childPid !== process.pid) return;
152346
+ try {
152347
+ unlinkSync(lockPath);
152348
+ } catch {
152349
+ }
152350
+ }
152209
152351
  function launchDetachedVectorBackfill(request, options = {}) {
152210
152352
  const runnerPath = options.runnerPath ?? resolveVectorBackfillRunnerPath();
152211
152353
  const exists = options.exists ?? existsSync12;
152212
152354
  if (!exists(runnerPath)) return false;
152355
+ const lock = acquireVectorBackfillLock(request.dataDir, request.projectId, options.lockPath);
152356
+ if (!lock) return false;
152213
152357
  try {
152214
152358
  const child = (options.spawn ?? spawn4)(process.execPath, [runnerPath], {
152215
152359
  cwd: request.projectRoot,
@@ -152219,14 +152363,23 @@ function launchDetachedVectorBackfill(request, options = {}) {
152219
152363
  stdio: "ignore",
152220
152364
  // The request contains only local project metadata, never credentials.
152221
152365
  // Environment transport avoids a live stdin pipe keeping the CLI alive.
152222
- env: { ...process.env, MEMORIX_VECTOR_BACKFILL_REQUEST: JSON.stringify(request) },
152366
+ env: {
152367
+ ...process.env,
152368
+ MEMORIX_VECTOR_BACKFILL_REQUEST: JSON.stringify(request),
152369
+ MEMORIX_VECTOR_BACKFILL_LOCK: lock.path
152370
+ },
152223
152371
  windowsHide: true
152224
152372
  });
152373
+ if (child.pid) lock.setChildPid(child.pid);
152374
+ else lock.release();
152225
152375
  child.once?.("error", () => {
152226
152376
  });
152377
+ child.once?.("close", () => lock.release());
152378
+ if (typeof child.once !== "function") lock.release();
152227
152379
  child.unref();
152228
- return true;
152380
+ return Boolean(child.pid);
152229
152381
  } catch {
152382
+ lock.release();
152230
152383
  return false;
152231
152384
  }
152232
152385
  }
@@ -152238,22 +152391,42 @@ async function executeVectorBackfill(request) {
152238
152391
  await prepareSearchIndex();
152239
152392
  await getDeferredCachedVectorHydration()?.catch(() => {
152240
152393
  });
152394
+ const queue = new MaintenanceJobStore(request.dataDir);
152395
+ const targets = new MaintenanceTargetStore(request.dataDir);
152396
+ let preparedRoot = request.projectRoot;
152397
+ const prepareTarget = async (target) => {
152398
+ if (target.projectRoot === preparedRoot) return;
152399
+ initProjectRoot(target.projectRoot);
152400
+ loadDotenv(target.projectRoot);
152401
+ preparedRoot = target.projectRoot;
152402
+ };
152403
+ const handler = async (job) => {
152404
+ const target = targets.get(job.projectId) ?? (job.projectId === request.projectId ? { projectId: request.projectId, projectRoot: request.projectRoot, dataDir: request.dataDir, updatedAt: Date.now() } : void 0);
152405
+ if (!target) return { action: "reschedule", delayMs: 3e4 };
152406
+ await prepareTarget(target);
152407
+ return createProjectMaintenanceHandler(job.projectId, target.dataDir, target.projectRoot)(job);
152408
+ };
152241
152409
  const worker = new MaintenanceJobWorker(
152242
- new MaintenanceJobStore(request.dataDir),
152243
- createProjectMaintenanceHandler(request.projectId, request.dataDir, request.projectRoot),
152244
- { projectId: request.projectId, kinds: ["vector-backfill"] }
152410
+ queue,
152411
+ handler,
152412
+ { kinds: ["vector-backfill"] }
152245
152413
  );
152246
- return worker.runOnce();
152414
+ let result = { state: "idle" };
152415
+ while (true) {
152416
+ result = await worker.runOnce();
152417
+ if (result.state === "idle") break;
152418
+ }
152419
+ return result;
152247
152420
  }
152248
152421
  async function readStdin() {
152249
- return new Promise((resolve4, reject) => {
152422
+ return new Promise((resolve5, reject) => {
152250
152423
  let raw = "";
152251
152424
  process.stdin.setEncoding("utf8");
152252
152425
  process.stdin.on("data", (chunk) => {
152253
152426
  raw += chunk;
152254
152427
  });
152255
152428
  process.stdin.once("error", reject);
152256
- process.stdin.once("end", () => resolve4(raw));
152429
+ process.stdin.once("end", () => resolve5(raw));
152257
152430
  });
152258
152431
  }
152259
152432
  async function main() {
@@ -152266,9 +152439,11 @@ async function main() {
152266
152439
  `);
152267
152440
  process.exitCode = 1;
152268
152441
  } finally {
152442
+ releaseVectorBackfillLock();
152269
152443
  closeAllDatabases();
152270
152444
  }
152271
152445
  }
152446
+ var VECTOR_BACKFILL_LOCK_FILE, STALE_LOCK_RECOVERY_MS;
152272
152447
  var init_vector_backfill_runner = __esm({
152273
152448
  "src/runtime/vector-backfill-runner.ts"() {
152274
152449
  "use strict";
@@ -152281,7 +152456,10 @@ var init_vector_backfill_runner = __esm({
152281
152456
  init_orama_store();
152282
152457
  init_sqlite_db();
152283
152458
  init_maintenance_jobs();
152459
+ init_maintenance_targets();
152284
152460
  init_project_maintenance();
152461
+ VECTOR_BACKFILL_LOCK_FILE = ".memorix-vector-backfill.lock";
152462
+ STALE_LOCK_RECOVERY_MS = 24 * 60 * 60 * 1e3;
152285
152463
  if (process.argv[1] && process.argv[1].endsWith("vector-backfill-runner.js")) {
152286
152464
  void main();
152287
152465
  }
@@ -152323,11 +152501,17 @@ function resetObservationRuntime() {
152323
152501
  embeddingWorkerProjectRoot = void 0;
152324
152502
  vectorMissingIds.clear();
152325
152503
  vectorSchemaUpgradePromise = null;
152504
+ embeddingFailureLogTimestamps.clear();
152326
152505
  }
152327
152506
  function logEmbeddingFailureOnce(key, message) {
152328
152507
  const now3 = Date.now();
152329
152508
  const last = embeddingFailureLogTimestamps.get(key) ?? 0;
152330
152509
  if (now3 - last < EMBEDDING_FAILURE_LOG_COOLDOWN_MS) return;
152510
+ if (!embeddingFailureLogTimestamps.has(key) && embeddingFailureLogTimestamps.size >= MAX_EMBEDDING_FAILURE_KEYS) {
152511
+ const oldest = embeddingFailureLogTimestamps.keys().next().value;
152512
+ if (oldest !== void 0) embeddingFailureLogTimestamps.delete(oldest);
152513
+ }
152514
+ embeddingFailureLogTimestamps.delete(key);
152331
152515
  embeddingFailureLogTimestamps.set(key, now3);
152332
152516
  console.error(message);
152333
152517
  }
@@ -152357,13 +152541,14 @@ function queueVectorBackfill(projectId, options = {}) {
152357
152541
  const dataDir = projectDir;
152358
152542
  if (!dataDir) return;
152359
152543
  void Promise.resolve().then(() => (init_maintenance_jobs(), maintenance_jobs_exports)).then(({ MaintenanceJobStore: MaintenanceJobStore2 }) => {
152360
- new MaintenanceJobStore2(dataDir).enqueue({
152544
+ const job = new MaintenanceJobStore2(dataDir).enqueue({
152361
152545
  projectId,
152362
152546
  kind: "vector-backfill",
152363
152547
  dedupeKey: "vector-backfill",
152364
152548
  payload: { limit: 12 }
152365
152549
  });
152366
- if (options.detachedWorker && options.projectRoot) {
152550
+ const due = !job || job.status === "pending" && job.runAfter <= Date.now();
152551
+ if (due && options.detachedWorker && options.projectRoot) {
152367
152552
  void Promise.resolve().then(() => (init_vector_backfill_runner(), vector_backfill_runner_exports)).then(({ launchDetachedVectorBackfill: launchDetachedVectorBackfill2 }) => {
152368
152553
  launchDetachedVectorBackfill2({
152369
152554
  projectId,
@@ -153294,7 +153479,7 @@ async function backfillVectorEmbeddings(options = {}) {
153294
153479
  ...lastFailure ? { lastError: lastFailure } : {}
153295
153480
  };
153296
153481
  }
153297
- var observations, nextId, projectDir, searchIndexPrepared, embeddingWriteMode, embeddingWorkerProjectRoot, corpusLoaded, loadedObservationStore, vectorMissingIds, vectorBackfillRunning, vectorSchemaUpgradePromise, lastVectorBackfill, embeddingFailureLogTimestamps, EMBEDDING_FAILURE_LOG_COOLDOWN_MS;
153482
+ var observations, nextId, projectDir, searchIndexPrepared, embeddingWriteMode, embeddingWorkerProjectRoot, corpusLoaded, loadedObservationStore, vectorMissingIds, vectorBackfillRunning, vectorSchemaUpgradePromise, lastVectorBackfill, embeddingFailureLogTimestamps, EMBEDDING_FAILURE_LOG_COOLDOWN_MS, MAX_EMBEDDING_FAILURE_KEYS;
153298
153483
  var init_observations = __esm({
153299
153484
  "src/memory/observations.ts"() {
153300
153485
  "use strict";
@@ -153322,6 +153507,7 @@ var init_observations = __esm({
153322
153507
  lastVectorBackfill = null;
153323
153508
  embeddingFailureLogTimestamps = /* @__PURE__ */ new Map();
153324
153509
  EMBEDDING_FAILURE_LOG_COOLDOWN_MS = 3e4;
153510
+ MAX_EMBEDDING_FAILURE_KEYS = 1024;
153325
153511
  }
153326
153512
  });
153327
153513
 
@@ -154759,62 +154945,13 @@ var init_formation = __esm({
154759
154945
  }
154760
154946
  });
154761
154947
 
154762
- // src/runtime/maintenance-targets.ts
154763
- var maintenance_targets_exports = {};
154764
- __export(maintenance_targets_exports, {
154765
- MaintenanceTargetStore: () => MaintenanceTargetStore
154766
- });
154767
- function rowToTarget(row) {
154768
- return {
154769
- projectId: row.project_id,
154770
- projectRoot: row.project_root,
154771
- dataDir: row.data_dir,
154772
- updatedAt: Number(row.updated_at)
154773
- };
154774
- }
154775
- var MaintenanceTargetStore;
154776
- var init_maintenance_targets = __esm({
154777
- "src/runtime/maintenance-targets.ts"() {
154778
- "use strict";
154779
- init_esm_shims();
154780
- init_sqlite_db();
154781
- MaintenanceTargetStore = class {
154782
- db;
154783
- constructor(dataDir) {
154784
- this.db = getDatabase(dataDir);
154785
- }
154786
- register(input) {
154787
- if (!input.projectId.trim()) throw new Error("Maintenance target requires a project ID");
154788
- if (!input.projectRoot.trim()) throw new Error("Maintenance target requires a project root");
154789
- if (!input.dataDir.trim()) throw new Error("Maintenance target requires a data directory");
154790
- const now3 = input.now ?? Date.now();
154791
- this.db.prepare(`
154792
- INSERT INTO maintenance_targets (project_id, project_root, data_dir, updated_at)
154793
- VALUES (?, ?, ?, ?)
154794
- ON CONFLICT(project_id) DO UPDATE SET
154795
- project_root = excluded.project_root,
154796
- data_dir = excluded.data_dir,
154797
- updated_at = excluded.updated_at
154798
- `).run(input.projectId, input.projectRoot, input.dataDir, now3);
154799
- return this.get(input.projectId);
154800
- }
154801
- get(projectId) {
154802
- const row = this.db.prepare(`
154803
- SELECT * FROM maintenance_targets WHERE project_id = ?
154804
- `).get(projectId);
154805
- return row ? rowToTarget(row) : void 0;
154806
- }
154807
- };
154808
- }
154809
- });
154810
-
154811
154948
  // src/config/behavior.ts
154812
154949
  var behavior_exports = {};
154813
154950
  __export(behavior_exports, {
154814
154951
  getBehaviorConfig: () => getBehaviorConfig,
154815
154952
  resetBehaviorConfigCache: () => resetBehaviorConfigCache
154816
154953
  });
154817
- import { existsSync as existsSync15, readFileSync as readFileSync10 } from "fs";
154954
+ import { existsSync as existsSync15, readFileSync as readFileSync11 } from "fs";
154818
154955
  import { homedir as homedir22 } from "os";
154819
154956
  function isSessionInject(value) {
154820
154957
  return value === "full" || value === "minimal" || value === "silent";
@@ -154826,7 +154963,7 @@ function legacyBehavior(homeDir) {
154826
154963
  const configPath = getLegacyConfigJsonPath(homeDir);
154827
154964
  try {
154828
154965
  if (!existsSync15(configPath)) return {};
154829
- const parsed = JSON.parse(readFileSync10(configPath, "utf-8"));
154966
+ const parsed = JSON.parse(readFileSync11(configPath, "utf-8"));
154830
154967
  return parsed.behavior && typeof parsed.behavior === "object" && !Array.isArray(parsed.behavior) ? parsed.behavior : {};
154831
154968
  } catch {
154832
154969
  return {};
@@ -156179,12 +156316,12 @@ __export(current_facts_exports, {
156179
156316
  formatGitFact: () => formatGitFact
156180
156317
  });
156181
156318
  import { execFileSync } from "child_process";
156182
- import { existsSync as existsSync16, readFileSync as readFileSync11 } from "fs";
156319
+ import { existsSync as existsSync16, readFileSync as readFileSync12 } from "fs";
156183
156320
  import path28 from "path";
156184
156321
  function readTextIfExists(filePath) {
156185
156322
  try {
156186
156323
  if (!existsSync16(filePath)) return null;
156187
- return readFileSync11(filePath, "utf8");
156324
+ return readFileSync12(filePath, "utf8");
156188
156325
  } catch {
156189
156326
  return null;
156190
156327
  }
@@ -156474,7 +156611,7 @@ __export(external_provider_exports, {
156474
156611
  runExternalCodeGraphLifecycle: () => runExternalCodeGraphLifecycle
156475
156612
  });
156476
156613
  import { spawn as spawn5 } from "child_process";
156477
- import { existsSync as existsSync17, readFileSync as readFileSync12 } from "fs";
156614
+ import { existsSync as existsSync17, readFileSync as readFileSync13 } from "fs";
156478
156615
  import { delimiter, dirname as dirname2, extname, isAbsolute as isAbsolute3, join as join20, relative as relative4, resolve as resolve3, sep } from "path";
156479
156616
  function boundedTimeout(value) {
156480
156617
  if (!Number.isFinite(value)) return DEFAULT_EXTERNAL_CODEGRAPH_TIMEOUT_MS;
@@ -156521,7 +156658,7 @@ function resolveLaunch(command) {
156521
156658
  return { executable: node, prefixArgs: ["--liftoff-only", entry] };
156522
156659
  }
156523
156660
  try {
156524
- const shim = readFileSync12(candidate, "utf8");
156661
+ const shim = readFileSync13(candidate, "utf8");
156525
156662
  const match2 = shim.match(/["']([^"']*%(?:~)?dp0%?[^"']*\.m?js)["']/i);
156526
156663
  if (match2?.[1]) {
156527
156664
  const base = dirname2(candidate).endsWith(sep) ? dirname2(candidate) : dirname2(candidate) + sep;
@@ -157781,7 +157918,7 @@ __export(auto_context_exports, {
157781
157918
  formatAutoProjectContextSummary: () => formatAutoProjectContextSummary,
157782
157919
  formatLegacyAutoProjectContextPrompt: () => formatLegacyAutoProjectContextPrompt
157783
157920
  });
157784
- import { existsSync as existsSync18, statSync as statSync4 } from "fs";
157921
+ import { existsSync as existsSync18, statSync as statSync5 } from "fs";
157785
157922
  import path29 from "path";
157786
157923
  function activeProjectObservations(observations2, projectId) {
157787
157924
  return observations2.filter((obs) => obs.projectId === projectId && (obs.status ?? "active") === "active");
@@ -158128,7 +158265,7 @@ function existingLensCandidates(rootPath, lens) {
158128
158265
  const absolute = path29.join(rootPath, candidate);
158129
158266
  try {
158130
158267
  if (!existsSync18(absolute)) continue;
158131
- const stat5 = statSync4(absolute);
158268
+ const stat5 = statSync5(absolute);
158132
158269
  if (stat5.isFile()) out.push(candidate);
158133
158270
  if (stat5.isDirectory()) out.push(candidate.replace(/\\/g, "/"));
158134
158271
  } catch {
@@ -158661,7 +158798,7 @@ var engine_exports2 = {};
158661
158798
  __export(engine_exports2, {
158662
158799
  SkillsEngine: () => SkillsEngine
158663
158800
  });
158664
- import { existsSync as existsSync19, readFileSync as readFileSync13, writeFileSync as writeFileSync3, mkdirSync as mkdirSync4, readdirSync as readdirSync4 } from "fs";
158801
+ import { existsSync as existsSync19, readFileSync as readFileSync14, writeFileSync as writeFileSync4, mkdirSync as mkdirSync5, readdirSync as readdirSync4 } from "fs";
158665
158802
  import { join as join21 } from "path";
158666
158803
  import { homedir as homedir23 } from "os";
158667
158804
  var SKILLS_DIRS, SKILL_WORTHY_TYPES, MIN_OBS_FOR_SKILL, MIN_SCORE_FOR_SKILL, LOW_SIGNAL_TITLE_PATTERNS, LOW_SIGNAL_ENTITY_PATTERNS, COMMAND_TRACE_PATTERNS2, SkillsEngine;
@@ -158752,7 +158889,7 @@ var init_engine3 = __esm({
158752
158889
  const skillMd = join21(skillsRoot, name, "SKILL.md");
158753
158890
  if (!existsSync19(skillMd)) continue;
158754
158891
  try {
158755
- const content = readFileSync13(skillMd, "utf-8");
158892
+ const content = readFileSync14(skillMd, "utf-8");
158756
158893
  const description = this.parseDescription(content);
158757
158894
  skills.push({
158758
158895
  name,
@@ -158802,8 +158939,8 @@ var init_engine3 = __esm({
158802
158939
  if (!dirs || dirs.length === 0) return null;
158803
158940
  const targetDir = join21(this.projectRoot, dirs[0], skill2.name);
158804
158941
  try {
158805
- mkdirSync4(targetDir, { recursive: true });
158806
- writeFileSync3(join21(targetDir, "SKILL.md"), skill2.content, "utf-8");
158942
+ mkdirSync5(targetDir, { recursive: true });
158943
+ writeFileSync4(join21(targetDir, "SKILL.md"), skill2.content, "utf-8");
158807
158944
  return join21(dirs[0], skill2.name, "SKILL.md");
158808
158945
  } catch {
158809
158946
  return null;
@@ -162143,7 +162280,7 @@ async function buildTeamSnapshot(dataDir, projectId, scope, mode) {
162143
162280
  }
162144
162281
  }
162145
162282
  function readBody(req) {
162146
- return new Promise((resolve4, reject) => {
162283
+ return new Promise((resolve5, reject) => {
162147
162284
  const chunks = [];
162148
162285
  let size = 0;
162149
162286
  req.on("data", (c) => {
@@ -162154,7 +162291,7 @@ function readBody(req) {
162154
162291
  }
162155
162292
  chunks.push(c);
162156
162293
  });
162157
- req.on("end", () => resolve4(Buffer.concat(chunks).toString("utf-8")));
162294
+ req.on("end", () => resolve5(Buffer.concat(chunks).toString("utf-8")));
162158
162295
  req.on("error", reject);
162159
162296
  });
162160
162297
  }
@@ -162207,7 +162344,7 @@ async function startDashboard(dataDir, port, staticDir, projectId, projectName,
162207
162344
  await serveStatic(req, res, resolvedStaticDir);
162208
162345
  }
162209
162346
  });
162210
- return new Promise((resolve4, reject) => {
162347
+ return new Promise((resolve5, reject) => {
162211
162348
  server.on("error", (err) => {
162212
162349
  if (err.code === "EADDRINUSE") {
162213
162350
  console.error(`Port ${port} is already in use. Try: memorix dashboard --port ${port + 1}`);
@@ -162230,7 +162367,7 @@ async function startDashboard(dataDir, port, staticDir, projectId, projectName,
162230
162367
  Press Ctrl+C to stop
162231
162368
  `);
162232
162369
  if (autoOpen) openBrowser(url);
162233
- resolve4();
162370
+ resolve5();
162234
162371
  });
162235
162372
  });
162236
162373
  }
@@ -162573,7 +162710,7 @@ var init_task_graph = __esm({
162573
162710
 
162574
162711
  // src/orchestrate/context-collector.ts
162575
162712
  import { execFileSync as execFileSync2 } from "child_process";
162576
- import { readFileSync as readFileSync14, existsSync as existsSync20 } from "fs";
162713
+ import { readFileSync as readFileSync15, existsSync as existsSync20 } from "fs";
162577
162714
  import { join as join22 } from "path";
162578
162715
  function normalizeEntryLimit(value, fallback) {
162579
162716
  if (!Number.isSafeInteger(value) || value < 1) return fallback;
@@ -162651,7 +162788,7 @@ function collectDependencies(projectDir2) {
162651
162788
  try {
162652
162789
  const pkgPath = join22(projectDir2, "package.json");
162653
162790
  if (!existsSync20(pkgPath)) return "";
162654
- const pkg = JSON.parse(readFileSync14(pkgPath, "utf-8"));
162791
+ const pkg = JSON.parse(readFileSync15(pkgPath, "utf-8"));
162655
162792
  const parts = [];
162656
162793
  if (pkg.dependencies && Object.keys(pkg.dependencies).length > 0) {
162657
162794
  parts.push(`dependencies: ${Object.keys(pkg.dependencies).join(", ")}`);
@@ -163802,6 +163939,9 @@ function resolveHookCommand() {
163802
163939
  }
163803
163940
  return "memorix";
163804
163941
  }
163942
+ function getGrokHome() {
163943
+ return process.env.GROK_HOME?.trim() || path33.join(os5.homedir(), ".grok");
163944
+ }
163805
163945
  function resolveWindowsMemorixShim() {
163806
163946
  try {
163807
163947
  const output = String(execSync2("where.exe memorix.cmd", {
@@ -163835,6 +163975,90 @@ function generateClaudeConfig() {
163835
163975
  }
163836
163976
  };
163837
163977
  }
163978
+ function generateGrokConfig() {
163979
+ const cmd = `${resolveHookCommand()} hook --agent grok`;
163980
+ const hookEntry = {
163981
+ type: "command",
163982
+ command: cmd,
163983
+ timeout: 10
163984
+ };
163985
+ return {
163986
+ hooks: {
163987
+ SessionStart: [{ hooks: [hookEntry] }],
163988
+ SessionEnd: [{ hooks: [hookEntry] }],
163989
+ PostToolUse: [{ hooks: [hookEntry] }],
163990
+ PostToolUseFailure: [{ hooks: [hookEntry] }],
163991
+ UserPromptSubmit: [{ hooks: [hookEntry] }],
163992
+ PreCompact: [{ hooks: [hookEntry] }],
163993
+ PostCompact: [{ hooks: [hookEntry] }],
163994
+ Stop: [{ hooks: [hookEntry] }],
163995
+ StopFailure: [{ hooks: [hookEntry] }]
163996
+ }
163997
+ };
163998
+ }
163999
+ function isJsonRecord(value) {
164000
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
164001
+ }
164002
+ function isMemorixGrokCommand(value) {
164003
+ return value === "memorix hook --agent grok" || value === "memorix.cmd hook --agent grok";
164004
+ }
164005
+ function isMemorixGrokHook(value) {
164006
+ return isJsonRecord(value) && value.type === "command" && isMemorixGrokCommand(value.command);
164007
+ }
164008
+ function mergeGrokHookConfig(existing, generated) {
164009
+ const merged = { ...existing };
164010
+ const existingHooks = isJsonRecord(existing.hooks) ? { ...existing.hooks } : {};
164011
+ const generatedHooks = isJsonRecord(generated.hooks) ? generated.hooks : {};
164012
+ for (const [event, generatedGroups] of Object.entries(generatedHooks)) {
164013
+ const currentGroups = Array.isArray(existingHooks[event]) ? existingHooks[event] : [];
164014
+ const preservedGroups = currentGroups.flatMap((group) => {
164015
+ if (!isJsonRecord(group) || !Array.isArray(group.hooks)) return [group];
164016
+ const preservedHooks = group.hooks.filter((hook) => !isMemorixGrokHook(hook));
164017
+ if (preservedHooks.length === 0) return [];
164018
+ return [{ ...group, hooks: preservedHooks }];
164019
+ });
164020
+ existingHooks[event] = [...preservedGroups, ...Array.isArray(generatedGroups) ? generatedGroups : []];
164021
+ }
164022
+ merged.hooks = existingHooks;
164023
+ return merged;
164024
+ }
164025
+ function removeMemorixGrokHooks(config) {
164026
+ const cleaned = { ...config };
164027
+ const hooks = isJsonRecord(config.hooks) ? { ...config.hooks } : null;
164028
+ if (!hooks) return cleaned;
164029
+ for (const [event, groups] of Object.entries(hooks)) {
164030
+ if (!Array.isArray(groups)) continue;
164031
+ const preservedGroups = groups.flatMap((group) => {
164032
+ if (!isJsonRecord(group) || !Array.isArray(group.hooks)) return [group];
164033
+ const preservedHooks = group.hooks.filter((hook) => !isMemorixGrokHook(hook));
164034
+ if (preservedHooks.length === 0) return [];
164035
+ return [{ ...group, hooks: preservedHooks }];
164036
+ });
164037
+ if (preservedGroups.length > 0) hooks[event] = preservedGroups;
164038
+ else delete hooks[event];
164039
+ }
164040
+ if (Object.keys(hooks).length > 0) cleaned.hooks = hooks;
164041
+ else delete cleaned.hooks;
164042
+ return cleaned;
164043
+ }
164044
+ async function readGrokHookConfig(configPath) {
164045
+ let content;
164046
+ try {
164047
+ content = await fs21.readFile(configPath, "utf-8");
164048
+ } catch (error) {
164049
+ if (error.code === "ENOENT") return {};
164050
+ throw error;
164051
+ }
164052
+ if (!content.trim()) return {};
164053
+ try {
164054
+ const parsed = JSON.parse(content);
164055
+ if (!isJsonRecord(parsed)) throw new Error("top-level value must be an object");
164056
+ return parsed;
164057
+ } catch (error) {
164058
+ const reason = error instanceof Error ? error.message : String(error);
164059
+ throw new Error(`Cannot safely update Grok hook config ${configPath}: ${reason}`);
164060
+ }
164061
+ }
163838
164062
  function generateCopilotConfig() {
163839
164063
  const cmd = `${resolveHookCommand()} hook`;
163840
164064
  const hasPwsh = detectPwsh();
@@ -164256,6 +164480,8 @@ function getProjectConfigPath(agent, projectRoot) {
164256
164480
  return path33.join(projectRoot, ".gemini", "settings.json");
164257
164481
  case "workbuddy":
164258
164482
  return "";
164483
+ case "grok":
164484
+ return path33.join(projectRoot, ".grok", "hooks", "memorix.json");
164259
164485
  default:
164260
164486
  return path33.join(projectRoot, ".memorix", "hooks.json");
164261
164487
  }
@@ -164291,6 +164517,8 @@ function getGlobalConfigPath(agent) {
164291
164517
  return path33.join(process.env.DSH_HOME?.trim() || path33.join(home, ".dsh"), "AGENTS.md");
164292
164518
  case "workbuddy":
164293
164519
  return "";
164520
+ case "grok":
164521
+ return path33.join(getGrokHome(), "hooks", "memorix.json");
164294
164522
  default:
164295
164523
  return path33.join(home, ".memorix", "hooks.json");
164296
164524
  }
@@ -164317,6 +164545,8 @@ function getAgentRulesPath(agent, root, global2 = false) {
164317
164545
  return path33.join(root, ".trae", "rules", "project_rules.md");
164318
164546
  case "dsh":
164319
164547
  return path33.join(process.env.DSH_HOME?.trim() || path33.join(root, ".dsh"), "AGENTS.md");
164548
+ case "grok":
164549
+ return path33.join(getGrokHome(), "AGENTS.md");
164320
164550
  case "workbuddy":
164321
164551
  return "";
164322
164552
  default:
@@ -164347,6 +164577,8 @@ function getAgentRulesPath(agent, root, global2 = false) {
164347
164577
  return path33.join(root, "AGENTS.md");
164348
164578
  case "workbuddy":
164349
164579
  return path33.join(root, "AGENTS.md");
164580
+ case "grok":
164581
+ return path33.join(root, "AGENTS.md");
164350
164582
  default:
164351
164583
  return path33.join(root, ".agent", "rules", "memorix.md");
164352
164584
  }
@@ -164398,6 +164630,12 @@ async function detectInstalledAgents() {
164398
164630
  agents.push("kiro");
164399
164631
  } catch {
164400
164632
  }
164633
+ const grokDir = getGrokHome();
164634
+ try {
164635
+ await fs21.access(grokDir);
164636
+ agents.push("grok");
164637
+ } catch {
164638
+ }
164401
164639
  const codexDir = path33.join(home, ".codex");
164402
164640
  try {
164403
164641
  await fs21.access(codexDir);
@@ -164484,6 +164722,9 @@ async function installHooks(agent, projectRoot, global2 = false) {
164484
164722
  if (basename5 === "AGENTS.md" || basename5 === "GEMINI.md" || basename5 === "CONTEXT.md") {
164485
164723
  continue;
164486
164724
  }
164725
+ if (agent === "grok" && path33.resolve(entry.path) === path33.resolve(configPath)) {
164726
+ continue;
164727
+ }
164487
164728
  await unlink3(entry.path);
164488
164729
  await removeFile2(projectRoot, entry.path);
164489
164730
  } catch {
@@ -164496,6 +164737,9 @@ async function installHooks(agent, projectRoot, global2 = false) {
164496
164737
  case "claude":
164497
164738
  generated = generateClaudeConfig();
164498
164739
  break;
164740
+ case "grok":
164741
+ generated = generateGrokConfig();
164742
+ break;
164499
164743
  case "copilot":
164500
164744
  generated = generateCopilotConfig();
164501
164745
  break;
@@ -164590,7 +164834,16 @@ async function installHooks(agent, projectRoot, global2 = false) {
164590
164834
  generated = generateClaudeConfig();
164591
164835
  }
164592
164836
  await fs21.mkdir(path33.dirname(configPath), { recursive: true });
164593
- if (agent === "kiro") {
164837
+ if (agent === "grok") {
164838
+ const existing = await readGrokHookConfig(configPath);
164839
+ const merged = mergeGrokHookConfig(existing, generated);
164840
+ await fs21.writeFile(configPath, JSON.stringify(merged, null, 2), "utf-8");
164841
+ try {
164842
+ const { recordFile: recordFile2 } = await Promise.resolve().then(() => (init_audit(), audit_exports));
164843
+ await recordFile2(projectRoot, "hook", configPath, agent);
164844
+ } catch {
164845
+ }
164846
+ } else if (agent === "kiro") {
164594
164847
  const hookFiles = generateKiroHookFiles();
164595
164848
  const hooksDir = path33.join(path33.dirname(configPath));
164596
164849
  await fs21.mkdir(hooksDir, { recursive: true });
@@ -164671,6 +164924,9 @@ async function installHooks(agent, projectRoot, global2 = false) {
164671
164924
  case "kiro":
164672
164925
  events.push("session_end", "user_prompt", "post_edit");
164673
164926
  break;
164927
+ case "grok":
164928
+ events.push("session_start", "post_tool", "user_prompt", "pre_compact", "post_compact", "session_end");
164929
+ break;
164674
164930
  }
164675
164931
  await installAgentRules(agent, projectRoot, global2);
164676
164932
  const skillPaths = await installOfficialSkillsForAgent(agent, projectRoot, global2);
@@ -164691,7 +164947,7 @@ async function installAgentRules(agent, projectRoot, global2 = false) {
164691
164947
  const rulesPath = getAgentRulesPath(agent, rulesRoot, global2);
164692
164948
  try {
164693
164949
  await fs21.mkdir(path33.dirname(rulesPath), { recursive: true });
164694
- if (agent === "claude" || agent === "codex" || agent === "opencode" || agent === "antigravity" || agent === "gemini-cli" || agent === "dsh") {
164950
+ if (agent === "claude" || agent === "codex" || agent === "opencode" || agent === "antigravity" || agent === "gemini-cli" || agent === "dsh" || agent === "grok") {
164695
164951
  try {
164696
164952
  const existing = await fs21.readFile(rulesPath, "utf-8");
164697
164953
  await fs21.writeFile(rulesPath, mergeMemorixRulesContent(existing, rulesContent), "utf-8");
@@ -164860,7 +165116,16 @@ async function uninstallHooks(agent, projectRoot, global2 = false) {
164860
165116
  const configPath = global2 ? getGlobalConfigPath(agent) : getProjectConfigPath(agent, projectRoot);
164861
165117
  let success = false;
164862
165118
  try {
164863
- if (agent === "kiro" || agent === "opencode") {
165119
+ if (agent === "grok") {
165120
+ const config = await readGrokHookConfig(configPath);
165121
+ const cleaned = removeMemorixGrokHooks(config);
165122
+ if (Object.keys(cleaned).length === 0) {
165123
+ await fs21.unlink(configPath);
165124
+ } else {
165125
+ await fs21.writeFile(configPath, JSON.stringify(cleaned, null, 2), "utf-8");
165126
+ }
165127
+ success = true;
165128
+ } else if (agent === "kiro" || agent === "opencode") {
164864
165129
  await fs21.unlink(configPath);
164865
165130
  success = true;
164866
165131
  } else {
@@ -164883,6 +165148,11 @@ async function uninstallHooks(agent, projectRoot, global2 = false) {
164883
165148
  const agentFiles = prevFiles.filter((e2) => e2.agent === agent);
164884
165149
  for (const entry of agentFiles) {
164885
165150
  try {
165151
+ if (agent === "grok" && path33.resolve(entry.path) === path33.resolve(configPath)) {
165152
+ await removeFile2(projectRoot, entry.path);
165153
+ auditCleaned = true;
165154
+ continue;
165155
+ }
164886
165156
  const basename5 = path33.basename(entry.path);
164887
165157
  if (basename5 === "AGENTS.md" || basename5 === "GEMINI.md" || basename5 === "CONTEXT.md") {
164888
165158
  try {
@@ -164943,14 +165213,14 @@ async function uninstallHooks(agent, projectRoot, global2 = false) {
164943
165213
  }
164944
165214
  async function getHookStatus(projectRoot) {
164945
165215
  const results = [];
164946
- const agents = ["claude", "copilot", "windsurf", "cursor", "kiro", "codex", "antigravity", "gemini-cli", "opencode", "pi", "trae"];
165216
+ const agents = ["claude", "copilot", "windsurf", "cursor", "kiro", "codex", "antigravity", "gemini-cli", "opencode", "pi", "trae", "grok"];
164947
165217
  for (const agent of agents) {
164948
165218
  const projectPath = getProjectConfigPath(agent, projectRoot);
164949
165219
  const globalPath = getGlobalConfigPath(agent);
164950
165220
  let installed = false;
164951
165221
  let outdated = false;
164952
165222
  let usedPath = projectPath;
164953
- const verifiedByDefault = agent !== "opencode" && agent !== "pi";
165223
+ const verifiedByDefault = agent !== "opencode" && agent !== "pi" && agent !== "grok";
164954
165224
  try {
164955
165225
  await fs21.access(projectPath);
164956
165226
  installed = true;
@@ -164978,11 +165248,12 @@ async function getHookStatus(projectRoot) {
164978
165248
  if (agent === "copilot" && process.platform === "win32" && installed) {
164979
165249
  runtimeReady = detectPwsh();
164980
165250
  }
165251
+ const verified = installed && (verifiedByDefault || agent === "grok" && usedPath === globalPath);
164981
165252
  results.push({
164982
165253
  agent,
164983
165254
  installed,
164984
165255
  outdated,
164985
- verified: installed && verifiedByDefault,
165256
+ verified,
164986
165257
  runtimeReady,
164987
165258
  configPath: usedPath
164988
165259
  });
@@ -165017,18 +165288,18 @@ __export(hooks_path_exports, {
165017
165288
  resolveGitDir: () => resolveGitDir,
165018
165289
  resolveHooksDir: () => resolveHooksDir
165019
165290
  });
165020
- import { existsSync as existsSync21, readFileSync as readFileSync15, statSync as statSync5, mkdirSync as mkdirSync5 } from "fs";
165291
+ import { existsSync as existsSync21, readFileSync as readFileSync16, statSync as statSync6, mkdirSync as mkdirSync6 } from "fs";
165021
165292
  import path34 from "path";
165022
165293
  function resolveGitDir(projectRoot) {
165023
165294
  const dotGit = path34.join(projectRoot, ".git");
165024
165295
  if (!existsSync21(dotGit)) return null;
165025
- const stat5 = statSync5(dotGit);
165296
+ const stat5 = statSync6(dotGit);
165026
165297
  if (stat5.isDirectory()) {
165027
165298
  return dotGit;
165028
165299
  }
165029
165300
  if (stat5.isFile()) {
165030
165301
  try {
165031
- const content = readFileSync15(dotGit, "utf-8").trim();
165302
+ const content = readFileSync16(dotGit, "utf-8").trim();
165032
165303
  const match2 = content.match(/^gitdir:\s*(.+)$/);
165033
165304
  if (match2) {
165034
165305
  const gitdir = match2[1].trim();
@@ -165054,7 +165325,7 @@ function resolveHooksDir(projectRoot) {
165054
165325
  function ensureHooksDir(projectRoot) {
165055
165326
  const resolved = resolveHooksDir(projectRoot);
165056
165327
  if (!resolved) return null;
165057
- mkdirSync5(resolved.hooksDir, { recursive: true });
165328
+ mkdirSync6(resolved.hooksDir, { recursive: true });
165058
165329
  return resolved;
165059
165330
  }
165060
165331
  var init_hooks_path = __esm({
@@ -167239,7 +167510,7 @@ var RulesSyncer = class {
167239
167510
 
167240
167511
  // src/workspace/engine.ts
167241
167512
  init_esm_shims();
167242
- import { readFileSync as readFileSync9, readdirSync as readdirSync3, existsSync as existsSync14, cpSync, mkdirSync as mkdirSync3 } from "fs";
167513
+ import { readFileSync as readFileSync10, readdirSync as readdirSync3, existsSync as existsSync14, cpSync, mkdirSync as mkdirSync4 } from "fs";
167243
167514
  import { join as join19 } from "path";
167244
167515
  import { homedir as homedir21 } from "os";
167245
167516
 
@@ -168191,7 +168462,7 @@ function sanitize(input) {
168191
168462
 
168192
168463
  // src/workspace/applier.ts
168193
168464
  init_esm_shims();
168194
- import { existsSync as existsSync13, mkdirSync as mkdirSync2, copyFileSync, writeFileSync as writeFileSync2, unlinkSync, renameSync } from "fs";
168465
+ import { existsSync as existsSync13, mkdirSync as mkdirSync3, copyFileSync, writeFileSync as writeFileSync3, unlinkSync as unlinkSync2, renameSync } from "fs";
168195
168466
  import { dirname } from "path";
168196
168467
  var WorkspaceSyncApplier = class {
168197
168468
  /**
@@ -168218,7 +168489,7 @@ var WorkspaceSyncApplier = class {
168218
168489
  try {
168219
168490
  const dir = dirname(file.filePath);
168220
168491
  if (!existsSync13(dir)) {
168221
- mkdirSync2(dir, { recursive: true });
168492
+ mkdirSync3(dir, { recursive: true });
168222
168493
  }
168223
168494
  } catch (err) {
168224
168495
  result.errors.push(`Cannot create directory for ${file.filePath}: ${err}`);
@@ -168243,7 +168514,7 @@ var WorkspaceSyncApplier = class {
168243
168514
  for (const file of files) {
168244
168515
  try {
168245
168516
  const tempPath = file.filePath + `.tmp-${Date.now()}`;
168246
- writeFileSync2(tempPath, file.content, "utf-8");
168517
+ writeFileSync3(tempPath, file.content, "utf-8");
168247
168518
  renameSync(tempPath, file.filePath);
168248
168519
  result.filesWritten.push(file.filePath);
168249
168520
  } catch (err) {
@@ -168278,7 +168549,7 @@ var WorkspaceSyncApplier = class {
168278
168549
  for (const backup of backups) {
168279
168550
  try {
168280
168551
  if (existsSync13(backup.backupPath)) {
168281
- unlinkSync(backup.backupPath);
168552
+ unlinkSync2(backup.backupPath);
168282
168553
  }
168283
168554
  } catch {
168284
168555
  }
@@ -168344,7 +168615,7 @@ var WorkspaceSyncEngine = class _WorkspaceSyncEngine {
168344
168615
  for (const path35 of pathsToCheck) {
168345
168616
  if (existsSync14(path35)) {
168346
168617
  try {
168347
- const content = readFileSync9(path35, "utf-8");
168618
+ const content = readFileSync10(path35, "utf-8");
168348
168619
  const servers = adapter.parse(content);
168349
168620
  for (const s2 of servers) {
168350
168621
  if (!merged.has(s2.name)) merged.set(s2.name, s2);
@@ -168398,7 +168669,7 @@ var WorkspaceSyncEngine = class _WorkspaceSyncEngine {
168398
168669
  let configContent;
168399
168670
  if (target === "antigravity" && existsSync14(configPath)) {
168400
168671
  try {
168401
- const existing = JSON.parse(readFileSync9(configPath, "utf-8"));
168672
+ const existing = JSON.parse(readFileSync10(configPath, "utf-8"));
168402
168673
  const generated = JSON.parse(adapter.generate(result.mcpServers.scanned));
168403
168674
  existing.mcpServers = { ...existing.mcpServers ?? {}, ...generated.mcpServers };
168404
168675
  configContent = JSON.stringify(existing, null, 2);
@@ -168481,7 +168752,7 @@ var WorkspaceSyncEngine = class _WorkspaceSyncEngine {
168481
168752
  if (!existsSync14(skillMd)) continue;
168482
168753
  let description = "";
168483
168754
  try {
168484
- const content = readFileSync9(skillMd, "utf-8");
168755
+ const content = readFileSync10(skillMd, "utf-8");
168485
168756
  const match2 = content.match(/^---[\s\S]*?description:\s*["']?(.+?)["']?\s*$/m);
168486
168757
  if (match2) description = match2[1];
168487
168758
  } catch {
@@ -168532,7 +168803,7 @@ var WorkspaceSyncEngine = class _WorkspaceSyncEngine {
168532
168803
  continue;
168533
168804
  }
168534
168805
  try {
168535
- mkdirSync3(targetDir, { recursive: true });
168806
+ mkdirSync4(targetDir, { recursive: true });
168536
168807
  cpSync(skill2.sourcePath, dest, { recursive: true });
168537
168808
  copied.push(skill2.name);
168538
168809
  } catch {
@@ -168548,7 +168819,7 @@ var WorkspaceSyncEngine = class _WorkspaceSyncEngine {
168548
168819
  const files = readdirSync3(wfDir).filter((f3) => f3.endsWith(".md"));
168549
168820
  for (const file of files) {
168550
168821
  try {
168551
- const content = readFileSync9(join19(wfDir, file), "utf-8");
168822
+ const content = readFileSync10(join19(wfDir, file), "utf-8");
168552
168823
  workflows.push(this.workflowSyncer.parseWindsurfWorkflow(file, content));
168553
168824
  } catch {
168554
168825
  }
@@ -168888,7 +169159,7 @@ var MCP_SERVER_INFO_META_KEY = "io.modelcontextprotocol/serverInfo";
168888
169159
  function getMcpServerInfo() {
168889
169160
  return {
168890
169161
  name: "memorix",
168891
- version: true ? "1.8.8" : "1.0.1"
169162
+ version: true ? "1.9.0" : "1.0.1"
168892
169163
  };
168893
169164
  }
168894
169165
  function createMcpDiscoverResult(capabilities, serverInfo) {
@@ -172378,15 +172649,15 @@ ${json2}
172378
172649
  if (inControlPlane) {
172379
172650
  const http3 = await import("http");
172380
172651
  const postData = JSON.stringify({ projectId: project.id, projectName: project.name });
172381
- await new Promise((resolve4) => {
172652
+ await new Promise((resolve5) => {
172382
172653
  const req = http3.request({
172383
172654
  hostname: "127.0.0.1",
172384
172655
  port: portNum,
172385
172656
  path: "/api/set-current-project",
172386
172657
  method: "POST",
172387
172658
  headers: { "Content-Type": "application/json", "Content-Length": Buffer.byteLength(postData) }
172388
- }, () => resolve4());
172389
- req.on("error", () => resolve4());
172659
+ }, () => resolve5());
172660
+ req.on("error", () => resolve5());
172390
172661
  req.write(postData);
172391
172662
  req.end();
172392
172663
  });
@@ -172411,33 +172682,33 @@ ${json2}
172411
172682
  }
172412
172683
  if (dashboardRunning) {
172413
172684
  const { createConnection } = await import("net");
172414
- const isAlive = await new Promise((resolve4) => {
172685
+ const isAlive = await new Promise((resolve5) => {
172415
172686
  const sock = createConnection(portNum, "127.0.0.1");
172416
172687
  sock.once("connect", () => {
172417
172688
  sock.destroy();
172418
- resolve4(true);
172689
+ resolve5(true);
172419
172690
  });
172420
172691
  sock.once("error", () => {
172421
172692
  sock.destroy();
172422
- resolve4(false);
172693
+ resolve5(false);
172423
172694
  });
172424
172695
  setTimeout(() => {
172425
172696
  sock.destroy();
172426
- resolve4(false);
172697
+ resolve5(false);
172427
172698
  }, 1e3);
172428
172699
  });
172429
172700
  if (isAlive) {
172430
172701
  const http3 = await import("http");
172431
172702
  const postData = JSON.stringify({ projectId: project.id, projectName: project.name });
172432
- await new Promise((resolve4) => {
172703
+ await new Promise((resolve5) => {
172433
172704
  const req = http3.request({
172434
172705
  hostname: "127.0.0.1",
172435
172706
  port: portNum,
172436
172707
  path: "/api/set-current-project",
172437
172708
  method: "POST",
172438
172709
  headers: { "Content-Type": "application/json", "Content-Length": Buffer.byteLength(postData) }
172439
- }, () => resolve4());
172440
- req.on("error", () => resolve4());
172710
+ }, () => resolve5());
172711
+ req.on("error", () => resolve5());
172441
172712
  req.write(postData);
172442
172713
  req.end();
172443
172714
  });
@@ -172483,18 +172754,18 @@ ${json2}
172483
172754
  dashboardRunning = false;
172484
172755
  });
172485
172756
  const { createConnection } = await import("net");
172486
- await new Promise((resolve4) => {
172757
+ await new Promise((resolve5) => {
172487
172758
  const deadline = Date.now() + 5e3;
172488
172759
  const tryConnect = () => {
172489
172760
  const sock = createConnection(portNum, "127.0.0.1");
172490
172761
  sock.once("connect", () => {
172491
172762
  sock.destroy();
172492
- resolve4();
172763
+ resolve5();
172493
172764
  });
172494
172765
  sock.once("error", () => {
172495
172766
  sock.destroy();
172496
172767
  if (Date.now() < deadline) setTimeout(tryConnect, 100);
172497
- else resolve4();
172768
+ else resolve5();
172498
172769
  });
172499
172770
  };
172500
172771
  tryConnect();
@@ -173505,10 +173776,10 @@ Preview: ${analysis.description.slice(0, 300)}${analysis.description.length > 30
173505
173776
  const { ensureHooksDir: ensureHooksDir2 } = await Promise.resolve().then(() => (init_hooks_path(), hooks_path_exports));
173506
173777
  const resolved = ensureHooksDir2(project.rootPath);
173507
173778
  if (resolved) {
173508
- const { existsSync: existsSync22, readFileSync: readFileSync16, writeFileSync: writeFileSync4, chmodSync } = await import("fs");
173779
+ const { existsSync: existsSync22, readFileSync: readFileSync17, writeFileSync: writeFileSync5, chmodSync } = await import("fs");
173509
173780
  const { hookPath } = resolved;
173510
173781
  const HOOK_MARKER = "# [memorix-git-hook]";
173511
- const needsInstall = !existsSync22(hookPath) || !readFileSync16(hookPath, "utf-8").includes(HOOK_MARKER);
173782
+ const needsInstall = !existsSync22(hookPath) || !readFileSync17(hookPath, "utf-8").includes(HOOK_MARKER);
173512
173783
  if (needsInstall) {
173513
173784
  const hookScript = `#!/bin/sh
173514
173785
  ${HOOK_MARKER}
@@ -173518,8 +173789,8 @@ if command -v memorix >/dev/null 2>&1; then
173518
173789
  fi
173519
173790
  `;
173520
173791
  if (existsSync22(hookPath)) {
173521
- const existing = readFileSync16(hookPath, "utf-8");
173522
- writeFileSync4(hookPath, existing.trimEnd() + `
173792
+ const existing = readFileSync17(hookPath, "utf-8");
173793
+ writeFileSync5(hookPath, existing.trimEnd() + `
173523
173794
 
173524
173795
  ${HOOK_MARKER}
173525
173796
  if command -v memorix >/dev/null 2>&1; then
@@ -173527,7 +173798,7 @@ if command -v memorix >/dev/null 2>&1; then
173527
173798
  fi
173528
173799
  `, "utf-8");
173529
173800
  } else {
173530
- writeFileSync4(hookPath, hookScript, "utf-8");
173801
+ writeFileSync5(hookPath, hookScript, "utf-8");
173531
173802
  }
173532
173803
  try {
173533
173804
  chmodSync(hookPath, 493);