greprag 0.7.3 → 0.8.2
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.d.ts +18 -0
- package/dist/commands/corpus.js +431 -0
- package/dist/commands/corpus.js.map +1 -0
- package/dist/commands/discover.d.ts +43 -0
- package/dist/commands/discover.js +154 -0
- package/dist/commands/discover.js.map +1 -0
- package/dist/commands/doctor.js +2 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/inbox-retract.d.ts +18 -0
- package/dist/commands/inbox-retract.js +39 -0
- package/dist/commands/inbox-retract.js.map +1 -0
- package/dist/commands/inbox-watch.d.ts +37 -0
- package/dist/commands/inbox-watch.js +287 -0
- package/dist/commands/inbox-watch.js.map +1 -0
- package/dist/index.js +94 -9
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/skill/SKILL.md +152 -3
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** greprag corpus — upload, search, and walk arbitrary text corpora.
|
|
2
|
+
*
|
|
3
|
+
* A corpus is just a `stores` row with `kind != 'memory'`. Books, codebases,
|
|
4
|
+
* reference docs, voice samples — all live in the same nodes table, queried
|
|
5
|
+
* through the same five retrieval modes (anchor / crawl / shape / section /
|
|
6
|
+
* search). This command is the thin user-facing surface over /v1/stores/*.
|
|
7
|
+
*
|
|
8
|
+
* Subcommands:
|
|
9
|
+
* upload <file|url> [--name N] [--kind K]
|
|
10
|
+
* search <store> "<intent>" [--limit 5]
|
|
11
|
+
* walk <store> <nodeId> [--before 2 --after 2]
|
|
12
|
+
* list [--kind K]
|
|
13
|
+
* delete <store>
|
|
14
|
+
*
|
|
15
|
+
* <store> accepts either a store UUID or its name. Names are resolved
|
|
16
|
+
* case-insensitively against the tenant's list of stores; ambiguous
|
|
17
|
+
* names are rejected with a hint to use the UUID. */
|
|
18
|
+
export declare function runCorpus(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,431 @@
|
|
|
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
|
+
const VALID_ENRICHMENT_STYLES = ['book', 'codebase', 'transcript', 'reference', 'generic'];
|
|
60
|
+
// -- Config + HTTP --------------------------------------------------------
|
|
61
|
+
function loadEnvFile(filePath) {
|
|
62
|
+
try {
|
|
63
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
64
|
+
for (const line of content.split('\n')) {
|
|
65
|
+
const trimmed = line.trim();
|
|
66
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
67
|
+
continue;
|
|
68
|
+
const eqIdx = trimmed.indexOf('=');
|
|
69
|
+
if (eqIdx < 1)
|
|
70
|
+
continue;
|
|
71
|
+
const key = trimmed.slice(0, eqIdx).trim();
|
|
72
|
+
let value = trimmed.slice(eqIdx + 1).trim();
|
|
73
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
74
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
75
|
+
value = value.slice(1, -1);
|
|
76
|
+
}
|
|
77
|
+
if (!process.env[key])
|
|
78
|
+
process.env[key] = value;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch { /* file missing — fine */ }
|
|
82
|
+
}
|
|
83
|
+
function getConfig() {
|
|
84
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE || '';
|
|
85
|
+
if (homeDir)
|
|
86
|
+
loadEnvFile(path.join(homeDir, '.greprag', '.env'));
|
|
87
|
+
if (!process.env.GREPRAG_API_KEY)
|
|
88
|
+
loadEnvFile(path.join(process.cwd(), '.env'));
|
|
89
|
+
return {
|
|
90
|
+
apiUrl: process.env.GREPRAG_API_URL || API_URL_DEFAULT,
|
|
91
|
+
apiKey: process.env.GREPRAG_API_KEY || '',
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
async function apiCall(url, apiKey, body) {
|
|
95
|
+
const res = await fetch(url, {
|
|
96
|
+
method: 'POST',
|
|
97
|
+
headers: {
|
|
98
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
99
|
+
'Content-Type': 'application/json',
|
|
100
|
+
},
|
|
101
|
+
body: JSON.stringify(body),
|
|
102
|
+
});
|
|
103
|
+
if (!res.ok)
|
|
104
|
+
throw new Error(`API ${res.status}: ${await res.text()}`);
|
|
105
|
+
return res.json();
|
|
106
|
+
}
|
|
107
|
+
async function apiGet(url, apiKey) {
|
|
108
|
+
const res = await fetch(url, {
|
|
109
|
+
headers: { 'Authorization': `Bearer ${apiKey}` },
|
|
110
|
+
});
|
|
111
|
+
if (!res.ok)
|
|
112
|
+
throw new Error(`API ${res.status}: ${await res.text()}`);
|
|
113
|
+
return res.json();
|
|
114
|
+
}
|
|
115
|
+
async function apiDelete(url, apiKey) {
|
|
116
|
+
const res = await fetch(url, {
|
|
117
|
+
method: 'DELETE',
|
|
118
|
+
headers: { 'Authorization': `Bearer ${apiKey}` },
|
|
119
|
+
});
|
|
120
|
+
if (!res.ok)
|
|
121
|
+
throw new Error(`API ${res.status}: ${await res.text()}`);
|
|
122
|
+
return res.json();
|
|
123
|
+
}
|
|
124
|
+
// -- Helpers ---------------------------------------------------------------
|
|
125
|
+
function getFlag(args, flag) {
|
|
126
|
+
const idx = args.indexOf(flag);
|
|
127
|
+
if (idx === -1 || idx + 1 >= args.length)
|
|
128
|
+
return undefined;
|
|
129
|
+
return args[idx + 1];
|
|
130
|
+
}
|
|
131
|
+
function abortNotConfigured() {
|
|
132
|
+
console.error('Not configured. Run: greprag init');
|
|
133
|
+
process.exit(1);
|
|
134
|
+
}
|
|
135
|
+
/** Resolve a user-supplied store reference to a store row. Accepts a UUID
|
|
136
|
+
* or a case-insensitive name. Ambiguous names fail loud. */
|
|
137
|
+
async function resolveStore(ref, apiUrl, apiKey) {
|
|
138
|
+
if (UUID_RE.test(ref)) {
|
|
139
|
+
const r = await apiGet(`${apiUrl}/v1/stores/${ref}`, apiKey);
|
|
140
|
+
if (!r.ok || !r.store)
|
|
141
|
+
throw new Error(r.error || 'store not found');
|
|
142
|
+
return r.store;
|
|
143
|
+
}
|
|
144
|
+
const list = await apiGet(`${apiUrl}/v1/stores`, apiKey);
|
|
145
|
+
const needle = ref.trim().toLowerCase();
|
|
146
|
+
const matches = list.stores.filter(s => s.name.toLowerCase() === needle);
|
|
147
|
+
if (matches.length === 0) {
|
|
148
|
+
throw new Error(`no store named "${ref}". Run 'greprag corpus list' to see what's available.`);
|
|
149
|
+
}
|
|
150
|
+
if (matches.length > 1) {
|
|
151
|
+
const ids = matches.map(m => `${m.id} (${m.kind})`).join(', ');
|
|
152
|
+
throw new Error(`name "${ref}" is ambiguous — multiple stores match. Use a UUID instead: ${ids}`);
|
|
153
|
+
}
|
|
154
|
+
return matches[0];
|
|
155
|
+
}
|
|
156
|
+
function isUrl(s) {
|
|
157
|
+
return /^https?:\/\//i.test(s);
|
|
158
|
+
}
|
|
159
|
+
async function readSource(source) {
|
|
160
|
+
if (isUrl(source)) {
|
|
161
|
+
const res = await fetch(source);
|
|
162
|
+
if (!res.ok)
|
|
163
|
+
throw new Error(`fetch ${source}: HTTP ${res.status}`);
|
|
164
|
+
const text = await res.text();
|
|
165
|
+
const u = new URL(source);
|
|
166
|
+
const base = path.basename(u.pathname).replace(/\.[a-z0-9]+$/i, '') || u.hostname;
|
|
167
|
+
return { text, defaultName: base };
|
|
168
|
+
}
|
|
169
|
+
const abs = path.resolve(source);
|
|
170
|
+
if (!fs.existsSync(abs))
|
|
171
|
+
throw new Error(`file not found: ${abs}`);
|
|
172
|
+
const text = fs.readFileSync(abs, 'utf-8');
|
|
173
|
+
const base = path.basename(abs).replace(/\.[a-z0-9]+$/i, '');
|
|
174
|
+
return { text, defaultName: base };
|
|
175
|
+
}
|
|
176
|
+
// -- upload ----------------------------------------------------------------
|
|
177
|
+
async function uploadCmd(args) {
|
|
178
|
+
const cfg = getConfig();
|
|
179
|
+
if (!cfg.apiKey)
|
|
180
|
+
abortNotConfigured();
|
|
181
|
+
const source = args[0];
|
|
182
|
+
if (!source) {
|
|
183
|
+
console.error('Usage: greprag corpus upload <file|url> [--name N] [--kind K] [--enrichment-style S]');
|
|
184
|
+
process.exit(1);
|
|
185
|
+
}
|
|
186
|
+
const kindFlag = (getFlag(args, '--kind') || 'book');
|
|
187
|
+
if (!VALID_KINDS.includes(kindFlag)) {
|
|
188
|
+
console.error(`--kind must be one of: ${VALID_KINDS.join(', ')}`);
|
|
189
|
+
process.exit(1);
|
|
190
|
+
}
|
|
191
|
+
const styleFlag = getFlag(args, '--enrichment-style');
|
|
192
|
+
if (styleFlag && !VALID_ENRICHMENT_STYLES.includes(styleFlag)) {
|
|
193
|
+
console.error(`--enrichment-style must be one of: ${VALID_ENRICHMENT_STYLES.join(', ')}`);
|
|
194
|
+
process.exit(1);
|
|
195
|
+
}
|
|
196
|
+
const { text, defaultName } = await readSource(source);
|
|
197
|
+
const name = getFlag(args, '--name') || defaultName;
|
|
198
|
+
const words = text.trim().split(/\s+/).length;
|
|
199
|
+
const styleNote = styleFlag ? ` style=${styleFlag}` : '';
|
|
200
|
+
console.log(`Uploading "${name}" (${kindFlag}${styleNote}, ${words.toLocaleString()} words)...`);
|
|
201
|
+
const create = await apiCall(`${cfg.apiUrl}/v1/stores`, cfg.apiKey, {
|
|
202
|
+
name, kind: kindFlag, metadata: { source },
|
|
203
|
+
...(styleFlag ? { enrichmentStyle: styleFlag } : {}),
|
|
204
|
+
});
|
|
205
|
+
if (!create.ok || !create.store)
|
|
206
|
+
throw new Error(create.error || 'create failed');
|
|
207
|
+
const store = create.store;
|
|
208
|
+
const ingest = await apiCall(`${cfg.apiUrl}/v1/stores/${store.id}/nodes`, cfg.apiKey, {
|
|
209
|
+
markdown: text,
|
|
210
|
+
...(styleFlag ? { enrichmentStyle: styleFlag } : {}),
|
|
211
|
+
});
|
|
212
|
+
if (!ingest.ok)
|
|
213
|
+
throw new Error(ingest.error || 'ingest failed');
|
|
214
|
+
console.log(`\n Store ID: ${store.id}`);
|
|
215
|
+
console.log(` Name: ${store.name}`);
|
|
216
|
+
console.log(` Kind: ${store.kind}`);
|
|
217
|
+
const insBits = [`${ingest.inserted ?? 0} nodes`];
|
|
218
|
+
if (ingest.fresh)
|
|
219
|
+
insBits.push(`${ingest.fresh} fresh`);
|
|
220
|
+
if (ingest.preserved)
|
|
221
|
+
insBits.push(`${ingest.preserved} preserved`);
|
|
222
|
+
if (ingest.removed?.length)
|
|
223
|
+
insBits.push(`${ingest.removed.length} removed`);
|
|
224
|
+
console.log(` Ingested: ${insBits.join(', ')}`);
|
|
225
|
+
console.log(` Words: ${ingest.totalWords?.toLocaleString() ?? '?'}`);
|
|
226
|
+
if (ingest.enrichmentQueued) {
|
|
227
|
+
console.log(` Enrich: ${ingest.enrichmentQueued} queued (style: ${ingest.enrichmentStyle || 'auto'})`);
|
|
228
|
+
}
|
|
229
|
+
console.log(`\nTry: greprag corpus search ${JSON.stringify(store.name)} "<lexical query>"`);
|
|
230
|
+
}
|
|
231
|
+
// -- search ----------------------------------------------------------------
|
|
232
|
+
async function searchCmd(args) {
|
|
233
|
+
const cfg = getConfig();
|
|
234
|
+
if (!cfg.apiKey)
|
|
235
|
+
abortNotConfigured();
|
|
236
|
+
const storeRef = args[0];
|
|
237
|
+
const queryText = args[1];
|
|
238
|
+
if (!storeRef || !queryText) {
|
|
239
|
+
console.error('Usage: greprag corpus search <storeIdOrName> "<lexical query>" [--limit 5] [--section "Book VII"] [--shape dialogue]');
|
|
240
|
+
process.exit(1);
|
|
241
|
+
}
|
|
242
|
+
const limit = parseInt(getFlag(args, '--limit') || '5', 10);
|
|
243
|
+
const section = getFlag(args, '--section');
|
|
244
|
+
const shape = getFlag(args, '--shape');
|
|
245
|
+
const store = await resolveStore(storeRef, cfg.apiUrl, cfg.apiKey);
|
|
246
|
+
const filters = {};
|
|
247
|
+
if (section)
|
|
248
|
+
filters.section = section;
|
|
249
|
+
if (shape)
|
|
250
|
+
filters.shape = shape;
|
|
251
|
+
const t0 = Date.now();
|
|
252
|
+
const result = await apiCall(`${cfg.apiUrl}/v1/stores/${store.id}/query`, cfg.apiKey, {
|
|
253
|
+
query: queryText, limit,
|
|
254
|
+
...(Object.keys(filters).length > 0 ? { filters } : {}),
|
|
255
|
+
});
|
|
256
|
+
if (!result.ok || !result.nodes)
|
|
257
|
+
throw new Error(result.error || 'query failed');
|
|
258
|
+
const ms = Date.now() - t0;
|
|
259
|
+
console.log(`\n${store.name} (${store.kind}, ${store.nodeCount} nodes) ← "${queryText}"`);
|
|
260
|
+
console.log(` ${result.nodes.length} hits in ${ms}ms (server ${result.latencyMs ?? '?'}ms)\n`);
|
|
261
|
+
for (const n of result.nodes) {
|
|
262
|
+
const heading = n.headingPath?.length ? ` · ${n.headingPath.join(' / ')}` : '';
|
|
263
|
+
const snippet = n.content.length > 280 ? n.content.slice(0, 277) + '...' : n.content;
|
|
264
|
+
console.log(` [${n.nodeId}] score=${n.score.toFixed(3)} pos=${n.position}${heading}`);
|
|
265
|
+
console.log(` ${snippet.replace(/\n/g, ' ')}\n`);
|
|
266
|
+
}
|
|
267
|
+
if (result.nodes[0]) {
|
|
268
|
+
console.log(`Walk: greprag corpus walk ${JSON.stringify(store.name)} ${result.nodes[0].nodeId}`);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
async function walkCmd(args) {
|
|
272
|
+
const cfg = getConfig();
|
|
273
|
+
if (!cfg.apiKey)
|
|
274
|
+
abortNotConfigured();
|
|
275
|
+
const storeRef = args[0];
|
|
276
|
+
const nodeId = args[1];
|
|
277
|
+
if (!storeRef || !nodeId) {
|
|
278
|
+
console.error('Usage: greprag corpus walk <storeIdOrName> <nodeId> [--before 2 --after 2]');
|
|
279
|
+
process.exit(1);
|
|
280
|
+
}
|
|
281
|
+
const before = parseInt(getFlag(args, '--before') || '2', 10);
|
|
282
|
+
const after = parseInt(getFlag(args, '--after') || '2', 10);
|
|
283
|
+
const store = await resolveStore(storeRef, cfg.apiUrl, cfg.apiKey);
|
|
284
|
+
// Step 1: fetch the anchor node to learn its position.
|
|
285
|
+
const anchorRes = await apiGet(`${cfg.apiUrl}/v1/stores/${store.id}/by-node-id/${nodeId}`, cfg.apiKey);
|
|
286
|
+
if (!anchorRes.ok || !anchorRes.node)
|
|
287
|
+
throw new Error(anchorRes.error || 'node not found');
|
|
288
|
+
const anchor = anchorRes.node;
|
|
289
|
+
// Step 2: expand around its position.
|
|
290
|
+
const win = await apiGet(`${cfg.apiUrl}/v1/stores/${store.id}/expand?center=${anchor.position}&before=${before}&after=${after}`, cfg.apiKey);
|
|
291
|
+
if (!win.ok || !win.nodes)
|
|
292
|
+
throw new Error(win.error || 'expand failed');
|
|
293
|
+
console.log(`\n${store.name} · walking ${nodeId} (pos ${anchor.position}, ±${before}/${after}):\n`);
|
|
294
|
+
for (const n of win.nodes) {
|
|
295
|
+
const isAnchor = n.nodeId === nodeId;
|
|
296
|
+
const marker = isAnchor ? '★' : ' ';
|
|
297
|
+
const heading = n.headingPath?.length ? ` · ${n.headingPath.join(' / ')}` : '';
|
|
298
|
+
const snippet = n.content.length > 320 ? n.content.slice(0, 317) + '...' : n.content;
|
|
299
|
+
console.log(` ${marker} [${n.nodeId}] pos=${n.position}${heading}`);
|
|
300
|
+
console.log(` ${snippet.replace(/\n/g, ' ')}\n`);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// -- list ------------------------------------------------------------------
|
|
304
|
+
async function listCmd(args) {
|
|
305
|
+
const cfg = getConfig();
|
|
306
|
+
if (!cfg.apiKey)
|
|
307
|
+
abortNotConfigured();
|
|
308
|
+
const kindFlag = getFlag(args, '--kind');
|
|
309
|
+
const url = `${cfg.apiUrl}/v1/stores${kindFlag ? `?kind=${encodeURIComponent(kindFlag)}` : ''}`;
|
|
310
|
+
const result = await apiGet(url, cfg.apiKey);
|
|
311
|
+
if (result.stores.length === 0) {
|
|
312
|
+
console.log(kindFlag ? `No stores with kind="${kindFlag}".` : 'No stores yet.');
|
|
313
|
+
console.log('Upload one: greprag corpus upload <file|url> --name "<name>"');
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
const sorted = [...result.stores].sort((a, b) => b.createdAt.localeCompare(a.createdAt));
|
|
317
|
+
console.log(`\n${sorted.length} store${sorted.length === 1 ? '' : 's'}:\n`);
|
|
318
|
+
for (const s of sorted) {
|
|
319
|
+
const created = new Date(s.createdAt).toISOString().slice(0, 10);
|
|
320
|
+
console.log(` ${s.id} ${s.kind.padEnd(8)} ${s.nodeCount.toString().padStart(6)} nodes ${s.wordCount.toString().padStart(8)} words ${created} ${s.name}`);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
// -- status ----------------------------------------------------------------
|
|
324
|
+
async function statusCmd(args) {
|
|
325
|
+
const cfg = getConfig();
|
|
326
|
+
if (!cfg.apiKey)
|
|
327
|
+
abortNotConfigured();
|
|
328
|
+
const ref = args[0];
|
|
329
|
+
if (!ref) {
|
|
330
|
+
console.error('Usage: greprag corpus status <storeIdOrName>');
|
|
331
|
+
process.exit(1);
|
|
332
|
+
}
|
|
333
|
+
const store = await resolveStore(ref, cfg.apiUrl, cfg.apiKey);
|
|
334
|
+
const res = await apiGet(`${cfg.apiUrl}/v1/stores/${store.id}/enrichment`, cfg.apiKey);
|
|
335
|
+
if (!res.ok || !res.status)
|
|
336
|
+
throw new Error(res.error || 'status failed');
|
|
337
|
+
const s = res.status;
|
|
338
|
+
const pct = s.total > 0 ? Math.round((s.completed / s.total) * 100) : 0;
|
|
339
|
+
const barWidth = 30;
|
|
340
|
+
const filled = Math.round((pct / 100) * barWidth);
|
|
341
|
+
const bar = '█'.repeat(filled) + '░'.repeat(barWidth - filled);
|
|
342
|
+
console.log(`\n${store.name} · ${store.nodeCount} nodes · ${store.kind}`);
|
|
343
|
+
console.log(`\n Enrichment: [${bar}] ${pct}%`);
|
|
344
|
+
console.log(` Completed: ${s.completed.toLocaleString().padStart(6)} / ${s.total.toLocaleString()}`);
|
|
345
|
+
if (s.pending > 0)
|
|
346
|
+
console.log(` Pending: ${s.pending.toLocaleString().padStart(6)}`);
|
|
347
|
+
if (s.in_progress > 0)
|
|
348
|
+
console.log(` In progress: ${s.in_progress.toLocaleString().padStart(6)}`);
|
|
349
|
+
if (s.failed > 0)
|
|
350
|
+
console.log(` Failed: ${s.failed.toLocaleString().padStart(6)} (after ${5} attempts — won't retry)`);
|
|
351
|
+
if (res.enrichmentNotifiedAt) {
|
|
352
|
+
console.log(` Last notify: ${res.enrichmentNotifiedAt}`);
|
|
353
|
+
}
|
|
354
|
+
console.log('');
|
|
355
|
+
if (s.pending > 0 || s.in_progress > 0) {
|
|
356
|
+
console.log('Drainer runs every 2 minutes. Re-run this command to watch progress.\n');
|
|
357
|
+
}
|
|
358
|
+
else if (s.completed > 0) {
|
|
359
|
+
console.log(`Ready. Try: greprag corpus search ${JSON.stringify(store.name)} "<your question>"\n`);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
// -- delete ----------------------------------------------------------------
|
|
363
|
+
async function deleteCmd(args) {
|
|
364
|
+
const cfg = getConfig();
|
|
365
|
+
if (!cfg.apiKey)
|
|
366
|
+
abortNotConfigured();
|
|
367
|
+
const ref = args[0];
|
|
368
|
+
if (!ref) {
|
|
369
|
+
console.error('Usage: greprag corpus delete <storeIdOrName>');
|
|
370
|
+
process.exit(1);
|
|
371
|
+
}
|
|
372
|
+
const store = await resolveStore(ref, cfg.apiUrl, cfg.apiKey);
|
|
373
|
+
if (!args.includes('--yes') && !args.includes('-y')) {
|
|
374
|
+
console.log(`About to delete: ${store.name} (${store.id}, ${store.nodeCount} nodes)`);
|
|
375
|
+
console.log('Re-run with --yes to confirm.');
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
const result = await apiDelete(`${cfg.apiUrl}/v1/stores/${store.id}`, cfg.apiKey);
|
|
379
|
+
if (!result.ok)
|
|
380
|
+
throw new Error(result.error || 'delete failed');
|
|
381
|
+
console.log(`Deleted ${store.name} (${store.id}).`);
|
|
382
|
+
}
|
|
383
|
+
// -- Dispatch --------------------------------------------------------------
|
|
384
|
+
const SUB_HELP = `
|
|
385
|
+
greprag corpus — upload, search, and walk text corpora.
|
|
386
|
+
|
|
387
|
+
Subcommands:
|
|
388
|
+
upload <file|url> [--name N] [--kind K] Create a store and ingest text. K
|
|
389
|
+
defaults to 'book'. N defaults to
|
|
390
|
+
the filename or URL basename.
|
|
391
|
+
search <store> "<intent>" [--limit 5] Intent-driven search. <store> is a
|
|
392
|
+
UUID or store name.
|
|
393
|
+
walk <store> <nodeId> [--before 2 --after 2]
|
|
394
|
+
Show a node and its neighbors.
|
|
395
|
+
status <store> Show write-side enrichment progress
|
|
396
|
+
(per-node vocabulary bridge).
|
|
397
|
+
list [--kind K] List stores under this tenant.
|
|
398
|
+
delete <store> [--yes] Delete a store. --yes to confirm.
|
|
399
|
+
|
|
400
|
+
Examples:
|
|
401
|
+
greprag corpus upload ./meditations.txt --name "Meditations"
|
|
402
|
+
greprag corpus upload https://www.gutenberg.org/files/2680/2680-0.txt
|
|
403
|
+
greprag corpus search Meditations "how should I respond to insult"
|
|
404
|
+
greprag corpus walk Meditations 7f2a91c4
|
|
405
|
+
greprag corpus status Meditations
|
|
406
|
+
greprag corpus list --kind book
|
|
407
|
+
greprag corpus delete Meditations --yes
|
|
408
|
+
`.trim();
|
|
409
|
+
async function runCorpus(args) {
|
|
410
|
+
const sub = args[0];
|
|
411
|
+
const rest = args.slice(1);
|
|
412
|
+
switch (sub) {
|
|
413
|
+
case 'upload': return uploadCmd(rest);
|
|
414
|
+
case 'search': return searchCmd(rest);
|
|
415
|
+
case 'walk': return walkCmd(rest);
|
|
416
|
+
case 'status': return statusCmd(rest);
|
|
417
|
+
case 'list': return listCmd(rest);
|
|
418
|
+
case 'delete': return deleteCmd(rest);
|
|
419
|
+
case undefined:
|
|
420
|
+
case 'help':
|
|
421
|
+
case '--help':
|
|
422
|
+
case '-h':
|
|
423
|
+
console.log(SUB_HELP);
|
|
424
|
+
return;
|
|
425
|
+
default:
|
|
426
|
+
console.error(`Unknown subcommand: ${sub}\n`);
|
|
427
|
+
console.log(SUB_HELP);
|
|
428
|
+
process.exit(1);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
//# sourceMappingURL=corpus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"corpus.js","sourceRoot":"","sources":["../../src/commands/corpus.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** greprag discover — tenant-wide structure dump for cross-project advisors.
|
|
2
|
+
*
|
|
3
|
+
* Returns every project under the authenticated tenant in one HTTP call:
|
|
4
|
+
* per-shape row counts (turn / hourly / daily / weekly / ship-event), date
|
|
5
|
+
* range of activity, and whether the project is `registered` (has an entry
|
|
6
|
+
* in the projects registry) or `fallback` (only known via memory-store
|
|
7
|
+
* metadata — likely a hash-derived UUID from `.claude/project.json` that
|
|
8
|
+
* was never explicitly registered).
|
|
9
|
+
*
|
|
10
|
+
* Use case: a cross-project advisor (content-advisor, business-advisor)
|
|
11
|
+
* needs to know "what projects do I have memory in" without making N
|
|
12
|
+
* exploratory calls or hardcoding directory paths.
|
|
13
|
+
*
|
|
14
|
+
* Usage:
|
|
15
|
+
* greprag discover — human-readable table
|
|
16
|
+
* greprag discover --json — JSON for agent parsing
|
|
17
|
+
*/
|
|
18
|
+
interface DiscoverProject {
|
|
19
|
+
id: string;
|
|
20
|
+
name: string | null;
|
|
21
|
+
anchor: 'registered' | 'fallback';
|
|
22
|
+
row_counts: Record<string, number>;
|
|
23
|
+
first_activity: string | null;
|
|
24
|
+
last_activity: string | null;
|
|
25
|
+
}
|
|
26
|
+
interface DiscoverResponse {
|
|
27
|
+
ok: boolean;
|
|
28
|
+
tenant: {
|
|
29
|
+
id: string;
|
|
30
|
+
userEmail: string | null;
|
|
31
|
+
};
|
|
32
|
+
projects: DiscoverProject[];
|
|
33
|
+
crystallization_types: string[];
|
|
34
|
+
totals: {
|
|
35
|
+
rows: number;
|
|
36
|
+
projects: number;
|
|
37
|
+
};
|
|
38
|
+
error?: string;
|
|
39
|
+
}
|
|
40
|
+
/** Build a fixed-width table. Right-pads strings, right-aligns numbers. */
|
|
41
|
+
export declare function renderHuman(r: DiscoverResponse): string;
|
|
42
|
+
export declare function runDiscover(args: string[]): Promise<void>;
|
|
43
|
+
export {};
|