Repository navigation
Expand file tree
/
Copy pathsync.ts
More file actions
41 lines (39 loc) · 1.94 KB
/
Copy pathsync.ts
File metadata and controls
41 lines (39 loc) · 1.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// srelay sync:一次性增量捕获 + 判定(方针 §8.1)
import { loadConfig } from '../shared/config.js';
import { requireRoot, pc } from './ui.js';
import { runSync } from '../capture/sync.js';
import { runJudge } from '../capture/judge.js';
import { openRelayDb } from './ui.js';
export async function cmdSync(opts: { backfill?: string; json?: boolean }): Promise<void> {
const root = requireRoot();
const cfg = loadConfig(root);
const db = openRelayDb(root);
try {
if (cfg.capture.mode === 'off') {
console.log(pc.yellow('当前捕获模式为 off(零自动写入)。如需恢复:srelay mode full'));
return;
}
const backfillDays = opts.backfill ? parseDays(opts.backfill) : undefined;
const s = await runSync({ projectRoot: root, config: cfg, db, backfillDays });
const j = runJudge(db, {
projectId: cfg.identity.project_id ?? root,
now: new Date(),
idleMin: cfg.capture.idle_threshold_min,
cooldownH: cfg.capture.cooldown_hours,
});
if (opts.json) { console.log(JSON.stringify({ ...s, judge: j }, null, 2)); return; }
console.log(`同步完成:发现 ${s.discovered} · 新会话 ${s.newSessions} · 新消息 ${s.newMessages} · resumed ${s.resumed}${s.blocked ? pc.yellow(` · 拦截 ${s.blocked}`) : ''}`);
if (j.toPending || j.confirmed) console.log(pc.dim(`判定:${j.toPending} 转 pending · ${j.confirmed} 确认`));
// 语义 digest(守护不在时的补嵌路径;未启用时零开销短路)
const { digestSemantic } = await import('../search-svc/semantic.js');
const { embedded } = await digestSemantic(db, cfg, { projectId: cfg.identity.project_id, limit: 100 });
if (embedded > 0) console.log(pc.dim(`语义:补嵌 ${embedded} 个会话`));
} finally {
db.close();
}
}
function parseDays(v: string): number | undefined {
if (v === 'all') return undefined;
const m = /^(\d+)d$/.exec(v);
return m ? Number(m[1]) : undefined;
}