greprag 5.18.0 → 5.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/corpus/client.d.ts +58 -0
- package/dist/commands/corpus/client.js +182 -0
- package/dist/commands/corpus/client.js.map +1 -0
- package/dist/commands/corpus/index.d.ts +23 -0
- package/dist/commands/corpus/index.js +109 -0
- package/dist/commands/corpus/index.js.map +1 -0
- package/dist/commands/corpus/manage.d.ts +6 -0
- package/dist/commands/corpus/manage.js +49 -0
- package/dist/commands/corpus/manage.js.map +1 -0
- package/dist/commands/corpus/refresh.d.ts +11 -0
- package/dist/commands/corpus/refresh.js +117 -0
- package/dist/commands/corpus/refresh.js.map +1 -0
- package/dist/commands/corpus/search.d.ts +6 -0
- package/dist/commands/corpus/search.js +110 -0
- package/dist/commands/corpus/search.js.map +1 -0
- package/dist/commands/corpus/section.d.ts +5 -0
- package/dist/commands/corpus/section.js +35 -0
- package/dist/commands/corpus/section.js.map +1 -0
- package/dist/commands/corpus/source.d.ts +15 -0
- package/dist/commands/corpus/source.js +119 -0
- package/dist/commands/corpus/source.js.map +1 -0
- package/dist/commands/corpus/status.d.ts +5 -0
- package/dist/commands/corpus/status.js +47 -0
- package/dist/commands/corpus/status.js.map +1 -0
- package/dist/commands/corpus/upload.d.ts +7 -0
- package/dist/commands/corpus/upload.js +101 -0
- package/dist/commands/corpus/upload.js.map +1 -0
- package/dist/commands/corpus/walk.d.ts +5 -0
- package/dist/commands/corpus/walk.js +41 -0
- package/dist/commands/corpus/walk.js.map +1 -0
- package/dist/commands/session.d.ts +8 -0
- package/dist/commands/session.js +132 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/hook.js +9 -2
- package/dist/hook.js.map +1 -1
- package/dist/index.js +8 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/commands/corpus.d.ts +0 -18
- package/dist/commands/corpus.js +0 -617
- package/dist/commands/corpus.js.map +0 -1
- package/dist/commands/fact.d.ts +0 -22
- package/dist/commands/fact.js +0 -337
- package/dist/commands/fact.js.map +0 -1
- package/dist/commands/inbox-watch-supervisor.d.ts +0 -31
- package/dist/commands/inbox-watch-supervisor.js +0 -173
- package/dist/commands/inbox-watch-supervisor.js.map +0 -1
- package/dist/commands/inbox-watch-util.d.ts +0 -5
- package/dist/commands/inbox-watch-util.js +0 -13
- package/dist/commands/inbox-watch-util.js.map +0 -1
- package/dist/commands/odyssey.d.ts +0 -27
- package/dist/commands/odyssey.js +0 -394
- package/dist/commands/odyssey.js.map +0 -1
- package/dist/inbox-notify.d.ts +0 -60
- package/dist/inbox-notify.js +0 -229
- package/dist/inbox-notify.js.map +0 -1
package/dist/commands/corpus.js
DELETED
|
@@ -1,617 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/** greprag corpus — upload, search, and walk arbitrary text corpora.
|
|
3
|
-
*
|
|
4
|
-
* A corpus is just a `stores` row with `kind != 'memory'`. Books, codebases,
|
|
5
|
-
* reference docs, voice samples — all live in the same nodes table, queried
|
|
6
|
-
* through the same five retrieval modes (anchor / crawl / shape / section /
|
|
7
|
-
* search). This command is the thin user-facing surface over /v1/stores/*.
|
|
8
|
-
*
|
|
9
|
-
* Subcommands:
|
|
10
|
-
* upload <file|url> [--name N] [--kind K]
|
|
11
|
-
* search <store> "<intent>" [--limit 5]
|
|
12
|
-
* walk <store> <nodeId> [--before 2 --after 2]
|
|
13
|
-
* list [--kind K]
|
|
14
|
-
* delete <store>
|
|
15
|
-
*
|
|
16
|
-
* <store> accepts either a store UUID or its name. Names are resolved
|
|
17
|
-
* case-insensitively against the tenant's list of stores; ambiguous
|
|
18
|
-
* names are rejected with a hint to use the UUID. */
|
|
19
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
20
|
-
if (k2 === undefined) k2 = k;
|
|
21
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
22
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
23
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
24
|
-
}
|
|
25
|
-
Object.defineProperty(o, k2, desc);
|
|
26
|
-
}) : (function(o, m, k, k2) {
|
|
27
|
-
if (k2 === undefined) k2 = k;
|
|
28
|
-
o[k2] = m[k];
|
|
29
|
-
}));
|
|
30
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
31
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
32
|
-
}) : function(o, v) {
|
|
33
|
-
o["default"] = v;
|
|
34
|
-
});
|
|
35
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
36
|
-
var ownKeys = function(o) {
|
|
37
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
38
|
-
var ar = [];
|
|
39
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
40
|
-
return ar;
|
|
41
|
-
};
|
|
42
|
-
return ownKeys(o);
|
|
43
|
-
};
|
|
44
|
-
return function (mod) {
|
|
45
|
-
if (mod && mod.__esModule) return mod;
|
|
46
|
-
var result = {};
|
|
47
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
48
|
-
__setModuleDefault(result, mod);
|
|
49
|
-
return result;
|
|
50
|
-
};
|
|
51
|
-
})();
|
|
52
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
|
-
exports.runCorpus = runCorpus;
|
|
54
|
-
const fs = __importStar(require("fs"));
|
|
55
|
-
const path = __importStar(require("path"));
|
|
56
|
-
const API_URL_DEFAULT = 'https://api.greprag.com';
|
|
57
|
-
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
58
|
-
const VALID_KINDS = ['book', 'codebase', 'voice', 'memory', 'inbox', 'generic'];
|
|
59
|
-
// -- Config + HTTP --------------------------------------------------------
|
|
60
|
-
function loadEnvFile(filePath) {
|
|
61
|
-
try {
|
|
62
|
-
const content = fs.readFileSync(filePath, 'utf-8');
|
|
63
|
-
for (const line of content.split('\n')) {
|
|
64
|
-
const trimmed = line.trim();
|
|
65
|
-
if (!trimmed || trimmed.startsWith('#'))
|
|
66
|
-
continue;
|
|
67
|
-
const eqIdx = trimmed.indexOf('=');
|
|
68
|
-
if (eqIdx < 1)
|
|
69
|
-
continue;
|
|
70
|
-
const key = trimmed.slice(0, eqIdx).trim();
|
|
71
|
-
let value = trimmed.slice(eqIdx + 1).trim();
|
|
72
|
-
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
73
|
-
(value.startsWith("'") && value.endsWith("'"))) {
|
|
74
|
-
value = value.slice(1, -1);
|
|
75
|
-
}
|
|
76
|
-
if (!process.env[key])
|
|
77
|
-
process.env[key] = value;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
catch { /* file missing — fine */ }
|
|
81
|
-
}
|
|
82
|
-
function getConfig() {
|
|
83
|
-
const homeDir = process.env.HOME || process.env.USERPROFILE || '';
|
|
84
|
-
if (homeDir)
|
|
85
|
-
loadEnvFile(path.join(homeDir, '.greprag', '.env'));
|
|
86
|
-
if (!process.env.GREPRAG_API_KEY)
|
|
87
|
-
loadEnvFile(path.join(process.cwd(), '.env'));
|
|
88
|
-
return {
|
|
89
|
-
apiUrl: process.env.GREPRAG_API_URL || API_URL_DEFAULT,
|
|
90
|
-
apiKey: process.env.GREPRAG_API_KEY || '',
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
async function apiCall(url, apiKey, body) {
|
|
94
|
-
const res = await fetch(url, {
|
|
95
|
-
method: 'POST',
|
|
96
|
-
headers: {
|
|
97
|
-
'Authorization': `Bearer ${apiKey}`,
|
|
98
|
-
'Content-Type': 'application/json',
|
|
99
|
-
},
|
|
100
|
-
body: JSON.stringify(body),
|
|
101
|
-
});
|
|
102
|
-
if (!res.ok)
|
|
103
|
-
throw new Error(`API ${res.status}: ${await res.text()}`);
|
|
104
|
-
return res.json();
|
|
105
|
-
}
|
|
106
|
-
async function apiGet(url, apiKey) {
|
|
107
|
-
const res = await fetch(url, {
|
|
108
|
-
headers: { 'Authorization': `Bearer ${apiKey}` },
|
|
109
|
-
});
|
|
110
|
-
if (!res.ok)
|
|
111
|
-
throw new Error(`API ${res.status}: ${await res.text()}`);
|
|
112
|
-
return res.json();
|
|
113
|
-
}
|
|
114
|
-
async function apiDelete(url, apiKey) {
|
|
115
|
-
const res = await fetch(url, {
|
|
116
|
-
method: 'DELETE',
|
|
117
|
-
headers: { 'Authorization': `Bearer ${apiKey}` },
|
|
118
|
-
});
|
|
119
|
-
if (!res.ok)
|
|
120
|
-
throw new Error(`API ${res.status}: ${await res.text()}`);
|
|
121
|
-
return res.json();
|
|
122
|
-
}
|
|
123
|
-
// -- Helpers ---------------------------------------------------------------
|
|
124
|
-
function getFlag(args, flag) {
|
|
125
|
-
const idx = args.indexOf(flag);
|
|
126
|
-
if (idx === -1 || idx + 1 >= args.length)
|
|
127
|
-
return undefined;
|
|
128
|
-
return args[idx + 1];
|
|
129
|
-
}
|
|
130
|
-
/** Collect every value of a repeatable flag (e.g. --store A --store B). */
|
|
131
|
-
function getFlags(args, flag) {
|
|
132
|
-
const out = [];
|
|
133
|
-
for (let i = 0; i < args.length - 1; i++)
|
|
134
|
-
if (args[i] === flag)
|
|
135
|
-
out.push(args[i + 1]);
|
|
136
|
-
return out;
|
|
137
|
-
}
|
|
138
|
-
/** Positional args, skipping every --flag and the value of any value-taking flag. */
|
|
139
|
-
function extractPositionals(args, flagsWithValue) {
|
|
140
|
-
const out = [];
|
|
141
|
-
for (let i = 0; i < args.length; i++) {
|
|
142
|
-
const a = args[i];
|
|
143
|
-
if (a.startsWith('--')) {
|
|
144
|
-
if (flagsWithValue.has(a))
|
|
145
|
-
i++;
|
|
146
|
-
continue;
|
|
147
|
-
}
|
|
148
|
-
out.push(a);
|
|
149
|
-
}
|
|
150
|
-
return out;
|
|
151
|
-
}
|
|
152
|
-
const SEARCH_VALUE_FLAGS = new Set(['--limit', '--section', '--shape', '--store', '--kind']);
|
|
153
|
-
function abortNotConfigured() {
|
|
154
|
-
console.error('Not configured. Run: greprag init');
|
|
155
|
-
process.exit(1);
|
|
156
|
-
}
|
|
157
|
-
/** Resolve a user-supplied store reference to a store row. Accepts a UUID
|
|
158
|
-
* or a case-insensitive name. Ambiguous names fail loud. */
|
|
159
|
-
async function resolveStore(ref, apiUrl, apiKey) {
|
|
160
|
-
if (UUID_RE.test(ref)) {
|
|
161
|
-
const r = await apiGet(`${apiUrl}/v1/stores/${ref}`, apiKey);
|
|
162
|
-
if (!r.ok || !r.store)
|
|
163
|
-
throw new Error(r.error || 'store not found');
|
|
164
|
-
return r.store;
|
|
165
|
-
}
|
|
166
|
-
const list = await apiGet(`${apiUrl}/v1/stores`, apiKey);
|
|
167
|
-
const needle = ref.trim().toLowerCase();
|
|
168
|
-
const matches = list.stores.filter(s => s.name.toLowerCase() === needle);
|
|
169
|
-
if (matches.length === 0) {
|
|
170
|
-
throw new Error(`no store named "${ref}". Run 'greprag corpus list' to see what's available.`);
|
|
171
|
-
}
|
|
172
|
-
if (matches.length > 1) {
|
|
173
|
-
const ids = matches.map(m => `${m.id} (${m.kind})`).join(', ');
|
|
174
|
-
throw new Error(`name "${ref}" is ambiguous — multiple stores match. Use a UUID instead: ${ids}`);
|
|
175
|
-
}
|
|
176
|
-
return matches[0];
|
|
177
|
-
}
|
|
178
|
-
function isUrl(s) {
|
|
179
|
-
return /^https?:\/\//i.test(s);
|
|
180
|
-
}
|
|
181
|
-
// Formats the Worker converts server-side (sent as base64 bytes). Everything
|
|
182
|
-
// else — markdown, plain text, source code, unknown/extensionless — ships as
|
|
183
|
-
// UTF-8 text and passes through unchanged. Deferred formats fail loud here.
|
|
184
|
-
const CONVERT_EXT = new Set([
|
|
185
|
-
'html', 'htm', 'pdf', 'docx', 'xlsx', 'xls', 'xlsm', 'xlsb', 'csv', 'ods', 'odt',
|
|
186
|
-
]);
|
|
187
|
-
const DEFERRED_EXT = new Set(['pptx', 'ppt', 'odp', 'png', 'jpg', 'jpeg', 'webp', 'svg', 'gif']);
|
|
188
|
-
const MIME_TO_EXT = {
|
|
189
|
-
'text/html': 'html',
|
|
190
|
-
'text/csv': 'csv',
|
|
191
|
-
'text/plain': 'txt',
|
|
192
|
-
'text/markdown': 'md',
|
|
193
|
-
'application/pdf': 'pdf',
|
|
194
|
-
'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',
|
|
195
|
-
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'xlsx',
|
|
196
|
-
};
|
|
197
|
-
function extOf(name) {
|
|
198
|
-
const m = name.toLowerCase().match(/\.([a-z0-9]+)$/);
|
|
199
|
-
return m ? m[1] : '';
|
|
200
|
-
}
|
|
201
|
-
async function readSource(source) {
|
|
202
|
-
let bytes;
|
|
203
|
-
let filename;
|
|
204
|
-
let ext;
|
|
205
|
-
if (isUrl(source)) {
|
|
206
|
-
const res = await fetch(source);
|
|
207
|
-
if (!res.ok)
|
|
208
|
-
throw new Error(`fetch ${source}: HTTP ${res.status}`);
|
|
209
|
-
bytes = new Uint8Array(await res.arrayBuffer());
|
|
210
|
-
const u = new URL(source);
|
|
211
|
-
filename = path.basename(u.pathname) || u.hostname;
|
|
212
|
-
ext = extOf(u.pathname)
|
|
213
|
-
|| MIME_TO_EXT[(res.headers.get('content-type') || '').split(';')[0].trim()]
|
|
214
|
-
|| 'html';
|
|
215
|
-
}
|
|
216
|
-
else {
|
|
217
|
-
const abs = path.resolve(source);
|
|
218
|
-
if (!fs.existsSync(abs))
|
|
219
|
-
throw new Error(`file not found: ${abs}`);
|
|
220
|
-
bytes = new Uint8Array(fs.readFileSync(abs));
|
|
221
|
-
filename = path.basename(abs);
|
|
222
|
-
ext = extOf(abs);
|
|
223
|
-
}
|
|
224
|
-
const defaultName = filename.replace(/\.[a-z0-9]+$/i, '') || filename;
|
|
225
|
-
if (DEFERRED_EXT.has(ext)) {
|
|
226
|
-
throw new Error(`"${ext}" files aren't supported yet. Supported: text / markdown / code, and ` +
|
|
227
|
-
`${[...CONVERT_EXT].sort().join(', ')}. pptx and images are on the roadmap.`);
|
|
228
|
-
}
|
|
229
|
-
if (CONVERT_EXT.has(ext)) {
|
|
230
|
-
return {
|
|
231
|
-
mode: 'convert',
|
|
232
|
-
base64: Buffer.from(bytes).toString('base64'),
|
|
233
|
-
format: ext,
|
|
234
|
-
filename: extOf(filename) ? filename : `${filename}.${ext}`,
|
|
235
|
-
defaultName,
|
|
236
|
-
byteLength: bytes.length,
|
|
237
|
-
};
|
|
238
|
-
}
|
|
239
|
-
// Passthrough: markdown, plain text, source code, unknown/extensionless.
|
|
240
|
-
return {
|
|
241
|
-
mode: 'markdown',
|
|
242
|
-
text: new TextDecoder().decode(bytes),
|
|
243
|
-
format: ext || 'txt',
|
|
244
|
-
filename,
|
|
245
|
-
defaultName,
|
|
246
|
-
byteLength: bytes.length,
|
|
247
|
-
};
|
|
248
|
-
}
|
|
249
|
-
// -- upload ----------------------------------------------------------------
|
|
250
|
-
async function uploadCmd(args) {
|
|
251
|
-
const cfg = getConfig();
|
|
252
|
-
if (!cfg.apiKey)
|
|
253
|
-
abortNotConfigured();
|
|
254
|
-
const source = args[0];
|
|
255
|
-
if (!source) {
|
|
256
|
-
console.error('Usage: greprag corpus upload <file|url> (--enriched | --raw) [--name N] [--kind K]\n Formats: text / markdown / code pass through; html, pdf, docx, xlsx, csv convert server-side.');
|
|
257
|
-
process.exit(1);
|
|
258
|
-
}
|
|
259
|
-
const kindFlag = (getFlag(args, '--kind') || 'book');
|
|
260
|
-
if (!VALID_KINDS.includes(kindFlag)) {
|
|
261
|
-
console.error(`--kind must be one of: ${VALID_KINDS.join(', ')}`);
|
|
262
|
-
process.exit(1);
|
|
263
|
-
}
|
|
264
|
-
// Required, no default: the caller must declare the processing mode.
|
|
265
|
-
// Enrichment (per-node LLM vocabulary bridge) earns its cost only when
|
|
266
|
-
// there's a semantic gap between how someone asks and how the text is
|
|
267
|
-
// written — a judgment about the content that can't be inferred. Force it.
|
|
268
|
-
const wantsEnriched = args.includes('--enriched');
|
|
269
|
-
const wantsRaw = args.includes('--raw');
|
|
270
|
-
if (wantsEnriched === wantsRaw) { // neither, or both
|
|
271
|
-
console.error('Specify exactly one mode:\n' +
|
|
272
|
-
' --enriched per-node LLM vocabulary bridge — prose, voice, memory (query wording differs from the text)\n' +
|
|
273
|
-
' --raw chunk + lexical index only — docs, code, references (search terms already match the text)');
|
|
274
|
-
process.exit(1);
|
|
275
|
-
}
|
|
276
|
-
const enriched = wantsEnriched;
|
|
277
|
-
const loaded = await readSource(source);
|
|
278
|
-
const name = getFlag(args, '--name') || loaded.defaultName;
|
|
279
|
-
const sizeBit = loaded.mode === 'convert'
|
|
280
|
-
? `${loaded.format}, ${(loaded.byteLength / 1024).toFixed(1)} KB → converting server-side`
|
|
281
|
-
: `${loaded.text.trim().split(/\s+/).length.toLocaleString()} words`;
|
|
282
|
-
console.log(`Uploading "${name}" (${kindFlag}, ${enriched ? 'enriched' : 'raw'}, ${sizeBit})...`);
|
|
283
|
-
const create = await apiCall(`${cfg.apiUrl}/v1/stores`, cfg.apiKey, { name, kind: kindFlag, enriched, metadata: { source } });
|
|
284
|
-
if (!create.ok || !create.store)
|
|
285
|
-
throw new Error(create.error || 'create failed');
|
|
286
|
-
const store = create.store;
|
|
287
|
-
// Markdown/text passes through; convertible formats ship raw bytes for the
|
|
288
|
-
// Worker to turn into clean Markdown via env.AI.toMarkdown().
|
|
289
|
-
const ingestBody = loaded.mode === 'convert'
|
|
290
|
-
? { source: { data: loaded.base64, format: loaded.format, filename: loaded.filename } }
|
|
291
|
-
: { markdown: loaded.text };
|
|
292
|
-
const ingest = await apiCall(`${cfg.apiUrl}/v1/stores/${store.id}/nodes`, cfg.apiKey, ingestBody);
|
|
293
|
-
if (!ingest.ok)
|
|
294
|
-
throw new Error(ingest.error || 'ingest failed');
|
|
295
|
-
console.log(`\n Store ID: ${store.id}`);
|
|
296
|
-
console.log(` Name: ${store.name}`);
|
|
297
|
-
console.log(` Kind: ${store.kind}`);
|
|
298
|
-
const insBits = [`${ingest.inserted ?? 0} nodes`];
|
|
299
|
-
if (ingest.fresh)
|
|
300
|
-
insBits.push(`${ingest.fresh} fresh`);
|
|
301
|
-
if (ingest.preserved)
|
|
302
|
-
insBits.push(`${ingest.preserved} preserved`);
|
|
303
|
-
if (ingest.removed?.length)
|
|
304
|
-
insBits.push(`${ingest.removed.length} removed`);
|
|
305
|
-
console.log(` Ingested: ${insBits.join(', ')}`);
|
|
306
|
-
console.log(` Words: ${ingest.totalWords?.toLocaleString() ?? '?'}`);
|
|
307
|
-
if (ingest.enrichmentQueued) {
|
|
308
|
-
console.log(` Enrich: ${ingest.enrichmentQueued} queued (GR5 phrase-aware)`);
|
|
309
|
-
}
|
|
310
|
-
console.log(`\nTry: greprag corpus search ${JSON.stringify(store.name)} "<lexical query>"`);
|
|
311
|
-
}
|
|
312
|
-
// -- search ----------------------------------------------------------------
|
|
313
|
-
async function searchCmd(args) {
|
|
314
|
-
const cfg = getConfig();
|
|
315
|
-
if (!cfg.apiKey)
|
|
316
|
-
abortNotConfigured();
|
|
317
|
-
const all = args.includes('--all');
|
|
318
|
-
const storeFlags = getFlags(args, '--store');
|
|
319
|
-
const kind = getFlag(args, '--kind');
|
|
320
|
-
const multistore = all || storeFlags.length > 0 || !!kind;
|
|
321
|
-
const limit = parseInt(getFlag(args, '--limit') || (multistore ? '8' : '5'), 10);
|
|
322
|
-
const section = getFlag(args, '--section');
|
|
323
|
-
const shape = getFlag(args, '--shape');
|
|
324
|
-
const positionals = extractPositionals(args, SEARCH_VALUE_FLAGS);
|
|
325
|
-
// Multistore: --all (every tenant store) or one/more --store <ref>. The lone
|
|
326
|
-
// positional is the query (no positional store in this mode).
|
|
327
|
-
if (multistore) {
|
|
328
|
-
const queryText = positionals[0];
|
|
329
|
-
if (!queryText) {
|
|
330
|
-
console.error('Usage: greprag corpus search "<lexical query>" (--all | --store <ref> [--store <ref>]...) [--kind K] [--limit 8] [--section "<heading>"]');
|
|
331
|
-
process.exit(1);
|
|
332
|
-
}
|
|
333
|
-
let storeIds;
|
|
334
|
-
if (storeFlags.length > 0) {
|
|
335
|
-
storeIds = [];
|
|
336
|
-
for (const ref of storeFlags)
|
|
337
|
-
storeIds.push((await resolveStore(ref, cfg.apiUrl, cfg.apiKey)).id);
|
|
338
|
-
}
|
|
339
|
-
else if (kind) {
|
|
340
|
-
const list = await apiGet(`${cfg.apiUrl}/v1/stores?kind=${encodeURIComponent(kind)}`, cfg.apiKey);
|
|
341
|
-
storeIds = list.stores.map(s => s.id);
|
|
342
|
-
if (storeIds.length === 0) {
|
|
343
|
-
console.error(`No stores with kind="${kind}".`);
|
|
344
|
-
process.exit(1);
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
// else: storeIds undefined → search every store under the tenant.
|
|
348
|
-
await runMultiSearch(cfg, queryText, storeIds, limit, section);
|
|
349
|
-
return;
|
|
350
|
-
}
|
|
351
|
-
// Single-store: positional store + query.
|
|
352
|
-
const storeRef = positionals[0];
|
|
353
|
-
const queryText = positionals[1];
|
|
354
|
-
if (!storeRef || !queryText) {
|
|
355
|
-
console.error('Usage: greprag corpus search <storeIdOrName> "<lexical query>" [--limit 5] [--section "<heading>"] [--shape dialogue]\n or: greprag corpus search "<query>" --all | --store <ref>... (multistore)');
|
|
356
|
-
process.exit(1);
|
|
357
|
-
}
|
|
358
|
-
const store = await resolveStore(storeRef, cfg.apiUrl, cfg.apiKey);
|
|
359
|
-
const filters = {};
|
|
360
|
-
if (section)
|
|
361
|
-
filters.section = section;
|
|
362
|
-
if (shape)
|
|
363
|
-
filters.shape = shape;
|
|
364
|
-
const t0 = Date.now();
|
|
365
|
-
const result = await apiCall(`${cfg.apiUrl}/v1/stores/${store.id}/query`, cfg.apiKey, {
|
|
366
|
-
query: queryText, limit,
|
|
367
|
-
...(Object.keys(filters).length > 0 ? { filters } : {}),
|
|
368
|
-
});
|
|
369
|
-
if (!result.ok || !result.nodes)
|
|
370
|
-
throw new Error(result.error || 'query failed');
|
|
371
|
-
const ms = Date.now() - t0;
|
|
372
|
-
console.log(`\n${store.name} (${store.kind}, ${store.nodeCount} nodes) ← "${queryText}"`);
|
|
373
|
-
console.log(` ${result.nodes.length} hits in ${ms}ms (server ${result.latencyMs ?? '?'}ms)\n`);
|
|
374
|
-
for (const n of result.nodes) {
|
|
375
|
-
const heading = n.headingPath?.length ? ` · ${n.headingPath.join(' / ')}` : '';
|
|
376
|
-
const snippet = n.content.length > 280 ? n.content.slice(0, 277) + '...' : n.content;
|
|
377
|
-
console.log(` [${n.nodeId}] score=${n.score.toFixed(3)} pos=${n.position}${heading}`);
|
|
378
|
-
console.log(` ${snippet.replace(/\n/g, ' ')}\n`);
|
|
379
|
-
}
|
|
380
|
-
if (result.nodes[0]) {
|
|
381
|
-
console.log(`Walk: greprag corpus walk ${JSON.stringify(store.name)} ${result.nodes[0].nodeId}`);
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
/** Cross-store search via POST /v1/search. storeIds omitted = all tenant stores;
|
|
385
|
-
* RRF fuses across (store × query). Hits are labeled with their store name. */
|
|
386
|
-
async function runMultiSearch(cfg, queryText, storeIds, limit, section) {
|
|
387
|
-
const list = await apiGet(`${cfg.apiUrl}/v1/stores`, cfg.apiKey);
|
|
388
|
-
const nameById = new Map(list.stores.map(s => [s.id, s.name]));
|
|
389
|
-
const body = {
|
|
390
|
-
queries: [queryText], limit, adjacencyWindow: 3, adjacencyAlpha: 0.3,
|
|
391
|
-
};
|
|
392
|
-
if (storeIds)
|
|
393
|
-
body.storeIds = storeIds;
|
|
394
|
-
if (section)
|
|
395
|
-
body.filters = { section };
|
|
396
|
-
const t0 = Date.now();
|
|
397
|
-
const result = await apiCall(`${cfg.apiUrl}/v1/search`, cfg.apiKey, body);
|
|
398
|
-
if (!result.ok || !result.nodes)
|
|
399
|
-
throw new Error(result.error || 'search failed');
|
|
400
|
-
const ms = Date.now() - t0;
|
|
401
|
-
const scope = storeIds ? `${storeIds.length} store${storeIds.length === 1 ? '' : 's'}` : 'all stores';
|
|
402
|
-
console.log(`\nMultistore search (${scope}) ← "${queryText}"`);
|
|
403
|
-
console.log(` ${result.nodes.length} hits in ${ms}ms\n`);
|
|
404
|
-
for (const n of result.nodes) {
|
|
405
|
-
const store = nameById.get(n.storeId) || n.storeId.slice(0, 8);
|
|
406
|
-
const heading = n.headingPath?.length ? ` · ${n.headingPath.join(' / ')}` : '';
|
|
407
|
-
const snippet = n.content.length > 240 ? n.content.slice(0, 237) + '...' : n.content;
|
|
408
|
-
console.log(` [${store} · ${n.nodeId}] score=${n.score.toFixed(3)}${heading}`);
|
|
409
|
-
console.log(` ${snippet.replace(/\n/g, ' ')}\n`);
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
async function walkCmd(args) {
|
|
413
|
-
const cfg = getConfig();
|
|
414
|
-
if (!cfg.apiKey)
|
|
415
|
-
abortNotConfigured();
|
|
416
|
-
const storeRef = args[0];
|
|
417
|
-
const nodeId = args[1];
|
|
418
|
-
if (!storeRef || !nodeId) {
|
|
419
|
-
console.error('Usage: greprag corpus walk <storeIdOrName> <nodeId> [--before 2 --after 2]');
|
|
420
|
-
process.exit(1);
|
|
421
|
-
}
|
|
422
|
-
const before = parseInt(getFlag(args, '--before') || '2', 10);
|
|
423
|
-
const after = parseInt(getFlag(args, '--after') || '2', 10);
|
|
424
|
-
const store = await resolveStore(storeRef, cfg.apiUrl, cfg.apiKey);
|
|
425
|
-
// Step 1: fetch the anchor node to learn its position.
|
|
426
|
-
const anchorRes = await apiGet(`${cfg.apiUrl}/v1/stores/${store.id}/by-node-id/${nodeId}`, cfg.apiKey);
|
|
427
|
-
if (!anchorRes.ok || !anchorRes.node)
|
|
428
|
-
throw new Error(anchorRes.error || 'node not found');
|
|
429
|
-
const anchor = anchorRes.node;
|
|
430
|
-
// Step 2: expand around its position.
|
|
431
|
-
const win = await apiGet(`${cfg.apiUrl}/v1/stores/${store.id}/expand?center=${anchor.position}&before=${before}&after=${after}`, cfg.apiKey);
|
|
432
|
-
if (!win.ok || !win.nodes)
|
|
433
|
-
throw new Error(win.error || 'expand failed');
|
|
434
|
-
console.log(`\n${store.name} · walking ${nodeId} (pos ${anchor.position}, ±${before}/${after}):\n`);
|
|
435
|
-
for (const n of win.nodes) {
|
|
436
|
-
const isAnchor = n.nodeId === nodeId;
|
|
437
|
-
const marker = isAnchor ? '★' : ' ';
|
|
438
|
-
const heading = n.headingPath?.length ? ` · ${n.headingPath.join(' / ')}` : '';
|
|
439
|
-
const snippet = n.content.length > 320 ? n.content.slice(0, 317) + '...' : n.content;
|
|
440
|
-
console.log(` ${marker} [${n.nodeId}] pos=${n.position}${heading}`);
|
|
441
|
-
console.log(` ${snippet.replace(/\n/g, ' ')}\n`);
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
// -- section ---------------------------------------------------------------
|
|
445
|
-
async function sectionCmd(args) {
|
|
446
|
-
const cfg = getConfig();
|
|
447
|
-
if (!cfg.apiKey)
|
|
448
|
-
abortNotConfigured();
|
|
449
|
-
const storeRef = args[0];
|
|
450
|
-
const headingPath = args[1];
|
|
451
|
-
if (!storeRef || !headingPath) {
|
|
452
|
-
console.error('Usage: greprag corpus section <storeIdOrName> "<heading>"\n e.g. greprag corpus section "Scientific Advertising" "Chapter 7"\n Forgiving match: any depth, case-/dash-insensitive, leaf prefix.');
|
|
453
|
-
process.exit(1);
|
|
454
|
-
}
|
|
455
|
-
const store = await resolveStore(storeRef, cfg.apiUrl, cfg.apiKey);
|
|
456
|
-
const url = `${cfg.apiUrl}/v1/stores/${store.id}/section?path=${encodeURIComponent(headingPath)}`;
|
|
457
|
-
const res = await apiGet(url, cfg.apiKey);
|
|
458
|
-
if (!res.ok || !res.nodes)
|
|
459
|
-
throw new Error(res.error || 'section failed');
|
|
460
|
-
console.log(`\n${store.name} · section "${headingPath}" — ${res.nodes.length} node${res.nodes.length === 1 ? '' : 's'}\n`);
|
|
461
|
-
for (const n of res.nodes) {
|
|
462
|
-
const heading = n.headingPath?.length ? ` · ${n.headingPath.join(' / ')}` : '';
|
|
463
|
-
const snippet = n.content.length > 200 ? n.content.slice(0, 197) + '...' : n.content;
|
|
464
|
-
console.log(` [${n.nodeId}] pos=${n.position}${heading}`);
|
|
465
|
-
console.log(` ${snippet.replace(/\n/g, ' ')}\n`);
|
|
466
|
-
}
|
|
467
|
-
if (res.nodes.length === 0) {
|
|
468
|
-
console.log('No nodes under that heading. Check a hit\'s headingPath from `corpus search`, or broaden the heading.');
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
// -- list ------------------------------------------------------------------
|
|
472
|
-
async function listCmd(args) {
|
|
473
|
-
const cfg = getConfig();
|
|
474
|
-
if (!cfg.apiKey)
|
|
475
|
-
abortNotConfigured();
|
|
476
|
-
const kindFlag = getFlag(args, '--kind');
|
|
477
|
-
const url = `${cfg.apiUrl}/v1/stores${kindFlag ? `?kind=${encodeURIComponent(kindFlag)}` : ''}`;
|
|
478
|
-
const result = await apiGet(url, cfg.apiKey);
|
|
479
|
-
if (result.stores.length === 0) {
|
|
480
|
-
console.log(kindFlag ? `No stores with kind="${kindFlag}".` : 'No stores yet.');
|
|
481
|
-
console.log('Upload one: greprag corpus upload <file|url> --name "<name>"');
|
|
482
|
-
return;
|
|
483
|
-
}
|
|
484
|
-
const sorted = [...result.stores].sort((a, b) => b.createdAt.localeCompare(a.createdAt));
|
|
485
|
-
console.log(`\n${sorted.length} store${sorted.length === 1 ? '' : 's'}:\n`);
|
|
486
|
-
for (const s of sorted) {
|
|
487
|
-
const created = new Date(s.createdAt).toISOString().slice(0, 10);
|
|
488
|
-
console.log(` ${s.id} ${s.kind.padEnd(8)} ${s.nodeCount.toString().padStart(6)} nodes ${s.wordCount.toString().padStart(8)} words ${created} ${s.name}`);
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
// -- status ----------------------------------------------------------------
|
|
492
|
-
async function statusCmd(args) {
|
|
493
|
-
const cfg = getConfig();
|
|
494
|
-
if (!cfg.apiKey)
|
|
495
|
-
abortNotConfigured();
|
|
496
|
-
const ref = args[0];
|
|
497
|
-
if (!ref) {
|
|
498
|
-
console.error('Usage: greprag corpus status <storeIdOrName>');
|
|
499
|
-
process.exit(1);
|
|
500
|
-
}
|
|
501
|
-
const store = await resolveStore(ref, cfg.apiUrl, cfg.apiKey);
|
|
502
|
-
const res = await apiGet(`${cfg.apiUrl}/v1/stores/${store.id}/enrichment`, cfg.apiKey);
|
|
503
|
-
if (!res.ok || !res.status)
|
|
504
|
-
throw new Error(res.error || 'status failed');
|
|
505
|
-
const s = res.status;
|
|
506
|
-
const pct = s.total > 0 ? Math.round((s.completed / s.total) * 100) : 0;
|
|
507
|
-
const barWidth = 30;
|
|
508
|
-
const filled = Math.round((pct / 100) * barWidth);
|
|
509
|
-
const bar = '█'.repeat(filled) + '░'.repeat(barWidth - filled);
|
|
510
|
-
console.log(`\n${store.name} · ${store.nodeCount} nodes · ${store.kind}`);
|
|
511
|
-
console.log(`\n Enrichment: [${bar}] ${pct}%`);
|
|
512
|
-
console.log(` Completed: ${s.completed.toLocaleString().padStart(6)} / ${s.total.toLocaleString()}`);
|
|
513
|
-
if (s.pending > 0)
|
|
514
|
-
console.log(` Pending: ${s.pending.toLocaleString().padStart(6)}`);
|
|
515
|
-
if (s.in_progress > 0)
|
|
516
|
-
console.log(` In progress: ${s.in_progress.toLocaleString().padStart(6)}`);
|
|
517
|
-
if (s.failed > 0)
|
|
518
|
-
console.log(` Failed: ${s.failed.toLocaleString().padStart(6)} (after ${5} attempts — won't retry)`);
|
|
519
|
-
if (res.enrichmentNotifiedAt) {
|
|
520
|
-
console.log(` Last notify: ${res.enrichmentNotifiedAt}`);
|
|
521
|
-
}
|
|
522
|
-
console.log('');
|
|
523
|
-
if (s.pending > 0 || s.in_progress > 0) {
|
|
524
|
-
console.log('Drainer runs every 2 minutes. Re-run this command to watch progress.\n');
|
|
525
|
-
}
|
|
526
|
-
else if (s.completed > 0) {
|
|
527
|
-
console.log(`Ready. Try: greprag corpus search ${JSON.stringify(store.name)} "<your question>"\n`);
|
|
528
|
-
}
|
|
529
|
-
}
|
|
530
|
-
// -- delete ----------------------------------------------------------------
|
|
531
|
-
async function deleteCmd(args) {
|
|
532
|
-
const cfg = getConfig();
|
|
533
|
-
if (!cfg.apiKey)
|
|
534
|
-
abortNotConfigured();
|
|
535
|
-
const ref = args[0];
|
|
536
|
-
if (!ref) {
|
|
537
|
-
console.error('Usage: greprag corpus delete <storeIdOrName>');
|
|
538
|
-
process.exit(1);
|
|
539
|
-
}
|
|
540
|
-
const store = await resolveStore(ref, cfg.apiUrl, cfg.apiKey);
|
|
541
|
-
if (!args.includes('--yes') && !args.includes('-y')) {
|
|
542
|
-
console.log(`About to delete: ${store.name} (${store.id}, ${store.nodeCount} nodes)`);
|
|
543
|
-
console.log('Re-run with --yes to confirm.');
|
|
544
|
-
return;
|
|
545
|
-
}
|
|
546
|
-
const result = await apiDelete(`${cfg.apiUrl}/v1/stores/${store.id}`, cfg.apiKey);
|
|
547
|
-
if (!result.ok)
|
|
548
|
-
throw new Error(result.error || 'delete failed');
|
|
549
|
-
console.log(`Deleted ${store.name} (${store.id}).`);
|
|
550
|
-
}
|
|
551
|
-
// -- Dispatch --------------------------------------------------------------
|
|
552
|
-
const SUB_HELP = `
|
|
553
|
-
greprag corpus — upload, search, and walk text corpora.
|
|
554
|
-
|
|
555
|
-
Subcommands:
|
|
556
|
-
upload <file|url> (--enriched | --raw) Create a store and ingest a source.
|
|
557
|
-
[--name N] [--kind K] Text/markdown/code pass through; html,
|
|
558
|
-
pdf, docx, xlsx, csv convert server-side
|
|
559
|
-
to clean markdown. Mode is REQUIRED:
|
|
560
|
-
--enriched (per-node LLM vocabulary
|
|
561
|
-
bridge — prose/voice)
|
|
562
|
-
or --raw (lexical index only —
|
|
563
|
-
docs/code). K defaults to 'book';
|
|
564
|
-
N to the file/URL basename.
|
|
565
|
-
search <store> "<intent>" Single-store search. <store> is a
|
|
566
|
-
[--limit 5] [--section "<h>"] [--shape S] UUID or store name.
|
|
567
|
-
search "<intent>" (--all | --store <ref>...) Multistore search (RRF-fused).
|
|
568
|
-
[--kind K] [--limit 8] [--section "<h>"]
|
|
569
|
-
--all = every store under the tenant;
|
|
570
|
-
--store repeatable; --kind filters to
|
|
571
|
-
one kind. Hits are labeled by store.
|
|
572
|
-
section <store> "<heading>" Every node under a heading (forgiving
|
|
573
|
-
match: any depth, dash/case-insensitive).
|
|
574
|
-
walk <store> <nodeId> [--before 2 --after 2]
|
|
575
|
-
Show a node and its neighbors.
|
|
576
|
-
status <store> Show write-side enrichment progress
|
|
577
|
-
(per-node vocabulary bridge).
|
|
578
|
-
list [--kind K] List stores under this tenant.
|
|
579
|
-
delete <store> [--yes] Delete a store. --yes to confirm.
|
|
580
|
-
|
|
581
|
-
Examples:
|
|
582
|
-
greprag corpus upload ./meditations.txt --enriched --name "Meditations"
|
|
583
|
-
greprag corpus upload https://code.claude.com/docs/llms-full.txt --raw --name "claude-code-docs"
|
|
584
|
-
greprag corpus search Meditations "how should I respond to insult"
|
|
585
|
-
greprag corpus search "discipline OR restraint" --all --limit 10
|
|
586
|
-
greprag corpus search "voice" --store Meditations --store travis-voice-corpus
|
|
587
|
-
greprag corpus search "stoicism" --kind book
|
|
588
|
-
greprag corpus section Meditations "Book VII"
|
|
589
|
-
greprag corpus walk Meditations 7f2a91c4
|
|
590
|
-
greprag corpus status Meditations
|
|
591
|
-
greprag corpus list --kind book
|
|
592
|
-
greprag corpus delete Meditations --yes
|
|
593
|
-
`.trim();
|
|
594
|
-
async function runCorpus(args) {
|
|
595
|
-
const sub = args[0];
|
|
596
|
-
const rest = args.slice(1);
|
|
597
|
-
switch (sub) {
|
|
598
|
-
case 'upload': return uploadCmd(rest);
|
|
599
|
-
case 'search': return searchCmd(rest);
|
|
600
|
-
case 'walk': return walkCmd(rest);
|
|
601
|
-
case 'section': return sectionCmd(rest);
|
|
602
|
-
case 'status': return statusCmd(rest);
|
|
603
|
-
case 'list': return listCmd(rest);
|
|
604
|
-
case 'delete': return deleteCmd(rest);
|
|
605
|
-
case undefined:
|
|
606
|
-
case 'help':
|
|
607
|
-
case '--help':
|
|
608
|
-
case '-h':
|
|
609
|
-
console.log(SUB_HELP);
|
|
610
|
-
return;
|
|
611
|
-
default:
|
|
612
|
-
console.error(`Unknown subcommand: ${sub}\n`);
|
|
613
|
-
console.log(SUB_HELP);
|
|
614
|
-
process.exit(1);
|
|
615
|
-
}
|
|
616
|
-
}
|
|
617
|
-
//# sourceMappingURL=corpus.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"corpus.js","sourceRoot":"","sources":["../../src/commands/corpus.ts"],"names":[],"mappings":"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"}
|