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,100 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import { createRequire } from 'node:module';
3
+ import { createHash } from 'node:crypto';
4
+ import { dirname } from 'node:path';
5
+ import { ensureDir } from '../../util/fs.js';
6
+ import { redactText } from '../../redactor/index.js';
7
+ import { claudeMemDbPath } from '../sources/claude-mem.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 OBSERVATIONS_SCHEMA = `
17
+ CREATE TABLE IF NOT EXISTS observations (
18
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
19
+ memory_session_id TEXT NOT NULL,
20
+ project TEXT NOT NULL,
21
+ text TEXT,
22
+ type TEXT NOT NULL,
23
+ title TEXT,
24
+ facts TEXT,
25
+ narrative TEXT,
26
+ files_modified TEXT,
27
+ created_at TEXT NOT NULL,
28
+ created_at_epoch INTEGER NOT NULL,
29
+ content_hash TEXT,
30
+ agent_type TEXT,
31
+ agent_id TEXT,
32
+ metadata TEXT
33
+ );
34
+ CREATE UNIQUE INDEX IF NOT EXISTS ux_observations_session_hash
35
+ ON observations(memory_session_id, content_hash);
36
+ `;
37
+ export async function importIntoClaudeMem(memories, opts) {
38
+ const dbPath = claudeMemDbPath({
39
+ homeDir: opts.homeDir,
40
+ ...(opts.dataDir ? { dataDir: opts.dataDir } : {}),
41
+ });
42
+ let exists = true;
43
+ try {
44
+ await fs.access(dbPath);
45
+ }
46
+ catch {
47
+ exists = false;
48
+ }
49
+ if (!exists) {
50
+ if (!opts.createIfMissing) {
51
+ throw new Error(`claude-mem db not found at ${dbPath} (pass --create-if-missing to allow Skein to seed it)`);
52
+ }
53
+ await ensureDir(dirname(dbPath));
54
+ }
55
+ const { DatabaseSync } = loadSqlite();
56
+ const db = new DatabaseSync(dbPath);
57
+ let inserted = 0;
58
+ let skipped = 0;
59
+ try {
60
+ db.exec(OBSERVATIONS_SCHEMA);
61
+ db.exec('BEGIN');
62
+ const insert = db.prepare(`INSERT OR IGNORE INTO observations
63
+ (memory_session_id, project, text, type, title, facts, narrative,
64
+ files_modified, created_at, created_at_epoch, content_hash,
65
+ agent_type, agent_id, metadata)
66
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
67
+ for (const memory of memories) {
68
+ const redacted = redactText(memory.fact).text;
69
+ const project = memory.project ?? 'global';
70
+ const sessionId = `skein-${memory.tool}`;
71
+ const contentHash = createHash('sha256')
72
+ .update(`${project}:${redacted}`)
73
+ .digest('hex')
74
+ .slice(0, 32);
75
+ const title = redacted.split('\n')[0]?.slice(0, 80) ?? '';
76
+ const createdAt = memory.updatedAt;
77
+ const createdAtEpoch = Date.parse(createdAt) || 0;
78
+ const result = insert.run(sessionId, project, redacted, memory.tags[0] ?? 'skein-import', title, JSON.stringify([]), '', JSON.stringify([]), createdAt, createdAtEpoch, contentHash, 'skein', memory.id, JSON.stringify({ tags: memory.tags, provenance: memory.provenance }));
79
+ if (result.changes > 0)
80
+ inserted += 1;
81
+ else
82
+ skipped += 1;
83
+ }
84
+ db.exec('COMMIT');
85
+ }
86
+ catch (err) {
87
+ try {
88
+ db.exec('ROLLBACK');
89
+ }
90
+ catch {
91
+ // already not in a tx
92
+ }
93
+ throw err;
94
+ }
95
+ finally {
96
+ db.close();
97
+ }
98
+ return { inserted, skipped, path: dbPath };
99
+ }
100
+ //# sourceMappingURL=claude-mem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-mem.js","sourceRoot":"","sources":["../../../src/memory/sinks/claude-mem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAQ,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEpD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAyB1D,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACpD,IAAI,YAA0C,CAAA;AAC9C,SAAS,UAAU;IACjB,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,aAAa,CAAC,aAAa,CAAqB,CAAA;IACjE,CAAC;IACD,OAAO,YAAY,CAAA;AACrB,CAAC;AAED,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;CAoB3B,CAAA;AAeD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAAkB,EAClB,IAA0B;IAE1B,MAAM,MAAM,GAAG,eAAe,CAAC;QAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnD,CAAC,CAAA;IACF,IAAI,MAAM,GAAG,IAAI,CAAA;IACjB,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,GAAG,KAAK,CAAA;IAChB,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,8BAA8B,MAAM,uDAAuD,CAC5F,CAAA;QACH,CAAC;QACD,MAAM,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;IAClC,CAAC;IACD,MAAM,EAAE,YAAY,EAAE,GAAG,UAAU,EAAE,CAAA;IACrC,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAA;IACnC,IAAI,QAAQ,GAAG,CAAC,CAAA;IAChB,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,IAAI,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;QAC5B,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAChB,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB;;;;yDAImD,CACpD,CAAA;QACD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAA;YAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAA;YAC1C,MAAM,SAAS,GAAG,SAAS,MAAM,CAAC,IAAI,EAAE,CAAA;YACxC,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC;iBACrC,MAAM,CAAC,GAAG,OAAO,IAAI,QAAQ,EAAE,CAAC;iBAChC,MAAM,CAAC,KAAK,CAAC;iBACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACf,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,CAAA;YACzD,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAA;YAClC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YACjD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CACvB,SAAS,EACT,OAAO,EACP,QAAQ,EACR,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,cAAc,EAChC,KAAK,EACL,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAClB,EAAE,EACF,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAClB,SAAS,EACT,cAAc,EACd,WAAW,EACX,OAAO,EACP,MAAM,CAAC,EAAE,EACT,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CACrE,CAAA;YACD,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC;gBAAE,QAAQ,IAAI,CAAC,CAAA;;gBAChC,OAAO,IAAI,CAAC,CAAA;QACnB,CAAC;QACD,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC;YACH,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;QACD,MAAM,GAAG,CAAA;IACX,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAA;IACZ,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AAC5C,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Memory } from '../../schema/memory.js';
2
+ export interface CodexSinkOptions {
3
+ homeDir: string;
4
+ dbPath?: string;
5
+ createIfMissing?: boolean;
6
+ }
7
+ export interface CodexImportResult {
8
+ inserted: number;
9
+ skipped: number;
10
+ path: string;
11
+ }
12
+ export declare function importIntoCodex(memories: Memory[], opts: CodexSinkOptions): Promise<CodexImportResult>;
@@ -0,0 +1,82 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import { createRequire } from 'node:module';
3
+ import { dirname, join } from 'node:path';
4
+ import { ensureDir } from '../../util/fs.js';
5
+ import { redactText } from '../../redactor/index.js';
6
+ const requireSqlite = createRequire(import.meta.url);
7
+ let cachedSqlite;
8
+ function loadSqlite() {
9
+ if (!cachedSqlite) {
10
+ cachedSqlite = requireSqlite('node:sqlite');
11
+ }
12
+ return cachedSqlite;
13
+ }
14
+ const STAGE1_SCHEMA = `
15
+ CREATE TABLE IF NOT EXISTS stage1_outputs (
16
+ thread_id TEXT PRIMARY KEY,
17
+ source_updated_at INTEGER NOT NULL,
18
+ raw_memory TEXT NOT NULL,
19
+ rollout_summary TEXT NOT NULL,
20
+ rollout_slug TEXT,
21
+ generated_at INTEGER NOT NULL,
22
+ usage_count INTEGER,
23
+ last_usage INTEGER,
24
+ selected_for_phase2 INTEGER NOT NULL DEFAULT 0,
25
+ selected_for_phase2_source_updated_at INTEGER
26
+ );
27
+ `;
28
+ export async function importIntoCodex(memories, opts) {
29
+ const dbPath = opts.dbPath ?? join(opts.homeDir, '.codex', 'memories_1.sqlite');
30
+ let exists = true;
31
+ try {
32
+ await fs.access(dbPath);
33
+ }
34
+ catch {
35
+ exists = false;
36
+ }
37
+ if (!exists) {
38
+ if (!opts.createIfMissing) {
39
+ throw new Error(`Codex memories db not found at ${dbPath} (pass --create-if-missing to allow Skein to seed it)`);
40
+ }
41
+ await ensureDir(dirname(dbPath));
42
+ }
43
+ const { DatabaseSync } = loadSqlite();
44
+ const db = new DatabaseSync(dbPath);
45
+ let inserted = 0;
46
+ let skipped = 0;
47
+ try {
48
+ db.exec(STAGE1_SCHEMA);
49
+ db.exec('BEGIN');
50
+ const insert = db.prepare(`INSERT OR IGNORE INTO stage1_outputs
51
+ (thread_id, source_updated_at, raw_memory, rollout_summary, rollout_slug,
52
+ generated_at, usage_count, last_usage, selected_for_phase2)
53
+ VALUES (?, ?, ?, ?, ?, ?, 0, NULL, 0)`);
54
+ for (const memory of memories) {
55
+ const fact = redactText(memory.fact).text;
56
+ const threadId = `skein-${memory.id}`;
57
+ const summary = fact.split('\n')[0]?.slice(0, 200) ?? '';
58
+ const slug = memory.tags[0] ?? null;
59
+ const generatedAt = Date.parse(memory.updatedAt) || Date.now();
60
+ const result = insert.run(threadId, generatedAt, fact, summary, slug, generatedAt);
61
+ if (result.changes > 0)
62
+ inserted += 1;
63
+ else
64
+ skipped += 1;
65
+ }
66
+ db.exec('COMMIT');
67
+ }
68
+ catch (err) {
69
+ try {
70
+ db.exec('ROLLBACK');
71
+ }
72
+ catch {
73
+ // already not in a tx
74
+ }
75
+ throw err;
76
+ }
77
+ finally {
78
+ db.close();
79
+ }
80
+ return { inserted, skipped, path: dbPath };
81
+ }
82
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/memory/sinks/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Memory } from '../../schema/memory.js';
2
+ /**
3
+ * Context-mode replay for cloud-only memory targets (ChatGPT, Cursor,
4
+ * Claude Desktop). Renders a markdown brief the user pastes into the
5
+ * target's memory UI. Memories are grouped by scope so the user can
6
+ * paste selectively.
7
+ *
8
+ * Every fact passes through the redactor a second time before landing
9
+ * on disk — defense in depth in case the caller passed an unredacted
10
+ * IR row.
11
+ */
12
+ export interface ContextReplayInput {
13
+ memories: Memory[];
14
+ targetTool: string;
15
+ outPath?: string;
16
+ }
17
+ export interface ContextReplayResult {
18
+ path: string;
19
+ bytesWritten: number;
20
+ }
21
+ export declare function renderContextBrief(input: ContextReplayInput): Promise<ContextReplayResult>;
@@ -0,0 +1,42 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { redactText } from '../../redactor/index.js';
4
+ export async function renderContextBrief(input) {
5
+ const path = resolve(input.outPath ?? `./.skein-memory-${input.targetTool}.md`);
6
+ const body = buildBody(input);
7
+ const redacted = redactText(body).text;
8
+ await fs.writeFile(path, redacted, 'utf8');
9
+ return { path, bytesWritten: Buffer.byteLength(redacted, 'utf8') };
10
+ }
11
+ function buildBody(input) {
12
+ const lines = [];
13
+ lines.push(`# Skein memory brief for ${input.targetTool}`, '');
14
+ lines.push(`Paste these into your ${input.targetTool} memory store. They are grouped by scope so you can paste selectively.`, '');
15
+ const globals = input.memories.filter(m => m.scope === 'global');
16
+ if (globals.length > 0) {
17
+ lines.push('## Global preferences', '');
18
+ for (const memory of globals)
19
+ lines.push(formatMemory(memory));
20
+ lines.push('');
21
+ }
22
+ const projects = new Map();
23
+ for (const memory of input.memories) {
24
+ if (memory.scope !== 'project' || !memory.project)
25
+ continue;
26
+ if (!projects.has(memory.project))
27
+ projects.set(memory.project, []);
28
+ projects.get(memory.project).push(memory);
29
+ }
30
+ for (const [project, list] of projects) {
31
+ lines.push(`## Project: ${project}`, '');
32
+ for (const memory of list)
33
+ lines.push(formatMemory(memory));
34
+ lines.push('');
35
+ }
36
+ return lines.join('\n').replace(/\n{3,}/g, '\n\n');
37
+ }
38
+ function formatMemory(memory) {
39
+ const tags = memory.tags.length > 0 ? ` _(${memory.tags.join(', ')})_` : '';
40
+ return `- ${memory.fact}${tags}`;
41
+ }
42
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/memory/sinks/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { Buffer } from 'node:buffer';
2
+ import { type Memory } from '../../schema/memory.js';
3
+ /**
4
+ * ChatGPT account-data export reader.
5
+ *
6
+ * The account-data export ZIP carries a `user.json` (and sometimes a
7
+ * `memories.json` or `chat.html` mirror) with the cross-conversation
8
+ * memories the ChatGPT web/desktop tier maintains. Schema varies between
9
+ * exports; we accept any of:
10
+ *
11
+ * - `user.json` with `memories: [{ id?, content, created_at? }]`
12
+ * - `user.json` with `assistant_memory: { entries: [...] }`
13
+ * - top-level `memories.json` array
14
+ *
15
+ * One Skein Memory per entry. `id` (or a SHA-shape fallback) is the
16
+ * sourceKey.
17
+ */
18
+ export interface ChatgptMemoryReaderOptions {
19
+ zipPath?: string;
20
+ zipBuffer?: Buffer;
21
+ }
22
+ export declare function readChatgptMemories(opts: ChatgptMemoryReaderOptions): Promise<Memory[]>;
@@ -0,0 +1,98 @@
1
+ import { memoryId } from '../../schema/memory.js';
2
+ import { MEMORY_SCHEMA } from '../../version.js';
3
+ import { findEntry, findEntriesByExt, parseZip, readZipFile, } from '../../conv/zip.js';
4
+ export async function readChatgptMemories(opts) {
5
+ const entries = await loadEntries(opts);
6
+ const raw = locateMemoryRoot(entries);
7
+ if (!raw)
8
+ return [];
9
+ return raw.map(entryToMemory).filter((m) => m !== undefined);
10
+ }
11
+ async function loadEntries(opts) {
12
+ if (opts.zipBuffer)
13
+ return parseZip(opts.zipBuffer);
14
+ if (opts.zipPath)
15
+ return readZipFile(opts.zipPath);
16
+ throw new Error('readChatgptMemories: pass either zipBuffer or zipPath');
17
+ }
18
+ function locateMemoryRoot(entries) {
19
+ const dedicated = findEntry(entries, 'memories.json');
20
+ if (dedicated) {
21
+ const parsed = safeJson(dedicated.body.toString('utf8'));
22
+ if (Array.isArray(parsed))
23
+ return parsed;
24
+ if (parsed && Array.isArray(parsed.memories))
25
+ return parsed.memories;
26
+ }
27
+ const userJson = findEntry(entries, 'user.json');
28
+ if (userJson) {
29
+ const parsed = safeJson(userJson.body.toString('utf8'));
30
+ const memories = extractMemoryArray(parsed);
31
+ if (memories)
32
+ return memories;
33
+ }
34
+ for (const candidate of findEntriesByExt(entries, '.json')) {
35
+ const parsed = safeJson(candidate.body.toString('utf8'));
36
+ const memories = extractMemoryArray(parsed);
37
+ if (memories)
38
+ return memories;
39
+ }
40
+ return undefined;
41
+ }
42
+ function extractMemoryArray(parsed) {
43
+ if (!parsed || typeof parsed !== 'object')
44
+ return undefined;
45
+ const root = parsed;
46
+ if (Array.isArray(root['memories']))
47
+ return root['memories'];
48
+ const assistant = root['assistant_memory'];
49
+ if (assistant && typeof assistant === 'object') {
50
+ const entries = assistant['entries'];
51
+ if (Array.isArray(entries))
52
+ return entries;
53
+ }
54
+ return undefined;
55
+ }
56
+ function entryToMemory(entry, index) {
57
+ const fact = (entry.content ?? entry.text ?? entry.body ?? entry.memory ?? '').toString().trim();
58
+ if (!fact)
59
+ return undefined;
60
+ const sourceKey = entry.id ?? `idx-${index}`;
61
+ const addedAt = normalizeTs(entry.created_at);
62
+ const updatedAt = normalizeTs(entry.updated_at) ?? addedAt;
63
+ return {
64
+ schema: MEMORY_SCHEMA,
65
+ id: memoryId('chatgpt', sourceKey),
66
+ tool: 'chatgpt',
67
+ scope: 'global',
68
+ fact,
69
+ tags: ['chatgpt'],
70
+ provenance: {
71
+ sourceTool: 'chatgpt',
72
+ sourcePath: 'export.zip',
73
+ sourceKey,
74
+ capturedAt: new Date().toISOString(),
75
+ },
76
+ addedAt: addedAt ?? new Date().toISOString(),
77
+ updatedAt: updatedAt ?? new Date().toISOString(),
78
+ };
79
+ }
80
+ function normalizeTs(raw) {
81
+ if (raw === undefined)
82
+ return undefined;
83
+ if (typeof raw === 'number')
84
+ return new Date(raw * 1000).toISOString();
85
+ const parsed = Date.parse(raw);
86
+ if (Number.isNaN(parsed))
87
+ return undefined;
88
+ return new Date(parsed).toISOString();
89
+ }
90
+ function safeJson(raw) {
91
+ try {
92
+ return JSON.parse(raw);
93
+ }
94
+ catch {
95
+ return undefined;
96
+ }
97
+ }
98
+ //# sourceMappingURL=chatgpt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatgpt.js","sourceRoot":"","sources":["../../../src/memory/sources/chatgpt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type Memory } from '../../schema/memory.js';
2
+ export interface ClaudeMemReaderOptions {
3
+ homeDir: string;
4
+ /** Override the claude-mem data dir (default: env or ~/.claude-mem). */
5
+ dataDir?: string;
6
+ }
7
+ export declare function claudeMemDbPath(opts: ClaudeMemReaderOptions): string;
8
+ export declare function readClaudeMemMemories(opts: ClaudeMemReaderOptions): Promise<Memory[]>;
@@ -0,0 +1,104 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import { createRequire } from 'node:module';
3
+ import { join } from 'node:path';
4
+ import { memoryId } from '../../schema/memory.js';
5
+ import { MEMORY_SCHEMA } from '../../version.js';
6
+ const requireSqlite = createRequire(import.meta.url);
7
+ let cachedSqlite;
8
+ function loadSqlite() {
9
+ if (!cachedSqlite) {
10
+ cachedSqlite = requireSqlite('node:sqlite');
11
+ }
12
+ return cachedSqlite;
13
+ }
14
+ export function claudeMemDbPath(opts) {
15
+ const dataDir = opts.dataDir ?? process.env['CLAUDE_MEM_DATA_DIR'] ?? join(opts.homeDir, '.claude-mem');
16
+ return join(dataDir, 'claude-mem.db');
17
+ }
18
+ export async function readClaudeMemMemories(opts) {
19
+ const dbPath = claudeMemDbPath(opts);
20
+ try {
21
+ await fs.access(dbPath);
22
+ }
23
+ catch {
24
+ return [];
25
+ }
26
+ const { DatabaseSync } = loadSqlite();
27
+ const db = new DatabaseSync(dbPath, { readonly: true });
28
+ try {
29
+ const rows = db
30
+ .prepare(`SELECT id, memory_session_id, project, type, title, text, narrative,
31
+ facts, concepts, files_modified, created_at, content_hash
32
+ FROM observations
33
+ ORDER BY created_at_epoch DESC`)
34
+ .all();
35
+ return rows.map(observationToMemory).filter((m) => m !== undefined);
36
+ }
37
+ finally {
38
+ db.close();
39
+ }
40
+ }
41
+ function observationToMemory(row) {
42
+ const fact = buildFact(row);
43
+ if (!fact)
44
+ return undefined;
45
+ const sourceKey = row.content_hash || `${row.memory_session_id}-${row.id}`;
46
+ const project = row.project ?? undefined;
47
+ const scope = project ? 'project' : 'global';
48
+ const filesModified = parseStringList(row.files_modified);
49
+ const tags = uniq([row.type, ...filesModified].filter(Boolean));
50
+ return {
51
+ schema: MEMORY_SCHEMA,
52
+ id: memoryId('claude-mem', sourceKey),
53
+ tool: 'claude-mem',
54
+ scope,
55
+ ...(project ? { project } : {}),
56
+ fact,
57
+ tags,
58
+ provenance: {
59
+ sourceTool: 'claude-mem',
60
+ sourcePath: '~/.claude-mem/claude-mem.db',
61
+ sourceKey,
62
+ capturedAt: new Date().toISOString(),
63
+ },
64
+ addedAt: row.created_at,
65
+ updatedAt: row.created_at,
66
+ };
67
+ }
68
+ function buildFact(row) {
69
+ const parts = [];
70
+ if (row.title)
71
+ parts.push(row.title);
72
+ if (row.text && row.text !== row.title)
73
+ parts.push(row.text);
74
+ else if (row.narrative)
75
+ parts.push(row.narrative);
76
+ const facts = parseStringList(row.facts);
77
+ if (facts.length > 0)
78
+ parts.push(facts.map(f => `- ${f}`).join('\n'));
79
+ const concepts = parseStringList(row.concepts);
80
+ if (concepts.length > 0)
81
+ parts.push(`Concepts: ${concepts.join(', ')}`);
82
+ const joined = parts.join('\n').trim();
83
+ return joined.length > 0 ? joined : undefined;
84
+ }
85
+ function parseStringList(raw) {
86
+ if (!raw)
87
+ return [];
88
+ try {
89
+ const parsed = JSON.parse(raw);
90
+ if (Array.isArray(parsed))
91
+ return parsed.filter((v) => typeof v === 'string');
92
+ }
93
+ catch {
94
+ // fall through
95
+ }
96
+ return raw
97
+ .split(',')
98
+ .map(s => s.trim())
99
+ .filter(Boolean);
100
+ }
101
+ function uniq(values) {
102
+ return [...new Set(values)];
103
+ }
104
+ //# sourceMappingURL=claude-mem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-mem.js","sourceRoot":"","sources":["../../../src/memory/sources/claude-mem.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type Memory } from '../../schema/memory.js';
2
+ export interface CodexMemoryReaderOptions {
3
+ homeDir: string;
4
+ /** Override the Codex memories sqlite path. */
5
+ dbPath?: string;
6
+ }
7
+ export declare function codexMemoryDbPath(opts: CodexMemoryReaderOptions): string;
8
+ export declare function readCodexMemories(opts: CodexMemoryReaderOptions): Promise<Memory[]>;
@@ -0,0 +1,77 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import { createRequire } from 'node:module';
3
+ import { join } from 'node:path';
4
+ import { memoryId } from '../../schema/memory.js';
5
+ import { MEMORY_SCHEMA } from '../../version.js';
6
+ const requireSqlite = createRequire(import.meta.url);
7
+ let cachedSqlite;
8
+ function loadSqlite() {
9
+ if (!cachedSqlite) {
10
+ cachedSqlite = requireSqlite('node:sqlite');
11
+ }
12
+ return cachedSqlite;
13
+ }
14
+ export function codexMemoryDbPath(opts) {
15
+ return opts.dbPath ?? join(opts.homeDir, '.codex', 'memories_1.sqlite');
16
+ }
17
+ export async function readCodexMemories(opts) {
18
+ const dbPath = codexMemoryDbPath(opts);
19
+ try {
20
+ await fs.access(dbPath);
21
+ }
22
+ catch {
23
+ return [];
24
+ }
25
+ const { DatabaseSync } = loadSqlite();
26
+ const db = new DatabaseSync(dbPath, { readonly: true });
27
+ try {
28
+ const rows = db
29
+ .prepare(`SELECT thread_id, raw_memory, rollout_summary, rollout_slug,
30
+ generated_at, source_updated_at, usage_count
31
+ FROM stage1_outputs
32
+ ORDER BY source_updated_at DESC`)
33
+ .all();
34
+ return rows.map(stage1RowToMemory).filter((m) => m !== undefined);
35
+ }
36
+ finally {
37
+ db.close();
38
+ }
39
+ }
40
+ function stage1RowToMemory(row) {
41
+ const fact = buildFact(row);
42
+ if (!fact)
43
+ return undefined;
44
+ const tags = uniq(['codex', row.rollout_slug ?? ''].filter(Boolean));
45
+ const generatedAt = new Date(row.generated_at).toISOString();
46
+ const sourceUpdatedAt = new Date(row.source_updated_at).toISOString();
47
+ return {
48
+ schema: MEMORY_SCHEMA,
49
+ id: memoryId('codex', row.thread_id),
50
+ tool: 'codex',
51
+ scope: 'global',
52
+ fact,
53
+ tags,
54
+ provenance: {
55
+ sourceTool: 'codex',
56
+ sourcePath: '~/.codex/memories_1.sqlite',
57
+ sourceKey: row.thread_id,
58
+ capturedAt: new Date().toISOString(),
59
+ },
60
+ addedAt: generatedAt,
61
+ updatedAt: sourceUpdatedAt,
62
+ };
63
+ }
64
+ function buildFact(row) {
65
+ const summary = row.rollout_summary?.trim() ?? '';
66
+ const memoryBody = row.raw_memory?.trim() ?? '';
67
+ if (memoryBody) {
68
+ if (summary && summary !== memoryBody)
69
+ return `${summary}\n\n${memoryBody}`;
70
+ return memoryBody;
71
+ }
72
+ return summary || undefined;
73
+ }
74
+ function uniq(values) {
75
+ return [...new Set(values)];
76
+ }
77
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/memory/sources/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type Memory } from '../schema/memory.js';
2
+ export declare function memoryLogPath(): string;
3
+ export interface MemoryWriteStats {
4
+ appended: number;
5
+ bytes: number;
6
+ }
7
+ export declare function appendMemories(memories: Memory[]): Promise<MemoryWriteStats>;
8
+ /**
9
+ * Read the log and return the latest version of every Memory, keyed by id.
10
+ *
11
+ * Order is "as-seen" — the underlying file is append-only, so the order
12
+ * matches actual capture/import history. Callers re-sort as needed.
13
+ */
14
+ export declare function readMemories(): Promise<Memory[]>;
15
+ /**
16
+ * Check whether a Memory with the given id is already stored. Used by
17
+ * capture readers to avoid emitting JSONL noise for unchanged rows.
18
+ */
19
+ export declare function hasMemory(id: string): Promise<boolean>;