memonaut 0.0.0 → 0.2.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/LICENSE +661 -0
- package/dist/cli-main.d.ts +14 -0
- package/dist/cli-main.d.ts.map +1 -0
- package/dist/cli-main.js +551 -0
- package/dist/cli-main.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +16 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +38 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +86 -0
- package/dist/config.js.map +1 -0
- package/dist/db.d.ts +37 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +184 -0
- package/dist/db.js.map +1 -0
- package/dist/format.d.ts +22 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +143 -0
- package/dist/format.js.map +1 -0
- package/dist/glob.d.ts +17 -0
- package/dist/glob.d.ts.map +1 -0
- package/dist/glob.js +77 -0
- package/dist/glob.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer.d.ts +50 -0
- package/dist/indexer.d.ts.map +1 -0
- package/dist/indexer.js +404 -0
- package/dist/indexer.js.map +1 -0
- package/dist/lineage.d.ts +31 -0
- package/dist/lineage.d.ts.map +1 -0
- package/dist/lineage.js +94 -0
- package/dist/lineage.js.map +1 -0
- package/dist/model.d.ts +121 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +41 -0
- package/dist/model.js.map +1 -0
- package/dist/pi-source.d.ts +47 -0
- package/dist/pi-source.d.ts.map +1 -0
- package/dist/pi-source.js +309 -0
- package/dist/pi-source.js.map +1 -0
- package/dist/quiet.d.ts +7 -0
- package/dist/quiet.d.ts.map +1 -0
- package/dist/quiet.js +19 -0
- package/dist/quiet.js.map +1 -0
- package/dist/regex.d.ts +75 -0
- package/dist/regex.d.ts.map +1 -0
- package/dist/regex.js +242 -0
- package/dist/regex.js.map +1 -0
- package/dist/ripgrep.d.ts +52 -0
- package/dist/ripgrep.d.ts.map +1 -0
- package/dist/ripgrep.js +217 -0
- package/dist/ripgrep.js.map +1 -0
- package/dist/search.d.ts +114 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +309 -0
- package/dist/search.js.map +1 -0
- package/dist/silence-sqlite-warning.d.ts +2 -0
- package/dist/silence-sqlite-warning.d.ts.map +1 -0
- package/dist/silence-sqlite-warning.js +9 -0
- package/dist/silence-sqlite-warning.js.map +1 -0
- package/package.json +57 -2
- package/src/cli-main.ts +618 -0
- package/src/cli.ts +17 -0
- package/src/config.ts +130 -0
- package/src/db.ts +213 -0
- package/src/format.ts +185 -0
- package/src/glob.ts +79 -0
- package/src/index.ts +19 -0
- package/src/indexer.ts +534 -0
- package/src/lineage.ts +111 -0
- package/src/model.ts +157 -0
- package/src/pi-source.ts +328 -0
- package/src/quiet.ts +22 -0
- package/src/regex.ts +378 -0
- package/src/ripgrep.ts +263 -0
- package/src/search.ts +504 -0
package/dist/cli-main.js
ADDED
|
@@ -0,0 +1,551 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { parseArgs } from 'node:util';
|
|
5
|
+
import { loadConfig, writeStarterConfig } from './config.js';
|
|
6
|
+
import { getMeta, openDb } from './db.js';
|
|
7
|
+
import { colorsEnabled, makeStyle, renderHit, renderTable, relativeTime, tildify, } from './format.js';
|
|
8
|
+
import { index } from './indexer.js';
|
|
9
|
+
import { TIERS } from './model.js';
|
|
10
|
+
import { readRawEntry } from './pi-source.js';
|
|
11
|
+
import { DEFAULT_MAX_MATCHES, DEFAULT_MAX_PER_FILE, regexSearch, } from './regex.js';
|
|
12
|
+
import { indexStats, readThread, resolveThread, search } from './search.js';
|
|
13
|
+
const USAGE = `memonaut — search your agent conversation transcripts
|
|
14
|
+
|
|
15
|
+
USAGE
|
|
16
|
+
recall <command> [options]
|
|
17
|
+
|
|
18
|
+
COMMANDS
|
|
19
|
+
index Bring the index up to date (incremental by default)
|
|
20
|
+
search <query...> Search transcripts, grouped by fork lineage
|
|
21
|
+
search --regex <pat> Exact regex search over the original transcripts
|
|
22
|
+
show <ref> Print a thread (file id, session uuid prefix, name or path)
|
|
23
|
+
sql <query> Run a read-only SQL query against the index
|
|
24
|
+
stats Summarise what is indexed
|
|
25
|
+
config Show config paths, or write a starter config
|
|
26
|
+
|
|
27
|
+
SEARCH OPTIONS
|
|
28
|
+
--cwd <glob> Filter by working directory (repeatable, globs, ~ ok)
|
|
29
|
+
--project <name> Filter by project (last segment of the cwd, repeatable)
|
|
30
|
+
--role <role> user | assistant | toolResult | bashExecution | ... (repeatable)
|
|
31
|
+
--tool <name> Filter by tool name (repeatable)
|
|
32
|
+
--kind <kind> user | assistant | thinking | toolCall | toolResult | bash | summary | name
|
|
33
|
+
--since <when> 30d, 6h, 2w, or an ISO date
|
|
34
|
+
--until <when> Same forms as --since
|
|
35
|
+
--limit <n> Result groups (default 20)
|
|
36
|
+
--threads <n|all> Threads shown per group (default 3)
|
|
37
|
+
--private Include transcripts matched by the config's private globs
|
|
38
|
+
--raw Pass the query to FTS5 verbatim (no quoting fallback)
|
|
39
|
+
--no-recency Rank on bm25 x kind weight only
|
|
40
|
+
--path Show full transcript paths
|
|
41
|
+
--json Machine-readable output
|
|
42
|
+
--no-sync Skip the incremental catch-up before querying
|
|
43
|
+
|
|
44
|
+
REGEX OPTIONS
|
|
45
|
+
--regex <pattern> Exact regex search, run by ripgrep over the ORIGINAL
|
|
46
|
+
transcripts instead of the index. It can therefore
|
|
47
|
+
match text the index does not hold at all, notably
|
|
48
|
+
tool output (42% of the bytes, excluded by default),
|
|
49
|
+
and it can match inside identifiers, which FTS5
|
|
50
|
+
cannot. There is no relevance ranking: results are
|
|
51
|
+
ordered by recency. Needs ripgrep installed.
|
|
52
|
+
Every filter above applies, and the candidate files
|
|
53
|
+
come from the index, so ignored and (unless --private)
|
|
54
|
+
private transcripts are still never read.
|
|
55
|
+
-i, --ignore-case Case-insensitive matching (put it AFTER the pattern)
|
|
56
|
+
-F, --fixed Treat the pattern as a literal string, not a regex
|
|
57
|
+
--max-per-file <n> Stop after n matches in one transcript (default ${DEFAULT_MAX_PER_FILE}, 0 = all)
|
|
58
|
+
--max-matches <n> Stop the scan after n matching entries (default ${DEFAULT_MAX_MATCHES})
|
|
59
|
+
|
|
60
|
+
INDEX OPTIONS
|
|
61
|
+
--full Rebuild from scratch
|
|
62
|
+
--tier <t> slim | default | full (overrides config for this run)
|
|
63
|
+
--quiet No progress output
|
|
64
|
+
|
|
65
|
+
QUERY SYNTAX
|
|
66
|
+
The query is an FTS5 MATCH expression: bare words are ANDed, "quoted phrases"
|
|
67
|
+
match in order, OR / NOT / NEAR(a b, 5) work, and trailing * is a prefix.
|
|
68
|
+
If that fails to parse, the query is retried as quoted literal tokens.
|
|
69
|
+
|
|
70
|
+
EXAMPLES
|
|
71
|
+
recall search steering queue --project wherever --since 30d
|
|
72
|
+
recall search '"fork point" OR parentSession' --threads all
|
|
73
|
+
recall search --tool bash --kind bash 'fuser -k'
|
|
74
|
+
recall search --regex 'ERR_[A-Z_]+' --since 30d
|
|
75
|
+
recall search --regex 'handleToolCall(' --fixed --project wherever
|
|
76
|
+
recall sql "select project, count(*) n from file group by 1 order by n desc limit 10"
|
|
77
|
+
`;
|
|
78
|
+
function fail(message) {
|
|
79
|
+
process.stderr.write(`recall: ${message}\n`);
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
function version() {
|
|
83
|
+
try {
|
|
84
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
85
|
+
for (const candidate of [
|
|
86
|
+
path.join(here, '../package.json'),
|
|
87
|
+
path.join(here, '../../package.json'),
|
|
88
|
+
]) {
|
|
89
|
+
if (fs.existsSync(candidate)) {
|
|
90
|
+
return (JSON.parse(fs.readFileSync(candidate, 'utf8'))
|
|
91
|
+
.version ?? '0.0.0');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
/* ignore */
|
|
97
|
+
}
|
|
98
|
+
return '0.0.0';
|
|
99
|
+
}
|
|
100
|
+
/** Accept `30d`, `6h`, `2w`, `3mo`, or anything Date can parse. */
|
|
101
|
+
function parseWhen(value) {
|
|
102
|
+
if (!value)
|
|
103
|
+
return undefined;
|
|
104
|
+
const m = /^(\d+)(mo|[smhdwy])$/.exec(value.trim());
|
|
105
|
+
if (m) {
|
|
106
|
+
const n = Number(m[1]);
|
|
107
|
+
const unit = m[2];
|
|
108
|
+
const ms = unit === 's'
|
|
109
|
+
? 1000
|
|
110
|
+
: unit === 'm'
|
|
111
|
+
? 60_000
|
|
112
|
+
: unit === 'h'
|
|
113
|
+
? 3_600_000
|
|
114
|
+
: unit === 'd'
|
|
115
|
+
? 86_400_000
|
|
116
|
+
: unit === 'w'
|
|
117
|
+
? 604_800_000
|
|
118
|
+
: unit === 'mo'
|
|
119
|
+
? 2_592_000_000
|
|
120
|
+
: 31_536_000_000;
|
|
121
|
+
return new Date(Date.now() - n * ms).toISOString();
|
|
122
|
+
}
|
|
123
|
+
const parsed = Date.parse(value);
|
|
124
|
+
if (Number.isNaN(parsed))
|
|
125
|
+
fail(`cannot understand time "${value}"`);
|
|
126
|
+
return new Date(parsed).toISOString();
|
|
127
|
+
}
|
|
128
|
+
function withTier(config, tier) {
|
|
129
|
+
if (!tier)
|
|
130
|
+
return config;
|
|
131
|
+
if (!TIERS.includes(tier))
|
|
132
|
+
fail(`unknown tier "${tier}" (expected ${TIERS.join(', ')})`);
|
|
133
|
+
return { ...config, tier: tier };
|
|
134
|
+
}
|
|
135
|
+
/** Cheap incremental catch-up so a query is never answered from a stale index. */
|
|
136
|
+
function sync(config, quiet) {
|
|
137
|
+
if (!fs.existsSync(config.dbPath)) {
|
|
138
|
+
fail(`no index at ${tildify(config.dbPath)}. Run \`recall index\` first.`);
|
|
139
|
+
}
|
|
140
|
+
const stats = index({ config, onProgress: () => { } });
|
|
141
|
+
if (!quiet && stats.filesIndexed > 0) {
|
|
142
|
+
process.stderr.write(`recall: synced ${stats.filesIndexed} transcript(s) in ${stats.durationMs}ms\n`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
function cmdIndex(argv) {
|
|
146
|
+
const { values } = parseArgs({
|
|
147
|
+
args: argv,
|
|
148
|
+
options: {
|
|
149
|
+
full: { type: 'boolean', default: false },
|
|
150
|
+
tier: { type: 'string' },
|
|
151
|
+
quiet: { type: 'boolean', default: false },
|
|
152
|
+
json: { type: 'boolean', default: false },
|
|
153
|
+
},
|
|
154
|
+
allowPositionals: false,
|
|
155
|
+
});
|
|
156
|
+
const config = withTier(loadConfig(), values.tier);
|
|
157
|
+
const quiet = Boolean(values.quiet) || Boolean(values.json);
|
|
158
|
+
let lastLine = 0;
|
|
159
|
+
const stats = index({
|
|
160
|
+
config,
|
|
161
|
+
full: Boolean(values.full),
|
|
162
|
+
onProgress: (p) => {
|
|
163
|
+
if (quiet || !process.stderr.isTTY)
|
|
164
|
+
return;
|
|
165
|
+
const now = Date.now();
|
|
166
|
+
if (now - lastLine < 100)
|
|
167
|
+
return;
|
|
168
|
+
lastLine = now;
|
|
169
|
+
process.stderr.write(`\r${p.phase} ${p.done}/${p.total}\u001b[K`);
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
if (!quiet && process.stderr.isTTY)
|
|
173
|
+
process.stderr.write('\r\u001b[K');
|
|
174
|
+
if (values.json) {
|
|
175
|
+
process.stdout.write(JSON.stringify(stats, null, 2) + '\n');
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
const seconds = (stats.durationMs / 1000).toFixed(1);
|
|
179
|
+
process.stdout.write([
|
|
180
|
+
`indexed ${stats.filesIndexed} transcript(s) in ${seconds}s${stats.fullRebuild ? ' (full rebuild)' : ''}`,
|
|
181
|
+
` seen ${stats.filesSeen} · skipped ${stats.filesSkipped} · appended ${stats.filesAppended} · removed ${stats.filesRemoved}`,
|
|
182
|
+
` ignored ${stats.filesIgnored} · private ${stats.filesPrivate} · lineages rebuilt ${stats.lineagesRebuilt}`,
|
|
183
|
+
` entries ${stats.entriesInserted} new, ${stats.entriesShared} inherited by forks · chunks ${stats.chunksInserted}`,
|
|
184
|
+
` index: ${tildify(config.dbPath)}`,
|
|
185
|
+
].join('\n') + '\n');
|
|
186
|
+
}
|
|
187
|
+
/** Flags that only mean something on the regex path. */
|
|
188
|
+
const REGEX_ONLY_FLAGS = [
|
|
189
|
+
'ignore-case',
|
|
190
|
+
'fixed',
|
|
191
|
+
'max-per-file',
|
|
192
|
+
'max-matches',
|
|
193
|
+
];
|
|
194
|
+
/** Flags that only mean something to the full-text ranker. */
|
|
195
|
+
const FTS_ONLY_FLAGS = ['raw', 'no-recency'];
|
|
196
|
+
/** Numeric flags and the smallest value that means anything for each. */
|
|
197
|
+
const NUMERIC_FLAGS = [
|
|
198
|
+
['max-per-file', 0], // 0 is documented as "no per-file cap"
|
|
199
|
+
['max-matches', 1],
|
|
200
|
+
];
|
|
201
|
+
/**
|
|
202
|
+
* Everything about a search that can be judged from the arguments alone.
|
|
203
|
+
*
|
|
204
|
+
* Pure, and exported, so the rules are testable without a process: the whole
|
|
205
|
+
* point of them is to refuse silently-wrong input, and "silently" is exactly
|
|
206
|
+
* what a hand-check misses. `Number('nonsense')` is NaN, and NaN quietly fails
|
|
207
|
+
* every `> 0` guard downstream, so a mistyped cap would REMOVE the bound it was
|
|
208
|
+
* meant to tighten. Those caps are the only thing between a pathological
|
|
209
|
+
* pattern and an unbounded read.
|
|
210
|
+
*/
|
|
211
|
+
export function searchFlagError(given, text, pattern) {
|
|
212
|
+
if (pattern === undefined) {
|
|
213
|
+
if (!text)
|
|
214
|
+
return 'nothing to search for. Try `recall search <words>`';
|
|
215
|
+
const stray = REGEX_ONLY_FLAGS.find((f) => given[f] !== undefined);
|
|
216
|
+
if (stray)
|
|
217
|
+
return `--${stray} only applies to --regex`;
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
if (text)
|
|
221
|
+
return `--regex takes the pattern itself, so "${text}" has nowhere to go. Try \`recall search --regex '${pattern}'\``;
|
|
222
|
+
if (!pattern.trim())
|
|
223
|
+
return '--regex needs a pattern';
|
|
224
|
+
const stray = FTS_ONLY_FLAGS.find((f) => given[f] === true);
|
|
225
|
+
if (stray)
|
|
226
|
+
return `--${stray} applies to full-text ranking, and a regex search has no bm25 to rank with`;
|
|
227
|
+
}
|
|
228
|
+
for (const [flag, min] of NUMERIC_FLAGS) {
|
|
229
|
+
const raw = given[flag];
|
|
230
|
+
if (raw === undefined)
|
|
231
|
+
continue;
|
|
232
|
+
const n = Number(raw);
|
|
233
|
+
if (!Number.isInteger(n) || n < min)
|
|
234
|
+
return `--${flag} needs a whole number ${min} or more, not "${String(raw)}"`;
|
|
235
|
+
}
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
/** One rendered block per hit, or a plain reason there are none. */
|
|
239
|
+
function writeHits(hits, opts, nothing) {
|
|
240
|
+
if (hits.length === 0) {
|
|
241
|
+
process.stdout.write(nothing + '\n');
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
process.stdout.write(hits
|
|
245
|
+
.map((hit) => renderHit(hit, { style: opts.style, showPath: opts.showPath }))
|
|
246
|
+
.join('\n\n') + '\n');
|
|
247
|
+
}
|
|
248
|
+
async function cmdSearch(argv) {
|
|
249
|
+
const { values, positionals } = parseArgs({
|
|
250
|
+
args: argv,
|
|
251
|
+
options: {
|
|
252
|
+
// No defaults on the mode-specific flags: `undefined` is what makes
|
|
253
|
+
// "you passed this to the wrong search" detectable.
|
|
254
|
+
regex: { type: 'string' },
|
|
255
|
+
'ignore-case': { type: 'boolean', short: 'i' },
|
|
256
|
+
fixed: { type: 'boolean', short: 'F' },
|
|
257
|
+
'max-per-file': { type: 'string' },
|
|
258
|
+
'max-matches': { type: 'string' },
|
|
259
|
+
cwd: { type: 'string', multiple: true },
|
|
260
|
+
project: { type: 'string', multiple: true },
|
|
261
|
+
role: { type: 'string', multiple: true },
|
|
262
|
+
tool: { type: 'string', multiple: true },
|
|
263
|
+
kind: { type: 'string', multiple: true },
|
|
264
|
+
since: { type: 'string' },
|
|
265
|
+
until: { type: 'string' },
|
|
266
|
+
limit: { type: 'string', default: '20' },
|
|
267
|
+
threads: { type: 'string', default: '3' },
|
|
268
|
+
private: { type: 'boolean', default: false },
|
|
269
|
+
raw: { type: 'boolean', default: false },
|
|
270
|
+
'no-recency': { type: 'boolean', default: false },
|
|
271
|
+
path: { type: 'boolean', default: false },
|
|
272
|
+
json: { type: 'boolean', default: false },
|
|
273
|
+
'no-sync': { type: 'boolean', default: false },
|
|
274
|
+
},
|
|
275
|
+
allowPositionals: true,
|
|
276
|
+
});
|
|
277
|
+
const text = positionals.join(' ').trim();
|
|
278
|
+
const pattern = values.regex;
|
|
279
|
+
// Everything that can be judged from the arguments alone is judged here,
|
|
280
|
+
// before a config is loaded, an index is synced or a file is opened.
|
|
281
|
+
const given = values;
|
|
282
|
+
const problem = searchFlagError(given, text, pattern);
|
|
283
|
+
if (problem)
|
|
284
|
+
fail(problem);
|
|
285
|
+
const maxPerFile = given['max-per-file'] === undefined
|
|
286
|
+
? DEFAULT_MAX_PER_FILE
|
|
287
|
+
: Number(given['max-per-file']);
|
|
288
|
+
const maxMatches = given['max-matches'] === undefined
|
|
289
|
+
? DEFAULT_MAX_MATCHES
|
|
290
|
+
: Number(given['max-matches']);
|
|
291
|
+
const config = loadConfig();
|
|
292
|
+
if (!values['no-sync'])
|
|
293
|
+
sync(config, Boolean(values.json));
|
|
294
|
+
const db = openDb(config.dbPath, { readOnly: true });
|
|
295
|
+
const threadsRaw = String(values.threads);
|
|
296
|
+
const common = {
|
|
297
|
+
cwd: values.cwd,
|
|
298
|
+
project: values.project,
|
|
299
|
+
role: values.role,
|
|
300
|
+
tool: values.tool,
|
|
301
|
+
kind: values.kind,
|
|
302
|
+
since: parseWhen(values.since),
|
|
303
|
+
until: parseWhen(values.until),
|
|
304
|
+
includePrivate: Boolean(values.private),
|
|
305
|
+
limit: Number(values.limit),
|
|
306
|
+
threadLimit: threadsRaw === 'all' ? -1 : Number(threadsRaw),
|
|
307
|
+
};
|
|
308
|
+
const style = makeStyle(colorsEnabled());
|
|
309
|
+
const render = { style, showPath: Boolean(values.path) };
|
|
310
|
+
const json = (payload) => {
|
|
311
|
+
process.stdout.write(JSON.stringify(payload, null, 2) + '\n');
|
|
312
|
+
};
|
|
313
|
+
const note = (line) => {
|
|
314
|
+
process.stderr.write(style.dim(line + '\n'));
|
|
315
|
+
};
|
|
316
|
+
try {
|
|
317
|
+
if (pattern !== undefined) {
|
|
318
|
+
const outcome = await regexSearch(db, {
|
|
319
|
+
...common,
|
|
320
|
+
pattern,
|
|
321
|
+
ignoreCase: Boolean(values['ignore-case']),
|
|
322
|
+
fixed: Boolean(values.fixed),
|
|
323
|
+
maxPerFile,
|
|
324
|
+
maxMatches,
|
|
325
|
+
});
|
|
326
|
+
if (values.json)
|
|
327
|
+
return json(outcome);
|
|
328
|
+
writeHits(outcome.hits, render, `no matches in ${outcome.filesSearched} transcript(s)`);
|
|
329
|
+
if (outcome.truncated)
|
|
330
|
+
note(`(stopped at ${maxMatches} matching entries; narrow the pattern or raise --max-matches)`);
|
|
331
|
+
// The index is caught up before the query, so this means the transcripts
|
|
332
|
+
// moved underneath it: worth saying, since those lines were skipped.
|
|
333
|
+
if (outcome.unresolved > 0)
|
|
334
|
+
note(`(${outcome.unresolved} matching line(s) are not in the index yet; \`recall index\` will pick them up)`);
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
const outcome = search(db, {
|
|
338
|
+
...common,
|
|
339
|
+
text,
|
|
340
|
+
noRecency: Boolean(values['no-recency']),
|
|
341
|
+
raw: Boolean(values.raw),
|
|
342
|
+
});
|
|
343
|
+
if (values.json)
|
|
344
|
+
return json(outcome);
|
|
345
|
+
if (outcome.quotedFallback)
|
|
346
|
+
note(`(query retried as literal tokens: ${outcome.usedQuery})`);
|
|
347
|
+
writeHits(outcome.hits, render, 'no matches');
|
|
348
|
+
}
|
|
349
|
+
finally {
|
|
350
|
+
db.close();
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
function cmdShow(argv) {
|
|
354
|
+
const { values, positionals } = parseArgs({
|
|
355
|
+
args: argv,
|
|
356
|
+
options: {
|
|
357
|
+
from: { type: 'string', default: '0' },
|
|
358
|
+
limit: { type: 'string', default: '40' },
|
|
359
|
+
full: { type: 'boolean', default: false },
|
|
360
|
+
json: { type: 'boolean', default: false },
|
|
361
|
+
},
|
|
362
|
+
allowPositionals: true,
|
|
363
|
+
});
|
|
364
|
+
const ref = positionals[0];
|
|
365
|
+
if (!ref)
|
|
366
|
+
fail('which thread? Pass a file id, a session uuid prefix, a name, or a path');
|
|
367
|
+
const config = loadConfig();
|
|
368
|
+
const db = openDb(config.dbPath, { readOnly: true });
|
|
369
|
+
const thread = resolveThread(db, ref);
|
|
370
|
+
if (!thread)
|
|
371
|
+
fail(`no thread matching "${ref}"`);
|
|
372
|
+
const entries = readThread(db, Number(thread.id), Number(values.from), Number(values.limit));
|
|
373
|
+
if (values.json) {
|
|
374
|
+
process.stdout.write(JSON.stringify({ thread, entries }, null, 2) + '\n');
|
|
375
|
+
db.close();
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
const style = makeStyle(colorsEnabled());
|
|
379
|
+
const header = [
|
|
380
|
+
style.bold(thread.name ?? thread.project ?? String(thread.id)),
|
|
381
|
+
style.dim(tildify(thread.cwd ?? '')),
|
|
382
|
+
style.dim(`${thread.entry_count} entries`),
|
|
383
|
+
style.dim(`last ${relativeTime(thread.last_activity)}`),
|
|
384
|
+
].join(' · ');
|
|
385
|
+
process.stdout.write(header + '\n' + style.dim(tildify(thread.path)) + '\n\n');
|
|
386
|
+
const indent = (text) => text
|
|
387
|
+
.split('\n')
|
|
388
|
+
.map((l) => ' ' + l)
|
|
389
|
+
.join('\n');
|
|
390
|
+
for (const entry of entries) {
|
|
391
|
+
const marks = [
|
|
392
|
+
style.label(entry.role + (entry.tool ? `:${entry.tool}` : '')),
|
|
393
|
+
];
|
|
394
|
+
if (entry.shared)
|
|
395
|
+
marks.push(style.dim('(inherited)'));
|
|
396
|
+
process.stdout.write(`${style.dim(String(entry.seq).padStart(4))} ${marks.join(' ')}\n`);
|
|
397
|
+
if (values.full && entry.ownerPath) {
|
|
398
|
+
// Full fidelity means going back to the transcript: the index keeps tool
|
|
399
|
+
// output truncated (or absent), by design, and the byte range is the pointer.
|
|
400
|
+
const raw = readRawEntry(entry.ownerPath, entry.byteOffset, entry.byteLength);
|
|
401
|
+
if (raw !== null) {
|
|
402
|
+
process.stdout.write(indent(JSON.stringify(raw, null, 2)) + '\n');
|
|
403
|
+
continue;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
for (const t of entry.texts) {
|
|
407
|
+
const body = t.text.length > 2000 ? t.text.slice(0, 2000) + ' …' : t.text;
|
|
408
|
+
process.stdout.write(indent(body) + '\n');
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
db.close();
|
|
412
|
+
}
|
|
413
|
+
function cmdSql(argv) {
|
|
414
|
+
const { values, positionals } = parseArgs({
|
|
415
|
+
args: argv,
|
|
416
|
+
options: {
|
|
417
|
+
json: { type: 'boolean', default: false },
|
|
418
|
+
limit: { type: 'string', default: '200' },
|
|
419
|
+
},
|
|
420
|
+
allowPositionals: true,
|
|
421
|
+
});
|
|
422
|
+
const sql = positionals.join(' ').trim();
|
|
423
|
+
if (!sql)
|
|
424
|
+
fail('no SQL given');
|
|
425
|
+
const config = loadConfig();
|
|
426
|
+
const db = openDb(config.dbPath, { readOnly: true });
|
|
427
|
+
let rows;
|
|
428
|
+
try {
|
|
429
|
+
rows = db.prepare(sql).all();
|
|
430
|
+
}
|
|
431
|
+
catch (err) {
|
|
432
|
+
db.close();
|
|
433
|
+
fail(err.message);
|
|
434
|
+
}
|
|
435
|
+
const capped = rows.slice(0, Number(values.limit));
|
|
436
|
+
if (values.json)
|
|
437
|
+
process.stdout.write(JSON.stringify(capped, null, 2) + '\n');
|
|
438
|
+
else {
|
|
439
|
+
process.stdout.write(renderTable(capped) + '\n');
|
|
440
|
+
if (rows.length > capped.length) {
|
|
441
|
+
process.stdout.write(`(${rows.length - capped.length} more rows, raise --limit)\n`);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
db.close();
|
|
445
|
+
}
|
|
446
|
+
function cmdStats(argv) {
|
|
447
|
+
const { values } = parseArgs({
|
|
448
|
+
args: argv,
|
|
449
|
+
options: { json: { type: 'boolean', default: false } },
|
|
450
|
+
allowPositionals: false,
|
|
451
|
+
});
|
|
452
|
+
const config = loadConfig();
|
|
453
|
+
const db = openDb(config.dbPath, { readOnly: true });
|
|
454
|
+
const stats = indexStats(db);
|
|
455
|
+
const indexedAt = getMeta(db, 'indexed_at');
|
|
456
|
+
const tier = getMeta(db, 'tier');
|
|
457
|
+
const size = fs.existsSync(config.dbPath)
|
|
458
|
+
? fs.statSync(config.dbPath).size
|
|
459
|
+
: 0;
|
|
460
|
+
const payload = {
|
|
461
|
+
...stats,
|
|
462
|
+
tier,
|
|
463
|
+
indexedAt: indexedAt ? new Date(Number(indexedAt)).toISOString() : null,
|
|
464
|
+
dbBytes: size,
|
|
465
|
+
};
|
|
466
|
+
if (values.json) {
|
|
467
|
+
process.stdout.write(JSON.stringify(payload, null, 2) + '\n');
|
|
468
|
+
db.close();
|
|
469
|
+
return;
|
|
470
|
+
}
|
|
471
|
+
const style = makeStyle(colorsEnabled());
|
|
472
|
+
process.stdout.write([
|
|
473
|
+
`${style.bold(String(stats.files))} transcripts · ${stats.lineages} lineages · ${stats.forks} forks`,
|
|
474
|
+
`${stats.entries} entries · ${stats.memberships} memberships · ${stats.chunks} chunks`,
|
|
475
|
+
`${stats.projects} projects · ${stats.privateFiles} private · ${stats.orphans} orphaned`,
|
|
476
|
+
`span ${String(stats.oldest).slice(0, 10)} → ${String(stats.newest).slice(0, 10)}`,
|
|
477
|
+
`tier ${tier} · db ${(size / 1e6).toFixed(1)} MB · updated ${relativeTime(payload.indexedAt)}`,
|
|
478
|
+
style.dim(tildify(config.dbPath)),
|
|
479
|
+
].join('\n') + '\n');
|
|
480
|
+
db.close();
|
|
481
|
+
}
|
|
482
|
+
function cmdConfig(argv) {
|
|
483
|
+
const { values } = parseArgs({
|
|
484
|
+
args: argv,
|
|
485
|
+
options: {
|
|
486
|
+
init: { type: 'boolean', default: false },
|
|
487
|
+
json: { type: 'boolean', default: false },
|
|
488
|
+
},
|
|
489
|
+
allowPositionals: false,
|
|
490
|
+
});
|
|
491
|
+
const config = loadConfig();
|
|
492
|
+
if (values.init) {
|
|
493
|
+
const written = writeStarterConfig(config);
|
|
494
|
+
process.stdout.write(`config: ${tildify(written)}\n`);
|
|
495
|
+
return;
|
|
496
|
+
}
|
|
497
|
+
if (values.json) {
|
|
498
|
+
process.stdout.write(JSON.stringify(config, null, 2) + '\n');
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
process.stdout.write([
|
|
502
|
+
`config ${tildify(config.configPath)}${config.loaded ? '' : ' (not created yet, using defaults)'}`,
|
|
503
|
+
`index ${tildify(config.dbPath)}`,
|
|
504
|
+
`tier ${config.tier}`,
|
|
505
|
+
`sources ${config.sources.map((s) => `${s.id}:${tildify(s.root)}`).join(', ')}`,
|
|
506
|
+
`ignore ${config.ignore.join(', ') || '(none)'}`,
|
|
507
|
+
`private ${config.private.join(', ') || '(none)'}`,
|
|
508
|
+
].join('\n') + '\n');
|
|
509
|
+
}
|
|
510
|
+
async function main() {
|
|
511
|
+
const argv = process.argv.slice(2);
|
|
512
|
+
const command = argv[0];
|
|
513
|
+
const rest = argv.slice(1);
|
|
514
|
+
switch (command) {
|
|
515
|
+
case 'index':
|
|
516
|
+
return cmdIndex(rest);
|
|
517
|
+
case 'search':
|
|
518
|
+
case 's':
|
|
519
|
+
return cmdSearch(rest);
|
|
520
|
+
case 'show':
|
|
521
|
+
return cmdShow(rest);
|
|
522
|
+
case 'sql':
|
|
523
|
+
return cmdSql(rest);
|
|
524
|
+
case 'stats':
|
|
525
|
+
return cmdStats(rest);
|
|
526
|
+
case 'config':
|
|
527
|
+
return cmdConfig(rest);
|
|
528
|
+
case '--version':
|
|
529
|
+
case '-v':
|
|
530
|
+
process.stdout.write(version() + '\n');
|
|
531
|
+
return;
|
|
532
|
+
case undefined:
|
|
533
|
+
case 'help':
|
|
534
|
+
case '--help':
|
|
535
|
+
case '-h':
|
|
536
|
+
process.stdout.write(USAGE);
|
|
537
|
+
return;
|
|
538
|
+
default:
|
|
539
|
+
fail(`unknown command "${command}". Try \`recall help\``);
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
/** Entry point. Loaded dynamically by `cli.ts`, see the note there. */
|
|
543
|
+
export async function run() {
|
|
544
|
+
try {
|
|
545
|
+
await main();
|
|
546
|
+
}
|
|
547
|
+
catch (err) {
|
|
548
|
+
fail(err.message);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
//# sourceMappingURL=cli-main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-main.js","sourceRoot":"","sources":["../src/cli-main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAC,aAAa,EAAC,MAAM,UAAU,CAAC;AACvC,OAAO,EAAC,SAAS,EAAC,MAAM,WAAW,CAAC;AACpC,OAAO,EAAC,UAAU,EAAE,kBAAkB,EAAc,MAAM,aAAa,CAAC;AACxE,OAAO,EAAC,OAAO,EAAE,MAAM,EAAC,MAAM,SAAS,CAAC;AACxC,OAAO,EACN,aAAa,EACb,SAAS,EACT,SAAS,EACT,WAAW,EACX,YAAY,EACZ,OAAO,GAEP,MAAM,aAAa,CAAC;AACrB,OAAO,EAAC,KAAK,EAAC,MAAM,cAAc,CAAC;AACnC,OAAO,EAAC,KAAK,EAA4C,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EACN,mBAAmB,EACnB,oBAAoB,EACpB,WAAW,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAC,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAC,MAAM,aAAa,CAAC;AAE1E,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2EA4C6D,oBAAoB;2EACpB,mBAAmB;;;;;;;;;;;;;;;;;;;CAmB7F,CAAC;AAEF,SAAS,IAAI,CAAC,OAAe;IAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,OAAO,IAAI,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,OAAO;IACf,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,KAAK,MAAM,SAAS,IAAI;YACvB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC;SACrC,EAAE,CAAC;YACH,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9B,OAAO,CACL,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAwB;qBACpE,OAAO,IAAI,OAAO,CACpB,CAAC;YACH,CAAC;QACF,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,YAAY;IACb,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,mEAAmE;AACnE,SAAS,SAAS,CAAC,KAAyB;IAC3C,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,CAAC,GAAG,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACpD,IAAI,CAAC,EAAE,CAAC;QACP,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClB,MAAM,EAAE,GACP,IAAI,KAAK,GAAG;YACX,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,IAAI,KAAK,GAAG;gBACb,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,IAAI,KAAK,GAAG;oBACb,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,IAAI,KAAK,GAAG;wBACb,CAAC,CAAC,UAAU;wBACZ,CAAC,CAAC,IAAI,KAAK,GAAG;4BACb,CAAC,CAAC,WAAW;4BACb,CAAC,CAAC,IAAI,KAAK,IAAI;gCACd,CAAC,CAAC,aAAa;gCACf,CAAC,CAAC,cAAc,CAAC;QACxB,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QAAE,IAAI,CAAC,2BAA2B,KAAK,GAAG,CAAC,CAAC;IACpE,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc,EAAE,IAAwB;IACzD,IAAI,CAAC,IAAI;QAAE,OAAO,MAAM,CAAC;IACzB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAY,CAAC;QAChC,IAAI,CAAC,iBAAiB,IAAI,eAAe,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/D,OAAO,EAAC,GAAG,MAAM,EAAE,IAAI,EAAE,IAAY,EAAC,CAAC;AACxC,CAAC;AAED,kFAAkF;AAClF,SAAS,IAAI,CAAC,MAAc,EAAE,KAAc;IAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,eAAe,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,EAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC,EAAC,CAAC,CAAC;IACpD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB,kBAAkB,KAAK,CAAC,YAAY,qBAAqB,KAAK,CAAC,UAAU,MAAM,CAC/E,CAAC;IACH,CAAC;AACF,CAAC;AAED,SAAS,QAAQ,CAAC,IAAc;IAC/B,MAAM,EAAC,MAAM,EAAC,GAAG,SAAS,CAAC;QAC1B,IAAI,EAAE,IAAI;QACV,OAAO,EAAE;YACR,IAAI,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAC;YACvC,IAAI,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAC;YACtB,KAAK,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAC;YACxC,IAAI,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAC;SACvC;QACD,gBAAgB,EAAE,KAAK;KACvB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,IAA0B,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5D,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,MAAM,KAAK,GAAG,KAAK,CAAC;QACnB,MAAM;QACN,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;QAC1B,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE;YACjB,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;gBAAE,OAAO;YAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,GAAG,GAAG,QAAQ,GAAG,GAAG;gBAAE,OAAO;YACjC,QAAQ,GAAG,GAAG,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC;QACnE,CAAC;KACD,CAAC,CAAC;IACH,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACvE,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC5D,OAAO;IACR,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB;QACC,WAAW,KAAK,CAAC,YAAY,qBAAqB,OAAO,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE;QACzG,UAAU,KAAK,CAAC,SAAS,cAAc,KAAK,CAAC,YAAY,eAAe,KAAK,CAAC,aAAa,cAAc,KAAK,CAAC,YAAY,EAAE;QAC7H,aAAa,KAAK,CAAC,YAAY,cAAc,KAAK,CAAC,YAAY,uBAAuB,KAAK,CAAC,eAAe,EAAE;QAC7G,aAAa,KAAK,CAAC,eAAe,SAAS,KAAK,CAAC,aAAa,gCAAgC,KAAK,CAAC,cAAc,EAAE;QACpH,YAAY,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;KACpC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CACnB,CAAC;AACH,CAAC;AAED,wDAAwD;AACxD,MAAM,gBAAgB,GAAG;IACxB,aAAa;IACb,OAAO;IACP,cAAc;IACd,aAAa;CACb,CAAC;AACF,8DAA8D;AAC9D,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;AAE7C,yEAAyE;AACzE,MAAM,aAAa,GAA4B;IAC9C,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,uCAAuC;IAC5D,CAAC,aAAa,EAAE,CAAC,CAAC;CAClB,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAC9B,KAA8B,EAC9B,IAAY,EACZ,OAA2B;IAE3B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI;YAAE,OAAO,oDAAoD,CAAC;QACvE,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QACnE,IAAI,KAAK;YAAE,OAAO,KAAK,KAAK,0BAA0B,CAAC;IACxD,CAAC;SAAM,CAAC;QACP,IAAI,IAAI;YACP,OAAO,yCAAyC,IAAI,qDAAqD,OAAO,KAAK,CAAC;QACvH,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YAAE,OAAO,yBAAyB,CAAC;QACtD,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAC5D,IAAI,KAAK;YACR,OAAO,KAAK,KAAK,4EAA4E,CAAC;IAChG,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,aAAa,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,GAAG,KAAK,SAAS;YAAE,SAAS;QAChC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG;YAClC,OAAO,KAAK,IAAI,yBAAyB,GAAG,kBAAkB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;IAC/E,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,oEAAoE;AACpE,SAAS,SAAS,CACjB,IAAiB,EACjB,IAAuC,EACvC,OAAe;IAEf,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QACrC,OAAO;IACR,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB,IAAI;SACF,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACZ,SAAS,CAAC,GAAG,EAAE,EAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAC,CAAC,CAC5D;SACA,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CACrB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,EAAC,MAAM,EAAE,WAAW,EAAC,GAAG,SAAS,CAAC;QACvC,IAAI,EAAE,IAAI;QACV,OAAO,EAAE;YACR,oEAAoE;YACpE,oDAAoD;YACpD,KAAK,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAC;YACvB,aAAa,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAC;YAC5C,KAAK,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAC;YACpC,cAAc,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAC;YAChC,aAAa,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAC;YAC/B,GAAG,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAC;YACrC,OAAO,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAC;YACzC,IAAI,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAC;YACtC,IAAI,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAC;YACtC,IAAI,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAC;YACtC,KAAK,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAC;YACvB,KAAK,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAC;YACvB,KAAK,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAC;YACtC,OAAO,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAC;YACvC,OAAO,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAC;YAC1C,GAAG,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAC;YACtC,YAAY,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAC;YAC/C,IAAI,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAC;YACvC,IAAI,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAC;YACvC,SAAS,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAC;SAC5C;QACD,gBAAgB,EAAE,IAAI;KACtB,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,KAA2B,CAAC;IAEnD,yEAAyE;IACzE,qEAAqE;IACrE,MAAM,KAAK,GAAG,MAAiC,CAAC;IAChD,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACtD,IAAI,OAAO;QAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,MAAM,UAAU,GACf,KAAK,CAAC,cAAc,CAAC,KAAK,SAAS;QAClC,CAAC,CAAC,oBAAoB;QACtB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;IAClC,MAAM,UAAU,GACf,KAAK,CAAC,aAAa,CAAC,KAAK,SAAS;QACjC,CAAC,CAAC,mBAAmB;QACrB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;IAEjC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAE3D,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG;QACd,GAAG,EAAE,MAAM,CAAC,GAA2B;QACvC,OAAO,EAAE,MAAM,CAAC,OAA+B;QAC/C,IAAI,EAAE,MAAM,CAAC,IAA4B;QACzC,IAAI,EAAE,MAAM,CAAC,IAA4B;QACzC,IAAI,EAAE,MAAM,CAAC,IAA+B;QAC5C,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,KAA2B,CAAC;QACpD,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,KAA2B,CAAC;QACpD,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;QACvC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;QAC3B,WAAW,EAAE,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;KAC3D,CAAC;IACF,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,EAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAC,CAAC;IACvD,MAAM,IAAI,GAAG,CAAC,OAAgB,EAAQ,EAAE;QACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/D,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,CAAC,IAAY,EAAQ,EAAE;QACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC;IAEF,IAAI,CAAC;QACJ,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,EAAE,EAAE;gBACrC,GAAG,MAAM;gBACT,OAAO;gBACP,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;gBAC1C,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC5B,UAAU;gBACV,UAAU;aACV,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;YACtC,SAAS,CACR,OAAO,CAAC,IAAI,EACZ,MAAM,EACN,iBAAiB,OAAO,CAAC,aAAa,gBAAgB,CACtD,CAAC;YACF,IAAI,OAAO,CAAC,SAAS;gBACpB,IAAI,CACH,eAAe,UAAU,+DAA+D,CACxF,CAAC;YACH,yEAAyE;YACzE,qEAAqE;YACrE,IAAI,OAAO,CAAC,UAAU,GAAG,CAAC;gBACzB,IAAI,CACH,IAAI,OAAO,CAAC,UAAU,iFAAiF,CACvG,CAAC;YACH,OAAO;QACR,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,EAAE;YAC1B,GAAG,MAAM;YACT,IAAI;YACJ,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACxC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;SACxB,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,OAAO,CAAC,cAAc;YACzB,IAAI,CAAC,qCAAqC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;QACjE,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IAC/C,CAAC;YAAS,CAAC;QACV,EAAE,CAAC,KAAK,EAAE,CAAC;IACZ,CAAC;AACF,CAAC;AAED,SAAS,OAAO,CAAC,IAAc;IAC9B,MAAM,EAAC,MAAM,EAAE,WAAW,EAAC,GAAG,SAAS,CAAC;QACvC,IAAI,EAAE,IAAI;QACV,OAAO,EAAE;YACR,IAAI,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAC;YACpC,KAAK,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAC;YACtC,IAAI,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAC;YACvC,IAAI,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAC;SACvC;QACD,gBAAgB,EAAE,IAAI;KACtB,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,GAAG;QACP,IAAI,CACH,wEAAwE,CACxE,CAAC;IAEH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM;QAAE,IAAI,CAAC,uBAAuB,GAAG,GAAG,CAAC,CAAC;IAEjD,MAAM,OAAO,GAAG,UAAU,CACzB,EAAE,EACF,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EACjB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EACnB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CACpB,CAAC;IACF,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAC,MAAM,EAAE,OAAO,EAAC,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACxE,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;IACR,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG;QACd,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC9D,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QACpC,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,WAAW,UAAU,CAAC;QAC1C,KAAK,CAAC,GAAG,CAAC,QAAQ,YAAY,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;KACvD,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACd,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CACxD,CAAC;IAEF,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAC/B,IAAI;SACF,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC;SACvB,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG;YACb,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SAC9D,CAAC;QACF,IAAI,KAAK,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAClE,CAAC;QACF,IAAI,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpC,yEAAyE;YACzE,8EAA8E;YAC9E,MAAM,GAAG,GAAG,YAAY,CACvB,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,UAAU,CAChB,CAAC;YACF,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;gBAClE,SAAS;YACV,CAAC;QACF,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC1E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3C,CAAC;IACF,CAAC;IACD,EAAE,CAAC,KAAK,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,MAAM,CAAC,IAAc;IAC7B,MAAM,EAAC,MAAM,EAAE,WAAW,EAAC,GAAG,SAAS,CAAC;QACvC,IAAI,EAAE,IAAI;QACV,OAAO,EAAE;YACR,IAAI,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAC;YACvC,KAAK,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAC;SACvC;QACD,gBAAgB,EAAE,IAAI;KACtB,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,CAAC,GAAG;QAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC,CAAC;IACnD,IAAI,IAAoC,CAAC;IACzC,IAAI,CAAC;QACJ,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAA+C,CAAC;IAC3E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACnD,IAAI,MAAM,CAAC,IAAI;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;SACzE,CAAC;QACL,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;QACjD,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,8BAA8B,CAC7D,CAAC;QACH,CAAC;IACF,CAAC;IACD,EAAE,CAAC,KAAK,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,QAAQ,CAAC,IAAc;IAC/B,MAAM,EAAC,MAAM,EAAC,GAAG,SAAS,CAAC;QAC1B,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,EAAC,IAAI,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAC,EAAC;QAClD,gBAAgB,EAAE,KAAK;KACvB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IAC7B,MAAM,SAAS,GAAG,OAAO,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;QACxC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI;QACjC,CAAC,CAAC,CAAC,CAAC;IACL,MAAM,OAAO,GAAG;QACf,GAAG,KAAK;QACR,IAAI;QACJ,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;QACvE,OAAO,EAAE,IAAI;KACb,CAAC;IACF,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC9D,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;IACR,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB;QACC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,kBAAkB,KAAK,CAAC,QAAQ,eAAe,KAAK,CAAC,KAAK,QAAQ;QACpG,GAAG,KAAK,CAAC,OAAO,cAAc,KAAK,CAAC,WAAW,kBAAkB,KAAK,CAAC,MAAM,SAAS;QACtF,GAAG,KAAK,CAAC,QAAQ,eAAe,KAAK,CAAC,YAAY,cAAc,KAAK,CAAC,OAAO,WAAW;QACxF,QAAQ,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;QAClF,QAAQ,IAAI,SAAS,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;QAC9F,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;KACjC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CACnB,CAAC;IACF,EAAE,CAAC,KAAK,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,SAAS,CAAC,IAAc;IAChC,MAAM,EAAC,MAAM,EAAC,GAAG,SAAS,CAAC;QAC1B,IAAI,EAAE,IAAI;QACV,OAAO,EAAE;YACR,IAAI,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAC;YACvC,IAAI,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAC;SACvC;QACD,gBAAgB,EAAE,KAAK;KACvB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACtD,OAAO;IACR,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC7D,OAAO;IACR,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB;QACC,YAAY,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,oCAAoC,EAAE;QACpG,YAAY,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;QACpC,YAAY,MAAM,CAAC,IAAI,EAAE;QACzB,YAAY,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAChF,YAAY,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE;QAClD,YAAY,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE;KACnD,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IAClB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,QAAQ,OAAO,EAAE,CAAC;QACjB,KAAK,OAAO;YACX,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;QACvB,KAAK,QAAQ,CAAC;QACd,KAAK,GAAG;YACP,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;QACxB,KAAK,MAAM;YACV,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;QACtB,KAAK,KAAK;YACT,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;QACrB,KAAK,OAAO;YACX,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;QACvB,KAAK,QAAQ;YACZ,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;QACxB,KAAK,WAAW,CAAC;QACjB,KAAK,IAAI;YACR,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;YACvC,OAAO;QACR,KAAK,SAAS,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACR,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC5B,OAAO;QACR;YACC,IAAI,CAAC,oBAAoB,OAAO,wBAAwB,CAAC,CAAC;IAC5D,CAAC;AACF,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,GAAG;IACxB,IAAI,CAAC;QACJ,MAAM,IAAI,EAAE,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAI,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;AACF,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { silenceSqliteWarning } from './quiet.js';
|
|
3
|
+
/**
|
|
4
|
+
* Launcher, deliberately thin.
|
|
5
|
+
*
|
|
6
|
+
* `node:sqlite` prints an ExperimentalWarning the moment it is LOADED, and ES
|
|
7
|
+
* modules load the whole graph before any module body runs. So a static import
|
|
8
|
+
* of anything that touches sqlite would emit the warning before the filter
|
|
9
|
+
* could be installed, no matter where the call sits. Installing the filter here
|
|
10
|
+
* and pulling the real CLI in dynamically is what keeps two lines of noise off
|
|
11
|
+
* every single invocation.
|
|
12
|
+
*/
|
|
13
|
+
silenceSqliteWarning();
|
|
14
|
+
const { run } = await import('./cli-main.js');
|
|
15
|
+
await run();
|
|
16
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAC,oBAAoB,EAAC,MAAM,YAAY,CAAC;AAEhD;;;;;;;;;GASG;AACH,oBAAoB,EAAE,CAAC;AAEvB,MAAM,EAAC,GAAG,EAAC,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;AAC5C,MAAM,GAAG,EAAE,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Tier } from './model.js';
|
|
2
|
+
export interface SourceConfig {
|
|
3
|
+
/** Short label stored on every file row, so multi-source indexes stay legible. */
|
|
4
|
+
id: string;
|
|
5
|
+
/** Only `pi` for now. The adapter seam is here so other agents can be added. */
|
|
6
|
+
kind: 'pi';
|
|
7
|
+
root: string;
|
|
8
|
+
}
|
|
9
|
+
export interface Config {
|
|
10
|
+
sources: SourceConfig[];
|
|
11
|
+
/** cwd globs that are never read, never stored. */
|
|
12
|
+
ignore: string[];
|
|
13
|
+
/** cwd globs that are indexed but hidden from agents unless asked for. */
|
|
14
|
+
private: string[];
|
|
15
|
+
tier: Tier;
|
|
16
|
+
/** Bytes kept per tool result (tier `full` only). */
|
|
17
|
+
toolResultHeadBytes: number;
|
|
18
|
+
/** Bytes kept per tool call argument blob. */
|
|
19
|
+
toolArgsHeadBytes: number;
|
|
20
|
+
configDir: string;
|
|
21
|
+
dataDir: string;
|
|
22
|
+
dbPath: string;
|
|
23
|
+
configPath: string;
|
|
24
|
+
/** True when a config file was actually found on disk. */
|
|
25
|
+
loaded: boolean;
|
|
26
|
+
}
|
|
27
|
+
export declare const DEFAULT_TIER: Tier;
|
|
28
|
+
export declare function defaultConfigDir(env?: NodeJS.ProcessEnv): string;
|
|
29
|
+
export declare function defaultDataDir(env?: NodeJS.ProcessEnv): string;
|
|
30
|
+
export declare function defaultSources(): SourceConfig[];
|
|
31
|
+
/**
|
|
32
|
+
* Load config, filling in defaults. Every path is resolved here so nothing
|
|
33
|
+
* downstream ever has to think about `~` or XDG again.
|
|
34
|
+
*/
|
|
35
|
+
export declare function loadConfig(env?: NodeJS.ProcessEnv): Config;
|
|
36
|
+
/** Write a starter config, never clobbering an existing one. */
|
|
37
|
+
export declare function writeStarterConfig(config: Config): string;
|
|
38
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,YAAY,CAAC;AAGrC,MAAM,WAAW,YAAY;IAC5B,kFAAkF;IAClF,EAAE,EAAE,MAAM,CAAC;IACX,gFAAgF;IAChF,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,MAAM;IACtB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,mDAAmD;IACnD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,IAAI,CAAC;IACX,qDAAqD;IACrD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,8CAA8C;IAC9C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,MAAM,EAAE,OAAO,CAAC;CAChB;AAED,eAAO,MAAM,YAAY,EAAE,IAAgB,CAAC;AAQ5C,wBAAgB,gBAAgB,CAAC,GAAG,oBAAc,GAAG,MAAM,CAG1D;AAED,wBAAgB,cAAc,CAAC,GAAG,oBAAc,GAAG,MAAM,CAGxD;AAED,wBAAgB,cAAc,IAAI,YAAY,EAAE,CAI/C;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,oBAAc,GAAG,MAAM,CA+CpD;AAED,gEAAgE;AAChE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAiBzD"}
|