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.
Files changed (188) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1387 -0
  3. package/dist/cli.d.ts +7 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +3753 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/index.d.ts +8 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +2267 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/lib/archive.d.ts +95 -0
  12. package/dist/lib/archive.d.ts.map +1 -0
  13. package/dist/lib/archive.js +311 -0
  14. package/dist/lib/archive.js.map +1 -0
  15. package/dist/lib/ask.d.ts +77 -0
  16. package/dist/lib/ask.d.ts.map +1 -0
  17. package/dist/lib/ask.js +316 -0
  18. package/dist/lib/ask.js.map +1 -0
  19. package/dist/lib/audit.d.ts +47 -0
  20. package/dist/lib/audit.d.ts.map +1 -0
  21. package/dist/lib/audit.js +136 -0
  22. package/dist/lib/audit.js.map +1 -0
  23. package/dist/lib/bootstrap.d.ts +56 -0
  24. package/dist/lib/bootstrap.d.ts.map +1 -0
  25. package/dist/lib/bootstrap.js +163 -0
  26. package/dist/lib/bootstrap.js.map +1 -0
  27. package/dist/lib/config.d.ts +239 -0
  28. package/dist/lib/config.d.ts.map +1 -0
  29. package/dist/lib/config.js +371 -0
  30. package/dist/lib/config.js.map +1 -0
  31. package/dist/lib/dashboard.d.ts +81 -0
  32. package/dist/lib/dashboard.d.ts.map +1 -0
  33. package/dist/lib/dashboard.js +314 -0
  34. package/dist/lib/dashboard.js.map +1 -0
  35. package/dist/lib/db.d.ts +182 -0
  36. package/dist/lib/db.d.ts.map +1 -0
  37. package/dist/lib/db.js +620 -0
  38. package/dist/lib/db.js.map +1 -0
  39. package/dist/lib/dbSearch.d.ts +65 -0
  40. package/dist/lib/dbSearch.d.ts.map +1 -0
  41. package/dist/lib/dbSearch.js +239 -0
  42. package/dist/lib/dbSearch.js.map +1 -0
  43. package/dist/lib/dbWrite.d.ts +56 -0
  44. package/dist/lib/dbWrite.d.ts.map +1 -0
  45. package/dist/lib/dbWrite.js +171 -0
  46. package/dist/lib/dbWrite.js.map +1 -0
  47. package/dist/lib/dream.d.ts +170 -0
  48. package/dist/lib/dream.d.ts.map +1 -0
  49. package/dist/lib/dream.js +706 -0
  50. package/dist/lib/dream.js.map +1 -0
  51. package/dist/lib/embeddings.d.ts +84 -0
  52. package/dist/lib/embeddings.d.ts.map +1 -0
  53. package/dist/lib/embeddings.js +226 -0
  54. package/dist/lib/embeddings.js.map +1 -0
  55. package/dist/lib/export.d.ts +92 -0
  56. package/dist/lib/export.d.ts.map +1 -0
  57. package/dist/lib/export.js +362 -0
  58. package/dist/lib/export.js.map +1 -0
  59. package/dist/lib/federated.d.ts +113 -0
  60. package/dist/lib/federated.d.ts.map +1 -0
  61. package/dist/lib/federated.js +346 -0
  62. package/dist/lib/federated.js.map +1 -0
  63. package/dist/lib/graph.d.ts +50 -0
  64. package/dist/lib/graph.d.ts.map +1 -0
  65. package/dist/lib/graph.js +118 -0
  66. package/dist/lib/graph.js.map +1 -0
  67. package/dist/lib/history.d.ts +39 -0
  68. package/dist/lib/history.d.ts.map +1 -0
  69. package/dist/lib/history.js +112 -0
  70. package/dist/lib/history.js.map +1 -0
  71. package/dist/lib/hybridSearch.d.ts +80 -0
  72. package/dist/lib/hybridSearch.d.ts.map +1 -0
  73. package/dist/lib/hybridSearch.js +296 -0
  74. package/dist/lib/hybridSearch.js.map +1 -0
  75. package/dist/lib/import.d.ts +52 -0
  76. package/dist/lib/import.d.ts.map +1 -0
  77. package/dist/lib/import.js +365 -0
  78. package/dist/lib/import.js.map +1 -0
  79. package/dist/lib/ingest.d.ts +51 -0
  80. package/dist/lib/ingest.d.ts.map +1 -0
  81. package/dist/lib/ingest.js +144 -0
  82. package/dist/lib/ingest.js.map +1 -0
  83. package/dist/lib/lensing.d.ts +35 -0
  84. package/dist/lib/lensing.d.ts.map +1 -0
  85. package/dist/lib/lensing.js +85 -0
  86. package/dist/lib/lensing.js.map +1 -0
  87. package/dist/lib/llm.d.ts +84 -0
  88. package/dist/lib/llm.d.ts.map +1 -0
  89. package/dist/lib/llm.js +386 -0
  90. package/dist/lib/llm.js.map +1 -0
  91. package/dist/lib/lock.d.ts +28 -0
  92. package/dist/lib/lock.d.ts.map +1 -0
  93. package/dist/lib/lock.js +145 -0
  94. package/dist/lib/lock.js.map +1 -0
  95. package/dist/lib/maintenance.d.ts +124 -0
  96. package/dist/lib/maintenance.d.ts.map +1 -0
  97. package/dist/lib/maintenance.js +587 -0
  98. package/dist/lib/maintenance.js.map +1 -0
  99. package/dist/lib/migrate.d.ts +19 -0
  100. package/dist/lib/migrate.d.ts.map +1 -0
  101. package/dist/lib/migrate.js +260 -0
  102. package/dist/lib/migrate.js.map +1 -0
  103. package/dist/lib/preferences.d.ts +49 -0
  104. package/dist/lib/preferences.d.ts.map +1 -0
  105. package/dist/lib/preferences.js +149 -0
  106. package/dist/lib/preferences.js.map +1 -0
  107. package/dist/lib/projectIdentity.d.ts +66 -0
  108. package/dist/lib/projectIdentity.d.ts.map +1 -0
  109. package/dist/lib/projectIdentity.js +148 -0
  110. package/dist/lib/projectIdentity.js.map +1 -0
  111. package/dist/lib/recall.d.ts +82 -0
  112. package/dist/lib/recall.d.ts.map +1 -0
  113. package/dist/lib/recall.js +289 -0
  114. package/dist/lib/recall.js.map +1 -0
  115. package/dist/lib/resolver.d.ts +116 -0
  116. package/dist/lib/resolver.d.ts.map +1 -0
  117. package/dist/lib/resolver.js +372 -0
  118. package/dist/lib/resolver.js.map +1 -0
  119. package/dist/lib/retry.d.ts +24 -0
  120. package/dist/lib/retry.d.ts.map +1 -0
  121. package/dist/lib/retry.js +60 -0
  122. package/dist/lib/retry.js.map +1 -0
  123. package/dist/lib/rulesGen.d.ts +51 -0
  124. package/dist/lib/rulesGen.d.ts.map +1 -0
  125. package/dist/lib/rulesGen.js +167 -0
  126. package/dist/lib/rulesGen.js.map +1 -0
  127. package/dist/lib/search.d.ts +51 -0
  128. package/dist/lib/search.d.ts.map +1 -0
  129. package/dist/lib/search.js +190 -0
  130. package/dist/lib/search.js.map +1 -0
  131. package/dist/lib/staticSearch.d.ts +70 -0
  132. package/dist/lib/staticSearch.d.ts.map +1 -0
  133. package/dist/lib/staticSearch.js +162 -0
  134. package/dist/lib/staticSearch.js.map +1 -0
  135. package/dist/lib/store.d.ts +79 -0
  136. package/dist/lib/store.d.ts.map +1 -0
  137. package/dist/lib/store.js +227 -0
  138. package/dist/lib/store.js.map +1 -0
  139. package/dist/lib/structuredIngest.d.ts +37 -0
  140. package/dist/lib/structuredIngest.d.ts.map +1 -0
  141. package/dist/lib/structuredIngest.js +208 -0
  142. package/dist/lib/structuredIngest.js.map +1 -0
  143. package/dist/lib/tags.d.ts +26 -0
  144. package/dist/lib/tags.d.ts.map +1 -0
  145. package/dist/lib/tags.js +109 -0
  146. package/dist/lib/tags.js.map +1 -0
  147. package/dist/lib/timeline.d.ts +34 -0
  148. package/dist/lib/timeline.d.ts.map +1 -0
  149. package/dist/lib/timeline.js +116 -0
  150. package/dist/lib/timeline.js.map +1 -0
  151. package/dist/lib/trace.d.ts +42 -0
  152. package/dist/lib/trace.d.ts.map +1 -0
  153. package/dist/lib/trace.js +338 -0
  154. package/dist/lib/trace.js.map +1 -0
  155. package/dist/lib/webIndex.d.ts +28 -0
  156. package/dist/lib/webIndex.d.ts.map +1 -0
  157. package/dist/lib/webIndex.js +208 -0
  158. package/dist/lib/webIndex.js.map +1 -0
  159. package/dist/lib/webIngest.d.ts +51 -0
  160. package/dist/lib/webIngest.d.ts.map +1 -0
  161. package/dist/lib/webIngest.js +533 -0
  162. package/dist/lib/webIngest.js.map +1 -0
  163. package/dist/lib/wikilinks.d.ts +63 -0
  164. package/dist/lib/wikilinks.d.ts.map +1 -0
  165. package/dist/lib/wikilinks.js +146 -0
  166. package/dist/lib/wikilinks.js.map +1 -0
  167. package/dist/sandbox/client.d.ts +82 -0
  168. package/dist/sandbox/client.d.ts.map +1 -0
  169. package/dist/sandbox/client.js +128 -0
  170. package/dist/sandbox/client.js.map +1 -0
  171. package/dist/sandbox/helper-template.d.ts +14 -0
  172. package/dist/sandbox/helper-template.d.ts.map +1 -0
  173. package/dist/sandbox/helper-template.js +285 -0
  174. package/dist/sandbox/helper-template.js.map +1 -0
  175. package/dist/sandbox/index.d.ts +10 -0
  176. package/dist/sandbox/index.d.ts.map +1 -0
  177. package/dist/sandbox/index.js +10 -0
  178. package/dist/sandbox/index.js.map +1 -0
  179. package/dist/sandbox/manager.d.ts +40 -0
  180. package/dist/sandbox/manager.d.ts.map +1 -0
  181. package/dist/sandbox/manager.js +220 -0
  182. package/dist/sandbox/manager.js.map +1 -0
  183. package/dist/sandbox/server.d.ts +44 -0
  184. package/dist/sandbox/server.d.ts.map +1 -0
  185. package/dist/sandbox/server.js +661 -0
  186. package/dist/sandbox/server.js.map +1 -0
  187. package/package.json +103 -0
  188. 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"}