@gramatr/mcp 0.13.74 → 0.13.76
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/dist/bin/brain.d.ts +15 -0
- package/dist/bin/brain.d.ts.map +1 -1
- package/dist/bin/brain.js +226 -8
- package/dist/bin/brain.js.map +1 -1
- package/dist/bin/upload-manifest.d.ts +141 -0
- package/dist/bin/upload-manifest.d.ts.map +1 -0
- package/dist/bin/upload-manifest.js +222 -0
- package/dist/bin/upload-manifest.js.map +1 -0
- package/package.json +1 -1
package/dist/bin/brain.d.ts
CHANGED
|
@@ -81,6 +81,8 @@ export interface ParsedArgs {
|
|
|
81
81
|
metadata: string[];
|
|
82
82
|
tags?: string;
|
|
83
83
|
onDuplicate?: string;
|
|
84
|
+
manifest?: string;
|
|
85
|
+
resume?: string;
|
|
84
86
|
}
|
|
85
87
|
export declare function parseUploadArgs(args: string[]): ParsedArgs;
|
|
86
88
|
export interface ValidatedConfig {
|
|
@@ -111,6 +113,19 @@ export interface UploadFileOptions {
|
|
|
111
113
|
entityId?: string;
|
|
112
114
|
entityName?: string;
|
|
113
115
|
config: ValidatedConfig;
|
|
116
|
+
/**
|
|
117
|
+
* Pre-read file bytes. When provided, `uploadFile` will not re-read the file
|
|
118
|
+
* from disk — the caller (e.g. the resume/manifest loop) has already loaded
|
|
119
|
+
* and hashed it. Saves one filesystem round-trip per file in batch mode.
|
|
120
|
+
*/
|
|
121
|
+
prereadBuffer?: Buffer;
|
|
122
|
+
/**
|
|
123
|
+
* Batch correlation id (epic #1904 PR 6). The runBrain entry point mints
|
|
124
|
+
* one UUID per invocation and passes it on every per-file `bulk_upload`
|
|
125
|
+
* call so audit rows correlate. When omitted, the server mints one per
|
|
126
|
+
* call (which would prevent correlation across files in the same batch).
|
|
127
|
+
*/
|
|
128
|
+
batchId?: string;
|
|
114
129
|
}
|
|
115
130
|
export interface UploadResult {
|
|
116
131
|
file: string;
|
package/dist/bin/brain.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brain.d.ts","sourceRoot":"","sources":["../../src/bin/brain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;
|
|
1
|
+
{"version":3,"file":"brain.d.ts","sourceRoot":"","sources":["../../src/bin/brain.ts"],"names":[],"mappings":"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"}
|
package/dist/bin/brain.js
CHANGED
|
@@ -37,9 +37,13 @@
|
|
|
37
37
|
* every CLI upload returns `av_unconfigured` from the server. This is
|
|
38
38
|
* intentional fail-closed behaviour. There is no client-side bypass.
|
|
39
39
|
*/
|
|
40
|
+
import { randomUUID } from 'node:crypto';
|
|
40
41
|
import { readFileSync, readdirSync, statSync } from 'node:fs';
|
|
41
42
|
import { extname, basename, join, resolve } from 'node:path';
|
|
42
43
|
import { callTool } from '../proxy/local-client.js';
|
|
44
|
+
import { MANIFEST_SCHEMA, MANIFEST_SCHEMA_V1, decideResume, fileExists, indexManifestByPath, readManifest, sha256Hex, writeManifestAtomic, } from './upload-manifest.js';
|
|
45
|
+
// CLI version stamped into manifests. Synced with @gramatr/mcp package.json.
|
|
46
|
+
const CLI_VERSION = '0.13.76';
|
|
43
47
|
// ── Supported extensions ────────────────────────────────────────────────────
|
|
44
48
|
export const SUPPORTED_EXTENSIONS = new Set(['.txt', '.md', '.csv', '.pdf', '.docx']);
|
|
45
49
|
// ── Text extraction (kept for backwards-compatibility tests) ────────────────
|
|
@@ -124,6 +128,8 @@ const VALUE_FLAGS = new Set([
|
|
|
124
128
|
'--metadata',
|
|
125
129
|
'--tags',
|
|
126
130
|
'--on-duplicate',
|
|
131
|
+
'--manifest',
|
|
132
|
+
'--resume',
|
|
127
133
|
]);
|
|
128
134
|
// Repeatable flags — collect every occurrence into an array.
|
|
129
135
|
const REPEATABLE_FLAGS = new Set(['--metadata']);
|
|
@@ -183,6 +189,12 @@ export function parseUploadArgs(args) {
|
|
|
183
189
|
case '--on-duplicate':
|
|
184
190
|
out.onDuplicate = v;
|
|
185
191
|
break;
|
|
192
|
+
case '--manifest':
|
|
193
|
+
out.manifest = v;
|
|
194
|
+
break;
|
|
195
|
+
case '--resume':
|
|
196
|
+
out.resume = v;
|
|
197
|
+
break;
|
|
186
198
|
}
|
|
187
199
|
i += 2;
|
|
188
200
|
continue;
|
|
@@ -330,6 +342,8 @@ export function buildBulkUploadInput(filePath, buffer, options) {
|
|
|
330
342
|
input.metadata = options.config.metadata;
|
|
331
343
|
if (options.config.tags.length > 0)
|
|
332
344
|
input.tags = options.config.tags;
|
|
345
|
+
if (options.batchId)
|
|
346
|
+
input.batch_id = options.batchId;
|
|
333
347
|
return input;
|
|
334
348
|
}
|
|
335
349
|
function parseToolBody(text) {
|
|
@@ -350,13 +364,18 @@ export async function uploadFile(filePath, options) {
|
|
|
350
364
|
return { file: filePath, skipped: true };
|
|
351
365
|
}
|
|
352
366
|
let buffer;
|
|
353
|
-
|
|
354
|
-
buffer =
|
|
367
|
+
if (options.prereadBuffer) {
|
|
368
|
+
buffer = options.prereadBuffer;
|
|
355
369
|
}
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
370
|
+
else {
|
|
371
|
+
try {
|
|
372
|
+
buffer = readFileSync(filePath);
|
|
373
|
+
}
|
|
374
|
+
catch (err) {
|
|
375
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
376
|
+
process.stderr.write(`[gramatr] ✗ ${filePath}: ${message}\n`);
|
|
377
|
+
return { file: filePath, error: message };
|
|
378
|
+
}
|
|
360
379
|
}
|
|
361
380
|
if (buffer.length === 0) {
|
|
362
381
|
process.stderr.write(`[gramatr] skipping ${filePath} (empty content)\n`);
|
|
@@ -455,6 +474,16 @@ function printBrainHelp() {
|
|
|
455
474
|
reuse — append observation to existing entity
|
|
456
475
|
new-version — create "<name> v2" / v3 / ...
|
|
457
476
|
|
|
477
|
+
Resume / manifest:
|
|
478
|
+
--manifest <path> Write a JSON manifest of upload outcomes to <path>,
|
|
479
|
+
atomically updated after each file. Schema:
|
|
480
|
+
gmtr.upload-manifest.v1 (see docs).
|
|
481
|
+
--resume <path> Read a prior manifest and skip files that completed
|
|
482
|
+
last run (per content hash). Files with status=error
|
|
483
|
+
are retried; files whose content has changed are
|
|
484
|
+
re-uploaded. Files no longer on disk are recorded
|
|
485
|
+
as skipped (file_missing).
|
|
486
|
+
|
|
458
487
|
Other flags:
|
|
459
488
|
--dry-run Preflight only — show what would be uploaded
|
|
460
489
|
--recursive With --dir, walk subdirectories
|
|
@@ -472,6 +501,8 @@ function printBrainHelp() {
|
|
|
472
501
|
brain upload --dir ./docs --scope team --team-id <team-uuid>
|
|
473
502
|
brain upload --dir ./research --recursive --metadata source=arxiv --metadata year=2026
|
|
474
503
|
brain upload report.pdf --public
|
|
504
|
+
brain upload --dir ./docs --manifest /tmp/upload.json
|
|
505
|
+
brain upload --dir ./docs --manifest /tmp/upload.json --resume /tmp/upload.json
|
|
475
506
|
|
|
476
507
|
NOTE: bulk_upload requires ClamAV to be deployed on the server. Until then,
|
|
477
508
|
every upload returns av_unconfigured (fail-closed by design).
|
|
@@ -546,22 +577,209 @@ export async function runBrain(args) {
|
|
|
546
577
|
process.stderr.write('[gramatr] dry-run complete — no changes written\n');
|
|
547
578
|
return 0;
|
|
548
579
|
}
|
|
580
|
+
// ── Manifest + resume setup ────────────────────────────────────────────────
|
|
581
|
+
// The manifest is the durable record of this run's outcomes. `--resume`
|
|
582
|
+
// loads a prior manifest so unchanged files can be skipped without a
|
|
583
|
+
// network call (the O(changed) win); `--manifest` writes after each file
|
|
584
|
+
// so a crash mid-batch leaves a recoverable partial.
|
|
585
|
+
//
|
|
586
|
+
// PR 6 (epic #1904) — batch correlation:
|
|
587
|
+
// • A v2 resume manifest already carries a `batch_id`; we reuse it so
|
|
588
|
+
// the resumed batch has the same identity as the original.
|
|
589
|
+
// • A v1 resume manifest has none; `readManifest` mints one + WARNs.
|
|
590
|
+
// • No --resume: mint a fresh UUID for this run.
|
|
591
|
+
let priorIndex;
|
|
592
|
+
let priorManifest;
|
|
593
|
+
if (parsed.resume) {
|
|
594
|
+
try {
|
|
595
|
+
priorManifest = readManifest(parsed.resume);
|
|
596
|
+
priorIndex = indexManifestByPath(priorManifest);
|
|
597
|
+
process.stderr.write(`[gramatr] resume — loaded ${priorManifest.files.length} prior entr${priorManifest.files.length === 1 ? 'y' : 'ies'} from ${parsed.resume}\n`);
|
|
598
|
+
}
|
|
599
|
+
catch (err) {
|
|
600
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
601
|
+
process.stderr.write(`[gramatr] ✗ Cannot read --resume manifest ${parsed.resume}: ${msg}\n`);
|
|
602
|
+
return 1;
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
const batchId = priorManifest?.batch_id ?? randomUUID();
|
|
606
|
+
if (priorManifest && !priorManifest.batch_id) {
|
|
607
|
+
// Defensive — readManifest always backfills v1, but if a future caller
|
|
608
|
+
// builds a v2 object without batch_id, surface it here too.
|
|
609
|
+
process.stderr.write(`[gramatr] ⚠ resumed manifest had no batch_id — assigned ${batchId}\n`);
|
|
610
|
+
}
|
|
611
|
+
process.stderr.write(`[gramatr] batch_id ${batchId}\n`);
|
|
549
612
|
const options = {
|
|
550
613
|
entityId: parsed.entityId,
|
|
551
614
|
entityName: parsed.entityName,
|
|
552
615
|
config,
|
|
616
|
+
batchId,
|
|
617
|
+
};
|
|
618
|
+
// Seed the in-memory manifest with prior entries — we re-emit them so the
|
|
619
|
+
// output manifest is a complete record of the union of runs. Always written
|
|
620
|
+
// as v2 (batch_id required) regardless of the prior manifest's schema.
|
|
621
|
+
void MANIFEST_SCHEMA_V1; // referenced by tests + read path; keep import live.
|
|
622
|
+
const manifest = {
|
|
623
|
+
schema: MANIFEST_SCHEMA,
|
|
624
|
+
version: CLI_VERSION,
|
|
625
|
+
started_at: new Date().toISOString(),
|
|
626
|
+
finished_at: null,
|
|
627
|
+
scope: {
|
|
628
|
+
scope: config.scope,
|
|
629
|
+
...(config.teamId ? { team_id: config.teamId } : {}),
|
|
630
|
+
...(config.orgId ? { org_id: config.orgId } : {}),
|
|
631
|
+
...(config.projectId ? { project_id: config.projectId } : {}),
|
|
632
|
+
},
|
|
633
|
+
files: [],
|
|
634
|
+
batch_id: batchId,
|
|
635
|
+
};
|
|
636
|
+
// Maintain a path → index map so we can upsert entries in O(1).
|
|
637
|
+
const fileIndex = new Map();
|
|
638
|
+
if (priorIndex) {
|
|
639
|
+
for (const [p, entry] of priorIndex) {
|
|
640
|
+
fileIndex.set(p, manifest.files.length);
|
|
641
|
+
manifest.files.push(entry);
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
const upsertEntry = (entry) => {
|
|
645
|
+
const idx = fileIndex.get(entry.path);
|
|
646
|
+
if (idx === undefined) {
|
|
647
|
+
fileIndex.set(entry.path, manifest.files.length);
|
|
648
|
+
manifest.files.push(entry);
|
|
649
|
+
}
|
|
650
|
+
else {
|
|
651
|
+
manifest.files[idx] = entry;
|
|
652
|
+
}
|
|
653
|
+
};
|
|
654
|
+
const flushManifest = () => {
|
|
655
|
+
if (!parsed.manifest)
|
|
656
|
+
return;
|
|
657
|
+
try {
|
|
658
|
+
writeManifestAtomic(parsed.manifest, manifest);
|
|
659
|
+
}
|
|
660
|
+
catch (err) {
|
|
661
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
662
|
+
process.stderr.write(`[gramatr] ⚠ failed to write manifest ${parsed.manifest}: ${msg}\n`);
|
|
663
|
+
}
|
|
553
664
|
};
|
|
554
665
|
let hasError = false;
|
|
555
666
|
let hasValidationReject = false;
|
|
556
667
|
for (const filePath of filePaths) {
|
|
557
|
-
|
|
668
|
+
// Hash the file (or detect missing) before deciding to upload — this is
|
|
669
|
+
// the O(changed) check that makes resume cheap.
|
|
670
|
+
let buffer = null;
|
|
671
|
+
let currentSha = null;
|
|
672
|
+
let size = 0;
|
|
673
|
+
let readError = null;
|
|
674
|
+
if (fileExists(filePath)) {
|
|
675
|
+
try {
|
|
676
|
+
buffer = readFileSync(filePath);
|
|
677
|
+
currentSha = sha256Hex(buffer);
|
|
678
|
+
size = buffer.length;
|
|
679
|
+
}
|
|
680
|
+
catch (err) {
|
|
681
|
+
// Capture so we can record an error entry without invoking the server.
|
|
682
|
+
readError = err instanceof Error ? err.message : String(err);
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
if (readError !== null) {
|
|
686
|
+
process.stderr.write(`[gramatr] ✗ ${filePath}: ${readError}\n`);
|
|
687
|
+
upsertEntry({
|
|
688
|
+
path: filePath,
|
|
689
|
+
sha256: '',
|
|
690
|
+
size: 0,
|
|
691
|
+
status: 'error',
|
|
692
|
+
entity_id: null,
|
|
693
|
+
scan_result: null,
|
|
694
|
+
reason: readError,
|
|
695
|
+
completed_at: new Date().toISOString(),
|
|
696
|
+
batch_id: batchId,
|
|
697
|
+
});
|
|
698
|
+
flushManifest();
|
|
699
|
+
hasError = true;
|
|
700
|
+
continue;
|
|
701
|
+
}
|
|
702
|
+
const decision = decideResume(filePath, currentSha, priorIndex?.get(filePath));
|
|
703
|
+
if (decision.kind === 'skip-missing') {
|
|
704
|
+
process.stderr.write(`[gramatr] ↷ ${basename(filePath)}: ${decision.note}\n`);
|
|
705
|
+
upsertEntry({
|
|
706
|
+
path: filePath,
|
|
707
|
+
sha256: '',
|
|
708
|
+
size: 0,
|
|
709
|
+
status: 'skipped',
|
|
710
|
+
entity_id: null,
|
|
711
|
+
scan_result: null,
|
|
712
|
+
reason: 'file_missing',
|
|
713
|
+
completed_at: new Date().toISOString(),
|
|
714
|
+
batch_id: batchId,
|
|
715
|
+
});
|
|
716
|
+
flushManifest();
|
|
717
|
+
continue;
|
|
718
|
+
}
|
|
719
|
+
if (decision.kind === 'skip-previous') {
|
|
720
|
+
process.stderr.write(`[gramatr] ↷ ${basename(filePath)}: ${decision.note}\n`);
|
|
721
|
+
// Refresh completed_at so the manifest reflects this run's pass.
|
|
722
|
+
// Skipped via prior manifest — preserve the prior batch_id if it had
|
|
723
|
+
// one (so the original group identity survives), otherwise stamp with
|
|
724
|
+
// the current run's batchId so all entries in the v2 manifest carry one.
|
|
725
|
+
upsertEntry({
|
|
726
|
+
...decision.entry,
|
|
727
|
+
completed_at: new Date().toISOString(),
|
|
728
|
+
batch_id: decision.entry.batch_id ?? batchId,
|
|
729
|
+
});
|
|
730
|
+
flushManifest();
|
|
731
|
+
// Previously-rejected files do NOT bump this run's exit code — we are
|
|
732
|
+
// not re-attempting them, so they are not "this run's" failures.
|
|
733
|
+
continue;
|
|
734
|
+
}
|
|
735
|
+
// ── Actually upload ────────────────────────────────────────────────────
|
|
736
|
+
const result = await uploadFile(filePath, buffer ? { ...options, prereadBuffer: buffer } : options);
|
|
737
|
+
let status;
|
|
738
|
+
let entityId = result.entityId ?? null;
|
|
739
|
+
let scanResult = null;
|
|
740
|
+
let reason = null;
|
|
558
741
|
if (result.validationReason) {
|
|
742
|
+
status = 'rejected';
|
|
743
|
+
reason = result.validationReason;
|
|
559
744
|
hasValidationReject = true;
|
|
560
745
|
}
|
|
561
746
|
else if (result.error) {
|
|
747
|
+
status = 'error';
|
|
748
|
+
reason = result.error;
|
|
562
749
|
hasError = true;
|
|
563
750
|
}
|
|
564
|
-
|
|
751
|
+
else if (result.skipped) {
|
|
752
|
+
// Empty file or unsupported extension — recorded as skipped without a
|
|
753
|
+
// server entity_id.
|
|
754
|
+
status = 'skipped';
|
|
755
|
+
reason = 'unsupported_or_empty';
|
|
756
|
+
}
|
|
757
|
+
else if (result.wasDuplicate) {
|
|
758
|
+
// on_duplicate=reuse path — server attached observation to existing entity.
|
|
759
|
+
// For on_duplicate=skip the server returns was_duplicate=true with no new
|
|
760
|
+
// observation, which is captured here as 'skipped'.
|
|
761
|
+
status = config.onDuplicate === 'skip' ? 'skipped' : 'reused';
|
|
762
|
+
scanResult = 'clean';
|
|
763
|
+
}
|
|
764
|
+
else {
|
|
765
|
+
status = 'uploaded';
|
|
766
|
+
scanResult = 'clean';
|
|
767
|
+
}
|
|
768
|
+
upsertEntry({
|
|
769
|
+
path: filePath,
|
|
770
|
+
sha256: currentSha || '',
|
|
771
|
+
size,
|
|
772
|
+
status,
|
|
773
|
+
entity_id: entityId,
|
|
774
|
+
scan_result: scanResult,
|
|
775
|
+
reason,
|
|
776
|
+
completed_at: new Date().toISOString(),
|
|
777
|
+
batch_id: batchId,
|
|
778
|
+
});
|
|
779
|
+
flushManifest();
|
|
780
|
+
}
|
|
781
|
+
manifest.finished_at = new Date().toISOString();
|
|
782
|
+
flushManifest();
|
|
565
783
|
// Validator rejection takes precedence — distinct exit code so scripts can
|
|
566
784
|
// differentiate "server said no" from "transport blew up".
|
|
567
785
|
if (hasValidationReject)
|
package/dist/bin/brain.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brain.js","sourceRoot":"","sources":["../../src/bin/brain.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"brain.js","sourceRoot":"","sources":["../../src/bin/brain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* upload-manifest — JSON manifest schema + atomic IO for `gramatr brain upload`.
|
|
3
|
+
*
|
|
4
|
+
* Epic #1904 PR 5. Records the outcome of every file in a bulk upload run so
|
|
5
|
+
* that:
|
|
6
|
+
* - a crashed batch can be resumed without re-uploading completed files
|
|
7
|
+
* - unchanged files can be skipped without a network round-trip
|
|
8
|
+
* - the operator has a full audit trail (entity_id, scan_result, reason)
|
|
9
|
+
*
|
|
10
|
+
* The manifest is single-writer (the CLI process). No locking. Atomic writes
|
|
11
|
+
* are achieved by writing `<path>.tmp` then renaming over the target — POSIX
|
|
12
|
+
* `rename(2)` is atomic on the same filesystem.
|
|
13
|
+
*
|
|
14
|
+
* `finished_at` is null until the run completes. A crashed run leaves it null,
|
|
15
|
+
* which is the signal `--resume` uses to confirm there is recoverable state.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Current manifest schema. v2 (epic #1904 PR 6) adds the top-level + per-entry
|
|
19
|
+
* `batch_id` correlation field so a manifest is unambiguously tied to a single
|
|
20
|
+
* uploaded batch in the dashboard's history view.
|
|
21
|
+
*
|
|
22
|
+
* v1 manifests remain readable for backwards compat — `parseManifest`
|
|
23
|
+
* accepts either schema string and `readManifest` will up-convert v1 →
|
|
24
|
+
* v2-shaped object in memory by minting a fresh `batch_id` and emitting a
|
|
25
|
+
* one-line WARN to stderr (caller sees the new identity is synthetic).
|
|
26
|
+
*/
|
|
27
|
+
export declare const MANIFEST_SCHEMA = "gmtr.upload-manifest.v2";
|
|
28
|
+
export declare const MANIFEST_SCHEMA_V1 = "gmtr.upload-manifest.v1";
|
|
29
|
+
export type ManifestEntryStatus = 'uploaded' | 'reused' | 'skipped' | 'rejected' | 'error';
|
|
30
|
+
export interface UploadManifestEntry {
|
|
31
|
+
/** Absolute path on the uploader's filesystem at the time of the run. */
|
|
32
|
+
path: string;
|
|
33
|
+
/** Hex sha256 of the file's bytes at the time of the run. */
|
|
34
|
+
sha256: string;
|
|
35
|
+
/** File size in bytes. */
|
|
36
|
+
size: number;
|
|
37
|
+
/** Outcome — see ManifestEntryStatus. */
|
|
38
|
+
status: ManifestEntryStatus;
|
|
39
|
+
/** Server entity_id for uploaded/reused/skipped; null otherwise. */
|
|
40
|
+
entity_id: string | null;
|
|
41
|
+
/** Server scan_result (e.g. "clean", "infected", "unconfigured"); null when unknown. */
|
|
42
|
+
scan_result: string | null;
|
|
43
|
+
/**
|
|
44
|
+
* For status=rejected: the UploadValidationError reason.
|
|
45
|
+
* For status=error: the error message.
|
|
46
|
+
* For status=skipped via missing-file: "file_missing".
|
|
47
|
+
* Otherwise null.
|
|
48
|
+
*/
|
|
49
|
+
reason: string | null;
|
|
50
|
+
/** ISO-8601 timestamp of when this file's processing completed. */
|
|
51
|
+
completed_at: string;
|
|
52
|
+
/**
|
|
53
|
+
* Batch correlation id (v2). Mirrors the manifest's top-level `batch_id`
|
|
54
|
+
* for redundancy + cross-validation. Always present in v2; absent on
|
|
55
|
+
* entries inherited verbatim from a legacy v1 manifest until they are
|
|
56
|
+
* rewritten.
|
|
57
|
+
*/
|
|
58
|
+
batch_id?: string;
|
|
59
|
+
}
|
|
60
|
+
export interface UploadManifestScope {
|
|
61
|
+
scope: 'user' | 'team' | 'org' | 'public';
|
|
62
|
+
team_id?: string;
|
|
63
|
+
org_id?: string;
|
|
64
|
+
project_id?: string;
|
|
65
|
+
}
|
|
66
|
+
export interface UploadManifest {
|
|
67
|
+
schema: typeof MANIFEST_SCHEMA | typeof MANIFEST_SCHEMA_V1;
|
|
68
|
+
version: string;
|
|
69
|
+
started_at: string;
|
|
70
|
+
finished_at: string | null;
|
|
71
|
+
scope: UploadManifestScope;
|
|
72
|
+
files: UploadManifestEntry[];
|
|
73
|
+
/**
|
|
74
|
+
* Batch correlation id. Required in v2; on a v1 manifest read via
|
|
75
|
+
* `readManifest`, this is back-filled with a freshly minted UUID and a
|
|
76
|
+
* WARN is logged to stderr so callers see the identity is synthetic.
|
|
77
|
+
*/
|
|
78
|
+
batch_id?: string;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Domain-specific error thrown by the manifest parser. Distinct from generic
|
|
82
|
+
* `Error` so callers (and rubric dimension B1) can identify it precisely.
|
|
83
|
+
*/
|
|
84
|
+
export declare class ManifestSchemaError extends Error {
|
|
85
|
+
constructor(message: string);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Compute the hex sha256 digest of a buffer. Stable across runs and platforms.
|
|
89
|
+
*/
|
|
90
|
+
export declare function sha256Hex(buffer: Buffer): string;
|
|
91
|
+
/**
|
|
92
|
+
* Validate that an arbitrary value matches the gmtr.upload-manifest.v1 schema.
|
|
93
|
+
* Returns the manifest typed if valid, throws Error with a specific message
|
|
94
|
+
* otherwise. Forgiving on unknown fields (forward-compat) but strict on the
|
|
95
|
+
* required ones.
|
|
96
|
+
*/
|
|
97
|
+
export declare function parseManifest(value: unknown): UploadManifest;
|
|
98
|
+
/**
|
|
99
|
+
* Write the manifest to `path` atomically:
|
|
100
|
+
* 1. Serialize JSON
|
|
101
|
+
* 2. Write to `<path>.tmp`
|
|
102
|
+
* 3. fs.renameSync into place (POSIX-atomic on same filesystem)
|
|
103
|
+
*
|
|
104
|
+
* A reader observing `path` will always see either the previous full contents
|
|
105
|
+
* or the new full contents — never a partially-written file.
|
|
106
|
+
*/
|
|
107
|
+
export declare function writeManifestAtomic(path: string, manifest: UploadManifest): void;
|
|
108
|
+
/**
|
|
109
|
+
* Read and validate a manifest from disk. Throws if the file does not exist
|
|
110
|
+
* or fails schema validation.
|
|
111
|
+
*/
|
|
112
|
+
export declare function readManifest(path: string): UploadManifest;
|
|
113
|
+
/**
|
|
114
|
+
* Build a Map<absolutePath, entry> from a manifest's files array. Last entry
|
|
115
|
+
* wins (the manifest is append/upsert per file, so duplicates should not occur,
|
|
116
|
+
* but be defensive).
|
|
117
|
+
*/
|
|
118
|
+
export declare function indexManifestByPath(manifest: UploadManifest): Map<string, UploadManifestEntry>;
|
|
119
|
+
export type ResumeDecision = {
|
|
120
|
+
kind: 'upload';
|
|
121
|
+
} | {
|
|
122
|
+
kind: 'skip-previous';
|
|
123
|
+
entry: UploadManifestEntry;
|
|
124
|
+
note: string;
|
|
125
|
+
} | {
|
|
126
|
+
kind: 'skip-missing';
|
|
127
|
+
note: string;
|
|
128
|
+
};
|
|
129
|
+
/**
|
|
130
|
+
* Decide what to do with a file given the resume manifest's record (if any).
|
|
131
|
+
*
|
|
132
|
+
* - Not in manifest → upload
|
|
133
|
+
* - Path no longer exists on disk → skip-missing
|
|
134
|
+
* - In manifest, status=error → upload (retry)
|
|
135
|
+
* - In manifest, hash differs from current bytes → upload (re-upload)
|
|
136
|
+
* - In manifest, hash matches, status terminal → skip-previous
|
|
137
|
+
*/
|
|
138
|
+
export declare function decideResume(filePath: string, currentSha256: string | null, prior: UploadManifestEntry | undefined): ResumeDecision;
|
|
139
|
+
/** True iff a file currently exists at the given path. */
|
|
140
|
+
export declare function fileExists(path: string): boolean;
|
|
141
|
+
//# sourceMappingURL=upload-manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-manifest.d.ts","sourceRoot":"","sources":["../../src/bin/upload-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,4BAA4B,CAAC;AACzD,eAAO,MAAM,kBAAkB,4BAA4B,CAAC;AAE5D,MAAM,MAAM,mBAAmB,GAC3B,UAAU,GACV,QAAQ,GACR,SAAS,GACT,UAAU,GACV,OAAO,CAAC;AAEZ,MAAM,WAAW,mBAAmB;IAClC,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,oEAAoE;IACpE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,wFAAwF;IACxF,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;;;;OAKG;IACH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,mEAAmE;IACnE,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,eAAe,GAAG,OAAO,kBAAkB,CAAC;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,mBAAmB,CAAC;IAC3B,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AAID;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEhD;AAcD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CA4D5D;AAID;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,CAIhF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAqBzD;AAID;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,GAAG,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAI9F;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnE;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,KAAK,EAAE,mBAAmB,GAAG,SAAS,GACrC,cAAc,CA8BhB;AAID,0DAA0D;AAC1D,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* upload-manifest — JSON manifest schema + atomic IO for `gramatr brain upload`.
|
|
3
|
+
*
|
|
4
|
+
* Epic #1904 PR 5. Records the outcome of every file in a bulk upload run so
|
|
5
|
+
* that:
|
|
6
|
+
* - a crashed batch can be resumed without re-uploading completed files
|
|
7
|
+
* - unchanged files can be skipped without a network round-trip
|
|
8
|
+
* - the operator has a full audit trail (entity_id, scan_result, reason)
|
|
9
|
+
*
|
|
10
|
+
* The manifest is single-writer (the CLI process). No locking. Atomic writes
|
|
11
|
+
* are achieved by writing `<path>.tmp` then renaming over the target — POSIX
|
|
12
|
+
* `rename(2)` is atomic on the same filesystem.
|
|
13
|
+
*
|
|
14
|
+
* `finished_at` is null until the run completes. A crashed run leaves it null,
|
|
15
|
+
* which is the signal `--resume` uses to confirm there is recoverable state.
|
|
16
|
+
*/
|
|
17
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
18
|
+
import { existsSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
19
|
+
/**
|
|
20
|
+
* Current manifest schema. v2 (epic #1904 PR 6) adds the top-level + per-entry
|
|
21
|
+
* `batch_id` correlation field so a manifest is unambiguously tied to a single
|
|
22
|
+
* uploaded batch in the dashboard's history view.
|
|
23
|
+
*
|
|
24
|
+
* v1 manifests remain readable for backwards compat — `parseManifest`
|
|
25
|
+
* accepts either schema string and `readManifest` will up-convert v1 →
|
|
26
|
+
* v2-shaped object in memory by minting a fresh `batch_id` and emitting a
|
|
27
|
+
* one-line WARN to stderr (caller sees the new identity is synthetic).
|
|
28
|
+
*/
|
|
29
|
+
export const MANIFEST_SCHEMA = 'gmtr.upload-manifest.v2';
|
|
30
|
+
export const MANIFEST_SCHEMA_V1 = 'gmtr.upload-manifest.v1';
|
|
31
|
+
// ── Errors ──────────────────────────────────────────────────────────────────
|
|
32
|
+
/**
|
|
33
|
+
* Domain-specific error thrown by the manifest parser. Distinct from generic
|
|
34
|
+
* `Error` so callers (and rubric dimension B1) can identify it precisely.
|
|
35
|
+
*/
|
|
36
|
+
export class ManifestSchemaError extends Error {
|
|
37
|
+
constructor(message) {
|
|
38
|
+
super(message);
|
|
39
|
+
this.name = 'ManifestSchemaError';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// ── sha256 ──────────────────────────────────────────────────────────────────
|
|
43
|
+
/**
|
|
44
|
+
* Compute the hex sha256 digest of a buffer. Stable across runs and platforms.
|
|
45
|
+
*/
|
|
46
|
+
export function sha256Hex(buffer) {
|
|
47
|
+
return createHash('sha256').update(buffer).digest('hex');
|
|
48
|
+
}
|
|
49
|
+
// ── Schema validation ───────────────────────────────────────────────────────
|
|
50
|
+
const VALID_STATUSES = new Set([
|
|
51
|
+
'uploaded',
|
|
52
|
+
'reused',
|
|
53
|
+
'skipped',
|
|
54
|
+
'rejected',
|
|
55
|
+
'error',
|
|
56
|
+
]);
|
|
57
|
+
const VALID_SCOPES = new Set(['user', 'team', 'org', 'public']);
|
|
58
|
+
/**
|
|
59
|
+
* Validate that an arbitrary value matches the gmtr.upload-manifest.v1 schema.
|
|
60
|
+
* Returns the manifest typed if valid, throws Error with a specific message
|
|
61
|
+
* otherwise. Forgiving on unknown fields (forward-compat) but strict on the
|
|
62
|
+
* required ones.
|
|
63
|
+
*/
|
|
64
|
+
export function parseManifest(value) {
|
|
65
|
+
if (typeof value !== 'object' || value === null) {
|
|
66
|
+
throw new ManifestSchemaError('manifest must be a JSON object');
|
|
67
|
+
}
|
|
68
|
+
const obj = value;
|
|
69
|
+
if (obj.schema !== MANIFEST_SCHEMA && obj.schema !== MANIFEST_SCHEMA_V1) {
|
|
70
|
+
throw new ManifestSchemaError(`manifest.schema must be "${MANIFEST_SCHEMA}" or "${MANIFEST_SCHEMA_V1}", got ${JSON.stringify(obj.schema)}`);
|
|
71
|
+
}
|
|
72
|
+
// v2 requires top-level batch_id. v1 may omit it (we backfill on read).
|
|
73
|
+
if (obj.schema === MANIFEST_SCHEMA && typeof obj.batch_id !== 'string') {
|
|
74
|
+
throw new ManifestSchemaError('manifest.batch_id must be a string (required in v2)');
|
|
75
|
+
}
|
|
76
|
+
if (typeof obj.version !== 'string') {
|
|
77
|
+
throw new ManifestSchemaError('manifest.version must be a string');
|
|
78
|
+
}
|
|
79
|
+
if (typeof obj.started_at !== 'string') {
|
|
80
|
+
throw new ManifestSchemaError('manifest.started_at must be a string');
|
|
81
|
+
}
|
|
82
|
+
if (obj.finished_at !== null && typeof obj.finished_at !== 'string') {
|
|
83
|
+
throw new ManifestSchemaError('manifest.finished_at must be a string or null');
|
|
84
|
+
}
|
|
85
|
+
if (typeof obj.scope !== 'object' || obj.scope === null) {
|
|
86
|
+
throw new ManifestSchemaError('manifest.scope must be an object');
|
|
87
|
+
}
|
|
88
|
+
const scope = obj.scope;
|
|
89
|
+
if (typeof scope.scope !== 'string' || !VALID_SCOPES.has(scope.scope)) {
|
|
90
|
+
throw new ManifestSchemaError(`manifest.scope.scope must be one of user|team|org|public`);
|
|
91
|
+
}
|
|
92
|
+
if (!Array.isArray(obj.files)) {
|
|
93
|
+
throw new ManifestSchemaError('manifest.files must be an array');
|
|
94
|
+
}
|
|
95
|
+
for (let i = 0; i < obj.files.length; i++) {
|
|
96
|
+
const e = obj.files[i];
|
|
97
|
+
if (typeof e !== 'object' || e === null) {
|
|
98
|
+
throw new ManifestSchemaError(`manifest.files[${i}] must be an object`);
|
|
99
|
+
}
|
|
100
|
+
for (const k of ['path', 'sha256', 'completed_at']) {
|
|
101
|
+
if (typeof e[k] !== 'string') {
|
|
102
|
+
throw new ManifestSchemaError(`manifest.files[${i}].${k} must be a string`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (typeof e.size !== 'number') {
|
|
106
|
+
throw new ManifestSchemaError(`manifest.files[${i}].size must be a number`);
|
|
107
|
+
}
|
|
108
|
+
if (typeof e.status !== 'string' || !VALID_STATUSES.has(e.status)) {
|
|
109
|
+
throw new ManifestSchemaError(`manifest.files[${i}].status must be one of ${[...VALID_STATUSES].join('|')}`);
|
|
110
|
+
}
|
|
111
|
+
if (e.entity_id !== null && typeof e.entity_id !== 'string') {
|
|
112
|
+
throw new ManifestSchemaError(`manifest.files[${i}].entity_id must be a string or null`);
|
|
113
|
+
}
|
|
114
|
+
if (e.scan_result !== null && typeof e.scan_result !== 'string') {
|
|
115
|
+
throw new ManifestSchemaError(`manifest.files[${i}].scan_result must be a string or null`);
|
|
116
|
+
}
|
|
117
|
+
if (e.reason !== null && typeof e.reason !== 'string') {
|
|
118
|
+
throw new ManifestSchemaError(`manifest.files[${i}].reason must be a string or null`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return value;
|
|
122
|
+
}
|
|
123
|
+
// ── Atomic IO ───────────────────────────────────────────────────────────────
|
|
124
|
+
/**
|
|
125
|
+
* Write the manifest to `path` atomically:
|
|
126
|
+
* 1. Serialize JSON
|
|
127
|
+
* 2. Write to `<path>.tmp`
|
|
128
|
+
* 3. fs.renameSync into place (POSIX-atomic on same filesystem)
|
|
129
|
+
*
|
|
130
|
+
* A reader observing `path` will always see either the previous full contents
|
|
131
|
+
* or the new full contents — never a partially-written file.
|
|
132
|
+
*/
|
|
133
|
+
export function writeManifestAtomic(path, manifest) {
|
|
134
|
+
const tmp = `${path}.tmp`;
|
|
135
|
+
writeFileSync(tmp, JSON.stringify(manifest, null, 2), 'utf8');
|
|
136
|
+
renameSync(tmp, path);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Read and validate a manifest from disk. Throws if the file does not exist
|
|
140
|
+
* or fails schema validation.
|
|
141
|
+
*/
|
|
142
|
+
export function readManifest(path) {
|
|
143
|
+
const raw = readFileSync(path, 'utf8');
|
|
144
|
+
let parsed;
|
|
145
|
+
try {
|
|
146
|
+
parsed = JSON.parse(raw);
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
150
|
+
throw new ManifestSchemaError(`manifest at ${path} is not valid JSON: ${msg}`);
|
|
151
|
+
}
|
|
152
|
+
const m = parseManifest(parsed);
|
|
153
|
+
// v1 backwards-compat: mint a fresh batch_id so the rest of the pipeline can
|
|
154
|
+
// assume it exists. WARN so the caller knows the identity differs from the
|
|
155
|
+
// original run.
|
|
156
|
+
if (m.schema === MANIFEST_SCHEMA_V1 && !m.batch_id) {
|
|
157
|
+
const newId = randomUUID();
|
|
158
|
+
process.stderr.write(`[gramatr] ⚠ manifest at ${path} is v1 (no batch_id); assigning fresh batch_id ${newId} — resumed batch identity differs from the original\n`);
|
|
159
|
+
return { ...m, batch_id: newId };
|
|
160
|
+
}
|
|
161
|
+
return m;
|
|
162
|
+
}
|
|
163
|
+
// ── Resume index ────────────────────────────────────────────────────────────
|
|
164
|
+
/**
|
|
165
|
+
* Build a Map<absolutePath, entry> from a manifest's files array. Last entry
|
|
166
|
+
* wins (the manifest is append/upsert per file, so duplicates should not occur,
|
|
167
|
+
* but be defensive).
|
|
168
|
+
*/
|
|
169
|
+
export function indexManifestByPath(manifest) {
|
|
170
|
+
const map = new Map();
|
|
171
|
+
for (const e of manifest.files)
|
|
172
|
+
map.set(e.path, e);
|
|
173
|
+
return map;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Decide what to do with a file given the resume manifest's record (if any).
|
|
177
|
+
*
|
|
178
|
+
* - Not in manifest → upload
|
|
179
|
+
* - Path no longer exists on disk → skip-missing
|
|
180
|
+
* - In manifest, status=error → upload (retry)
|
|
181
|
+
* - In manifest, hash differs from current bytes → upload (re-upload)
|
|
182
|
+
* - In manifest, hash matches, status terminal → skip-previous
|
|
183
|
+
*/
|
|
184
|
+
export function decideResume(filePath, currentSha256, prior) {
|
|
185
|
+
if (currentSha256 === null) {
|
|
186
|
+
return {
|
|
187
|
+
kind: 'skip-missing',
|
|
188
|
+
note: 'file removed since last run',
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
if (!prior)
|
|
192
|
+
return { kind: 'upload' };
|
|
193
|
+
if (prior.status === 'error')
|
|
194
|
+
return { kind: 'upload' };
|
|
195
|
+
if (prior.sha256 !== currentSha256)
|
|
196
|
+
return { kind: 'upload' };
|
|
197
|
+
// Terminal statuses with matching hash — safe to skip.
|
|
198
|
+
let note;
|
|
199
|
+
switch (prior.status) {
|
|
200
|
+
case 'uploaded':
|
|
201
|
+
note = `previously uploaded as entity ${prior.entity_id ?? 'unknown'}`;
|
|
202
|
+
break;
|
|
203
|
+
case 'reused':
|
|
204
|
+
note = `previously reused entity ${prior.entity_id ?? 'unknown'}`;
|
|
205
|
+
break;
|
|
206
|
+
case 'skipped':
|
|
207
|
+
note = `previously skipped (entity ${prior.entity_id ?? 'unknown'})`;
|
|
208
|
+
break;
|
|
209
|
+
case 'rejected':
|
|
210
|
+
note = `previously rejected: ${prior.reason ?? 'unknown'}`;
|
|
211
|
+
break;
|
|
212
|
+
default:
|
|
213
|
+
note = `previously ${prior.status}`;
|
|
214
|
+
}
|
|
215
|
+
return { kind: 'skip-previous', entry: prior, note };
|
|
216
|
+
}
|
|
217
|
+
// ── Helpers ─────────────────────────────────────────────────────────────────
|
|
218
|
+
/** True iff a file currently exists at the given path. */
|
|
219
|
+
export function fileExists(path) {
|
|
220
|
+
return existsSync(path);
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=upload-manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-manifest.js","sourceRoot":"","sources":["../../src/bin/upload-manifest.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gramatr/mcp",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.76",
|
|
4
4
|
"description": "grāmatr — Intelligence middleware for AI agents. Pre-classifies every request, injects relevant memory and behavioral context, enforces data quality, and maintains session continuity across Claude, ChatGPT, Codex, Cursor, Gemini, and any MCP-compatible client.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"publishConfig": {
|