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
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/** greprag corpus — shared HTTP client, config, types, and arg helpers.
|
|
2
|
+
*
|
|
3
|
+
* The corpus command is a THIN user-facing surface over /v1/stores/*. All
|
|
4
|
+
* business logic (conversion, refresh, enrichment) lives server-side in
|
|
5
|
+
* @greprag/core + @greprag/api — this module is just config resolution, the
|
|
6
|
+
* three HTTP verbs, the shared response shapes, and the argv parsing helpers
|
|
7
|
+
* every subcommand reuses. The CLI ships zero runtime dependencies, so nothing
|
|
8
|
+
* here imports @greprag/core. */
|
|
9
|
+
export declare const API_URL_DEFAULT = "https://api.greprag.com";
|
|
10
|
+
export declare const UUID_RE: RegExp;
|
|
11
|
+
export declare const VALID_KINDS: readonly ["book", "codebase", "voice", "memory", "inbox", "generic"];
|
|
12
|
+
export type Kind = typeof VALID_KINDS[number];
|
|
13
|
+
export interface Cfg {
|
|
14
|
+
apiUrl: string;
|
|
15
|
+
apiKey: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function getConfig(): Cfg;
|
|
18
|
+
export declare function abortNotConfigured(): never;
|
|
19
|
+
export declare function apiCall<T>(url: string, apiKey: string, body: Record<string, unknown>): Promise<T>;
|
|
20
|
+
export declare function apiGet<T>(url: string, apiKey: string): Promise<T>;
|
|
21
|
+
export declare function apiDelete<T>(url: string, apiKey: string): Promise<T>;
|
|
22
|
+
export interface StoreSummary {
|
|
23
|
+
id: string;
|
|
24
|
+
kind: string;
|
|
25
|
+
name: string;
|
|
26
|
+
nodeCount: number;
|
|
27
|
+
wordCount: number;
|
|
28
|
+
createdAt: string;
|
|
29
|
+
}
|
|
30
|
+
export interface QueryNode {
|
|
31
|
+
id: string;
|
|
32
|
+
nodeId: string;
|
|
33
|
+
storeId: string;
|
|
34
|
+
position: number;
|
|
35
|
+
content: string;
|
|
36
|
+
blockType: string;
|
|
37
|
+
headingPath: string[];
|
|
38
|
+
shape: string | null;
|
|
39
|
+
role: string | null;
|
|
40
|
+
score: number;
|
|
41
|
+
}
|
|
42
|
+
export interface ExpandNode {
|
|
43
|
+
id: string;
|
|
44
|
+
nodeId: string;
|
|
45
|
+
position: number;
|
|
46
|
+
content: string;
|
|
47
|
+
blockType: string;
|
|
48
|
+
headingPath: string[];
|
|
49
|
+
}
|
|
50
|
+
export declare function getFlag(args: string[], flag: string): string | undefined;
|
|
51
|
+
/** Collect every value of a repeatable flag (e.g. --store A --store B). */
|
|
52
|
+
export declare function getFlags(args: string[], flag: string): string[];
|
|
53
|
+
/** Positional args, skipping every --flag and the value of any value-taking flag. */
|
|
54
|
+
export declare function extractPositionals(args: string[], flagsWithValue: Set<string>): string[];
|
|
55
|
+
export declare function isUrl(s: string): boolean;
|
|
56
|
+
/** Resolve a user-supplied store reference to a store row. Accepts a UUID
|
|
57
|
+
* or a case-insensitive name. Ambiguous names fail loud. */
|
|
58
|
+
export declare function resolveStore(ref: string, apiUrl: string, apiKey: string): Promise<StoreSummary>;
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** greprag corpus — shared HTTP client, config, types, and arg helpers.
|
|
3
|
+
*
|
|
4
|
+
* The corpus command is a THIN user-facing surface over /v1/stores/*. All
|
|
5
|
+
* business logic (conversion, refresh, enrichment) lives server-side in
|
|
6
|
+
* @greprag/core + @greprag/api — this module is just config resolution, the
|
|
7
|
+
* three HTTP verbs, the shared response shapes, and the argv parsing helpers
|
|
8
|
+
* every subcommand reuses. The CLI ships zero runtime dependencies, so nothing
|
|
9
|
+
* here imports @greprag/core. */
|
|
10
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(o, k2, desc);
|
|
17
|
+
}) : (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
o[k2] = m[k];
|
|
20
|
+
}));
|
|
21
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
22
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
23
|
+
}) : function(o, v) {
|
|
24
|
+
o["default"] = v;
|
|
25
|
+
});
|
|
26
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
27
|
+
var ownKeys = function(o) {
|
|
28
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
29
|
+
var ar = [];
|
|
30
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
31
|
+
return ar;
|
|
32
|
+
};
|
|
33
|
+
return ownKeys(o);
|
|
34
|
+
};
|
|
35
|
+
return function (mod) {
|
|
36
|
+
if (mod && mod.__esModule) return mod;
|
|
37
|
+
var result = {};
|
|
38
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
39
|
+
__setModuleDefault(result, mod);
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
})();
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
exports.VALID_KINDS = exports.UUID_RE = exports.API_URL_DEFAULT = void 0;
|
|
45
|
+
exports.getConfig = getConfig;
|
|
46
|
+
exports.abortNotConfigured = abortNotConfigured;
|
|
47
|
+
exports.apiCall = apiCall;
|
|
48
|
+
exports.apiGet = apiGet;
|
|
49
|
+
exports.apiDelete = apiDelete;
|
|
50
|
+
exports.getFlag = getFlag;
|
|
51
|
+
exports.getFlags = getFlags;
|
|
52
|
+
exports.extractPositionals = extractPositionals;
|
|
53
|
+
exports.isUrl = isUrl;
|
|
54
|
+
exports.resolveStore = resolveStore;
|
|
55
|
+
const fs = __importStar(require("fs"));
|
|
56
|
+
const path = __importStar(require("path"));
|
|
57
|
+
exports.API_URL_DEFAULT = 'https://api.greprag.com';
|
|
58
|
+
exports.UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
59
|
+
exports.VALID_KINDS = ['book', 'codebase', 'voice', 'memory', 'inbox', 'generic'];
|
|
60
|
+
// -- Config ----------------------------------------------------------------
|
|
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 || exports.API_URL_DEFAULT,
|
|
91
|
+
apiKey: process.env.GREPRAG_API_KEY || '',
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function abortNotConfigured() {
|
|
95
|
+
console.error('Not configured. Run: greprag init');
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
// -- HTTP ------------------------------------------------------------------
|
|
99
|
+
async function apiCall(url, apiKey, body) {
|
|
100
|
+
const res = await fetch(url, {
|
|
101
|
+
method: 'POST',
|
|
102
|
+
headers: {
|
|
103
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
104
|
+
'Content-Type': 'application/json',
|
|
105
|
+
},
|
|
106
|
+
body: JSON.stringify(body),
|
|
107
|
+
});
|
|
108
|
+
if (!res.ok)
|
|
109
|
+
throw new Error(`API ${res.status}: ${await res.text()}`);
|
|
110
|
+
return res.json();
|
|
111
|
+
}
|
|
112
|
+
async function apiGet(url, apiKey) {
|
|
113
|
+
const res = await fetch(url, {
|
|
114
|
+
headers: { 'Authorization': `Bearer ${apiKey}` },
|
|
115
|
+
});
|
|
116
|
+
if (!res.ok)
|
|
117
|
+
throw new Error(`API ${res.status}: ${await res.text()}`);
|
|
118
|
+
return res.json();
|
|
119
|
+
}
|
|
120
|
+
async function apiDelete(url, apiKey) {
|
|
121
|
+
const res = await fetch(url, {
|
|
122
|
+
method: 'DELETE',
|
|
123
|
+
headers: { 'Authorization': `Bearer ${apiKey}` },
|
|
124
|
+
});
|
|
125
|
+
if (!res.ok)
|
|
126
|
+
throw new Error(`API ${res.status}: ${await res.text()}`);
|
|
127
|
+
return res.json();
|
|
128
|
+
}
|
|
129
|
+
// -- Arg helpers -----------------------------------------------------------
|
|
130
|
+
function getFlag(args, flag) {
|
|
131
|
+
const idx = args.indexOf(flag);
|
|
132
|
+
if (idx === -1 || idx + 1 >= args.length)
|
|
133
|
+
return undefined;
|
|
134
|
+
return args[idx + 1];
|
|
135
|
+
}
|
|
136
|
+
/** Collect every value of a repeatable flag (e.g. --store A --store B). */
|
|
137
|
+
function getFlags(args, flag) {
|
|
138
|
+
const out = [];
|
|
139
|
+
for (let i = 0; i < args.length - 1; i++)
|
|
140
|
+
if (args[i] === flag)
|
|
141
|
+
out.push(args[i + 1]);
|
|
142
|
+
return out;
|
|
143
|
+
}
|
|
144
|
+
/** Positional args, skipping every --flag and the value of any value-taking flag. */
|
|
145
|
+
function extractPositionals(args, flagsWithValue) {
|
|
146
|
+
const out = [];
|
|
147
|
+
for (let i = 0; i < args.length; i++) {
|
|
148
|
+
const a = args[i];
|
|
149
|
+
if (a.startsWith('--')) {
|
|
150
|
+
if (flagsWithValue.has(a))
|
|
151
|
+
i++;
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
out.push(a);
|
|
155
|
+
}
|
|
156
|
+
return out;
|
|
157
|
+
}
|
|
158
|
+
function isUrl(s) {
|
|
159
|
+
return /^https?:\/\//i.test(s);
|
|
160
|
+
}
|
|
161
|
+
/** Resolve a user-supplied store reference to a store row. Accepts a UUID
|
|
162
|
+
* or a case-insensitive name. Ambiguous names fail loud. */
|
|
163
|
+
async function resolveStore(ref, apiUrl, apiKey) {
|
|
164
|
+
if (exports.UUID_RE.test(ref)) {
|
|
165
|
+
const r = await apiGet(`${apiUrl}/v1/stores/${ref}`, apiKey);
|
|
166
|
+
if (!r.ok || !r.store)
|
|
167
|
+
throw new Error(r.error || 'store not found');
|
|
168
|
+
return r.store;
|
|
169
|
+
}
|
|
170
|
+
const list = await apiGet(`${apiUrl}/v1/stores`, apiKey);
|
|
171
|
+
const needle = ref.trim().toLowerCase();
|
|
172
|
+
const matches = list.stores.filter(s => s.name.toLowerCase() === needle);
|
|
173
|
+
if (matches.length === 0) {
|
|
174
|
+
throw new Error(`no store named "${ref}". Run 'greprag corpus list' to see what's available.`);
|
|
175
|
+
}
|
|
176
|
+
if (matches.length > 1) {
|
|
177
|
+
const ids = matches.map(m => `${m.id} (${m.kind})`).join(', ');
|
|
178
|
+
throw new Error(`name "${ref}" is ambiguous — multiple stores match. Use a UUID instead: ${ids}`);
|
|
179
|
+
}
|
|
180
|
+
return matches[0];
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/commands/corpus/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** greprag corpus — upload, search, walk, and keep-fresh 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/*; all
|
|
7
|
+
* business logic (conversion, refresh, enrichment) is server-side.
|
|
8
|
+
*
|
|
9
|
+
* Subcommands:
|
|
10
|
+
* upload <file|url> (--enriched|--raw) [--name N] [--kind K] [--refresh P]
|
|
11
|
+
* search <store> "<intent>" [--limit 5] (or multistore: "<intent>" --all)
|
|
12
|
+
* walk <store> <nodeId> [--before 2 --after 2]
|
|
13
|
+
* section <store> "<heading>"
|
|
14
|
+
* status <store>
|
|
15
|
+
* refresh <store> manual freshness kick (B7)
|
|
16
|
+
* sources <store> freshness state: source, policy, next check (E1)
|
|
17
|
+
* list [--kind K]
|
|
18
|
+
* delete <store> [--yes]
|
|
19
|
+
*
|
|
20
|
+
* <store> accepts either a store UUID or its name. Names are resolved
|
|
21
|
+
* case-insensitively against the tenant's list of stores; ambiguous
|
|
22
|
+
* names are rejected with a hint to use the UUID. */
|
|
23
|
+
export declare function runCorpus(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** greprag corpus — upload, search, walk, and keep-fresh 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/*; all
|
|
8
|
+
* business logic (conversion, refresh, enrichment) is server-side.
|
|
9
|
+
*
|
|
10
|
+
* Subcommands:
|
|
11
|
+
* upload <file|url> (--enriched|--raw) [--name N] [--kind K] [--refresh P]
|
|
12
|
+
* search <store> "<intent>" [--limit 5] (or multistore: "<intent>" --all)
|
|
13
|
+
* walk <store> <nodeId> [--before 2 --after 2]
|
|
14
|
+
* section <store> "<heading>"
|
|
15
|
+
* status <store>
|
|
16
|
+
* refresh <store> manual freshness kick (B7)
|
|
17
|
+
* sources <store> freshness state: source, policy, next check (E1)
|
|
18
|
+
* list [--kind K]
|
|
19
|
+
* delete <store> [--yes]
|
|
20
|
+
*
|
|
21
|
+
* <store> accepts either a store UUID or its name. Names are resolved
|
|
22
|
+
* case-insensitively against the tenant's list of stores; ambiguous
|
|
23
|
+
* names are rejected with a hint to use the UUID. */
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.runCorpus = runCorpus;
|
|
26
|
+
const upload_1 = require("./upload");
|
|
27
|
+
const search_1 = require("./search");
|
|
28
|
+
const walk_1 = require("./walk");
|
|
29
|
+
const section_1 = require("./section");
|
|
30
|
+
const status_1 = require("./status");
|
|
31
|
+
const manage_1 = require("./manage");
|
|
32
|
+
const refresh_1 = require("./refresh");
|
|
33
|
+
const SUB_HELP = `
|
|
34
|
+
greprag corpus — upload, search, walk, and keep-fresh text corpora.
|
|
35
|
+
|
|
36
|
+
Subcommands:
|
|
37
|
+
upload <file|url> (--enriched | --raw) Create a store and ingest a source.
|
|
38
|
+
[--name N] [--kind K] Text/markdown/code pass through; html,
|
|
39
|
+
[--refresh hourly|daily|manual|off] pdf, docx, xlsx, csv, pptx/odp convert
|
|
40
|
+
server-side to clean markdown. Mode is REQUIRED:
|
|
41
|
+
--enriched (per-node LLM vocabulary
|
|
42
|
+
bridge — prose/voice)
|
|
43
|
+
or --raw (lexical index only —
|
|
44
|
+
docs/code). K defaults to 'book';
|
|
45
|
+
N to the file/URL basename. --refresh
|
|
46
|
+
tracks a URL for the freshness loop
|
|
47
|
+
(URLs only; default off).
|
|
48
|
+
search <store> "<intent>" Single-store search. <store> is a
|
|
49
|
+
[--limit 5] [--section "<h>"] [--shape S] UUID or store name.
|
|
50
|
+
search "<intent>" (--all | --store <ref>...) Multistore search (RRF-fused).
|
|
51
|
+
[--kind K] [--limit 8] [--section "<h>"]
|
|
52
|
+
--all = every store under the tenant;
|
|
53
|
+
--store repeatable; --kind filters to
|
|
54
|
+
one kind. Hits are labeled by store.
|
|
55
|
+
section <store> "<heading>" Every node under a heading (forgiving
|
|
56
|
+
match: any depth, dash/case-insensitive).
|
|
57
|
+
walk <store> <nodeId> [--before 2 --after 2]
|
|
58
|
+
Show a node and its neighbors.
|
|
59
|
+
status <store> Show write-side enrichment progress
|
|
60
|
+
(per-node vocabulary bridge).
|
|
61
|
+
refresh <store> Manually re-check a tracked source —
|
|
62
|
+
re-ingests only changed blocks.
|
|
63
|
+
sources <store> Freshness state: source URL, policy,
|
|
64
|
+
last fetched/changed, next check, failures.
|
|
65
|
+
list [--kind K] List stores under this tenant.
|
|
66
|
+
delete <store> [--yes] Delete a store. --yes to confirm.
|
|
67
|
+
|
|
68
|
+
Examples:
|
|
69
|
+
greprag corpus upload ./meditations.txt --enriched --name "Meditations"
|
|
70
|
+
greprag corpus upload https://code.claude.com/docs/llms-full.txt --raw --name "claude-code-docs"
|
|
71
|
+
greprag corpus upload https://docs.claude.com/llms-full.txt --raw --refresh hourly --name "claude-docs"
|
|
72
|
+
greprag corpus search Meditations "how should I respond to insult"
|
|
73
|
+
greprag corpus search "discipline OR restraint" --all --limit 10
|
|
74
|
+
greprag corpus search "voice" --store Meditations --store travis-voice-corpus
|
|
75
|
+
greprag corpus search "stoicism" --kind book
|
|
76
|
+
greprag corpus section Meditations "Book VII"
|
|
77
|
+
greprag corpus walk Meditations 7f2a91c4
|
|
78
|
+
greprag corpus status Meditations
|
|
79
|
+
greprag corpus refresh claude-docs
|
|
80
|
+
greprag corpus sources claude-docs
|
|
81
|
+
greprag corpus list --kind book
|
|
82
|
+
greprag corpus delete Meditations --yes
|
|
83
|
+
`.trim();
|
|
84
|
+
async function runCorpus(args) {
|
|
85
|
+
const sub = args[0];
|
|
86
|
+
const rest = args.slice(1);
|
|
87
|
+
switch (sub) {
|
|
88
|
+
case 'upload': return (0, upload_1.uploadCmd)(rest);
|
|
89
|
+
case 'search': return (0, search_1.searchCmd)(rest);
|
|
90
|
+
case 'walk': return (0, walk_1.walkCmd)(rest);
|
|
91
|
+
case 'section': return (0, section_1.sectionCmd)(rest);
|
|
92
|
+
case 'status': return (0, status_1.statusCmd)(rest);
|
|
93
|
+
case 'refresh': return (0, refresh_1.refreshCmd)(rest);
|
|
94
|
+
case 'sources': return (0, refresh_1.sourcesCmd)(rest);
|
|
95
|
+
case 'list': return (0, manage_1.listCmd)(rest);
|
|
96
|
+
case 'delete': return (0, manage_1.deleteCmd)(rest);
|
|
97
|
+
case undefined:
|
|
98
|
+
case 'help':
|
|
99
|
+
case '--help':
|
|
100
|
+
case '-h':
|
|
101
|
+
console.log(SUB_HELP);
|
|
102
|
+
return;
|
|
103
|
+
default:
|
|
104
|
+
console.error(`Unknown subcommand: ${sub}\n`);
|
|
105
|
+
console.log(SUB_HELP);
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/corpus/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;sDAqBsD;;AA8DtD,8BAwBC;AApFD,qCAAqC;AACrC,qCAAqC;AACrC,iCAAiC;AACjC,uCAAuC;AACvC,qCAAqC;AACrC,qCAA8C;AAC9C,uCAAmD;AAEnD,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkDhB,CAAC,IAAI,EAAE,CAAC;AAEF,KAAK,UAAU,SAAS,CAAC,IAAc;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,QAAQ,CAAC,CAAE,OAAO,IAAA,kBAAS,EAAC,IAAI,CAAC,CAAC;QACvC,KAAK,QAAQ,CAAC,CAAE,OAAO,IAAA,kBAAS,EAAC,IAAI,CAAC,CAAC;QACvC,KAAK,MAAM,CAAC,CAAI,OAAO,IAAA,cAAO,EAAC,IAAI,CAAC,CAAC;QACrC,KAAK,SAAS,CAAC,CAAC,OAAO,IAAA,oBAAU,EAAC,IAAI,CAAC,CAAC;QACxC,KAAK,QAAQ,CAAC,CAAE,OAAO,IAAA,kBAAS,EAAC,IAAI,CAAC,CAAC;QACvC,KAAK,SAAS,CAAC,CAAC,OAAO,IAAA,oBAAU,EAAC,IAAI,CAAC,CAAC;QACxC,KAAK,SAAS,CAAC,CAAC,OAAO,IAAA,oBAAU,EAAC,IAAI,CAAC,CAAC;QACxC,KAAK,MAAM,CAAC,CAAI,OAAO,IAAA,gBAAO,EAAC,IAAI,CAAC,CAAC;QACrC,KAAK,QAAQ,CAAC,CAAE,OAAO,IAAA,kBAAS,EAAC,IAAI,CAAC,CAAC;QACvC,KAAK,SAAS,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACP,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtB,OAAO;QACT;YACE,OAAO,CAAC,KAAK,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** greprag corpus list / delete — store inventory + teardown.
|
|
2
|
+
*
|
|
3
|
+
* list: every store under the tenant (newest first), optionally filtered by
|
|
4
|
+
* kind. delete: tear down a store and all its nodes (confirm with --yes). */
|
|
5
|
+
export declare function listCmd(args: string[]): Promise<void>;
|
|
6
|
+
export declare function deleteCmd(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** greprag corpus list / delete — store inventory + teardown.
|
|
3
|
+
*
|
|
4
|
+
* list: every store under the tenant (newest first), optionally filtered by
|
|
5
|
+
* kind. delete: tear down a store and all its nodes (confirm with --yes). */
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.listCmd = listCmd;
|
|
8
|
+
exports.deleteCmd = deleteCmd;
|
|
9
|
+
const client_1 = require("./client");
|
|
10
|
+
async function listCmd(args) {
|
|
11
|
+
const cfg = (0, client_1.getConfig)();
|
|
12
|
+
if (!cfg.apiKey)
|
|
13
|
+
(0, client_1.abortNotConfigured)();
|
|
14
|
+
const kindFlag = (0, client_1.getFlag)(args, '--kind');
|
|
15
|
+
const url = `${cfg.apiUrl}/v1/stores${kindFlag ? `?kind=${encodeURIComponent(kindFlag)}` : ''}`;
|
|
16
|
+
const result = await (0, client_1.apiGet)(url, cfg.apiKey);
|
|
17
|
+
if (result.stores.length === 0) {
|
|
18
|
+
console.log(kindFlag ? `No stores with kind="${kindFlag}".` : 'No stores yet.');
|
|
19
|
+
console.log('Upload one: greprag corpus upload <file|url> --name "<name>"');
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const sorted = [...result.stores].sort((a, b) => b.createdAt.localeCompare(a.createdAt));
|
|
23
|
+
console.log(`\n${sorted.length} store${sorted.length === 1 ? '' : 's'}:\n`);
|
|
24
|
+
for (const s of sorted) {
|
|
25
|
+
const created = new Date(s.createdAt).toISOString().slice(0, 10);
|
|
26
|
+
console.log(` ${s.id} ${s.kind.padEnd(8)} ${s.nodeCount.toString().padStart(6)} nodes ${s.wordCount.toString().padStart(8)} words ${created} ${s.name}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async function deleteCmd(args) {
|
|
30
|
+
const cfg = (0, client_1.getConfig)();
|
|
31
|
+
if (!cfg.apiKey)
|
|
32
|
+
(0, client_1.abortNotConfigured)();
|
|
33
|
+
const ref = args[0];
|
|
34
|
+
if (!ref) {
|
|
35
|
+
console.error('Usage: greprag corpus delete <storeIdOrName>');
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
const store = await (0, client_1.resolveStore)(ref, cfg.apiUrl, cfg.apiKey);
|
|
39
|
+
if (!args.includes('--yes') && !args.includes('-y')) {
|
|
40
|
+
console.log(`About to delete: ${store.name} (${store.id}, ${store.nodeCount} nodes)`);
|
|
41
|
+
console.log('Re-run with --yes to confirm.');
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const result = await (0, client_1.apiDelete)(`${cfg.apiUrl}/v1/stores/${store.id}`, cfg.apiKey);
|
|
45
|
+
if (!result.ok)
|
|
46
|
+
throw new Error(result.error || 'delete failed');
|
|
47
|
+
console.log(`Deleted ${store.name} (${store.id}).`);
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=manage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manage.js","sourceRoot":"","sources":["../../../src/commands/corpus/manage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** greprag corpus refresh / sources — the freshness-loop surface (B7 + E1).
|
|
2
|
+
*
|
|
3
|
+
* refresh: manually kick a re-check of a store's source. POSTs the manual
|
|
4
|
+
* endpoint, which runs the SAME refreshStore orchestrator the cron uses
|
|
5
|
+
* (change signal → conditional fetch → convert → re-ingest → re-enrich only
|
|
6
|
+
* genuinely-fresh nodes). Thin — all logic is server-side.
|
|
7
|
+
*
|
|
8
|
+
* sources: read-only render of a store's StoreRefreshState (last fetched /
|
|
9
|
+
* changed, next scheduled check, consecutive failures, policy, validators). */
|
|
10
|
+
export declare function refreshCmd(args: string[]): Promise<void>;
|
|
11
|
+
export declare function sourcesCmd(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** greprag corpus refresh / sources — the freshness-loop surface (B7 + E1).
|
|
3
|
+
*
|
|
4
|
+
* refresh: manually kick a re-check of a store's source. POSTs the manual
|
|
5
|
+
* endpoint, which runs the SAME refreshStore orchestrator the cron uses
|
|
6
|
+
* (change signal → conditional fetch → convert → re-ingest → re-enrich only
|
|
7
|
+
* genuinely-fresh nodes). Thin — all logic is server-side.
|
|
8
|
+
*
|
|
9
|
+
* sources: read-only render of a store's StoreRefreshState (last fetched /
|
|
10
|
+
* changed, next scheduled check, consecutive failures, policy, validators). */
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.refreshCmd = refreshCmd;
|
|
13
|
+
exports.sourcesCmd = sourcesCmd;
|
|
14
|
+
const client_1 = require("./client");
|
|
15
|
+
async function refreshCmd(args) {
|
|
16
|
+
const cfg = (0, client_1.getConfig)();
|
|
17
|
+
if (!cfg.apiKey)
|
|
18
|
+
(0, client_1.abortNotConfigured)();
|
|
19
|
+
const ref = args[0];
|
|
20
|
+
if (!ref) {
|
|
21
|
+
console.error('Usage: greprag corpus refresh <storeIdOrName>\n Manually re-check a tracked source. Register one with: corpus upload <url> --refresh manual');
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
const store = await (0, client_1.resolveStore)(ref, cfg.apiUrl, cfg.apiKey);
|
|
25
|
+
console.log(`Refreshing "${store.name}"...`);
|
|
26
|
+
const res = await (0, client_1.apiCall)(`${cfg.apiUrl}/v1/stores/${store.id}/refresh`, cfg.apiKey, {});
|
|
27
|
+
if (!res.ok || !res.result)
|
|
28
|
+
throw new Error(res.error || 'refresh failed');
|
|
29
|
+
const r = res.result;
|
|
30
|
+
console.log(`\n${store.name} · refresh`);
|
|
31
|
+
console.log(` Status: ${r.status}`);
|
|
32
|
+
if (r.changeSignal)
|
|
33
|
+
console.log(` Signal: ${r.changeSignal}`);
|
|
34
|
+
if (r.status === 'changed') {
|
|
35
|
+
const bits = [`${r.nodesChanged} changed`];
|
|
36
|
+
if (r.nodesRemoved > 0)
|
|
37
|
+
bits.push(`${r.nodesRemoved} removed`);
|
|
38
|
+
console.log(` Nodes: ${bits.join(', ')}`);
|
|
39
|
+
if (r.enrichmentQueued > 0)
|
|
40
|
+
console.log(` Enrich: ${r.enrichmentQueued} queued`);
|
|
41
|
+
if (r.notified)
|
|
42
|
+
console.log(` Notified: yes (greprag inbox)`);
|
|
43
|
+
}
|
|
44
|
+
if (r.reason)
|
|
45
|
+
console.log(` ${r.reason}`);
|
|
46
|
+
if (r.status === 'skipped') {
|
|
47
|
+
console.log(`\nTip: a store refreshes only when it has a source URL and a non-'off' policy.\n Re-upload the URL with --refresh hourly|daily|manual to enable.`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async function sourcesCmd(args) {
|
|
51
|
+
const cfg = (0, client_1.getConfig)();
|
|
52
|
+
if (!cfg.apiKey)
|
|
53
|
+
(0, client_1.abortNotConfigured)();
|
|
54
|
+
const ref = args[0];
|
|
55
|
+
if (!ref) {
|
|
56
|
+
console.error('Usage: greprag corpus sources <storeIdOrName>\n Show the freshness state: source, policy, last fetched/changed, next check, failures.');
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
const store = await (0, client_1.resolveStore)(ref, cfg.apiUrl, cfg.apiKey);
|
|
60
|
+
const res = await (0, client_1.apiGet)(`${cfg.apiUrl}/v1/stores/${store.id}/refresh`, cfg.apiKey);
|
|
61
|
+
if (!res.ok)
|
|
62
|
+
throw new Error(res.error || 'sources failed');
|
|
63
|
+
console.log(`\n${store.name} · sources`);
|
|
64
|
+
const st = res.refresh;
|
|
65
|
+
if (!st) {
|
|
66
|
+
console.log(' Not registered for refresh (one-shot ingest).');
|
|
67
|
+
console.log(' Enable: greprag corpus upload <url> --refresh hourly|daily|manual');
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
console.log(` Source: ${st.url ?? '(none — not refreshable)'}`);
|
|
71
|
+
console.log(` Policy: ${st.policy}`);
|
|
72
|
+
if (st.contentSourceType)
|
|
73
|
+
console.log(` Content: ${st.contentSourceType}`);
|
|
74
|
+
if (st.changeSignal)
|
|
75
|
+
console.log(` Signal: ${st.changeSignal}`);
|
|
76
|
+
console.log(` Last fetch: ${fmtTime(st.lastFetchedAt)}`);
|
|
77
|
+
console.log(` Last change: ${fmtTime(st.lastChangedAt)}`);
|
|
78
|
+
console.log(` Next check: ${st.policy === 'hourly' || st.policy === 'daily' ? fmtTime(st.nextCheckAt) : 'manual only'}`);
|
|
79
|
+
if (st.consecutiveFailures && st.consecutiveFailures > 0) {
|
|
80
|
+
console.log(` Failures: ${st.consecutiveFailures} consecutive (backing off)`);
|
|
81
|
+
}
|
|
82
|
+
if (st.lastConverterVersion)
|
|
83
|
+
console.log(` Converter: v${st.lastConverterVersion}`);
|
|
84
|
+
console.log('');
|
|
85
|
+
if (st.policy === 'off') {
|
|
86
|
+
console.log("Policy 'off' — source recorded but not auto-refreshed. Kick a one-off check anytime: greprag corpus refresh " + JSON.stringify(store.name) + '\n');
|
|
87
|
+
}
|
|
88
|
+
else if (st.policy === 'manual') {
|
|
89
|
+
console.log(`Manual policy — re-check on demand: greprag corpus refresh ${JSON.stringify(store.name)}\n`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/** Render an ISO timestamp as "ISO (Nh ago)"; em-dash when never. Uses only
|
|
93
|
+
* Date math available in the CLI runtime (no extra deps). */
|
|
94
|
+
function fmtTime(iso) {
|
|
95
|
+
if (!iso)
|
|
96
|
+
return '—';
|
|
97
|
+
const t = Date.parse(iso);
|
|
98
|
+
if (Number.isNaN(t))
|
|
99
|
+
return iso;
|
|
100
|
+
const deltaMs = Date.now() - t;
|
|
101
|
+
const future = deltaMs < 0;
|
|
102
|
+
const abs = Math.abs(deltaMs);
|
|
103
|
+
const h = Math.floor(abs / 3_600_000);
|
|
104
|
+
const m = Math.floor((abs % 3_600_000) / 60_000);
|
|
105
|
+
let rel;
|
|
106
|
+
if (abs < 60_000)
|
|
107
|
+
rel = 'just now';
|
|
108
|
+
else if (h < 1)
|
|
109
|
+
rel = `${m}m`;
|
|
110
|
+
else if (h < 48)
|
|
111
|
+
rel = `${h}h`;
|
|
112
|
+
else
|
|
113
|
+
rel = `${Math.floor(h / 24)}d`;
|
|
114
|
+
const tag = abs < 60_000 ? rel : `${rel} ${future ? 'from now' : 'ago'}`;
|
|
115
|
+
return `${iso} (${tag})`;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=refresh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh.js","sourceRoot":"","sources":["../../../src/commands/corpus/refresh.ts"],"names":[],"mappings":";AAAA;;;;;;;;gFAQgF;;AAkChF,gCAiCC;AAED,gCAyCC;AA5GD,qCAEkB;AA8BX,KAAK,UAAU,UAAU,CAAC,IAAc;IAC7C,MAAM,GAAG,GAAG,IAAA,kBAAS,GAAE,CAAC;IACxB,IAAI,CAAC,GAAG,CAAC,MAAM;QAAE,IAAA,2BAAkB,GAAE,CAAC;IAEtC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,8IAA8I,CAAC,CAAC;QAC9J,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,IAAA,qBAAY,EAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAE9D,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,MAAM,IAAA,gBAAO,EACvB,GAAG,GAAG,CAAC,MAAM,cAAc,KAAK,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAC9D,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,gBAAgB,CAAC,CAAC;IAC3E,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IAErB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,YAAY,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,IAAI,CAAC,CAAC,YAAY;QAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;IAClE,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,YAAY,UAAU,CAAC,CAAC;QAC3C,IAAI,CAAC,CAAC,YAAY,GAAG,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,YAAY,UAAU,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,CAAC,gBAAgB,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,gBAAgB,SAAS,CAAC,CAAC;QACrF,IAAI,CAAC,CAAC,QAAQ;YAAE,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,CAAC,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAE3C,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,sJAAsJ,CAAC,CAAC;IACtK,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,UAAU,CAAC,IAAc;IAC7C,MAAM,GAAG,GAAG,IAAA,kBAAS,GAAE,CAAC;IACxB,IAAI,CAAC,GAAG,CAAC,MAAM;QAAE,IAAA,2BAAkB,GAAE,CAAC;IAEtC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,wIAAwI,CAAC,CAAC;QACxJ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,IAAA,qBAAY,EAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAE9D,MAAM,GAAG,GAAG,MAAM,IAAA,eAAM,EACtB,GAAG,GAAG,CAAC,MAAM,cAAc,KAAK,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAC1D,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,gBAAgB,CAAC,CAAC;IAE5D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,YAAY,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;QACnF,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,GAAG,IAAI,0BAA0B,EAAE,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,IAAI,EAAE,CAAC,iBAAiB;QAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAChF,IAAI,EAAE,CAAC,YAAY;QAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,MAAM,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;IAC3H,IAAI,EAAE,CAAC,mBAAmB,IAAI,EAAE,CAAC,mBAAmB,GAAG,CAAC,EAAE,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,mBAAmB,4BAA4B,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,EAAE,CAAC,oBAAoB;QAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC,oBAAoB,EAAE,CAAC,CAAC;IACvF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,IAAI,EAAE,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,8GAA8G,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAClK,CAAC;SAAM,IAAI,EAAE,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,8DAA8D,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5G,CAAC;AACH,CAAC;AAED;8DAC8D;AAC9D,SAAS,OAAO,CAAC,GAAY;IAC3B,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC;IACrB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,MAAM,CAAC,CAAC;IACjD,IAAI,GAAW,CAAC;IAChB,IAAI,GAAG,GAAG,MAAM;QAAE,GAAG,GAAG,UAAU,CAAC;SAC9B,IAAI,CAAC,GAAG,CAAC;QAAE,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;SACzB,IAAI,CAAC,GAAG,EAAE;QAAE,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;;QAC1B,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC;IACpC,MAAM,GAAG,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IACzE,OAAO,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** greprag corpus search — single-store and multistore lexical retrieval.
|
|
2
|
+
*
|
|
3
|
+
* Single-store: positional <store> + query. Multistore (--all / --store / --kind):
|
|
4
|
+
* RRF-fused via /v1/search, hits labeled by store. The agent owns query
|
|
5
|
+
* formulation (websearch_to_tsquery syntax); no server-side LLM. */
|
|
6
|
+
export declare function searchCmd(args: string[]): Promise<void>;
|