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