@gramatr/mcp 0.13.70 → 0.13.72

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.
@@ -1,23 +1,50 @@
1
1
  /**
2
2
  * brain — CLI subcommand for bulk file upload to the grāmatr brain.
3
3
  *
4
- * Reads local files (txt, md, csv, pdf, docx), extracts their text, and
5
- * pushes the content through the RAG pipeline via `add_observation` +
6
- * `create_entity` MCP tool calls. No flat files are ever written — all
7
- * state flows through MCP tool calls to the server/database.
4
+ * Reads local files (txt, md, csv, pdf, docx) and uploads them to the server
5
+ * via the `bulk_upload` MCP tool. The server is the single source of truth
6
+ * for validation, idempotency (sha256-based dedup), virus scanning (ClamAV),
7
+ * and entity/observation creation. The CLI is a thin wrapper.
8
+ *
9
+ * Migrated in epic #1904 PR 3 from the legacy `create_entity` + `add_observation`
10
+ * chain. The orphan-fix that PR 1 added to `resolveEntityId` is now obsolete:
11
+ * idempotency is enforced server-side via `on_duplicate`.
8
12
  *
9
13
  * Usage:
10
- * gramatr brain upload <file>
11
- * gramatr brain upload --dir <dir>
12
- * gramatr brain upload --dir <dir> --recursive
13
- * gramatr brain upload <file> --entity-id <id>
14
- * gramatr brain upload <file> --entity-name <name>
14
+ * gramatr brain upload <file> [flags]
15
+ * gramatr brain upload --dir <dir> [--recursive] [flags]
15
16
  * gramatr brain --help
17
+ *
18
+ * New flags (PR 3):
19
+ * --scope <user|team|org|public> Sharing scope (default: user)
20
+ * --project-id <id> Optional project association
21
+ * --team-id <id> Required when --scope=team
22
+ * --org-id <id> Required when --scope=org
23
+ * --public Shorthand for --scope=public
24
+ * --entity-type <type> Entity type (default: reference)
25
+ * --metadata <k=v> Repeatable. Adds to entity metadata
26
+ * --tags <t1,t2,...> Comma-separated topic tags
27
+ * --on-duplicate <skip|reuse|new-version>
28
+ * Dedup policy (default: reuse)
29
+ *
30
+ * Exit codes:
31
+ * 0 — all files uploaded (or skipped via on-duplicate=skip)
32
+ * 1 — at least one non-validation error (network/server 5xx)
33
+ * 2 — config error (bad flag combination, missing required value)
34
+ * 3 — at least one file rejected by a validator (oversize, av_*, etc.)
35
+ *
36
+ * NOTE: Until ClamAV is deployed in production (n90-co/prod-argocd-v2#409),
37
+ * every CLI upload returns `av_unconfigured` from the server. This is
38
+ * intentional fail-closed behaviour. There is no client-side bypass.
16
39
  */
17
40
  export declare const SUPPORTED_EXTENSIONS: Set<string>;
18
41
  /**
19
42
  * Extract plain text from a file buffer based on its extension.
20
- * Returns null if the extension is unsupported (caller decides whether to warn).
43
+ * Returns null if the extension is unsupported.
44
+ *
45
+ * NOTE: as of PR 3, the bulk_upload pipeline ships the raw bytes to the server
46
+ * (which performs its own validation + storage). This helper is preserved for
47
+ * existing callers and unit-test scaffolding only.
21
48
  */
22
49
  export declare function extractText(filePath: string, buffer: Buffer): Promise<string | null>;
23
50
  /**
@@ -26,30 +53,84 @@ export declare function extractText(filePath: string, buffer: Buffer): Promise<s
26
53
  */
27
54
  export declare function deriveEntityName(filePath: string): string;
28
55
  /**
29
- * Resolve the entity ID to use for a file upload.
30
- *
31
- * Priority:
32
- * 1. --entity-id <id> — use the ID directly (no server call)
33
- * 2. --entity-name <name> — create_entity with that name
34
- * 3. fallback — create_entity using the filename (without extension)
35
- *
36
- * Returns the entity ID as a string, or throws on failure.
56
+ * Map a server-side `UploadValidationError.reason` to the documented
57
+ * user-friendly CLI message. Reasons not in the table are passed through
58
+ * verbatim so unexpected server errors are still visible.
37
59
  */
38
- export declare function resolveEntityId(filePath: string, entityId: string | undefined, entityName: string | undefined): Promise<string>;
60
+ export declare const VALIDATION_REASON_MESSAGES: Record<string, string>;
61
+ /**
62
+ * Render the user-friendly message for a validation reason. For `av_infected`
63
+ * the signature is appended when supplied.
64
+ */
65
+ export declare function formatValidationMessage(reason: string, opts?: {
66
+ signature?: string;
67
+ }): string;
68
+ export interface ParsedArgs {
69
+ positionals: string[];
70
+ entityId?: string;
71
+ entityName?: string;
72
+ dir?: string;
73
+ recursive: boolean;
74
+ dryRun: boolean;
75
+ scope?: string;
76
+ projectId?: string;
77
+ teamId?: string;
78
+ orgId?: string;
79
+ publicShorthand: boolean;
80
+ entityType?: string;
81
+ metadata: string[];
82
+ tags?: string;
83
+ onDuplicate?: string;
84
+ }
85
+ export declare function parseUploadArgs(args: string[]): ParsedArgs;
86
+ export interface ValidatedConfig {
87
+ scope: 'user' | 'team' | 'org' | 'public';
88
+ projectId?: string;
89
+ teamId?: string;
90
+ orgId?: string;
91
+ isPublic: boolean;
92
+ entityType: string;
93
+ metadata: Record<string, string>;
94
+ tags: string[];
95
+ onDuplicate: 'skip' | 'reuse' | 'new-version';
96
+ }
97
+ export interface ValidationFailure {
98
+ ok: false;
99
+ message: string;
100
+ }
101
+ export interface ValidationSuccess {
102
+ ok: true;
103
+ config: ValidatedConfig;
104
+ }
105
+ /**
106
+ * Validate the parsed flag combination. Returns either a normalized config or
107
+ * a structured error message. Pure — does not write to stderr or exit.
108
+ */
109
+ export declare function validateUploadConfig(parsed: ParsedArgs): ValidationFailure | ValidationSuccess;
39
110
  export interface UploadFileOptions {
40
111
  entityId?: string;
41
112
  entityName?: string;
113
+ config: ValidatedConfig;
42
114
  }
43
115
  export interface UploadResult {
44
116
  file: string;
45
117
  entityId?: string;
118
+ observationId?: string;
119
+ wasDuplicate?: boolean;
46
120
  error?: string;
121
+ /** True iff the failure was a server-side validation rejection. */
122
+ validationReason?: string;
47
123
  skipped?: boolean;
48
124
  }
49
125
  /**
50
- * Upload a single file to the grāmatr brain.
126
+ * Build the bulk_upload tool input for a given file. Exported so tests can
127
+ * assert the exact shape forwarded to the server.
128
+ */
129
+ export declare function buildBulkUploadInput(filePath: string, buffer: Buffer, options: UploadFileOptions): Record<string, unknown>;
130
+ /**
131
+ * Upload a single file via the `bulk_upload` MCP tool.
51
132
  */
52
- export declare function uploadFile(filePath: string, options?: UploadFileOptions): Promise<UploadResult>;
133
+ export declare function uploadFile(filePath: string, options: UploadFileOptions): Promise<UploadResult>;
53
134
  /**
54
135
  * Collect all supported files in a directory.
55
136
  * @param dir Absolute or relative path to the directory
@@ -58,7 +139,7 @@ export declare function uploadFile(filePath: string, options?: UploadFileOptions
58
139
  export declare function collectFiles(dir: string, recursive: boolean): string[];
59
140
  /**
60
141
  * runBrain — entry point for `gramatr brain <args>` subcommand.
61
- * Returns an exit code (0 = success, 1 = one or more errors).
142
+ * Returns an exit code (0/1/2/3 see top of file).
62
143
  */
63
144
  export declare function runBrain(args: string[]): Promise<number>;
64
145
  //# sourceMappingURL=brain.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"brain.d.ts","sourceRoot":"","sources":["../../src/bin/brain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAQH,eAAO,MAAM,oBAAoB,aAAoD,CAAC;AAItF;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqBxB;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIzD;AAED;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC,MAAM,CAAC,CAkDjB;AAID,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,YAAY,CAAC,CA+DvB;AAID;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,EAAE,CAqBtE;AAmDD;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA2F9D"}
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
@@ -1,28 +1,55 @@
1
1
  /**
2
2
  * brain — CLI subcommand for bulk file upload to the grāmatr brain.
3
3
  *
4
- * Reads local files (txt, md, csv, pdf, docx), extracts their text, and
5
- * pushes the content through the RAG pipeline via `add_observation` +
6
- * `create_entity` MCP tool calls. No flat files are ever written — all
7
- * state flows through MCP tool calls to the server/database.
4
+ * Reads local files (txt, md, csv, pdf, docx) and uploads them to the server
5
+ * via the `bulk_upload` MCP tool. The server is the single source of truth
6
+ * for validation, idempotency (sha256-based dedup), virus scanning (ClamAV),
7
+ * and entity/observation creation. The CLI is a thin wrapper.
8
+ *
9
+ * Migrated in epic #1904 PR 3 from the legacy `create_entity` + `add_observation`
10
+ * chain. The orphan-fix that PR 1 added to `resolveEntityId` is now obsolete:
11
+ * idempotency is enforced server-side via `on_duplicate`.
8
12
  *
9
13
  * Usage:
10
- * gramatr brain upload <file>
11
- * gramatr brain upload --dir <dir>
12
- * gramatr brain upload --dir <dir> --recursive
13
- * gramatr brain upload <file> --entity-id <id>
14
- * gramatr brain upload <file> --entity-name <name>
14
+ * gramatr brain upload <file> [flags]
15
+ * gramatr brain upload --dir <dir> [--recursive] [flags]
15
16
  * gramatr brain --help
17
+ *
18
+ * New flags (PR 3):
19
+ * --scope <user|team|org|public> Sharing scope (default: user)
20
+ * --project-id <id> Optional project association
21
+ * --team-id <id> Required when --scope=team
22
+ * --org-id <id> Required when --scope=org
23
+ * --public Shorthand for --scope=public
24
+ * --entity-type <type> Entity type (default: reference)
25
+ * --metadata <k=v> Repeatable. Adds to entity metadata
26
+ * --tags <t1,t2,...> Comma-separated topic tags
27
+ * --on-duplicate <skip|reuse|new-version>
28
+ * Dedup policy (default: reuse)
29
+ *
30
+ * Exit codes:
31
+ * 0 — all files uploaded (or skipped via on-duplicate=skip)
32
+ * 1 — at least one non-validation error (network/server 5xx)
33
+ * 2 — config error (bad flag combination, missing required value)
34
+ * 3 — at least one file rejected by a validator (oversize, av_*, etc.)
35
+ *
36
+ * NOTE: Until ClamAV is deployed in production (n90-co/prod-argocd-v2#409),
37
+ * every CLI upload returns `av_unconfigured` from the server. This is
38
+ * intentional fail-closed behaviour. There is no client-side bypass.
16
39
  */
17
40
  import { readFileSync, readdirSync, statSync } from 'node:fs';
18
41
  import { extname, basename, join, resolve } from 'node:path';
19
42
  import { callTool } from '../proxy/local-client.js';
20
43
  // ── Supported extensions ────────────────────────────────────────────────────
21
44
  export const SUPPORTED_EXTENSIONS = new Set(['.txt', '.md', '.csv', '.pdf', '.docx']);
22
- // ── Text extraction ─────────────────────────────────────────────────────────
45
+ // ── Text extraction (kept for backwards-compatibility tests) ────────────────
23
46
  /**
24
47
  * Extract plain text from a file buffer based on its extension.
25
- * Returns null if the extension is unsupported (caller decides whether to warn).
48
+ * Returns null if the extension is unsupported.
49
+ *
50
+ * NOTE: as of PR 3, the bulk_upload pipeline ships the raw bytes to the server
51
+ * (which performs its own validation + storage). This helper is preserved for
52
+ * existing callers and unit-test scaffolding only.
26
53
  */
27
54
  export async function extractText(filePath, buffer) {
28
55
  const ext = extname(filePath).toLowerCase();
@@ -30,7 +57,6 @@ export async function extractText(filePath, buffer) {
30
57
  return buffer.toString('utf8');
31
58
  }
32
59
  if (ext === '.pdf') {
33
- // Dynamic import so the module is only loaded when a PDF is actually processed.
34
60
  const pdfParse = (await import('pdf-parse')).default;
35
61
  const result = await pdfParse(buffer);
36
62
  return result.text;
@@ -42,7 +68,7 @@ export async function extractText(filePath, buffer) {
42
68
  }
43
69
  return null;
44
70
  }
45
- // ── Entity resolution ───────────────────────────────────────────────────────
71
+ // ── Entity-name derivation ──────────────────────────────────────────────────
46
72
  /**
47
73
  * Derive an entity name from a file path when no explicit name is given.
48
74
  * Strips the extension from the base name.
@@ -52,61 +78,272 @@ export function deriveEntityName(filePath) {
52
78
  const ext = extname(base);
53
79
  return ext ? base.slice(0, -ext.length) : base;
54
80
  }
81
+ // ── Validation-error → user-message mapping ─────────────────────────────────
55
82
  /**
56
- * Resolve the entity ID to use for a file upload.
57
- *
58
- * Priority:
59
- * 1. --entity-id <id> — use the ID directly (no server call)
60
- * 2. --entity-name <name> — create_entity with that name
61
- * 3. fallback — create_entity using the filename (without extension)
62
- *
63
- * Returns the entity ID as a string, or throws on failure.
83
+ * Map a server-side `UploadValidationError.reason` to the documented
84
+ * user-friendly CLI message. Reasons not in the table are passed through
85
+ * verbatim so unexpected server errors are still visible.
64
86
  */
65
- export async function resolveEntityId(filePath, entityId, entityName) {
66
- if (entityId)
67
- return entityId;
68
- const name = entityName ?? deriveEntityName(filePath);
69
- const result = await callTool('create_entity', {
70
- name,
71
- entity_type: 'reference',
72
- observations: [],
73
- });
74
- // Both error and success bodies are JSON in result.content[0].text. Parse first
75
- // so we can recognize a DuplicateEntityError as "use the existing one" instead
76
- // of a hard failure. This covers the silent-orphan case where the local-client
77
- // fallback chain double-invoked create_entity first call inserted the row,
78
- // retry hit the duplicate guard. Without this branch the orphan stays empty.
79
- const text = result.content?.[0]?.type === 'text' ? result.content[0].text : '';
80
- let parsed;
87
+ export const VALIDATION_REASON_MESSAGES = {
88
+ av_unconfigured: 'Server has no antivirus scanner configured. Upload rejected. Contact your admin to deploy ClamAV.',
89
+ av_unavailable: 'Antivirus scanner is unreachable from the server. Upload rejected (fail-closed). Try again shortly.',
90
+ av_infected: 'File rejected: malware detected. Upload denied.',
91
+ oversize: 'File exceeds the upload size limit (25 MB by default). Reduce the file or contact your admin.',
92
+ magic_mismatch: 'File content type does not match the declared extension. Possible polyglot. Upload denied.',
93
+ docx_macro: 'DOCX contains macros (vbaProject.bin). Macros are not allowed. Upload denied.',
94
+ pdf_javascript: 'PDF contains embedded JavaScript. Not allowed. Upload denied.',
95
+ pdf_launch: 'PDF contains a /Launch action. Not allowed. Upload denied.',
96
+ };
97
+ const VALIDATION_REASONS = new Set(Object.keys(VALIDATION_REASON_MESSAGES));
98
+ /**
99
+ * Render the user-friendly message for a validation reason. For `av_infected`
100
+ * the signature is appended when supplied.
101
+ */
102
+ export function formatValidationMessage(reason, opts) {
103
+ const base = VALIDATION_REASON_MESSAGES[reason];
104
+ if (!base)
105
+ return `Upload rejected — ${reason}`;
106
+ if (reason === 'av_infected' && opts?.signature) {
107
+ return `File rejected: malware detected (signature: ${opts.signature}). Upload denied.`;
108
+ }
109
+ return base;
110
+ }
111
+ // ── Flag parsing ────────────────────────────────────────────────────────────
112
+ const ALLOWED_SCOPES = new Set(['user', 'team', 'org', 'public']);
113
+ const ALLOWED_ON_DUPLICATE = new Set(['skip', 'reuse', 'new-version']);
114
+ // Flags that take a value (consume the next arg).
115
+ const VALUE_FLAGS = new Set([
116
+ '--entity-id',
117
+ '--entity-name',
118
+ '--dir',
119
+ '--scope',
120
+ '--project-id',
121
+ '--team-id',
122
+ '--org-id',
123
+ '--entity-type',
124
+ '--metadata',
125
+ '--tags',
126
+ '--on-duplicate',
127
+ ]);
128
+ // Repeatable flags — collect every occurrence into an array.
129
+ const REPEATABLE_FLAGS = new Set(['--metadata']);
130
+ export function parseUploadArgs(args) {
131
+ const out = {
132
+ positionals: [],
133
+ recursive: false,
134
+ dryRun: false,
135
+ publicShorthand: false,
136
+ metadata: [],
137
+ };
138
+ let i = 0;
139
+ while (i < args.length) {
140
+ const arg = args[i];
141
+ if (REPEATABLE_FLAGS.has(arg)) {
142
+ const v = args[i + 1];
143
+ if (v === undefined) {
144
+ // Treat missing value as empty so downstream validation reports it.
145
+ out.metadata.push('');
146
+ }
147
+ else {
148
+ out.metadata.push(v);
149
+ }
150
+ i += 2;
151
+ continue;
152
+ }
153
+ if (VALUE_FLAGS.has(arg)) {
154
+ const v = args[i + 1];
155
+ switch (arg) {
156
+ case '--entity-id':
157
+ out.entityId = v;
158
+ break;
159
+ case '--entity-name':
160
+ out.entityName = v;
161
+ break;
162
+ case '--dir':
163
+ out.dir = v;
164
+ break;
165
+ case '--scope':
166
+ out.scope = v;
167
+ break;
168
+ case '--project-id':
169
+ out.projectId = v;
170
+ break;
171
+ case '--team-id':
172
+ out.teamId = v;
173
+ break;
174
+ case '--org-id':
175
+ out.orgId = v;
176
+ break;
177
+ case '--entity-type':
178
+ out.entityType = v;
179
+ break;
180
+ case '--tags':
181
+ out.tags = v;
182
+ break;
183
+ case '--on-duplicate':
184
+ out.onDuplicate = v;
185
+ break;
186
+ }
187
+ i += 2;
188
+ continue;
189
+ }
190
+ if (arg === '--recursive') {
191
+ out.recursive = true;
192
+ i += 1;
193
+ continue;
194
+ }
195
+ if (arg === '--dry-run') {
196
+ out.dryRun = true;
197
+ i += 1;
198
+ continue;
199
+ }
200
+ if (arg === '--public') {
201
+ out.publicShorthand = true;
202
+ i += 1;
203
+ continue;
204
+ }
205
+ if (arg.startsWith('--')) {
206
+ i += 1;
207
+ continue;
208
+ } // unknown boolean flag — ignore
209
+ out.positionals.push(arg);
210
+ i += 1;
211
+ }
212
+ return out;
213
+ }
214
+ /**
215
+ * Validate the parsed flag combination. Returns either a normalized config or
216
+ * a structured error message. Pure — does not write to stderr or exit.
217
+ */
218
+ export function validateUploadConfig(parsed) {
219
+ if (parsed.entityId && parsed.entityName) {
220
+ return { ok: false, message: '--entity-id and --entity-name are mutually exclusive' };
221
+ }
222
+ // Resolve scope — handle --public shorthand.
223
+ let scope;
224
+ if (parsed.publicShorthand) {
225
+ if (parsed.scope && parsed.scope !== 'public') {
226
+ return {
227
+ ok: false,
228
+ message: `--public conflicts with --scope=${parsed.scope}`,
229
+ };
230
+ }
231
+ scope = 'public';
232
+ }
233
+ else if (parsed.scope === undefined) {
234
+ scope = 'user';
235
+ }
236
+ else if (ALLOWED_SCOPES.has(parsed.scope)) {
237
+ scope = parsed.scope;
238
+ }
239
+ else {
240
+ return {
241
+ ok: false,
242
+ message: `--scope must be one of: user | team | org | public (got "${parsed.scope}")`,
243
+ };
244
+ }
245
+ if (scope === 'team' && !parsed.teamId) {
246
+ return { ok: false, message: '--scope=team requires --team-id <uuid>' };
247
+ }
248
+ if (scope === 'org' && !parsed.orgId) {
249
+ return { ok: false, message: '--scope=org requires --org-id <uuid>' };
250
+ }
251
+ // on-duplicate
252
+ let onDuplicate;
253
+ if (parsed.onDuplicate === undefined) {
254
+ onDuplicate = 'reuse';
255
+ }
256
+ else if (ALLOWED_ON_DUPLICATE.has(parsed.onDuplicate)) {
257
+ onDuplicate = parsed.onDuplicate;
258
+ }
259
+ else {
260
+ return {
261
+ ok: false,
262
+ message: `--on-duplicate must be one of: skip | reuse | new-version (got "${parsed.onDuplicate}")`,
263
+ };
264
+ }
265
+ // metadata k=v
266
+ const metadata = {};
267
+ for (const raw of parsed.metadata) {
268
+ const eq = raw.indexOf('=');
269
+ if (eq <= 0) {
270
+ return { ok: false, message: `--metadata "${raw}" must be in key=value form with non-empty key` };
271
+ }
272
+ const key = raw.slice(0, eq).trim();
273
+ const value = raw.slice(eq + 1);
274
+ if (key.length === 0) {
275
+ return { ok: false, message: `--metadata "${raw}" has empty key` };
276
+ }
277
+ metadata[key] = value;
278
+ }
279
+ // tags
280
+ const tags = [];
281
+ if (parsed.tags) {
282
+ for (const t of parsed.tags.split(',')) {
283
+ const trimmed = t.trim();
284
+ if (trimmed.length > 0)
285
+ tags.push(trimmed);
286
+ }
287
+ }
288
+ return {
289
+ ok: true,
290
+ config: {
291
+ scope,
292
+ projectId: parsed.projectId,
293
+ teamId: parsed.teamId,
294
+ orgId: parsed.orgId,
295
+ isPublic: scope === 'public',
296
+ entityType: parsed.entityType ?? 'reference',
297
+ metadata,
298
+ tags,
299
+ onDuplicate,
300
+ },
301
+ };
302
+ }
303
+ /**
304
+ * Build the bulk_upload tool input for a given file. Exported so tests can
305
+ * assert the exact shape forwarded to the server.
306
+ */
307
+ export function buildBulkUploadInput(filePath, buffer, options) {
308
+ const filename = basename(filePath);
309
+ const input = {
310
+ content_base64: buffer.toString('base64'),
311
+ filename,
312
+ entity_type: options.config.entityType,
313
+ scope: options.config.scope,
314
+ on_duplicate: options.config.onDuplicate,
315
+ is_public: options.config.isPublic,
316
+ };
317
+ if (options.entityId)
318
+ input.entity_id = options.entityId;
319
+ else if (options.entityName)
320
+ input.entity_name = options.entityName;
321
+ else
322
+ input.entity_name = deriveEntityName(filePath);
323
+ if (options.config.projectId)
324
+ input.project_id = options.config.projectId;
325
+ if (options.config.teamId)
326
+ input.team_id = options.config.teamId;
327
+ if (options.config.orgId)
328
+ input.org_id = options.config.orgId;
329
+ if (Object.keys(options.config.metadata).length > 0)
330
+ input.metadata = options.config.metadata;
331
+ if (options.config.tags.length > 0)
332
+ input.tags = options.config.tags;
333
+ return input;
334
+ }
335
+ function parseToolBody(text) {
81
336
  try {
82
- parsed = JSON.parse(text);
337
+ return JSON.parse(text);
83
338
  }
84
339
  catch {
85
- // Non-JSON body — fall through to generic error path
86
- }
87
- if (parsed?.error === 'DuplicateEntityError' && parsed.existing_entity_id) {
88
- // Idempotent reuse — same name + type already exists for this user. Treat
89
- // it as a successful resolve so the caller can attach observations.
90
- return parsed.existing_entity_id;
340
+ return undefined;
91
341
  }
92
- if (result.isError) {
93
- // gramatr-allow: B1 — CLI bin command, no @gramatr/core dependency in MCP package
94
- throw new Error(`create_entity failed: ${text || 'unknown error'}`);
95
- }
96
- if (!parsed) {
97
- // gramatr-allow: B1 — CLI bin command, no @gramatr/core dependency in MCP package
98
- throw new Error(`could not parse entity id from response: ${text}`);
99
- }
100
- const id = parsed.id ?? parsed.entity?.id;
101
- // gramatr-allow: B1 — CLI bin command, no @gramatr/core dependency in MCP package
102
- if (!id)
103
- throw new Error('no id in create_entity response');
104
- return id;
105
342
  }
106
343
  /**
107
- * Upload a single file to the grāmatr brain.
344
+ * Upload a single file via the `bulk_upload` MCP tool.
108
345
  */
109
- export async function uploadFile(filePath, options = {}) {
346
+ export async function uploadFile(filePath, options) {
110
347
  const ext = extname(filePath).toLowerCase();
111
348
  if (!SUPPORTED_EXTENSIONS.has(ext)) {
112
349
  process.stderr.write(`[gramatr] skipping ${filePath} (unsupported type: ${ext})\n`);
@@ -121,47 +358,38 @@ export async function uploadFile(filePath, options = {}) {
121
358
  process.stderr.write(`[gramatr] ✗ ${filePath}: ${message}\n`);
122
359
  return { file: filePath, error: message };
123
360
  }
124
- let text;
125
- try {
126
- text = await extractText(filePath, buffer);
127
- }
128
- catch (err) {
129
- const message = err instanceof Error ? err.message : String(err);
130
- process.stderr.write(`[gramatr] ✗ ${filePath}: failed to extract text — ${message}\n`);
131
- return { file: filePath, error: message };
132
- }
133
- if (text === null) {
134
- // extractText returns null for unsupported extensions — already guarded above
135
- process.stderr.write(`[gramatr] skipping ${filePath} (unsupported type: ${ext})\n`);
136
- return { file: filePath, skipped: true };
137
- }
138
- if (text.trim().length === 0) {
361
+ if (buffer.length === 0) {
139
362
  process.stderr.write(`[gramatr] skipping ${filePath} (empty content)\n`);
140
363
  return { file: filePath, skipped: true };
141
364
  }
142
- process.stderr.write(`[gramatr] uploading ${basename(filePath)} (${text.length} chars)...\n`);
143
- let entityId;
144
- try {
145
- entityId = await resolveEntityId(filePath, options.entityId, options.entityName);
365
+ process.stderr.write(`[gramatr] uploading ${basename(filePath)} (${buffer.length} bytes)...\n`);
366
+ const input = buildBulkUploadInput(filePath, buffer, options);
367
+ const result = await callTool('bulk_upload', input);
368
+ const text = result.content?.[0]?.type === 'text' ? result.content[0].text : '';
369
+ const parsed = parseToolBody(text);
370
+ if (result.isError) {
371
+ if (parsed?.type === 'UploadValidationError' && parsed.reason) {
372
+ const userMsg = formatValidationMessage(parsed.reason, { signature: parsed.signature });
373
+ process.stderr.write(`[gramatr] ✗ ${basename(filePath)}: ${userMsg}\n`);
374
+ return { file: filePath, error: userMsg, validationReason: parsed.reason };
375
+ }
376
+ const errMsg = parsed?.error ?? text ?? 'unknown error';
377
+ process.stderr.write(`[gramatr] ✗ ${basename(filePath)}: bulk_upload failed — ${errMsg}\n`);
378
+ return { file: filePath, error: errMsg };
146
379
  }
147
- catch (err) {
148
- const message = err instanceof Error ? err.message : String(err);
149
- process.stderr.write(`[gramatr] ✗ ${filePath}: ${message}\n`);
150
- return { file: filePath, error: message };
380
+ if (!parsed?.entity_id) {
381
+ const errMsg = `bulk_upload returned no entity_id: ${text}`;
382
+ process.stderr.write(`[gramatr] ✗ ${basename(filePath)}: ${errMsg}\n`);
383
+ return { file: filePath, error: errMsg };
151
384
  }
152
- const obsResult = await callTool('add_observation', {
153
- entity_id: entityId,
154
- content: text,
155
- });
156
- if (obsResult.isError) {
157
- const errorText = obsResult.content?.[0]?.type === 'text'
158
- ? obsResult.content[0].text
159
- : 'unknown error';
160
- process.stderr.write(`[gramatr] ✗ ${filePath}: add_observation failed — ${errorText}\n`);
161
- return { file: filePath, entityId, error: errorText };
162
- }
163
- process.stderr.write(`[gramatr] ✓ ${basename(filePath)} → entity ${entityId}\n`);
164
- return { file: filePath, entityId };
385
+ const dupSuffix = parsed.was_duplicate ? ' (duplicate)' : '';
386
+ process.stderr.write(`[gramatr] ✓ ${basename(filePath)} → entity ${parsed.entity_id}${dupSuffix}\n`);
387
+ return {
388
+ file: filePath,
389
+ entityId: parsed.entity_id,
390
+ observationId: parsed.observation_id,
391
+ wasDuplicate: parsed.was_duplicate === true,
392
+ };
165
393
  }
166
394
  // ── Directory collection ────────────────────────────────────────────────────
167
395
  /**
@@ -189,20 +417,10 @@ export function collectFiles(dir, recursive) {
189
417
  }
190
418
  return files;
191
419
  }
192
- // ── Arg helpers ─────────────────────────────────────────────────────────────
193
- function getFlag(args, name) {
194
- const idx = args.indexOf(name);
195
- if (idx === -1 || idx + 1 >= args.length)
196
- return undefined;
197
- return args[idx + 1];
198
- }
199
- function hasFlag(args, name) {
200
- return args.includes(name);
201
- }
202
420
  // ── Help text ────────────────────────────────────────────────────────────────
203
421
  function printBrainHelp() {
204
422
  process.stderr.write(`
205
- gramatr brain — Upload local files to the grāmatr brain
423
+ gramatr brain — Upload local files to the grāmatr brain (via bulk_upload)
206
424
 
207
425
  Usage:
208
426
  brain upload <file> Upload a single file
@@ -213,29 +431,57 @@ function printBrainHelp() {
213
431
  Supported file types:
214
432
  .txt .md .csv .pdf .docx
215
433
 
216
- Entity options (controls which entity observations are added to):
217
- --entity-id <id> Attach to an existing entity by ID
218
- --entity-name <name> Create (or reuse) an entity with this name
219
- Default: use filename without extension
434
+ Entity options:
435
+ --entity-id <id> Attach to an existing entity by ID
436
+ --entity-name <name> Use this entity name (server creates if missing)
437
+ Default: filename without extension
438
+ --entity-type <type> Entity type (default: reference)
439
+
440
+ Sharing / scope:
441
+ --scope <user|team|org|public> Default: user
442
+ --project-id <uuid> Optional project association
443
+ --team-id <uuid> Required when --scope=team
444
+ --org-id <uuid> Required when --scope=org
445
+ --public Shorthand for --scope=public
446
+
447
+ Metadata:
448
+ --metadata key=value Repeatable. Adds entries to entity metadata
449
+ --tags t1,t2,t3 Comma-separated topic tags
450
+
451
+ Dedup policy:
452
+ --on-duplicate <skip|reuse|new-version>
453
+ Server-side dedup behaviour (default: reuse)
454
+ skip — leave existing entity untouched
455
+ reuse — append observation to existing entity
456
+ new-version — create "<name> v2" / v3 / ...
220
457
 
221
458
  Other flags:
222
- --dry-run Preflight: show what would be uploaded, do not write
223
- --recursive With --dir, walk subdirectories
459
+ --dry-run Preflight only — show what would be uploaded
460
+ --recursive With --dir, walk subdirectories
461
+
462
+ Exit codes:
463
+ 0 all files uploaded (or skipped via on-duplicate=skip)
464
+ 1 at least one non-validation error (network / 5xx)
465
+ 2 config error (bad flag combination)
466
+ 3 at least one file rejected by a server-side validator
224
467
 
225
468
  Examples:
226
469
  brain upload project-brief.pdf
227
- brain upload notes.md --entity-name "Q3 Research"
228
- brain upload contract.docx --entity-id abc-123
229
- brain upload --dir ./docs
230
- brain upload --dir ./research --recursive
231
- brain upload --dir ./docs --dry-run
470
+ brain upload notes.md --entity-name "Q3 Research" --tags strategy,2026
471
+ brain upload contract.docx --entity-id abc-123 --on-duplicate new-version
472
+ brain upload --dir ./docs --scope team --team-id <team-uuid>
473
+ brain upload --dir ./research --recursive --metadata source=arxiv --metadata year=2026
474
+ brain upload report.pdf --public
475
+
476
+ NOTE: bulk_upload requires ClamAV to be deployed on the server. Until then,
477
+ every upload returns av_unconfigured (fail-closed by design).
232
478
 
233
479
  `);
234
480
  }
235
481
  // ── Main entry point ─────────────────────────────────────────────────────────
236
482
  /**
237
483
  * runBrain — entry point for `gramatr brain <args>` subcommand.
238
- * Returns an exit code (0 = success, 1 = one or more errors).
484
+ * Returns an exit code (0/1/2/3 see top of file).
239
485
  */
240
486
  export async function runBrain(args) {
241
487
  const subcommand = args[0];
@@ -250,35 +496,21 @@ export async function runBrain(args) {
250
496
  return 1;
251
497
  }
252
498
  // -- upload subcommand --
253
- const uploadArgs = args.slice(1);
254
- const entityId = getFlag(uploadArgs, '--entity-id');
255
- const entityName = getFlag(uploadArgs, '--entity-name');
256
- const dirArg = getFlag(uploadArgs, '--dir');
257
- const recursive = hasFlag(uploadArgs, '--recursive');
258
- const dryRun = hasFlag(uploadArgs, '--dry-run');
259
- // Collect the positional (non-flag) arguments as file paths
260
- const positionals = [];
261
- let i = 0;
262
- while (i < uploadArgs.length) {
263
- const arg = uploadArgs[i];
264
- if (arg === '--entity-id' || arg === '--entity-name' || arg === '--dir') {
265
- i += 2; // skip flag + value
266
- }
267
- else if (arg.startsWith('--')) {
268
- i += 1; // boolean flag
269
- }
270
- else {
271
- positionals.push(arg);
272
- i += 1;
273
- }
499
+ const parsed = parseUploadArgs(args.slice(1));
500
+ const validation = validateUploadConfig(parsed);
501
+ if (!validation.ok) {
502
+ process.stderr.write(`[gramatr] ${validation.message}\n`);
503
+ process.stderr.write(' Run: gramatr brain --help\n');
504
+ return 2;
274
505
  }
506
+ const { config } = validation;
275
507
  // Build the list of files to upload
276
508
  const filePaths = [];
277
- if (dirArg) {
278
- const absDir = resolve(dirArg);
509
+ if (parsed.dir) {
510
+ const absDir = resolve(parsed.dir);
279
511
  let dirFiles;
280
512
  try {
281
- dirFiles = collectFiles(absDir, recursive);
513
+ dirFiles = collectFiles(absDir, parsed.recursive);
282
514
  }
283
515
  catch (err) {
284
516
  const message = err instanceof Error ? err.message : String(err);
@@ -291,7 +523,7 @@ export async function runBrain(args) {
291
523
  }
292
524
  filePaths.push(...dirFiles);
293
525
  }
294
- for (const p of positionals) {
526
+ for (const p of parsed.positionals) {
295
527
  filePaths.push(resolve(p));
296
528
  }
297
529
  if (filePaths.length === 0) {
@@ -299,25 +531,43 @@ export async function runBrain(args) {
299
531
  process.stderr.write(' Run: gramatr brain --help\n');
300
532
  return 1;
301
533
  }
302
- if (dryRun) {
534
+ if (parsed.dryRun) {
303
535
  process.stderr.write(`[gramatr] dry-run — would upload ${filePaths.length} file(s):\n`);
536
+ process.stderr.write(` scope=${config.scope} entity_type=${config.entityType} on_duplicate=${config.onDuplicate}\n`);
304
537
  for (const filePath of filePaths) {
305
538
  const ext = extname(filePath).toLowerCase();
306
539
  const supported = SUPPORTED_EXTENSIONS.has(ext);
307
- const name = entityId ? `(reuse entity ${entityId})` : `entity_name=${entityName ?? deriveEntityName(filePath)}`;
540
+ const target = parsed.entityId
541
+ ? `(reuse entity ${parsed.entityId})`
542
+ : `entity_name=${parsed.entityName ?? deriveEntityName(filePath)}`;
308
543
  const status = supported ? 'OK' : `SKIP (unsupported: ${ext})`;
309
- process.stderr.write(` [${status}] ${filePath} → ${name}\n`);
544
+ process.stderr.write(` [${status}] ${filePath} → ${target}\n`);
310
545
  }
311
546
  process.stderr.write('[gramatr] dry-run complete — no changes written\n');
312
547
  return 0;
313
548
  }
314
- const options = { entityId, entityName };
549
+ const options = {
550
+ entityId: parsed.entityId,
551
+ entityName: parsed.entityName,
552
+ config,
553
+ };
315
554
  let hasError = false;
555
+ let hasValidationReject = false;
316
556
  for (const filePath of filePaths) {
317
557
  const result = await uploadFile(filePath, options);
318
- if (result.error)
558
+ if (result.validationReason) {
559
+ hasValidationReject = true;
560
+ }
561
+ else if (result.error) {
319
562
  hasError = true;
563
+ }
320
564
  }
321
- return hasError ? 1 : 0;
565
+ // Validator rejection takes precedence — distinct exit code so scripts can
566
+ // differentiate "server said no" from "transport blew up".
567
+ if (hasValidationReject)
568
+ return 3;
569
+ if (hasError)
570
+ return 1;
571
+ return 0;
322
572
  }
323
573
  //# sourceMappingURL=brain.js.map
@@ -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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gramatr/mcp",
3
- "version": "0.13.70",
3
+ "version": "0.13.72",
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": {