causantic 0.5.1 → 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 +57 -56
- package/config.schema.json +1 -1
- package/dist/cli/commands/archive.d.ts.map +1 -1
- package/dist/cli/commands/archive.js +53 -7
- package/dist/cli/commands/archive.js.map +1 -1
- package/dist/dashboard/client/assets/{index-DtSi-1L8.js → index-BjtuXMeN.js} +1 -1
- package/dist/dashboard/client/index.html +1 -1
- package/dist/ingest/batch-ingest.d.ts +0 -4
- package/dist/ingest/batch-ingest.d.ts.map +1 -1
- package/dist/ingest/batch-ingest.js +0 -8
- package/dist/ingest/batch-ingest.js.map +1 -1
- package/dist/ingest/index.d.ts +1 -1
- package/dist/ingest/index.d.ts.map +1 -1
- package/dist/ingest/index.js +1 -1
- package/dist/ingest/index.js.map +1 -1
- package/dist/storage/archive.d.ts +59 -6
- package/dist/storage/archive.d.ts.map +1 -1
- package/dist/storage/archive.js +259 -74
- package/dist/storage/archive.js.map +1 -1
- package/package.json +5 -6
package/README.md
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
[](https://github.com/Entrolution/causantic/actions/workflows/ci.yml)
|
|
5
5
|
[](LICENSE)
|
|
6
6
|
[](https://nodejs.org)
|
|
7
|
+
[](https://docs.anthropic.com/en/docs/claude-code)
|
|
7
8
|
[](https://www.typescriptlang.org/)
|
|
8
9
|
|
|
9
10
|
**Long-term memory for Claude Code — local-first, graph-augmented, self-benchmarking.**
|
|
@@ -37,29 +38,29 @@ Developers using Claude Code who want their AI assistant to **remember across se
|
|
|
37
38
|
|
|
38
39
|
## Why Causantic?
|
|
39
40
|
|
|
40
|
-
Most AI memory systems use vector embeddings for similarity search. Causantic does too — but adds a **causal graph** that tracks
|
|
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:
|
|
41
42
|
|
|
42
|
-
|
|
|
43
|
-
|
|
44
|
-
| **Finds similar content**
|
|
45
|
-
| **Finds lexically relevant content** | No
|
|
46
|
-
| **Finds related context**
|
|
47
|
-
| **Finds topically related context**
|
|
48
|
-
| **Temporal awareness**
|
|
49
|
-
| **Context augmentation**
|
|
50
|
-
| **Handles project switches**
|
|
51
|
-
| **Bidirectional queries**
|
|
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 |
|
|
52
53
|
|
|
53
54
|
### How It Compares
|
|
54
55
|
|
|
55
|
-
| System
|
|
56
|
-
|
|
57
|
-
| **Causantic** |
|
|
58
|
-
| Mem0
|
|
59
|
-
| Cognee
|
|
60
|
-
| Letta/MemGPT
|
|
61
|
-
| Zep
|
|
62
|
-
| GraphRAG
|
|
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 |
|
|
63
64
|
|
|
64
65
|
See [Landscape Analysis](docs/research/approach/landscape-analysis.md) for detailed per-system analysis.
|
|
65
66
|
|
|
@@ -69,7 +70,7 @@ See [Landscape Analysis](docs/research/approach/landscape-analysis.md) for detai
|
|
|
69
70
|
All data stays on your machine. Optional per-chunk encryption (ChaCha20-Poly1305) with keys stored in your system keychain. No cloud dependency.
|
|
70
71
|
|
|
71
72
|
**2. Hybrid BM25 + Vector Search**
|
|
72
|
-
Vector search finds chunks that
|
|
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
74
|
|
|
74
75
|
**3. Sequential Causal Graph with Episodic Chain Walking**
|
|
75
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.
|
|
@@ -157,17 +158,17 @@ Measure how well your memory system is working with built-in benchmarks. Health,
|
|
|
157
158
|
|
|
158
159
|
The MCP server exposes nine tools:
|
|
159
160
|
|
|
160
|
-
| Tool
|
|
161
|
-
|
|
162
|
-
| `search`
|
|
163
|
-
| `recall`
|
|
164
|
-
| `predict`
|
|
165
|
-
| `list-projects` | Discover available projects with chunk counts and date ranges.
|
|
166
|
-
| `list-sessions` | Browse sessions for a project with time filtering.
|
|
167
|
-
| `reconstruct`
|
|
168
|
-
| `hook-status`
|
|
169
|
-
| `stats`
|
|
170
|
-
| `forget`
|
|
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. |
|
|
171
172
|
|
|
172
173
|
### Claude Code Integration
|
|
173
174
|
|
|
@@ -190,22 +191,22 @@ Or run `npx causantic init` to configure automatically.
|
|
|
190
191
|
|
|
191
192
|
Causantic installs 14 Claude Code slash commands (via `npx causantic init`) for natural-language interaction with memory:
|
|
192
193
|
|
|
193
|
-
| Skill
|
|
194
|
-
|
|
195
|
-
| `/causantic-recall [query]`
|
|
196
|
-
| `/causantic-search [query]`
|
|
197
|
-
| `/causantic-predict <context>`
|
|
198
|
-
| `/causantic-explain [question]` | Answer "why" questions using memory + codebase (why does X work this way?)
|
|
199
|
-
| `/causantic-debug [error]`
|
|
200
|
-
| `/causantic-resume`
|
|
201
|
-
| `/causantic-reconstruct [time]` | Replay a past session chronologically by time range
|
|
202
|
-
| `/causantic-summary [time]`
|
|
203
|
-
| `/causantic-list-projects`
|
|
204
|
-
| `/causantic-status`
|
|
205
|
-
| `/causantic-crossref [pattern]` | Search across all projects for reusable patterns
|
|
206
|
-
| `/causantic-retro [scope]`
|
|
207
|
-
| `/causantic-cleanup`
|
|
208
|
-
| `/causantic-forget [query]`
|
|
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) |
|
|
209
210
|
|
|
210
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.
|
|
211
212
|
|
|
@@ -248,7 +249,7 @@ Create `causantic.config.json` in your project root:
|
|
|
248
249
|
{
|
|
249
250
|
"$schema": "https://raw.githubusercontent.com/Entrolution/causantic/main/config.schema.json",
|
|
250
251
|
"clustering": {
|
|
251
|
-
"threshold": 0.
|
|
252
|
+
"threshold": 0.1,
|
|
252
253
|
"minClusterSize": 4
|
|
253
254
|
},
|
|
254
255
|
"vectors": {
|
|
@@ -282,13 +283,13 @@ See [Security Guide](docs/guides/security.md).
|
|
|
282
283
|
|
|
283
284
|
Built on rigorous experimentation across 75 sessions and 297+ queries:
|
|
284
285
|
|
|
285
|
-
| Experiment
|
|
286
|
-
|
|
287
|
-
| Chain Walking (v0.3)
|
|
288
|
-
| Topic Detection
|
|
289
|
-
| Clustering
|
|
290
|
-
| Thinking Block Removal | +0.063 AUC
|
|
291
|
-
| Collection Benchmark
|
|
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 |
|
|
292
293
|
|
|
293
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.
|
|
294
295
|
|
|
@@ -304,7 +305,7 @@ The name reflects how the causal graph's value is **structural ordering** — wh
|
|
|
304
305
|
- **Initial ingestion time**: Large session histories take time to parse, embed, and cluster. This is a one-time cost.
|
|
305
306
|
- **Edge quality dependency**: Chain walking depends on connected edges. Sparse or orphaned chunks fall back to ranked search results.
|
|
306
307
|
- **Collection size effects**: Benchmark scores improve as more sessions are ingested. Small collections (<100 chunks) won't benefit much from chain walking or clustering.
|
|
307
|
-
- **Claude Code
|
|
308
|
+
- **Claude Code 5.1+ required**: Hooks use `async` mode which requires Claude Code 5.1 or later. The parser assumes Claude Code session format (JSONL transcripts). Not a general-purpose memory system.
|
|
308
309
|
- **Local compute**: Embedding inference runs on your hardware. Apple Silicon (CoreML) and NVIDIA GPUs are supported; CPU-only is slower.
|
|
309
310
|
|
|
310
311
|
## Maintenance
|
package/config.schema.json
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":"AACA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjE,MAAM,CAAC,MAAM,aAAa,GAAY;IACpC,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,oBAAoB;IACjC,KAAK,
|
|
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-
|
|
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,
|
|
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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"}
|
package/dist/ingest/index.d.ts
CHANGED
|
@@ -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
|
|
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,
|
|
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"}
|
package/dist/ingest/index.js
CHANGED
|
@@ -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
|
|
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
|
package/dist/ingest/index.js.map
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
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<
|
|
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<
|
|
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
|
|
1
|
+
{"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/storage/archive.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuBH,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,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,4BAA4B;AAC5B,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,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,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,mCAAmC;AACnC,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,8BAA8B;AAC9B,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,6BAA6B;AAC7B,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;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;IAC5B,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;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;IACrB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,oBAAoB;AACpB,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;CACpB;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;IAChB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,oBAAoB;AACpB,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAwB;AACxB,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB,CAqElE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CA8NjF;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CA4KjF"}
|
package/dist/storage/archive.js
CHANGED
|
@@ -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.
|
|
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
|
-
//
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
|
102
|
-
|
|
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
|
-
|
|
105
|
-
const
|
|
106
|
-
|
|
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
|
-
|
|
112
|
-
writeFileSync(options.outputPath, jsonData);
|
|
234
|
+
output = compressed;
|
|
113
235
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
//
|
|
130
|
-
|
|
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
|
-
|
|
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
|
-
|
|
143
|
-
|
|
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
|
|
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 (
|
|
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
|
|
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
|
-
|
|
183
|
-
|
|
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
|
-
|
|
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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;AAEpC,6BAA6B;AAC7B,MAAM,eAAe,GAAG,KAAK,CAAC;AAE9B,yCAAyC;AACzC,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AA0E/C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAsB;IACxD,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IAEnB,sBAAsB;IACtB,MAAM,cAAc,GAAG,EAAE,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC,GAAG,EAE9E,CAAC;IACJ,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAE9D,+BAA+B;IAC/B,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,IAAI,WAAW,CAAC;IAEvD,gBAAgB;IAChB,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC;;;6BAGJ,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;GACjE,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,cAAc,CAOpD,CAAC;IAEH,IAAI,MAAM,GAAoB,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACvD,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC;KAClD,CAAC,CAAC,CAAC;IAEJ,mBAAmB;IACnB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC9B,GAAG,KAAK;YACR,OAAO,EAAE,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC;SACxC,CAAC,CAAC,CAAC;IACN,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC9B,GAAG,KAAK;YACR,OAAO,EAAE,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC;SACzC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,eAAe;IACf,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC;;;0BAGN,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;GACxD,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,QAAQ,CAM5C,CAAC;IAEH,MAAM,KAAK,GAAmB,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACtD,MAAM,EAAE,GAAG,CAAC,SAAS;QACrB,MAAM,EAAE,GAAG,CAAC,SAAS;QACrB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,MAAM,EAAE,GAAG,CAAC,MAAM;KACnB,CAAC,CAAC,CAAC;IAEJ,kBAAkB;IAClB,MAAM,aAAa,GAAG,EAAE,CAAC,OAAO,CAAC;;;;4BAIP,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;;GAE1D,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,QAAQ,CAKlD,CAAC;IAEH,MAAM,QAAQ,GAAsB,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC/D,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,cAAc,EAAE,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE;KACjD,CAAC,CAAC,CAAC;IAEJ,gBAAgB;IAChB,MAAM,OAAO,GAAY;QACvB,MAAM,EAAE,mBAAmB;QAC3B,OAAO,EAAE,eAAe;QACxB,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACjC,QAAQ,EAAE;YACR,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACjC,UAAU,EAAE,MAAM,CAAC,MAAM;YACzB,SAAS,EAAE,KAAK,CAAC,MAAM;YACvB,YAAY,EAAE,QAAQ,CAAC,MAAM;YAC7B,QAAQ,EAAE,cAAc;SACzB;QACD,MAAM;QACN,KAAK;QACL,QAAQ;KACT,CAAC;IAEF,YAAY;IACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAElD,eAAe;IACf,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,YAAY;QACZ,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5E,MAAM,UAAU,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC;QAC5D,aAAa,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,cAAc;QACd,aAAa,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE;QAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,KAAK,CAAC,MAAM;QACnB,QAAQ,EAAE,QAAQ,CAAC,MAAM;KAC1B,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAsB;IACxD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEpD,IAAI,QAAgB,CAAC;IAErB,qBAAqB;IACrB,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,aAAa,GAAG,oBAAoB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC3D,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAY,CAAC;IAEhD,IAAI,OAAO,CAAC,MAAM,KAAK,mBAAmB,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IAEnB,oBAAoB;IACpB,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QACtC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,sBAAsB;YACtB,EAAE,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC,GAAG,EAAE,CAAC;YAChD,EAAE,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,GAAG,EAAE,CAAC;YACzC,EAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,GAAG,EAAE,CAAC;YACtC,EAAE,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,GAAG,EAAE,CAAC;QACzC,CAAC;QAED,gBAAgB;QAChB,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAG9B,CAAC,CAAC;QACH,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,WAAW,CAAC,GAAG,CACb,KAAK,CAAC,EAAE,EACR,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,OAAO,EACb,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,CAClC,CAAC;QACJ,CAAC;QAED,eAAe;QACf,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAG7B,CAAC,CAAC;QACH,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACvF,CAAC;QAED,kBAAkB;QAClB,MAAM,aAAa,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAGhC,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAG/B,CAAC,CAAC;QACH,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACvC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;YACjE,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;gBAC9C,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,WAAW,EAAE,CAAC;IAEd,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE;QAC3B,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM;QAC7B,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM;QAC3B,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM;KAClC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,OAAe;IACtC,kCAAkC;IAClC,MAAM,WAAW,GAAG,6DAA6D,CAAC;IAClF,OAAO,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,OAAe;IACvC,6BAA6B;IAC7B,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;IAC3C,OAAO,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,2BAA2B,CAAC,CAAC;AACxE,CAAC"}
|
|
1
|
+
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/storage/archive.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;AAEpC,6BAA6B;AAC7B,MAAM,eAAe,GAAG,KAAK,CAAC;AAE9B,kCAAkC;AAClC,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAEzC,yCAAyC;AACzC,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAE/C,2BAA2B;AAC3B,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AA+H7C;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,gBAAgB;IAChB,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACrE,MAAM,CAAC,IAAI,CAAC,gCAAgC,OAAO,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,eAAe;IACf,IAAI,OAAO,CAAC,MAAM,KAAK,mBAAmB,EAAE,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,2BAA2B,OAAO,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,qBAAqB;IACrB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,KAAK,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;YAC3D,QAAQ,CAAC,IAAI,CACX,wBAAwB,OAAO,CAAC,QAAQ,CAAC,UAAU,4BAA4B,OAAO,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,GAAG,CAC9G,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,KAAK,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;YACzD,QAAQ,CAAC,IAAI,CACX,uBAAuB,OAAO,CAAC,QAAQ,CAAC,SAAS,4BAA4B,OAAO,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,GAAG,CAC3G,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,KAAK,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;YAC/D,QAAQ,CAAC,IAAI,CACX,0BAA0B,OAAO,CAAC,QAAQ,CAAC,YAAY,4BAA4B,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,GAAG,CACpH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5D,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjE,aAAa,EAAE,CAAC;YAClB,CAAC;QACH,CAAC;QACD,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YACtB,QAAQ,CAAC,IAAI,CAAC,GAAG,aAAa,8CAA8C,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CACX,uGAAuG,CACxG,CAAC;IACJ,CAAC;IAED,yCAAyC;IACzC,IAAI,OAAO,CAAC,QAAQ,EAAE,mBAAmB,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;QACzE,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC;QACxD,IAAI,UAAU,IAAI,UAAU,KAAK,OAAO,CAAC,QAAQ,CAAC,mBAAmB,EAAE,CAAC;YACtE,QAAQ,CAAC,IAAI,CACX,gDAAgD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,uBAAuB,UAAU,EAAE,CACxH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,MAAM;QACN,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAsB;IACxD,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IAEnB,sBAAsB;IACtB,MAAM,cAAc,GAAG,EAAE,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC,GAAG,EAE9E,CAAC;IACJ,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAE9D,+BAA+B;IAC/B,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,IAAI,WAAW,CAAC;IAEvD,gBAAgB;IAChB,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC;;;6BAGJ,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;GACjE,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,cAAc,CASpD,CAAC;IAEH,IAAI,MAAM,GAAoB,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACvD,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC;KAClD,CAAC,CAAC,CAAC;IAEJ,mBAAmB;IACnB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC9B,GAAG,KAAK;YACR,OAAO,EAAE,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC;SACxC,CAAC,CAAC,CAAC;IACN,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC9B,GAAG,KAAK;YACR,OAAO,EAAE,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC;SACzC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,qDAAqD;IACrD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEpD,sDAAsD;IACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACzC,IAAI,KAAK,GAAmB,EAAE,CAAC;IAC/B,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC;;;kCAGA,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;KAC9D,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,QAAQ,CAQ5C,CAAC;QAEH,iEAAiE;QACjE,KAAK,GAAG,WAAW;aAChB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;aAC3F,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACb,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,MAAM,EAAE,GAAG,CAAC,eAAe;YAC3B,MAAM,EAAE,GAAG,CAAC,eAAe;YAC3B,IAAI,EAAE,GAAG,CAAC,SAAS;YACnB,aAAa,EAAE,GAAG,CAAC,cAAc;YACjC,MAAM,EAAE,GAAG,CAAC,cAAc;YAC1B,SAAS,EAAE,GAAG,CAAC,UAAU;SAC1B,CAAC,CAAC,CAAC;IACR,CAAC;IAED,iCAAiC;IACjC,IAAI,QAAQ,GAAsB,EAAE,CAAC;IACrC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,4DAA4D;QAC5D,MAAM,eAAe,GAAG,EAAE,CAAC,OAAO,CAAC;;2BAEZ,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;KACvD,CAAC,CAAC;QACH,MAAM,UAAU,GAAI,eAAe,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAmC,CAAC,GAAG,CACxF,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CACpB,CAAC;QAEF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,aAAa,GAAG,EAAE,CAAC,OAAO,CAAC;;;uBAGhB,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;OACnD,CAAC,CAAC;YACH,MAAM,cAAc,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,UAAU,CAOpD,CAAC;YAEH,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAAC;;gDAEU,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;OAC1E,CAAC,CAAC;YAEH,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gBACpC,MAAM,aAAa,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,QAAQ,CAGxD,CAAC;gBAEH,OAAO;oBACL,EAAE,EAAE,GAAG,CAAC,EAAE;oBACV,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,WAAW,EAAE,GAAG,CAAC,WAAW;oBAC5B,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;oBAClE,WAAW,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI;oBACnE,cAAc,EAAE,GAAG,CAAC,eAAe;oBACnC,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACjC,OAAO,EAAE,CAAC,CAAC,QAAQ;wBACnB,QAAQ,EAAE,CAAC,CAAC,QAAQ;qBACrB,CAAC,CAAC;iBACJ,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,IAAI,OAAO,GAAqB,EAAE,CAAC;IACnC,IAAI,mBAAmB,GAAkB,IAAI,CAAC;IAC9C,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,gCAAgC;QAChC,MAAM,WAAW,GAAG,EAAE;aACnB,OAAO,CAAC,sEAAsE,CAAC;aAC/E,GAAG,EAAE,CAAC;QACT,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAAC;;uBAEf,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;OACjD,CAAC,CAAC;YACH,MAAM,aAAa,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,QAAQ,CAGhD,CAAC;YAEH,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACpC,OAAO,EAAE,GAAG,CAAC,EAAE;gBACf,SAAS,EAAE,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC;aAC/C,CAAC,CAAC,CAAC;YAEJ,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,mBAAmB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;YACpD,CAAC;QACH,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,MAAM,OAAO,GAAY;QACvB,MAAM,EAAE,mBAAmB;QAC3B,OAAO,EAAE,eAAe;QACxB,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACjC,QAAQ,EAAE;YACR,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACjC,UAAU,EAAE,MAAM,CAAC,MAAM;YACzB,SAAS,EAAE,KAAK,CAAC,MAAM;YACvB,YAAY,EAAE,QAAQ,CAAC,MAAM;YAC7B,WAAW,EAAE,OAAO,CAAC,MAAM;YAC3B,mBAAmB;YACnB,QAAQ,EAAE,cAAc;SACzB;QACD,MAAM;QACN,KAAK;QACL,QAAQ;QACR,OAAO;KACR,CAAC;IAEF,yDAAyD;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAE5D,IAAI,MAAc,CAAC;IACnB,MAAM,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACrC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;QACrD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,UAAU,CAAC;IACtB,CAAC;IAED,aAAa,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAE1C,MAAM,MAAM,GAAiB;QAC3B,UAAU,EAAE,MAAM,CAAC,MAAM;QACzB,SAAS,EAAE,KAAK,CAAC,MAAM;QACvB,YAAY,EAAE,QAAQ,CAAC,MAAM;QAC7B,WAAW,EAAE,OAAO,CAAC,MAAM;QAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM;QACvB,UAAU,EAAE,IAAI;QAChB,SAAS;KACV,CAAC;IAEF,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAC5C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAsB;IACxD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEpD,IAAI,QAAgB,CAAC;IAErB,mBAAmB;IACnB,uDAAuD;IACvD,oDAAoD;IACpD,uCAAuC;IACvC,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;QAClF,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,aAAa,GAAG,oBAAoB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAE3D,qCAAqC;QACrC,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5E,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;SAAM,IACL,WAAW,CAAC,MAAM,IAAI,CAAC;QACvB,WAAW,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC;QAChC,WAAW,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,EAChC,CAAC;QACD,QAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAY,CAAC;IAEhD,WAAW;IACX,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC5C,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC1C,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpB,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,oBAAoB,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,0BAA0B;IAC1B,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,OAAO,GAAG,EAAE,CAAC;IACvB,CAAC;IAED,MAAM,MAAM,GAAiB;QAC3B,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM;QACjC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM;QAC/B,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM;QACrC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM;QACnC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM;KACzB,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,GAAG,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QACrD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IAEnB,8BAA8B;IAC9B,EAAE,CAAC,IAAI,CAAC;;;;;;;GAOP,CAAC,CAAC;IAEH,oBAAoB;IACpB,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QACtC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,sBAAsB;YACtB,EAAE,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/C,EAAE,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,GAAG,EAAE,CAAC;YACzC,EAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,GAAG,EAAE,CAAC;YACtC,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,GAAG,EAAE,CAAC;YACxC,EAAE,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,GAAG,EAAE,CAAC;QACzC,CAAC;QAED,gBAAgB;QAChB,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAG9B,CAAC,CAAC;QACH,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,WAAW,CAAC,GAAG,CACb,KAAK,CAAC,EAAE,EACR,KAAK,CAAC,SAAS,IAAI,EAAE,EACrB,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,WAAW,IAAI,IAAI,EACzB,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,OAAO,EACb,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,CAClC,CAAC;QACJ,CAAC;QAED,eAAe;QACf,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAG7B,CAAC,CAAC;QACH,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,UAAU,CAAC,GAAG,CACZ,IAAI,CAAC,EAAE,IAAI,UAAU,EAAE,EACvB,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,aAAa,IAAI,IAAI,EAC1B,IAAI,CAAC,MAAM,EACX,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EACxB,IAAI,CAAC,SAAS,IAAI,CAAC,CACpB,CAAC;QACJ,CAAC;QAED,kBAAkB;QAClB,MAAM,aAAa,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAGhC,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAG/B,CAAC,CAAC;QACH,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACvC,aAAa,CAAC,GAAG,CACf,OAAO,CAAC,EAAE,EACV,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAC9D,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAChE,OAAO,CAAC,cAAc,IAAI,IAAI,CAC/B,CAAC;YAEF,4EAA4E;YAC5E,MAAM,OAAO,GACX,OAAO,CAAC,OAAO;gBACd,OAAoD,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;oBACjF,OAAO,EAAE,EAAE;oBACX,QAAQ,EAAE,CAAC;iBACZ,CAAC,CAAC;gBACH,EAAE,CAAC;YACL,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QAED,iBAAiB;QACjB,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAAC;;;OAG/B,CAAC,CAAC;YACH,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACrC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,WAAW,EAAE,CAAC;IAEd,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAC5C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,WAAW,GAAG,6DAA6D,CAAC;IAClF,OAAO,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,OAAe;IACvC,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;IAC3C,OAAO,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,2BAA2B,CAAC,CAAC;AACxE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "causantic",
|
|
3
|
-
"version": "0.5.
|
|
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,
|
|
@@ -48,7 +48,6 @@
|
|
|
48
48
|
"src/dashboard/client/package-lock.json"
|
|
49
49
|
],
|
|
50
50
|
"scripts": {
|
|
51
|
-
"prepublishOnly": "npm run build && npm test",
|
|
52
51
|
"build": "tsc && cp src/storage/schema.sql dist/storage/ && cd src/dashboard/client && npm install --ignore-scripts && npm run build",
|
|
53
52
|
"build:server": "tsc && cp src/storage/schema.sql dist/storage/",
|
|
54
53
|
"build:client": "cd src/dashboard/client && npm install --ignore-scripts && npm run build",
|
|
@@ -56,8 +55,8 @@
|
|
|
56
55
|
"test:watch": "vitest",
|
|
57
56
|
"lint": "eslint src/ test/",
|
|
58
57
|
"lint:fix": "eslint src/ test/ --fix",
|
|
59
|
-
"format": "prettier --write 'src/**/*.ts' 'test/**/*.ts'",
|
|
60
|
-
"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",
|
|
61
60
|
"ingest": "tsx scripts/ops/ingest.ts",
|
|
62
61
|
"batch-ingest": "tsx scripts/ops/batch-ingest.ts",
|
|
63
62
|
"recall": "tsx scripts/ops/recall.ts",
|
|
@@ -97,8 +96,8 @@
|
|
|
97
96
|
"devDependencies": {
|
|
98
97
|
"@types/express": "^5.0.6",
|
|
99
98
|
"@types/node": "^25.2.3",
|
|
100
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
101
|
-
"@typescript-eslint/parser": "^8.
|
|
99
|
+
"@typescript-eslint/eslint-plugin": "^8.56.0",
|
|
100
|
+
"@typescript-eslint/parser": "^8.56.0",
|
|
102
101
|
"@vitest/coverage-v8": "^4.0.18",
|
|
103
102
|
"eslint": "^9.39.2",
|
|
104
103
|
"eslint-config-prettier": "^10.1.8",
|