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