@jcode.labs/ragmir 2.18.0 → 2.19.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.
@@ -0,0 +1,479 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { mkdir, readFile, rename, rm, stat, writeFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { z } from "zod";
5
+ import { loadConfig } from "./config.js";
6
+ import { doctorWithConfig } from "./doctor.js";
7
+ import { indexPolicyFingerprint } from "./index-policy.js";
8
+ import { knowledgeBaseIdentity } from "./knowledge-bases.js";
9
+ import { summarizeIndexedCorpus } from "./quality-report.js";
10
+ import { readIndexManifestFilePage, readIndexManifestHeader } from "./store.js";
11
+ import { VERSION } from "./version.js";
12
+ const TEAM_SNAPSHOT_SCHEMA_VERSION = 1;
13
+ const TEAM_SNAPSHOT_PAGE_SIZE = 1_000;
14
+ const MAX_TEAM_SNAPSHOT_BYTES = 64 * 1024 * 1024;
15
+ const MAX_TEAM_LABEL_CHARACTERS = 80;
16
+ const MAX_TEAM_PATH_CHARACTERS = 4_096;
17
+ const SHA256_PATTERN = /^[0-9a-f]{64}$/u;
18
+ const teamSnapshotFileSchema = z
19
+ .object({
20
+ relativePath: z
21
+ .string()
22
+ .min(1)
23
+ .max(MAX_TEAM_PATH_CHARACTERS)
24
+ .refine(isTeamRelativePath, "must be a normalized relative source path"),
25
+ checksum: z.string().regex(SHA256_PATTERN),
26
+ chunkCount: z.number().int().nonnegative(),
27
+ })
28
+ .strict();
29
+ const teamSourceContractSchema = z
30
+ .string()
31
+ .min(1)
32
+ .max(MAX_TEAM_PATH_CHARACTERS)
33
+ .refine(isTeamSourceContract, "must not expose an absolute or parent-relative source path");
34
+ const teamSnapshotSchema = z
35
+ .object({
36
+ schemaVersion: z.literal(TEAM_SNAPSHOT_SCHEMA_VERSION),
37
+ createdAt: z.iso.datetime(),
38
+ label: z.string().min(1).max(MAX_TEAM_LABEL_CHARACTERS),
39
+ knowledgeBaseId: z.string().min(1).max(256).nullable(),
40
+ runtimeRagmirVersion: z.string().min(1).max(128),
41
+ ready: z.boolean(),
42
+ freshnessWarning: z.string().max(8_192).nullable(),
43
+ configuration: z
44
+ .object({
45
+ sources: z.array(teamSourceContractSchema),
46
+ privacyProfile: z.enum(["strict", "private", "trusted", "custom"]),
47
+ retrievalProfile: z.enum(["fast", "balanced", "quality", "custom"]),
48
+ embeddingProvider: z.enum(["local-hash", "transformers"]),
49
+ embeddingModel: z.string().max(1_024),
50
+ embeddingModelRevision: z.string().max(1_024),
51
+ embeddingModelDigest: z.string().max(1_024).nullable(),
52
+ redactionEnabled: z.boolean(),
53
+ chunkSize: z.number().int().positive(),
54
+ chunkOverlap: z.number().int().nonnegative(),
55
+ sourceFingerprintMode: z.enum(["fast", "strict"]),
56
+ incrementalFailurePolicy: z.enum(["preserve-last-good", "remove-stale"]),
57
+ retrievalTopK: z.number().int().positive(),
58
+ indexPolicyFingerprint: z.string().regex(SHA256_PATTERN),
59
+ })
60
+ .strict(),
61
+ corpus: z
62
+ .object({
63
+ fingerprint: z.string().regex(SHA256_PATTERN).nullable(),
64
+ activeIndexFingerprint: z.string().regex(SHA256_PATTERN).nullable(),
65
+ indexedWithRagmirVersion: z.string().min(1).max(128).nullable(),
66
+ indexSchemaVersion: z.number().int().nonnegative().nullable(),
67
+ indexedFiles: z.number().int().nonnegative(),
68
+ chunksIndexed: z.number().int().nonnegative(),
69
+ files: z.array(teamSnapshotFileSchema),
70
+ })
71
+ .strict(),
72
+ health: z
73
+ .object({
74
+ missingFromIndex: z.number().int().nonnegative(),
75
+ staleInIndex: z.number().int().nonnegative(),
76
+ emptyTextFiles: z.number().int().nonnegative(),
77
+ oversizedFiles: z.number().int().nonnegative(),
78
+ securityWarnings: z.number().int().nonnegative(),
79
+ })
80
+ .strict(),
81
+ notice: z.string().max(1_024),
82
+ })
83
+ .strict();
84
+ export async function createTeamSnapshot(options = {}) {
85
+ const config = await loadConfig(options.cwd ?? process.cwd());
86
+ const sourceContract = await createSnapshotSourceContract(config.projectRoot, config.sources);
87
+ for (let attempt = 0; attempt < 3; attempt += 1) {
88
+ const manifestBefore = await readIndexManifestHeader(config);
89
+ const report = await doctorWithConfig(config);
90
+ const files = manifestBefore
91
+ ? await readAllManifestFiles(config, manifestBefore.fileCount, sourceContract.externalMappings)
92
+ : [];
93
+ const manifestAfter = await readIndexManifestHeader(config);
94
+ if (!sameManifestGeneration(manifestBefore, manifestAfter) ||
95
+ report.corpusFingerprint !== (manifestAfter?.corpusFingerprint ?? null) ||
96
+ report.indexedFiles !== (manifestAfter?.fileCount ?? 0) ||
97
+ report.chunksIndexed !== (manifestAfter?.chunkCount ?? 0)) {
98
+ continue;
99
+ }
100
+ const identity = knowledgeBaseIdentity(config.projectRoot);
101
+ const snapshot = {
102
+ schemaVersion: TEAM_SNAPSHOT_SCHEMA_VERSION,
103
+ createdAt: new Date().toISOString(),
104
+ label: normalizeTeamLabel(options.label ?? "local"),
105
+ knowledgeBaseId: identity?.id ?? null,
106
+ runtimeRagmirVersion: VERSION,
107
+ ready: report.ready,
108
+ freshnessWarning: report.indexFreshness.warning,
109
+ configuration: {
110
+ sources: sourceContract.sources,
111
+ privacyProfile: config.privacyProfile,
112
+ retrievalProfile: config.retrievalProfile,
113
+ embeddingProvider: config.embeddingProvider,
114
+ embeddingModel: config.embeddingModel,
115
+ embeddingModelRevision: config.embeddingModelRevision,
116
+ embeddingModelDigest: config.embeddingModelDigest,
117
+ redactionEnabled: config.redaction.enabled,
118
+ chunkSize: config.chunkSize,
119
+ chunkOverlap: config.chunkOverlap,
120
+ sourceFingerprintMode: config.sourceFingerprintMode,
121
+ incrementalFailurePolicy: config.incrementalFailurePolicy,
122
+ retrievalTopK: config.topK,
123
+ indexPolicyFingerprint: indexPolicyFingerprint(config),
124
+ },
125
+ corpus: {
126
+ fingerprint: manifestAfter ? fingerprintTeamFiles(files) : null,
127
+ activeIndexFingerprint: manifestAfter?.corpusFingerprint ?? null,
128
+ indexedWithRagmirVersion: manifestAfter?.ragmirVersion ?? null,
129
+ indexSchemaVersion: manifestAfter?.schemaVersion ?? null,
130
+ indexedFiles: manifestAfter?.fileCount ?? 0,
131
+ chunksIndexed: manifestAfter?.chunkCount ?? 0,
132
+ files,
133
+ },
134
+ health: {
135
+ missingFromIndex: report.missingFromIndex,
136
+ staleInIndex: report.staleInIndex,
137
+ emptyTextFiles: report.emptyTextFiles,
138
+ oversizedFiles: report.oversizedFiles,
139
+ securityWarnings: report.securityWarnings.length,
140
+ },
141
+ notice: "This snapshot contains relative source paths and SHA-256 checksums, never source text or absolute project paths. Share it only with authorized team members.",
142
+ };
143
+ assertTeamSnapshotIntegrity(snapshot);
144
+ return snapshot;
145
+ }
146
+ throw new Error("The active index changed repeatedly while creating the team snapshot. Retry.");
147
+ }
148
+ export async function writeTeamSnapshot(snapshot, outputPath) {
149
+ const validated = teamSnapshotSchema.parse(snapshot);
150
+ assertTeamSnapshotIntegrity(validated);
151
+ const resolved = path.resolve(outputPath);
152
+ await mkdir(path.dirname(resolved), { recursive: true });
153
+ const temporaryPath = `${resolved}.${randomUUID()}.tmp`;
154
+ const serialized = `${JSON.stringify(validated, null, 2)}\n`;
155
+ if (Buffer.byteLength(serialized, "utf8") > MAX_TEAM_SNAPSHOT_BYTES) {
156
+ throw new Error(`Team snapshot exceeds the ${MAX_TEAM_SNAPSHOT_BYTES}-byte safety limit.`);
157
+ }
158
+ try {
159
+ await writeFile(temporaryPath, serialized, { encoding: "utf8", mode: 0o600 });
160
+ await rename(temporaryPath, resolved);
161
+ }
162
+ finally {
163
+ await rm(temporaryPath, { force: true });
164
+ }
165
+ return resolved;
166
+ }
167
+ export async function readTeamSnapshot(snapshotPath) {
168
+ const resolved = path.resolve(snapshotPath);
169
+ const metadata = await stat(resolved);
170
+ if (!metadata.isFile()) {
171
+ throw new Error(`Team snapshot is not a file: ${resolved}`);
172
+ }
173
+ if (metadata.size > MAX_TEAM_SNAPSHOT_BYTES) {
174
+ throw new Error(`Team snapshot exceeds the ${MAX_TEAM_SNAPSHOT_BYTES}-byte safety limit: ${resolved}`);
175
+ }
176
+ let raw;
177
+ try {
178
+ raw = JSON.parse(await readFile(resolved, "utf8"));
179
+ }
180
+ catch (error) {
181
+ throw new Error(`Team snapshot is not valid JSON: ${resolved}`, { cause: error });
182
+ }
183
+ const result = teamSnapshotSchema.safeParse(raw);
184
+ if (!result.success) {
185
+ throw new Error(`Team snapshot does not match schema v${TEAM_SNAPSHOT_SCHEMA_VERSION}: ${resolved}`);
186
+ }
187
+ assertTeamSnapshotIntegrity(result.data);
188
+ return result.data;
189
+ }
190
+ export function compareTeamSnapshots(local, peer) {
191
+ const validatedLocal = teamSnapshotSchema.parse(local);
192
+ const validatedPeer = teamSnapshotSchema.parse(peer);
193
+ assertTeamSnapshotIntegrity(validatedLocal);
194
+ assertTeamSnapshotIntegrity(validatedPeer);
195
+ const configurationDifferences = compareConfiguration(validatedLocal, validatedPeer);
196
+ const localFiles = new Map(validatedLocal.corpus.files.map((file) => [file.relativePath, file]));
197
+ const peerFiles = new Map(validatedPeer.corpus.files.map((file) => [file.relativePath, file]));
198
+ const localOnly = [...localFiles.keys()].filter((file) => !peerFiles.has(file)).sort();
199
+ const peerOnly = [...peerFiles.keys()].filter((file) => !localFiles.has(file)).sort();
200
+ const changed = [...localFiles.entries()]
201
+ .flatMap(([relativePath, localFile]) => {
202
+ const peerFile = peerFiles.get(relativePath);
203
+ if (!peerFile || peerFile.checksum === localFile.checksum) {
204
+ return [];
205
+ }
206
+ return [
207
+ {
208
+ relativePath,
209
+ localChecksum: localFile.checksum,
210
+ peerChecksum: peerFile.checksum,
211
+ localChunks: localFile.chunkCount,
212
+ peerChunks: peerFile.chunkCount,
213
+ },
214
+ ];
215
+ })
216
+ .sort((left, right) => left.relativePath.localeCompare(right.relativePath));
217
+ const sameConfiguration = configurationDifferences.length === 0;
218
+ const sameCorpus = validatedLocal.corpus.fingerprint !== null &&
219
+ validatedLocal.corpus.fingerprint === validatedPeer.corpus.fingerprint &&
220
+ localOnly.length === 0 &&
221
+ peerOnly.length === 0 &&
222
+ changed.length === 0;
223
+ const synchronized = validatedLocal.ready && validatedPeer.ready && sameConfiguration && sameCorpus;
224
+ const status = comparisonStatus(validatedLocal, validatedPeer, sameConfiguration, sameCorpus);
225
+ return {
226
+ status,
227
+ synchronized,
228
+ summary: comparisonSummary(status, localOnly.length, peerOnly.length, changed.length),
229
+ localLabel: validatedLocal.label,
230
+ peerLabel: validatedPeer.label,
231
+ sameConfiguration,
232
+ sameCorpus,
233
+ authorityDecisionRequired: !sameCorpus && localOnly.length + peerOnly.length + changed.length > 0,
234
+ configurationDifferences,
235
+ files: { localOnly, peerOnly, changed },
236
+ recommendedActions: recommendedActions(validatedLocal, validatedPeer, configurationDifferences, sameCorpus),
237
+ };
238
+ }
239
+ function sameManifestGeneration(before, after) {
240
+ if (!before || !after) {
241
+ return before === after;
242
+ }
243
+ return (before.createdAt === after.createdAt &&
244
+ before.tableName === after.tableName &&
245
+ before.schemaVersion === after.schemaVersion &&
246
+ before.fileCount === after.fileCount &&
247
+ before.chunkCount === after.chunkCount &&
248
+ before.corpusFingerprint === after.corpusFingerprint);
249
+ }
250
+ function isTeamRelativePath(value) {
251
+ if (value.includes("\0") || path.posix.isAbsolute(value) || path.win32.isAbsolute(value)) {
252
+ return false;
253
+ }
254
+ return !value.split(/[\\/]/u).some((segment) => segment === "..");
255
+ }
256
+ function isTeamSourceContract(value) {
257
+ const source = value.startsWith("!") ? value.slice(1) : value;
258
+ return source.length > 0 && isTeamRelativePath(source);
259
+ }
260
+ function assertTeamSnapshotIntegrity(snapshot) {
261
+ if (snapshot.corpus.indexedFiles !== snapshot.corpus.files.length) {
262
+ throw new Error("Team snapshot indexedFiles does not match its file inventory.");
263
+ }
264
+ const chunks = snapshot.corpus.files.reduce((total, file) => total + file.chunkCount, 0);
265
+ if (chunks !== snapshot.corpus.chunksIndexed) {
266
+ throw new Error("Team snapshot chunksIndexed does not match its file inventory.");
267
+ }
268
+ const paths = snapshot.corpus.files.map((file) => file.relativePath);
269
+ if (new Set(paths).size !== paths.length) {
270
+ throw new Error("Team snapshot contains duplicate relative paths.");
271
+ }
272
+ if (snapshot.corpus.fingerprint !== null) {
273
+ const calculated = fingerprintTeamFiles(snapshot.corpus.files);
274
+ if (snapshot.corpus.fingerprint !== calculated) {
275
+ throw new Error("Team snapshot corpus fingerprint does not match its file inventory.");
276
+ }
277
+ }
278
+ if (snapshot.ready &&
279
+ (snapshot.corpus.fingerprint === null ||
280
+ snapshot.freshnessWarning !== null ||
281
+ snapshot.health.missingFromIndex > 0 ||
282
+ snapshot.health.staleInIndex > 0 ||
283
+ snapshot.health.emptyTextFiles > 0 ||
284
+ snapshot.health.oversizedFiles > 0 ||
285
+ snapshot.health.securityWarnings > 0)) {
286
+ throw new Error("Team snapshot cannot be ready while freshness, coverage, or security fails.");
287
+ }
288
+ }
289
+ function fingerprintTeamFiles(files) {
290
+ return summarizeIndexedCorpus([...files].sort((left, right) => compareUnicodeScalarValues(left.relativePath, right.relativePath))).corpusFingerprint;
291
+ }
292
+ async function readAllManifestFiles(config, expectedFiles, externalMappings) {
293
+ const files = [];
294
+ let offset = 0;
295
+ while (offset < expectedFiles) {
296
+ const page = await readIndexManifestFilePage(config, offset, TEAM_SNAPSHOT_PAGE_SIZE);
297
+ if (!page) {
298
+ throw new Error("The active index file inventory changed while creating the team snapshot.");
299
+ }
300
+ files.push(...page.files.map((file) => ({
301
+ relativePath: snapshotManifestPath(config.projectRoot, file.relativePath, file.checksum, externalMappings),
302
+ checksum: file.checksum,
303
+ chunkCount: file.chunkCount,
304
+ })));
305
+ if (page.nextOffset === null) {
306
+ break;
307
+ }
308
+ offset = page.nextOffset;
309
+ }
310
+ if (files.length !== expectedFiles) {
311
+ throw new Error("The active index file inventory is incomplete. Retry the team snapshot.");
312
+ }
313
+ return files.sort((left, right) => compareUnicodeScalarValues(left.relativePath, right.relativePath));
314
+ }
315
+ async function createSnapshotSourceContract(projectRoot, sources) {
316
+ const externalMappings = [];
317
+ const snapshotSources = await Promise.all(sources.map(async (entry, index) => {
318
+ const excluded = entry.startsWith("!");
319
+ const source = excluded ? entry.slice(1) : entry;
320
+ const firstGlobCharacter = source.search(/[[\]*?{}()+@]/u);
321
+ const literalPrefix = firstGlobCharacter === -1 ? source : source.slice(0, firstGlobCharacter);
322
+ const globSuffix = firstGlobCharacter === -1 ? "" : source.slice(firstGlobCharacter);
323
+ const prefixWithoutTrailingSeparators = literalPrefix.replace(/[\\/]+$/u, "");
324
+ const resolvedPrefix = path.resolve(projectRoot, prefixWithoutTrailingSeparators || ".");
325
+ const outsideProject = isOutsideProject(projectRoot, resolvedPrefix);
326
+ if (!outsideProject) {
327
+ const normalizedSource = path.isAbsolute(source)
328
+ ? joinSnapshotPath(path.relative(projectRoot, resolvedPrefix), globSuffix)
329
+ : normalizeSnapshotPath(source);
330
+ return excluded ? `!${normalizedSource}` : normalizedSource;
331
+ }
332
+ const alias = `<external-source-${index + 1}>`;
333
+ if (!excluded) {
334
+ const metadata = firstGlobCharacter === -1 ? await stat(resolvedPrefix).catch(() => null) : null;
335
+ externalMappings.push({
336
+ alias,
337
+ rootPath: resolvedPrefix,
338
+ exactFile: metadata?.isFile() ?? false,
339
+ });
340
+ }
341
+ const sanitized = joinSnapshotPath(alias, normalizeSnapshotPath(globSuffix));
342
+ return excluded ? `!${sanitized}` : sanitized;
343
+ }));
344
+ return {
345
+ sources: snapshotSources,
346
+ externalMappings: externalMappings.sort((left, right) => right.rootPath.length - left.rootPath.length),
347
+ };
348
+ }
349
+ function snapshotManifestPath(projectRoot, relativePath, checksum, externalMappings) {
350
+ const absolutePath = path.resolve(projectRoot, relativePath);
351
+ if (!isOutsideProject(projectRoot, absolutePath)) {
352
+ return normalizeSnapshotPath(path.relative(projectRoot, absolutePath));
353
+ }
354
+ for (const mapping of externalMappings) {
355
+ if (mapping.exactFile && absolutePath === mapping.rootPath) {
356
+ return joinSnapshotPath(mapping.alias, path.basename(absolutePath));
357
+ }
358
+ if (!mapping.exactFile && !isOutsideProject(mapping.rootPath, absolutePath)) {
359
+ return joinSnapshotPath(mapping.alias, path.relative(mapping.rootPath, absolutePath));
360
+ }
361
+ }
362
+ const basename = path.basename(absolutePath) || "source";
363
+ const pathDigest = createHash("sha256").update(relativePath).digest("hex").slice(0, 12);
364
+ return joinSnapshotPath("<external-unmapped>", `${checksum.slice(0, 12)}-${pathDigest}-${basename}`);
365
+ }
366
+ function isOutsideProject(projectRoot, candidatePath) {
367
+ const relative = path.relative(projectRoot, candidatePath);
368
+ return relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative);
369
+ }
370
+ function joinSnapshotPath(prefix, suffix) {
371
+ const normalizedPrefix = normalizeSnapshotPath(prefix).replace(/\/$/u, "");
372
+ const normalizedSuffix = normalizeSnapshotPath(suffix).replace(/^\/+|\/+$/gu, "");
373
+ if (normalizedPrefix.length === 0) {
374
+ return normalizedSuffix;
375
+ }
376
+ return normalizedSuffix.length > 0 ? `${normalizedPrefix}/${normalizedSuffix}` : normalizedPrefix;
377
+ }
378
+ function normalizeSnapshotPath(value) {
379
+ return value.replaceAll("\\", "/");
380
+ }
381
+ function compareUnicodeScalarValues(left, right) {
382
+ let leftIndex = 0;
383
+ let rightIndex = 0;
384
+ while (leftIndex < left.length && rightIndex < right.length) {
385
+ const leftCodePoint = left.codePointAt(leftIndex);
386
+ const rightCodePoint = right.codePointAt(rightIndex);
387
+ if (leftCodePoint === undefined || rightCodePoint === undefined) {
388
+ break;
389
+ }
390
+ if (leftCodePoint !== rightCodePoint) {
391
+ return leftCodePoint - rightCodePoint;
392
+ }
393
+ leftIndex += leftCodePoint > 0xffff ? 2 : 1;
394
+ rightIndex += rightCodePoint > 0xffff ? 2 : 1;
395
+ }
396
+ return left.length - right.length;
397
+ }
398
+ function normalizeTeamLabel(label) {
399
+ const normalized = label.trim();
400
+ if (normalized.length === 0 || normalized.length > MAX_TEAM_LABEL_CHARACTERS) {
401
+ throw new Error(`Team label must contain 1 to ${MAX_TEAM_LABEL_CHARACTERS} characters.`);
402
+ }
403
+ return normalized;
404
+ }
405
+ function compareConfiguration(local, peer) {
406
+ const differences = [];
407
+ addDifference(differences, "runtimeRagmirVersion", "runtime", local.runtimeRagmirVersion, peer.runtimeRagmirVersion);
408
+ addDifference(differences, "sources", "source-contract", local.configuration.sources, peer.configuration.sources);
409
+ addDifference(differences, "privacyProfile", "privacy", local.configuration.privacyProfile, peer.configuration.privacyProfile, true);
410
+ addDifference(differences, "retrievalProfile", "retrieval", local.configuration.retrievalProfile, peer.configuration.retrievalProfile);
411
+ addDifference(differences, "embeddingProvider", "index", local.configuration.embeddingProvider, peer.configuration.embeddingProvider, true);
412
+ addDifference(differences, "embeddingModel", "index", local.configuration.embeddingModel, peer.configuration.embeddingModel, true);
413
+ addDifference(differences, "embeddingModelRevision", "index", local.configuration.embeddingModelRevision, peer.configuration.embeddingModelRevision, true);
414
+ addDifference(differences, "embeddingModelDigest", "index", local.configuration.embeddingModelDigest, peer.configuration.embeddingModelDigest, true);
415
+ addDifference(differences, "redactionEnabled", "privacy", local.configuration.redactionEnabled, peer.configuration.redactionEnabled, true);
416
+ addDifference(differences, "chunkSize", "index", local.configuration.chunkSize, peer.configuration.chunkSize, true);
417
+ addDifference(differences, "chunkOverlap", "index", local.configuration.chunkOverlap, peer.configuration.chunkOverlap, true);
418
+ addDifference(differences, "sourceFingerprintMode", "index", local.configuration.sourceFingerprintMode, peer.configuration.sourceFingerprintMode, true);
419
+ addDifference(differences, "incrementalFailurePolicy", "index", local.configuration.incrementalFailurePolicy, peer.configuration.incrementalFailurePolicy);
420
+ addDifference(differences, "retrievalTopK", "retrieval", local.configuration.retrievalTopK, peer.configuration.retrievalTopK);
421
+ addDifference(differences, "indexPolicyFingerprint", "index", local.configuration.indexPolicyFingerprint, peer.configuration.indexPolicyFingerprint, true);
422
+ return differences;
423
+ }
424
+ function addDifference(differences, field, scope, local, peer, requiresRebuild = false) {
425
+ if (JSON.stringify(local) !== JSON.stringify(peer)) {
426
+ differences.push({ field, scope, local, peer, requiresRebuild });
427
+ }
428
+ }
429
+ function comparisonStatus(local, peer, sameConfiguration, sameCorpus) {
430
+ if (!local.ready || !peer.ready) {
431
+ return "not-ready";
432
+ }
433
+ if (!sameConfiguration) {
434
+ return "configuration-mismatch";
435
+ }
436
+ return sameCorpus ? "synchronized" : "corpus-mismatch";
437
+ }
438
+ function comparisonSummary(status, localOnly, peerOnly, changed) {
439
+ if (status === "synchronized") {
440
+ return "Both ready indexes use the same configuration and indexed source bytes.";
441
+ }
442
+ if (status === "not-ready") {
443
+ return "At least one index is not ready. Repair readiness before deciding whether corpora match.";
444
+ }
445
+ if (status === "configuration-mismatch") {
446
+ return "Team configuration differs. Align it before comparing retrieval behavior.";
447
+ }
448
+ return `Indexed source bytes differ: ${localOnly} local-only, ${peerOnly} peer-only, ${changed} changed.`;
449
+ }
450
+ function recommendedActions(local, peer, configurationDifferences, sameCorpus) {
451
+ const actions = [];
452
+ if (!local.ready) {
453
+ actions.push(`On ${local.label}, run \`rgr doctor --fix\` and \`rgr audit\` until ready=true.`);
454
+ }
455
+ if (!peer.ready) {
456
+ actions.push(`On ${peer.label}, run \`rgr doctor --fix\` and \`rgr audit\` until ready=true.`);
457
+ }
458
+ if (configurationDifferences.some((difference) => difference.scope === "runtime")) {
459
+ actions.push("Run `rgr upgrade` on both environments so they use the same Ragmir version.");
460
+ }
461
+ if (configurationDifferences.length > 0) {
462
+ actions.push(`Align the reported configuration fields (${configurationDifferences.map((difference) => difference.field).join(", ")}).`);
463
+ if (configurationDifferences.some((difference) => difference.requiresRebuild)) {
464
+ actions.push("After alignment, run `rgr upgrade` on each affected environment.");
465
+ }
466
+ else {
467
+ actions.push("After alignment, run `rgr ingest` on each affected environment.");
468
+ }
469
+ }
470
+ if (!sameCorpus) {
471
+ actions.push("Confirm that the shared source folder finished synchronizing, then use the declared Git, Drive, or team revision as the authority. Ragmir never guesses which copy is correct.");
472
+ actions.push("Run `rgr ingest` after source synchronization.");
473
+ }
474
+ if (actions.length > 0) {
475
+ actions.push("Export a fresh snapshot and compare again until status=synchronized.");
476
+ }
477
+ return actions;
478
+ }
479
+ //# sourceMappingURL=team-diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-diagnostics.js","sourceRoot":"","sources":["../src/team-diagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type SetupOptions } from "./setup.js";
2
+ import type { DoctorReport } from "./types.js";
3
+ export type UpgradeStatus = "current" | "index-required" | "rebuild-required" | "repair-required";
4
+ export interface UpgradeInspection {
5
+ status: UpgradeStatus;
6
+ runtimeRagmirVersion: string;
7
+ indexedWithRagmirVersion: string | null;
8
+ ready: boolean;
9
+ reason: string | null;
10
+ recommendedCommand: "rgr upgrade";
11
+ safeActivation: boolean;
12
+ }
13
+ export interface UpgradeResult extends UpgradeInspection {
14
+ action: "none" | "indexed" | "rebuilt";
15
+ previousIndexedWithRagmirVersion: string | null;
16
+ previousIndexKeptUntilActivation: boolean;
17
+ doctor: DoctorReport;
18
+ }
19
+ export interface UpgradeOptions {
20
+ cwd?: string;
21
+ agents?: SetupOptions["agents"];
22
+ forceAgentSkills?: boolean;
23
+ }
24
+ export declare function inspectUpgrade(cwd?: string): Promise<UpgradeInspection>;
25
+ export declare function upgradeProject(options?: UpgradeOptions): Promise<UpgradeResult>;
26
+ //# sourceMappingURL=upgrade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../src/upgrade.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,YAAY,EAAgB,MAAM,YAAY,CAAA;AAE5D,OAAO,KAAK,EAAE,YAAY,EAAkC,MAAM,YAAY,CAAA;AAG9E,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,gBAAgB,GAAG,kBAAkB,GAAG,iBAAiB,CAAA;AAEjG,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,aAAa,CAAA;IACrB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAA;IACvC,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,kBAAkB,EAAE,aAAa,CAAA;IACjC,cAAc,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,aAAc,SAAQ,iBAAiB;IACtD,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;IACtC,gCAAgC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/C,gCAAgC,EAAE,OAAO,CAAA;IACzC,MAAM,EAAE,YAAY,CAAA;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAA;IAC/B,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED,wBAAsB,cAAc,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAgBpF;AAED,wBAAsB,cAAc,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CA4BzF"}
@@ -0,0 +1,83 @@
1
+ import { loadConfig } from "./config.js";
2
+ import { doctor } from "./doctor.js";
3
+ import { getIngestionProgress } from "./ingestion-state.js";
4
+ import { setupProject } from "./setup.js";
5
+ import { readIndexManifestHeader } from "./store.js";
6
+ import { VERSION } from "./version.js";
7
+ export async function inspectUpgrade(cwd = process.cwd()) {
8
+ const config = await loadConfig(cwd);
9
+ const [report, manifest] = await Promise.all([
10
+ doctor(config.projectRoot),
11
+ readIndexManifestHeader(config),
12
+ ]);
13
+ const status = upgradeStatus(report, manifest !== null);
14
+ return {
15
+ status,
16
+ runtimeRagmirVersion: VERSION,
17
+ indexedWithRagmirVersion: manifest?.ragmirVersion ?? null,
18
+ ready: report.ready,
19
+ reason: upgradeReason(report, status),
20
+ recommendedCommand: "rgr upgrade",
21
+ safeActivation: true,
22
+ };
23
+ }
24
+ export async function upgradeProject(options = {}) {
25
+ const cwd = options.cwd ?? process.cwd();
26
+ const before = await inspectUpgrade(cwd);
27
+ const setupOptions = { cwd, ingest: true };
28
+ if (options.agents !== undefined) {
29
+ setupOptions.agents = options.agents;
30
+ }
31
+ if (options.forceAgentSkills !== undefined) {
32
+ setupOptions.forceAgentSkills = options.forceAgentSkills;
33
+ }
34
+ const setup = await setupProject(setupOptions);
35
+ let ingestionMode = null;
36
+ if (setup.ingested) {
37
+ const progress = await getIngestionProgress(await loadConfig(cwd));
38
+ if (progress?.runId === setup.ingested.runId) {
39
+ ingestionMode = progress.mode;
40
+ }
41
+ }
42
+ const action = upgradeAction(setup.ingested, ingestionMode);
43
+ const after = await inspectUpgrade(cwd);
44
+ return {
45
+ ...after,
46
+ action,
47
+ previousIndexedWithRagmirVersion: before.indexedWithRagmirVersion,
48
+ previousIndexKeptUntilActivation: action === "rebuilt",
49
+ doctor: setup.doctor,
50
+ };
51
+ }
52
+ function upgradeStatus(report, manifestFound) {
53
+ if (!manifestFound) {
54
+ return "index-required";
55
+ }
56
+ if (!report.readiness.indexPolicyCurrent) {
57
+ return "rebuild-required";
58
+ }
59
+ if (!report.ready) {
60
+ return "repair-required";
61
+ }
62
+ return "current";
63
+ }
64
+ function upgradeReason(report, status) {
65
+ if (status === "current") {
66
+ return null;
67
+ }
68
+ if (status === "index-required") {
69
+ return "No compatible active index manifest is available. Upgrade will stage a fresh index from the configured sources.";
70
+ }
71
+ if (status === "rebuild-required") {
72
+ return (report.indexFreshness.warning ??
73
+ "The active index policy differs from this Ragmir runtime and requires a staged rebuild.");
74
+ }
75
+ return report.nextSteps[0] ?? "The active index needs repair before retrieval is ready.";
76
+ }
77
+ function upgradeAction(ingested, ingestionMode) {
78
+ if (!ingested) {
79
+ return "none";
80
+ }
81
+ return ingestionMode === "rebuild" ? "rebuilt" : "indexed";
82
+ }
83
+ //# sourceMappingURL=upgrade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../src/upgrade.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "2.18.0";
1
+ export declare const VERSION = "2.19.0";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const VERSION = "2.18.0";
1
+ export const VERSION = "2.19.0";
2
2
  //# sourceMappingURL=version.js.map