causantic 0.5.2 → 0.5.3

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/README.md CHANGED
@@ -38,29 +38,29 @@ Developers using Claude Code who want their AI assistant to **remember across se
38
38
 
39
39
  ## Why Causantic?
40
40
 
41
- Most AI memory systems use vector embeddings for similarity search. Causantic does too — but adds a **causal graph** that tracks *relationships* between memory chunks, **BM25 keyword search** for exact matches, and **HDBSCAN clustering** for topic expansion. The result:
42
-
43
- | | Vector Search Only | Causantic |
44
- |---|---|---|
45
- | **Finds similar content** | Yes | Yes |
46
- | **Finds lexically relevant content** | No | Yes (BM25 keyword search) |
47
- | **Finds related context** | No | Yes (causal edges) |
48
- | **Finds topically related context** | No | Yes (cluster expansion) |
49
- | **Temporal awareness** | Wall-clock decay | Episodic chain walking |
50
- | **Context augmentation** | 1× | **2.46×** (chain walking adds episodic narrative) |
51
- | **Handles project switches** | Breaks continuity | Preserves causality |
52
- | **Bidirectional queries** | Forward only | Backward + Forward |
41
+ Most AI memory systems use vector embeddings for similarity search. Causantic does too — but adds a **causal graph** that tracks _relationships_ between memory chunks, **BM25 keyword search** for exact matches, and **HDBSCAN clustering** for topic expansion. The result:
42
+
43
+ | | Vector Search Only | Causantic |
44
+ | ------------------------------------ | ------------------ | ------------------------------------------------- |
45
+ | **Finds similar content** | Yes | Yes |
46
+ | **Finds lexically relevant content** | No | Yes (BM25 keyword search) |
47
+ | **Finds related context** | No | Yes (causal edges) |
48
+ | **Finds topically related context** | No | Yes (cluster expansion) |
49
+ | **Temporal awareness** | Wall-clock decay | Episodic chain walking |
50
+ | **Context augmentation** | 1× | **2.46×** (chain walking adds episodic narrative) |
51
+ | **Handles project switches** | Breaks continuity | Preserves causality |
52
+ | **Bidirectional queries** | Forward only | Backward + Forward |
53
53
 
54
54
  ### How It Compares
55
55
 
56
- | System | Local-First | Temporal Decay | Graph Structure | Self-Benchmarking |
57
- |--------|:-----------:|:--------------:|:--------------:|:-----------------:|
58
- | **Causantic** | **Yes** | **Chain walking** | **Causal graph** | **Yes** |
59
- | Mem0 | No (Cloud) | None | Paid add-on | No |
60
- | Cognee | Self-hostable | None | Triplet extraction | No |
61
- | Letta/MemGPT | Self-hostable | Summarization | None | No |
62
- | Zep | Enterprise | Bi-temporal | Temporal KG | No |
63
- | GraphRAG | Self-hostable | Static corpus | Hierarchical | No |
56
+ | System | Local-First | Temporal Decay | Graph Structure | Self-Benchmarking |
57
+ | ------------- | :-----------: | :---------------: | :----------------: | :---------------: |
58
+ | **Causantic** | **Yes** | **Chain walking** | **Causal graph** | **Yes** |
59
+ | Mem0 | No (Cloud) | None | Paid add-on | No |
60
+ | Cognee | Self-hostable | None | Triplet extraction | No |
61
+ | Letta/MemGPT | Self-hostable | Summarization | None | No |
62
+ | Zep | Enterprise | Bi-temporal | Temporal KG | No |
63
+ | GraphRAG | Self-hostable | Static corpus | Hierarchical | No |
64
64
 
65
65
  See [Landscape Analysis](docs/research/approach/landscape-analysis.md) for detailed per-system analysis.
66
66
 
@@ -70,7 +70,7 @@ See [Landscape Analysis](docs/research/approach/landscape-analysis.md) for detai
70
70
  All data stays on your machine. Optional per-chunk encryption (ChaCha20-Poly1305) with keys stored in your system keychain. No cloud dependency.
71
71
 
72
72
  **2. Hybrid BM25 + Vector Search**
73
- Vector search finds chunks that *look similar*. BM25 keyword search finds chunks with *exact lexical matches* — function names, error codes, CLI flags. Both run in parallel and fuse via Reciprocal Rank Fusion (RRF).
73
+ Vector search finds chunks that _look similar_. BM25 keyword search finds chunks with _exact lexical matches_ — function names, error codes, CLI flags. Both run in parallel and fuse via Reciprocal Rank Fusion (RRF).
74
74
 
75
75
  **3. Sequential Causal Graph with Episodic Chain Walking**
76
76
  Chunks are connected in a sequential linked list — intra-turn chunks chained sequentially, inter-turn edges linking last→first, cross-session edges bridging sessions. The `recall` tool walks this graph backward to reconstruct episodic narratives; `predict` walks forward. Chains are scored by cosine similarity per token, producing ordered narratives where each chunk adds new information.
@@ -158,17 +158,17 @@ Measure how well your memory system is working with built-in benchmarks. Health,
158
158
 
159
159
  The MCP server exposes nine tools:
160
160
 
161
- | Tool | Description |
162
- |------|-------------|
163
- | `search` | Semantic discovery — "what do I know about X?" Vector + keyword + RRF + cluster expansion. |
164
- | `recall` | Episodic memory — "how did we solve X?" Seeds → backward chain walk → ordered narrative. Includes chain walk diagnostics on fallback. |
165
- | `predict` | Forward episodic — "what's likely next?" Seeds → forward chain walk → ordered narrative. Includes chain walk diagnostics on fallback. |
166
- | `list-projects` | Discover available projects with chunk counts and date ranges. |
167
- | `list-sessions` | Browse sessions for a project with time filtering. |
168
- | `reconstruct` | Rebuild session context chronologically — "what did I work on yesterday?" |
169
- | `hook-status` | Check when hooks last ran and whether they succeeded. |
170
- | `stats` | Memory statistics — version, chunk/edge/cluster counts, per-project breakdowns. |
171
- | `forget` | Delete chunks by project, time range, session, or semantic query. Defaults to dry-run preview. |
161
+ | Tool | Description |
162
+ | --------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
163
+ | `search` | Semantic discovery — "what do I know about X?" Vector + keyword + RRF + cluster expansion. |
164
+ | `recall` | Episodic memory — "how did we solve X?" Seeds → backward chain walk → ordered narrative. Includes chain walk diagnostics on fallback. |
165
+ | `predict` | Forward episodic — "what's likely next?" Seeds → forward chain walk → ordered narrative. Includes chain walk diagnostics on fallback. |
166
+ | `list-projects` | Discover available projects with chunk counts and date ranges. |
167
+ | `list-sessions` | Browse sessions for a project with time filtering. |
168
+ | `reconstruct` | Rebuild session context chronologically — "what did I work on yesterday?" |
169
+ | `hook-status` | Check when hooks last ran and whether they succeeded. |
170
+ | `stats` | Memory statistics — version, chunk/edge/cluster counts, per-project breakdowns. |
171
+ | `forget` | Delete chunks by project, time range, session, or semantic query. Defaults to dry-run preview. |
172
172
 
173
173
  ### Claude Code Integration
174
174
 
@@ -191,22 +191,22 @@ Or run `npx causantic init` to configure automatically.
191
191
 
192
192
  Causantic installs 14 Claude Code slash commands (via `npx causantic init`) for natural-language interaction with memory:
193
193
 
194
- | Skill | Description |
195
- |-------|-------------|
196
- | `/causantic-recall [query]` | Reconstruct how something happened — walks backward through causal chains (how did we solve X?) |
197
- | `/causantic-search [query]` | Broad discovery — find everything memory knows about a topic (what do I know about X?) |
198
- | `/causantic-predict <context>` | Surface what came after similar past situations — walks forward through causal chains (what's likely relevant next?) |
199
- | `/causantic-explain [question]` | Answer "why" questions using memory + codebase (why does X work this way?) |
200
- | `/causantic-debug [error]` | Search for prior encounters with an error (auto-extracts from conversation if no argument) |
201
- | `/causantic-resume` | Resume interrupted work — start-of-session briefing |
202
- | `/causantic-reconstruct [time]` | Replay a past session chronologically by time range |
203
- | `/causantic-summary [time]` | Factual recap of what was done across recent sessions |
204
- | `/causantic-list-projects` | Discover available projects in memory |
205
- | `/causantic-status` | Check system health and memory statistics |
206
- | `/causantic-crossref [pattern]` | Search across all projects for reusable patterns |
207
- | `/causantic-retro [scope]` | Surface recurring patterns, problems, and decisions across sessions |
208
- | `/causantic-cleanup` | Memory-informed codebase review and cleanup plan |
209
- | `/causantic-forget [query]` | Delete memory by topic, time range, or session (always previews first) |
194
+ | Skill | Description |
195
+ | ------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
196
+ | `/causantic-recall [query]` | Reconstruct how something happened — walks backward through causal chains (how did we solve X?) |
197
+ | `/causantic-search [query]` | Broad discovery — find everything memory knows about a topic (what do I know about X?) |
198
+ | `/causantic-predict <context>` | Surface what came after similar past situations — walks forward through causal chains (what's likely relevant next?) |
199
+ | `/causantic-explain [question]` | Answer "why" questions using memory + codebase (why does X work this way?) |
200
+ | `/causantic-debug [error]` | Search for prior encounters with an error (auto-extracts from conversation if no argument) |
201
+ | `/causantic-resume` | Resume interrupted work — start-of-session briefing |
202
+ | `/causantic-reconstruct [time]` | Replay a past session chronologically by time range |
203
+ | `/causantic-summary [time]` | Factual recap of what was done across recent sessions |
204
+ | `/causantic-list-projects` | Discover available projects in memory |
205
+ | `/causantic-status` | Check system health and memory statistics |
206
+ | `/causantic-crossref [pattern]` | Search across all projects for reusable patterns |
207
+ | `/causantic-retro [scope]` | Surface recurring patterns, problems, and decisions across sessions |
208
+ | `/causantic-cleanup` | Memory-informed codebase review and cleanup plan |
209
+ | `/causantic-forget [query]` | Delete memory by topic, time range, or session (always previews first) |
210
210
 
211
211
  Skills are installed to `~/.claude/skills/causantic-*/` and work as slash commands in Claude Code. They orchestrate the MCP tools above with structured prompts tailored to each use case.
212
212
 
@@ -249,7 +249,7 @@ Create `causantic.config.json` in your project root:
249
249
  {
250
250
  "$schema": "https://raw.githubusercontent.com/Entrolution/causantic/main/config.schema.json",
251
251
  "clustering": {
252
- "threshold": 0.10,
252
+ "threshold": 0.1,
253
253
  "minClusterSize": 4
254
254
  },
255
255
  "vectors": {
@@ -283,13 +283,13 @@ See [Security Guide](docs/guides/security.md).
283
283
 
284
284
  Built on rigorous experimentation across 75 sessions and 297+ queries:
285
285
 
286
- | Experiment | Result | Notes |
287
- |------------|--------|-------|
288
- | Chain Walking (v0.3) | **2.46×** context | vs vector-only, 297 queries, 15 projects |
289
- | Topic Detection | 0.998 AUC | near-perfect accuracy |
290
- | Clustering | F1=0.940 | 100% precision |
291
- | Thinking Block Removal | +0.063 AUC | embedding quality improvement |
292
- | Collection Benchmark | **64/100** | health, retrieval, chain quality, latency |
286
+ | Experiment | Result | Notes |
287
+ | ---------------------- | ----------------- | ----------------------------------------- |
288
+ | Chain Walking (v0.3) | **2.46×** context | vs vector-only, 297 queries, 15 projects |
289
+ | Topic Detection | 0.998 AUC | near-perfect accuracy |
290
+ | Clustering | F1=0.940 | 100% precision |
291
+ | Thinking Block Removal | +0.063 AUC | embedding quality improvement |
292
+ | Collection Benchmark | **64/100** | health, retrieval, chain quality, latency |
293
293
 
294
294
  > **Note**: An earlier version (v0.2) reported 4.65× augmentation using sum-product graph traversal with m×n all-pairs edges (492 queries, 25 projects). That architecture was replaced in v0.3 after collection benchmarks showed graph traversal contributing only ~2% of results. See [lessons learned](docs/research/experiments/lessons-learned.md) for the full story.
295
295
 
@@ -13,7 +13,7 @@
13
13
  "type": "number",
14
14
  "minimum": 0.01,
15
15
  "maximum": 0.5,
16
- "default": 0.10,
16
+ "default": 0.1,
17
17
  "description": "Angular distance threshold for cluster assignment"
18
18
  },
19
19
  "minClusterSize": {
@@ -1 +1 @@
1
- {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/archive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAG3C,eAAO,MAAM,aAAa,EAAE,OAuC3B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,OAwC3B,CAAC"}
1
+ {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/archive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAa3C,eAAO,MAAM,aAAa,EAAE,OAkE3B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,OAwD3B,CAAC"}
@@ -1,13 +1,31 @@
1
1
  import { promptPassword, isEncryptedArchive } from '../utils.js';
2
+ function formatSize(bytes) {
3
+ if (bytes < 1024)
4
+ return `${bytes} B`;
5
+ if (bytes < 1024 * 1024)
6
+ return `${(bytes / 1024).toFixed(1)} KB`;
7
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
8
+ }
9
+ function formatCount(n) {
10
+ return n.toLocaleString();
11
+ }
2
12
  export const exportCommand = {
3
13
  name: 'export',
4
14
  description: 'Export memory data',
5
- usage: 'causantic export --output <path> [--no-encrypt]',
15
+ usage: 'causantic export --output <path> [--no-encrypt] [--projects <slugs>] [--redact-paths] [--redact-code] [--no-vectors]',
6
16
  handler: async (args) => {
7
17
  const { exportArchive } = await import('../../storage/archive.js');
8
18
  const outputIndex = args.indexOf('--output');
9
19
  const outputPath = outputIndex >= 0 ? args[outputIndex + 1] : 'causantic-backup.causantic';
10
20
  const noEncrypt = args.includes('--no-encrypt');
21
+ const noVectors = args.includes('--no-vectors');
22
+ const redactPaths = args.includes('--redact-paths');
23
+ const redactCode = args.includes('--redact-code');
24
+ // Parse --projects flag
25
+ const projectsIndex = args.indexOf('--projects');
26
+ const projects = projectsIndex >= 0 && args[projectsIndex + 1]
27
+ ? args[projectsIndex + 1].split(',').map((s) => s.trim())
28
+ : undefined;
11
29
  let password;
12
30
  if (!noEncrypt) {
13
31
  password = process.env.CAUSANTIC_EXPORT_PASSWORD;
@@ -30,25 +48,41 @@ export const exportCommand = {
30
48
  process.exit(2);
31
49
  }
32
50
  }
33
- await exportArchive({
51
+ const result = await exportArchive({
34
52
  outputPath,
35
53
  password,
54
+ projects,
55
+ redactPaths,
56
+ redactCode,
57
+ noVectors,
36
58
  });
37
- console.log(`Exported to ${outputPath}`);
59
+ const parts = [
60
+ `${formatCount(result.chunkCount)} chunks`,
61
+ `${formatCount(result.edgeCount)} edges`,
62
+ `${formatCount(result.clusterCount)} clusters`,
63
+ `${formatCount(result.vectorCount)} vectors`,
64
+ ];
65
+ const suffix = [result.compressed ? 'compressed' : null, result.encrypted ? 'encrypted' : null]
66
+ .filter(Boolean)
67
+ .join(', ');
68
+ console.log(`Exported: ${parts.join(', ')} (${formatSize(result.fileSize)} ${suffix})`);
69
+ console.log(`File: ${outputPath}`);
38
70
  },
39
71
  };
40
72
  export const importCommand = {
41
73
  name: 'import',
42
74
  description: 'Import memory data',
43
- usage: 'causantic import <file> [--merge]',
75
+ usage: 'causantic import <file> [--merge] [--dry-run]',
44
76
  handler: async (args) => {
45
77
  if (args.length === 0) {
46
78
  console.error('Error: File path required');
47
79
  process.exit(2);
48
80
  }
49
81
  const { importArchive } = await import('../../storage/archive.js');
50
- const inputPath = args[0];
82
+ // Find file path (first arg that isn't a flag)
83
+ const inputPath = args.find((a) => !a.startsWith('--'));
51
84
  const merge = args.includes('--merge');
85
+ const dryRun = args.includes('--dry-run');
52
86
  const encrypted = await isEncryptedArchive(inputPath);
53
87
  let password;
54
88
  if (encrypted) {
@@ -65,12 +99,24 @@ export const importCommand = {
65
99
  process.exit(2);
66
100
  }
67
101
  }
68
- await importArchive({
102
+ const result = await importArchive({
69
103
  inputPath,
70
104
  password,
71
105
  merge,
106
+ dryRun,
72
107
  });
73
- console.log('Import complete.');
108
+ const parts = [
109
+ `${formatCount(result.chunkCount)} chunks`,
110
+ `${formatCount(result.edgeCount)} edges`,
111
+ `${formatCount(result.clusterCount)} clusters`,
112
+ `${formatCount(result.vectorCount)} vectors`,
113
+ ];
114
+ if (result.dryRun) {
115
+ console.log(`Dry run — would import: ${parts.join(', ')}`);
116
+ }
117
+ else {
118
+ console.log(`Imported: ${parts.join(', ')}`);
119
+ }
74
120
  },
75
121
  };
76
122
  //# sourceMappingURL=archive.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../../src/cli/commands/archive.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../../src/cli/commands/archive.ts"],"names":[],"mappings":"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"}
@@ -162,5 +162,5 @@ ${D}
162
162
  ${X.preview.slice(0,100)}...
163
163
  ${new Date(X.startTime).toLocaleString()}`})},[n,i,r,o,f,h,v,m]),_.jsx("div",{className:"w-full h-full",children:_.jsx("svg",{ref:d,className:"w-full h-full"})})}const Fs=36e5,rp=20;function T4(n,a){if(n.length<=1)return{longestStreak:n.length===1?{cluster:a(n[0].clusterId),count:1,durationMs:0}:null,mostSwitches:null,focusScore:1};let i={cluster:n[0].clusterId,count:1,startIdx:0,endIdx:0},r={cluster:n[0].clusterId,count:1,startIdx:0};for(let m=1;m<n.length;m++){const h=n[m].clusterId??"__unclustered",v=r.cluster??"__unclustered";h===v?r.count++:(r.count>i.count&&(i={...r,endIdx:m-1}),r={cluster:n[m].clusterId,count:1,startIdx:m})}r.count>i.count&&(i={...r,endIdx:n.length-1});const o=new Date(n[i.endIdx].endTime).getTime()-new Date(n[i.startIdx].startTime).getTime(),f=new Map;let d=0;for(let m=1;m<n.length;m++){const h=n[m-1].clusterId??"__unclustered",v=n[m].clusterId??"__unclustered";if(h!==v){d++;const y=[h,v].sort().join("|"),x=f.get(y);x?x.count++:f.set(y,{from:h,to:v,count:1})}}let g=null;for(const m of f.values())(!g||m.count>g.count)&&(g={from:a(m.from==="__unclustered"?null:m.from),to:a(m.to==="__unclustered"?null:m.to),count:m.count});return{longestStreak:{cluster:a(i.cluster),count:i.count,durationMs:o},mostSwitches:g,focusScore:1-d/(n.length-1)}}function M4(n){if(n<6e4)return"<1m";const a=Math.round(n/6e4);if(a<60)return`${a}m`;const i=Math.floor(a/60),r=a%60;return r>0?`${i}h ${r}m`:`${i}h`}function E4({chunks:n,edges:a,timeRange:i,onChunkClick:r,selectedChunkId:o,clusters:f}){const d=R.useRef(null),g=R.useMemo(()=>new Map((f??[]).map(C=>[C.id,C])),[f]),m=R.useMemo(()=>[...n].sort((C,A)=>new Date(C.startTime).getTime()-new Date(A.startTime).getTime()),[n]),h=R.useMemo(()=>{const C=[],A=new Set;for(const q of m){const L=q.clusterId??"__unclustered";A.has(L)||(A.add(L),L!=="__unclustered"&&C.push(L))}return A.has("__unclustered")&&C.push("__unclustered"),C},[m]),v=R.useMemo(()=>{const A=[...h.filter(q=>q!=="__unclustered")].map(q=>({id:q,info:g.get(q)})).sort((q,L)=>{var J,nt;return(((J=L.info)==null?void 0:J.memberCount)??0)-(((nt=q.info)==null?void 0:nt.memberCount)??0)});return new Map(A.map((q,L)=>[q.id,L]))},[h,g]);function y(C){if(!C||C==="__unclustered")return"#64748b";const A=v.get(C);return A===void 0?"#64748b":Ya[A%Ya.length]}function x(C){if(!C||C==="__unclustered")return"Unclustered";const A=g.get(C);return(A==null?void 0:A.name)??`Topic ${(v.get(C)??0)+1}`}const w=R.useMemo(()=>T4(m,x),[m,g,v]),k=R.useMemo(()=>{const C=new Map;for(const A of m){const q=A.clusterId??"__unclustered",L=C.get(q);L?(L.count++,L.tokens+=A.approxTokens):C.set(q,{count:1,tokens:A.approxTokens})}return C},[m]),N=R.useMemo(()=>{const C=new Map;for(const q of m)C.has(q.sessionId)||C.set(q.sessionId,new Date(q.startTime).getTime());return[...C.entries()].sort((q,L)=>q[1]-L[1]).slice(1).map(([q,L])=>{const J=m.find(nt=>nt.sessionId===q);return{time:L,slug:(J==null?void 0:J.sessionSlug)??q.slice(0,8)}})},[m]);return R.useEffect(()=>{var lt;const C=Ue(d.current);if(C.selectAll("*").remove(),m.length===0||!i.earliest||!i.latest)return;const A=(lt=d.current)==null?void 0:lt.parentElement,q=(A==null?void 0:A.clientWidth)??800,L=(A==null?void 0:A.clientHeight)??400,J={top:30,right:30,bottom:40,left:220},nt=q-J.left-J.right,V=L-J.top-J.bottom,K=Qf().domain([new Date(i.earliest),new Date(i.latest)]).range([0,nt]),st=kf().domain(h).range([0,V]).padding(.25),dt=st.bandwidth();C.attr("width",q).attr("height",L);const vt=C.append("defs");vt.append("clipPath").attr("id","topicflow-clip").append("rect").attr("width",nt).attr("height",V);const _t=new Set;for(let S=0;S<m.length-1;S++){const O=m[S].clusterId??"__unclustered",Z=m[S+1].clusterId??"__unclustered";O!==Z&&_t.add(`${O}||${Z}`)}for(const S of _t){const[O,Z]=S.split("||"),I=`grad-${O}-${Z}`.replace(/[^a-zA-Z0-9-]/g,"_"),tt=vt.append("linearGradient").attr("id",I).attr("x1","0%").attr("y1","0%").attr("x2","100%").attr("y2","0%");tt.append("stop").attr("offset","0%").attr("stop-color",y(O==="__unclustered"?null:O)).attr("stop-opacity",.3),tt.append("stop").attr("offset","100%").attr("stop-color",y(Z==="__unclustered"?null:Z)).attr("stop-opacity",.3)}const X=C.append("g").attr("transform",`translate(${J.left},${J.top})`),ht=X.append("g").attr("transform",`translate(0,${V})`).call(Pu(K).ticks(8)).attr("class","topicflow-axis"),D=X.append("g").attr("class","topicflow-axis");for(const S of h){const O=(st(S)??0)+dt/2,Z=x(S==="__unclustered"?null:S),I=k.get(S),tt=I?I.tokens>=1e3?`${Math.round(I.tokens/1e3)}k`:`${I.tokens}`:"0",ut=I?`${Z} (${I.count}, ${tt} tok)`:Z,ct=ut.length>30?ut.slice(0,28)+"…":ut;D.append("text").attr("x",-8).attr("y",O).attr("text-anchor","end").attr("dominant-baseline","middle").attr("fill","var(--muted-foreground, #94a3b8)").attr("font-size","11px").text(ct).append("title").text(ut)}D.append("line").attr("x1",0).attr("y1",0).attr("x2",0).attr("y2",V).attr("stroke","var(--border-color, #334155)"),X.selectAll(".topicflow-axis line, .topicflow-axis path").attr("stroke","var(--border-color, #334155)"),X.selectAll(".topicflow-axis text").attr("fill","var(--muted-foreground, #94a3b8)");const P=X.append("g").attr("clip-path","url(#topicflow-clip)");function M(S){P.selectAll("*").remove();const O=P.append("g").attr("class","session-boundaries");for(const tt of N){const ut=S(new Date(tt.time));O.append("line").attr("x1",ut).attr("y1",0).attr("x2",ut).attr("y2",V).attr("stroke","#475569").attr("stroke-width",1).attr("stroke-dasharray","4,4").attr("stroke-opacity",.3),O.append("text").attr("x",ut+4).attr("y",10).attr("fill","var(--muted-foreground, #94a3b8)").attr("font-size","9px").attr("fill-opacity",.5).text(tt.slug.length>12?tt.slug.slice(0,10)+"…":tt.slug)}const Z=P.append("g").attr("class","ribbons");for(let tt=0;tt<m.length-1;tt++){const ut=m[tt],ct=m[tt+1],Ct=new Date(ut.endTime).getTime();if(new Date(ct.startTime).getTime()-Ct>Fs){const Yt=(S(new Date(ut.endTime))+S(new Date(ct.startTime)))/2,ge=V/2;Z.append("text").attr("class","gap-indicator").attr("x",Yt).attr("y",ge).attr("text-anchor","middle").attr("dominant-baseline","middle").attr("fill","var(--muted-foreground, #94a3b8)").attr("font-size","12px").attr("fill-opacity",.5).text("⋯");continue}const pt=ut.clusterId??"__unclustered",W=ct.clusterId??"__unclustered",Vt=S(new Date(ut.endTime)),St=S(new Date(ct.startTime)),Kt=dt*.5;if(pt===W){const Yt=(st(pt)??0)+dt*.25;Z.append("rect").attr("class",`ribbon ribbon-${tt}`).attr("x",Math.min(Vt,St)).attr("y",Yt).attr("width",Math.max(1,Math.abs(St-Vt))).attr("height",Kt).attr("fill",y(ut.clusterId)).attr("fill-opacity",.15)}else{const Yt=(st(pt)??0)+dt*.25,ge=Yt+Kt,fn=(st(W)??0)+dt*.25,Vl=fn+Kt,qn=(Vt+St)/2,Xa=`grad-${pt}-${W}`.replace(/[^a-zA-Z0-9-]/g,"_");Z.append("path").attr("class",`ribbon ribbon-${tt}`).attr("d",[`M${Vt},${Yt}`,`C${qn},${Yt} ${qn},${fn} ${St},${fn}`,`L${St},${Vl}`,`C${qn},${Vl} ${qn},${ge} ${Vt},${ge}`,"Z"].join(" ")).attr("fill",`url(#${Xa})`).attr("stroke","none")}}const I=P.append("g").attr("class","chunks");I.selectAll("rect").data(m).join("rect").attr("class",(tt,ut)=>`chunk chunk-${ut}`).attr("x",tt=>S(new Date(tt.startTime))).attr("y",tt=>{const ut=tt.clusterId??"__unclustered";return(st(ut)??0)+dt*.15}).attr("width",tt=>{const ut=S(new Date(tt.endTime))-S(new Date(tt.startTime));return Math.max(4,ut)}).attr("height",dt*.7).attr("rx",2).attr("fill",tt=>y(tt.clusterId)).attr("fill-opacity",tt=>tt.id===o?1:.7).attr("stroke",tt=>tt.id===o?"#ffffff":"none").attr("stroke-width",2).attr("cursor","pointer").on("click",(tt,ut)=>r(ut.id)).on("mouseenter",function(tt,ut){const ct=m.indexOf(ut);Y(ct)}).on("mouseleave",function(){F()}),I.selectAll("rect").append("title").text((tt,ut)=>{const ct=m[ut],Ct=ct.clusterId?g.get(ct.clusterId):null;return`${(Ct==null?void 0:Ct.name)??(ct.clusterId?"Unknown cluster":"Unclustered")}
164
164
  ${ct.preview.slice(0,100)}…
165
- ${new Date(ct.startTime).toLocaleString()}`})}function Y(S){const O=new Set;O.add(S);for(let Z=S-1;Z>=0&&O.size<rp&&!(new Date(m[Z+1].startTime).getTime()-new Date(m[Z].endTime).getTime()>Fs);Z--)O.add(Z);for(let Z=S+1;Z<m.length&&O.size<rp&&!(new Date(m[Z].startTime).getTime()-new Date(m[Z-1].endTime).getTime()>Fs);Z++)O.add(Z);P.selectAll(".chunk").attr("fill-opacity",.1),P.selectAll(".ribbon").attr("opacity",.1),P.selectAll(".gap-indicator").attr("fill-opacity",.1);for(const Z of O)P.select(`.chunk-${Z}`).attr("fill-opacity",1);for(const Z of O)O.has(Z+1)&&P.select(`.ribbon-${Z}`).attr("opacity",1)}function F(){P.selectAll(".chunk").attr("fill-opacity",S=>S.id===o?1:.7),P.selectAll(".ribbon").attr("opacity",1),P.selectAll(".gap-indicator").attr("fill-opacity",.5)}M(K);const at=ky().scaleExtent([.5,20]).translateExtent([[-100,0],[nt+100,L]]).on("zoom",S=>{const O=S.transform.rescaleX(K);ht.call(Pu(O).ticks(8)),M(O)});C.call(at)},[m,i,r,o,h,g,v,k,N]),_.jsxs("div",{className:"w-full h-full flex flex-col",children:[m.length>1&&_.jsxs("div",{className:"flex items-center gap-4 px-4 py-2 text-xs text-muted-foreground border-b border-border shrink-0",children:[w.longestStreak&&_.jsxs("div",{className:"flex items-center gap-1.5 px-2 py-1 bg-muted/30 rounded",children:[_.jsx("span",{className:"font-medium text-foreground",children:"Longest streak:"}),_.jsxs("span",{className:"tabular-nums",children:[w.longestStreak.cluster," (",w.longestStreak.count," chunks, ",M4(w.longestStreak.durationMs),")"]})]}),_.jsxs("div",{className:"flex items-center gap-1.5 px-2 py-1 bg-muted/30 rounded",children:[_.jsx("span",{className:"font-medium text-foreground",children:"Most switches:"}),_.jsx("span",{className:"tabular-nums",children:w.mostSwitches?`${w.mostSwitches.from} ↔ ${w.mostSwitches.to} (${w.mostSwitches.count}×)`:"—"})]}),_.jsxs("div",{className:"flex items-center gap-1.5 px-2 py-1 bg-muted/30 rounded",children:[_.jsx("span",{className:"font-medium text-foreground",children:"Focus:"}),_.jsxs("span",{className:"tabular-nums",children:[Math.round(w.focusScore*100),"%"]})]})]}),_.jsx("div",{className:"flex-1 min-h-0",children:_.jsx("svg",{ref:d,className:"w-full h-full"})})]})}function A4({clusters:n,activeClusterIds:a,unclusteredCount:i}){var k;const r=R.useRef(null),[o,f]=R.useState({visible:!1,cluster:null,anchorRect:null}),d=new Map(n.map(N=>[N.id,N])),m=[...a.map(N=>({id:N,info:d.get(N)})).sort((N,C)=>{var A,q;return(((A=C.info)==null?void 0:A.memberCount)??0)-(((q=N.info)==null?void 0:q.memberCount)??0)}).map((N,C)=>{var A,q;return{key:N.id,color:Ya[C%Ya.length],name:((A=N.info)==null?void 0:A.name)??`Topic ${C+1}`,count:((q=N.info)==null?void 0:q.memberCount)??0,info:N.info??null}}),...i>0?[{key:"_unclustered",color:"#64748b",name:"Unclustered",count:i,info:null}]:[]],h=(N,C)=>{const A=N.currentTarget.getBoundingClientRect();f({visible:!0,cluster:C,anchorRect:A})},v=()=>{f({visible:!1,cluster:null,anchorRect:null})},y=(k=r.current)==null?void 0:k.getBoundingClientRect(),x=o.anchorRect&&y?Math.min(o.anchorRect.left-y.left,y.width-296):0,w=o.anchorRect&&y?o.anchorRect.bottom-y.top+6:0;return _.jsxs("div",{ref:r,className:"relative rounded-lg border border-border bg-card px-4 py-2.5",children:[_.jsx("div",{className:"text-[10px] font-semibold text-muted-foreground uppercase tracking-wider mb-2",children:"Topic Clusters"}),_.jsx("div",{className:"grid gap-x-6 gap-y-1",style:{gridTemplateColumns:"repeat(auto-fill, minmax(220px, 1fr))"},children:m.map(N=>_.jsxs("div",{className:"flex items-center gap-2 text-xs cursor-default hover:bg-muted/50 rounded px-1.5 py-0.5 transition-colors min-w-0",onMouseEnter:N.info?C=>h(C,N.info):void 0,onMouseLeave:v,children:[_.jsx("span",{className:"inline-block w-2.5 h-2.5 rounded-full shrink-0",style:{backgroundColor:N.color}}),_.jsx("span",{className:"text-foreground truncate",children:N.name}),_.jsx("span",{className:"text-muted-foreground tabular-nums ml-auto shrink-0",children:N.count})]},N.key))}),o.visible&&o.cluster&&_.jsxs("div",{className:"absolute z-50 rounded-md border border-border/80 bg-card/50 backdrop-blur-md px-3 py-2.5 text-xs shadow-lg w-72 pointer-events-none",style:{left:Math.max(0,x),top:w},children:[_.jsx("div",{className:"font-semibold text-foreground mb-1",children:o.cluster.name??"Unnamed"}),o.cluster.description&&_.jsx("p",{className:"text-muted-foreground mb-2 leading-relaxed",children:o.cluster.description}),_.jsx("div",{className:"flex gap-4 text-muted-foreground",children:_.jsxs("div",{children:["Members: ",_.jsx("span",{className:"text-foreground tabular-nums",children:o.cluster.memberCount})]})})]})]})}function C4({chunkId:n,onClose:a,onWalkChain:i}){var d;const{data:r}=Pe(`/api/chunks?chunkId=${n}`),{data:o}=Pe(`/api/edges?chunkId=${n}&limit=20`),f=(d=r==null?void 0:r.chunks)==null?void 0:d[0];return _.jsxs("div",{className:"flex flex-col gap-3 h-full",children:[_.jsxs("div",{className:"flex items-center justify-between",children:[_.jsx("h3",{className:"text-sm font-semibold",children:"Chunk Inspector"}),_.jsx("button",{onClick:a,className:"rounded p-1 hover:bg-muted",children:_.jsx(f2,{className:"h-4 w-4"})})]}),f?_.jsxs("div",{className:"space-y-3 text-sm overflow-y-auto flex-1",children:[_.jsxs("div",{className:"space-y-1",children:[_.jsxs("div",{children:[_.jsx("span",{className:"text-muted-foreground",children:"ID: "}),_.jsxs("code",{className:"text-xs",children:[f.id.slice(0,12),"..."]})]}),_.jsxs("div",{children:[_.jsx("span",{className:"text-muted-foreground",children:"Project: "}),_.jsx(Bn,{variant:"secondary",children:f.sessionSlug})]}),_.jsxs("div",{children:[_.jsx("span",{className:"text-muted-foreground",children:"Time: "}),new Date(f.startTime).toLocaleString()]}),_.jsxs("div",{children:[_.jsx("span",{className:"text-muted-foreground",children:"Tokens: "}),f.approxTokens]})]}),_.jsx("div",{className:"border-t border-border pt-2",children:_.jsx("p",{className:"text-xs text-muted-foreground line-clamp-6 whitespace-pre-wrap",children:f.content.slice(0,500)})}),_.jsxs("div",{className:"flex gap-2",children:[_.jsxs("button",{onClick:()=>i(n,"backward"),className:"flex flex-1 items-center justify-center gap-1 rounded-md border border-border px-3 py-2 text-xs hover:bg-muted transition-colors",children:[_.jsx(Pb,{className:"h-3 w-3"}),"Walk Backward"]}),_.jsxs("button",{onClick:()=>i(n,"forward"),className:"flex flex-1 items-center justify-center gap-1 rounded-md border border-border px-3 py-2 text-xs hover:bg-muted transition-colors",children:["Walk Forward",_.jsx(t2,{className:"h-3 w-3"})]})]}),o&&o.edges.length>0&&_.jsxs("div",{className:"space-y-1 border-t border-border pt-2",children:[_.jsxs("h4",{className:"text-xs font-medium",children:["Edges (",o.total,")"]}),_.jsx("div",{className:"space-y-1 max-h-32 overflow-y-auto",children:o.edges.map(g=>_.jsxs("div",{className:"flex items-center gap-2 text-[10px]",children:[_.jsx(Bn,{variant:g.type==="backward"?"default":"outline",className:"text-[9px]",children:g.type}),g.referenceType&&_.jsx("span",{className:"text-muted-foreground",children:g.referenceType}),_.jsx("span",{className:"ml-auto tabular-nums",children:g.weight.toFixed(2)})]},g.id))})]})]}):_.jsx("p",{className:"text-sm text-muted-foreground",children:"Loading chunk..."})]})}function z4({chunkId:n,direction:a,onDirectionChange:i}){const{data:r,loading:o}=Pe(`/api/chain/walk?chunkId=${n}&direction=${a}`);return _.jsxs("div",{className:"flex flex-col gap-3 h-full",children:[_.jsxs("div",{className:"flex items-center justify-between",children:[_.jsx("h3",{className:"text-sm font-semibold",children:"Chain Walk"}),_.jsxs("div",{className:"flex gap-1",children:[_.jsx("button",{onClick:()=>i("backward"),className:`rounded px-2 py-1 text-xs transition-colors ${a==="backward"?"bg-accent/20 text-accent":"text-muted-foreground hover:bg-muted"}`,children:"Backward"}),_.jsx("button",{onClick:()=>i("forward"),className:`rounded px-2 py-1 text-xs transition-colors ${a==="forward"?"bg-accent/20 text-accent":"text-muted-foreground hover:bg-muted"}`,children:"Forward"})]})]}),o&&_.jsx(ii,{}),r&&r.chain.length===0&&_.jsxs("p",{className:"text-sm text-muted-foreground",children:["No chain found — this chunk has no connected edges in the ",a," direction."]}),r&&_.jsxs("div",{className:"flex-1 overflow-y-auto space-y-2",children:[_.jsx(cp,{chunk:r.seed,position:0,total:r.chain.length+1,isSeed:!0}),r.chain.map((f,d)=>_.jsx(cp,{chunk:f,position:d+1,total:r.chain.length+1},f.id)),r.chain.length>0&&_.jsxs("div",{className:"text-xs text-muted-foreground pt-1",children:["Total: ",r.totalTokens.toLocaleString()," tokens"]})]})]})}function cp({chunk:n,position:a,total:i,isSeed:r=!1}){return _.jsxs("div",{className:`rounded-md border p-3 text-sm space-y-1 ${r?"border-accent bg-accent/5":"border-border bg-card"}`,children:[_.jsxs("div",{className:"flex items-center justify-between",children:[_.jsxs("div",{className:"flex items-center gap-2",children:[r&&_.jsx(Bn,{variant:"default",className:"text-[10px]",children:"Seed"}),_.jsx(Bn,{variant:"secondary",className:"text-[10px]",children:n.sessionSlug})]}),_.jsxs("span",{className:"text-xs text-muted-foreground tabular-nums",children:[a+1,"/",i]})]}),_.jsx("p",{className:"text-xs text-muted-foreground line-clamp-3",children:n.preview}),_.jsxs("div",{className:"text-[10px] text-muted-foreground",children:[new Date(n.startTime).toLocaleString()," · ",n.approxTokens," tokens"]})]})}function N4(){const[n,a]=R.useState(""),[i,r]=R.useState(null),[o,f]=R.useState(null),[d,g]=R.useState("backward"),{data:m}=Pe("/api/projects"),{data:h}=Pe("/api/clusters"),v=`/api/timeline?limit=500${n?`&project=${n}`:""}`,{data:y,loading:x}=Pe(v),w=((m==null?void 0:m.projects)??[]).map(A=>({value:A.slug,label:`${A.slug} (${A.chunkCount})`})),k=R.useCallback(A=>{r(A)},[]),N=R.useCallback((A,q)=>{f(A),g(q)},[]),C=i||o;return _.jsxs("div",{className:"flex h-[calc(100vh-8rem)] flex-col gap-4 animate-fade-in",children:[_.jsxs("div",{className:"flex items-center justify-between",children:[_.jsx("h1",{className:"text-2xl font-bold",children:"Timeline"}),_.jsx(_4,{value:n,onChange:A=>{a(A.target.value),r(null),f(null)},options:w,placeholder:"All projects",className:"w-60"})]}),h&&y&&y.chunks.length>0&&_.jsx(A4,{clusters:h.clusters,activeClusterIds:[...new Set(y.chunks.map(A=>A.clusterId).filter(Boolean))],unclusteredCount:y.chunks.filter(A=>!A.clusterId).length}),_.jsx("div",{className:`rounded-lg border border-border bg-card overflow-hidden relative ${C?"flex-1 min-h-[200px]":"flex-1"}`,children:x?_.jsx(ii,{}):y&&y.chunks.length>0?n?_.jsx(E4,{chunks:y.chunks,edges:y.edges,timeRange:y.timeRange,onChunkClick:k,selectedChunkId:i,clusters:h==null?void 0:h.clusters}):_.jsx(w4,{chunks:y.chunks,edges:y.edges,timeRange:y.timeRange,onChunkClick:k,selectedChunkId:i,clusters:h==null?void 0:h.clusters}):_.jsx("div",{className:"flex items-center justify-center h-full text-muted-foreground",children:"No timeline data available"})}),C&&_.jsxs("div",{className:"flex gap-4 h-72 min-h-[200px]",children:[i&&_.jsx("div",{className:"w-80 shrink-0 rounded-lg border border-border bg-card p-4 overflow-y-auto",children:_.jsx(C4,{chunkId:i,onClose:()=>r(null),onWalkChain:N})}),o&&_.jsx("div",{className:"flex-1 rounded-lg border border-border bg-card p-4 overflow-y-auto",children:_.jsx(z4,{chunkId:o,direction:d,onDirectionChange:g})})]})]})}const Hr=["#10b981","#06b6d4","#8b5cf6","#f59e0b","#ef4444","#ec4899","#14b8a6","#f97316","#6366f1","#84cc16","#0ea5e9","#d946ef","#22c55e","#eab308","#a855f7"];function D4({clusters:n}){const a=R.useRef(null);return R.useEffect(()=>{if(!a.current||n.length===0)return;const i=Ue(a.current);i.selectAll("*").remove();const r=a.current.parentElement;if(!r)return;const o=r.clientWidth,f=r.clientHeight||360;i.attr("width",o).attr("height",f);const d=LT().size([o,f]).padding(6),g=Lf({children:n}).sum(x=>"memberCount"in x?x.memberCount:0),m=d(g),v=getComputedStyle(document.documentElement).getPropertyValue("--fg").trim()||"#e2e8f0",y=i.selectAll("g").data(m.leaves()).join("g").attr("transform",x=>`translate(${x.x},${x.y})`);y.append("circle").attr("r",x=>x.r).attr("fill",(x,w)=>Hr[w%Hr.length]).attr("fill-opacity",.7).attr("stroke",(x,w)=>Hr[w%Hr.length]).attr("stroke-width",1),y.filter(x=>x.r>30).append("text").attr("text-anchor","middle").attr("dy","-0.3em").attr("fill",v).attr("font-size",x=>Math.min(14,x.r/3)).attr("font-weight",600).text(x=>{var w;return((w=x.data.name)==null?void 0:w.slice(0,20))??x.data.id.slice(0,8)}),y.filter(x=>x.r>30).append("text").attr("text-anchor","middle").attr("dy","1.1em").attr("fill",v).attr("fill-opacity",.7).attr("font-size",x=>Math.min(11,x.r/4)).text(x=>`${x.data.memberCount} chunks`),y.append("title").text(x=>{const w=x.data;return`${w.name??w.id}
165
+ ${new Date(ct.startTime).toLocaleString()}`})}function Y(S){const O=new Set;O.add(S);for(let Z=S-1;Z>=0&&O.size<rp&&!(new Date(m[Z+1].startTime).getTime()-new Date(m[Z].endTime).getTime()>Fs);Z--)O.add(Z);for(let Z=S+1;Z<m.length&&O.size<rp&&!(new Date(m[Z].startTime).getTime()-new Date(m[Z-1].endTime).getTime()>Fs);Z++)O.add(Z);P.selectAll(".chunk").attr("fill-opacity",.1),P.selectAll(".ribbon").attr("opacity",.1),P.selectAll(".gap-indicator").attr("fill-opacity",.1);for(const Z of O)P.select(`.chunk-${Z}`).attr("fill-opacity",1);for(const Z of O)O.has(Z+1)&&P.select(`.ribbon-${Z}`).attr("opacity",1)}function F(){P.selectAll(".chunk").attr("fill-opacity",S=>S.id===o?1:.7),P.selectAll(".ribbon").attr("opacity",1),P.selectAll(".gap-indicator").attr("fill-opacity",.5)}M(K);const at=ky().scaleExtent([.5,20]).translateExtent([[-100,0],[nt+100,L]]).on("zoom",S=>{const O=S.transform.rescaleX(K);ht.call(Pu(O).ticks(8)),M(O)});C.call(at)},[m,i,r,o,h,g,v,k,N]),_.jsxs("div",{className:"w-full h-full flex flex-col",children:[m.length>1&&_.jsxs("div",{className:"flex items-center gap-4 px-4 py-2 text-xs text-muted-foreground border-b border-border shrink-0",children:[w.longestStreak&&_.jsxs("div",{className:"flex items-center gap-1.5 px-2 py-1 bg-muted/30 rounded",children:[_.jsx("span",{className:"font-medium text-foreground",children:"Longest streak:"}),_.jsxs("span",{className:"tabular-nums",children:[w.longestStreak.cluster," (",w.longestStreak.count," chunks,"," ",M4(w.longestStreak.durationMs),")"]})]}),_.jsxs("div",{className:"flex items-center gap-1.5 px-2 py-1 bg-muted/30 rounded",children:[_.jsx("span",{className:"font-medium text-foreground",children:"Most switches:"}),_.jsx("span",{className:"tabular-nums",children:w.mostSwitches?`${w.mostSwitches.from} ↔ ${w.mostSwitches.to} (${w.mostSwitches.count}×)`:"—"})]}),_.jsxs("div",{className:"flex items-center gap-1.5 px-2 py-1 bg-muted/30 rounded",children:[_.jsx("span",{className:"font-medium text-foreground",children:"Focus:"}),_.jsxs("span",{className:"tabular-nums",children:[Math.round(w.focusScore*100),"%"]})]})]}),_.jsx("div",{className:"flex-1 min-h-0",children:_.jsx("svg",{ref:d,className:"w-full h-full"})})]})}function A4({clusters:n,activeClusterIds:a,unclusteredCount:i}){var k;const r=R.useRef(null),[o,f]=R.useState({visible:!1,cluster:null,anchorRect:null}),d=new Map(n.map(N=>[N.id,N])),m=[...a.map(N=>({id:N,info:d.get(N)})).sort((N,C)=>{var A,q;return(((A=C.info)==null?void 0:A.memberCount)??0)-(((q=N.info)==null?void 0:q.memberCount)??0)}).map((N,C)=>{var A,q;return{key:N.id,color:Ya[C%Ya.length],name:((A=N.info)==null?void 0:A.name)??`Topic ${C+1}`,count:((q=N.info)==null?void 0:q.memberCount)??0,info:N.info??null}}),...i>0?[{key:"_unclustered",color:"#64748b",name:"Unclustered",count:i,info:null}]:[]],h=(N,C)=>{const A=N.currentTarget.getBoundingClientRect();f({visible:!0,cluster:C,anchorRect:A})},v=()=>{f({visible:!1,cluster:null,anchorRect:null})},y=(k=r.current)==null?void 0:k.getBoundingClientRect(),x=o.anchorRect&&y?Math.min(o.anchorRect.left-y.left,y.width-296):0,w=o.anchorRect&&y?o.anchorRect.bottom-y.top+6:0;return _.jsxs("div",{ref:r,className:"relative rounded-lg border border-border bg-card px-4 py-2.5",children:[_.jsx("div",{className:"text-[10px] font-semibold text-muted-foreground uppercase tracking-wider mb-2",children:"Topic Clusters"}),_.jsx("div",{className:"grid gap-x-6 gap-y-1",style:{gridTemplateColumns:"repeat(auto-fill, minmax(220px, 1fr))"},children:m.map(N=>_.jsxs("div",{className:"flex items-center gap-2 text-xs cursor-default hover:bg-muted/50 rounded px-1.5 py-0.5 transition-colors min-w-0",onMouseEnter:N.info?C=>h(C,N.info):void 0,onMouseLeave:v,children:[_.jsx("span",{className:"inline-block w-2.5 h-2.5 rounded-full shrink-0",style:{backgroundColor:N.color}}),_.jsx("span",{className:"text-foreground truncate",children:N.name}),_.jsx("span",{className:"text-muted-foreground tabular-nums ml-auto shrink-0",children:N.count})]},N.key))}),o.visible&&o.cluster&&_.jsxs("div",{className:"absolute z-50 rounded-md border border-border/80 bg-card/50 backdrop-blur-md px-3 py-2.5 text-xs shadow-lg w-72 pointer-events-none",style:{left:Math.max(0,x),top:w},children:[_.jsx("div",{className:"font-semibold text-foreground mb-1",children:o.cluster.name??"Unnamed"}),o.cluster.description&&_.jsx("p",{className:"text-muted-foreground mb-2 leading-relaxed",children:o.cluster.description}),_.jsx("div",{className:"flex gap-4 text-muted-foreground",children:_.jsxs("div",{children:["Members:"," ",_.jsx("span",{className:"text-foreground tabular-nums",children:o.cluster.memberCount})]})})]})]})}function C4({chunkId:n,onClose:a,onWalkChain:i}){var d;const{data:r}=Pe(`/api/chunks?chunkId=${n}`),{data:o}=Pe(`/api/edges?chunkId=${n}&limit=20`),f=(d=r==null?void 0:r.chunks)==null?void 0:d[0];return _.jsxs("div",{className:"flex flex-col gap-3 h-full",children:[_.jsxs("div",{className:"flex items-center justify-between",children:[_.jsx("h3",{className:"text-sm font-semibold",children:"Chunk Inspector"}),_.jsx("button",{onClick:a,className:"rounded p-1 hover:bg-muted",children:_.jsx(f2,{className:"h-4 w-4"})})]}),f?_.jsxs("div",{className:"space-y-3 text-sm overflow-y-auto flex-1",children:[_.jsxs("div",{className:"space-y-1",children:[_.jsxs("div",{children:[_.jsx("span",{className:"text-muted-foreground",children:"ID: "}),_.jsxs("code",{className:"text-xs",children:[f.id.slice(0,12),"..."]})]}),_.jsxs("div",{children:[_.jsx("span",{className:"text-muted-foreground",children:"Project: "}),_.jsx(Bn,{variant:"secondary",children:f.sessionSlug})]}),_.jsxs("div",{children:[_.jsx("span",{className:"text-muted-foreground",children:"Time: "}),new Date(f.startTime).toLocaleString()]}),_.jsxs("div",{children:[_.jsx("span",{className:"text-muted-foreground",children:"Tokens: "}),f.approxTokens]})]}),_.jsx("div",{className:"border-t border-border pt-2",children:_.jsx("p",{className:"text-xs text-muted-foreground line-clamp-6 whitespace-pre-wrap",children:f.content.slice(0,500)})}),_.jsxs("div",{className:"flex gap-2",children:[_.jsxs("button",{onClick:()=>i(n,"backward"),className:"flex flex-1 items-center justify-center gap-1 rounded-md border border-border px-3 py-2 text-xs hover:bg-muted transition-colors",children:[_.jsx(Pb,{className:"h-3 w-3"}),"Walk Backward"]}),_.jsxs("button",{onClick:()=>i(n,"forward"),className:"flex flex-1 items-center justify-center gap-1 rounded-md border border-border px-3 py-2 text-xs hover:bg-muted transition-colors",children:["Walk Forward",_.jsx(t2,{className:"h-3 w-3"})]})]}),o&&o.edges.length>0&&_.jsxs("div",{className:"space-y-1 border-t border-border pt-2",children:[_.jsxs("h4",{className:"text-xs font-medium",children:["Edges (",o.total,")"]}),_.jsx("div",{className:"space-y-1 max-h-32 overflow-y-auto",children:o.edges.map(g=>_.jsxs("div",{className:"flex items-center gap-2 text-[10px]",children:[_.jsx(Bn,{variant:g.type==="backward"?"default":"outline",className:"text-[9px]",children:g.type}),g.referenceType&&_.jsx("span",{className:"text-muted-foreground",children:g.referenceType}),_.jsx("span",{className:"ml-auto tabular-nums",children:g.weight.toFixed(2)})]},g.id))})]})]}):_.jsx("p",{className:"text-sm text-muted-foreground",children:"Loading chunk..."})]})}function z4({chunkId:n,direction:a,onDirectionChange:i}){const{data:r,loading:o}=Pe(`/api/chain/walk?chunkId=${n}&direction=${a}`);return _.jsxs("div",{className:"flex flex-col gap-3 h-full",children:[_.jsxs("div",{className:"flex items-center justify-between",children:[_.jsx("h3",{className:"text-sm font-semibold",children:"Chain Walk"}),_.jsxs("div",{className:"flex gap-1",children:[_.jsx("button",{onClick:()=>i("backward"),className:`rounded px-2 py-1 text-xs transition-colors ${a==="backward"?"bg-accent/20 text-accent":"text-muted-foreground hover:bg-muted"}`,children:"Backward"}),_.jsx("button",{onClick:()=>i("forward"),className:`rounded px-2 py-1 text-xs transition-colors ${a==="forward"?"bg-accent/20 text-accent":"text-muted-foreground hover:bg-muted"}`,children:"Forward"})]})]}),o&&_.jsx(ii,{}),r&&r.chain.length===0&&_.jsxs("p",{className:"text-sm text-muted-foreground",children:["No chain found — this chunk has no connected edges in the ",a," direction."]}),r&&_.jsxs("div",{className:"flex-1 overflow-y-auto space-y-2",children:[_.jsx(cp,{chunk:r.seed,position:0,total:r.chain.length+1,isSeed:!0}),r.chain.map((f,d)=>_.jsx(cp,{chunk:f,position:d+1,total:r.chain.length+1},f.id)),r.chain.length>0&&_.jsxs("div",{className:"text-xs text-muted-foreground pt-1",children:["Total: ",r.totalTokens.toLocaleString()," tokens"]})]})]})}function cp({chunk:n,position:a,total:i,isSeed:r=!1}){return _.jsxs("div",{className:`rounded-md border p-3 text-sm space-y-1 ${r?"border-accent bg-accent/5":"border-border bg-card"}`,children:[_.jsxs("div",{className:"flex items-center justify-between",children:[_.jsxs("div",{className:"flex items-center gap-2",children:[r&&_.jsx(Bn,{variant:"default",className:"text-[10px]",children:"Seed"}),_.jsx(Bn,{variant:"secondary",className:"text-[10px]",children:n.sessionSlug})]}),_.jsxs("span",{className:"text-xs text-muted-foreground tabular-nums",children:[a+1,"/",i]})]}),_.jsx("p",{className:"text-xs text-muted-foreground line-clamp-3",children:n.preview}),_.jsxs("div",{className:"text-[10px] text-muted-foreground",children:[new Date(n.startTime).toLocaleString()," · ",n.approxTokens," tokens"]})]})}function N4(){const[n,a]=R.useState(""),[i,r]=R.useState(null),[o,f]=R.useState(null),[d,g]=R.useState("backward"),{data:m}=Pe("/api/projects"),{data:h}=Pe("/api/clusters"),v=`/api/timeline?limit=500${n?`&project=${n}`:""}`,{data:y,loading:x}=Pe(v),w=((m==null?void 0:m.projects)??[]).map(A=>({value:A.slug,label:`${A.slug} (${A.chunkCount})`})),k=R.useCallback(A=>{r(A)},[]),N=R.useCallback((A,q)=>{f(A),g(q)},[]),C=i||o;return _.jsxs("div",{className:"flex h-[calc(100vh-8rem)] flex-col gap-4 animate-fade-in",children:[_.jsxs("div",{className:"flex items-center justify-between",children:[_.jsx("h1",{className:"text-2xl font-bold",children:"Timeline"}),_.jsx(_4,{value:n,onChange:A=>{a(A.target.value),r(null),f(null)},options:w,placeholder:"All projects",className:"w-60"})]}),h&&y&&y.chunks.length>0&&_.jsx(A4,{clusters:h.clusters,activeClusterIds:[...new Set(y.chunks.map(A=>A.clusterId).filter(Boolean))],unclusteredCount:y.chunks.filter(A=>!A.clusterId).length}),_.jsx("div",{className:`rounded-lg border border-border bg-card overflow-hidden relative ${C?"flex-1 min-h-[200px]":"flex-1"}`,children:x?_.jsx(ii,{}):y&&y.chunks.length>0?n?_.jsx(E4,{chunks:y.chunks,edges:y.edges,timeRange:y.timeRange,onChunkClick:k,selectedChunkId:i,clusters:h==null?void 0:h.clusters}):_.jsx(w4,{chunks:y.chunks,edges:y.edges,timeRange:y.timeRange,onChunkClick:k,selectedChunkId:i,clusters:h==null?void 0:h.clusters}):_.jsx("div",{className:"flex items-center justify-center h-full text-muted-foreground",children:"No timeline data available"})}),C&&_.jsxs("div",{className:"flex gap-4 h-72 min-h-[200px]",children:[i&&_.jsx("div",{className:"w-80 shrink-0 rounded-lg border border-border bg-card p-4 overflow-y-auto",children:_.jsx(C4,{chunkId:i,onClose:()=>r(null),onWalkChain:N})}),o&&_.jsx("div",{className:"flex-1 rounded-lg border border-border bg-card p-4 overflow-y-auto",children:_.jsx(z4,{chunkId:o,direction:d,onDirectionChange:g})})]})]})}const Hr=["#10b981","#06b6d4","#8b5cf6","#f59e0b","#ef4444","#ec4899","#14b8a6","#f97316","#6366f1","#84cc16","#0ea5e9","#d946ef","#22c55e","#eab308","#a855f7"];function D4({clusters:n}){const a=R.useRef(null);return R.useEffect(()=>{if(!a.current||n.length===0)return;const i=Ue(a.current);i.selectAll("*").remove();const r=a.current.parentElement;if(!r)return;const o=r.clientWidth,f=r.clientHeight||360;i.attr("width",o).attr("height",f);const d=LT().size([o,f]).padding(6),g=Lf({children:n}).sum(x=>"memberCount"in x?x.memberCount:0),m=d(g),v=getComputedStyle(document.documentElement).getPropertyValue("--fg").trim()||"#e2e8f0",y=i.selectAll("g").data(m.leaves()).join("g").attr("transform",x=>`translate(${x.x},${x.y})`);y.append("circle").attr("r",x=>x.r).attr("fill",(x,w)=>Hr[w%Hr.length]).attr("fill-opacity",.7).attr("stroke",(x,w)=>Hr[w%Hr.length]).attr("stroke-width",1),y.filter(x=>x.r>30).append("text").attr("text-anchor","middle").attr("dy","-0.3em").attr("fill",v).attr("font-size",x=>Math.min(14,x.r/3)).attr("font-weight",600).text(x=>{var w;return((w=x.data.name)==null?void 0:w.slice(0,20))??x.data.id.slice(0,8)}),y.filter(x=>x.r>30).append("text").attr("text-anchor","middle").attr("dy","1.1em").attr("fill",v).attr("fill-opacity",.7).attr("font-size",x=>Math.min(11,x.r/4)).text(x=>`${x.data.memberCount} chunks`),y.append("title").text(x=>{const w=x.data;return`${w.name??w.id}
166
166
  ${w.memberCount} chunks`})},[n]),_.jsx("svg",{ref:a,className:"w-full h-full"})}function R4({cluster:n}){const[a,i]=R.useState(!1);return _.jsxs(Wu,{children:[_.jsxs(ef,{className:"cursor-pointer",onClick:()=>i(!a),children:[_.jsxs("div",{className:"flex items-center justify-between",children:[_.jsx(nf,{className:"text-base",children:n.name??n.id.slice(0,12)}),_.jsxs("div",{className:"flex items-center gap-2",children:[_.jsxs(Bn,{variant:"secondary",children:[n.memberCount," chunks"]}),a?_.jsx(l2,{className:"h-4 w-4"}):_.jsx(n2,{className:"h-4 w-4"})]})]}),n.description&&_.jsx(J2,{className:"line-clamp-2",children:n.description})]}),a&&_.jsxs(Iu,{children:[_.jsx("div",{className:"mb-3 h-2 rounded-full bg-muted overflow-hidden",children:_.jsx("div",{className:"h-full rounded-full bg-accent transition-all",style:{width:`${Math.min(100,n.memberCount*2)}%`}})}),n.exemplarPreviews.length>0&&_.jsxs("div",{className:"space-y-2",children:[_.jsx("p",{className:"text-xs font-medium text-muted-foreground",children:"Exemplar Chunks"}),n.exemplarPreviews.map(r=>_.jsxs("div",{className:"rounded border border-border p-2 text-xs text-muted-foreground",children:[_.jsx("code",{className:"text-[10px]",children:r.id.slice(0,8)}),_.jsx("p",{className:"mt-1 line-clamp-2",children:r.preview})]},r.id))]})]})]})}function O4(){const{data:n,loading:a}=Pe("/api/clusters");if(a||!n)return _.jsx(ii,{});const i=n.clusters;return _.jsxs("div",{className:"space-y-6 animate-fade-in",children:[_.jsx("h1",{className:"text-2xl font-bold",children:"Clusters"}),i.length===0?_.jsx("div",{className:"text-muted-foreground",children:"No clusters found. Run clustering first."}):_.jsxs(_.Fragment,{children:[_.jsx("div",{className:"rounded-lg border border-border bg-card p-4",style:{height:400},children:_.jsx(D4,{clusters:i})}),_.jsx("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3",children:i.map(r=>_.jsx(R4,{cluster:r},r.id))})]})]})}function U4({className:n,...a}){return _.jsx("input",{className:tn("flex h-10 w-full rounded-md border border-border bg-background px-3 py-2 text-sm","placeholder:text-muted-foreground","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2","disabled:cursor-not-allowed disabled:opacity-50",n),...a})}function j4({onSearch:n,debounceMs:a=400}){const[i,r]=R.useState(""),o=R.useRef(null);return R.useEffect(()=>(o.current&&clearTimeout(o.current),o.current=setTimeout(()=>{n(i)},a),()=>{o.current&&clearTimeout(o.current)}),[i,a,n]),_.jsxs("div",{className:"relative max-w-xl",children:[_.jsx(Op,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),_.jsx(U4,{value:i,onChange:f=>r(f.target.value),placeholder:"Search memory...",className:"pl-10"})]})}function Ws({title:n,results:a,color:i,allIds:r}){const o=f=>{let d=0;return r.has(`v:${f}`)&&d++,r.has(`k:${f}`)&&d++,d};return _.jsxs("div",{className:"flex-1 min-w-0",children:[_.jsxs("h3",{className:"mb-3 text-sm font-semibold",style:{color:i},children:[n,_.jsxs("span",{className:"ml-2 text-muted-foreground font-normal",children:["(",a.length,")"]})]}),_.jsxs("div",{className:"space-y-2",children:[a.map((f,d)=>{const g=o(f.id);return _.jsxs("div",{className:"rounded-md border border-border p-3 space-y-1",children:[_.jsxs("div",{className:"flex items-center gap-2",children:[_.jsxs("span",{className:"text-xs font-medium text-muted-foreground",children:["#",d+1]}),_.jsx("span",{className:"text-xs tabular-nums font-mono",style:{color:i},children:f.score.toFixed(4)}),g>1&&_.jsx(Bn,{variant:"default",className:"text-[10px] px-1.5 py-0",children:"boosted"}),_.jsx(Bn,{variant:"secondary",className:"text-[10px] ml-auto",children:f.sessionSlug})]}),_.jsx("p",{className:"text-xs text-muted-foreground line-clamp-3",children:f.preview})]},f.id)}),a.length===0&&_.jsx("div",{className:"text-sm text-muted-foreground italic",children:"No results"})]})]})}function H4({data:n}){const a=new Set;return n.vector.forEach(i=>a.add(`v:${i.id}`)),n.keyword.forEach(i=>a.add(`k:${i.id}`)),_.jsxs("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-3",children:[_.jsx(Ws,{title:"Vector",results:n.vector,color:"#8b5cf6",allIds:a}),_.jsx(Ws,{title:"Keyword (BM25)",results:n.keyword,color:"#06b6d4",allIds:a}),_.jsx(Ws,{title:"Fused (RRF)",results:n.fused,color:"#10b981",allIds:a})]})}function L4(){const[n,a]=R.useState(""),[i,r]=R.useState(null),{data:o,loading:f}=Pe(i),d=R.useCallback(g=>{a(g),g.trim()?r(`/api/search/compare?q=${encodeURIComponent(g.trim())}`):r(null)},[]);return _.jsxs("div",{className:"space-y-6 animate-fade-in",children:[_.jsx("h1",{className:"text-2xl font-bold",children:"Hybrid Search Pipeline"}),_.jsx("p",{className:"text-muted-foreground",children:"Compare vector, keyword (BM25), and fused (RRF) search results side by side."}),_.jsx(j4,{onSearch:d}),f&&_.jsxs("div",{className:"flex items-center gap-2 text-muted-foreground",children:[_.jsx("div",{className:"h-4 w-4 animate-spin rounded-full border-2 border-muted border-t-accent"}),"Searching..."]}),o&&_.jsx(H4,{data:o}),!o&&!f&&n&&_.jsx("div",{className:"text-muted-foreground",children:"No results found."})]})}function k4(){const{data:n,loading:a}=Pe("/api/projects");return a||!n?_.jsx(ii,{}):_.jsxs("div",{className:"space-y-6 animate-fade-in",children:[_.jsx("h1",{className:"text-2xl font-bold",children:"Projects"}),n.projects.length===0?_.jsx("div",{className:"text-muted-foreground",children:"No projects found."}):_.jsx(Wu,{children:_.jsx(Iu,{className:"p-0",children:_.jsx("div",{className:"overflow-x-auto",children:_.jsxs("table",{className:"w-full text-sm",children:[_.jsx("thead",{children:_.jsxs("tr",{className:"border-b border-border",children:[_.jsx("th",{className:"px-4 py-3 text-left font-medium text-muted-foreground",children:"Project"}),_.jsx("th",{className:"px-4 py-3 text-right font-medium text-muted-foreground",children:"Chunks"}),_.jsx("th",{className:"px-4 py-3 text-left font-medium text-muted-foreground",children:"First Seen"}),_.jsx("th",{className:"px-4 py-3 text-left font-medium text-muted-foreground",children:"Last Seen"})]})}),_.jsx("tbody",{children:n.projects.map(i=>_.jsxs("tr",{className:"border-b border-border last:border-0 hover:bg-muted/50 transition-colors",children:[_.jsx("td",{className:"px-4 py-3",children:_.jsxs("div",{className:"flex items-center gap-2",children:[_.jsx("span",{className:"font-medium",children:i.slug}),i.path&&_.jsx("span",{className:"text-xs text-muted-foreground truncate max-w-[200px]",children:i.path})]})}),_.jsx("td",{className:"px-4 py-3 text-right",children:_.jsx(Bn,{variant:"secondary",children:i.chunkCount})}),_.jsx("td",{className:"px-4 py-3 text-muted-foreground",children:new Date(i.firstSeen).toLocaleDateString()}),_.jsx("td",{className:"px-4 py-3 text-muted-foreground",children:new Date(i.lastSeen).toLocaleDateString()})]},i.slug))})]})})})})]})}function Y4(){return _.jsx(qb,{children:_.jsx(yb,{children:_.jsxs(Ul,{element:_.jsx($2,{}),children:[_.jsx(Ul,{path:"/",element:_.jsx(S4,{})}),_.jsx(Ul,{path:"/timeline",element:_.jsx(N4,{})}),_.jsx(Ul,{path:"/clusters",element:_.jsx(O4,{})}),_.jsx(Ul,{path:"/search",element:_.jsx(L4,{})}),_.jsx(Ul,{path:"/projects",element:_.jsx(k4,{})})]})})})}px.createRoot(document.getElementById("root")).render(_.jsx(R.StrictMode,{children:_.jsx(Y4,{})}));
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>Causantic Dashboard</title>
7
7
  <link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctext y='28' font-size='28'%3E%F0%9F%A7%A0%3C/text%3E%3C/svg%3E" />
8
- <script type="module" crossorigin src="/assets/index-DtSi-1L8.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-BjtuXMeN.js"></script>
9
9
  <link rel="stylesheet" crossorigin href="/assets/index-DdImwNQ0.css">
10
10
  </head>
11
11
  <body>
@@ -79,10 +79,6 @@ export interface BatchIngestResult {
79
79
  * Discover session JSONL files in a directory.
80
80
  */
81
81
  export declare function discoverSessions(dir: string): Promise<string[]>;
82
- /**
83
- * Filter out already-ingested sessions.
84
- */
85
- export declare function filterAlreadyIngested(sessionPaths: string[]): Promise<string[]>;
86
82
  /**
87
83
  * Batch ingest sessions from paths.
88
84
  */
@@ -1 +1 @@
1
- {"version":3,"file":"batch-ingest.d.ts","sourceRoot":"","sources":["../../src/ingest/batch-ingest.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAiB,KAAK,YAAY,EAAsB,MAAM,qBAAqB,CAAC;AAM3F;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAC;IACrD,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sDAAsD;IACtD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,0EAA0E;IAC1E,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,0CAA0C;IAC1C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,+EAA+E;IAC/E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,2BAA2B;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,4BAA4B;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gDAAgD;IAChD,aAAa,EAAE,MAAM,CAAC;IACtB,iCAAiC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,aAAa;IACb,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAoDrE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAIrF;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,YAAY,EAAE,MAAM,EAAE,EACtB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAsG5B;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAG5B"}
1
+ {"version":3,"file":"batch-ingest.d.ts","sourceRoot":"","sources":["../../src/ingest/batch-ingest.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAiB,KAAK,YAAY,EAAsB,MAAM,qBAAqB,CAAC;AAM3F;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAC;IACrD,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sDAAsD;IACtD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,0EAA0E;IAC1E,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,0CAA0C;IAC1C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,+EAA+E;IAC/E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,2BAA2B;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,4BAA4B;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gDAAgD;IAChD,aAAa,EAAE,MAAM,CAAC;IACtB,iCAAiC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,aAAa;IACb,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAoDrE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,YAAY,EAAE,MAAM,EAAE,EACtB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAsG5B;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAG5B"}
@@ -62,14 +62,6 @@ export async function discoverSessions(dir) {
62
62
  withStats.sort((a, b) => a.mtime - b.mtime);
63
63
  return withStats.map((s) => s.path);
64
64
  }
65
- /**
66
- * Filter out already-ingested sessions.
67
- */
68
- export async function filterAlreadyIngested(sessionPaths) {
69
- // We need to check by session ID, not path
70
- // For now, just return all paths - the ingest function will skip
71
- return sessionPaths;
72
- }
73
65
  /**
74
66
  * Batch ingest sessions from paths.
75
67
  */
@@ -1 +1 @@
1
- {"version":3,"file":"batch-ingest.js","sourceRoot":"","sources":["../../src/ingest/batch-ingest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"batch-ingest.js","sourceRoot":"","sources":["../../src/ingest/batch-ingest.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export { ingestSession, chunkToInput } from './ingest-session.js';
5
5
  export type { IngestOptions, IngestResult } from './ingest-session.js';
6
- export { batchIngest, batchIngestDirectory, discoverSessions, filterAlreadyIngested, } from './batch-ingest.js';
6
+ export { batchIngest, batchIngestDirectory, discoverSessions } from './batch-ingest.js';
7
7
  export type { BatchIngestOptions, BatchIngestResult } from './batch-ingest.js';
8
8
  export { detectCausalTransitions, detectTransitions, getTimeGapMs } from './edge-detector.js';
9
9
  export type { TransitionResult, DetectionOptions } from './edge-detector.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ingest/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAClE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGvE,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG/E,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9F,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG7E,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAClG,YAAY,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ingest/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAClE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGvE,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACxF,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG/E,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9F,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG7E,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAClG,YAAY,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -4,7 +4,7 @@
4
4
  // Main ingestion
5
5
  export { ingestSession, chunkToInput } from './ingest-session.js';
6
6
  // Batch ingestion
7
- export { batchIngest, batchIngestDirectory, discoverSessions, filterAlreadyIngested, } from './batch-ingest.js';
7
+ export { batchIngest, batchIngestDirectory, discoverSessions } from './batch-ingest.js';
8
8
  // Edge detection
9
9
  export { detectCausalTransitions, detectTransitions, getTimeGapMs } from './edge-detector.js';
10
10
  // Edge creation
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ingest/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,iBAAiB;AACjB,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGlE,kBAAkB;AAClB,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAG3B,iBAAiB;AACjB,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG9F,gBAAgB;AAChB,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAG3B,wBAAwB;AACxB,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ingest/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,iBAAiB;AACjB,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGlE,kBAAkB;AAClB,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGxF,iBAAiB;AACjB,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG9F,gBAAgB;AAChB,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAG3B,wBAAwB;AACxB,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * Export/import functionality for Causantic memory data.
3
3
  *
4
- * Supports encrypted and unencrypted archives.
4
+ * Supports encrypted and unencrypted archives with optional gzip compression.
5
+ * Archive format v1.1 adds vector embeddings and full cluster data.
5
6
  */
6
7
  /** Archive metadata */
7
8
  export interface ArchiveMetadata {
@@ -10,12 +11,16 @@ export interface ArchiveMetadata {
10
11
  chunkCount: number;
11
12
  edgeCount: number;
12
13
  clusterCount: number;
14
+ vectorCount: number;
15
+ embeddingDimensions: number | null;
13
16
  projects: string[];
14
17
  }
15
18
  /** Chunk data for export */
16
19
  export interface ExportedChunk {
17
20
  id: string;
21
+ sessionId: string;
18
22
  sessionSlug: string;
23
+ projectPath: string | null;
19
24
  content: string;
20
25
  startTime: string;
21
26
  endTime: string;
@@ -23,18 +28,33 @@ export interface ExportedChunk {
23
28
  }
24
29
  /** Edge data for export */
25
30
  export interface ExportedEdge {
31
+ id: string;
26
32
  source: string;
27
33
  target: string;
28
34
  type: string;
29
- referenceType: string;
35
+ referenceType: string | null;
30
36
  weight: number;
37
+ linkCount: number;
38
+ }
39
+ /** Cluster member with distance */
40
+ export interface ClusterMember {
41
+ chunkId: string;
42
+ distance: number;
31
43
  }
32
44
  /** Cluster data for export */
33
45
  export interface ExportedCluster {
34
46
  id: string;
35
- name: string;
47
+ name: string | null;
36
48
  description: string | null;
37
- memberChunkIds: string[];
49
+ centroid: number[] | null;
50
+ exemplarIds: string[] | null;
51
+ membershipHash: string | null;
52
+ members: ClusterMember[];
53
+ }
54
+ /** Vector data for export */
55
+ export interface ExportedVector {
56
+ chunkId: string;
57
+ embedding: number[];
38
58
  }
39
59
  /** Complete archive structure */
40
60
  export interface Archive {
@@ -45,6 +65,7 @@ export interface Archive {
45
65
  chunks: ExportedChunk[];
46
66
  edges: ExportedEdge[];
47
67
  clusters: ExportedCluster[];
68
+ vectors: ExportedVector[];
48
69
  }
49
70
  /** Export options */
50
71
  export interface ExportOptions {
@@ -58,6 +79,18 @@ export interface ExportOptions {
58
79
  redactPaths?: boolean;
59
80
  /** Redact code blocks */
60
81
  redactCode?: boolean;
82
+ /** Skip vector embeddings */
83
+ noVectors?: boolean;
84
+ }
85
+ /** Export result */
86
+ export interface ExportResult {
87
+ chunkCount: number;
88
+ edgeCount: number;
89
+ clusterCount: number;
90
+ vectorCount: number;
91
+ fileSize: number;
92
+ compressed: boolean;
93
+ encrypted: boolean;
61
94
  }
62
95
  /** Import options */
63
96
  export interface ImportOptions {
@@ -67,13 +100,33 @@ export interface ImportOptions {
67
100
  password?: string;
68
101
  /** Merge with existing data */
69
102
  merge?: boolean;
103
+ /** Validate and report without importing */
104
+ dryRun?: boolean;
70
105
  }
106
+ /** Import result */
107
+ export interface ImportResult {
108
+ chunkCount: number;
109
+ edgeCount: number;
110
+ clusterCount: number;
111
+ vectorCount: number;
112
+ dryRun: boolean;
113
+ }
114
+ /** Validation result */
115
+ export interface ValidationResult {
116
+ valid: boolean;
117
+ errors: string[];
118
+ warnings: string[];
119
+ }
120
+ /**
121
+ * Validate an archive structure before import.
122
+ */
123
+ export declare function validateArchive(archive: Archive): ValidationResult;
71
124
  /**
72
125
  * Export memory data to an archive.
73
126
  */
74
- export declare function exportArchive(options: ExportOptions): Promise<void>;
127
+ export declare function exportArchive(options: ExportOptions): Promise<ExportResult>;
75
128
  /**
76
129
  * Import memory data from an archive.
77
130
  */
78
- export declare function importArchive(options: ImportOptions): Promise<void>;
131
+ export declare function importArchive(options: ImportOptions): Promise<ImportResult>;
79
132
  //# sourceMappingURL=archive.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/storage/archive.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH,uBAAuB;AACvB,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,4BAA4B;AAC5B,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,2BAA2B;AAC3B,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,8BAA8B;AAC9B,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,iCAAiC;AACjC,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,qBAAqB;AACrB,MAAM,WAAW,aAAa;IAC5B,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,wBAAwB;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,yBAAyB;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,qBAAqB;AACrB,MAAM,WAAW,aAAa;IAC5B,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAqIzE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAwFzE"}
1
+ {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/storage/archive.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,80 @@
1
1
  /**
2
2
  * Export/import functionality for Causantic memory data.
3
3
  *
4
- * Supports encrypted and unencrypted archives.
4
+ * Supports encrypted and unencrypted archives with optional gzip compression.
5
+ * Archive format v1.1 adds vector embeddings and full cluster data.
5
6
  */
6
7
  import { readFileSync, writeFileSync, existsSync } from 'node:fs';
8
+ import { gzipSync, gunzipSync } from 'node:zlib';
7
9
  import { encrypt, decrypt, serializeEncrypted, deserializeEncrypted } from './encryption.js';
8
- import { getDb } from './db.js';
10
+ import { getDb, generateId } from './db.js';
11
+ import { serializeEmbedding, deserializeEmbedding } from '../utils/embedding-utils.js';
9
12
  import { createLogger } from '../utils/logger.js';
10
13
  const log = createLogger('archive');
11
14
  /** Archive format version */
12
- const ARCHIVE_VERSION = '1.0';
15
+ const ARCHIVE_VERSION = '1.1';
16
+ /** Accepted versions on import */
17
+ const ACCEPTED_VERSIONS = ['1.0', '1.1'];
13
18
  /** Magic bytes for encrypted archives */
14
19
  const ENCRYPTED_MAGIC = Buffer.from('CST\x00');
20
+ /** Magic bytes for gzip */
21
+ const GZIP_MAGIC = Buffer.from([0x1f, 0x8b]);
22
+ /**
23
+ * Validate an archive structure before import.
24
+ */
25
+ export function validateArchive(archive) {
26
+ const errors = [];
27
+ const warnings = [];
28
+ // Version check
29
+ if (!archive.version || !ACCEPTED_VERSIONS.includes(archive.version)) {
30
+ errors.push(`Unsupported archive version: ${archive.version ?? 'missing'}`);
31
+ }
32
+ // Format check
33
+ if (archive.format !== 'causantic-archive') {
34
+ errors.push(`Invalid archive format: ${archive.format ?? 'missing'}`);
35
+ }
36
+ // Count verification
37
+ if (archive.metadata) {
38
+ if (archive.metadata.chunkCount !== archive.chunks?.length) {
39
+ warnings.push(`Metadata chunkCount (${archive.metadata.chunkCount}) does not match actual (${archive.chunks?.length ?? 0})`);
40
+ }
41
+ if (archive.metadata.edgeCount !== archive.edges?.length) {
42
+ warnings.push(`Metadata edgeCount (${archive.metadata.edgeCount}) does not match actual (${archive.edges?.length ?? 0})`);
43
+ }
44
+ if (archive.metadata.clusterCount !== archive.clusters?.length) {
45
+ warnings.push(`Metadata clusterCount (${archive.metadata.clusterCount}) does not match actual (${archive.clusters?.length ?? 0})`);
46
+ }
47
+ }
48
+ // Edge referential integrity
49
+ if (archive.chunks && archive.edges) {
50
+ const chunkIdSet = new Set(archive.chunks.map((c) => c.id));
51
+ let danglingCount = 0;
52
+ for (const edge of archive.edges) {
53
+ if (!chunkIdSet.has(edge.source) || !chunkIdSet.has(edge.target)) {
54
+ danglingCount++;
55
+ }
56
+ }
57
+ if (danglingCount > 0) {
58
+ warnings.push(`${danglingCount} edge(s) reference chunks not in the archive`);
59
+ }
60
+ }
61
+ // v1.0 backward compat warning
62
+ if (archive.version === '1.0') {
63
+ warnings.push('Archive version 1.0: no vector embeddings included. Semantic search will not work until re-embedding.');
64
+ }
65
+ // Embedding dimension mismatch detection
66
+ if (archive.metadata?.embeddingDimensions && archive.vectors?.length > 0) {
67
+ const sampleDims = archive.vectors[0].embedding?.length;
68
+ if (sampleDims && sampleDims !== archive.metadata.embeddingDimensions) {
69
+ warnings.push(`Embedding dimensions mismatch: metadata says ${archive.metadata.embeddingDimensions}, sample vector has ${sampleDims}`);
70
+ }
71
+ }
72
+ return {
73
+ valid: errors.length === 0,
74
+ errors,
75
+ warnings,
76
+ };
77
+ }
15
78
  /**
16
79
  * Export memory data to an archive.
17
80
  */
@@ -24,14 +87,16 @@ export async function exportArchive(options) {
24
87
  const targetProjects = options.projects ?? allProjects;
25
88
  // Export chunks
26
89
  const chunksQuery = db.prepare(`
27
- SELECT id, session_slug, content, start_time, end_time, turn_indices
90
+ SELECT id, session_id, session_slug, project_path, content, start_time, end_time, turn_indices
28
91
  FROM chunks
29
92
  WHERE session_slug IN (${targetProjects.map(() => '?').join(',')})
30
93
  `);
31
94
  const chunksResult = chunksQuery.all(...targetProjects);
32
95
  let chunks = chunksResult.map((row) => ({
33
96
  id: row.id,
97
+ sessionId: row.session_id,
34
98
  sessionSlug: row.session_slug,
99
+ projectPath: row.project_path,
35
100
  content: row.content,
36
101
  startTime: row.start_time,
37
102
  endTime: row.end_time,
@@ -50,36 +115,91 @@ export async function exportArchive(options) {
50
115
  content: redactCodeBlocks(chunk.content),
51
116
  }));
52
117
  }
53
- // Export edges
118
+ // Build chunk ID set for filtering edges and vectors
119
+ const chunkIdSet = new Set(chunks.map((c) => c.id));
120
+ // Export edges — both endpoints must be in the export
54
121
  const chunkIds = chunks.map((c) => c.id);
55
- const edgesQuery = db.prepare(`
56
- SELECT source_id, target_id, type, reference_type, weight
57
- FROM edges
58
- WHERE source_id IN (${chunkIds.map(() => '?').join(',')})
59
- `);
60
- const edgesResult = edgesQuery.all(...chunkIds);
61
- const edges = edgesResult.map((row) => ({
62
- source: row.source_id,
63
- target: row.target_id,
64
- type: row.type,
65
- referenceType: row.reference_type,
66
- weight: row.weight,
67
- }));
68
- // Export clusters
69
- const clustersQuery = db.prepare(`
70
- SELECT c.id, c.name, c.description, GROUP_CONCAT(cm.chunk_id) as member_ids
71
- FROM clusters c
72
- LEFT JOIN cluster_members cm ON c.id = cm.cluster_id
73
- WHERE cm.chunk_id IN (${chunkIds.map(() => '?').join(',')})
74
- GROUP BY c.id
75
- `);
76
- const clustersResult = clustersQuery.all(...chunkIds);
77
- const clusters = clustersResult.map((row) => ({
78
- id: row.id,
79
- name: row.name,
80
- description: row.description,
81
- memberChunkIds: row.member_ids?.split(',') ?? [],
82
- }));
122
+ let edges = [];
123
+ if (chunkIds.length > 0) {
124
+ const edgesQuery = db.prepare(`
125
+ SELECT id, source_chunk_id, target_chunk_id, edge_type, reference_type, initial_weight, link_count
126
+ FROM edges
127
+ WHERE source_chunk_id IN (${chunkIds.map(() => '?').join(',')})
128
+ `);
129
+ const edgesResult = edgesQuery.all(...chunkIds);
130
+ // Filter: only keep edges where BOTH endpoints are in the export
131
+ edges = edgesResult
132
+ .filter((row) => chunkIdSet.has(row.source_chunk_id) && chunkIdSet.has(row.target_chunk_id))
133
+ .map((row) => ({
134
+ id: row.id,
135
+ source: row.source_chunk_id,
136
+ target: row.target_chunk_id,
137
+ type: row.edge_type,
138
+ referenceType: row.reference_type,
139
+ weight: row.initial_weight,
140
+ linkCount: row.link_count,
141
+ }));
142
+ }
143
+ // Export clusters with full data
144
+ let clusters = [];
145
+ if (chunkIds.length > 0) {
146
+ // Find clusters that have at least one member in our export
147
+ const clusterIdsQuery = db.prepare(`
148
+ SELECT DISTINCT cluster_id FROM chunk_clusters
149
+ WHERE chunk_id IN (${chunkIds.map(() => '?').join(',')})
150
+ `);
151
+ const clusterIds = clusterIdsQuery.all(...chunkIds).map((r) => r.cluster_id);
152
+ if (clusterIds.length > 0) {
153
+ const clustersQuery = db.prepare(`
154
+ SELECT id, name, description, centroid, exemplar_ids, membership_hash
155
+ FROM clusters
156
+ WHERE id IN (${clusterIds.map(() => '?').join(',')})
157
+ `);
158
+ const clustersResult = clustersQuery.all(...clusterIds);
159
+ const membersQuery = db.prepare(`
160
+ SELECT chunk_id, distance FROM chunk_clusters
161
+ WHERE cluster_id = ? AND chunk_id IN (${chunkIds.map(() => '?').join(',')})
162
+ `);
163
+ clusters = clustersResult.map((row) => {
164
+ const membersResult = membersQuery.all(row.id, ...chunkIds);
165
+ return {
166
+ id: row.id,
167
+ name: row.name,
168
+ description: row.description,
169
+ centroid: row.centroid ? deserializeEmbedding(row.centroid) : null,
170
+ exemplarIds: row.exemplar_ids ? JSON.parse(row.exemplar_ids) : null,
171
+ membershipHash: row.membership_hash,
172
+ members: membersResult.map((m) => ({
173
+ chunkId: m.chunk_id,
174
+ distance: m.distance,
175
+ })),
176
+ };
177
+ });
178
+ }
179
+ }
180
+ // Export vectors
181
+ let vectors = [];
182
+ let embeddingDimensions = null;
183
+ if (!options.noVectors && chunkIds.length > 0) {
184
+ // Check if vectors table exists
185
+ const tableExists = db
186
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='vectors'")
187
+ .get();
188
+ if (tableExists) {
189
+ const vectorsQuery = db.prepare(`
190
+ SELECT id, embedding FROM vectors
191
+ WHERE id IN (${chunkIds.map(() => '?').join(',')})
192
+ `);
193
+ const vectorsResult = vectorsQuery.all(...chunkIds);
194
+ vectors = vectorsResult.map((row) => ({
195
+ chunkId: row.id,
196
+ embedding: deserializeEmbedding(row.embedding),
197
+ }));
198
+ if (vectors.length > 0) {
199
+ embeddingDimensions = vectors[0].embedding.length;
200
+ }
201
+ }
202
+ }
83
203
  // Build archive
84
204
  const archive = {
85
205
  format: 'causantic-archive',
@@ -91,31 +211,40 @@ export async function exportArchive(options) {
91
211
  chunkCount: chunks.length,
92
212
  edgeCount: edges.length,
93
213
  clusterCount: clusters.length,
214
+ vectorCount: vectors.length,
215
+ embeddingDimensions,
94
216
  projects: targetProjects,
95
217
  },
96
218
  chunks,
97
219
  edges,
98
220
  clusters,
221
+ vectors,
99
222
  };
100
- // Serialize
101
- const jsonData = JSON.stringify(archive, null, 2);
102
- // Write output
223
+ // Serialize: JSON -> gzip -> (optional) encrypt -> write
224
+ const jsonData = JSON.stringify(archive);
225
+ const compressed = gzipSync(Buffer.from(jsonData, 'utf-8'));
226
+ let output;
227
+ const encrypted = !!options.password;
103
228
  if (options.password) {
104
- // Encrypted
105
- const encrypted = encrypt(Buffer.from(jsonData, 'utf-8'), options.password);
106
- const serialized = serializeEncrypted(encrypted);
107
- const output = Buffer.concat([ENCRYPTED_MAGIC, serialized]);
108
- writeFileSync(options.outputPath, output);
229
+ const encryptedData = encrypt(compressed, options.password);
230
+ const serialized = serializeEncrypted(encryptedData);
231
+ output = Buffer.concat([ENCRYPTED_MAGIC, serialized]);
109
232
  }
110
233
  else {
111
- // Unencrypted
112
- writeFileSync(options.outputPath, jsonData);
234
+ output = compressed;
113
235
  }
114
- log.info('Export completed', {
115
- chunks: chunks.length,
116
- edges: edges.length,
117
- clusters: clusters.length,
118
- });
236
+ writeFileSync(options.outputPath, output);
237
+ const result = {
238
+ chunkCount: chunks.length,
239
+ edgeCount: edges.length,
240
+ clusterCount: clusters.length,
241
+ vectorCount: vectors.length,
242
+ fileSize: output.length,
243
+ compressed: true,
244
+ encrypted,
245
+ };
246
+ log.info('Export completed', { ...result });
247
+ return result;
119
248
  }
120
249
  /**
121
250
  * Import memory data from an archive.
@@ -126,76 +255,133 @@ export async function importArchive(options) {
126
255
  }
127
256
  const fileContent = readFileSync(options.inputPath);
128
257
  let jsonData;
129
- // Check if encrypted
130
- if (fileContent.subarray(0, 4).equals(ENCRYPTED_MAGIC)) {
258
+ // Detection order:
259
+ // 1. CST\0 (encrypted) -> decrypt, then check for gzip
260
+ // 2. gzip magic 0x1f 0x8b (compressed, unencrypted)
261
+ // 3. plain JSON (v1.0 backward compat)
262
+ if (fileContent.length >= 4 && fileContent.subarray(0, 4).equals(ENCRYPTED_MAGIC)) {
131
263
  if (!options.password) {
132
264
  throw new Error('Archive is encrypted. Please provide a password.');
133
265
  }
134
266
  const encryptedData = deserializeEncrypted(fileContent.subarray(4));
135
267
  const decrypted = decrypt(encryptedData, options.password);
136
- jsonData = decrypted.toString('utf-8');
268
+ // Check if decrypted data is gzipped
269
+ if (decrypted.length >= 2 && decrypted[0] === 0x1f && decrypted[1] === 0x8b) {
270
+ jsonData = gunzipSync(decrypted).toString('utf-8');
271
+ }
272
+ else {
273
+ jsonData = decrypted.toString('utf-8');
274
+ }
275
+ }
276
+ else if (fileContent.length >= 2 &&
277
+ fileContent[0] === GZIP_MAGIC[0] &&
278
+ fileContent[1] === GZIP_MAGIC[1]) {
279
+ jsonData = gunzipSync(fileContent).toString('utf-8');
137
280
  }
138
281
  else {
139
282
  jsonData = fileContent.toString('utf-8');
140
283
  }
141
284
  const archive = JSON.parse(jsonData);
142
- if (archive.format !== 'causantic-archive') {
143
- throw new Error('Invalid archive format');
285
+ // Validate
286
+ const validation = validateArchive(archive);
287
+ for (const warning of validation.warnings) {
288
+ log.warn(warning);
289
+ }
290
+ if (!validation.valid) {
291
+ throw new Error(`Invalid archive: ${validation.errors.join('; ')}`);
292
+ }
293
+ // Normalize v1.0 archives
294
+ if (!archive.vectors) {
295
+ archive.vectors = [];
296
+ }
297
+ const result = {
298
+ chunkCount: archive.chunks.length,
299
+ edgeCount: archive.edges.length,
300
+ clusterCount: archive.clusters.length,
301
+ vectorCount: archive.vectors.length,
302
+ dryRun: !!options.dryRun,
303
+ };
304
+ if (options.dryRun) {
305
+ log.info('Dry run — no changes made', { ...result });
306
+ return result;
144
307
  }
145
308
  const db = getDb();
309
+ // Ensure vectors table exists
310
+ db.exec(`
311
+ CREATE TABLE IF NOT EXISTS vectors (
312
+ id TEXT PRIMARY KEY,
313
+ embedding BLOB NOT NULL,
314
+ orphaned_at TEXT DEFAULT NULL,
315
+ last_accessed TEXT DEFAULT CURRENT_TIMESTAMP
316
+ )
317
+ `);
146
318
  // Start transaction
147
319
  const transaction = db.transaction(() => {
148
320
  if (!options.merge) {
149
321
  // Clear existing data
150
- db.prepare('DELETE FROM cluster_members').run();
322
+ db.prepare('DELETE FROM chunk_clusters').run();
151
323
  db.prepare('DELETE FROM clusters').run();
152
324
  db.prepare('DELETE FROM edges').run();
325
+ db.prepare('DELETE FROM vectors').run();
153
326
  db.prepare('DELETE FROM chunks').run();
154
327
  }
155
328
  // Import chunks
156
329
  const insertChunk = db.prepare(`
157
- INSERT OR REPLACE INTO chunks (id, session_slug, content, start_time, end_time, turn_indices)
158
- VALUES (?, ?, ?, ?, ?, ?)
330
+ INSERT OR REPLACE INTO chunks (id, session_id, session_slug, project_path, content, start_time, end_time, turn_indices)
331
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
159
332
  `);
160
333
  for (const chunk of archive.chunks) {
161
- insertChunk.run(chunk.id, chunk.sessionSlug, chunk.content, chunk.startTime, chunk.endTime, JSON.stringify(chunk.turnIndices));
334
+ insertChunk.run(chunk.id, chunk.sessionId ?? '', chunk.sessionSlug, chunk.projectPath ?? null, chunk.content, chunk.startTime, chunk.endTime, JSON.stringify(chunk.turnIndices));
162
335
  }
163
336
  // Import edges
164
337
  const insertEdge = db.prepare(`
165
- INSERT OR REPLACE INTO edges (source_id, target_id, type, reference_type, weight)
166
- VALUES (?, ?, ?, ?, ?)
338
+ INSERT OR REPLACE INTO edges (id, source_chunk_id, target_chunk_id, edge_type, reference_type, initial_weight, created_at, link_count)
339
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
167
340
  `);
168
341
  for (const edge of archive.edges) {
169
- insertEdge.run(edge.source, edge.target, edge.type, edge.referenceType, edge.weight);
342
+ insertEdge.run(edge.id ?? generateId(), edge.source, edge.target, edge.type, edge.referenceType ?? null, edge.weight, new Date().toISOString(), edge.linkCount ?? 1);
170
343
  }
171
344
  // Import clusters
172
345
  const insertCluster = db.prepare(`
173
- INSERT OR REPLACE INTO clusters (id, name, description)
174
- VALUES (?, ?, ?)
346
+ INSERT OR REPLACE INTO clusters (id, name, description, centroid, exemplar_ids, membership_hash)
347
+ VALUES (?, ?, ?, ?, ?, ?)
175
348
  `);
176
349
  const insertMember = db.prepare(`
177
- INSERT OR REPLACE INTO cluster_members (cluster_id, chunk_id)
178
- VALUES (?, ?)
350
+ INSERT OR REPLACE INTO chunk_clusters (chunk_id, cluster_id, distance)
351
+ VALUES (?, ?, ?)
179
352
  `);
180
353
  for (const cluster of archive.clusters) {
181
- insertCluster.run(cluster.id, cluster.name, cluster.description);
182
- for (const memberId of cluster.memberChunkIds) {
183
- insertMember.run(cluster.id, memberId);
354
+ insertCluster.run(cluster.id, cluster.name, cluster.description, cluster.centroid ? serializeEmbedding(cluster.centroid) : null, cluster.exemplarIds ? JSON.stringify(cluster.exemplarIds) : null, cluster.membershipHash ?? null);
355
+ // Handle both v1.1 (members with distance) and v1.0 compat (memberChunkIds)
356
+ const members = cluster.members ??
357
+ cluster.memberChunkIds?.map((id) => ({
358
+ chunkId: id,
359
+ distance: 0,
360
+ })) ??
361
+ [];
362
+ for (const member of members) {
363
+ insertMember.run(member.chunkId, cluster.id, member.distance);
364
+ }
365
+ }
366
+ // Import vectors
367
+ if (archive.vectors.length > 0) {
368
+ const insertVector = db.prepare(`
369
+ INSERT OR REPLACE INTO vectors (id, embedding, orphaned_at, last_accessed)
370
+ VALUES (?, ?, NULL, CURRENT_TIMESTAMP)
371
+ `);
372
+ for (const vector of archive.vectors) {
373
+ insertVector.run(vector.chunkId, serializeEmbedding(vector.embedding));
184
374
  }
185
375
  }
186
376
  });
187
377
  transaction();
188
- log.info('Import completed', {
189
- chunks: archive.chunks.length,
190
- edges: archive.edges.length,
191
- clusters: archive.clusters.length,
192
- });
378
+ log.info('Import completed', { ...result });
379
+ return result;
193
380
  }
194
381
  /**
195
382
  * Redact file paths in content.
196
383
  */
197
384
  function redactFilePaths(content) {
198
- // Match common file path patterns
199
385
  const pathPattern = /(?:\/[\w.-]+)+\.\w+|(?:[A-Z]:\\[\w.-\\]+)|(?:~\/[\w.-\/]+)/g;
200
386
  return content.replace(pathPattern, '[REDACTED_PATH]');
201
387
  }
@@ -203,7 +389,6 @@ function redactFilePaths(content) {
203
389
  * Redact code blocks in content.
204
390
  */
205
391
  function redactCodeBlocks(content) {
206
- // Match markdown code blocks
207
392
  const codeBlockPattern = /```[\s\S]*?```/g;
208
393
  return content.replace(codeBlockPattern, '```\n[REDACTED_CODE]\n```');
209
394
  }
@@ -1 +1 @@
1
- {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/storage/archive.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/storage/archive.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "causantic",
3
- "version": "0.5.2",
3
+ "version": "0.5.3",
4
4
  "description": "Long-term memory for Claude Code — local-first, graph-augmented, self-benchmarking",
5
5
  "type": "module",
6
6
  "private": false,
@@ -55,8 +55,8 @@
55
55
  "test:watch": "vitest",
56
56
  "lint": "eslint src/ test/",
57
57
  "lint:fix": "eslint src/ test/ --fix",
58
- "format": "prettier --write 'src/**/*.ts' 'test/**/*.ts'",
59
- "format:check": "prettier --check 'src/**/*.ts' 'test/**/*.ts'",
58
+ "format": "prettier --write 'src/**/*.{ts,tsx,css}' 'test/**/*.ts' 'scripts/**/*.ts' config.schema.json docker-compose.yml",
59
+ "format:check": "prettier --check 'src/**/*.{ts,tsx,css}' 'test/**/*.ts' 'scripts/**/*.ts' config.schema.json docker-compose.yml",
60
60
  "ingest": "tsx scripts/ops/ingest.ts",
61
61
  "batch-ingest": "tsx scripts/ops/batch-ingest.ts",
62
62
  "recall": "tsx scripts/ops/recall.ts",
@@ -96,8 +96,8 @@
96
96
  "devDependencies": {
97
97
  "@types/express": "^5.0.6",
98
98
  "@types/node": "^25.2.3",
99
- "@typescript-eslint/eslint-plugin": "^8.55.0",
100
- "@typescript-eslint/parser": "^8.55.0",
99
+ "@typescript-eslint/eslint-plugin": "^8.56.0",
100
+ "@typescript-eslint/parser": "^8.56.0",
101
101
  "@vitest/coverage-v8": "^4.0.18",
102
102
  "eslint": "^9.39.2",
103
103
  "eslint-config-prettier": "^10.1.8",