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.
Files changed (210) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +200 -2
  3. package/dist/adapters/file-source.d.ts +31 -0
  4. package/dist/adapters/file-source.js +97 -0
  5. package/dist/adapters/file-source.js.map +1 -0
  6. package/dist/adapters/index.d.ts +34 -0
  7. package/dist/adapters/index.js +146 -0
  8. package/dist/adapters/index.js.map +1 -0
  9. package/dist/adapters/opencode.d.ts +30 -0
  10. package/dist/adapters/opencode.js +135 -0
  11. package/dist/adapters/opencode.js.map +1 -0
  12. package/dist/cli.d.ts +58 -0
  13. package/dist/cli.js +972 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/config.d.ts +81 -0
  16. package/dist/config.js +99 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/core/archive.d.ts +27 -0
  19. package/dist/core/archive.js +101 -0
  20. package/dist/core/archive.js.map +1 -0
  21. package/dist/core/chunker.d.ts +28 -0
  22. package/dist/core/chunker.js +67 -0
  23. package/dist/core/chunker.js.map +1 -0
  24. package/dist/core/clean.d.ts +36 -0
  25. package/dist/core/clean.js +182 -0
  26. package/dist/core/clean.js.map +1 -0
  27. package/dist/core/collect.d.ts +39 -0
  28. package/dist/core/collect.js +194 -0
  29. package/dist/core/collect.js.map +1 -0
  30. package/dist/core/concurrency.d.ts +2 -0
  31. package/dist/core/concurrency.js +16 -0
  32. package/dist/core/concurrency.js.map +1 -0
  33. package/dist/core/cursor.d.ts +31 -0
  34. package/dist/core/cursor.js +31 -0
  35. package/dist/core/cursor.js.map +1 -0
  36. package/dist/core/events/claude.d.ts +7 -0
  37. package/dist/core/events/claude.js +287 -0
  38. package/dist/core/events/claude.js.map +1 -0
  39. package/dist/core/events/codex.d.ts +6 -0
  40. package/dist/core/events/codex.js +149 -0
  41. package/dist/core/events/codex.js.map +1 -0
  42. package/dist/core/events/doubao.d.ts +9 -0
  43. package/dist/core/events/doubao.js +151 -0
  44. package/dist/core/events/doubao.js.map +1 -0
  45. package/dist/core/events/index.d.ts +6 -0
  46. package/dist/core/events/index.js +20 -0
  47. package/dist/core/events/index.js.map +1 -0
  48. package/dist/core/events/opencode.d.ts +7 -0
  49. package/dist/core/events/opencode.js +189 -0
  50. package/dist/core/events/opencode.js.map +1 -0
  51. package/dist/core/events/schema.d.ts +83 -0
  52. package/dist/core/events/schema.js +35 -0
  53. package/dist/core/events/schema.js.map +1 -0
  54. package/dist/core/layout.d.ts +26 -0
  55. package/dist/core/layout.js +122 -0
  56. package/dist/core/layout.js.map +1 -0
  57. package/dist/core/lessons/analyze.d.ts +40 -0
  58. package/dist/core/lessons/analyze.js +107 -0
  59. package/dist/core/lessons/analyze.js.map +1 -0
  60. package/dist/core/lessons/audit.d.ts +51 -0
  61. package/dist/core/lessons/audit.js +57 -0
  62. package/dist/core/lessons/audit.js.map +1 -0
  63. package/dist/core/lessons/compaction.d.ts +5 -0
  64. package/dist/core/lessons/compaction.js +58 -0
  65. package/dist/core/lessons/compaction.js.map +1 -0
  66. package/dist/core/lessons/config.d.ts +15 -0
  67. package/dist/core/lessons/config.js +31 -0
  68. package/dist/core/lessons/config.js.map +1 -0
  69. package/dist/core/lessons/existing.d.ts +4 -0
  70. package/dist/core/lessons/existing.js +22 -0
  71. package/dist/core/lessons/existing.js.map +1 -0
  72. package/dist/core/lessons/extract.d.ts +21 -0
  73. package/dist/core/lessons/extract.js +106 -0
  74. package/dist/core/lessons/extract.js.map +1 -0
  75. package/dist/core/lessons/frontmatter.d.ts +29 -0
  76. package/dist/core/lessons/frontmatter.js +87 -0
  77. package/dist/core/lessons/frontmatter.js.map +1 -0
  78. package/dist/core/lessons/graph.d.ts +256 -0
  79. package/dist/core/lessons/graph.js +86 -0
  80. package/dist/core/lessons/graph.js.map +1 -0
  81. package/dist/core/lessons/jev.d.ts +36 -0
  82. package/dist/core/lessons/jev.js +100 -0
  83. package/dist/core/lessons/jev.js.map +1 -0
  84. package/dist/core/lessons/layout.d.ts +2 -0
  85. package/dist/core/lessons/layout.js +56 -0
  86. package/dist/core/lessons/layout.js.map +1 -0
  87. package/dist/core/lessons/learn.d.ts +38 -0
  88. package/dist/core/lessons/learn.js +190 -0
  89. package/dist/core/lessons/learn.js.map +1 -0
  90. package/dist/core/lessons/llm.d.ts +42 -0
  91. package/dist/core/lessons/llm.js +106 -0
  92. package/dist/core/lessons/llm.js.map +1 -0
  93. package/dist/core/lessons/memo.d.ts +19 -0
  94. package/dist/core/lessons/memo.js +170 -0
  95. package/dist/core/lessons/memo.js.map +1 -0
  96. package/dist/core/lessons/merge.d.ts +39 -0
  97. package/dist/core/lessons/merge.js +79 -0
  98. package/dist/core/lessons/merge.js.map +1 -0
  99. package/dist/core/lessons/queue.d.ts +6 -0
  100. package/dist/core/lessons/queue.js +52 -0
  101. package/dist/core/lessons/queue.js.map +1 -0
  102. package/dist/core/lessons/recent.d.ts +21 -0
  103. package/dist/core/lessons/recent.js +111 -0
  104. package/dist/core/lessons/recent.js.map +1 -0
  105. package/dist/core/lessons/schema.d.ts +26 -0
  106. package/dist/core/lessons/schema.js +64 -0
  107. package/dist/core/lessons/schema.js.map +1 -0
  108. package/dist/core/lessons/select.d.ts +19 -0
  109. package/dist/core/lessons/select.js +55 -0
  110. package/dist/core/lessons/select.js.map +1 -0
  111. package/dist/core/lessons/sidecar.d.ts +23 -0
  112. package/dist/core/lessons/sidecar.js +171 -0
  113. package/dist/core/lessons/sidecar.js.map +1 -0
  114. package/dist/core/lessons/storage.d.ts +21 -0
  115. package/dist/core/lessons/storage.js +65 -0
  116. package/dist/core/lessons/storage.js.map +1 -0
  117. package/dist/core/lessons/usage.d.ts +31 -0
  118. package/dist/core/lessons/usage.js +91 -0
  119. package/dist/core/lessons/usage.js.map +1 -0
  120. package/dist/core/lessons/write.d.ts +18 -0
  121. package/dist/core/lessons/write.js +131 -0
  122. package/dist/core/lessons/write.js.map +1 -0
  123. package/dist/core/library/build.d.ts +22 -0
  124. package/dist/core/library/build.js +163 -0
  125. package/dist/core/library/build.js.map +1 -0
  126. package/dist/core/library/group.d.ts +14 -0
  127. package/dist/core/library/group.js +129 -0
  128. package/dist/core/library/group.js.map +1 -0
  129. package/dist/core/library/index-file.d.ts +7 -0
  130. package/dist/core/library/index-file.js +250 -0
  131. package/dist/core/library/index-file.js.map +1 -0
  132. package/dist/core/library/schema.d.ts +78 -0
  133. package/dist/core/library/schema.js +37 -0
  134. package/dist/core/library/schema.js.map +1 -0
  135. package/dist/core/library/skills.d.ts +26 -0
  136. package/dist/core/library/skills.js +168 -0
  137. package/dist/core/library/skills.js.map +1 -0
  138. package/dist/core/library/sync.d.ts +48 -0
  139. package/dist/core/library/sync.js +271 -0
  140. package/dist/core/library/sync.js.map +1 -0
  141. package/dist/core/lock.d.ts +6 -0
  142. package/dist/core/lock.js +56 -0
  143. package/dist/core/lock.js.map +1 -0
  144. package/dist/core/pull.d.ts +23 -0
  145. package/dist/core/pull.js +147 -0
  146. package/dist/core/pull.js.map +1 -0
  147. package/dist/core/push.d.ts +29 -0
  148. package/dist/core/push.js +170 -0
  149. package/dist/core/push.js.map +1 -0
  150. package/dist/core/remote-layout.d.ts +67 -0
  151. package/dist/core/remote-layout.js +94 -0
  152. package/dist/core/remote-layout.js.map +1 -0
  153. package/dist/core/sessions.d.ts +29 -0
  154. package/dist/core/sessions.js +96 -0
  155. package/dist/core/sessions.js.map +1 -0
  156. package/dist/core/state.d.ts +94 -0
  157. package/dist/core/state.js +62 -0
  158. package/dist/core/state.js.map +1 -0
  159. package/dist/core/sync.d.ts +48 -0
  160. package/dist/core/sync.js +140 -0
  161. package/dist/core/sync.js.map +1 -0
  162. package/dist/core/time-window.d.ts +8 -0
  163. package/dist/core/time-window.js +36 -0
  164. package/dist/core/time-window.js.map +1 -0
  165. package/dist/daemon.d.ts +73 -0
  166. package/dist/daemon.js +272 -0
  167. package/dist/daemon.js.map +1 -0
  168. package/dist/format.d.ts +4 -0
  169. package/dist/format.js +28 -0
  170. package/dist/format.js.map +1 -0
  171. package/dist/main.d.ts +2 -0
  172. package/dist/main.js +9 -0
  173. package/dist/main.js.map +1 -0
  174. package/dist/paths.d.ts +19 -0
  175. package/dist/paths.js +19 -0
  176. package/dist/paths.js.map +1 -0
  177. package/dist/progress-console.d.ts +12 -0
  178. package/dist/progress-console.js +42 -0
  179. package/dist/progress-console.js.map +1 -0
  180. package/dist/progress.d.ts +7 -0
  181. package/dist/progress.js +6 -0
  182. package/dist/progress.js.map +1 -0
  183. package/dist/remote/create-remote.d.ts +20 -0
  184. package/dist/remote/create-remote.js +86 -0
  185. package/dist/remote/create-remote.js.map +1 -0
  186. package/dist/remote/prompt.d.ts +17 -0
  187. package/dist/remote/prompt.js +111 -0
  188. package/dist/remote/prompt.js.map +1 -0
  189. package/dist/remote/s3-sigv4.d.ts +28 -0
  190. package/dist/remote/s3-sigv4.js +100 -0
  191. package/dist/remote/s3-sigv4.js.map +1 -0
  192. package/dist/remote/s3-store.d.ts +75 -0
  193. package/dist/remote/s3-store.js +438 -0
  194. package/dist/remote/s3-store.js.map +1 -0
  195. package/dist/remote/s3-vendors.d.ts +31 -0
  196. package/dist/remote/s3-vendors.js +47 -0
  197. package/dist/remote/s3-vendors.js.map +1 -0
  198. package/dist/remote/store.d.ts +44 -0
  199. package/dist/remote/store.js +2 -0
  200. package/dist/remote/store.js.map +1 -0
  201. package/dist/remote/webdav-store.d.ts +41 -0
  202. package/dist/remote/webdav-store.js +285 -0
  203. package/dist/remote/webdav-store.js.map +1 -0
  204. package/dist/sqlite.d.ts +3 -0
  205. package/dist/sqlite.js +12 -0
  206. package/dist/sqlite.js.map +1 -0
  207. package/dist/status.d.ts +82 -0
  208. package/dist/status.js +162 -0
  209. package/dist/status.js.map +1 -0
  210. 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 {};