skein-cli 0.1.0-alpha.1

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 (250) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +180 -0
  3. package/bin/skein.mjs +7 -0
  4. package/dist/adapters/aider/conv-reader.d.ts +7 -0
  5. package/dist/adapters/aider/conv-reader.js +203 -0
  6. package/dist/adapters/aider/conv-reader.js.map +1 -0
  7. package/dist/adapters/aider/index.d.ts +2 -0
  8. package/dist/adapters/aider/index.js +123 -0
  9. package/dist/adapters/aider/index.js.map +1 -0
  10. package/dist/adapters/base.d.ts +71 -0
  11. package/dist/adapters/base.js +38 -0
  12. package/dist/adapters/base.js.map +1 -0
  13. package/dist/adapters/claude-code/conv-reader.d.ts +2 -0
  14. package/dist/adapters/claude-code/conv-reader.js +155 -0
  15. package/dist/adapters/claude-code/conv-reader.js.map +1 -0
  16. package/dist/adapters/claude-code/index.d.ts +3 -0
  17. package/dist/adapters/claude-code/index.js +517 -0
  18. package/dist/adapters/claude-code/index.js.map +1 -0
  19. package/dist/adapters/claude-desktop/index.d.ts +2 -0
  20. package/dist/adapters/claude-desktop/index.js +95 -0
  21. package/dist/adapters/claude-desktop/index.js.map +1 -0
  22. package/dist/adapters/codex/index.d.ts +2 -0
  23. package/dist/adapters/codex/index.js +472 -0
  24. package/dist/adapters/codex/index.js.map +1 -0
  25. package/dist/adapters/cursor/index.d.ts +2 -0
  26. package/dist/adapters/cursor/index.js +255 -0
  27. package/dist/adapters/cursor/index.js.map +1 -0
  28. package/dist/adapters/opencode/conv-reader.d.ts +3 -0
  29. package/dist/adapters/opencode/conv-reader.js +190 -0
  30. package/dist/adapters/opencode/conv-reader.js.map +1 -0
  31. package/dist/adapters/opencode/index.d.ts +2 -0
  32. package/dist/adapters/opencode/index.js +349 -0
  33. package/dist/adapters/opencode/index.js.map +1 -0
  34. package/dist/adapters/registry.d.ts +4 -0
  35. package/dist/adapters/registry.js +26 -0
  36. package/dist/adapters/registry.js.map +1 -0
  37. package/dist/cli.d.ts +3 -0
  38. package/dist/cli.js +54 -0
  39. package/dist/cli.js.map +1 -0
  40. package/dist/commands/conv.d.ts +2 -0
  41. package/dist/commands/conv.js +261 -0
  42. package/dist/commands/conv.js.map +1 -0
  43. package/dist/commands/doctor.d.ts +2 -0
  44. package/dist/commands/doctor.js +85 -0
  45. package/dist/commands/doctor.js.map +1 -0
  46. package/dist/commands/init.d.ts +2 -0
  47. package/dist/commands/init.js +38 -0
  48. package/dist/commands/init.js.map +1 -0
  49. package/dist/commands/memory.d.ts +2 -0
  50. package/dist/commands/memory.js +197 -0
  51. package/dist/commands/memory.js.map +1 -0
  52. package/dist/commands/migrate.d.ts +2 -0
  53. package/dist/commands/migrate.js +102 -0
  54. package/dist/commands/migrate.js.map +1 -0
  55. package/dist/commands/profile.d.ts +2 -0
  56. package/dist/commands/profile.js +183 -0
  57. package/dist/commands/profile.js.map +1 -0
  58. package/dist/commands/redact.d.ts +2 -0
  59. package/dist/commands/redact.js +73 -0
  60. package/dist/commands/redact.js.map +1 -0
  61. package/dist/commands/trace.d.ts +2 -0
  62. package/dist/commands/trace.js +181 -0
  63. package/dist/commands/trace.js.map +1 -0
  64. package/dist/commands/view.d.ts +13 -0
  65. package/dist/commands/view.js +184 -0
  66. package/dist/commands/view.js.map +1 -0
  67. package/dist/commands/watch.d.ts +6 -0
  68. package/dist/commands/watch.js +61 -0
  69. package/dist/commands/watch.js.map +1 -0
  70. package/dist/commands/wrap.d.ts +2 -0
  71. package/dist/commands/wrap.js +131 -0
  72. package/dist/commands/wrap.js.map +1 -0
  73. package/dist/conv/chatgpt-import.d.ts +33 -0
  74. package/dist/conv/chatgpt-import.js +145 -0
  75. package/dist/conv/chatgpt-import.js.map +1 -0
  76. package/dist/conv/cursor.d.ts +12 -0
  77. package/dist/conv/cursor.js +55 -0
  78. package/dist/conv/cursor.js.map +1 -0
  79. package/dist/conv/export.d.ts +40 -0
  80. package/dist/conv/export.js +215 -0
  81. package/dist/conv/export.js.map +1 -0
  82. package/dist/conv/replay/aider.d.ts +24 -0
  83. package/dist/conv/replay/aider.js +56 -0
  84. package/dist/conv/replay/aider.js.map +1 -0
  85. package/dist/conv/replay/claude-code.d.ts +38 -0
  86. package/dist/conv/replay/claude-code.js +80 -0
  87. package/dist/conv/replay/claude-code.js.map +1 -0
  88. package/dist/conv/replay/context.d.ts +25 -0
  89. package/dist/conv/replay/context.js +63 -0
  90. package/dist/conv/replay/context.js.map +1 -0
  91. package/dist/conv/replay/index.d.ts +22 -0
  92. package/dist/conv/replay/index.js +84 -0
  93. package/dist/conv/replay/index.js.map +1 -0
  94. package/dist/conv/search.d.ts +67 -0
  95. package/dist/conv/search.js +379 -0
  96. package/dist/conv/search.js.map +1 -0
  97. package/dist/conv/sink.d.ts +26 -0
  98. package/dist/conv/sink.js +76 -0
  99. package/dist/conv/sink.js.map +1 -0
  100. package/dist/conv/sources/aider.d.ts +13 -0
  101. package/dist/conv/sources/aider.js +95 -0
  102. package/dist/conv/sources/aider.js.map +1 -0
  103. package/dist/conv/sources/claude-code.d.ts +13 -0
  104. package/dist/conv/sources/claude-code.js +189 -0
  105. package/dist/conv/sources/claude-code.js.map +1 -0
  106. package/dist/conv/sources/codex.d.ts +15 -0
  107. package/dist/conv/sources/codex.js +175 -0
  108. package/dist/conv/sources/codex.js.map +1 -0
  109. package/dist/conv/sources/opencode.d.ts +12 -0
  110. package/dist/conv/sources/opencode.js +92 -0
  111. package/dist/conv/sources/opencode.js.map +1 -0
  112. package/dist/conv/store.d.ts +10 -0
  113. package/dist/conv/store.js +75 -0
  114. package/dist/conv/store.js.map +1 -0
  115. package/dist/conv/title.d.ts +9 -0
  116. package/dist/conv/title.js +74 -0
  117. package/dist/conv/title.js.map +1 -0
  118. package/dist/conv/watcher.d.ts +28 -0
  119. package/dist/conv/watcher.js +75 -0
  120. package/dist/conv/watcher.js.map +1 -0
  121. package/dist/conv/zip.d.ts +11 -0
  122. package/dist/conv/zip.js +82 -0
  123. package/dist/conv/zip.js.map +1 -0
  124. package/dist/hf/client.d.ts +41 -0
  125. package/dist/hf/client.js +87 -0
  126. package/dist/hf/client.js.map +1 -0
  127. package/dist/index.d.ts +5 -0
  128. package/dist/index.js +6 -0
  129. package/dist/index.js.map +1 -0
  130. package/dist/ir/index.d.ts +24 -0
  131. package/dist/ir/index.js +23 -0
  132. package/dist/ir/index.js.map +1 -0
  133. package/dist/ir/profile.d.ts +55 -0
  134. package/dist/ir/profile.js +177 -0
  135. package/dist/ir/profile.js.map +1 -0
  136. package/dist/memory/index.d.ts +41 -0
  137. package/dist/memory/index.js +109 -0
  138. package/dist/memory/index.js.map +1 -0
  139. package/dist/memory/search.d.ts +24 -0
  140. package/dist/memory/search.js +114 -0
  141. package/dist/memory/search.js.map +1 -0
  142. package/dist/memory/sinks/claude-mem.d.ts +13 -0
  143. package/dist/memory/sinks/claude-mem.js +100 -0
  144. package/dist/memory/sinks/claude-mem.js.map +1 -0
  145. package/dist/memory/sinks/codex.d.ts +12 -0
  146. package/dist/memory/sinks/codex.js +82 -0
  147. package/dist/memory/sinks/codex.js.map +1 -0
  148. package/dist/memory/sinks/context.d.ts +21 -0
  149. package/dist/memory/sinks/context.js +42 -0
  150. package/dist/memory/sinks/context.js.map +1 -0
  151. package/dist/memory/sources/chatgpt.d.ts +22 -0
  152. package/dist/memory/sources/chatgpt.js +98 -0
  153. package/dist/memory/sources/chatgpt.js.map +1 -0
  154. package/dist/memory/sources/claude-mem.d.ts +8 -0
  155. package/dist/memory/sources/claude-mem.js +104 -0
  156. package/dist/memory/sources/claude-mem.js.map +1 -0
  157. package/dist/memory/sources/codex.d.ts +8 -0
  158. package/dist/memory/sources/codex.js +77 -0
  159. package/dist/memory/sources/codex.js.map +1 -0
  160. package/dist/memory/store.d.ts +19 -0
  161. package/dist/memory/store.js +82 -0
  162. package/dist/memory/store.js.map +1 -0
  163. package/dist/proxy/http.d.ts +21 -0
  164. package/dist/proxy/http.js +205 -0
  165. package/dist/proxy/http.js.map +1 -0
  166. package/dist/proxy/recorder.d.ts +35 -0
  167. package/dist/proxy/recorder.js +221 -0
  168. package/dist/proxy/recorder.js.map +1 -0
  169. package/dist/proxy/streaming.d.ts +33 -0
  170. package/dist/proxy/streaming.js +185 -0
  171. package/dist/proxy/streaming.js.map +1 -0
  172. package/dist/redactor/entropy.d.ts +29 -0
  173. package/dist/redactor/entropy.js +98 -0
  174. package/dist/redactor/entropy.js.map +1 -0
  175. package/dist/redactor/index.d.ts +52 -0
  176. package/dist/redactor/index.js +152 -0
  177. package/dist/redactor/index.js.map +1 -0
  178. package/dist/redactor/ner.d.ts +53 -0
  179. package/dist/redactor/ner.js +97 -0
  180. package/dist/redactor/ner.js.map +1 -0
  181. package/dist/redactor/pii-patterns.d.ts +22 -0
  182. package/dist/redactor/pii-patterns.js +187 -0
  183. package/dist/redactor/pii-patterns.js.map +1 -0
  184. package/dist/redactor/secret-patterns.d.ts +27 -0
  185. package/dist/redactor/secret-patterns.js +475 -0
  186. package/dist/redactor/secret-patterns.js.map +1 -0
  187. package/dist/schema/conv.d.ts +698 -0
  188. package/dist/schema/conv.js +85 -0
  189. package/dist/schema/conv.js.map +1 -0
  190. package/dist/schema/index.d.ts +2 -0
  191. package/dist/schema/index.js +3 -0
  192. package/dist/schema/index.js.map +1 -0
  193. package/dist/schema/manifest.d.ts +1531 -0
  194. package/dist/schema/manifest.js +179 -0
  195. package/dist/schema/manifest.js.map +1 -0
  196. package/dist/schema/memory.d.ts +107 -0
  197. package/dist/schema/memory.js +45 -0
  198. package/dist/schema/memory.js.map +1 -0
  199. package/dist/schema/trace.d.ts +164 -0
  200. package/dist/schema/trace.js +89 -0
  201. package/dist/schema/trace.js.map +1 -0
  202. package/dist/trace/consent.d.ts +30 -0
  203. package/dist/trace/consent.js +60 -0
  204. package/dist/trace/consent.js.map +1 -0
  205. package/dist/trace/extract.d.ts +22 -0
  206. package/dist/trace/extract.js +168 -0
  207. package/dist/trace/extract.js.map +1 -0
  208. package/dist/trace/ml-pii.d.ts +33 -0
  209. package/dist/trace/ml-pii.js +35 -0
  210. package/dist/trace/ml-pii.js.map +1 -0
  211. package/dist/trace/push.d.ts +59 -0
  212. package/dist/trace/push.js +141 -0
  213. package/dist/trace/push.js.map +1 -0
  214. package/dist/trace/serialize.d.ts +23 -0
  215. package/dist/trace/serialize.js +67 -0
  216. package/dist/trace/serialize.js.map +1 -0
  217. package/dist/ui/banner.d.ts +2 -0
  218. package/dist/ui/banner.js +17 -0
  219. package/dist/ui/banner.js.map +1 -0
  220. package/dist/ui/box.d.ts +4 -0
  221. package/dist/ui/box.js +38 -0
  222. package/dist/ui/box.js.map +1 -0
  223. package/dist/ui/index.d.ts +5 -0
  224. package/dist/ui/index.js +5 -0
  225. package/dist/ui/index.js.map +1 -0
  226. package/dist/ui/spinner.d.ts +10 -0
  227. package/dist/ui/spinner.js +44 -0
  228. package/dist/ui/spinner.js.map +1 -0
  229. package/dist/ui/table.d.ts +9 -0
  230. package/dist/ui/table.js +55 -0
  231. package/dist/ui/table.js.map +1 -0
  232. package/dist/util/frontmatter.d.ts +6 -0
  233. package/dist/util/frontmatter.js +20 -0
  234. package/dist/util/frontmatter.js.map +1 -0
  235. package/dist/util/fs.d.ts +5 -0
  236. package/dist/util/fs.js +41 -0
  237. package/dist/util/fs.js.map +1 -0
  238. package/dist/util/ids.d.ts +3 -0
  239. package/dist/util/ids.js +16 -0
  240. package/dist/util/ids.js.map +1 -0
  241. package/dist/util/log.d.ts +13 -0
  242. package/dist/util/log.js +33 -0
  243. package/dist/util/log.js.map +1 -0
  244. package/dist/util/paths.d.ts +18 -0
  245. package/dist/util/paths.js +36 -0
  246. package/dist/util/paths.js.map +1 -0
  247. package/dist/version.d.ts +5 -0
  248. package/dist/version.js +32 -0
  249. package/dist/version.js.map +1 -0
  250. package/package.json +86 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/conv/replay/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { type SessionMeta } from '../export.js';
2
+ export type ReplayMode = 'context' | 'resume';
3
+ export interface ReplayInput {
4
+ sessionId: string;
5
+ targetTool: string;
6
+ mode?: ReplayMode;
7
+ projectPath?: string;
8
+ outPath?: string;
9
+ homeDir: string;
10
+ }
11
+ export interface ReplayResult {
12
+ mode: ReplayMode;
13
+ effectiveMode: ReplayMode;
14
+ outputPath: string;
15
+ bytesWritten: number;
16
+ fallbackReason?: string;
17
+ meta: SessionMeta;
18
+ }
19
+ export declare function replaySession(input: ReplayInput): Promise<ReplayResult>;
20
+ export { renderContextReplay } from './context.js';
21
+ export { writeClaudeCodeResume, encodeProjectPath } from './claude-code.js';
22
+ export { writeAiderResume } from './aider.js';
@@ -0,0 +1,84 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { redactText } from '../../redactor/index.js';
4
+ import { writeFileAtomic } from '../../util/fs.js';
5
+ import { exportSession } from '../export.js';
6
+ import { renderContextReplay } from './context.js';
7
+ import { writeClaudeCodeResume } from './claude-code.js';
8
+ import { writeAiderResume } from './aider.js';
9
+ const RESUME_SUPPORTED = new Set(['claude-code', 'aider']);
10
+ export async function replaySession(input) {
11
+ const requestedMode = input.mode ?? 'context';
12
+ const { meta, events } = await loadSessionEvents(input.sessionId);
13
+ let effectiveMode = requestedMode;
14
+ let fallbackReason;
15
+ let outputPath;
16
+ let bytesWritten;
17
+ if (requestedMode === 'resume' && !RESUME_SUPPORTED.has(input.targetTool)) {
18
+ effectiveMode = 'context';
19
+ fallbackReason = `Resume mode is not yet supported for ${input.targetTool}; falling back to context mode (slated for v0.6).`;
20
+ }
21
+ if (effectiveMode === 'resume' && input.targetTool === 'claude-code') {
22
+ if (!input.projectPath) {
23
+ throw new Error('--project is required for `conv import --to claude-code --mode resume`');
24
+ }
25
+ const result = await writeClaudeCodeResume({
26
+ meta,
27
+ events,
28
+ homeDir: input.homeDir,
29
+ projectPath: resolve(input.projectPath),
30
+ });
31
+ outputPath = result.path;
32
+ bytesWritten = (await fs.stat(outputPath)).size;
33
+ }
34
+ else if (effectiveMode === 'resume' && input.targetTool === 'aider') {
35
+ if (!input.projectPath) {
36
+ throw new Error('--project is required for `conv import --to aider --mode resume`');
37
+ }
38
+ const result = await writeAiderResume({
39
+ meta,
40
+ events,
41
+ projectPath: resolve(input.projectPath),
42
+ });
43
+ outputPath = result.path;
44
+ bytesWritten = (await fs.stat(outputPath)).size;
45
+ }
46
+ else {
47
+ const markdown = renderContextReplay({ meta, events, targetTool: input.targetTool });
48
+ const redacted = redactText(markdown).text;
49
+ outputPath = input.outPath
50
+ ? resolve(input.outPath)
51
+ : resolve(process.cwd(), `.skein-replay-${meta.id.slice(0, 8)}.md`);
52
+ await writeFileAtomic(outputPath, redacted);
53
+ bytesWritten = Buffer.byteLength(redacted, 'utf8');
54
+ }
55
+ return {
56
+ mode: requestedMode,
57
+ effectiveMode,
58
+ outputPath,
59
+ bytesWritten,
60
+ ...(fallbackReason ? { fallbackReason } : {}),
61
+ meta,
62
+ };
63
+ }
64
+ async function loadSessionEvents(sessionId) {
65
+ // We piggyback on the existing exporter: the `jsonl` format returns the
66
+ // raw skein-conv events, and `meta` is populated on the way through.
67
+ const result = await exportSession({ sessionId, format: 'jsonl' });
68
+ const events = [];
69
+ for (const line of result.text.split('\n')) {
70
+ if (!line.trim())
71
+ continue;
72
+ try {
73
+ events.push(JSON.parse(line));
74
+ }
75
+ catch {
76
+ // skip malformed lines
77
+ }
78
+ }
79
+ return { meta: result.meta, events };
80
+ }
81
+ export { renderContextReplay } from './context.js';
82
+ export { writeClaudeCodeResume, encodeProjectPath } from './claude-code.js';
83
+ export { writeAiderResume } from './aider.js';
84
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/conv/replay/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ interface SqliteDatabase {
2
+ exec(sql: string): void;
3
+ prepare(sql: string): SqliteStatement;
4
+ close(): void;
5
+ }
6
+ interface SqliteStatement {
7
+ all(...params: unknown[]): unknown[];
8
+ run(...params: unknown[]): {
9
+ changes: number;
10
+ lastInsertRowid: number | bigint;
11
+ };
12
+ }
13
+ export interface SessionRow {
14
+ id: string;
15
+ tool: string;
16
+ model?: string;
17
+ project?: string;
18
+ title?: string;
19
+ startedAt?: string;
20
+ endedAt?: string;
21
+ messageCount: number;
22
+ tokensIn?: number;
23
+ tokensOut?: number;
24
+ costUsd?: number;
25
+ path: string;
26
+ }
27
+ export interface SearchHit extends SessionRow {
28
+ snippet: string;
29
+ rank: number;
30
+ }
31
+ export declare function indexPath(): string;
32
+ export declare function openIndex(): Promise<SqliteDatabase>;
33
+ /**
34
+ * Walk every stored session jsonl and upsert its row + FTS payload.
35
+ * Only re-indexes sessions whose path is new or whose mtime is newer than indexed_at.
36
+ */
37
+ export declare function rebuildIndex(): Promise<{
38
+ indexed: number;
39
+ skipped: number;
40
+ total: number;
41
+ }>;
42
+ export declare function search(query: string, limit?: number): Promise<SearchHit[]>;
43
+ export interface StatsGroup {
44
+ tool: string;
45
+ model: string;
46
+ sessions: number;
47
+ messages: number;
48
+ tokensIn: number;
49
+ tokensOut: number;
50
+ costUsd: number;
51
+ }
52
+ /**
53
+ * Mark a session as pushed to a repo. Idempotent — re-pushing updates the
54
+ * pushed_at timestamp and bytes.
55
+ */
56
+ export declare function markPushed(sessionId: string, repoId: string, bytes: number, sourceSha?: string): Promise<void>;
57
+ export interface PushedRecord {
58
+ sessionId: string;
59
+ repoId: string;
60
+ pushedAt: string;
61
+ bytes: number;
62
+ }
63
+ export declare function pushedSessions(repoId?: string): Promise<PushedRecord[]>;
64
+ export declare function isPushed(sessionId: string, repoId: string): Promise<boolean>;
65
+ export declare function listAllSessions(): Promise<SessionRow[]>;
66
+ export declare function aggregateStats(): Promise<StatsGroup[]>;
67
+ export {};
@@ -0,0 +1,379 @@
1
+ import { createReadStream, promises as fs } from 'node:fs';
2
+ import { createInterface } from 'node:readline';
3
+ import { createRequire } from 'node:module';
4
+ import { dirname, join } from 'node:path';
5
+ import { ensureDir } from '../util/fs.js';
6
+ import { getToolPaths, SKEIN_SUBDIRS } from '../util/paths.js';
7
+ import { listStoredSessions } from './store.js';
8
+ const requireSqlite = createRequire(import.meta.url);
9
+ let cachedSqlite;
10
+ function loadSqlite() {
11
+ if (!cachedSqlite) {
12
+ cachedSqlite = requireSqlite('node:sqlite');
13
+ }
14
+ return cachedSqlite;
15
+ }
16
+ const SCHEMA = `
17
+ CREATE TABLE IF NOT EXISTS sessions (
18
+ id TEXT PRIMARY KEY,
19
+ tool TEXT,
20
+ model TEXT,
21
+ project TEXT,
22
+ title TEXT,
23
+ started_at TEXT,
24
+ ended_at TEXT,
25
+ message_count INTEGER,
26
+ tokens_in INTEGER,
27
+ tokens_out INTEGER,
28
+ cost_usd REAL,
29
+ path TEXT,
30
+ indexed_at TEXT
31
+ );
32
+
33
+ CREATE VIRTUAL TABLE IF NOT EXISTS conv_fts USING fts5(
34
+ session_id UNINDEXED,
35
+ title,
36
+ content,
37
+ tokenize='unicode61'
38
+ );
39
+
40
+ CREATE TABLE IF NOT EXISTS pushed_sessions (
41
+ session_id TEXT NOT NULL,
42
+ repo_id TEXT NOT NULL,
43
+ pushed_at TEXT NOT NULL,
44
+ bytes INTEGER,
45
+ source_sha TEXT,
46
+ PRIMARY KEY (session_id, repo_id)
47
+ );
48
+
49
+ CREATE INDEX IF NOT EXISTS sessions_started_at ON sessions(started_at);
50
+ CREATE INDEX IF NOT EXISTS sessions_tool ON sessions(tool);
51
+ CREATE INDEX IF NOT EXISTS sessions_model ON sessions(model);
52
+ CREATE INDEX IF NOT EXISTS pushed_repo ON pushed_sessions(repo_id);
53
+ `;
54
+ export function indexPath() {
55
+ const paths = getToolPaths();
56
+ return join(paths.skeinDir, SKEIN_SUBDIRS.conv, 'index.sqlite');
57
+ }
58
+ export async function openIndex() {
59
+ const path = indexPath();
60
+ await ensureDir(dirname(path));
61
+ const { DatabaseSync } = loadSqlite();
62
+ const db = new DatabaseSync(path);
63
+ db.exec(SCHEMA);
64
+ return db;
65
+ }
66
+ /**
67
+ * Walk every stored session jsonl and upsert its row + FTS payload.
68
+ * Only re-indexes sessions whose path is new or whose mtime is newer than indexed_at.
69
+ */
70
+ export async function rebuildIndex() {
71
+ const db = await openIndex();
72
+ const files = await listStoredSessions();
73
+ let indexed = 0;
74
+ let skipped = 0;
75
+ try {
76
+ const existing = new Map(db
77
+ .prepare('SELECT path, indexed_at FROM sessions')
78
+ .all()
79
+ .map(r => [
80
+ r.path,
81
+ r.indexed_at,
82
+ ]));
83
+ const insertSession = db.prepare('INSERT OR REPLACE INTO sessions (id, tool, model, project, title, started_at, ended_at, message_count, tokens_in, tokens_out, cost_usd, path, indexed_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
84
+ const deleteFts = db.prepare('DELETE FROM conv_fts WHERE session_id = ?');
85
+ const insertFts = db.prepare('INSERT INTO conv_fts (session_id, title, content) VALUES (?, ?, ?)');
86
+ for (const file of files) {
87
+ const stat = await fs.stat(file).catch(() => undefined);
88
+ if (!stat)
89
+ continue;
90
+ const fileTs = stat.mtime.toISOString();
91
+ if (existing.get(file) === fileTs) {
92
+ skipped++;
93
+ continue;
94
+ }
95
+ const aggregated = await aggregateSession(file);
96
+ if (!aggregated)
97
+ continue;
98
+ insertSession.run(aggregated.id, aggregated.tool, aggregated.model ?? null, aggregated.project ?? null, aggregated.title ?? null, aggregated.startedAt ?? null, aggregated.endedAt ?? null, aggregated.messageCount, aggregated.tokensIn ?? null, aggregated.tokensOut ?? null, aggregated.costUsd ?? null, file, fileTs);
99
+ deleteFts.run(aggregated.id);
100
+ insertFts.run(aggregated.id, aggregated.title ?? '', aggregated.contentBlob);
101
+ indexed++;
102
+ }
103
+ }
104
+ finally {
105
+ db.close();
106
+ }
107
+ return { indexed, skipped, total: files.length };
108
+ }
109
+ export async function search(query, limit = 20) {
110
+ const db = await openIndex();
111
+ try {
112
+ const sql = `
113
+ SELECT
114
+ s.id as id,
115
+ s.tool as tool,
116
+ s.model as model,
117
+ s.project as project,
118
+ s.title as title,
119
+ s.started_at as started_at,
120
+ s.ended_at as ended_at,
121
+ s.message_count as message_count,
122
+ s.tokens_in as tokens_in,
123
+ s.tokens_out as tokens_out,
124
+ s.cost_usd as cost_usd,
125
+ s.path as path,
126
+ snippet(conv_fts, 2, '«', '»', '…', 12) as snippet,
127
+ rank as rank
128
+ FROM conv_fts
129
+ JOIN sessions s ON s.id = conv_fts.session_id
130
+ WHERE conv_fts MATCH ?
131
+ ORDER BY rank
132
+ LIMIT ?
133
+ `;
134
+ const rows = db.prepare(sql).all(escapeFtsQuery(query), limit);
135
+ return rows.map(r => ({
136
+ id: r.id,
137
+ tool: r.tool,
138
+ ...(r.model ? { model: r.model } : {}),
139
+ ...(r.project ? { project: r.project } : {}),
140
+ ...(r.title ? { title: r.title } : {}),
141
+ ...(r.started_at ? { startedAt: r.started_at } : {}),
142
+ ...(r.ended_at ? { endedAt: r.ended_at } : {}),
143
+ messageCount: r.message_count,
144
+ ...(r.tokens_in !== null ? { tokensIn: r.tokens_in } : {}),
145
+ ...(r.tokens_out !== null ? { tokensOut: r.tokens_out } : {}),
146
+ ...(r.cost_usd !== null ? { costUsd: r.cost_usd } : {}),
147
+ path: r.path,
148
+ snippet: r.snippet,
149
+ rank: r.rank,
150
+ }));
151
+ }
152
+ finally {
153
+ db.close();
154
+ }
155
+ }
156
+ /**
157
+ * Mark a session as pushed to a repo. Idempotent — re-pushing updates the
158
+ * pushed_at timestamp and bytes.
159
+ */
160
+ export async function markPushed(sessionId, repoId, bytes, sourceSha) {
161
+ const db = await openIndex();
162
+ try {
163
+ db.prepare(`INSERT OR REPLACE INTO pushed_sessions (session_id, repo_id, pushed_at, bytes, source_sha)
164
+ VALUES (?, ?, ?, ?, ?)`).run(sessionId, repoId, new Date().toISOString(), bytes, sourceSha ?? null);
165
+ }
166
+ finally {
167
+ db.close();
168
+ }
169
+ }
170
+ export async function pushedSessions(repoId) {
171
+ const db = await openIndex();
172
+ try {
173
+ const stmt = repoId
174
+ ? db.prepare('SELECT session_id, repo_id, pushed_at, bytes FROM pushed_sessions WHERE repo_id = ?')
175
+ : db.prepare('SELECT session_id, repo_id, pushed_at, bytes FROM pushed_sessions');
176
+ const rows = (repoId ? stmt.all(repoId) : stmt.all());
177
+ return rows.map(r => ({
178
+ sessionId: r.session_id,
179
+ repoId: r.repo_id,
180
+ pushedAt: r.pushed_at,
181
+ bytes: r.bytes,
182
+ }));
183
+ }
184
+ finally {
185
+ db.close();
186
+ }
187
+ }
188
+ export async function isPushed(sessionId, repoId) {
189
+ const db = await openIndex();
190
+ try {
191
+ const row = db
192
+ .prepare('SELECT 1 FROM pushed_sessions WHERE session_id = ? AND repo_id = ? LIMIT 1')
193
+ .all(sessionId, repoId);
194
+ return row.length > 0;
195
+ }
196
+ finally {
197
+ db.close();
198
+ }
199
+ }
200
+ export async function listAllSessions() {
201
+ const db = await openIndex();
202
+ try {
203
+ const rows = db
204
+ .prepare(`SELECT id, tool, model, project, title, started_at, ended_at, message_count,
205
+ tokens_in, tokens_out, cost_usd, path
206
+ FROM sessions ORDER BY started_at DESC`)
207
+ .all();
208
+ return rows.map(r => ({
209
+ id: r.id,
210
+ tool: r.tool,
211
+ ...(r.model ? { model: r.model } : {}),
212
+ ...(r.project ? { project: r.project } : {}),
213
+ ...(r.title ? { title: r.title } : {}),
214
+ ...(r.started_at ? { startedAt: r.started_at } : {}),
215
+ ...(r.ended_at ? { endedAt: r.ended_at } : {}),
216
+ messageCount: r.message_count,
217
+ ...(r.tokens_in !== null ? { tokensIn: r.tokens_in } : {}),
218
+ ...(r.tokens_out !== null ? { tokensOut: r.tokens_out } : {}),
219
+ ...(r.cost_usd !== null ? { costUsd: r.cost_usd } : {}),
220
+ path: r.path,
221
+ }));
222
+ }
223
+ finally {
224
+ db.close();
225
+ }
226
+ }
227
+ export async function aggregateStats() {
228
+ const db = await openIndex();
229
+ try {
230
+ const rows = db
231
+ .prepare(`SELECT
232
+ COALESCE(tool, 'unknown') as tool,
233
+ COALESCE(model, 'unknown') as model,
234
+ COUNT(*) as sessions,
235
+ SUM(message_count) as messages,
236
+ SUM(COALESCE(tokens_in, 0)) as tokens_in,
237
+ SUM(COALESCE(tokens_out, 0)) as tokens_out,
238
+ SUM(COALESCE(cost_usd, 0)) as cost_usd
239
+ FROM sessions
240
+ GROUP BY tool, model
241
+ ORDER BY sessions DESC`)
242
+ .all();
243
+ return rows.map(r => ({
244
+ tool: r.tool,
245
+ model: r.model,
246
+ sessions: r.sessions,
247
+ messages: r.messages,
248
+ tokensIn: r.tokens_in,
249
+ tokensOut: r.tokens_out,
250
+ costUsd: r.cost_usd,
251
+ }));
252
+ }
253
+ finally {
254
+ db.close();
255
+ }
256
+ }
257
+ async function aggregateSession(file) {
258
+ let id;
259
+ let tool;
260
+ let model;
261
+ let project;
262
+ let title;
263
+ let startedAt;
264
+ let endedAt;
265
+ let messageCount = 0;
266
+ let tokensIn = 0;
267
+ let tokensOut = 0;
268
+ let firstUserText;
269
+ const contentParts = [];
270
+ for await (const line of readLines(file)) {
271
+ const event = safeJson(line);
272
+ if (!event)
273
+ continue;
274
+ if (event.type === 'session.start') {
275
+ id = event.id;
276
+ tool = event.tool;
277
+ if (event.model)
278
+ model = event.model;
279
+ if (event.project)
280
+ project = event.project;
281
+ if (event.title)
282
+ title = event.title;
283
+ startedAt ??= event.ts;
284
+ endedAt = event.ts;
285
+ }
286
+ else if (event.type === 'session.end') {
287
+ endedAt = event.ts;
288
+ }
289
+ else if (event.type === 'message') {
290
+ messageCount++;
291
+ endedAt = event.ts;
292
+ if (event.tokens) {
293
+ tokensIn += event.tokens.in;
294
+ tokensOut += event.tokens.out;
295
+ }
296
+ if (event.role === 'user' && !firstUserText) {
297
+ for (const block of event.content) {
298
+ if (block.type === 'text' && block.text.trim().length > 0) {
299
+ firstUserText = block.text;
300
+ break;
301
+ }
302
+ }
303
+ }
304
+ for (const block of event.content) {
305
+ if (block.type === 'text')
306
+ contentParts.push(block.text);
307
+ else if (block.type === 'tool_use')
308
+ contentParts.push(`[tool_use ${block.name} ${safeJsonString(block.input).slice(0, 200)}]`);
309
+ }
310
+ }
311
+ }
312
+ if (!id || !tool)
313
+ return undefined;
314
+ title =
315
+ title ?? deriveTitleFromFirstMessage(firstUserText) ?? `${tool}${model ? ` · ${model}` : ''}`;
316
+ return {
317
+ id,
318
+ tool,
319
+ ...(model ? { model } : {}),
320
+ ...(project ? { project } : {}),
321
+ ...(title ? { title } : {}),
322
+ ...(startedAt ? { startedAt } : {}),
323
+ ...(endedAt ? { endedAt } : {}),
324
+ messageCount,
325
+ ...(tokensIn > 0 ? { tokensIn } : {}),
326
+ ...(tokensOut > 0 ? { tokensOut } : {}),
327
+ path: file,
328
+ contentBlob: contentParts.join('\n'),
329
+ };
330
+ }
331
+ function deriveTitleFromFirstMessage(raw) {
332
+ if (!raw)
333
+ return undefined;
334
+ const collapsed = raw
335
+ .replace(/<[^>]+>/g, '')
336
+ .replace(/\s+/g, ' ')
337
+ .trim();
338
+ if (collapsed.length === 0)
339
+ return undefined;
340
+ if (collapsed.length <= 80)
341
+ return collapsed;
342
+ return `${collapsed.slice(0, 79)}…`;
343
+ }
344
+ function escapeFtsQuery(query) {
345
+ const trimmed = query.trim();
346
+ if (!trimmed)
347
+ return '';
348
+ if (/^["{].*["}]$/.test(trimmed))
349
+ return trimmed;
350
+ return trimmed
351
+ .split(/\s+/)
352
+ .map(t => `"${t.replace(/"/g, '""')}"`)
353
+ .join(' ');
354
+ }
355
+ async function* readLines(file) {
356
+ const stream = createReadStream(file, { encoding: 'utf8' });
357
+ const rl = createInterface({ input: stream, crlfDelay: Number.POSITIVE_INFINITY });
358
+ for await (const line of rl) {
359
+ if (line.trim())
360
+ yield line;
361
+ }
362
+ }
363
+ function safeJson(raw) {
364
+ try {
365
+ return JSON.parse(raw);
366
+ }
367
+ catch {
368
+ return undefined;
369
+ }
370
+ }
371
+ function safeJsonString(value) {
372
+ try {
373
+ return JSON.stringify(value);
374
+ }
375
+ catch {
376
+ return String(value);
377
+ }
378
+ }
379
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/conv/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { ConvEvent } from '../schema/conv.js';
2
+ export interface SinkOpenOptions {
3
+ tool: string;
4
+ toolVersion?: string;
5
+ model?: string;
6
+ /** Harness-sourced provenance; absent values become "unknown" at extraction. */
7
+ modelKind?: string;
8
+ provider?: string;
9
+ effort?: string;
10
+ project?: string;
11
+ title?: string;
12
+ startedAt: string;
13
+ }
14
+ export declare class JsonlSink {
15
+ private readonly streams;
16
+ /**
17
+ * Make sure a session JSONL is open. If the file does not yet exist,
18
+ * a `session.start` event is emitted with the provided metadata.
19
+ */
20
+ openSession(sessionId: string, opts: SinkOpenOptions): Promise<void>;
21
+ write(sessionId: string, event: ConvEvent): Promise<void>;
22
+ close(sessionId: string): Promise<void>;
23
+ closeAll(): Promise<void>;
24
+ pathFor(sessionId: string): string | undefined;
25
+ size(): number;
26
+ }