@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.
@@ -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;
@@ -1 +1 @@
1
- {"version":3,"file":"brain.d.ts","sourceRoot":"","sources":["../../src/bin/brain.ts"],"names":[],"mappings":"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"}
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
- try {
354
- buffer = readFileSync(filePath);
367
+ if (options.prereadBuffer) {
368
+ buffer = options.prereadBuffer;
355
369
  }
356
- catch (err) {
357
- const message = err instanceof Error ? err.message : String(err);
358
- process.stderr.write(`[gramatr] ${filePath}: ${message}\n`);
359
- return { file: filePath, error: message };
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
- const result = await uploadFile(filePath, options);
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)
@@ -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.74",
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": {