















@@ -11,7 +11,7 @@ const DEFAULT_ENTRY_MAX_CHARS = 6000;
11111212function usage() {
1313console.log(`Usage:
14- agent-transcript find --query TEXT [--cwd PATH] [--since-days N] [--root PATH...]
14+ agent-transcript find --query TEXT [--cwd PATH] [--since-days N] [--max-files N] [--root PATH...]
1515 agent-transcript render --session FILE [--out FILE] [--max-chars N] [--entry-max-chars N] [--title TEXT] [--url URL]
1616 agent-transcript preview --session FILE [--out FILE] [--max-chars N] [--entry-max-chars N] [--title TEXT] [--url URL]
1717 agent-transcript append-body --body FILE --session FILE [--out FILE] [--max-chars N] [--entry-max-chars N]
@@ -425,17 +425,14 @@ function readBoundedText(file, maxBytes = 220000) {
425425}
426426}
427427428-function sessionScanRecord(file) {
428+function sessionScanRecord(file, maxBytes) {
429429const stat = fs.statSync(file);
430-let agent = "agent";
431-try {
432-agent = detectAgent(file, readJsonl(file, 50));
433-} catch {}
430+const agent = detectAgent(file, []);
434431return {
435432 file,
436433 agent,
437434mtime: new Date(stat.mtimeMs).toISOString(),
438-haystack: `${file}\n${readBoundedText(file)}`.toLowerCase(),
435+haystack: `${file}\n${readBoundedText(file, maxBytes)}`.toLowerCase(),
439436};
440437}
441438@@ -461,6 +458,25 @@ function scoreScanRecord(record, terms, cwd) {
461458return { file: record.file, score, reasons, mtime: record.mtime, agent: record.agent };
462459}
463460461+function recentFiles(files, maxFiles) {
462+return files
463+.map((file) => {
464+try {
465+return { file, mtimeMs: fs.statSync(file).mtimeMs };
466+} catch {
467+return null;
468+}
469+})
470+.filter(Boolean)
471+.sort((a, b) => b.mtimeMs - a.mtimeMs)
472+.slice(0, maxFiles)
473+.map((entry) => entry.file);
474+}
475+476+function candidateFiles(roots, terms, sinceMs, options = {}) {
477+return recentFiles(roots.flatMap((root) => walkJsonl(root, sinceMs)), Number(options["max-files"] || 400));
478+}
479+464480function findSessions(options) {
465481const sinceDays = Number(options["since-days"] || 14);
466482const sinceMs = Date.now() - sinceDays * 24 * 60 * 60 * 1000;
@@ -470,9 +486,10 @@ function findSessions(options) {
470486.split(/\s+/)
471487.concat(query.match(/https?:\/\/\S+/g) || [])
472488.filter(Boolean);
473-const files = roots.flatMap((root) => walkJsonl(root, sinceMs));
489+const files = candidateFiles(roots, terms, sinceMs, options);
490+const scanBytes = Number(options["scan-bytes"] || 60000);
474491const results = files
475-.map((file) => scoreScanRecord(sessionScanRecord(file), terms, options.cwd))
492+.map((file) => scoreScanRecord(sessionScanRecord(file, scanBytes), terms, options.cwd))
476493.filter((result) => result.score > 0)
477494.sort((a, b) => b.score - a.score || b.mtime.localeCompare(a.mtime))
478495.slice(0, Number(options.limit || 10));
@@ -487,7 +504,7 @@ function sessionScanRecords(options) {
487504return roots
488505.flatMap((root) => walkJsonl(root, sinceMs))
489506.filter((file) => !excluded.has(path.resolve(file)))
490-.map(sessionScanRecord);
507+.map((file) => sessionScanRecord(file, Number(options["scan-bytes"] || 90000)));
491508}
492509493510function replaceSection(body, section) {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。