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,372 @@
1
+ /**
2
+ * Gnosys Store Resolver — Discovers and manages layered stores.
3
+ *
4
+ * Four layers, resolved in specificity order:
5
+ * Project (auto-discovered from cwd, writable, default write target)
6
+ * Optional (GNOSYS_STORES, read-only)
7
+ * Personal (GNOSYS_PERSONAL, writable, fallback write target)
8
+ * Global (GNOSYS_GLOBAL, writable only when explicitly targeted)
9
+ */
10
+ import fs from "fs/promises";
11
+ import path from "path";
12
+ import { GnosysStore } from "./store.js";
13
+ export class GnosysResolver {
14
+ stores = [];
15
+ /** MCP workspace roots (file:// URIs → local paths). Updated via roots/list. */
16
+ static mcpRoots = [];
17
+ /**
18
+ * Update the MCP roots list. Call this from the MCP server on init
19
+ * and on "notifications/roots/list_changed".
20
+ */
21
+ static setMcpRoots(roots) {
22
+ GnosysResolver.mcpRoots = roots
23
+ .map((r) => {
24
+ try {
25
+ // Convert file:// URI to local path
26
+ if (r.uri.startsWith("file://")) {
27
+ return new URL(r.uri).pathname;
28
+ }
29
+ return r.uri;
30
+ }
31
+ catch {
32
+ return r.uri;
33
+ }
34
+ })
35
+ .filter(Boolean);
36
+ }
37
+ /**
38
+ * Get the current MCP roots as local paths.
39
+ */
40
+ static getMcpRoots() {
41
+ return [...GnosysResolver.mcpRoots];
42
+ }
43
+ /**
44
+ * Create a resolver scoped to a specific project root.
45
+ * Used for per-tool projectRoot parameter — each call gets its own
46
+ * resolver instance, so there's no shared mutable state.
47
+ */
48
+ static async resolveForProject(projectRoot) {
49
+ const resolver = new GnosysResolver();
50
+ const storePath = path.join(path.resolve(projectRoot), ".gnosys");
51
+ try {
52
+ const stat = await fs.stat(storePath);
53
+ if (stat.isDirectory()) {
54
+ const store = new GnosysStore(storePath);
55
+ await store.init();
56
+ resolver.stores.push({
57
+ layer: "project",
58
+ label: "project",
59
+ store,
60
+ writable: true,
61
+ path: storePath,
62
+ });
63
+ }
64
+ }
65
+ catch {
66
+ // Store doesn't exist at projectRoot — fall through to empty resolver
67
+ }
68
+ return resolver;
69
+ }
70
+ /**
71
+ * Discover and initialize all store layers.
72
+ */
73
+ async resolve() {
74
+ this.stores = [];
75
+ // 1. Project store — check registered projects first, then MCP roots, then walk up from cwd.
76
+ // Registered projects are saved in ~/.config/gnosys/projects.json by gnosys_init.
77
+ // This is more reliable than cwd because MCP servers may be spawned
78
+ // with cwd set to the user's home directory rather than the open project.
79
+ const projectPath = await this.findProjectStore();
80
+ if (projectPath) {
81
+ const store = new GnosysStore(projectPath);
82
+ await store.init();
83
+ this.stores.push({
84
+ layer: "project",
85
+ label: "project",
86
+ store,
87
+ writable: true,
88
+ path: projectPath,
89
+ });
90
+ }
91
+ // 2. Optional stores (GNOSYS_STORES — colon-separated)
92
+ const optionalPaths = process.env.GNOSYS_STORES;
93
+ if (optionalPaths) {
94
+ const paths = optionalPaths.split(":").filter(Boolean);
95
+ for (let i = 0; i < paths.length; i++) {
96
+ const p = path.resolve(paths[i]);
97
+ if (await this.isValidStore(p)) {
98
+ const store = new GnosysStore(p);
99
+ await store.init();
100
+ const dirName = path.basename(path.dirname(p)) || path.basename(p);
101
+ this.stores.push({
102
+ layer: "optional",
103
+ label: `optional:${dirName}`,
104
+ store,
105
+ writable: false,
106
+ path: p,
107
+ });
108
+ }
109
+ }
110
+ }
111
+ // 3. Personal store (GNOSYS_PERSONAL)
112
+ const personalPath = process.env.GNOSYS_PERSONAL;
113
+ if (personalPath) {
114
+ const p = path.resolve(personalPath);
115
+ const store = new GnosysStore(p);
116
+ await store.init();
117
+ this.stores.push({
118
+ layer: "personal",
119
+ label: "personal",
120
+ store,
121
+ writable: true,
122
+ path: p,
123
+ });
124
+ }
125
+ // 4. Global store (GNOSYS_GLOBAL)
126
+ // Writable, but only when explicitly targeted — never auto-selected.
127
+ const globalPath = process.env.GNOSYS_GLOBAL;
128
+ if (globalPath) {
129
+ const p = path.resolve(globalPath);
130
+ if (await this.isValidStore(p)) {
131
+ const store = new GnosysStore(p);
132
+ await store.init();
133
+ this.stores.push({
134
+ layer: "global",
135
+ label: "global",
136
+ store,
137
+ writable: true,
138
+ path: p,
139
+ });
140
+ }
141
+ }
142
+ return this.stores;
143
+ }
144
+ /**
145
+ * Get all stores in precedence order.
146
+ */
147
+ getStores() {
148
+ return this.stores;
149
+ }
150
+ /**
151
+ * Get all memories across all stores, tagged with their source.
152
+ */
153
+ async getAllMemories() {
154
+ const allMemories = [];
155
+ for (const resolved of this.stores) {
156
+ const memories = await resolved.store.getAllMemories();
157
+ for (const m of memories) {
158
+ allMemories.push({
159
+ ...m,
160
+ sourceLayer: resolved.layer,
161
+ sourceLabel: resolved.label,
162
+ });
163
+ }
164
+ }
165
+ return allMemories;
166
+ }
167
+ /**
168
+ * Read a memory, searching stores in precedence order.
169
+ * Path format: "layer:category/filename.md" or just "category/filename.md" (searches all).
170
+ */
171
+ async readMemory(memPath) {
172
+ // Check if path includes a layer prefix
173
+ const layerMatch = memPath.match(/^(project|personal|global|optional(?::[^:]+)?):(.+)/);
174
+ if (layerMatch) {
175
+ const targetLabel = layerMatch[1];
176
+ const filePath = layerMatch[2];
177
+ const resolved = this.stores.find((s) => s.label === targetLabel || s.layer === targetLabel);
178
+ if (!resolved)
179
+ return null;
180
+ const memory = await resolved.store.readMemory(filePath);
181
+ if (!memory)
182
+ return null;
183
+ return { ...memory, sourceLayer: resolved.layer, sourceLabel: resolved.label };
184
+ }
185
+ // No layer prefix — search in precedence order
186
+ for (const resolved of this.stores) {
187
+ const memory = await resolved.store.readMemory(memPath);
188
+ if (memory) {
189
+ return { ...memory, sourceLayer: resolved.layer, sourceLabel: resolved.label };
190
+ }
191
+ }
192
+ return null;
193
+ }
194
+ /**
195
+ * Get the writable store for a given target layer.
196
+ *
197
+ * When no target is specified, auto-selects: project → personal.
198
+ * Global is writable but NEVER auto-selected — it must be explicitly
199
+ * requested (store: "global"). This prevents accidental writes to
200
+ * shared org knowledge.
201
+ * Optional stores are always read-only.
202
+ */
203
+ getWriteTarget(target) {
204
+ if (target) {
205
+ const store = this.stores.find((s) => s.layer === target && s.writable);
206
+ return store || null;
207
+ }
208
+ // Default: project first, then personal. Never global (requires explicit intent).
209
+ const project = this.stores.find((s) => s.layer === "project");
210
+ if (project?.writable)
211
+ return project;
212
+ const personal = this.stores.find((s) => s.layer === "personal");
213
+ if (personal?.writable)
214
+ return personal;
215
+ return null;
216
+ }
217
+ /**
218
+ * Get a summary of all active stores for logging.
219
+ */
220
+ getSummary() {
221
+ if (this.stores.length === 0) {
222
+ return "No stores found. Create a .gnosys/ directory or set GNOSYS_PERSONAL.";
223
+ }
224
+ return this.stores
225
+ .map((s) => `[${s.label}] ${s.path} (${s.writable ? "read-write" : "read-only"})`)
226
+ .join("\n");
227
+ }
228
+ /**
229
+ * Register a project directory in the persistent project registry.
230
+ * Called by gnosys_init after creating a new store.
231
+ */
232
+ async registerProject(projectDir) {
233
+ const configPath = this.getRegistryPath();
234
+ let projects = [];
235
+ try {
236
+ const raw = await fs.readFile(configPath, "utf-8");
237
+ projects = JSON.parse(raw);
238
+ }
239
+ catch {
240
+ // File doesn't exist yet — that's fine
241
+ }
242
+ const resolved = path.resolve(projectDir);
243
+ if (!projects.includes(resolved)) {
244
+ projects.push(resolved);
245
+ await fs.mkdir(path.dirname(configPath), { recursive: true });
246
+ await fs.writeFile(configPath, JSON.stringify(projects, null, 2), "utf-8");
247
+ }
248
+ }
249
+ /**
250
+ * Directly add a project store to the active stores list.
251
+ * Used after gnosys_init creates a store, to avoid re-resolving from cwd.
252
+ */
253
+ async addProjectStore(storePath) {
254
+ // Remove any existing project store first
255
+ this.stores = this.stores.filter((s) => s.layer !== "project");
256
+ const store = new GnosysStore(storePath);
257
+ await store.init();
258
+ this.stores.unshift({
259
+ layer: "project",
260
+ label: "project",
261
+ store,
262
+ writable: true,
263
+ path: storePath,
264
+ });
265
+ }
266
+ /**
267
+ * Find a project store. Priority order:
268
+ * 1. Registered projects (~/.config/gnosys/projects.json)
269
+ * 2. MCP workspace roots (from roots/list)
270
+ * 3. Walk up from cwd (legacy fallback)
271
+ */
272
+ async findProjectStore() {
273
+ // 1. Check registered projects first — most reliable when MCP server
274
+ // cwd doesn't match the editor's open project.
275
+ const registered = await this.getRegisteredProjects();
276
+ for (const projectDir of registered) {
277
+ const candidate = path.join(projectDir, ".gnosys");
278
+ if (await this.isValidStore(candidate)) {
279
+ return candidate;
280
+ }
281
+ }
282
+ // 2. Check MCP roots — workspace folders the host tells us about.
283
+ for (const rootPath of GnosysResolver.mcpRoots) {
284
+ const candidate = path.join(rootPath, ".gnosys");
285
+ if (await this.isValidStore(candidate)) {
286
+ return candidate;
287
+ }
288
+ }
289
+ // 3. Fallback: walk up from cwd (works when cwd matches the project)
290
+ let dir = path.resolve(process.cwd());
291
+ const root = path.parse(dir).root;
292
+ while (dir !== root) {
293
+ const candidate = path.join(dir, ".gnosys");
294
+ if (await this.isValidStore(candidate)) {
295
+ return candidate;
296
+ }
297
+ dir = path.dirname(dir);
298
+ }
299
+ return null;
300
+ }
301
+ /**
302
+ * Read registered project directories from persistent config.
303
+ */
304
+ async getRegisteredProjects() {
305
+ try {
306
+ const raw = await fs.readFile(this.getRegistryPath(), "utf-8");
307
+ return JSON.parse(raw);
308
+ }
309
+ catch {
310
+ return [];
311
+ }
312
+ }
313
+ /**
314
+ * Path to the persistent project registry file.
315
+ */
316
+ getRegistryPath() {
317
+ const home = process.env.HOME || process.env.USERPROFILE || "/tmp";
318
+ return path.join(home, ".config", "gnosys", "projects.json");
319
+ }
320
+ /**
321
+ * Detect all available stores from all sources (registered, MCP roots, cwd, env vars).
322
+ * Returns a flat list for debugging. Does NOT modify the active stores.
323
+ */
324
+ async detectAllStores() {
325
+ const results = [];
326
+ const activePaths = new Set(this.stores.map((s) => s.path));
327
+ // Registered projects
328
+ const registered = await this.getRegisteredProjects();
329
+ for (const dir of registered) {
330
+ const storePath = path.join(dir, ".gnosys");
331
+ const has = await this.isValidStore(storePath);
332
+ results.push({ source: "registered", path: dir, hasGnosys: has, isActive: activePaths.has(storePath) });
333
+ }
334
+ // MCP roots
335
+ for (const rootPath of GnosysResolver.mcpRoots) {
336
+ const storePath = path.join(rootPath, ".gnosys");
337
+ const has = await this.isValidStore(storePath);
338
+ // Skip if already listed as registered
339
+ if (!results.some((r) => r.path === rootPath)) {
340
+ results.push({ source: "mcp-root", path: rootPath, hasGnosys: has, isActive: activePaths.has(storePath) });
341
+ }
342
+ }
343
+ // CWD
344
+ const cwd = process.cwd();
345
+ if (!results.some((r) => r.path === cwd)) {
346
+ const cwdStore = path.join(cwd, ".gnosys");
347
+ const has = await this.isValidStore(cwdStore);
348
+ results.push({ source: "cwd", path: cwd, hasGnosys: has, isActive: activePaths.has(cwdStore) });
349
+ }
350
+ // Env vars
351
+ if (process.env.GNOSYS_PERSONAL) {
352
+ results.push({ source: "env:GNOSYS_PERSONAL", path: process.env.GNOSYS_PERSONAL, hasGnosys: true, isActive: activePaths.has(process.env.GNOSYS_PERSONAL) });
353
+ }
354
+ if (process.env.GNOSYS_GLOBAL) {
355
+ results.push({ source: "env:GNOSYS_GLOBAL", path: process.env.GNOSYS_GLOBAL, hasGnosys: true, isActive: activePaths.has(process.env.GNOSYS_GLOBAL) });
356
+ }
357
+ return results;
358
+ }
359
+ /**
360
+ * Check if a path looks like a valid Gnosys store.
361
+ */
362
+ async isValidStore(storePath) {
363
+ try {
364
+ const stat = await fs.stat(storePath);
365
+ return stat.isDirectory();
366
+ }
367
+ catch {
368
+ return false;
369
+ }
370
+ }
371
+ }
372
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/lib/resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Gnosys Retry Logic — Exponential backoff for LLM calls and transient failures.
3
+ */
4
+ export interface RetryOptions {
5
+ /** Max number of retry attempts (default: 3) */
6
+ maxAttempts: number;
7
+ /** Base delay in ms (default: 1000) */
8
+ baseDelayMs: number;
9
+ /** Whether to use exponential backoff (default: true) */
10
+ exponential: boolean;
11
+ /** Optional callback on each retry */
12
+ onRetry?: (attempt: number, error: Error, delayMs: number) => void;
13
+ /** Predicate to decide if error is retryable (default: all errors) */
14
+ isRetryable?: (error: Error) => boolean;
15
+ }
16
+ /**
17
+ * Default retryable-error check: retries on rate limits, timeouts, and transient server errors.
18
+ */
19
+ export declare function isTransientError(error: Error): boolean;
20
+ /**
21
+ * Execute an async function with retry logic.
22
+ */
23
+ export declare function withRetry<T>(fn: () => Promise<T>, options?: Partial<RetryOptions>): Promise<T>;
24
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/lib/retry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,YAAY;IAC3B,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,WAAW,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnE,sEAAsE;IACtE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC;CACzC;AAQD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAWtD;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAC9B,OAAO,CAAC,CAAC,CAAC,CA8BZ"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Gnosys Retry Logic — Exponential backoff for LLM calls and transient failures.
3
+ */
4
+ const DEFAULT_RETRY = {
5
+ maxAttempts: 3,
6
+ baseDelayMs: 1000,
7
+ exponential: true,
8
+ };
9
+ /**
10
+ * Default retryable-error check: retries on rate limits, timeouts, and transient server errors.
11
+ */
12
+ export function isTransientError(error) {
13
+ const msg = error.message.toLowerCase();
14
+ // Rate limit (429)
15
+ if (msg.includes("429") || msg.includes("rate limit") || msg.includes("too many requests"))
16
+ return true;
17
+ // Timeouts
18
+ if (msg.includes("timeout") || msg.includes("timed out") || msg.includes("econnreset"))
19
+ return true;
20
+ // Server errors (5xx)
21
+ if (msg.includes("500") || msg.includes("502") || msg.includes("503") || msg.includes("overloaded"))
22
+ return true;
23
+ // Network errors
24
+ if (msg.includes("enotfound") || msg.includes("econnrefused") || msg.includes("fetch failed"))
25
+ return true;
26
+ return false;
27
+ }
28
+ /**
29
+ * Execute an async function with retry logic.
30
+ */
31
+ export async function withRetry(fn, options) {
32
+ const opts = { ...DEFAULT_RETRY, ...options };
33
+ const isRetryable = opts.isRetryable || isTransientError;
34
+ let lastError;
35
+ for (let attempt = 1; attempt <= opts.maxAttempts + 1; attempt++) {
36
+ try {
37
+ return await fn();
38
+ }
39
+ catch (err) {
40
+ lastError = err instanceof Error ? err : new Error(String(err));
41
+ // Don't retry on non-retryable errors or after last attempt
42
+ if (attempt > opts.maxAttempts || !isRetryable(lastError)) {
43
+ throw lastError;
44
+ }
45
+ // Calculate delay with exponential backoff + jitter
46
+ const expDelay = opts.exponential
47
+ ? opts.baseDelayMs * Math.pow(2, attempt - 1)
48
+ : opts.baseDelayMs;
49
+ const jitter = Math.random() * opts.baseDelayMs * 0.5;
50
+ const delayMs = Math.round(expDelay + jitter);
51
+ opts.onRetry?.(attempt, lastError, delayMs);
52
+ await sleep(delayMs);
53
+ }
54
+ }
55
+ throw lastError || new Error("Retry exhausted");
56
+ }
57
+ function sleep(ms) {
58
+ return new Promise((resolve) => setTimeout(resolve, ms));
59
+ }
60
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/lib/retry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Gnosys Rules Generation — Phase 8b.
3
+ *
4
+ * Generates agent rules content from user preferences and project conventions.
5
+ * Output is injected into agent rules files (CLAUDE.md, .cursor/rules/gnosys.mdc)
6
+ * inside GNOSYS:START / GNOSYS:END blocks. User content outside these blocks
7
+ * is never touched.
8
+ *
9
+ * The generated block contains:
10
+ * 1. Base Gnosys tool instructions (always present)
11
+ * 2. User preferences (from scope='user' category='preferences')
12
+ * 3. Project conventions (from scope='project' for current projectId)
13
+ */
14
+ import { GnosysDB, DbMemory } from "./db.js";
15
+ import { Preference } from "./preferences.js";
16
+ export interface RulesGenResult {
17
+ /** The full file content after injection */
18
+ content: string;
19
+ /** Whether the file was created (true) or updated (false) */
20
+ created: boolean;
21
+ /** The rules file path */
22
+ filePath: string;
23
+ /** Number of preferences injected */
24
+ prefCount: number;
25
+ /** Number of project conventions injected */
26
+ conventionCount: number;
27
+ }
28
+ export type RulesFileFormat = "claude" | "cursor" | "generic";
29
+ /**
30
+ * Generate the full GNOSYS block content from preferences and project conventions.
31
+ */
32
+ export declare function generateRulesBlock(preferences: Preference[], projectConventions: DbMemory[], opts?: {
33
+ format?: RulesFileFormat;
34
+ }): string;
35
+ /**
36
+ * Inject generated rules into a file, preserving content outside GNOSYS blocks.
37
+ * Creates the file if it doesn't exist.
38
+ */
39
+ export declare function injectRules(filePath: string, generatedBlock: string): Promise<{
40
+ created: boolean;
41
+ }>;
42
+ /**
43
+ * Sync rules for a project: reads preferences + project conventions from
44
+ * central DB, generates the rules block, and injects into the agent rules file.
45
+ */
46
+ export declare function syncRules(centralDb: GnosysDB, projectDir: string, agentRulesTarget: string | null, projectId: string | null): Promise<RulesGenResult | null>;
47
+ /**
48
+ * Remove the GNOSYS block from a rules file (cleanup).
49
+ */
50
+ export declare function removeRulesBlock(filePath: string): Promise<boolean>;
51
+ //# sourceMappingURL=rulesGen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rulesGen.d.ts","sourceRoot":"","sources":["../../src/lib/rulesGen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAqB,MAAM,kBAAkB,CAAC;AAWjE,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,OAAO,EAAE,OAAO,CAAC;IACjB,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAwB9D;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,UAAU,EAAE,EACzB,kBAAkB,EAAE,QAAQ,EAAE,EAC9B,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,eAAe,CAAA;CAAE,GAClC,MAAM,CA8BR;AAWD;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAkC/B;AAID;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,SAAS,EAAE,QAAQ,EACnB,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,MAAM,GAAG,IAAI,EAC/B,SAAS,EAAE,MAAM,GAAG,IAAI,GACvB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAmChC;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAqBzE"}