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/index.js CHANGED
@@ -4217,7 +4217,7 @@ function toProviderInput(input, baseUrl) {
4217
4217
  return { type: input.modality, url: input.url };
4218
4218
  }
4219
4219
  function parseCacheJsonInWorker(filePath) {
4220
- return new Promise((resolve4, reject) => {
4220
+ return new Promise((resolve5, reject) => {
4221
4221
  void import("worker_threads").then(({ Worker }) => {
4222
4222
  const worker = new Worker(
4223
4223
  `
@@ -4238,7 +4238,7 @@ function parseCacheJsonInWorker(filePath) {
4238
4238
  worker.once("message", (msg) => {
4239
4239
  void worker.terminate();
4240
4240
  if (msg?.ok && Array.isArray(msg.entries)) {
4241
- resolve4(msg.entries);
4241
+ resolve5(msg.entries);
4242
4242
  return;
4243
4243
  }
4244
4244
  reject(new Error(msg?.error || "embedding cache worker parse failed"));
@@ -4302,8 +4302,8 @@ async function streamJsonArrayToJsonl(filePath, tmpPath) {
4302
4302
  let count2 = 0;
4303
4303
  const writeLine = async (line) => {
4304
4304
  if (!out.write(line)) {
4305
- await new Promise((resolve4, reject) => {
4306
- out.once("drain", resolve4);
4305
+ await new Promise((resolve5, reject) => {
4306
+ out.once("drain", resolve5);
4307
4307
  out.once("error", reject);
4308
4308
  });
4309
4309
  }
@@ -4335,7 +4335,7 @@ async function streamJsonArrayToJsonl(filePath, tmpPath) {
4335
4335
  `);
4336
4336
  count2 += 1;
4337
4337
  if (count2 % 50 === 0) {
4338
- await new Promise((resolve4) => setImmediate(resolve4));
4338
+ await new Promise((resolve5) => setImmediate(resolve5));
4339
4339
  }
4340
4340
  }
4341
4341
  }
@@ -4344,8 +4344,8 @@ async function streamJsonArrayToJsonl(filePath, tmpPath) {
4344
4344
  }
4345
4345
  }
4346
4346
  } finally {
4347
- await new Promise((resolve4, reject) => {
4348
- out.end(() => resolve4());
4347
+ await new Promise((resolve5, reject) => {
4348
+ out.end(() => resolve5());
4349
4349
  out.once("error", reject);
4350
4350
  });
4351
4351
  }
@@ -4390,7 +4390,7 @@ async function loadCacheJsonl(filePath) {
4390
4390
  } catch {
4391
4391
  }
4392
4392
  if (onDiskCount % 250 === 0) {
4393
- await new Promise((resolve4) => setImmediate(resolve4));
4393
+ await new Promise((resolve5) => setImmediate(resolve5));
4394
4394
  }
4395
4395
  }
4396
4396
  diskCacheEntryCount = onDiskCount;
@@ -4635,7 +4635,7 @@ async function saveDiskCacheNow() {
4635
4635
  return;
4636
4636
  }
4637
4637
  const tmpPath = `${jsonlPath}.tmp`;
4638
- await new Promise((resolve4, reject) => {
4638
+ await new Promise((resolve5, reject) => {
4639
4639
  const out = createWriteStream(tmpPath);
4640
4640
  const entries = cache3.entries();
4641
4641
  const writeBatch = () => {
@@ -4654,7 +4654,7 @@ async function saveDiskCacheNow() {
4654
4654
  }
4655
4655
  setImmediate(writeBatch);
4656
4656
  };
4657
- out.on("finish", resolve4);
4657
+ out.on("finish", resolve5);
4658
4658
  out.on("error", reject);
4659
4659
  writeBatch();
4660
4660
  });
@@ -4758,7 +4758,7 @@ function abortError() {
4758
4758
  }
4759
4759
  function raceWithAbort(promise, signal) {
4760
4760
  if (signal.aborted) return Promise.reject(abortError());
4761
- return new Promise((resolve4, reject) => {
4761
+ return new Promise((resolve5, reject) => {
4762
4762
  const onAbort = () => {
4763
4763
  signal.removeEventListener("abort", onAbort);
4764
4764
  reject(abortError());
@@ -4767,7 +4767,7 @@ function raceWithAbort(promise, signal) {
4767
4767
  promise.then(
4768
4768
  (value) => {
4769
4769
  signal.removeEventListener("abort", onAbort);
4770
- resolve4(value);
4770
+ resolve5(value);
4771
4771
  },
4772
4772
  (error) => {
4773
4773
  signal.removeEventListener("abort", onAbort);
@@ -4778,12 +4778,12 @@ function raceWithAbort(promise, signal) {
4778
4778
  }
4779
4779
  async function waitForRetry(waitMs, signal) {
4780
4780
  if (!signal) {
4781
- await new Promise((resolve4) => setTimeout(resolve4, waitMs));
4781
+ await new Promise((resolve5) => setTimeout(resolve5, waitMs));
4782
4782
  return;
4783
4783
  }
4784
4784
  const abortSignal = signal;
4785
4785
  if (abortSignal.aborted) throw new Error("Embedding API retry aborted");
4786
- await new Promise((resolve4, reject) => {
4786
+ await new Promise((resolve5, reject) => {
4787
4787
  const timer = setTimeout(done, waitMs);
4788
4788
  const onAbort = () => {
4789
4789
  clearTimeout(timer);
@@ -4792,7 +4792,7 @@ async function waitForRetry(waitMs, signal) {
4792
4792
  };
4793
4793
  function done() {
4794
4794
  abortSignal.removeEventListener("abort", onAbort);
4795
- resolve4();
4795
+ resolve5();
4796
4796
  }
4797
4797
  abortSignal.addEventListener("abort", onAbort, { once: true });
4798
4798
  });
@@ -6601,12 +6601,12 @@ var init_policy = __esm({
6601
6601
 
6602
6602
  // src/timeout.ts
6603
6603
  function withTimeout(promise, ms, label) {
6604
- return new Promise((resolve4, reject) => {
6604
+ return new Promise((resolve5, reject) => {
6605
6605
  const timer = setTimeout(() => reject(new Error(`${label} timed out after ${ms}ms`)), ms);
6606
6606
  promise.then(
6607
6607
  (value) => {
6608
6608
  clearTimeout(timer);
6609
- resolve4(value);
6609
+ resolve5(value);
6610
6610
  },
6611
6611
  (error) => {
6612
6612
  clearTimeout(timer);
@@ -6618,7 +6618,7 @@ function withTimeout(promise, ms, label) {
6618
6618
  function withTimeoutSignal(operation, ms, label, parentSignal) {
6619
6619
  const controller = new AbortController();
6620
6620
  const signal = parentSignal ? AbortSignal.any([parentSignal, controller.signal]) : controller.signal;
6621
- return new Promise((resolve4, reject) => {
6621
+ return new Promise((resolve5, reject) => {
6622
6622
  let settled = false;
6623
6623
  let timedOut = false;
6624
6624
  let timer;
@@ -6655,7 +6655,7 @@ function withTimeoutSignal(operation, ms, label, parentSignal) {
6655
6655
  if (settled) return;
6656
6656
  settled = true;
6657
6657
  cleanup();
6658
- resolve4(value);
6658
+ resolve5(value);
6659
6659
  },
6660
6660
  (error) => {
6661
6661
  if (settled) return;
@@ -7292,6 +7292,14 @@ __export(orama_store_exports, {
7292
7292
  updateObservationMetadata: () => updateObservationMetadata
7293
7293
  });
7294
7294
  import { create, insert as insert2, insertMultiple, search, remove as remove2, update, count, getByID } from "@orama/orama";
7295
+ function rememberSearchMode(key, value) {
7296
+ if (!lastSearchModeByProject.has(key) && lastSearchModeByProject.size >= MAX_SEARCH_MODE_KEYS) {
7297
+ const oldest = lastSearchModeByProject.keys().next().value;
7298
+ if (oldest !== void 0) lastSearchModeByProject.delete(oldest);
7299
+ }
7300
+ lastSearchModeByProject.delete(key);
7301
+ lastSearchModeByProject.set(key, value);
7302
+ }
7295
7303
  function getLastSearchMode(projectId) {
7296
7304
  return lastSearchModeByProject.get(projectId ?? SEARCH_MODE_DEFAULT_KEY) ?? "fulltext";
7297
7305
  }
@@ -7304,9 +7312,6 @@ function makeEntryKey(projectId, observationId2) {
7304
7312
  function rememberObservationDoc(doc) {
7305
7313
  const publicDoc = { ...doc };
7306
7314
  delete publicDoc.embedding;
7307
- if (doc.projectId && typeof doc.observationId === "number") {
7308
- docByObservationKey.set(makeEntryKey(doc.projectId, doc.observationId), publicDoc);
7309
- }
7310
7315
  return publicDoc;
7311
7316
  }
7312
7317
  function isCommandLikeQuery(query) {
@@ -7410,7 +7415,6 @@ async function resetDb() {
7410
7415
  indexEmbeddingProvider = null;
7411
7416
  deferredCachedVectorHydration = null;
7412
7417
  lastSearchModeByProject.clear();
7413
- docByObservationKey.clear();
7414
7418
  }
7415
7419
  function isEmbeddingEnabled() {
7416
7420
  return embeddingEnabled;
@@ -7473,78 +7477,72 @@ function isCompatibleCachedVector(vector) {
7473
7477
  vector && embeddingDimensions !== null && vector.length === embeddingDimensions && vector.every(Number.isFinite)
7474
7478
  );
7475
7479
  }
7476
- async function attachCachedVectors(database, candidates) {
7477
- const cachedVectors = await getCachedEmbeddings(
7478
- candidates.map(({ observation }) => observationEmbeddingText(observation))
7479
- );
7480
- if (db !== database) return;
7481
- for (let index = 0; index < candidates.length; index++) {
7482
- const vector = cachedVectors[index];
7483
- if (!isCompatibleCachedVector(vector)) continue;
7484
- const existing = getByID(database, candidates[index].id);
7485
- if (!existing || documentEmbeddingText(existing) !== observationEmbeddingText(candidates[index].observation)) continue;
7486
- try {
7487
- await update(database, candidates[index].id, { ...existing, embedding: vector });
7488
- } catch {
7489
- }
7490
- if (index % 50 === 0) {
7491
- await new Promise((resolve4) => setImmediate(resolve4));
7480
+ async function attachCachedVectors(database, observations2) {
7481
+ const batchSize = 200;
7482
+ for (let start = 0; start < observations2.length; start += batchSize) {
7483
+ const batch = observations2.slice(start, start + batchSize);
7484
+ const cachedVectors = await getCachedEmbeddings(batch.map(observationEmbeddingText));
7485
+ if (db !== database) return;
7486
+ for (let index = 0; index < batch.length; index++) {
7487
+ const vector = cachedVectors[index];
7488
+ if (!isCompatibleCachedVector(vector)) continue;
7489
+ const id = makeOramaObservationId(batch[index].projectId, batch[index].id);
7490
+ const existing = getByID(database, id);
7491
+ if (!existing || documentEmbeddingText(existing) !== observationEmbeddingText(batch[index])) continue;
7492
+ try {
7493
+ await update(database, id, { ...existing, embedding: vector });
7494
+ } catch {
7495
+ }
7492
7496
  }
7497
+ await new Promise((resolve5) => setImmediate(resolve5));
7493
7498
  }
7494
7499
  }
7495
7500
  async function hydrateIndex(observations2, options = {}) {
7496
7501
  const database = await getDb({ allowNetworkProbe: options.allowNetworkProbe });
7497
- const candidates = [];
7498
- for (const observation of observations2) {
7499
- if (!observation || !observation.id || !observation.projectId) continue;
7500
- const id = makeOramaObservationId(observation.projectId, observation.id);
7501
- if (getByID(database, id)) continue;
7502
- candidates.push({ observation, id });
7503
- }
7504
7502
  const deferCachedVectors = options.deferCachedVectors === true && Boolean(indexEmbeddingProvider?.getCachedEmbeddings);
7505
- const cachedVectors = deferCachedVectors ? candidates.map(() => null) : await getCachedEmbeddings(candidates.map(({ observation }) => observationEmbeddingText(observation)));
7506
- const documents = [];
7507
- for (let index = 0; index < candidates.length; index++) {
7508
- const { observation: obs, id } = candidates[index];
7509
- try {
7510
- const vector = cachedVectors[index];
7511
- const compatibleVector = isCompatibleCachedVector(vector) ? vector : null;
7512
- const doc = {
7513
- id,
7514
- observationId: obs.id,
7515
- entityName: obs.entityName || "",
7516
- type: obs.type || "discovery",
7517
- title: obs.title || "",
7518
- narrative: obs.narrative || "",
7519
- facts: Array.isArray(obs.facts) ? obs.facts.join(" ") : "",
7520
- filesModified: Array.isArray(obs.filesModified) ? obs.filesModified.join(" ") : "",
7521
- concepts: Array.isArray(obs.concepts) ? obs.concepts.join(" ") : "",
7522
- tokens: obs.tokens ?? 0,
7523
- createdAt: obs.createdAt || "",
7524
- projectId: obs.projectId,
7525
- accessCount: obs.accessCount ?? 0,
7526
- lastAccessedAt: obs.lastAccessedAt || "",
7527
- status: obs.status ?? "active",
7528
- source: obs.source || "agent",
7529
- sourceDetail: obs.sourceDetail ?? "",
7530
- valueCategory: obs.valueCategory ?? "",
7531
- admissionState: obs.admissionState ?? "",
7532
- admissionReason: obs.admissionReason ?? "",
7533
- visibility: obs.visibility ?? "project",
7534
- createdByAgentId: obs.createdByAgentId ?? "",
7535
- sharedWithAgentIds: JSON.stringify(obs.sharedWithAgentIds ?? []),
7536
- documentType: "observation",
7537
- knowledgeLayer: resolveKnowledgeLayer("observation", obs.sourceDetail, obs.source),
7538
- ...compatibleVector ? { embedding: compatibleVector } : {}
7539
- };
7540
- documents.push(doc);
7541
- } catch {
7542
- }
7543
- }
7544
7503
  let inserted = 0;
7545
7504
  const hydrationBatchSize = 200;
7546
- for (let start = 0; start < documents.length; start += hydrationBatchSize) {
7547
- const batch = documents.slice(start, start + hydrationBatchSize);
7505
+ for (let start = 0; start < observations2.length; start += hydrationBatchSize) {
7506
+ const batchObservations = observations2.slice(start, start + hydrationBatchSize).filter((observation) => observation && observation.id && observation.projectId).filter((observation) => !getByID(database, makeOramaObservationId(observation.projectId, observation.id)));
7507
+ if (batchObservations.length === 0) continue;
7508
+ const cachedVectors = deferCachedVectors || options.skipCachedVectors ? batchObservations.map(() => null) : await getCachedEmbeddings(batchObservations.map(observationEmbeddingText));
7509
+ const batch = [];
7510
+ for (let index = 0; index < batchObservations.length; index++) {
7511
+ const obs = batchObservations[index];
7512
+ try {
7513
+ const compatibleVector = isCompatibleCachedVector(cachedVectors[index]) ? cachedVectors[index] : null;
7514
+ batch.push({
7515
+ id: makeOramaObservationId(obs.projectId, obs.id),
7516
+ observationId: obs.id,
7517
+ entityName: obs.entityName || "",
7518
+ type: obs.type || "discovery",
7519
+ title: obs.title || "",
7520
+ narrative: obs.narrative || "",
7521
+ facts: Array.isArray(obs.facts) ? obs.facts.join(" ") : "",
7522
+ filesModified: Array.isArray(obs.filesModified) ? obs.filesModified.join(" ") : "",
7523
+ concepts: Array.isArray(obs.concepts) ? obs.concepts.join(" ") : "",
7524
+ tokens: obs.tokens ?? 0,
7525
+ createdAt: obs.createdAt || "",
7526
+ projectId: obs.projectId,
7527
+ accessCount: obs.accessCount ?? 0,
7528
+ lastAccessedAt: obs.lastAccessedAt || "",
7529
+ status: obs.status ?? "active",
7530
+ source: obs.source || "agent",
7531
+ sourceDetail: obs.sourceDetail ?? "",
7532
+ valueCategory: obs.valueCategory ?? "",
7533
+ admissionState: obs.admissionState ?? "",
7534
+ admissionReason: obs.admissionReason ?? "",
7535
+ visibility: obs.visibility ?? "project",
7536
+ createdByAgentId: obs.createdByAgentId ?? "",
7537
+ sharedWithAgentIds: JSON.stringify(obs.sharedWithAgentIds ?? []),
7538
+ documentType: "observation",
7539
+ knowledgeLayer: resolveKnowledgeLayer("observation", obs.sourceDetail, obs.source),
7540
+ ...compatibleVector ? { embedding: compatibleVector } : {}
7541
+ });
7542
+ } catch {
7543
+ }
7544
+ }
7545
+ if (batch.length === 0) continue;
7548
7546
  try {
7549
7547
  await insertMultiple(database, batch, batch.length);
7550
7548
  for (const doc of batch) rememberObservationDoc(doc);
@@ -7564,9 +7562,9 @@ async function hydrateIndex(observations2, options = {}) {
7564
7562
  }
7565
7563
  }
7566
7564
  }
7567
- await new Promise((resolve4) => setImmediate(resolve4));
7565
+ await new Promise((resolve5) => setImmediate(resolve5));
7568
7566
  }
7569
- deferredCachedVectorHydration = options.skipCachedVectors ? null : deferCachedVectors ? attachCachedVectors(database, candidates).catch(() => {
7567
+ deferredCachedVectorHydration = options.skipCachedVectors ? null : deferCachedVectors ? attachCachedVectors(database, observations2).catch(() => {
7570
7568
  }) : null;
7571
7569
  return inserted;
7572
7570
  }
@@ -7603,12 +7601,6 @@ async function updateObservationMetadata(projectId, observationId2, patch) {
7603
7601
  async function removeObservation(oramaId) {
7604
7602
  const database = await getDb();
7605
7603
  await remove2(database, oramaId);
7606
- for (const [key, doc] of docByObservationKey.entries()) {
7607
- if (doc.id === oramaId) {
7608
- docByObservationKey.delete(key);
7609
- break;
7610
- }
7611
- }
7612
7604
  }
7613
7605
  async function searchObservations(options) {
7614
7606
  const perf = !!process.env.MEMORIX_PERF;
@@ -7623,7 +7615,7 @@ async function searchObservations(options) {
7623
7615
  const modeKey = options.projectId ?? SEARCH_MODE_DEFAULT_KEY;
7624
7616
  const quality = options.quality ?? "balanced";
7625
7617
  const database = await getDb();
7626
- lastSearchModeByProject.set(
7618
+ rememberSearchMode(
7627
7619
  modeKey,
7628
7620
  quality === "fast" ? "fulltext (fast profile)" : embeddingEnabled ? "hybrid" : "fulltext"
7629
7621
  );
@@ -7690,7 +7682,7 @@ async function searchObservations(options) {
7690
7682
  if (provider2) {
7691
7683
  const activeVectorDimensions = getVectorDimensions();
7692
7684
  if (activeVectorDimensions !== null && provider2.dimensions !== activeVectorDimensions) {
7693
- lastSearchModeByProject.set(
7685
+ rememberSearchMode(
7694
7686
  modeKey,
7695
7687
  `fulltext (embedding dimension mismatch: provider ${provider2.dimensions}d vs index ${activeVectorDimensions}d)`
7696
7688
  );
@@ -7715,7 +7707,7 @@ async function searchObservations(options) {
7715
7707
  mark("embedding");
7716
7708
  const cjkRatio = (originalQuery.match(/[\u4e00-\u9fff\u3040-\u309f\u30a0-\u30ff\uac00-\ud7af]/g) || []).length / originalQuery.length;
7717
7709
  const isCJKHeavy = cjkRatio > 0.3;
7718
- lastSearchModeByProject.set(modeKey, "hybrid");
7710
+ rememberSearchMode(modeKey, "hybrid");
7719
7711
  searchParams = {
7720
7712
  ...searchParams,
7721
7713
  mode: "hybrid",
@@ -7731,7 +7723,7 @@ async function searchObservations(options) {
7731
7723
  }
7732
7724
  }
7733
7725
  } catch (error) {
7734
- lastSearchModeByProject.set(modeKey, "fulltext (embedding unavailable)");
7726
+ rememberSearchMode(modeKey, "fulltext (embedding unavailable)");
7735
7727
  console.error("[memorix] Embedding failed or timed out, falling back to fulltext search");
7736
7728
  }
7737
7729
  }
@@ -7741,7 +7733,7 @@ async function searchObservations(options) {
7741
7733
  results = await search(database, searchParams);
7742
7734
  } catch (error) {
7743
7735
  if (queryVector && isVectorDimensionMismatchError(error)) {
7744
- lastSearchModeByProject.set(modeKey, "fulltext (embedding dimension mismatch)");
7736
+ rememberSearchMode(modeKey, "fulltext (embedding dimension mismatch)");
7745
7737
  console.error("[memorix] Vector search dimension mismatch detected, retrying without embeddings");
7746
7738
  results = await search(database, stripVectorSearchParams(searchParams));
7747
7739
  } else {
@@ -7763,7 +7755,7 @@ async function searchObservations(options) {
7763
7755
  },
7764
7756
  similarity: 0.25
7765
7757
  };
7766
- lastSearchModeByProject.set(modeKey, "vector-only (hybrid empty fallback)");
7758
+ rememberSearchMode(modeKey, "vector-only (hybrid empty fallback)");
7767
7759
  results = await search(database, vectorOnlyParams);
7768
7760
  } catch {
7769
7761
  }
@@ -8004,7 +7996,7 @@ async function searchObservations(options) {
8004
7996
  const rerankedTop = neural.map((row) => candidateMap.get(row.id)).filter((entry) => entry != null);
8005
7997
  if (rerankedTop.length > 0) {
8006
7998
  intermediate = [...rerankedTop, ...intermediate.slice(RERANK_TOP_K)];
8007
- lastSearchModeByProject.set(modeKey, (lastSearchModeByProject.get(modeKey) ?? "fulltext") + " + neural rerank");
7999
+ rememberSearchMode(modeKey, (lastSearchModeByProject.get(modeKey) ?? "fulltext") + " + neural rerank");
8008
8000
  mark("rerank(usedNeural=true)");
8009
8001
  }
8010
8002
  }
@@ -8021,7 +8013,7 @@ async function searchObservations(options) {
8021
8013
  );
8022
8014
  mark(`rerank(usedLLM=${usedLLM})`);
8023
8015
  if (usedLLM) {
8024
- lastSearchModeByProject.set(modeKey, (lastSearchModeByProject.get(modeKey) ?? "fulltext") + " + LLM rerank");
8016
+ rememberSearchMode(modeKey, (lastSearchModeByProject.get(modeKey) ?? "fulltext") + " + LLM rerank");
8025
8017
  const rerankedTop = reranked.map((row) => candidateMap.get(row.id)).filter((entry) => entry != null);
8026
8018
  if (rerankedTop.length > 0) {
8027
8019
  intermediate = [...rerankedTop, ...intermediate.slice(RERANK_TOP_K)];
@@ -8094,13 +8086,6 @@ async function getObservationsByIds(ids, projectId) {
8094
8086
  const database = await getDb();
8095
8087
  const results = [];
8096
8088
  for (const id of ids) {
8097
- if (projectId) {
8098
- const cached = docByObservationKey.get(makeEntryKey(projectId, id));
8099
- if (cached) {
8100
- results.push(cached);
8101
- continue;
8102
- }
8103
- }
8104
8089
  const searchResult = await search(database, {
8105
8090
  term: "",
8106
8091
  includeVectors: true,
@@ -8200,7 +8185,7 @@ function formatTime(isoDate) {
8200
8185
  return isoDate;
8201
8186
  }
8202
8187
  }
8203
- 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;
8188
+ 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;
8204
8189
  var init_orama_store = __esm({
8205
8190
  "src/store/orama-store.ts"() {
8206
8191
  "use strict";
@@ -8221,10 +8206,10 @@ var init_orama_store = __esm({
8221
8206
  embeddingDimensions = null;
8222
8207
  indexEmbeddingProvider = null;
8223
8208
  deferredCachedVectorHydration = null;
8224
- docByObservationKey = /* @__PURE__ */ new Map();
8225
8209
  NON_CJK_HYBRID_SIMILARITY = 0.45;
8226
8210
  lastSearchModeByProject = /* @__PURE__ */ new Map();
8227
8211
  SEARCH_MODE_DEFAULT_KEY = "__global__";
8212
+ MAX_SEARCH_MODE_KEYS = 4096;
8228
8213
  COMMAND_LOG_TITLE2 = /^(Ran:|Command:|Executed:)\s/i;
8229
8214
  COMMAND_STYLE_TITLE = /(\bfindstr\b|\bSelect-String\b|\bGet-Content\b|\bnpx\s+vitest\b|\bnpx\s+tsc\b|\b2>&1\b)/i;
8230
8215
  COMMAND_LIKE_QUERY2 = /\b(git|npm|npx|pnpm|yarn|node|bash|powershell|curl|memorix)\b/i;
@@ -9652,6 +9637,60 @@ var init_evidence_store = __esm({
9652
9637
  }
9653
9638
  });
9654
9639
 
9640
+ // src/runtime/maintenance-targets.ts
9641
+ var maintenance_targets_exports = {};
9642
+ __export(maintenance_targets_exports, {
9643
+ MaintenanceTargetStore: () => MaintenanceTargetStore
9644
+ });
9645
+ function rowToTarget(row) {
9646
+ return {
9647
+ projectId: row.project_id,
9648
+ projectRoot: row.project_root,
9649
+ dataDir: row.data_dir,
9650
+ updatedAt: Number(row.updated_at)
9651
+ };
9652
+ }
9653
+ var MaintenanceTargetStore;
9654
+ var init_maintenance_targets = __esm({
9655
+ "src/runtime/maintenance-targets.ts"() {
9656
+ "use strict";
9657
+ init_esm_shims();
9658
+ init_sqlite_db();
9659
+ MaintenanceTargetStore = class {
9660
+ db;
9661
+ constructor(dataDir) {
9662
+ this.db = getDatabase(dataDir);
9663
+ }
9664
+ register(input) {
9665
+ if (!input.projectId.trim()) throw new Error("Maintenance target requires a project ID");
9666
+ if (!input.projectRoot.trim()) throw new Error("Maintenance target requires a project root");
9667
+ if (!input.dataDir.trim()) throw new Error("Maintenance target requires a data directory");
9668
+ const now3 = input.now ?? Date.now();
9669
+ this.db.prepare(`
9670
+ INSERT INTO maintenance_targets (project_id, project_root, data_dir, updated_at)
9671
+ VALUES (?, ?, ?, ?)
9672
+ ON CONFLICT(project_id) DO UPDATE SET
9673
+ project_root = excluded.project_root,
9674
+ data_dir = excluded.data_dir,
9675
+ updated_at = excluded.updated_at
9676
+ `).run(input.projectId, input.projectRoot, input.dataDir, now3);
9677
+ return this.get(input.projectId);
9678
+ }
9679
+ get(projectId) {
9680
+ const row = this.db.prepare(`
9681
+ SELECT * FROM maintenance_targets WHERE project_id = ?
9682
+ `).get(projectId);
9683
+ return row ? rowToTarget(row) : void 0;
9684
+ }
9685
+ list() {
9686
+ return this.db.prepare(`
9687
+ SELECT * FROM maintenance_targets ORDER BY updated_at DESC
9688
+ `).all().map(rowToTarget);
9689
+ }
9690
+ };
9691
+ }
9692
+ });
9693
+
9655
9694
  // src/runtime/isolated-maintenance.ts
9656
9695
  import { spawn } from "child_process";
9657
9696
  import { existsSync as existsSync8 } from "fs";
@@ -9709,7 +9748,7 @@ function validateRequest(request) {
9709
9748
  }
9710
9749
  }
9711
9750
  function collectOutput(stream2, limit2, onOverflow) {
9712
- return new Promise((resolve4, reject) => {
9751
+ return new Promise((resolve5, reject) => {
9713
9752
  let value = "";
9714
9753
  let size = 0;
9715
9754
  stream2.setEncoding("utf8");
@@ -9723,7 +9762,7 @@ function collectOutput(stream2, limit2, onOverflow) {
9723
9762
  value += chunk;
9724
9763
  });
9725
9764
  stream2.on("error", reject);
9726
- stream2.on("end", () => resolve4(value));
9765
+ stream2.on("end", () => resolve5(value));
9727
9766
  });
9728
9767
  }
9729
9768
  async function runMaintenanceInChildProcess(request, options = {}) {
@@ -9734,7 +9773,7 @@ async function runMaintenanceInChildProcess(request, options = {}) {
9734
9773
  }
9735
9774
  const timeoutMs = Number.isFinite(options.timeoutMs) ? Math.max(1e3, Math.floor(options.timeoutMs)) : DEFAULT_TIMEOUT_MS;
9736
9775
  const env2 = { ...process.env, ...options.env };
9737
- return new Promise((resolve4, reject) => {
9776
+ return new Promise((resolve5, reject) => {
9738
9777
  let settled = false;
9739
9778
  let child;
9740
9779
  try {
@@ -9774,7 +9813,7 @@ async function runMaintenanceInChildProcess(request, options = {}) {
9774
9813
  )));
9775
9814
  return;
9776
9815
  }
9777
- settle(() => resolve4(parseMaintenanceRunnerOutput(out)));
9816
+ settle(() => resolve5(parseMaintenanceRunnerOutput(out)));
9778
9817
  } catch (error) {
9779
9818
  settle(() => reject(error));
9780
9819
  }
@@ -19917,7 +19956,7 @@ var init_sleep = __esm({
19917
19956
  "node_modules/openai/internal/utils/sleep.mjs"() {
19918
19957
  "use strict";
19919
19958
  init_esm_shims();
19920
- sleep = (ms) => new Promise((resolve4) => setTimeout(resolve4, ms));
19959
+ sleep = (ms) => new Promise((resolve5) => setTimeout(resolve5, ms));
19921
19960
  }
19922
19961
  });
19923
19962
 
@@ -21106,8 +21145,8 @@ var init_api_promise = __esm({
21106
21145
  init_parse();
21107
21146
  APIPromise = class _APIPromise extends Promise {
21108
21147
  constructor(client, responsePromise, parseResponse2 = defaultParseResponse) {
21109
- super((resolve4) => {
21110
- resolve4(null);
21148
+ super((resolve5) => {
21149
+ resolve5(null);
21111
21150
  });
21112
21151
  this.responsePromise = responsePromise;
21113
21152
  this.parseResponse = parseResponse2;
@@ -21751,12 +21790,12 @@ var init_EventStream = __esm({
21751
21790
  _EventStream_errored.set(this, false);
21752
21791
  _EventStream_aborted.set(this, false);
21753
21792
  _EventStream_catchingPromiseCreated.set(this, false);
21754
- __classPrivateFieldSet(this, _EventStream_connectedPromise, new Promise((resolve4, reject) => {
21755
- __classPrivateFieldSet(this, _EventStream_resolveConnectedPromise, resolve4, "f");
21793
+ __classPrivateFieldSet(this, _EventStream_connectedPromise, new Promise((resolve5, reject) => {
21794
+ __classPrivateFieldSet(this, _EventStream_resolveConnectedPromise, resolve5, "f");
21756
21795
  __classPrivateFieldSet(this, _EventStream_rejectConnectedPromise, reject, "f");
21757
21796
  }), "f");
21758
- __classPrivateFieldSet(this, _EventStream_endPromise, new Promise((resolve4, reject) => {
21759
- __classPrivateFieldSet(this, _EventStream_resolveEndPromise, resolve4, "f");
21797
+ __classPrivateFieldSet(this, _EventStream_endPromise, new Promise((resolve5, reject) => {
21798
+ __classPrivateFieldSet(this, _EventStream_resolveEndPromise, resolve5, "f");
21760
21799
  __classPrivateFieldSet(this, _EventStream_rejectEndPromise, reject, "f");
21761
21800
  }), "f");
21762
21801
  __classPrivateFieldGet(this, _EventStream_connectedPromise, "f").catch(() => {
@@ -21840,11 +21879,11 @@ var init_EventStream = __esm({
21840
21879
  * const message = await stream.emitted('message') // rejects if the stream errors
21841
21880
  */
21842
21881
  emitted(event) {
21843
- return new Promise((resolve4, reject) => {
21882
+ return new Promise((resolve5, reject) => {
21844
21883
  __classPrivateFieldSet(this, _EventStream_catchingPromiseCreated, true, "f");
21845
21884
  if (event !== "error")
21846
21885
  this.once("error", reject);
21847
- this.once(event, resolve4);
21886
+ this.once(event, resolve5);
21848
21887
  });
21849
21888
  }
21850
21889
  async done() {
@@ -22913,7 +22952,7 @@ var init_ChatCompletionStream = __esm({
22913
22952
  if (done) {
22914
22953
  return { value: void 0, done: true };
22915
22954
  }
22916
- return new Promise((resolve4, reject) => readQueue.push({ resolve: resolve4, reject })).then((chunk2) => chunk2 ? { value: chunk2, done: false } : { value: void 0, done: true });
22955
+ return new Promise((resolve5, reject) => readQueue.push({ resolve: resolve5, reject })).then((chunk2) => chunk2 ? { value: chunk2, done: false } : { value: void 0, done: true });
22917
22956
  }
22918
22957
  const chunk = pushQueue.shift();
22919
22958
  return { value: chunk, done: false };
@@ -23896,7 +23935,7 @@ var init_AssistantStream = __esm({
23896
23935
  if (done) {
23897
23936
  return { value: void 0, done: true };
23898
23937
  }
23899
- return new Promise((resolve4, reject) => readQueue.push({ resolve: resolve4, reject })).then((chunk2) => chunk2 ? { value: chunk2, done: false } : { value: void 0, done: true });
23938
+ return new Promise((resolve5, reject) => readQueue.push({ resolve: resolve5, reject })).then((chunk2) => chunk2 ? { value: chunk2, done: false } : { value: void 0, done: true });
23900
23939
  }
23901
23940
  const chunk = pushQueue.shift();
23902
23941
  return { value: chunk, done: false };
@@ -26185,7 +26224,7 @@ var init_ResponseStream = __esm({
26185
26224
  if (done) {
26186
26225
  return { value: void 0, done: true };
26187
26226
  }
26188
- return new Promise((resolve4, reject) => readQueue.push({ resolve: resolve4, reject })).then((event2) => event2 ? { value: event2, done: false } : { value: void 0, done: true });
26227
+ return new Promise((resolve5, reject) => readQueue.push({ resolve: resolve5, reject })).then((event2) => event2 ? { value: event2, done: false } : { value: void 0, done: true });
26189
26228
  }
26190
26229
  const event = pushQueue.shift();
26191
26230
  return { value: event, done: false };
@@ -46395,8 +46434,8 @@ var init_event_stream = __esm({
46395
46434
  constructor(isComplete, extractResult) {
46396
46435
  this.isComplete = isComplete;
46397
46436
  this.extractResult = extractResult;
46398
- this.finalResultPromise = new Promise((resolve4) => {
46399
- this.resolveFinalResult = resolve4;
46437
+ this.finalResultPromise = new Promise((resolve5) => {
46438
+ this.resolveFinalResult = resolve5;
46400
46439
  });
46401
46440
  }
46402
46441
  push(event) {
@@ -46430,7 +46469,7 @@ var init_event_stream = __esm({
46430
46469
  } else if (this.done) {
46431
46470
  return;
46432
46471
  } else {
46433
- const result = await new Promise((resolve4) => this.waiting.push(resolve4));
46472
+ const result = await new Promise((resolve5) => this.waiting.push(resolve5));
46434
46473
  if (result.done)
46435
46474
  return;
46436
46475
  yield result.value;
@@ -46701,7 +46740,7 @@ var init_sleep2 = __esm({
46701
46740
  "node_modules/@anthropic-ai/sdk/internal/utils/sleep.mjs"() {
46702
46741
  "use strict";
46703
46742
  init_esm_shims();
46704
- sleep2 = (ms) => new Promise((resolve4) => setTimeout(resolve4, ms));
46743
+ sleep2 = (ms) => new Promise((resolve5) => setTimeout(resolve5, ms));
46705
46744
  }
46706
46745
  });
46707
46746
 
@@ -47501,8 +47540,8 @@ var init_api_promise2 = __esm({
47501
47540
  init_parse2();
47502
47541
  APIPromise2 = class _APIPromise extends Promise {
47503
47542
  constructor(client, responsePromise, parseResponse2 = defaultParseResponse2) {
47504
- super((resolve4) => {
47505
- resolve4(null);
47543
+ super((resolve5) => {
47544
+ resolve5(null);
47506
47545
  });
47507
47546
  this.responsePromise = responsePromise;
47508
47547
  this.parseResponse = parseResponse2;
@@ -49463,12 +49502,12 @@ var init_BetaMessageStream = __esm({
49463
49502
  }
49464
49503
  return this._emit("error", new AnthropicError(String(error)));
49465
49504
  });
49466
- __classPrivateFieldSet2(this, _BetaMessageStream_connectedPromise, new Promise((resolve4, reject) => {
49467
- __classPrivateFieldSet2(this, _BetaMessageStream_resolveConnectedPromise, resolve4, "f");
49505
+ __classPrivateFieldSet2(this, _BetaMessageStream_connectedPromise, new Promise((resolve5, reject) => {
49506
+ __classPrivateFieldSet2(this, _BetaMessageStream_resolveConnectedPromise, resolve5, "f");
49468
49507
  __classPrivateFieldSet2(this, _BetaMessageStream_rejectConnectedPromise, reject, "f");
49469
49508
  }), "f");
49470
- __classPrivateFieldSet2(this, _BetaMessageStream_endPromise, new Promise((resolve4, reject) => {
49471
- __classPrivateFieldSet2(this, _BetaMessageStream_resolveEndPromise, resolve4, "f");
49509
+ __classPrivateFieldSet2(this, _BetaMessageStream_endPromise, new Promise((resolve5, reject) => {
49510
+ __classPrivateFieldSet2(this, _BetaMessageStream_resolveEndPromise, resolve5, "f");
49472
49511
  __classPrivateFieldSet2(this, _BetaMessageStream_rejectEndPromise, reject, "f");
49473
49512
  }), "f");
49474
49513
  __classPrivateFieldGet2(this, _BetaMessageStream_connectedPromise, "f").catch(() => {
@@ -49638,11 +49677,11 @@ var init_BetaMessageStream = __esm({
49638
49677
  * const message = await stream.emitted('message') // rejects if the stream errors
49639
49678
  */
49640
49679
  emitted(event) {
49641
- return new Promise((resolve4, reject) => {
49680
+ return new Promise((resolve5, reject) => {
49642
49681
  __classPrivateFieldSet2(this, _BetaMessageStream_catchingPromiseCreated, true, "f");
49643
49682
  if (event !== "error")
49644
49683
  this.once("error", reject);
49645
- this.once(event, resolve4);
49684
+ this.once(event, resolve5);
49646
49685
  });
49647
49686
  }
49648
49687
  async done() {
@@ -49985,7 +50024,7 @@ var init_BetaMessageStream = __esm({
49985
50024
  if (done) {
49986
50025
  return { value: void 0, done: true };
49987
50026
  }
49988
- return new Promise((resolve4, reject) => readQueue.push({ resolve: resolve4, reject })).then((chunk2) => chunk2 ? { value: chunk2, done: false } : { value: void 0, done: true });
50027
+ return new Promise((resolve5, reject) => readQueue.push({ resolve: resolve5, reject })).then((chunk2) => chunk2 ? { value: chunk2, done: false } : { value: void 0, done: true });
49989
50028
  }
49990
50029
  const chunk = pushQueue.shift();
49991
50030
  return { value: chunk, done: false };
@@ -50060,13 +50099,13 @@ Wrap your summary in <summary></summary> tags.`;
50060
50099
 
50061
50100
  // node_modules/@anthropic-ai/sdk/lib/tools/BetaToolRunner.mjs
50062
50101
  function promiseWithResolvers() {
50063
- let resolve4;
50102
+ let resolve5;
50064
50103
  let reject;
50065
50104
  const promise = new Promise((res, rej) => {
50066
- resolve4 = res;
50105
+ resolve5 = res;
50067
50106
  reject = rej;
50068
50107
  });
50069
- return { promise, resolve: resolve4, reject };
50108
+ return { promise, resolve: resolve5, reject };
50070
50109
  }
50071
50110
  async function generateToolResponse(params, lastMessage = params.messages.at(-1), requestOptions) {
50072
50111
  if (!lastMessage || lastMessage.role !== "assistant" || !lastMessage.content || typeof lastMessage.content === "string") {
@@ -51924,12 +51963,12 @@ var init_MessageStream = __esm({
51924
51963
  }
51925
51964
  return this._emit("error", new AnthropicError(String(error)));
51926
51965
  });
51927
- __classPrivateFieldSet2(this, _MessageStream_connectedPromise, new Promise((resolve4, reject) => {
51928
- __classPrivateFieldSet2(this, _MessageStream_resolveConnectedPromise, resolve4, "f");
51966
+ __classPrivateFieldSet2(this, _MessageStream_connectedPromise, new Promise((resolve5, reject) => {
51967
+ __classPrivateFieldSet2(this, _MessageStream_resolveConnectedPromise, resolve5, "f");
51929
51968
  __classPrivateFieldSet2(this, _MessageStream_rejectConnectedPromise, reject, "f");
51930
51969
  }), "f");
51931
- __classPrivateFieldSet2(this, _MessageStream_endPromise, new Promise((resolve4, reject) => {
51932
- __classPrivateFieldSet2(this, _MessageStream_resolveEndPromise, resolve4, "f");
51970
+ __classPrivateFieldSet2(this, _MessageStream_endPromise, new Promise((resolve5, reject) => {
51971
+ __classPrivateFieldSet2(this, _MessageStream_resolveEndPromise, resolve5, "f");
51933
51972
  __classPrivateFieldSet2(this, _MessageStream_rejectEndPromise, reject, "f");
51934
51973
  }), "f");
51935
51974
  __classPrivateFieldGet2(this, _MessageStream_connectedPromise, "f").catch(() => {
@@ -52099,11 +52138,11 @@ var init_MessageStream = __esm({
52099
52138
  * const message = await stream.emitted('message') // rejects if the stream errors
52100
52139
  */
52101
52140
  emitted(event) {
52102
- return new Promise((resolve4, reject) => {
52141
+ return new Promise((resolve5, reject) => {
52103
52142
  __classPrivateFieldSet2(this, _MessageStream_catchingPromiseCreated, true, "f");
52104
52143
  if (event !== "error")
52105
52144
  this.once("error", reject);
52106
- this.once(event, resolve4);
52145
+ this.once(event, resolve5);
52107
52146
  });
52108
52147
  }
52109
52148
  async done() {
@@ -52421,7 +52460,7 @@ var init_MessageStream = __esm({
52421
52460
  if (done) {
52422
52461
  return { value: void 0, done: true };
52423
52462
  }
52424
- return new Promise((resolve4, reject) => readQueue.push({ resolve: resolve4, reject })).then((chunk2) => chunk2 ? { value: chunk2, done: false } : { value: void 0, done: true });
52463
+ return new Promise((resolve5, reject) => readQueue.push({ resolve: resolve5, reject })).then((chunk2) => chunk2 ? { value: chunk2, done: false } : { value: void 0, done: true });
52425
52464
  }
52426
52465
  const chunk = pushQueue.shift();
52427
52466
  return { value: chunk, done: false };
@@ -55799,7 +55838,7 @@ var require_p_retry = __commonJS({
55799
55838
  return error;
55800
55839
  };
55801
55840
  var isNetworkError = (errorMessage) => networkErrorMsgs.includes(errorMessage);
55802
- var pRetry2 = (input, options) => new Promise((resolve4, reject) => {
55841
+ var pRetry2 = (input, options) => new Promise((resolve5, reject) => {
55803
55842
  options = {
55804
55843
  onFailedAttempt: () => {
55805
55844
  },
@@ -55809,7 +55848,7 @@ var require_p_retry = __commonJS({
55809
55848
  const operation = retry2.operation(options);
55810
55849
  operation.attempt(async (attemptNumber) => {
55811
55850
  try {
55812
- resolve4(await input(attemptNumber));
55851
+ resolve5(await input(attemptNumber));
55813
55852
  } catch (error) {
55814
55853
  if (!(error instanceof Error)) {
55815
55854
  reject(new TypeError(`Non-error was thrown: "${error}". You should only throw errors.`));
@@ -56347,8 +56386,8 @@ var require_retry3 = __commonJS({
56347
56386
  }
56348
56387
  const delay2 = getNextRetryDelay(config);
56349
56388
  err.config.retryConfig.currentRetryAttempt += 1;
56350
- const backoff = config.retryBackoff ? config.retryBackoff(err, delay2) : new Promise((resolve4) => {
56351
- setTimeout(resolve4, delay2);
56389
+ const backoff = config.retryBackoff ? config.retryBackoff(err, delay2) : new Promise((resolve5) => {
56390
+ setTimeout(resolve5, delay2);
56352
56391
  });
56353
56392
  if (config.onRetryAttempt) {
56354
56393
  await config.onRetryAttempt(err);
@@ -57265,8 +57304,8 @@ var require_helpers = __commonJS({
57265
57304
  function req(url, opts = {}) {
57266
57305
  const href = typeof url === "string" ? url : url.href;
57267
57306
  const req2 = (href.startsWith("https:") ? https2 : http3).request(url, opts);
57268
- const promise = new Promise((resolve4, reject) => {
57269
- req2.once("response", resolve4).once("error", reject).end();
57307
+ const promise = new Promise((resolve5, reject) => {
57308
+ req2.once("response", resolve5).once("error", reject).end();
57270
57309
  });
57271
57310
  req2.then = promise.then.bind(promise);
57272
57311
  return req2;
@@ -57445,7 +57484,7 @@ var require_parse_proxy_response = __commonJS({
57445
57484
  var debug_1 = __importDefault(require_src());
57446
57485
  var debug = (0, debug_1.default)("https-proxy-agent:parse-proxy-response");
57447
57486
  function parseProxyResponse(socket) {
57448
- return new Promise((resolve4, reject) => {
57487
+ return new Promise((resolve5, reject) => {
57449
57488
  let buffersLength = 0;
57450
57489
  const buffers = [];
57451
57490
  function read() {
@@ -57511,7 +57550,7 @@ var require_parse_proxy_response = __commonJS({
57511
57550
  }
57512
57551
  debug("got proxy server response: %o %o", firstLine, headers);
57513
57552
  cleanup();
57514
- resolve4({
57553
+ resolve5({
57515
57554
  connect: {
57516
57555
  statusCode,
57517
57556
  statusText,
@@ -57758,7 +57797,7 @@ var require_ponyfill_es2018 = __commonJS({
57758
57797
  return new originalPromise(executor);
57759
57798
  }
57760
57799
  function promiseResolvedWith(value) {
57761
- return newPromise((resolve4) => resolve4(value));
57800
+ return newPromise((resolve5) => resolve5(value));
57762
57801
  }
57763
57802
  function promiseRejectedWith(reason) {
57764
57803
  return originalPromiseReject(reason);
@@ -57928,8 +57967,8 @@ var require_ponyfill_es2018 = __commonJS({
57928
57967
  return new TypeError("Cannot " + name + " a stream using a released reader");
57929
57968
  }
57930
57969
  function defaultReaderClosedPromiseInitialize(reader2) {
57931
- reader2._closedPromise = newPromise((resolve4, reject) => {
57932
- reader2._closedPromise_resolve = resolve4;
57970
+ reader2._closedPromise = newPromise((resolve5, reject) => {
57971
+ reader2._closedPromise_resolve = resolve5;
57933
57972
  reader2._closedPromise_reject = reject;
57934
57973
  });
57935
57974
  }
@@ -58103,8 +58142,8 @@ var require_ponyfill_es2018 = __commonJS({
58103
58142
  }
58104
58143
  let resolvePromise;
58105
58144
  let rejectPromise;
58106
- const promise = newPromise((resolve4, reject) => {
58107
- resolvePromise = resolve4;
58145
+ const promise = newPromise((resolve5, reject) => {
58146
+ resolvePromise = resolve5;
58108
58147
  rejectPromise = reject;
58109
58148
  });
58110
58149
  const readRequest = {
@@ -58209,8 +58248,8 @@ var require_ponyfill_es2018 = __commonJS({
58209
58248
  const reader2 = this._reader;
58210
58249
  let resolvePromise;
58211
58250
  let rejectPromise;
58212
- const promise = newPromise((resolve4, reject) => {
58213
- resolvePromise = resolve4;
58251
+ const promise = newPromise((resolve5, reject) => {
58252
+ resolvePromise = resolve5;
58214
58253
  rejectPromise = reject;
58215
58254
  });
58216
58255
  const readRequest = {
@@ -59229,8 +59268,8 @@ var require_ponyfill_es2018 = __commonJS({
59229
59268
  }
59230
59269
  let resolvePromise;
59231
59270
  let rejectPromise;
59232
- const promise = newPromise((resolve4, reject) => {
59233
- resolvePromise = resolve4;
59271
+ const promise = newPromise((resolve5, reject) => {
59272
+ resolvePromise = resolve5;
59234
59273
  rejectPromise = reject;
59235
59274
  });
59236
59275
  const readIntoRequest = {
@@ -59542,10 +59581,10 @@ var require_ponyfill_es2018 = __commonJS({
59542
59581
  wasAlreadyErroring = true;
59543
59582
  reason = void 0;
59544
59583
  }
59545
- const promise = newPromise((resolve4, reject) => {
59584
+ const promise = newPromise((resolve5, reject) => {
59546
59585
  stream2._pendingAbortRequest = {
59547
59586
  _promise: void 0,
59548
- _resolve: resolve4,
59587
+ _resolve: resolve5,
59549
59588
  _reject: reject,
59550
59589
  _reason: reason,
59551
59590
  _wasAlreadyErroring: wasAlreadyErroring
@@ -59562,9 +59601,9 @@ var require_ponyfill_es2018 = __commonJS({
59562
59601
  if (state === "closed" || state === "errored") {
59563
59602
  return promiseRejectedWith(new TypeError(`The stream (in ${state} state) is not in the writable state and cannot be closed`));
59564
59603
  }
59565
- const promise = newPromise((resolve4, reject) => {
59604
+ const promise = newPromise((resolve5, reject) => {
59566
59605
  const closeRequest = {
59567
- _resolve: resolve4,
59606
+ _resolve: resolve5,
59568
59607
  _reject: reject
59569
59608
  };
59570
59609
  stream2._closeRequest = closeRequest;
@@ -59577,9 +59616,9 @@ var require_ponyfill_es2018 = __commonJS({
59577
59616
  return promise;
59578
59617
  }
59579
59618
  function WritableStreamAddWriteRequest(stream2) {
59580
- const promise = newPromise((resolve4, reject) => {
59619
+ const promise = newPromise((resolve5, reject) => {
59581
59620
  const writeRequest = {
59582
- _resolve: resolve4,
59621
+ _resolve: resolve5,
59583
59622
  _reject: reject
59584
59623
  };
59585
59624
  stream2._writeRequests.push(writeRequest);
@@ -60195,8 +60234,8 @@ var require_ponyfill_es2018 = __commonJS({
60195
60234
  return new TypeError("Cannot " + name + " a stream using a released writer");
60196
60235
  }
60197
60236
  function defaultWriterClosedPromiseInitialize(writer) {
60198
- writer._closedPromise = newPromise((resolve4, reject) => {
60199
- writer._closedPromise_resolve = resolve4;
60237
+ writer._closedPromise = newPromise((resolve5, reject) => {
60238
+ writer._closedPromise_resolve = resolve5;
60200
60239
  writer._closedPromise_reject = reject;
60201
60240
  writer._closedPromiseState = "pending";
60202
60241
  });
@@ -60232,8 +60271,8 @@ var require_ponyfill_es2018 = __commonJS({
60232
60271
  writer._closedPromiseState = "resolved";
60233
60272
  }
60234
60273
  function defaultWriterReadyPromiseInitialize(writer) {
60235
- writer._readyPromise = newPromise((resolve4, reject) => {
60236
- writer._readyPromise_resolve = resolve4;
60274
+ writer._readyPromise = newPromise((resolve5, reject) => {
60275
+ writer._readyPromise_resolve = resolve5;
60237
60276
  writer._readyPromise_reject = reject;
60238
60277
  });
60239
60278
  writer._readyPromiseState = "pending";
@@ -60320,7 +60359,7 @@ var require_ponyfill_es2018 = __commonJS({
60320
60359
  source._disturbed = true;
60321
60360
  let shuttingDown = false;
60322
60361
  let currentWrite = promiseResolvedWith(void 0);
60323
- return newPromise((resolve4, reject) => {
60362
+ return newPromise((resolve5, reject) => {
60324
60363
  let abortAlgorithm;
60325
60364
  if (signal !== void 0) {
60326
60365
  abortAlgorithm = () => {
@@ -60465,7 +60504,7 @@ var require_ponyfill_es2018 = __commonJS({
60465
60504
  if (isError) {
60466
60505
  reject(error);
60467
60506
  } else {
60468
- resolve4(void 0);
60507
+ resolve5(void 0);
60469
60508
  }
60470
60509
  return null;
60471
60510
  }
@@ -60746,8 +60785,8 @@ var require_ponyfill_es2018 = __commonJS({
60746
60785
  let branch1;
60747
60786
  let branch2;
60748
60787
  let resolveCancelPromise;
60749
- const cancelPromise = newPromise((resolve4) => {
60750
- resolveCancelPromise = resolve4;
60788
+ const cancelPromise = newPromise((resolve5) => {
60789
+ resolveCancelPromise = resolve5;
60751
60790
  });
60752
60791
  function pullAlgorithm() {
60753
60792
  if (reading) {
@@ -60838,8 +60877,8 @@ var require_ponyfill_es2018 = __commonJS({
60838
60877
  let branch1;
60839
60878
  let branch2;
60840
60879
  let resolveCancelPromise;
60841
- const cancelPromise = newPromise((resolve4) => {
60842
- resolveCancelPromise = resolve4;
60880
+ const cancelPromise = newPromise((resolve5) => {
60881
+ resolveCancelPromise = resolve5;
60843
60882
  });
60844
60883
  function forwardReaderError(thisReader) {
60845
60884
  uponRejection(thisReader._closedPromise, (r2) => {
@@ -61619,8 +61658,8 @@ var require_ponyfill_es2018 = __commonJS({
61619
61658
  const writableHighWaterMark = ExtractHighWaterMark(writableStrategy, 1);
61620
61659
  const writableSizeAlgorithm = ExtractSizeAlgorithm(writableStrategy);
61621
61660
  let startPromise_resolve;
61622
- const startPromise = newPromise((resolve4) => {
61623
- startPromise_resolve = resolve4;
61661
+ const startPromise = newPromise((resolve5) => {
61662
+ startPromise_resolve = resolve5;
61624
61663
  });
61625
61664
  InitializeTransformStream(this, startPromise, writableHighWaterMark, writableSizeAlgorithm, readableHighWaterMark, readableSizeAlgorithm);
61626
61665
  SetUpTransformStreamDefaultControllerFromTransformer(this, transformer);
@@ -61713,8 +61752,8 @@ var require_ponyfill_es2018 = __commonJS({
61713
61752
  if (stream2._backpressureChangePromise !== void 0) {
61714
61753
  stream2._backpressureChangePromise_resolve();
61715
61754
  }
61716
- stream2._backpressureChangePromise = newPromise((resolve4) => {
61717
- stream2._backpressureChangePromise_resolve = resolve4;
61755
+ stream2._backpressureChangePromise = newPromise((resolve5) => {
61756
+ stream2._backpressureChangePromise_resolve = resolve5;
61718
61757
  });
61719
61758
  stream2._backpressure = backpressure;
61720
61759
  }
@@ -61882,8 +61921,8 @@ var require_ponyfill_es2018 = __commonJS({
61882
61921
  return controller._finishPromise;
61883
61922
  }
61884
61923
  const readable = stream2._readable;
61885
- controller._finishPromise = newPromise((resolve4, reject) => {
61886
- controller._finishPromise_resolve = resolve4;
61924
+ controller._finishPromise = newPromise((resolve5, reject) => {
61925
+ controller._finishPromise_resolve = resolve5;
61887
61926
  controller._finishPromise_reject = reject;
61888
61927
  });
61889
61928
  const cancelPromise = controller._cancelAlgorithm(reason);
@@ -61909,8 +61948,8 @@ var require_ponyfill_es2018 = __commonJS({
61909
61948
  return controller._finishPromise;
61910
61949
  }
61911
61950
  const readable = stream2._readable;
61912
- controller._finishPromise = newPromise((resolve4, reject) => {
61913
- controller._finishPromise_resolve = resolve4;
61951
+ controller._finishPromise = newPromise((resolve5, reject) => {
61952
+ controller._finishPromise_resolve = resolve5;
61914
61953
  controller._finishPromise_reject = reject;
61915
61954
  });
61916
61955
  const flushPromise = controller._flushAlgorithm();
@@ -61940,8 +61979,8 @@ var require_ponyfill_es2018 = __commonJS({
61940
61979
  return controller._finishPromise;
61941
61980
  }
61942
61981
  const writable = stream2._writable;
61943
- controller._finishPromise = newPromise((resolve4, reject) => {
61944
- controller._finishPromise_resolve = resolve4;
61982
+ controller._finishPromise = newPromise((resolve5, reject) => {
61983
+ controller._finishPromise_resolve = resolve5;
61945
61984
  controller._finishPromise_reject = reject;
61946
61985
  });
61947
61986
  const cancelPromise = controller._cancelAlgorithm(reason);
@@ -63928,7 +63967,7 @@ import zlib from "zlib";
63928
63967
  import Stream4, { PassThrough as PassThrough2, pipeline as pump } from "stream";
63929
63968
  import { Buffer as Buffer3 } from "buffer";
63930
63969
  async function fetch2(url, options_) {
63931
- return new Promise((resolve4, reject) => {
63970
+ return new Promise((resolve5, reject) => {
63932
63971
  const request = new Request2(url, options_);
63933
63972
  const { parsedURL, options } = getNodeRequestOptions(request);
63934
63973
  if (!supportedSchemas.has(parsedURL.protocol)) {
@@ -63937,7 +63976,7 @@ async function fetch2(url, options_) {
63937
63976
  if (parsedURL.protocol === "data:") {
63938
63977
  const data = dist_default(request.url);
63939
63978
  const response2 = new Response2(data, { headers: { "Content-Type": data.typeFull } });
63940
- resolve4(response2);
63979
+ resolve5(response2);
63941
63980
  return;
63942
63981
  }
63943
63982
  const send = (parsedURL.protocol === "https:" ? https : http2).request;
@@ -64059,7 +64098,7 @@ async function fetch2(url, options_) {
64059
64098
  if (responseReferrerPolicy) {
64060
64099
  requestOptions.referrerPolicy = responseReferrerPolicy;
64061
64100
  }
64062
- resolve4(fetch2(new Request2(locationURL, requestOptions)));
64101
+ resolve5(fetch2(new Request2(locationURL, requestOptions)));
64063
64102
  finalize();
64064
64103
  return;
64065
64104
  }
@@ -64092,7 +64131,7 @@ async function fetch2(url, options_) {
64092
64131
  const codings = headers.get("Content-Encoding");
64093
64132
  if (!request.compress || request.method === "HEAD" || codings === null || response_.statusCode === 204 || response_.statusCode === 304) {
64094
64133
  response = new Response2(body, responseOptions);
64095
- resolve4(response);
64134
+ resolve5(response);
64096
64135
  return;
64097
64136
  }
64098
64137
  const zlibOptions = {
@@ -64106,7 +64145,7 @@ async function fetch2(url, options_) {
64106
64145
  }
64107
64146
  });
64108
64147
  response = new Response2(body, responseOptions);
64109
- resolve4(response);
64148
+ resolve5(response);
64110
64149
  return;
64111
64150
  }
64112
64151
  if (codings === "deflate" || codings === "x-deflate") {
@@ -64130,12 +64169,12 @@ async function fetch2(url, options_) {
64130
64169
  });
64131
64170
  }
64132
64171
  response = new Response2(body, responseOptions);
64133
- resolve4(response);
64172
+ resolve5(response);
64134
64173
  });
64135
64174
  raw.once("end", () => {
64136
64175
  if (!response) {
64137
64176
  response = new Response2(body, responseOptions);
64138
- resolve4(response);
64177
+ resolve5(response);
64139
64178
  }
64140
64179
  });
64141
64180
  return;
@@ -64147,11 +64186,11 @@ async function fetch2(url, options_) {
64147
64186
  }
64148
64187
  });
64149
64188
  response = new Response2(body, responseOptions);
64150
- resolve4(response);
64189
+ resolve5(response);
64151
64190
  return;
64152
64191
  }
64153
64192
  response = new Response2(body, responseOptions);
64154
- resolve4(response);
64193
+ resolve5(response);
64155
64194
  });
64156
64195
  writeToStream(request_, request).catch(reject);
64157
64196
  });
@@ -70274,7 +70313,7 @@ var require_jwtaccess = __commonJS({
70274
70313
  }
70275
70314
  }
70276
70315
  fromStreamAsync(inputStream) {
70277
- return new Promise((resolve4, reject) => {
70316
+ return new Promise((resolve5, reject) => {
70278
70317
  if (!inputStream) {
70279
70318
  reject(new Error("Must pass in a stream containing the service account auth settings."));
70280
70319
  }
@@ -70283,7 +70322,7 @@ var require_jwtaccess = __commonJS({
70283
70322
  try {
70284
70323
  const data = JSON.parse(s2);
70285
70324
  this.fromJSON(data);
70286
- resolve4();
70325
+ resolve5();
70287
70326
  } catch (err) {
70288
70327
  reject(err);
70289
70328
  }
@@ -70523,7 +70562,7 @@ var require_jwtclient = __commonJS({
70523
70562
  }
70524
70563
  }
70525
70564
  fromStreamAsync(inputStream) {
70526
- return new Promise((resolve4, reject) => {
70565
+ return new Promise((resolve5, reject) => {
70527
70566
  if (!inputStream) {
70528
70567
  throw new Error("Must pass in a stream containing the service account auth settings.");
70529
70568
  }
@@ -70532,7 +70571,7 @@ var require_jwtclient = __commonJS({
70532
70571
  try {
70533
70572
  const data = JSON.parse(s2);
70534
70573
  this.fromJSON(data);
70535
- resolve4();
70574
+ resolve5();
70536
70575
  } catch (e2) {
70537
70576
  reject(e2);
70538
70577
  }
@@ -70666,7 +70705,7 @@ var require_refreshclient = __commonJS({
70666
70705
  }
70667
70706
  }
70668
70707
  async fromStreamAsync(inputStream) {
70669
- return new Promise((resolve4, reject) => {
70708
+ return new Promise((resolve5, reject) => {
70670
70709
  if (!inputStream) {
70671
70710
  return reject(new Error("Must pass in a stream containing the user refresh token."));
70672
70711
  }
@@ -70675,7 +70714,7 @@ var require_refreshclient = __commonJS({
70675
70714
  try {
70676
70715
  const data = JSON.parse(s2);
70677
70716
  this.fromJSON(data);
70678
- return resolve4();
70717
+ return resolve5();
70679
70718
  } catch (err) {
70680
70719
  return reject(err);
70681
70720
  }
@@ -72521,7 +72560,7 @@ var require_pluggable_auth_handler = __commonJS({
72521
72560
  * @return A promise that resolves with the executable response.
72522
72561
  */
72523
72562
  retrieveResponseFromExecutable(envMap) {
72524
- return new Promise((resolve4, reject) => {
72563
+ return new Promise((resolve5, reject) => {
72525
72564
  const child = childProcess.spawn(this.commandComponents[0], this.commandComponents.slice(1), {
72526
72565
  env: { ...process.env, ...Object.fromEntries(envMap) }
72527
72566
  });
@@ -72543,7 +72582,7 @@ var require_pluggable_auth_handler = __commonJS({
72543
72582
  try {
72544
72583
  const responseJson = JSON.parse(output);
72545
72584
  const response = new executable_response_1.ExecutableResponse(responseJson);
72546
- return resolve4(response);
72585
+ return resolve5(response);
72547
72586
  } catch (error) {
72548
72587
  if (error instanceof executable_response_1.ExecutableResponseError) {
72549
72588
  return reject(error);
@@ -73738,7 +73777,7 @@ var require_googleauth = __commonJS({
73738
73777
  }
73739
73778
  }
73740
73779
  fromStreamAsync(inputStream, options) {
73741
- return new Promise((resolve4, reject) => {
73780
+ return new Promise((resolve5, reject) => {
73742
73781
  if (!inputStream) {
73743
73782
  throw new Error("Must pass in a stream containing the Google auth settings.");
73744
73783
  }
@@ -73748,7 +73787,7 @@ var require_googleauth = __commonJS({
73748
73787
  try {
73749
73788
  const data = JSON.parse(chunks.join(""));
73750
73789
  const r2 = this._cacheClientFromJSON(data, options);
73751
- return resolve4(r2);
73790
+ return resolve5(r2);
73752
73791
  } catch (err) {
73753
73792
  if (!this.keyFilename)
73754
73793
  throw err;
@@ -73758,7 +73797,7 @@ var require_googleauth = __commonJS({
73758
73797
  });
73759
73798
  this.cachedCredential = client;
73760
73799
  this.setGapicJWTValues(client);
73761
- return resolve4(client);
73800
+ return resolve5(client);
73762
73801
  }
73763
73802
  } catch (err) {
73764
73803
  return reject(err);
@@ -73794,17 +73833,17 @@ var require_googleauth = __commonJS({
73794
73833
  * Run the Google Cloud SDK command that prints the default project ID
73795
73834
  */
73796
73835
  async getDefaultServiceProjectId() {
73797
- return new Promise((resolve4) => {
73836
+ return new Promise((resolve5) => {
73798
73837
  (0, child_process_1.exec)("gcloud config config-helper --format json", (err, stdout) => {
73799
73838
  if (!err && stdout) {
73800
73839
  try {
73801
73840
  const projectId = JSON.parse(stdout).configuration.properties.core.project;
73802
- resolve4(projectId);
73841
+ resolve5(projectId);
73803
73842
  return;
73804
73843
  } catch (e2) {
73805
73844
  }
73806
73845
  }
73807
- resolve4(null);
73846
+ resolve5(null);
73808
73847
  });
73809
73848
  });
73810
73849
  }
@@ -81482,14 +81521,14 @@ function __asyncValues(o) {
81482
81521
  }, i2);
81483
81522
  function verb(n) {
81484
81523
  i2[n] = o[n] && function(v) {
81485
- return new Promise(function(resolve4, reject) {
81486
- v = o[n](v), settle(resolve4, reject, v.done, v.value);
81524
+ return new Promise(function(resolve5, reject) {
81525
+ v = o[n](v), settle(resolve5, reject, v.done, v.value);
81487
81526
  });
81488
81527
  };
81489
81528
  }
81490
- function settle(resolve4, reject, d, v) {
81529
+ function settle(resolve5, reject, d, v) {
81491
81530
  Promise.resolve(v).then(function(v2) {
81492
- resolve4({ value: v2, done: d });
81531
+ resolve5({ value: v2, done: d });
81493
81532
  }, reject);
81494
81533
  }
81495
81534
  }
@@ -91859,8 +91898,8 @@ var init_node = __esm({
91859
91898
  const url = `${websocketBaseUrl}/ws/google.ai.generativelanguage.${apiVersion}.GenerativeService.BidiGenerateMusic?key=${apiKey}`;
91860
91899
  let onopenResolve = () => {
91861
91900
  };
91862
- const onopenPromise = new Promise((resolve4) => {
91863
- onopenResolve = resolve4;
91901
+ const onopenPromise = new Promise((resolve5) => {
91902
+ onopenResolve = resolve5;
91864
91903
  });
91865
91904
  const callbacks = params.callbacks;
91866
91905
  const onopenAwaitedCallback = function() {
@@ -92066,8 +92105,8 @@ var init_node = __esm({
92066
92105
  }
92067
92106
  let onopenResolve = () => {
92068
92107
  };
92069
- const onopenPromise = new Promise((resolve4) => {
92070
- onopenResolve = resolve4;
92108
+ const onopenPromise = new Promise((resolve5) => {
92109
+ onopenResolve = resolve5;
92071
92110
  });
92072
92111
  const callbacks = params.callbacks;
92073
92112
  const onopenAwaitedCallback = function() {
@@ -94415,7 +94454,7 @@ var init_node = __esm({
94415
94454
  return void 0;
94416
94455
  }
94417
94456
  };
94418
- sleep$1 = (ms) => new Promise((resolve4) => setTimeout(resolve4, ms));
94457
+ sleep$1 = (ms) => new Promise((resolve5) => setTimeout(resolve5, ms));
94419
94458
  FallbackEncoder3 = ({ headers, body }) => {
94420
94459
  return {
94421
94460
  bodyHeaders: {
@@ -94924,8 +94963,8 @@ ${underline}`);
94924
94963
  };
94925
94964
  APIPromise3 = class _APIPromise extends Promise {
94926
94965
  constructor(client, responsePromise, parseResponse2 = defaultParseResponse3) {
94927
- super((resolve4) => {
94928
- resolve4(null);
94966
+ super((resolve5) => {
94967
+ resolve5(null);
94929
94968
  });
94930
94969
  this.responsePromise = responsePromise;
94931
94970
  this.parseResponse = parseResponse2;
@@ -98156,7 +98195,7 @@ function retryIntervalFromResponse(res) {
98156
98195
  return 0;
98157
98196
  }
98158
98197
  async function delay(delay2) {
98159
- return new Promise((resolve4) => setTimeout(resolve4, delay2));
98198
+ return new Promise((resolve5) => setTimeout(resolve5, delay2));
98160
98199
  }
98161
98200
  var defaultBackoff, PermanentError, TemporaryError, codeRangeRE2;
98162
98201
  var init_retries = __esm({
@@ -135735,12 +135774,12 @@ function capRetryDelayMs(delayMs, options) {
135735
135774
  return maxRetryDelayMs > 0 ? Math.min(delayMs, maxRetryDelayMs) : delayMs;
135736
135775
  }
135737
135776
  function sleep4(ms, signal) {
135738
- return new Promise((resolve4, reject) => {
135777
+ return new Promise((resolve5, reject) => {
135739
135778
  if (signal?.aborted) {
135740
135779
  reject(new Error("Request was aborted"));
135741
135780
  return;
135742
135781
  }
135743
- const timeout = setTimeout(resolve4, ms);
135782
+ const timeout = setTimeout(resolve5, ms);
135744
135783
  signal?.addEventListener("abort", () => {
135745
135784
  clearTimeout(timeout);
135746
135785
  reject(new Error("Request was aborted"));
@@ -136072,7 +136111,7 @@ async function connectWebSocket(url, headers, signal, connectTimeoutMs = DEFAULT
136072
136111
  }
136073
136112
  const wsHeaders = headersToRecord(headers);
136074
136113
  delete wsHeaders["OpenAI-Beta"];
136075
- return new Promise((resolve4, reject) => {
136114
+ return new Promise((resolve5, reject) => {
136076
136115
  let settled = false;
136077
136116
  let timeout;
136078
136117
  let socket;
@@ -136107,7 +136146,7 @@ async function connectWebSocket(url, headers, signal, connectTimeoutMs = DEFAULT
136107
136146
  return;
136108
136147
  settled = true;
136109
136148
  cleanup();
136110
- resolve4(socket);
136149
+ resolve5(socket);
136111
136150
  };
136112
136151
  const onError = (event) => {
136113
136152
  fail2(extractWebSocketError(event));
@@ -136264,9 +136303,9 @@ async function* parseWebSocket(socket, signal, idleTimeoutMs) {
136264
136303
  const wake = () => {
136265
136304
  if (!pending)
136266
136305
  return;
136267
- const resolve4 = pending;
136306
+ const resolve5 = pending;
136268
136307
  pending = null;
136269
- resolve4();
136308
+ resolve5();
136270
136309
  };
136271
136310
  const onMessage = (event) => {
136272
136311
  void (async () => {
@@ -136333,8 +136372,8 @@ async function* parseWebSocket(socket, signal, idleTimeoutMs) {
136333
136372
  if (done)
136334
136373
  break;
136335
136374
  let timeout;
136336
- await new Promise((resolve4, reject) => {
136337
- pending = resolve4;
136375
+ await new Promise((resolve5, reject) => {
136376
+ pending = resolve5;
136338
136377
  if (idleTimeoutMs !== void 0 && idleTimeoutMs > 0) {
136339
136378
  timeout = setTimeout(() => {
136340
136379
  const error = new Error(`WebSocket idle timeout after ${idleTimeoutMs}ms`);
@@ -152188,10 +152227,21 @@ __export(vector_backfill_runner_exports, {
152188
152227
  launchDetachedVectorBackfill: () => launchDetachedVectorBackfill,
152189
152228
  main: () => main,
152190
152229
  parseVectorBackfillRequest: () => parseVectorBackfillRequest,
152191
- resolveVectorBackfillRunnerPath: () => resolveVectorBackfillRunnerPath
152230
+ releaseVectorBackfillLock: () => releaseVectorBackfillLock,
152231
+ resolveVectorBackfillRunnerPath: () => resolveVectorBackfillRunnerPath,
152232
+ vectorBackfillLockPath: () => vectorBackfillLockPath
152192
152233
  });
152193
152234
  import { spawn as spawn4 } from "child_process";
152194
- import { existsSync as existsSync12 } from "fs";
152235
+ import {
152236
+ closeSync,
152237
+ existsSync as existsSync12,
152238
+ mkdirSync as mkdirSync2,
152239
+ openSync,
152240
+ readFileSync as readFileSync9,
152241
+ statSync as statSync4,
152242
+ unlinkSync,
152243
+ writeFileSync as writeFileSync2
152244
+ } from "fs";
152195
152245
  import path24 from "path";
152196
152246
  import { fileURLToPath as fileURLToPath5 } from "url";
152197
152247
  function isNonEmptyString(value) {
@@ -152218,10 +152268,104 @@ function parseVectorBackfillRequest(raw) {
152218
152268
  dataDir: value.dataDir
152219
152269
  };
152220
152270
  }
152271
+ function vectorBackfillLockPath(dataDir) {
152272
+ return path24.join(dataDir, VECTOR_BACKFILL_LOCK_FILE);
152273
+ }
152274
+ function processIsAlive(pid) {
152275
+ if (!Number.isSafeInteger(pid) || pid == null || pid <= 0) return false;
152276
+ try {
152277
+ process.kill(pid, 0);
152278
+ return true;
152279
+ } catch (error) {
152280
+ return error.code === "EPERM";
152281
+ }
152282
+ }
152283
+ function readVectorBackfillLock(lockPath) {
152284
+ try {
152285
+ const value = JSON.parse(readFileSync9(lockPath, "utf8"));
152286
+ if (typeof value.parentPid !== "number" || !Number.isSafeInteger(value.parentPid) || typeof value.startedAt !== "number" || !Number.isFinite(value.startedAt) || typeof value.projectId !== "string") return void 0;
152287
+ return {
152288
+ parentPid: value.parentPid,
152289
+ ...typeof value.childPid === "number" ? { childPid: value.childPid } : {},
152290
+ startedAt: value.startedAt,
152291
+ projectId: value.projectId
152292
+ };
152293
+ } catch {
152294
+ return void 0;
152295
+ }
152296
+ }
152297
+ function writeVectorBackfillLock(lockPath, value) {
152298
+ writeFileSync2(lockPath, `${JSON.stringify(value)}
152299
+ `, "utf8");
152300
+ }
152301
+ function acquireVectorBackfillLock(dataDir, projectId, preferredPath) {
152302
+ const lockPath = preferredPath ?? vectorBackfillLockPath(dataDir);
152303
+ mkdirSync2(path24.dirname(lockPath), { recursive: true });
152304
+ const initial = {
152305
+ parentPid: process.pid,
152306
+ startedAt: Date.now(),
152307
+ projectId
152308
+ };
152309
+ for (let attempt = 0; attempt < 2; attempt++) {
152310
+ try {
152311
+ const fd = openSync(lockPath, "wx");
152312
+ try {
152313
+ writeFileSync2(fd, `${JSON.stringify(initial)}
152314
+ `, "utf8");
152315
+ } finally {
152316
+ closeSync(fd);
152317
+ }
152318
+ return {
152319
+ path: lockPath,
152320
+ setChildPid(pid) {
152321
+ try {
152322
+ writeVectorBackfillLock(lockPath, { ...initial, childPid: pid });
152323
+ } catch {
152324
+ }
152325
+ },
152326
+ release() {
152327
+ try {
152328
+ unlinkSync(lockPath);
152329
+ } catch {
152330
+ }
152331
+ }
152332
+ };
152333
+ } catch (error) {
152334
+ if (error.code !== "EEXIST") return void 0;
152335
+ const existing = readVectorBackfillLock(lockPath);
152336
+ const ownerAlive = existing && (processIsAlive(existing.childPid) || processIsAlive(existing.parentPid));
152337
+ if (ownerAlive) return void 0;
152338
+ let stale = false;
152339
+ try {
152340
+ stale = Date.now() - statSync4(lockPath).mtimeMs >= STALE_LOCK_RECOVERY_MS;
152341
+ } catch {
152342
+ stale = false;
152343
+ }
152344
+ if (!existing && !stale) return void 0;
152345
+ try {
152346
+ unlinkSync(lockPath);
152347
+ } catch {
152348
+ return void 0;
152349
+ }
152350
+ }
152351
+ }
152352
+ return void 0;
152353
+ }
152354
+ function releaseVectorBackfillLock(lockPath = process.env.MEMORIX_VECTOR_BACKFILL_LOCK) {
152355
+ if (!lockPath) return;
152356
+ const lock = readVectorBackfillLock(lockPath);
152357
+ if (lock && lock.childPid !== process.pid) return;
152358
+ try {
152359
+ unlinkSync(lockPath);
152360
+ } catch {
152361
+ }
152362
+ }
152221
152363
  function launchDetachedVectorBackfill(request, options = {}) {
152222
152364
  const runnerPath = options.runnerPath ?? resolveVectorBackfillRunnerPath();
152223
152365
  const exists = options.exists ?? existsSync12;
152224
152366
  if (!exists(runnerPath)) return false;
152367
+ const lock = acquireVectorBackfillLock(request.dataDir, request.projectId, options.lockPath);
152368
+ if (!lock) return false;
152225
152369
  try {
152226
152370
  const child = (options.spawn ?? spawn4)(process.execPath, [runnerPath], {
152227
152371
  cwd: request.projectRoot,
@@ -152231,14 +152375,23 @@ function launchDetachedVectorBackfill(request, options = {}) {
152231
152375
  stdio: "ignore",
152232
152376
  // The request contains only local project metadata, never credentials.
152233
152377
  // Environment transport avoids a live stdin pipe keeping the CLI alive.
152234
- env: { ...process.env, MEMORIX_VECTOR_BACKFILL_REQUEST: JSON.stringify(request) },
152378
+ env: {
152379
+ ...process.env,
152380
+ MEMORIX_VECTOR_BACKFILL_REQUEST: JSON.stringify(request),
152381
+ MEMORIX_VECTOR_BACKFILL_LOCK: lock.path
152382
+ },
152235
152383
  windowsHide: true
152236
152384
  });
152385
+ if (child.pid) lock.setChildPid(child.pid);
152386
+ else lock.release();
152237
152387
  child.once?.("error", () => {
152238
152388
  });
152389
+ child.once?.("close", () => lock.release());
152390
+ if (typeof child.once !== "function") lock.release();
152239
152391
  child.unref();
152240
- return true;
152392
+ return Boolean(child.pid);
152241
152393
  } catch {
152394
+ lock.release();
152242
152395
  return false;
152243
152396
  }
152244
152397
  }
@@ -152250,22 +152403,42 @@ async function executeVectorBackfill(request) {
152250
152403
  await prepareSearchIndex();
152251
152404
  await getDeferredCachedVectorHydration()?.catch(() => {
152252
152405
  });
152406
+ const queue = new MaintenanceJobStore(request.dataDir);
152407
+ const targets = new MaintenanceTargetStore(request.dataDir);
152408
+ let preparedRoot = request.projectRoot;
152409
+ const prepareTarget = async (target) => {
152410
+ if (target.projectRoot === preparedRoot) return;
152411
+ initProjectRoot(target.projectRoot);
152412
+ loadDotenv(target.projectRoot);
152413
+ preparedRoot = target.projectRoot;
152414
+ };
152415
+ const handler = async (job) => {
152416
+ const target = targets.get(job.projectId) ?? (job.projectId === request.projectId ? { projectId: request.projectId, projectRoot: request.projectRoot, dataDir: request.dataDir, updatedAt: Date.now() } : void 0);
152417
+ if (!target) return { action: "reschedule", delayMs: 3e4 };
152418
+ await prepareTarget(target);
152419
+ return createProjectMaintenanceHandler(job.projectId, target.dataDir, target.projectRoot)(job);
152420
+ };
152253
152421
  const worker = new MaintenanceJobWorker(
152254
- new MaintenanceJobStore(request.dataDir),
152255
- createProjectMaintenanceHandler(request.projectId, request.dataDir, request.projectRoot),
152256
- { projectId: request.projectId, kinds: ["vector-backfill"] }
152422
+ queue,
152423
+ handler,
152424
+ { kinds: ["vector-backfill"] }
152257
152425
  );
152258
- return worker.runOnce();
152426
+ let result = { state: "idle" };
152427
+ while (true) {
152428
+ result = await worker.runOnce();
152429
+ if (result.state === "idle") break;
152430
+ }
152431
+ return result;
152259
152432
  }
152260
152433
  async function readStdin() {
152261
- return new Promise((resolve4, reject) => {
152434
+ return new Promise((resolve5, reject) => {
152262
152435
  let raw = "";
152263
152436
  process.stdin.setEncoding("utf8");
152264
152437
  process.stdin.on("data", (chunk) => {
152265
152438
  raw += chunk;
152266
152439
  });
152267
152440
  process.stdin.once("error", reject);
152268
- process.stdin.once("end", () => resolve4(raw));
152441
+ process.stdin.once("end", () => resolve5(raw));
152269
152442
  });
152270
152443
  }
152271
152444
  async function main() {
@@ -152278,9 +152451,11 @@ async function main() {
152278
152451
  `);
152279
152452
  process.exitCode = 1;
152280
152453
  } finally {
152454
+ releaseVectorBackfillLock();
152281
152455
  closeAllDatabases();
152282
152456
  }
152283
152457
  }
152458
+ var VECTOR_BACKFILL_LOCK_FILE, STALE_LOCK_RECOVERY_MS;
152284
152459
  var init_vector_backfill_runner = __esm({
152285
152460
  "src/runtime/vector-backfill-runner.ts"() {
152286
152461
  "use strict";
@@ -152293,7 +152468,10 @@ var init_vector_backfill_runner = __esm({
152293
152468
  init_orama_store();
152294
152469
  init_sqlite_db();
152295
152470
  init_maintenance_jobs();
152471
+ init_maintenance_targets();
152296
152472
  init_project_maintenance();
152473
+ VECTOR_BACKFILL_LOCK_FILE = ".memorix-vector-backfill.lock";
152474
+ STALE_LOCK_RECOVERY_MS = 24 * 60 * 60 * 1e3;
152297
152475
  if (process.argv[1] && process.argv[1].endsWith("vector-backfill-runner.js")) {
152298
152476
  void main();
152299
152477
  }
@@ -152335,11 +152513,17 @@ function resetObservationRuntime() {
152335
152513
  embeddingWorkerProjectRoot = void 0;
152336
152514
  vectorMissingIds.clear();
152337
152515
  vectorSchemaUpgradePromise = null;
152516
+ embeddingFailureLogTimestamps.clear();
152338
152517
  }
152339
152518
  function logEmbeddingFailureOnce(key, message) {
152340
152519
  const now3 = Date.now();
152341
152520
  const last = embeddingFailureLogTimestamps.get(key) ?? 0;
152342
152521
  if (now3 - last < EMBEDDING_FAILURE_LOG_COOLDOWN_MS) return;
152522
+ if (!embeddingFailureLogTimestamps.has(key) && embeddingFailureLogTimestamps.size >= MAX_EMBEDDING_FAILURE_KEYS) {
152523
+ const oldest = embeddingFailureLogTimestamps.keys().next().value;
152524
+ if (oldest !== void 0) embeddingFailureLogTimestamps.delete(oldest);
152525
+ }
152526
+ embeddingFailureLogTimestamps.delete(key);
152343
152527
  embeddingFailureLogTimestamps.set(key, now3);
152344
152528
  console.error(message);
152345
152529
  }
@@ -152369,13 +152553,14 @@ function queueVectorBackfill(projectId, options = {}) {
152369
152553
  const dataDir = projectDir;
152370
152554
  if (!dataDir) return;
152371
152555
  void Promise.resolve().then(() => (init_maintenance_jobs(), maintenance_jobs_exports)).then(({ MaintenanceJobStore: MaintenanceJobStore2 }) => {
152372
- new MaintenanceJobStore2(dataDir).enqueue({
152556
+ const job = new MaintenanceJobStore2(dataDir).enqueue({
152373
152557
  projectId,
152374
152558
  kind: "vector-backfill",
152375
152559
  dedupeKey: "vector-backfill",
152376
152560
  payload: { limit: 12 }
152377
152561
  });
152378
- if (options.detachedWorker && options.projectRoot) {
152562
+ const due = !job || job.status === "pending" && job.runAfter <= Date.now();
152563
+ if (due && options.detachedWorker && options.projectRoot) {
152379
152564
  void Promise.resolve().then(() => (init_vector_backfill_runner(), vector_backfill_runner_exports)).then(({ launchDetachedVectorBackfill: launchDetachedVectorBackfill2 }) => {
152380
152565
  launchDetachedVectorBackfill2({
152381
152566
  projectId,
@@ -153306,7 +153491,7 @@ async function backfillVectorEmbeddings(options = {}) {
153306
153491
  ...lastFailure ? { lastError: lastFailure } : {}
153307
153492
  };
153308
153493
  }
153309
- var observations, nextId, projectDir, searchIndexPrepared, embeddingWriteMode, embeddingWorkerProjectRoot, corpusLoaded, loadedObservationStore, vectorMissingIds, vectorBackfillRunning, vectorSchemaUpgradePromise, lastVectorBackfill, embeddingFailureLogTimestamps, EMBEDDING_FAILURE_LOG_COOLDOWN_MS;
153494
+ var observations, nextId, projectDir, searchIndexPrepared, embeddingWriteMode, embeddingWorkerProjectRoot, corpusLoaded, loadedObservationStore, vectorMissingIds, vectorBackfillRunning, vectorSchemaUpgradePromise, lastVectorBackfill, embeddingFailureLogTimestamps, EMBEDDING_FAILURE_LOG_COOLDOWN_MS, MAX_EMBEDDING_FAILURE_KEYS;
153310
153495
  var init_observations = __esm({
153311
153496
  "src/memory/observations.ts"() {
153312
153497
  "use strict";
@@ -153334,6 +153519,7 @@ var init_observations = __esm({
153334
153519
  lastVectorBackfill = null;
153335
153520
  embeddingFailureLogTimestamps = /* @__PURE__ */ new Map();
153336
153521
  EMBEDDING_FAILURE_LOG_COOLDOWN_MS = 3e4;
153522
+ MAX_EMBEDDING_FAILURE_KEYS = 1024;
153337
153523
  }
153338
153524
  });
153339
153525
 
@@ -157010,7 +157196,7 @@ var init_sanitizer = __esm({
157010
157196
  });
157011
157197
 
157012
157198
  // src/workspace/applier.ts
157013
- import { existsSync as existsSync13, mkdirSync as mkdirSync2, copyFileSync, writeFileSync as writeFileSync2, unlinkSync, renameSync } from "fs";
157199
+ import { existsSync as existsSync13, mkdirSync as mkdirSync3, copyFileSync, writeFileSync as writeFileSync3, unlinkSync as unlinkSync2, renameSync } from "fs";
157014
157200
  import { dirname } from "path";
157015
157201
  var WorkspaceSyncApplier;
157016
157202
  var init_applier = __esm({
@@ -157042,7 +157228,7 @@ var init_applier = __esm({
157042
157228
  try {
157043
157229
  const dir = dirname(file.filePath);
157044
157230
  if (!existsSync13(dir)) {
157045
- mkdirSync2(dir, { recursive: true });
157231
+ mkdirSync3(dir, { recursive: true });
157046
157232
  }
157047
157233
  } catch (err) {
157048
157234
  result.errors.push(`Cannot create directory for ${file.filePath}: ${err}`);
@@ -157067,7 +157253,7 @@ var init_applier = __esm({
157067
157253
  for (const file of files) {
157068
157254
  try {
157069
157255
  const tempPath = file.filePath + `.tmp-${Date.now()}`;
157070
- writeFileSync2(tempPath, file.content, "utf-8");
157256
+ writeFileSync3(tempPath, file.content, "utf-8");
157071
157257
  renameSync(tempPath, file.filePath);
157072
157258
  result.filesWritten.push(file.filePath);
157073
157259
  } catch (err) {
@@ -157102,7 +157288,7 @@ var init_applier = __esm({
157102
157288
  for (const backup of backups) {
157103
157289
  try {
157104
157290
  if (existsSync13(backup.backupPath)) {
157105
- unlinkSync(backup.backupPath);
157291
+ unlinkSync2(backup.backupPath);
157106
157292
  }
157107
157293
  } catch {
157108
157294
  }
@@ -157113,7 +157299,7 @@ var init_applier = __esm({
157113
157299
  });
157114
157300
 
157115
157301
  // src/workspace/engine.ts
157116
- import { readFileSync as readFileSync9, readdirSync as readdirSync3, existsSync as existsSync14, cpSync, mkdirSync as mkdirSync3 } from "fs";
157302
+ import { readFileSync as readFileSync10, readdirSync as readdirSync3, existsSync as existsSync14, cpSync, mkdirSync as mkdirSync4 } from "fs";
157117
157303
  import { join as join19 } from "path";
157118
157304
  import { homedir as homedir21 } from "os";
157119
157305
  var WorkspaceSyncEngine;
@@ -157195,7 +157381,7 @@ var init_engine4 = __esm({
157195
157381
  for (const path37 of pathsToCheck) {
157196
157382
  if (existsSync14(path37)) {
157197
157383
  try {
157198
- const content = readFileSync9(path37, "utf-8");
157384
+ const content = readFileSync10(path37, "utf-8");
157199
157385
  const servers = adapter.parse(content);
157200
157386
  for (const s2 of servers) {
157201
157387
  if (!merged.has(s2.name)) merged.set(s2.name, s2);
@@ -157249,7 +157435,7 @@ var init_engine4 = __esm({
157249
157435
  let configContent;
157250
157436
  if (target === "antigravity" && existsSync14(configPath)) {
157251
157437
  try {
157252
- const existing = JSON.parse(readFileSync9(configPath, "utf-8"));
157438
+ const existing = JSON.parse(readFileSync10(configPath, "utf-8"));
157253
157439
  const generated = JSON.parse(adapter.generate(result.mcpServers.scanned));
157254
157440
  existing.mcpServers = { ...existing.mcpServers ?? {}, ...generated.mcpServers };
157255
157441
  configContent = JSON.stringify(existing, null, 2);
@@ -157332,7 +157518,7 @@ var init_engine4 = __esm({
157332
157518
  if (!existsSync14(skillMd)) continue;
157333
157519
  let description = "";
157334
157520
  try {
157335
- const content = readFileSync9(skillMd, "utf-8");
157521
+ const content = readFileSync10(skillMd, "utf-8");
157336
157522
  const match2 = content.match(/^---[\s\S]*?description:\s*["']?(.+?)["']?\s*$/m);
157337
157523
  if (match2) description = match2[1];
157338
157524
  } catch {
@@ -157383,7 +157569,7 @@ var init_engine4 = __esm({
157383
157569
  continue;
157384
157570
  }
157385
157571
  try {
157386
- mkdirSync3(targetDir, { recursive: true });
157572
+ mkdirSync4(targetDir, { recursive: true });
157387
157573
  cpSync(skill2.sourcePath, dest, { recursive: true });
157388
157574
  copied.push(skill2.name);
157389
157575
  } catch {
@@ -157399,7 +157585,7 @@ var init_engine4 = __esm({
157399
157585
  const files = readdirSync3(wfDir).filter((f3) => f3.endsWith(".md"));
157400
157586
  for (const file of files) {
157401
157587
  try {
157402
- const content = readFileSync9(join19(wfDir, file), "utf-8");
157588
+ const content = readFileSync10(join19(wfDir, file), "utf-8");
157403
157589
  workflows.push(this.workflowSyncer.parseWindsurfWorkflow(file, content));
157404
157590
  } catch {
157405
157591
  }
@@ -158792,7 +158978,7 @@ var init_request_context = __esm({
158792
158978
  function getMcpServerInfo() {
158793
158979
  return {
158794
158980
  name: "memorix",
158795
- version: true ? "1.8.8" : "1.0.1"
158981
+ version: true ? "1.9.0" : "1.0.1"
158796
158982
  };
158797
158983
  }
158798
158984
  function createMcpDiscoverResult(capabilities, serverInfo) {
@@ -158854,62 +159040,13 @@ var init_mcp_compat = __esm({
158854
159040
  }
158855
159041
  });
158856
159042
 
158857
- // src/runtime/maintenance-targets.ts
158858
- var maintenance_targets_exports = {};
158859
- __export(maintenance_targets_exports, {
158860
- MaintenanceTargetStore: () => MaintenanceTargetStore
158861
- });
158862
- function rowToTarget(row) {
158863
- return {
158864
- projectId: row.project_id,
158865
- projectRoot: row.project_root,
158866
- dataDir: row.data_dir,
158867
- updatedAt: Number(row.updated_at)
158868
- };
158869
- }
158870
- var MaintenanceTargetStore;
158871
- var init_maintenance_targets = __esm({
158872
- "src/runtime/maintenance-targets.ts"() {
158873
- "use strict";
158874
- init_esm_shims();
158875
- init_sqlite_db();
158876
- MaintenanceTargetStore = class {
158877
- db;
158878
- constructor(dataDir) {
158879
- this.db = getDatabase(dataDir);
158880
- }
158881
- register(input) {
158882
- if (!input.projectId.trim()) throw new Error("Maintenance target requires a project ID");
158883
- if (!input.projectRoot.trim()) throw new Error("Maintenance target requires a project root");
158884
- if (!input.dataDir.trim()) throw new Error("Maintenance target requires a data directory");
158885
- const now3 = input.now ?? Date.now();
158886
- this.db.prepare(`
158887
- INSERT INTO maintenance_targets (project_id, project_root, data_dir, updated_at)
158888
- VALUES (?, ?, ?, ?)
158889
- ON CONFLICT(project_id) DO UPDATE SET
158890
- project_root = excluded.project_root,
158891
- data_dir = excluded.data_dir,
158892
- updated_at = excluded.updated_at
158893
- `).run(input.projectId, input.projectRoot, input.dataDir, now3);
158894
- return this.get(input.projectId);
158895
- }
158896
- get(projectId) {
158897
- const row = this.db.prepare(`
158898
- SELECT * FROM maintenance_targets WHERE project_id = ?
158899
- `).get(projectId);
158900
- return row ? rowToTarget(row) : void 0;
158901
- }
158902
- };
158903
- }
158904
- });
158905
-
158906
159043
  // src/config/behavior.ts
158907
159044
  var behavior_exports = {};
158908
159045
  __export(behavior_exports, {
158909
159046
  getBehaviorConfig: () => getBehaviorConfig,
158910
159047
  resetBehaviorConfigCache: () => resetBehaviorConfigCache
158911
159048
  });
158912
- import { existsSync as existsSync15, readFileSync as readFileSync10 } from "fs";
159049
+ import { existsSync as existsSync15, readFileSync as readFileSync11 } from "fs";
158913
159050
  import { homedir as homedir22 } from "os";
158914
159051
  function isSessionInject(value) {
158915
159052
  return value === "full" || value === "minimal" || value === "silent";
@@ -158921,7 +159058,7 @@ function legacyBehavior(homeDir) {
158921
159058
  const configPath = getLegacyConfigJsonPath(homeDir);
158922
159059
  try {
158923
159060
  if (!existsSync15(configPath)) return {};
158924
- const parsed = JSON.parse(readFileSync10(configPath, "utf-8"));
159061
+ const parsed = JSON.parse(readFileSync11(configPath, "utf-8"));
158925
159062
  return parsed.behavior && typeof parsed.behavior === "object" && !Array.isArray(parsed.behavior) ? parsed.behavior : {};
158926
159063
  } catch {
158927
159064
  return {};
@@ -160274,12 +160411,12 @@ __export(current_facts_exports, {
160274
160411
  formatGitFact: () => formatGitFact
160275
160412
  });
160276
160413
  import { execFileSync } from "child_process";
160277
- import { existsSync as existsSync16, readFileSync as readFileSync11 } from "fs";
160414
+ import { existsSync as existsSync16, readFileSync as readFileSync12 } from "fs";
160278
160415
  import path28 from "path";
160279
160416
  function readTextIfExists(filePath) {
160280
160417
  try {
160281
160418
  if (!existsSync16(filePath)) return null;
160282
- return readFileSync11(filePath, "utf8");
160419
+ return readFileSync12(filePath, "utf8");
160283
160420
  } catch {
160284
160421
  return null;
160285
160422
  }
@@ -160569,7 +160706,7 @@ __export(external_provider_exports, {
160569
160706
  runExternalCodeGraphLifecycle: () => runExternalCodeGraphLifecycle
160570
160707
  });
160571
160708
  import { spawn as spawn5 } from "child_process";
160572
- import { existsSync as existsSync17, readFileSync as readFileSync12 } from "fs";
160709
+ import { existsSync as existsSync17, readFileSync as readFileSync13 } from "fs";
160573
160710
  import { delimiter, dirname as dirname2, extname, isAbsolute as isAbsolute3, join as join20, relative as relative4, resolve as resolve3, sep } from "path";
160574
160711
  function boundedTimeout(value) {
160575
160712
  if (!Number.isFinite(value)) return DEFAULT_EXTERNAL_CODEGRAPH_TIMEOUT_MS;
@@ -160616,7 +160753,7 @@ function resolveLaunch(command) {
160616
160753
  return { executable: node, prefixArgs: ["--liftoff-only", entry] };
160617
160754
  }
160618
160755
  try {
160619
- const shim = readFileSync12(candidate, "utf8");
160756
+ const shim = readFileSync13(candidate, "utf8");
160620
160757
  const match2 = shim.match(/["']([^"']*%(?:~)?dp0%?[^"']*\.m?js)["']/i);
160621
160758
  if (match2?.[1]) {
160622
160759
  const base = dirname2(candidate).endsWith(sep) ? dirname2(candidate) : dirname2(candidate) + sep;
@@ -161876,7 +162013,7 @@ __export(auto_context_exports, {
161876
162013
  formatAutoProjectContextSummary: () => formatAutoProjectContextSummary,
161877
162014
  formatLegacyAutoProjectContextPrompt: () => formatLegacyAutoProjectContextPrompt
161878
162015
  });
161879
- import { existsSync as existsSync18, statSync as statSync4 } from "fs";
162016
+ import { existsSync as existsSync18, statSync as statSync5 } from "fs";
161880
162017
  import path29 from "path";
161881
162018
  function activeProjectObservations(observations2, projectId) {
161882
162019
  return observations2.filter((obs) => obs.projectId === projectId && (obs.status ?? "active") === "active");
@@ -162223,7 +162360,7 @@ function existingLensCandidates(rootPath, lens) {
162223
162360
  const absolute = path29.join(rootPath, candidate);
162224
162361
  try {
162225
162362
  if (!existsSync18(absolute)) continue;
162226
- const stat5 = statSync4(absolute);
162363
+ const stat5 = statSync5(absolute);
162227
162364
  if (stat5.isFile()) out.push(candidate);
162228
162365
  if (stat5.isDirectory()) out.push(candidate.replace(/\\/g, "/"));
162229
162366
  } catch {
@@ -162756,7 +162893,7 @@ var engine_exports2 = {};
162756
162893
  __export(engine_exports2, {
162757
162894
  SkillsEngine: () => SkillsEngine
162758
162895
  });
162759
- import { existsSync as existsSync19, readFileSync as readFileSync13, writeFileSync as writeFileSync3, mkdirSync as mkdirSync4, readdirSync as readdirSync4 } from "fs";
162896
+ import { existsSync as existsSync19, readFileSync as readFileSync14, writeFileSync as writeFileSync4, mkdirSync as mkdirSync5, readdirSync as readdirSync4 } from "fs";
162760
162897
  import { join as join21 } from "path";
162761
162898
  import { homedir as homedir23 } from "os";
162762
162899
  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;
@@ -162847,7 +162984,7 @@ var init_engine5 = __esm({
162847
162984
  const skillMd = join21(skillsRoot, name, "SKILL.md");
162848
162985
  if (!existsSync19(skillMd)) continue;
162849
162986
  try {
162850
- const content = readFileSync13(skillMd, "utf-8");
162987
+ const content = readFileSync14(skillMd, "utf-8");
162851
162988
  const description = this.parseDescription(content);
162852
162989
  skills.push({
162853
162990
  name,
@@ -162897,8 +163034,8 @@ var init_engine5 = __esm({
162897
163034
  if (!dirs || dirs.length === 0) return null;
162898
163035
  const targetDir = join21(this.projectRoot, dirs[0], skill2.name);
162899
163036
  try {
162900
- mkdirSync4(targetDir, { recursive: true });
162901
- writeFileSync3(join21(targetDir, "SKILL.md"), skill2.content, "utf-8");
163037
+ mkdirSync5(targetDir, { recursive: true });
163038
+ writeFileSync4(join21(targetDir, "SKILL.md"), skill2.content, "utf-8");
162902
163039
  return join21(dirs[0], skill2.name, "SKILL.md");
162903
163040
  } catch {
162904
163041
  return null;
@@ -166238,7 +166375,7 @@ async function buildTeamSnapshot(dataDir, projectId, scope, mode) {
166238
166375
  }
166239
166376
  }
166240
166377
  function readBody(req) {
166241
- return new Promise((resolve4, reject) => {
166378
+ return new Promise((resolve5, reject) => {
166242
166379
  const chunks = [];
166243
166380
  let size = 0;
166244
166381
  req.on("data", (c) => {
@@ -166249,7 +166386,7 @@ function readBody(req) {
166249
166386
  }
166250
166387
  chunks.push(c);
166251
166388
  });
166252
- req.on("end", () => resolve4(Buffer.concat(chunks).toString("utf-8")));
166389
+ req.on("end", () => resolve5(Buffer.concat(chunks).toString("utf-8")));
166253
166390
  req.on("error", reject);
166254
166391
  });
166255
166392
  }
@@ -166302,7 +166439,7 @@ async function startDashboard(dataDir, port, staticDir, projectId, projectName,
166302
166439
  await serveStatic(req, res, resolvedStaticDir);
166303
166440
  }
166304
166441
  });
166305
- return new Promise((resolve4, reject) => {
166442
+ return new Promise((resolve5, reject) => {
166306
166443
  server.on("error", (err) => {
166307
166444
  if (err.code === "EADDRINUSE") {
166308
166445
  console.error(`Port ${port} is already in use. Try: memorix dashboard --port ${port + 1}`);
@@ -166325,7 +166462,7 @@ async function startDashboard(dataDir, port, staticDir, projectId, projectName,
166325
166462
  Press Ctrl+C to stop
166326
166463
  `);
166327
166464
  if (autoOpen) openBrowser(url);
166328
- resolve4();
166465
+ resolve5();
166329
166466
  });
166330
166467
  });
166331
166468
  }
@@ -166668,7 +166805,7 @@ var init_task_graph = __esm({
166668
166805
 
166669
166806
  // src/orchestrate/context-collector.ts
166670
166807
  import { execFileSync as execFileSync2 } from "child_process";
166671
- import { readFileSync as readFileSync14, existsSync as existsSync20 } from "fs";
166808
+ import { readFileSync as readFileSync15, existsSync as existsSync20 } from "fs";
166672
166809
  import { join as join22 } from "path";
166673
166810
  function normalizeEntryLimit(value, fallback) {
166674
166811
  if (!Number.isSafeInteger(value) || value < 1) return fallback;
@@ -166746,7 +166883,7 @@ function collectDependencies(projectDir2) {
166746
166883
  try {
166747
166884
  const pkgPath = join22(projectDir2, "package.json");
166748
166885
  if (!existsSync20(pkgPath)) return "";
166749
- const pkg = JSON.parse(readFileSync14(pkgPath, "utf-8"));
166886
+ const pkg = JSON.parse(readFileSync15(pkgPath, "utf-8"));
166750
166887
  const parts = [];
166751
166888
  if (pkg.dependencies && Object.keys(pkg.dependencies).length > 0) {
166752
166889
  parts.push(`dependencies: ${Object.keys(pkg.dependencies).join(", ")}`);
@@ -167897,6 +168034,9 @@ function resolveHookCommand() {
167897
168034
  }
167898
168035
  return "memorix";
167899
168036
  }
168037
+ function getGrokHome() {
168038
+ return process.env.GROK_HOME?.trim() || path33.join(os5.homedir(), ".grok");
168039
+ }
167900
168040
  function resolveWindowsMemorixShim() {
167901
168041
  try {
167902
168042
  const output = String(execSync2("where.exe memorix.cmd", {
@@ -167930,6 +168070,90 @@ function generateClaudeConfig() {
167930
168070
  }
167931
168071
  };
167932
168072
  }
168073
+ function generateGrokConfig() {
168074
+ const cmd = `${resolveHookCommand()} hook --agent grok`;
168075
+ const hookEntry = {
168076
+ type: "command",
168077
+ command: cmd,
168078
+ timeout: 10
168079
+ };
168080
+ return {
168081
+ hooks: {
168082
+ SessionStart: [{ hooks: [hookEntry] }],
168083
+ SessionEnd: [{ hooks: [hookEntry] }],
168084
+ PostToolUse: [{ hooks: [hookEntry] }],
168085
+ PostToolUseFailure: [{ hooks: [hookEntry] }],
168086
+ UserPromptSubmit: [{ hooks: [hookEntry] }],
168087
+ PreCompact: [{ hooks: [hookEntry] }],
168088
+ PostCompact: [{ hooks: [hookEntry] }],
168089
+ Stop: [{ hooks: [hookEntry] }],
168090
+ StopFailure: [{ hooks: [hookEntry] }]
168091
+ }
168092
+ };
168093
+ }
168094
+ function isJsonRecord(value) {
168095
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
168096
+ }
168097
+ function isMemorixGrokCommand(value) {
168098
+ return value === "memorix hook --agent grok" || value === "memorix.cmd hook --agent grok";
168099
+ }
168100
+ function isMemorixGrokHook(value) {
168101
+ return isJsonRecord(value) && value.type === "command" && isMemorixGrokCommand(value.command);
168102
+ }
168103
+ function mergeGrokHookConfig(existing, generated) {
168104
+ const merged = { ...existing };
168105
+ const existingHooks = isJsonRecord(existing.hooks) ? { ...existing.hooks } : {};
168106
+ const generatedHooks = isJsonRecord(generated.hooks) ? generated.hooks : {};
168107
+ for (const [event, generatedGroups] of Object.entries(generatedHooks)) {
168108
+ const currentGroups = Array.isArray(existingHooks[event]) ? existingHooks[event] : [];
168109
+ const preservedGroups = currentGroups.flatMap((group) => {
168110
+ if (!isJsonRecord(group) || !Array.isArray(group.hooks)) return [group];
168111
+ const preservedHooks = group.hooks.filter((hook) => !isMemorixGrokHook(hook));
168112
+ if (preservedHooks.length === 0) return [];
168113
+ return [{ ...group, hooks: preservedHooks }];
168114
+ });
168115
+ existingHooks[event] = [...preservedGroups, ...Array.isArray(generatedGroups) ? generatedGroups : []];
168116
+ }
168117
+ merged.hooks = existingHooks;
168118
+ return merged;
168119
+ }
168120
+ function removeMemorixGrokHooks(config) {
168121
+ const cleaned = { ...config };
168122
+ const hooks = isJsonRecord(config.hooks) ? { ...config.hooks } : null;
168123
+ if (!hooks) return cleaned;
168124
+ for (const [event, groups] of Object.entries(hooks)) {
168125
+ if (!Array.isArray(groups)) continue;
168126
+ const preservedGroups = groups.flatMap((group) => {
168127
+ if (!isJsonRecord(group) || !Array.isArray(group.hooks)) return [group];
168128
+ const preservedHooks = group.hooks.filter((hook) => !isMemorixGrokHook(hook));
168129
+ if (preservedHooks.length === 0) return [];
168130
+ return [{ ...group, hooks: preservedHooks }];
168131
+ });
168132
+ if (preservedGroups.length > 0) hooks[event] = preservedGroups;
168133
+ else delete hooks[event];
168134
+ }
168135
+ if (Object.keys(hooks).length > 0) cleaned.hooks = hooks;
168136
+ else delete cleaned.hooks;
168137
+ return cleaned;
168138
+ }
168139
+ async function readGrokHookConfig(configPath) {
168140
+ let content;
168141
+ try {
168142
+ content = await fs21.readFile(configPath, "utf-8");
168143
+ } catch (error) {
168144
+ if (error.code === "ENOENT") return {};
168145
+ throw error;
168146
+ }
168147
+ if (!content.trim()) return {};
168148
+ try {
168149
+ const parsed = JSON.parse(content);
168150
+ if (!isJsonRecord(parsed)) throw new Error("top-level value must be an object");
168151
+ return parsed;
168152
+ } catch (error) {
168153
+ const reason = error instanceof Error ? error.message : String(error);
168154
+ throw new Error(`Cannot safely update Grok hook config ${configPath}: ${reason}`);
168155
+ }
168156
+ }
167933
168157
  function generateCopilotConfig() {
167934
168158
  const cmd = `${resolveHookCommand()} hook`;
167935
168159
  const hasPwsh = detectPwsh();
@@ -168351,6 +168575,8 @@ function getProjectConfigPath(agent, projectRoot) {
168351
168575
  return path33.join(projectRoot, ".gemini", "settings.json");
168352
168576
  case "workbuddy":
168353
168577
  return "";
168578
+ case "grok":
168579
+ return path33.join(projectRoot, ".grok", "hooks", "memorix.json");
168354
168580
  default:
168355
168581
  return path33.join(projectRoot, ".memorix", "hooks.json");
168356
168582
  }
@@ -168386,6 +168612,8 @@ function getGlobalConfigPath(agent) {
168386
168612
  return path33.join(process.env.DSH_HOME?.trim() || path33.join(home, ".dsh"), "AGENTS.md");
168387
168613
  case "workbuddy":
168388
168614
  return "";
168615
+ case "grok":
168616
+ return path33.join(getGrokHome(), "hooks", "memorix.json");
168389
168617
  default:
168390
168618
  return path33.join(home, ".memorix", "hooks.json");
168391
168619
  }
@@ -168412,6 +168640,8 @@ function getAgentRulesPath(agent, root, global2 = false) {
168412
168640
  return path33.join(root, ".trae", "rules", "project_rules.md");
168413
168641
  case "dsh":
168414
168642
  return path33.join(process.env.DSH_HOME?.trim() || path33.join(root, ".dsh"), "AGENTS.md");
168643
+ case "grok":
168644
+ return path33.join(getGrokHome(), "AGENTS.md");
168415
168645
  case "workbuddy":
168416
168646
  return "";
168417
168647
  default:
@@ -168442,6 +168672,8 @@ function getAgentRulesPath(agent, root, global2 = false) {
168442
168672
  return path33.join(root, "AGENTS.md");
168443
168673
  case "workbuddy":
168444
168674
  return path33.join(root, "AGENTS.md");
168675
+ case "grok":
168676
+ return path33.join(root, "AGENTS.md");
168445
168677
  default:
168446
168678
  return path33.join(root, ".agent", "rules", "memorix.md");
168447
168679
  }
@@ -168493,6 +168725,12 @@ async function detectInstalledAgents() {
168493
168725
  agents.push("kiro");
168494
168726
  } catch {
168495
168727
  }
168728
+ const grokDir = getGrokHome();
168729
+ try {
168730
+ await fs21.access(grokDir);
168731
+ agents.push("grok");
168732
+ } catch {
168733
+ }
168496
168734
  const codexDir = path33.join(home, ".codex");
168497
168735
  try {
168498
168736
  await fs21.access(codexDir);
@@ -168579,6 +168817,9 @@ async function installHooks(agent, projectRoot, global2 = false) {
168579
168817
  if (basename5 === "AGENTS.md" || basename5 === "GEMINI.md" || basename5 === "CONTEXT.md") {
168580
168818
  continue;
168581
168819
  }
168820
+ if (agent === "grok" && path33.resolve(entry.path) === path33.resolve(configPath)) {
168821
+ continue;
168822
+ }
168582
168823
  await unlink3(entry.path);
168583
168824
  await removeFile2(projectRoot, entry.path);
168584
168825
  } catch {
@@ -168591,6 +168832,9 @@ async function installHooks(agent, projectRoot, global2 = false) {
168591
168832
  case "claude":
168592
168833
  generated = generateClaudeConfig();
168593
168834
  break;
168835
+ case "grok":
168836
+ generated = generateGrokConfig();
168837
+ break;
168594
168838
  case "copilot":
168595
168839
  generated = generateCopilotConfig();
168596
168840
  break;
@@ -168685,7 +168929,16 @@ async function installHooks(agent, projectRoot, global2 = false) {
168685
168929
  generated = generateClaudeConfig();
168686
168930
  }
168687
168931
  await fs21.mkdir(path33.dirname(configPath), { recursive: true });
168688
- if (agent === "kiro") {
168932
+ if (agent === "grok") {
168933
+ const existing = await readGrokHookConfig(configPath);
168934
+ const merged = mergeGrokHookConfig(existing, generated);
168935
+ await fs21.writeFile(configPath, JSON.stringify(merged, null, 2), "utf-8");
168936
+ try {
168937
+ const { recordFile: recordFile2 } = await Promise.resolve().then(() => (init_audit(), audit_exports));
168938
+ await recordFile2(projectRoot, "hook", configPath, agent);
168939
+ } catch {
168940
+ }
168941
+ } else if (agent === "kiro") {
168689
168942
  const hookFiles = generateKiroHookFiles();
168690
168943
  const hooksDir = path33.join(path33.dirname(configPath));
168691
168944
  await fs21.mkdir(hooksDir, { recursive: true });
@@ -168766,6 +169019,9 @@ async function installHooks(agent, projectRoot, global2 = false) {
168766
169019
  case "kiro":
168767
169020
  events.push("session_end", "user_prompt", "post_edit");
168768
169021
  break;
169022
+ case "grok":
169023
+ events.push("session_start", "post_tool", "user_prompt", "pre_compact", "post_compact", "session_end");
169024
+ break;
168769
169025
  }
168770
169026
  await installAgentRules(agent, projectRoot, global2);
168771
169027
  const skillPaths = await installOfficialSkillsForAgent(agent, projectRoot, global2);
@@ -168786,7 +169042,7 @@ async function installAgentRules(agent, projectRoot, global2 = false) {
168786
169042
  const rulesPath = getAgentRulesPath(agent, rulesRoot, global2);
168787
169043
  try {
168788
169044
  await fs21.mkdir(path33.dirname(rulesPath), { recursive: true });
168789
- if (agent === "claude" || agent === "codex" || agent === "opencode" || agent === "antigravity" || agent === "gemini-cli" || agent === "dsh") {
169045
+ if (agent === "claude" || agent === "codex" || agent === "opencode" || agent === "antigravity" || agent === "gemini-cli" || agent === "dsh" || agent === "grok") {
168790
169046
  try {
168791
169047
  const existing = await fs21.readFile(rulesPath, "utf-8");
168792
169048
  await fs21.writeFile(rulesPath, mergeMemorixRulesContent(existing, rulesContent), "utf-8");
@@ -168955,7 +169211,16 @@ async function uninstallHooks(agent, projectRoot, global2 = false) {
168955
169211
  const configPath = global2 ? getGlobalConfigPath(agent) : getProjectConfigPath(agent, projectRoot);
168956
169212
  let success = false;
168957
169213
  try {
168958
- if (agent === "kiro" || agent === "opencode") {
169214
+ if (agent === "grok") {
169215
+ const config = await readGrokHookConfig(configPath);
169216
+ const cleaned = removeMemorixGrokHooks(config);
169217
+ if (Object.keys(cleaned).length === 0) {
169218
+ await fs21.unlink(configPath);
169219
+ } else {
169220
+ await fs21.writeFile(configPath, JSON.stringify(cleaned, null, 2), "utf-8");
169221
+ }
169222
+ success = true;
169223
+ } else if (agent === "kiro" || agent === "opencode") {
168959
169224
  await fs21.unlink(configPath);
168960
169225
  success = true;
168961
169226
  } else {
@@ -168978,6 +169243,11 @@ async function uninstallHooks(agent, projectRoot, global2 = false) {
168978
169243
  const agentFiles = prevFiles.filter((e2) => e2.agent === agent);
168979
169244
  for (const entry of agentFiles) {
168980
169245
  try {
169246
+ if (agent === "grok" && path33.resolve(entry.path) === path33.resolve(configPath)) {
169247
+ await removeFile2(projectRoot, entry.path);
169248
+ auditCleaned = true;
169249
+ continue;
169250
+ }
168981
169251
  const basename5 = path33.basename(entry.path);
168982
169252
  if (basename5 === "AGENTS.md" || basename5 === "GEMINI.md" || basename5 === "CONTEXT.md") {
168983
169253
  try {
@@ -169038,14 +169308,14 @@ async function uninstallHooks(agent, projectRoot, global2 = false) {
169038
169308
  }
169039
169309
  async function getHookStatus(projectRoot) {
169040
169310
  const results = [];
169041
- const agents = ["claude", "copilot", "windsurf", "cursor", "kiro", "codex", "antigravity", "gemini-cli", "opencode", "pi", "trae"];
169311
+ const agents = ["claude", "copilot", "windsurf", "cursor", "kiro", "codex", "antigravity", "gemini-cli", "opencode", "pi", "trae", "grok"];
169042
169312
  for (const agent of agents) {
169043
169313
  const projectPath = getProjectConfigPath(agent, projectRoot);
169044
169314
  const globalPath = getGlobalConfigPath(agent);
169045
169315
  let installed = false;
169046
169316
  let outdated = false;
169047
169317
  let usedPath = projectPath;
169048
- const verifiedByDefault = agent !== "opencode" && agent !== "pi";
169318
+ const verifiedByDefault = agent !== "opencode" && agent !== "pi" && agent !== "grok";
169049
169319
  try {
169050
169320
  await fs21.access(projectPath);
169051
169321
  installed = true;
@@ -169073,11 +169343,12 @@ async function getHookStatus(projectRoot) {
169073
169343
  if (agent === "copilot" && process.platform === "win32" && installed) {
169074
169344
  runtimeReady = detectPwsh();
169075
169345
  }
169346
+ const verified = installed && (verifiedByDefault || agent === "grok" && usedPath === globalPath);
169076
169347
  results.push({
169077
169348
  agent,
169078
169349
  installed,
169079
169350
  outdated,
169080
- verified: installed && verifiedByDefault,
169351
+ verified,
169081
169352
  runtimeReady,
169082
169353
  configPath: usedPath
169083
169354
  });
@@ -169112,18 +169383,18 @@ __export(hooks_path_exports, {
169112
169383
  resolveGitDir: () => resolveGitDir,
169113
169384
  resolveHooksDir: () => resolveHooksDir
169114
169385
  });
169115
- import { existsSync as existsSync21, readFileSync as readFileSync15, statSync as statSync5, mkdirSync as mkdirSync5 } from "fs";
169386
+ import { existsSync as existsSync21, readFileSync as readFileSync16, statSync as statSync6, mkdirSync as mkdirSync6 } from "fs";
169116
169387
  import path34 from "path";
169117
169388
  function resolveGitDir(projectRoot) {
169118
169389
  const dotGit = path34.join(projectRoot, ".git");
169119
169390
  if (!existsSync21(dotGit)) return null;
169120
- const stat5 = statSync5(dotGit);
169391
+ const stat5 = statSync6(dotGit);
169121
169392
  if (stat5.isDirectory()) {
169122
169393
  return dotGit;
169123
169394
  }
169124
169395
  if (stat5.isFile()) {
169125
169396
  try {
169126
- const content = readFileSync15(dotGit, "utf-8").trim();
169397
+ const content = readFileSync16(dotGit, "utf-8").trim();
169127
169398
  const match2 = content.match(/^gitdir:\s*(.+)$/);
169128
169399
  if (match2) {
169129
169400
  const gitdir = match2[1].trim();
@@ -169149,7 +169420,7 @@ function resolveHooksDir(projectRoot) {
169149
169420
  function ensureHooksDir(projectRoot) {
169150
169421
  const resolved = resolveHooksDir(projectRoot);
169151
169422
  if (!resolved) return null;
169152
- mkdirSync5(resolved.hooksDir, { recursive: true });
169423
+ mkdirSync6(resolved.hooksDir, { recursive: true });
169153
169424
  return resolved;
169154
169425
  }
169155
169426
  var init_hooks_path = __esm({
@@ -172596,15 +172867,15 @@ ${json2}
172596
172867
  if (inControlPlane) {
172597
172868
  const http3 = await import("http");
172598
172869
  const postData = JSON.stringify({ projectId: project.id, projectName: project.name });
172599
- await new Promise((resolve4) => {
172870
+ await new Promise((resolve5) => {
172600
172871
  const req = http3.request({
172601
172872
  hostname: "127.0.0.1",
172602
172873
  port: portNum,
172603
172874
  path: "/api/set-current-project",
172604
172875
  method: "POST",
172605
172876
  headers: { "Content-Type": "application/json", "Content-Length": Buffer.byteLength(postData) }
172606
- }, () => resolve4());
172607
- req.on("error", () => resolve4());
172877
+ }, () => resolve5());
172878
+ req.on("error", () => resolve5());
172608
172879
  req.write(postData);
172609
172880
  req.end();
172610
172881
  });
@@ -172629,33 +172900,33 @@ ${json2}
172629
172900
  }
172630
172901
  if (dashboardRunning) {
172631
172902
  const { createConnection } = await import("net");
172632
- const isAlive = await new Promise((resolve4) => {
172903
+ const isAlive = await new Promise((resolve5) => {
172633
172904
  const sock = createConnection(portNum, "127.0.0.1");
172634
172905
  sock.once("connect", () => {
172635
172906
  sock.destroy();
172636
- resolve4(true);
172907
+ resolve5(true);
172637
172908
  });
172638
172909
  sock.once("error", () => {
172639
172910
  sock.destroy();
172640
- resolve4(false);
172911
+ resolve5(false);
172641
172912
  });
172642
172913
  setTimeout(() => {
172643
172914
  sock.destroy();
172644
- resolve4(false);
172915
+ resolve5(false);
172645
172916
  }, 1e3);
172646
172917
  });
172647
172918
  if (isAlive) {
172648
172919
  const http3 = await import("http");
172649
172920
  const postData = JSON.stringify({ projectId: project.id, projectName: project.name });
172650
- await new Promise((resolve4) => {
172921
+ await new Promise((resolve5) => {
172651
172922
  const req = http3.request({
172652
172923
  hostname: "127.0.0.1",
172653
172924
  port: portNum,
172654
172925
  path: "/api/set-current-project",
172655
172926
  method: "POST",
172656
172927
  headers: { "Content-Type": "application/json", "Content-Length": Buffer.byteLength(postData) }
172657
- }, () => resolve4());
172658
- req.on("error", () => resolve4());
172928
+ }, () => resolve5());
172929
+ req.on("error", () => resolve5());
172659
172930
  req.write(postData);
172660
172931
  req.end();
172661
172932
  });
@@ -172701,18 +172972,18 @@ ${json2}
172701
172972
  dashboardRunning = false;
172702
172973
  });
172703
172974
  const { createConnection } = await import("net");
172704
- await new Promise((resolve4) => {
172975
+ await new Promise((resolve5) => {
172705
172976
  const deadline = Date.now() + 5e3;
172706
172977
  const tryConnect = () => {
172707
172978
  const sock = createConnection(portNum, "127.0.0.1");
172708
172979
  sock.once("connect", () => {
172709
172980
  sock.destroy();
172710
- resolve4();
172981
+ resolve5();
172711
172982
  });
172712
172983
  sock.once("error", () => {
172713
172984
  sock.destroy();
172714
172985
  if (Date.now() < deadline) setTimeout(tryConnect, 100);
172715
- else resolve4();
172986
+ else resolve5();
172716
172987
  });
172717
172988
  };
172718
172989
  tryConnect();
@@ -173723,10 +173994,10 @@ Preview: ${analysis.description.slice(0, 300)}${analysis.description.length > 30
173723
173994
  const { ensureHooksDir: ensureHooksDir2 } = await Promise.resolve().then(() => (init_hooks_path(), hooks_path_exports));
173724
173995
  const resolved = ensureHooksDir2(project.rootPath);
173725
173996
  if (resolved) {
173726
- const { existsSync: existsSync22, readFileSync: readFileSync16, writeFileSync: writeFileSync4, chmodSync } = await import("fs");
173997
+ const { existsSync: existsSync22, readFileSync: readFileSync17, writeFileSync: writeFileSync5, chmodSync } = await import("fs");
173727
173998
  const { hookPath } = resolved;
173728
173999
  const HOOK_MARKER = "# [memorix-git-hook]";
173729
- const needsInstall = !existsSync22(hookPath) || !readFileSync16(hookPath, "utf-8").includes(HOOK_MARKER);
174000
+ const needsInstall = !existsSync22(hookPath) || !readFileSync17(hookPath, "utf-8").includes(HOOK_MARKER);
173730
174001
  if (needsInstall) {
173731
174002
  const hookScript = `#!/bin/sh
173732
174003
  ${HOOK_MARKER}
@@ -173736,8 +174007,8 @@ if command -v memorix >/dev/null 2>&1; then
173736
174007
  fi
173737
174008
  `;
173738
174009
  if (existsSync22(hookPath)) {
173739
- const existing = readFileSync16(hookPath, "utf-8");
173740
- writeFileSync4(hookPath, existing.trimEnd() + `
174010
+ const existing = readFileSync17(hookPath, "utf-8");
174011
+ writeFileSync5(hookPath, existing.trimEnd() + `
173741
174012
 
173742
174013
  ${HOOK_MARKER}
173743
174014
  if command -v memorix >/dev/null 2>&1; then
@@ -173745,7 +174016,7 @@ if command -v memorix >/dev/null 2>&1; then
173745
174016
  fi
173746
174017
  `, "utf-8");
173747
174018
  } else {
173748
- writeFileSync4(hookPath, hookScript, "utf-8");
174019
+ writeFileSync5(hookPath, hookScript, "utf-8");
173749
174020
  }
173750
174021
  try {
173751
174022
  chmodSync(hookPath, 493);
@@ -174407,7 +174678,7 @@ var init_serve_shared = __esm({
174407
174678
 
174408
174679
  // src/cli/version.ts
174409
174680
  function getCliVersion() {
174410
- return true ? "1.8.8" : pkg.version;
174681
+ return true ? "1.9.0" : pkg.version;
174411
174682
  }
174412
174683
  var init_version3 = __esm({
174413
174684
  "src/cli/version.ts"() {
@@ -174492,10 +174763,10 @@ function describeAutoUpdateFailure(error, timeoutMs) {
174492
174763
  async function fetchLatestVersion() {
174493
174764
  try {
174494
174765
  const { default: https2 } = await import("https");
174495
- return new Promise((resolve4) => {
174766
+ return new Promise((resolve5) => {
174496
174767
  const req = https2.get(REGISTRY_URL, { timeout: 5e3 }, (res) => {
174497
174768
  if (res.statusCode !== 200) {
174498
- resolve4(null);
174769
+ resolve5(null);
174499
174770
  return;
174500
174771
  }
174501
174772
  let body = "";
@@ -174505,16 +174776,16 @@ async function fetchLatestVersion() {
174505
174776
  res.on("end", () => {
174506
174777
  try {
174507
174778
  const data = JSON.parse(body);
174508
- resolve4(data.version ?? null);
174779
+ resolve5(data.version ?? null);
174509
174780
  } catch {
174510
- resolve4(null);
174781
+ resolve5(null);
174511
174782
  }
174512
174783
  });
174513
174784
  });
174514
- req.on("error", () => resolve4(null));
174785
+ req.on("error", () => resolve5(null));
174515
174786
  req.on("timeout", () => {
174516
174787
  req.destroy();
174517
- resolve4(null);
174788
+ resolve5(null);
174518
174789
  });
174519
174790
  });
174520
174791
  } catch {