gnosys 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1387 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +3753 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2267 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/archive.d.ts +95 -0
- package/dist/lib/archive.d.ts.map +1 -0
- package/dist/lib/archive.js +311 -0
- package/dist/lib/archive.js.map +1 -0
- package/dist/lib/ask.d.ts +77 -0
- package/dist/lib/ask.d.ts.map +1 -0
- package/dist/lib/ask.js +316 -0
- package/dist/lib/ask.js.map +1 -0
- package/dist/lib/audit.d.ts +47 -0
- package/dist/lib/audit.d.ts.map +1 -0
- package/dist/lib/audit.js +136 -0
- package/dist/lib/audit.js.map +1 -0
- package/dist/lib/bootstrap.d.ts +56 -0
- package/dist/lib/bootstrap.d.ts.map +1 -0
- package/dist/lib/bootstrap.js +163 -0
- package/dist/lib/bootstrap.js.map +1 -0
- package/dist/lib/config.d.ts +239 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +371 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/dashboard.d.ts +81 -0
- package/dist/lib/dashboard.d.ts.map +1 -0
- package/dist/lib/dashboard.js +314 -0
- package/dist/lib/dashboard.js.map +1 -0
- package/dist/lib/db.d.ts +182 -0
- package/dist/lib/db.d.ts.map +1 -0
- package/dist/lib/db.js +620 -0
- package/dist/lib/db.js.map +1 -0
- package/dist/lib/dbSearch.d.ts +65 -0
- package/dist/lib/dbSearch.d.ts.map +1 -0
- package/dist/lib/dbSearch.js +239 -0
- package/dist/lib/dbSearch.js.map +1 -0
- package/dist/lib/dbWrite.d.ts +56 -0
- package/dist/lib/dbWrite.d.ts.map +1 -0
- package/dist/lib/dbWrite.js +171 -0
- package/dist/lib/dbWrite.js.map +1 -0
- package/dist/lib/dream.d.ts +170 -0
- package/dist/lib/dream.d.ts.map +1 -0
- package/dist/lib/dream.js +706 -0
- package/dist/lib/dream.js.map +1 -0
- package/dist/lib/embeddings.d.ts +84 -0
- package/dist/lib/embeddings.d.ts.map +1 -0
- package/dist/lib/embeddings.js +226 -0
- package/dist/lib/embeddings.js.map +1 -0
- package/dist/lib/export.d.ts +92 -0
- package/dist/lib/export.d.ts.map +1 -0
- package/dist/lib/export.js +362 -0
- package/dist/lib/export.js.map +1 -0
- package/dist/lib/federated.d.ts +113 -0
- package/dist/lib/federated.d.ts.map +1 -0
- package/dist/lib/federated.js +346 -0
- package/dist/lib/federated.js.map +1 -0
- package/dist/lib/graph.d.ts +50 -0
- package/dist/lib/graph.d.ts.map +1 -0
- package/dist/lib/graph.js +118 -0
- package/dist/lib/graph.js.map +1 -0
- package/dist/lib/history.d.ts +39 -0
- package/dist/lib/history.d.ts.map +1 -0
- package/dist/lib/history.js +112 -0
- package/dist/lib/history.js.map +1 -0
- package/dist/lib/hybridSearch.d.ts +80 -0
- package/dist/lib/hybridSearch.d.ts.map +1 -0
- package/dist/lib/hybridSearch.js +296 -0
- package/dist/lib/hybridSearch.js.map +1 -0
- package/dist/lib/import.d.ts +52 -0
- package/dist/lib/import.d.ts.map +1 -0
- package/dist/lib/import.js +365 -0
- package/dist/lib/import.js.map +1 -0
- package/dist/lib/ingest.d.ts +51 -0
- package/dist/lib/ingest.d.ts.map +1 -0
- package/dist/lib/ingest.js +144 -0
- package/dist/lib/ingest.js.map +1 -0
- package/dist/lib/lensing.d.ts +35 -0
- package/dist/lib/lensing.d.ts.map +1 -0
- package/dist/lib/lensing.js +85 -0
- package/dist/lib/lensing.js.map +1 -0
- package/dist/lib/llm.d.ts +84 -0
- package/dist/lib/llm.d.ts.map +1 -0
- package/dist/lib/llm.js +386 -0
- package/dist/lib/llm.js.map +1 -0
- package/dist/lib/lock.d.ts +28 -0
- package/dist/lib/lock.d.ts.map +1 -0
- package/dist/lib/lock.js +145 -0
- package/dist/lib/lock.js.map +1 -0
- package/dist/lib/maintenance.d.ts +124 -0
- package/dist/lib/maintenance.d.ts.map +1 -0
- package/dist/lib/maintenance.js +587 -0
- package/dist/lib/maintenance.js.map +1 -0
- package/dist/lib/migrate.d.ts +19 -0
- package/dist/lib/migrate.d.ts.map +1 -0
- package/dist/lib/migrate.js +260 -0
- package/dist/lib/migrate.js.map +1 -0
- package/dist/lib/preferences.d.ts +49 -0
- package/dist/lib/preferences.d.ts.map +1 -0
- package/dist/lib/preferences.js +149 -0
- package/dist/lib/preferences.js.map +1 -0
- package/dist/lib/projectIdentity.d.ts +66 -0
- package/dist/lib/projectIdentity.d.ts.map +1 -0
- package/dist/lib/projectIdentity.js +148 -0
- package/dist/lib/projectIdentity.js.map +1 -0
- package/dist/lib/recall.d.ts +82 -0
- package/dist/lib/recall.d.ts.map +1 -0
- package/dist/lib/recall.js +289 -0
- package/dist/lib/recall.js.map +1 -0
- package/dist/lib/resolver.d.ts +116 -0
- package/dist/lib/resolver.d.ts.map +1 -0
- package/dist/lib/resolver.js +372 -0
- package/dist/lib/resolver.js.map +1 -0
- package/dist/lib/retry.d.ts +24 -0
- package/dist/lib/retry.d.ts.map +1 -0
- package/dist/lib/retry.js +60 -0
- package/dist/lib/retry.js.map +1 -0
- package/dist/lib/rulesGen.d.ts +51 -0
- package/dist/lib/rulesGen.d.ts.map +1 -0
- package/dist/lib/rulesGen.js +167 -0
- package/dist/lib/rulesGen.js.map +1 -0
- package/dist/lib/search.d.ts +51 -0
- package/dist/lib/search.d.ts.map +1 -0
- package/dist/lib/search.js +190 -0
- package/dist/lib/search.js.map +1 -0
- package/dist/lib/staticSearch.d.ts +70 -0
- package/dist/lib/staticSearch.d.ts.map +1 -0
- package/dist/lib/staticSearch.js +162 -0
- package/dist/lib/staticSearch.js.map +1 -0
- package/dist/lib/store.d.ts +79 -0
- package/dist/lib/store.d.ts.map +1 -0
- package/dist/lib/store.js +227 -0
- package/dist/lib/store.js.map +1 -0
- package/dist/lib/structuredIngest.d.ts +37 -0
- package/dist/lib/structuredIngest.d.ts.map +1 -0
- package/dist/lib/structuredIngest.js +208 -0
- package/dist/lib/structuredIngest.js.map +1 -0
- package/dist/lib/tags.d.ts +26 -0
- package/dist/lib/tags.d.ts.map +1 -0
- package/dist/lib/tags.js +109 -0
- package/dist/lib/tags.js.map +1 -0
- package/dist/lib/timeline.d.ts +34 -0
- package/dist/lib/timeline.d.ts.map +1 -0
- package/dist/lib/timeline.js +116 -0
- package/dist/lib/timeline.js.map +1 -0
- package/dist/lib/trace.d.ts +42 -0
- package/dist/lib/trace.d.ts.map +1 -0
- package/dist/lib/trace.js +338 -0
- package/dist/lib/trace.js.map +1 -0
- package/dist/lib/webIndex.d.ts +28 -0
- package/dist/lib/webIndex.d.ts.map +1 -0
- package/dist/lib/webIndex.js +208 -0
- package/dist/lib/webIndex.js.map +1 -0
- package/dist/lib/webIngest.d.ts +51 -0
- package/dist/lib/webIngest.d.ts.map +1 -0
- package/dist/lib/webIngest.js +533 -0
- package/dist/lib/webIngest.js.map +1 -0
- package/dist/lib/wikilinks.d.ts +63 -0
- package/dist/lib/wikilinks.d.ts.map +1 -0
- package/dist/lib/wikilinks.js +146 -0
- package/dist/lib/wikilinks.js.map +1 -0
- package/dist/sandbox/client.d.ts +82 -0
- package/dist/sandbox/client.d.ts.map +1 -0
- package/dist/sandbox/client.js +128 -0
- package/dist/sandbox/client.js.map +1 -0
- package/dist/sandbox/helper-template.d.ts +14 -0
- package/dist/sandbox/helper-template.d.ts.map +1 -0
- package/dist/sandbox/helper-template.js +285 -0
- package/dist/sandbox/helper-template.js.map +1 -0
- package/dist/sandbox/index.d.ts +10 -0
- package/dist/sandbox/index.d.ts.map +1 -0
- package/dist/sandbox/index.js +10 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/sandbox/manager.d.ts +40 -0
- package/dist/sandbox/manager.d.ts.map +1 -0
- package/dist/sandbox/manager.js +220 -0
- package/dist/sandbox/manager.js.map +1 -0
- package/dist/sandbox/server.d.ts +44 -0
- package/dist/sandbox/server.d.ts.map +1 -0
- package/dist/sandbox/server.js +661 -0
- package/dist/sandbox/server.js.map +1 -0
- package/package.json +103 -0
- package/prompts/synthesize.md +21 -0
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Federated Search — Phase 8d
|
|
3
|
+
*
|
|
4
|
+
* Searches across all scopes (project → user → global) with tier boosting,
|
|
5
|
+
* multi-project ambiguity detection, implicit working set recency boost,
|
|
6
|
+
* and project briefing generation.
|
|
7
|
+
*
|
|
8
|
+
* Tier boosting order: project (1.5x) > user (1.0x) > global (0.7x)
|
|
9
|
+
* Recency boost: memories accessed/modified in the last 24h get a 1.3x boost
|
|
10
|
+
*/
|
|
11
|
+
import { findProjectIdentity } from "./projectIdentity.js";
|
|
12
|
+
// ─── Boost Constants ────────────────────────────────────────────────────
|
|
13
|
+
const SCOPE_BOOST = {
|
|
14
|
+
project: 1.5,
|
|
15
|
+
user: 1.0,
|
|
16
|
+
global: 0.7,
|
|
17
|
+
};
|
|
18
|
+
const RECENCY_BOOST = 1.3;
|
|
19
|
+
const REINFORCEMENT_BOOST_PER = 0.05; // per reinforcement, capped at 0.25
|
|
20
|
+
// ─── Federated Search ───────────────────────────────────────────────────
|
|
21
|
+
/**
|
|
22
|
+
* Search across all scopes with tier boosting and recency awareness.
|
|
23
|
+
* Results from the current project rank highest, then user-scoped, then global.
|
|
24
|
+
*/
|
|
25
|
+
export function federatedSearch(db, query, opts = {}) {
|
|
26
|
+
const { limit = 20, projectId = null, includeGlobal = true, recencyWindowHours = 24, scopeFilter, } = opts;
|
|
27
|
+
// Run FTS5 search across ALL memories (no scope filter at query time)
|
|
28
|
+
const rawResults = db.searchFts(query, limit * 3);
|
|
29
|
+
if (rawResults.length === 0)
|
|
30
|
+
return [];
|
|
31
|
+
// Build a project name lookup
|
|
32
|
+
const projects = db.getAllProjects();
|
|
33
|
+
const projectMap = new Map();
|
|
34
|
+
for (const p of projects) {
|
|
35
|
+
projectMap.set(p.id, p.name);
|
|
36
|
+
}
|
|
37
|
+
const now = Date.now();
|
|
38
|
+
const recencyThreshold = now - recencyWindowHours * 60 * 60 * 1000;
|
|
39
|
+
// Score each result with tier boosting
|
|
40
|
+
const scored = [];
|
|
41
|
+
for (let i = 0; i < rawResults.length; i++) {
|
|
42
|
+
const r = rawResults[i];
|
|
43
|
+
const mem = db.getMemory(r.id);
|
|
44
|
+
if (!mem || mem.status !== "active")
|
|
45
|
+
continue;
|
|
46
|
+
const scope = (mem.scope || "project");
|
|
47
|
+
// Skip if scope filter is active and this scope isn't included
|
|
48
|
+
if (scopeFilter && scopeFilter.length > 0 && !scopeFilter.includes(scope))
|
|
49
|
+
continue;
|
|
50
|
+
// Skip global if not requested (legacy flag, scopeFilter takes precedence)
|
|
51
|
+
if (!scopeFilter && !includeGlobal && scope === "global")
|
|
52
|
+
continue;
|
|
53
|
+
// Base score: inverse of FTS rank position (higher = better)
|
|
54
|
+
let score = 1 / (60 + i + 1);
|
|
55
|
+
const boosts = [];
|
|
56
|
+
// 1. Scope boost
|
|
57
|
+
const scopeBoost = SCOPE_BOOST[scope];
|
|
58
|
+
// Extra boost if this memory belongs to the CURRENT project
|
|
59
|
+
if (scope === "project" && projectId && mem.project_id === projectId) {
|
|
60
|
+
score *= scopeBoost * 1.2; // 1.5 * 1.2 = 1.8x for current project
|
|
61
|
+
boosts.push("current-project");
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
score *= scopeBoost;
|
|
65
|
+
}
|
|
66
|
+
boosts.push(`scope:${scope}`);
|
|
67
|
+
// 2. Recency boost
|
|
68
|
+
const modifiedMs = new Date(mem.modified).getTime();
|
|
69
|
+
if (modifiedMs > recencyThreshold) {
|
|
70
|
+
score *= RECENCY_BOOST;
|
|
71
|
+
boosts.push("recent");
|
|
72
|
+
}
|
|
73
|
+
// 3. Reinforcement boost (capped)
|
|
74
|
+
if (mem.reinforcement_count > 0) {
|
|
75
|
+
const rBoost = 1 + Math.min(mem.reinforcement_count * REINFORCEMENT_BOOST_PER, 0.25);
|
|
76
|
+
score *= rBoost;
|
|
77
|
+
boosts.push(`reinforced:${mem.reinforcement_count}`);
|
|
78
|
+
}
|
|
79
|
+
// 4. Confidence factor
|
|
80
|
+
score *= mem.confidence;
|
|
81
|
+
scored.push({
|
|
82
|
+
id: mem.id,
|
|
83
|
+
title: mem.title,
|
|
84
|
+
category: mem.category,
|
|
85
|
+
snippet: r.snippet,
|
|
86
|
+
score,
|
|
87
|
+
scope,
|
|
88
|
+
projectId: mem.project_id,
|
|
89
|
+
projectName: mem.project_id ? (projectMap.get(mem.project_id) || null) : null,
|
|
90
|
+
boosts,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
// Sort by boosted score descending
|
|
94
|
+
scored.sort((a, b) => b.score - a.score);
|
|
95
|
+
return scored.slice(0, limit);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Discover across all scopes — lightweight metadata search
|
|
99
|
+
* with the same tier boosting logic.
|
|
100
|
+
*/
|
|
101
|
+
export function federatedDiscover(db, query, opts = {}) {
|
|
102
|
+
const { limit = 20, projectId = null, includeGlobal = true, recencyWindowHours = 24, } = opts;
|
|
103
|
+
const rawResults = db.discoverFts(query, limit * 3);
|
|
104
|
+
if (rawResults.length === 0)
|
|
105
|
+
return [];
|
|
106
|
+
const projects = db.getAllProjects();
|
|
107
|
+
const projectMap = new Map();
|
|
108
|
+
for (const p of projects) {
|
|
109
|
+
projectMap.set(p.id, p.name);
|
|
110
|
+
}
|
|
111
|
+
const now = Date.now();
|
|
112
|
+
const recencyThreshold = now - recencyWindowHours * 60 * 60 * 1000;
|
|
113
|
+
const scopeFilter = opts.scopeFilter;
|
|
114
|
+
const scored = [];
|
|
115
|
+
for (let i = 0; i < rawResults.length; i++) {
|
|
116
|
+
const r = rawResults[i];
|
|
117
|
+
const mem = db.getMemory(r.id);
|
|
118
|
+
if (!mem || mem.status !== "active")
|
|
119
|
+
continue;
|
|
120
|
+
const scope = (mem.scope || "project");
|
|
121
|
+
if (scopeFilter && scopeFilter.length > 0 && !scopeFilter.includes(scope))
|
|
122
|
+
continue;
|
|
123
|
+
if (!scopeFilter && !includeGlobal && scope === "global")
|
|
124
|
+
continue;
|
|
125
|
+
let score = 1 / (60 + i + 1);
|
|
126
|
+
const boosts = [];
|
|
127
|
+
const scopeBoost = SCOPE_BOOST[scope];
|
|
128
|
+
if (scope === "project" && projectId && mem.project_id === projectId) {
|
|
129
|
+
score *= scopeBoost * 1.2;
|
|
130
|
+
boosts.push("current-project");
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
score *= scopeBoost;
|
|
134
|
+
}
|
|
135
|
+
boosts.push(`scope:${scope}`);
|
|
136
|
+
const modifiedMs = new Date(mem.modified).getTime();
|
|
137
|
+
if (modifiedMs > recencyThreshold) {
|
|
138
|
+
score *= RECENCY_BOOST;
|
|
139
|
+
boosts.push("recent");
|
|
140
|
+
}
|
|
141
|
+
if (mem.reinforcement_count > 0) {
|
|
142
|
+
const rBoost = 1 + Math.min(mem.reinforcement_count * REINFORCEMENT_BOOST_PER, 0.25);
|
|
143
|
+
score *= rBoost;
|
|
144
|
+
}
|
|
145
|
+
score *= mem.confidence;
|
|
146
|
+
scored.push({
|
|
147
|
+
id: mem.id,
|
|
148
|
+
title: mem.title,
|
|
149
|
+
category: mem.category,
|
|
150
|
+
snippet: r.relevance,
|
|
151
|
+
score,
|
|
152
|
+
scope,
|
|
153
|
+
projectId: mem.project_id,
|
|
154
|
+
projectName: mem.project_id ? (projectMap.get(mem.project_id) || null) : null,
|
|
155
|
+
boosts,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
scored.sort((a, b) => b.score - a.score);
|
|
159
|
+
return scored.slice(0, limit);
|
|
160
|
+
}
|
|
161
|
+
// ─── Multi-Project Ambiguity Detection ──────────────────────────────────
|
|
162
|
+
/**
|
|
163
|
+
* Detect ambiguity when multiple projects match a query.
|
|
164
|
+
* Used by write operations — if the user doesn't specify a project and
|
|
165
|
+
* multiple projects have matching content, raise an ambiguity error
|
|
166
|
+
* listing all candidates.
|
|
167
|
+
*/
|
|
168
|
+
export function detectAmbiguity(db, query, opts) {
|
|
169
|
+
const threshold = opts?.threshold ?? 2;
|
|
170
|
+
// Search and group results by project
|
|
171
|
+
const results = db.searchFts(query, 50);
|
|
172
|
+
const projectHits = new Map();
|
|
173
|
+
for (const r of results) {
|
|
174
|
+
const mem = db.getMemory(r.id);
|
|
175
|
+
if (!mem || !mem.project_id)
|
|
176
|
+
continue;
|
|
177
|
+
projectHits.set(mem.project_id, (projectHits.get(mem.project_id) || 0) + 1);
|
|
178
|
+
}
|
|
179
|
+
// Only ambiguous if multiple projects have results
|
|
180
|
+
if (projectHits.size < threshold)
|
|
181
|
+
return null;
|
|
182
|
+
const projects = db.getAllProjects();
|
|
183
|
+
const projectMap = new Map();
|
|
184
|
+
for (const p of projects) {
|
|
185
|
+
projectMap.set(p.id, p);
|
|
186
|
+
}
|
|
187
|
+
const candidates = Array.from(projectHits.entries())
|
|
188
|
+
.map(([pid, count]) => {
|
|
189
|
+
const proj = projectMap.get(pid);
|
|
190
|
+
return {
|
|
191
|
+
projectId: pid,
|
|
192
|
+
projectName: proj?.name || "unknown",
|
|
193
|
+
workingDirectory: proj?.working_directory || "unknown",
|
|
194
|
+
memoryCount: count,
|
|
195
|
+
};
|
|
196
|
+
})
|
|
197
|
+
.sort((a, b) => b.memoryCount - a.memoryCount);
|
|
198
|
+
return {
|
|
199
|
+
type: "ambiguous_project",
|
|
200
|
+
message: `Query "${query}" matches memories in ${candidates.length} projects. Specify a project to narrow results.`,
|
|
201
|
+
candidates,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Auto-detect the current project from a working directory.
|
|
206
|
+
* Returns the projectId or null.
|
|
207
|
+
*/
|
|
208
|
+
export async function detectCurrentProject(db, workingDir) {
|
|
209
|
+
// Try to find project identity from directory
|
|
210
|
+
if (workingDir) {
|
|
211
|
+
const identity = await findProjectIdentity(workingDir);
|
|
212
|
+
if (identity)
|
|
213
|
+
return identity.identity.projectId;
|
|
214
|
+
}
|
|
215
|
+
// Try cwd
|
|
216
|
+
const identity = await findProjectIdentity(process.cwd());
|
|
217
|
+
if (identity)
|
|
218
|
+
return identity.identity.projectId;
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
// ─── Dream Mode Project Briefings ───────────────────────────────────────
|
|
222
|
+
/**
|
|
223
|
+
* Generate a project briefing — a pre-computed summary of a project's
|
|
224
|
+
* memory state. Designed for "dream mode" pre-computation or on-demand
|
|
225
|
+
* project status checks.
|
|
226
|
+
*/
|
|
227
|
+
export function generateBriefing(db, projectId) {
|
|
228
|
+
const project = db.getProject(projectId);
|
|
229
|
+
if (!project)
|
|
230
|
+
return null;
|
|
231
|
+
const memories = db.getMemoriesByProject(projectId);
|
|
232
|
+
const allProjectMems = memories;
|
|
233
|
+
// Category breakdown
|
|
234
|
+
const categories = {};
|
|
235
|
+
for (const m of allProjectMems) {
|
|
236
|
+
categories[m.category] = (categories[m.category] || 0) + 1;
|
|
237
|
+
}
|
|
238
|
+
// Recent activity (last 7 days)
|
|
239
|
+
const weekAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString();
|
|
240
|
+
const recentActivity = allProjectMems
|
|
241
|
+
.filter((m) => m.modified >= weekAgo)
|
|
242
|
+
.sort((a, b) => b.modified.localeCompare(a.modified))
|
|
243
|
+
.slice(0, 10)
|
|
244
|
+
.map((m) => ({ id: m.id, title: m.title, modified: m.modified }));
|
|
245
|
+
// Top tags (parse JSON tag arrays, count occurrences)
|
|
246
|
+
const tagCounts = new Map();
|
|
247
|
+
for (const m of allProjectMems) {
|
|
248
|
+
try {
|
|
249
|
+
const tags = JSON.parse(m.tags || "[]");
|
|
250
|
+
for (const tag of tags) {
|
|
251
|
+
tagCounts.set(tag, (tagCounts.get(tag) || 0) + 1);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
// tags might be comma-separated or malformed
|
|
256
|
+
if (m.tags) {
|
|
257
|
+
for (const t of m.tags.split(",").map((s) => s.trim()).filter(Boolean)) {
|
|
258
|
+
tagCounts.set(t, (tagCounts.get(t) || 0) + 1);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
const topTags = Array.from(tagCounts.entries())
|
|
264
|
+
.sort((a, b) => b[1] - a[1])
|
|
265
|
+
.slice(0, 15)
|
|
266
|
+
.map(([tag, count]) => ({ tag, count }));
|
|
267
|
+
// Generate human-readable summary
|
|
268
|
+
const catList = Object.entries(categories)
|
|
269
|
+
.sort((a, b) => b[1] - a[1])
|
|
270
|
+
.map(([cat, count]) => `${cat} (${count})`)
|
|
271
|
+
.join(", ");
|
|
272
|
+
const summary = [
|
|
273
|
+
`Project "${project.name}" has ${allProjectMems.length} active memories across ${Object.keys(categories).length} categories: ${catList}.`,
|
|
274
|
+
recentActivity.length > 0
|
|
275
|
+
? `${recentActivity.length} memories modified in the last 7 days.`
|
|
276
|
+
: "No recent activity.",
|
|
277
|
+
topTags.length > 0
|
|
278
|
+
? `Top tags: ${topTags.slice(0, 5).map((t) => t.tag).join(", ")}.`
|
|
279
|
+
: "",
|
|
280
|
+
].filter(Boolean).join(" ");
|
|
281
|
+
return {
|
|
282
|
+
projectId,
|
|
283
|
+
projectName: project.name,
|
|
284
|
+
workingDirectory: project.working_directory,
|
|
285
|
+
totalMemories: allProjectMems.length,
|
|
286
|
+
activeMemories: allProjectMems.filter((m) => m.status === "active").length,
|
|
287
|
+
categories,
|
|
288
|
+
recentActivity,
|
|
289
|
+
topTags,
|
|
290
|
+
summary,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Generate briefings for ALL registered projects.
|
|
295
|
+
* Used by dream mode to pre-compute briefings.
|
|
296
|
+
*/
|
|
297
|
+
export function generateAllBriefings(db) {
|
|
298
|
+
const projects = db.getAllProjects();
|
|
299
|
+
const briefings = [];
|
|
300
|
+
for (const project of projects) {
|
|
301
|
+
const briefing = generateBriefing(db, project.id);
|
|
302
|
+
if (briefing) {
|
|
303
|
+
briefings.push(briefing);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return briefings;
|
|
307
|
+
}
|
|
308
|
+
// ─── Implicit Working Set ───────────────────────────────────────────────
|
|
309
|
+
/**
|
|
310
|
+
* Get the implicit working set — recently accessed/modified memories
|
|
311
|
+
* for the current project. These get boosted in federated search results.
|
|
312
|
+
*/
|
|
313
|
+
export function getWorkingSet(db, projectId, opts) {
|
|
314
|
+
const windowHours = opts?.windowHours ?? 24;
|
|
315
|
+
const limit = opts?.limit ?? 20;
|
|
316
|
+
const threshold = new Date(Date.now() - windowHours * 60 * 60 * 1000).toISOString();
|
|
317
|
+
const memories = db.getMemoriesByProject(projectId);
|
|
318
|
+
return memories
|
|
319
|
+
.filter((m) => m.modified >= threshold || (m.last_reinforced && m.last_reinforced >= threshold))
|
|
320
|
+
.sort((a, b) => b.modified.localeCompare(a.modified))
|
|
321
|
+
.slice(0, limit);
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Format the working set as a concise context block for agent consumption.
|
|
325
|
+
*/
|
|
326
|
+
export function formatWorkingSet(memories) {
|
|
327
|
+
if (memories.length === 0)
|
|
328
|
+
return "No recent activity in working set.";
|
|
329
|
+
const lines = memories.map((m) => {
|
|
330
|
+
const age = getRelativeTime(m.modified);
|
|
331
|
+
return `- [${m.id}] ${m.title} (${m.category}, ${age})`;
|
|
332
|
+
});
|
|
333
|
+
return `Working set (${memories.length} recent memories):\n${lines.join("\n")}`;
|
|
334
|
+
}
|
|
335
|
+
// ─── Helpers ────────────────────────────────────────────────────────────
|
|
336
|
+
function getRelativeTime(isoDate) {
|
|
337
|
+
const diffMs = Date.now() - new Date(isoDate).getTime();
|
|
338
|
+
const hours = Math.floor(diffMs / (1000 * 60 * 60));
|
|
339
|
+
if (hours < 1)
|
|
340
|
+
return "just now";
|
|
341
|
+
if (hours < 24)
|
|
342
|
+
return `${hours}h ago`;
|
|
343
|
+
const days = Math.floor(hours / 24);
|
|
344
|
+
return `${days}d ago`;
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=federated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"federated.js","sourceRoot":"","sources":["../../src/lib/federated.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Graph — Persistent wikilink graph stored as .gnosys/graph.json.
|
|
3
|
+
* Fully regeneratable sidecar file. Parses all [[wikilinks]] from memories
|
|
4
|
+
* and builds a JSON graph with nodes, edges, and stats.
|
|
5
|
+
*/
|
|
6
|
+
import { GnosysResolver } from "./resolver.js";
|
|
7
|
+
export interface GraphNode {
|
|
8
|
+
id: string;
|
|
9
|
+
title: string;
|
|
10
|
+
edges: number;
|
|
11
|
+
outgoing: number;
|
|
12
|
+
incoming: number;
|
|
13
|
+
}
|
|
14
|
+
export interface GraphEdge {
|
|
15
|
+
source: string;
|
|
16
|
+
target: string;
|
|
17
|
+
label: string;
|
|
18
|
+
}
|
|
19
|
+
export interface GraphJSON {
|
|
20
|
+
/** ISO timestamp of generation */
|
|
21
|
+
generated: string;
|
|
22
|
+
nodes: GraphNode[];
|
|
23
|
+
edges: GraphEdge[];
|
|
24
|
+
stats: GraphStats;
|
|
25
|
+
}
|
|
26
|
+
export interface GraphStats {
|
|
27
|
+
totalNodes: number;
|
|
28
|
+
totalEdges: number;
|
|
29
|
+
orphanNodes: number;
|
|
30
|
+
orphanLinks: number;
|
|
31
|
+
mostConnected: {
|
|
32
|
+
id: string;
|
|
33
|
+
title: string;
|
|
34
|
+
edges: number;
|
|
35
|
+
} | null;
|
|
36
|
+
avgEdgesPerNode: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Build the wikilink graph from all stores and write to .gnosys/graph.json.
|
|
40
|
+
*/
|
|
41
|
+
export declare function reindexGraph(resolver: GnosysResolver, onLog?: (message: string) => void): Promise<GraphStats>;
|
|
42
|
+
/**
|
|
43
|
+
* Load the persisted graph from .gnosys/graph.json.
|
|
44
|
+
*/
|
|
45
|
+
export declare function loadGraph(storePath: string): Promise<GraphJSON | null>;
|
|
46
|
+
/**
|
|
47
|
+
* Format graph stats for display.
|
|
48
|
+
*/
|
|
49
|
+
export declare function formatGraphStats(stats: GraphStats): string;
|
|
50
|
+
//# sourceMappingURL=graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/lib/graph.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAM/C,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,UAAU,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACnE,eAAe,EAAE,MAAM,CAAC;CACzB;AAID;;GAEG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,cAAc,EACxB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAAC,UAAU,CAAC,CA8BrB;AAgED;;GAEG;AACH,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAQ5E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAY1D"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Graph — Persistent wikilink graph stored as .gnosys/graph.json.
|
|
3
|
+
* Fully regeneratable sidecar file. Parses all [[wikilinks]] from memories
|
|
4
|
+
* and builds a JSON graph with nodes, edges, and stats.
|
|
5
|
+
*/
|
|
6
|
+
import fs from "fs/promises";
|
|
7
|
+
import path from "path";
|
|
8
|
+
import { buildLinkGraph } from "./wikilinks.js";
|
|
9
|
+
// ─── Build & Persist ────────────────────────────────────────────────────
|
|
10
|
+
/**
|
|
11
|
+
* Build the wikilink graph from all stores and write to .gnosys/graph.json.
|
|
12
|
+
*/
|
|
13
|
+
export async function reindexGraph(resolver, onLog) {
|
|
14
|
+
const stores = resolver.getStores();
|
|
15
|
+
if (stores.length === 0) {
|
|
16
|
+
throw new Error("No Gnosys stores found.");
|
|
17
|
+
}
|
|
18
|
+
// Collect all memories across stores
|
|
19
|
+
const allMemories = [];
|
|
20
|
+
for (const s of stores) {
|
|
21
|
+
const memories = await s.store.getAllMemories();
|
|
22
|
+
allMemories.push(...memories);
|
|
23
|
+
}
|
|
24
|
+
onLog?.(`Scanning ${allMemories.length} memories for [[wikilinks]]...`);
|
|
25
|
+
// Build the in-memory link graph using existing wikilinks module
|
|
26
|
+
const linkGraph = buildLinkGraph(allMemories);
|
|
27
|
+
// Convert to serializable format
|
|
28
|
+
const graphJSON = linkGraphToJSON(linkGraph);
|
|
29
|
+
onLog?.(`Found ${graphJSON.stats.totalEdges} edges across ${graphJSON.stats.totalNodes} nodes`);
|
|
30
|
+
// Write to the first store's path
|
|
31
|
+
const graphPath = path.join(stores[0].path, "graph.json");
|
|
32
|
+
await fs.writeFile(graphPath, JSON.stringify(graphJSON, null, 2) + "\n", "utf-8");
|
|
33
|
+
onLog?.(`Graph written to ${graphPath}`);
|
|
34
|
+
return graphJSON.stats;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Convert an in-memory LinkGraph to a serializable GraphJSON.
|
|
38
|
+
*/
|
|
39
|
+
function linkGraphToJSON(graph) {
|
|
40
|
+
const nodes = [];
|
|
41
|
+
const edges = [];
|
|
42
|
+
for (const [nodePath, node] of graph.nodes) {
|
|
43
|
+
nodes.push({
|
|
44
|
+
id: nodePath,
|
|
45
|
+
title: node.title,
|
|
46
|
+
edges: node.outgoing.length + node.incoming.length,
|
|
47
|
+
outgoing: node.outgoing.length,
|
|
48
|
+
incoming: node.incoming.length,
|
|
49
|
+
});
|
|
50
|
+
// Add edges (only from outgoing to avoid duplicates)
|
|
51
|
+
for (const link of node.outgoing) {
|
|
52
|
+
// Find the resolved target path
|
|
53
|
+
const targetNode = Array.from(graph.nodes.values()).find((n) => n.title.toLowerCase() === link.target.toLowerCase() ||
|
|
54
|
+
n.path === link.target ||
|
|
55
|
+
n.path === link.target + ".md" ||
|
|
56
|
+
n.path.split("/").pop()?.replace(/\.md$/, "") === link.target);
|
|
57
|
+
if (targetNode) {
|
|
58
|
+
edges.push({
|
|
59
|
+
source: nodePath,
|
|
60
|
+
target: targetNode.path,
|
|
61
|
+
label: link.target,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Sort nodes by edge count (most connected first)
|
|
67
|
+
nodes.sort((a, b) => b.edges - a.edges);
|
|
68
|
+
const orphanNodes = nodes.filter((n) => n.edges === 0).length;
|
|
69
|
+
const mostConnected = nodes.length > 0 && nodes[0].edges > 0
|
|
70
|
+
? { id: nodes[0].id, title: nodes[0].title, edges: nodes[0].edges }
|
|
71
|
+
: null;
|
|
72
|
+
const avgEdgesPerNode = nodes.length > 0
|
|
73
|
+
? edges.length * 2 / nodes.length // each edge touches 2 nodes
|
|
74
|
+
: 0;
|
|
75
|
+
return {
|
|
76
|
+
generated: new Date().toISOString(),
|
|
77
|
+
nodes,
|
|
78
|
+
edges,
|
|
79
|
+
stats: {
|
|
80
|
+
totalNodes: nodes.length,
|
|
81
|
+
totalEdges: edges.length,
|
|
82
|
+
orphanNodes,
|
|
83
|
+
orphanLinks: graph.orphanedLinks.length,
|
|
84
|
+
mostConnected,
|
|
85
|
+
avgEdgesPerNode: Math.round(avgEdgesPerNode * 100) / 100,
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Load the persisted graph from .gnosys/graph.json.
|
|
91
|
+
*/
|
|
92
|
+
export async function loadGraph(storePath) {
|
|
93
|
+
try {
|
|
94
|
+
const graphPath = path.join(storePath, "graph.json");
|
|
95
|
+
const raw = await fs.readFile(graphPath, "utf-8");
|
|
96
|
+
return JSON.parse(raw);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Format graph stats for display.
|
|
104
|
+
*/
|
|
105
|
+
export function formatGraphStats(stats) {
|
|
106
|
+
const lines = [];
|
|
107
|
+
lines.push(`Wikilink Graph:`);
|
|
108
|
+
lines.push(` Nodes: ${stats.totalNodes}`);
|
|
109
|
+
lines.push(` Edges: ${stats.totalEdges}`);
|
|
110
|
+
lines.push(` Orphan nodes (no links): ${stats.orphanNodes}`);
|
|
111
|
+
lines.push(` Orphan links (unresolved): ${stats.orphanLinks}`);
|
|
112
|
+
lines.push(` Avg edges/node: ${stats.avgEdgesPerNode}`);
|
|
113
|
+
if (stats.mostConnected) {
|
|
114
|
+
lines.push(` Most connected: ${stats.mostConnected.title} (${stats.mostConnected.edges} edges)`);
|
|
115
|
+
}
|
|
116
|
+
return lines.join("\n");
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/lib/graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys History — Git-backed version history for individual memories.
|
|
3
|
+
*
|
|
4
|
+
* Every memory write/update auto-commits to git. This module exposes
|
|
5
|
+
* that history: view what changed, when, and rollback to prior versions.
|
|
6
|
+
*/
|
|
7
|
+
export interface HistoryEntry {
|
|
8
|
+
commitHash: string;
|
|
9
|
+
date: string;
|
|
10
|
+
message: string;
|
|
11
|
+
}
|
|
12
|
+
export interface MemoryVersion {
|
|
13
|
+
commitHash: string;
|
|
14
|
+
date: string;
|
|
15
|
+
message: string;
|
|
16
|
+
content: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get the commit history for a specific memory file.
|
|
20
|
+
*/
|
|
21
|
+
export declare function getFileHistory(storePath: string, relativePath: string, limit?: number): HistoryEntry[];
|
|
22
|
+
/**
|
|
23
|
+
* Get the full file content at a specific commit.
|
|
24
|
+
*/
|
|
25
|
+
export declare function getFileAtCommit(storePath: string, relativePath: string, commitHash: string): string | null;
|
|
26
|
+
/**
|
|
27
|
+
* Get a diff between two commits for a specific file.
|
|
28
|
+
*/
|
|
29
|
+
export declare function getFileDiff(storePath: string, relativePath: string, fromHash: string, toHash: string): string | null;
|
|
30
|
+
/**
|
|
31
|
+
* Rollback a memory to its state at a specific commit.
|
|
32
|
+
* Creates a new commit with the reverted content (non-destructive).
|
|
33
|
+
*/
|
|
34
|
+
export declare function rollbackToCommit(storePath: string, relativePath: string, commitHash: string): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Check if git is available and the store has history.
|
|
37
|
+
*/
|
|
38
|
+
export declare function hasGitHistory(storePath: string): boolean;
|
|
39
|
+
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/lib/history.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAaD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,KAAK,GAAE,MAAW,GACjB,YAAY,EAAE,CA2BhB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GACjB,MAAM,GAAG,IAAI,CAaf;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CAaf;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GACjB,OAAO,CA8BT;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAUxD"}
|