trove-cli 0.0.0-stage → 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 +21 -0
- package/README.md +200 -2
- package/dist/adapters/file-source.d.ts +31 -0
- package/dist/adapters/file-source.js +97 -0
- package/dist/adapters/file-source.js.map +1 -0
- package/dist/adapters/index.d.ts +34 -0
- package/dist/adapters/index.js +146 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/opencode.d.ts +30 -0
- package/dist/adapters/opencode.js +135 -0
- package/dist/adapters/opencode.js.map +1 -0
- package/dist/cli.d.ts +58 -0
- package/dist/cli.js +972 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +81 -0
- package/dist/config.js +99 -0
- package/dist/config.js.map +1 -0
- package/dist/core/archive.d.ts +27 -0
- package/dist/core/archive.js +101 -0
- package/dist/core/archive.js.map +1 -0
- package/dist/core/chunker.d.ts +28 -0
- package/dist/core/chunker.js +67 -0
- package/dist/core/chunker.js.map +1 -0
- package/dist/core/clean.d.ts +36 -0
- package/dist/core/clean.js +182 -0
- package/dist/core/clean.js.map +1 -0
- package/dist/core/collect.d.ts +39 -0
- package/dist/core/collect.js +194 -0
- package/dist/core/collect.js.map +1 -0
- package/dist/core/concurrency.d.ts +2 -0
- package/dist/core/concurrency.js +16 -0
- package/dist/core/concurrency.js.map +1 -0
- package/dist/core/cursor.d.ts +31 -0
- package/dist/core/cursor.js +31 -0
- package/dist/core/cursor.js.map +1 -0
- package/dist/core/events/claude.d.ts +7 -0
- package/dist/core/events/claude.js +287 -0
- package/dist/core/events/claude.js.map +1 -0
- package/dist/core/events/codex.d.ts +6 -0
- package/dist/core/events/codex.js +149 -0
- package/dist/core/events/codex.js.map +1 -0
- package/dist/core/events/doubao.d.ts +9 -0
- package/dist/core/events/doubao.js +151 -0
- package/dist/core/events/doubao.js.map +1 -0
- package/dist/core/events/index.d.ts +6 -0
- package/dist/core/events/index.js +20 -0
- package/dist/core/events/index.js.map +1 -0
- package/dist/core/events/opencode.d.ts +7 -0
- package/dist/core/events/opencode.js +189 -0
- package/dist/core/events/opencode.js.map +1 -0
- package/dist/core/events/schema.d.ts +83 -0
- package/dist/core/events/schema.js +35 -0
- package/dist/core/events/schema.js.map +1 -0
- package/dist/core/layout.d.ts +26 -0
- package/dist/core/layout.js +122 -0
- package/dist/core/layout.js.map +1 -0
- package/dist/core/lessons/analyze.d.ts +40 -0
- package/dist/core/lessons/analyze.js +107 -0
- package/dist/core/lessons/analyze.js.map +1 -0
- package/dist/core/lessons/audit.d.ts +51 -0
- package/dist/core/lessons/audit.js +57 -0
- package/dist/core/lessons/audit.js.map +1 -0
- package/dist/core/lessons/compaction.d.ts +5 -0
- package/dist/core/lessons/compaction.js +58 -0
- package/dist/core/lessons/compaction.js.map +1 -0
- package/dist/core/lessons/config.d.ts +15 -0
- package/dist/core/lessons/config.js +31 -0
- package/dist/core/lessons/config.js.map +1 -0
- package/dist/core/lessons/existing.d.ts +4 -0
- package/dist/core/lessons/existing.js +22 -0
- package/dist/core/lessons/existing.js.map +1 -0
- package/dist/core/lessons/extract.d.ts +21 -0
- package/dist/core/lessons/extract.js +106 -0
- package/dist/core/lessons/extract.js.map +1 -0
- package/dist/core/lessons/frontmatter.d.ts +29 -0
- package/dist/core/lessons/frontmatter.js +87 -0
- package/dist/core/lessons/frontmatter.js.map +1 -0
- package/dist/core/lessons/graph.d.ts +256 -0
- package/dist/core/lessons/graph.js +86 -0
- package/dist/core/lessons/graph.js.map +1 -0
- package/dist/core/lessons/jev.d.ts +36 -0
- package/dist/core/lessons/jev.js +100 -0
- package/dist/core/lessons/jev.js.map +1 -0
- package/dist/core/lessons/layout.d.ts +2 -0
- package/dist/core/lessons/layout.js +56 -0
- package/dist/core/lessons/layout.js.map +1 -0
- package/dist/core/lessons/learn.d.ts +38 -0
- package/dist/core/lessons/learn.js +190 -0
- package/dist/core/lessons/learn.js.map +1 -0
- package/dist/core/lessons/llm.d.ts +42 -0
- package/dist/core/lessons/llm.js +106 -0
- package/dist/core/lessons/llm.js.map +1 -0
- package/dist/core/lessons/memo.d.ts +19 -0
- package/dist/core/lessons/memo.js +170 -0
- package/dist/core/lessons/memo.js.map +1 -0
- package/dist/core/lessons/merge.d.ts +39 -0
- package/dist/core/lessons/merge.js +79 -0
- package/dist/core/lessons/merge.js.map +1 -0
- package/dist/core/lessons/queue.d.ts +6 -0
- package/dist/core/lessons/queue.js +52 -0
- package/dist/core/lessons/queue.js.map +1 -0
- package/dist/core/lessons/recent.d.ts +21 -0
- package/dist/core/lessons/recent.js +111 -0
- package/dist/core/lessons/recent.js.map +1 -0
- package/dist/core/lessons/schema.d.ts +26 -0
- package/dist/core/lessons/schema.js +64 -0
- package/dist/core/lessons/schema.js.map +1 -0
- package/dist/core/lessons/select.d.ts +19 -0
- package/dist/core/lessons/select.js +55 -0
- package/dist/core/lessons/select.js.map +1 -0
- package/dist/core/lessons/sidecar.d.ts +23 -0
- package/dist/core/lessons/sidecar.js +171 -0
- package/dist/core/lessons/sidecar.js.map +1 -0
- package/dist/core/lessons/storage.d.ts +21 -0
- package/dist/core/lessons/storage.js +65 -0
- package/dist/core/lessons/storage.js.map +1 -0
- package/dist/core/lessons/usage.d.ts +31 -0
- package/dist/core/lessons/usage.js +91 -0
- package/dist/core/lessons/usage.js.map +1 -0
- package/dist/core/lessons/write.d.ts +18 -0
- package/dist/core/lessons/write.js +131 -0
- package/dist/core/lessons/write.js.map +1 -0
- package/dist/core/library/build.d.ts +22 -0
- package/dist/core/library/build.js +163 -0
- package/dist/core/library/build.js.map +1 -0
- package/dist/core/library/group.d.ts +14 -0
- package/dist/core/library/group.js +129 -0
- package/dist/core/library/group.js.map +1 -0
- package/dist/core/library/index-file.d.ts +7 -0
- package/dist/core/library/index-file.js +250 -0
- package/dist/core/library/index-file.js.map +1 -0
- package/dist/core/library/schema.d.ts +78 -0
- package/dist/core/library/schema.js +37 -0
- package/dist/core/library/schema.js.map +1 -0
- package/dist/core/library/skills.d.ts +26 -0
- package/dist/core/library/skills.js +168 -0
- package/dist/core/library/skills.js.map +1 -0
- package/dist/core/library/sync.d.ts +48 -0
- package/dist/core/library/sync.js +271 -0
- package/dist/core/library/sync.js.map +1 -0
- package/dist/core/lock.d.ts +6 -0
- package/dist/core/lock.js +56 -0
- package/dist/core/lock.js.map +1 -0
- package/dist/core/pull.d.ts +23 -0
- package/dist/core/pull.js +147 -0
- package/dist/core/pull.js.map +1 -0
- package/dist/core/push.d.ts +29 -0
- package/dist/core/push.js +170 -0
- package/dist/core/push.js.map +1 -0
- package/dist/core/remote-layout.d.ts +67 -0
- package/dist/core/remote-layout.js +94 -0
- package/dist/core/remote-layout.js.map +1 -0
- package/dist/core/sessions.d.ts +29 -0
- package/dist/core/sessions.js +96 -0
- package/dist/core/sessions.js.map +1 -0
- package/dist/core/state.d.ts +94 -0
- package/dist/core/state.js +62 -0
- package/dist/core/state.js.map +1 -0
- package/dist/core/sync.d.ts +48 -0
- package/dist/core/sync.js +140 -0
- package/dist/core/sync.js.map +1 -0
- package/dist/core/time-window.d.ts +8 -0
- package/dist/core/time-window.js +36 -0
- package/dist/core/time-window.js.map +1 -0
- package/dist/daemon.d.ts +73 -0
- package/dist/daemon.js +272 -0
- package/dist/daemon.js.map +1 -0
- package/dist/format.d.ts +4 -0
- package/dist/format.js +28 -0
- package/dist/format.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +9 -0
- package/dist/main.js.map +1 -0
- package/dist/paths.d.ts +19 -0
- package/dist/paths.js +19 -0
- package/dist/paths.js.map +1 -0
- package/dist/progress-console.d.ts +12 -0
- package/dist/progress-console.js +42 -0
- package/dist/progress-console.js.map +1 -0
- package/dist/progress.d.ts +7 -0
- package/dist/progress.js +6 -0
- package/dist/progress.js.map +1 -0
- package/dist/remote/create-remote.d.ts +20 -0
- package/dist/remote/create-remote.js +86 -0
- package/dist/remote/create-remote.js.map +1 -0
- package/dist/remote/prompt.d.ts +17 -0
- package/dist/remote/prompt.js +111 -0
- package/dist/remote/prompt.js.map +1 -0
- package/dist/remote/s3-sigv4.d.ts +28 -0
- package/dist/remote/s3-sigv4.js +100 -0
- package/dist/remote/s3-sigv4.js.map +1 -0
- package/dist/remote/s3-store.d.ts +75 -0
- package/dist/remote/s3-store.js +438 -0
- package/dist/remote/s3-store.js.map +1 -0
- package/dist/remote/s3-vendors.d.ts +31 -0
- package/dist/remote/s3-vendors.js +47 -0
- package/dist/remote/s3-vendors.js.map +1 -0
- package/dist/remote/store.d.ts +44 -0
- package/dist/remote/store.js +2 -0
- package/dist/remote/store.js.map +1 -0
- package/dist/remote/webdav-store.d.ts +41 -0
- package/dist/remote/webdav-store.js +285 -0
- package/dist/remote/webdav-store.js.map +1 -0
- package/dist/sqlite.d.ts +3 -0
- package/dist/sqlite.js +12 -0
- package/dist/sqlite.js.map +1 -0
- package/dist/status.d.ts +82 -0
- package/dist/status.js +162 -0
- package/dist/status.js.map +1 -0
- package/package.json +43 -4
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { openSqlite } from '../sqlite.js';
|
|
2
|
+
/** 导出格式版本:导出逻辑变化时递增,collect 会据此强制重导(旧归档自动换世代)。 */
|
|
3
|
+
export const OPENCODE_EXPORT_VERSION = 2;
|
|
4
|
+
function hasTable(db, name) {
|
|
5
|
+
const row = db
|
|
6
|
+
.prepare("SELECT 1 AS ok FROM sqlite_master WHERE type='table' AND name=?")
|
|
7
|
+
.get(name);
|
|
8
|
+
return Boolean(row);
|
|
9
|
+
}
|
|
10
|
+
function columns(db, table) {
|
|
11
|
+
const rows = db.prepare(`PRAGMA table_info(${table})`).all();
|
|
12
|
+
return new Set(rows.map((r) => r.name));
|
|
13
|
+
}
|
|
14
|
+
export class OpenCodeStore {
|
|
15
|
+
db;
|
|
16
|
+
constructor(dbPath) {
|
|
17
|
+
this.db = openSqlite(dbPath);
|
|
18
|
+
}
|
|
19
|
+
close() {
|
|
20
|
+
this.db.close();
|
|
21
|
+
}
|
|
22
|
+
/** 列出全部会话(新表 + 仅存在于旧表的会话),updatedAt 取会话/消息/part 的最大值。 */
|
|
23
|
+
listSessions(cutoff = 0) {
|
|
24
|
+
const out = new Map();
|
|
25
|
+
const v2 = hasTable(this.db, 'session_v2');
|
|
26
|
+
const msgs = hasTable(this.db, 'session_message');
|
|
27
|
+
if (v2) {
|
|
28
|
+
const rows = this.db
|
|
29
|
+
.prepare(`SELECT s.id AS id,
|
|
30
|
+
MAX(s.time_updated, COALESCE((
|
|
31
|
+
${msgs ? 'SELECT MAX(m.time_updated) FROM session_message m WHERE m.session_id=s.id' : 'SELECT 0'}
|
|
32
|
+
),0)) AS updatedAt
|
|
33
|
+
FROM session_v2 s`)
|
|
34
|
+
.all();
|
|
35
|
+
for (const r of rows)
|
|
36
|
+
out.set(r.id, Number(r.updatedAt));
|
|
37
|
+
}
|
|
38
|
+
if (hasTable(this.db, 'session')) {
|
|
39
|
+
const legacyOnly = v2 ? 'WHERE NOT EXISTS (SELECT 1 FROM session_v2 v WHERE v.id=s.id)' : '';
|
|
40
|
+
const msgAgg = hasTable(this.db, 'message')
|
|
41
|
+
? 'COALESCE((SELECT MAX(m.time_updated) FROM message m WHERE m.session_id=s.id),0)'
|
|
42
|
+
: '0';
|
|
43
|
+
const partAgg = hasTable(this.db, 'part')
|
|
44
|
+
? 'COALESCE((SELECT MAX(p.time_updated) FROM part p WHERE p.session_id=s.id),0)'
|
|
45
|
+
: '0';
|
|
46
|
+
const rows = this.db
|
|
47
|
+
.prepare(`SELECT s.id AS id, MAX(s.time_updated, ${msgAgg}, ${partAgg}) AS updatedAt
|
|
48
|
+
FROM session s ${legacyOnly}`)
|
|
49
|
+
.all();
|
|
50
|
+
for (const r of rows)
|
|
51
|
+
out.set(r.id, Number(r.updatedAt));
|
|
52
|
+
}
|
|
53
|
+
return [...out]
|
|
54
|
+
.map(([id, updatedAt]) => ({ id, updatedAt }))
|
|
55
|
+
.filter((s) => s.updatedAt >= cutoff)
|
|
56
|
+
.sort((a, b) => a.updatedAt - b.updatedAt || a.id.localeCompare(b.id));
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 导出单个会话为确定性 JSONL:每个数据库行一行,保留全部列。
|
|
60
|
+
* 行格式:{"v":1,"table":"session_v2","row":{...}}
|
|
61
|
+
*/
|
|
62
|
+
exportSession(sessionId) {
|
|
63
|
+
const lines = [];
|
|
64
|
+
const emit = (table, row) => {
|
|
65
|
+
lines.push(JSON.stringify({ v: 1, table, row }));
|
|
66
|
+
};
|
|
67
|
+
let exists = false;
|
|
68
|
+
if (hasTable(this.db, 'session_v2')) {
|
|
69
|
+
const row = this.db.prepare('SELECT * FROM session_v2 WHERE id=?').get(sessionId);
|
|
70
|
+
if (row) {
|
|
71
|
+
emit('session_v2', row);
|
|
72
|
+
exists = true;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (hasTable(this.db, 'session')) {
|
|
76
|
+
const row = this.db.prepare('SELECT * FROM session WHERE id=?').get(sessionId);
|
|
77
|
+
if (row) {
|
|
78
|
+
emit('session', row);
|
|
79
|
+
exists = true;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (!exists)
|
|
83
|
+
return '';
|
|
84
|
+
// 新表消息:seq 是会话内唯一顺序号,缺列时退回时间+id
|
|
85
|
+
const newMessageIds = new Set();
|
|
86
|
+
if (hasTable(this.db, 'session_message')) {
|
|
87
|
+
const cols = columns(this.db, 'session_message');
|
|
88
|
+
const order = cols.has('seq') ? 'seq ASC, id ASC' : 'time_created ASC, id ASC';
|
|
89
|
+
const rows = this.db
|
|
90
|
+
.prepare(`SELECT * FROM session_message WHERE session_id=? ORDER BY ${order}`)
|
|
91
|
+
.all(sessionId);
|
|
92
|
+
for (const row of rows) {
|
|
93
|
+
emit('session_message', row);
|
|
94
|
+
newMessageIds.add(String(row.id));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// 旧表消息:新旧同 id 的 data 序列化并不相同(实测 23504 条不同),为无损全部保留。
|
|
98
|
+
// 新表已内嵌 parts,这里仍保留旧 part,避免丢失旧序列化里的任何字段。
|
|
99
|
+
if (hasTable(this.db, 'message')) {
|
|
100
|
+
const rows = this.db
|
|
101
|
+
.prepare('SELECT * FROM message WHERE session_id=? ORDER BY time_created ASC, id ASC')
|
|
102
|
+
.all(sessionId);
|
|
103
|
+
for (const row of rows)
|
|
104
|
+
emit('message', row);
|
|
105
|
+
}
|
|
106
|
+
if (hasTable(this.db, 'part')) {
|
|
107
|
+
const rows = this.db
|
|
108
|
+
.prepare('SELECT * FROM part WHERE session_id=? ORDER BY message_id ASC, time_created ASC, id ASC')
|
|
109
|
+
.all(sessionId);
|
|
110
|
+
for (const row of rows)
|
|
111
|
+
emit('part', row);
|
|
112
|
+
}
|
|
113
|
+
return lines.length ? lines.join('\n') + '\n' : '';
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/** 便捷函数(测试/单次导出)。 */
|
|
117
|
+
export function listSessions(dbPath, cutoff = 0) {
|
|
118
|
+
const store = new OpenCodeStore(dbPath);
|
|
119
|
+
try {
|
|
120
|
+
return store.listSessions(cutoff);
|
|
121
|
+
}
|
|
122
|
+
finally {
|
|
123
|
+
store.close();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
export function exportSession(dbPath, sessionId) {
|
|
127
|
+
const store = new OpenCodeStore(dbPath);
|
|
128
|
+
try {
|
|
129
|
+
return store.exportSession(sessionId);
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
store.close();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=opencode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/adapters/opencode.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { type Config, type RemoteConfig } from './config.js';
|
|
2
|
+
import type { RemoteStore } from './remote/store.js';
|
|
3
|
+
import type { Adapter } from './adapters/index.js';
|
|
4
|
+
import type { LessonProviderDeps } from './core/lessons/learn.js';
|
|
5
|
+
import { type RestartDaemonOptions, type StartDaemonOptions } from './daemon.js';
|
|
6
|
+
export declare const VERSION = "0.2.0";
|
|
7
|
+
export interface CliDeps {
|
|
8
|
+
base?: string;
|
|
9
|
+
/** 按配置构造远端;测试注入 stub。 */
|
|
10
|
+
createRemote?: (config: RemoteConfig) => RemoteStore;
|
|
11
|
+
resolveAdapters?: (config: Config) => Adapter[];
|
|
12
|
+
out?: (line: string) => void;
|
|
13
|
+
err?: (line: string) => void;
|
|
14
|
+
/** 原始输出(进度行需要 \r),默认 process.stdout.write */
|
|
15
|
+
rawOut?: (text: string) => void;
|
|
16
|
+
isTTY?: boolean;
|
|
17
|
+
now?: () => number;
|
|
18
|
+
/** 启动 daemon;测试注入 stub,避免真的 spawn 子进程 */
|
|
19
|
+
startDaemon?: (opts: StartDaemonOptions) => Promise<number>;
|
|
20
|
+
/** 重启 daemon;测试注入 stub,避免真的 stop/start 子进程 */
|
|
21
|
+
restartDaemon?: (opts: RestartDaemonOptions) => Promise<{
|
|
22
|
+
pid: number;
|
|
23
|
+
wasRunning: boolean;
|
|
24
|
+
}>;
|
|
25
|
+
/** 经验提取的提供方注入;测试传 mock,生产由 daemon/CLI 懒构造 */
|
|
26
|
+
lessonDeps?: LessonProviderDeps;
|
|
27
|
+
}
|
|
28
|
+
interface InitOptions {
|
|
29
|
+
name?: string;
|
|
30
|
+
url?: string;
|
|
31
|
+
username?: string;
|
|
32
|
+
password?: string;
|
|
33
|
+
/** 远端类型:webdav / s3;不给则交互询问 */
|
|
34
|
+
type?: 'webdav' | 's3';
|
|
35
|
+
/** S3 厂商 */
|
|
36
|
+
provider?: 'aliyun' | 'tencent';
|
|
37
|
+
/** S3 地域 */
|
|
38
|
+
region?: string;
|
|
39
|
+
/** S3 Bucket */
|
|
40
|
+
bucket?: string;
|
|
41
|
+
/** 自定义 S3 endpoint(覆盖厂商推导;MinIO 等 S3 兼容私有部署需要) */
|
|
42
|
+
endpoint?: string;
|
|
43
|
+
/** path-style 寻址(bucket 放路径里);私有 S3 兼容服务通常需要 */
|
|
44
|
+
forcePathStyle?: boolean;
|
|
45
|
+
/** S3 AccessKey ID */
|
|
46
|
+
accessKeyId?: string;
|
|
47
|
+
/** S3 Secret AccessKey(也可用 TROVE_PASSWORD 环境变量) */
|
|
48
|
+
secretAccessKey?: string;
|
|
49
|
+
/** commander 的 --no-daemon 会传 false */
|
|
50
|
+
daemon?: boolean;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 命令行给了足够的 S3 参数就直接用(供脚本化配置);否则返回 undefined 走交互引导。
|
|
54
|
+
*/
|
|
55
|
+
export declare function buildS3FromFlags(opts: InitOptions, existing: RemoteConfig): RemoteConfig | undefined;
|
|
56
|
+
/** 主入口:用 commander 定义命令并分发。返回进程退出码。 */
|
|
57
|
+
export declare function run(argv: string[], deps?: CliDeps): Promise<number>;
|
|
58
|
+
export {};
|