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,77 @@
1
+ /**
2
+ * Gnosys Ask Engine — Freeform natural-language Q&A over the entire vault.
3
+ * Pipeline: hybridSearch → context assembly → LLM synthesis → cited answer.
4
+ *
5
+ * Supports streaming and "deep query" mode (auto follow-up on insufficient context).
6
+ * Uses the LLM abstraction layer — works with Anthropic, Ollama, or any future provider.
7
+ */
8
+ import { GnosysHybridSearch } from "./hybridSearch.js";
9
+ import { GnosysConfig } from "./config.js";
10
+ import { GnosysResolver } from "./resolver.js";
11
+ export interface AskResult {
12
+ answer: string;
13
+ sources: {
14
+ relativePath: string;
15
+ title: string;
16
+ }[];
17
+ deepQueryUsed: boolean;
18
+ searchMode: string;
19
+ /** Memory IDs that were dearchived (moved from archive → active) during this query */
20
+ dearchivedIds: string[];
21
+ }
22
+ export interface AskStreamCallbacks {
23
+ onToken?: (token: string) => void;
24
+ onSearchComplete?: (count: number, mode: string) => void;
25
+ onDeepQuery?: (refinedQuery: string) => void;
26
+ onSourcesReady?: (sources: {
27
+ relativePath: string;
28
+ title: string;
29
+ }[]) => void;
30
+ }
31
+ export declare class GnosysAsk {
32
+ private provider;
33
+ private hybridSearch;
34
+ private config;
35
+ private promptTemplate;
36
+ private resolver;
37
+ private storePath;
38
+ constructor(hybridSearch: GnosysHybridSearch, config?: GnosysConfig, resolver?: GnosysResolver, storePath?: string);
39
+ get isLLMAvailable(): boolean;
40
+ get providerName(): string;
41
+ get modelName(): string;
42
+ /**
43
+ * Load the synthesis prompt template.
44
+ */
45
+ private loadPromptTemplate;
46
+ /**
47
+ * Format retrieved memories as numbered context blocks.
48
+ */
49
+ private formatContext;
50
+ /**
51
+ * Extract a refined search query from a partial answer that needs more info.
52
+ */
53
+ private extractRefinedQuery;
54
+ /**
55
+ * Ask a question and get a synthesized answer with citations.
56
+ */
57
+ ask(question: string, options?: {
58
+ limit?: number;
59
+ mode?: "keyword" | "semantic" | "hybrid";
60
+ stream?: boolean;
61
+ callbacks?: AskStreamCallbacks;
62
+ /** Additional context to prepend (e.g. from federated search) */
63
+ additionalContext?: string;
64
+ }): Promise<AskResult>;
65
+ /**
66
+ * Dearchive memories that were used in the synthesis.
67
+ * Uses deterministic fallback: if cited paths don't match archive results,
68
+ * falls back to title-matching from the answer text to ensure anything
69
+ * the answer actually references gets dearchived.
70
+ */
71
+ private dearchiveUsedMemories;
72
+ /**
73
+ * Extract sources that were actually cited in the answer.
74
+ */
75
+ private extractCitedSources;
76
+ }
77
+ //# sourceMappingURL=ask.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../../src/lib/ask.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,kBAAkB,EAAsB,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAkB,MAAM,aAAa,CAAC;AAI3D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAM/C,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACnD,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,sFAAsF;IACtF,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,KAAK,IAAI,CAAC;CAC/E;AAgBD,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,SAAS,CAAuB;gBAGtC,YAAY,EAAE,kBAAkB,EAChC,MAAM,CAAC,EAAE,YAAY,EACrB,QAAQ,CAAC,EAAE,cAAc,EACzB,SAAS,CAAC,EAAE,MAAM;IAgBpB,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;OAEG;YACW,kBAAkB;IAiChC;;OAEG;IACH,OAAO,CAAC,aAAa;IASrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;OAEG;IACG,GAAG,CACP,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;QACzC,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,SAAS,CAAC,EAAE,kBAAkB,CAAC;QAC/B,iEAAiE;QACjE,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,GACA,OAAO,CAAC,SAAS,CAAC;IAyIrB;;;;;OAKG;YACW,qBAAqB;IAiEnC;;OAEG;IACH,OAAO,CAAC,mBAAmB;CA2C5B"}
@@ -0,0 +1,316 @@
1
+ /**
2
+ * Gnosys Ask Engine — Freeform natural-language Q&A over the entire vault.
3
+ * Pipeline: hybridSearch → context assembly → LLM synthesis → cited answer.
4
+ *
5
+ * Supports streaming and "deep query" mode (auto follow-up on insufficient context).
6
+ * Uses the LLM abstraction layer — works with Anthropic, Ollama, or any future provider.
7
+ */
8
+ import fs from "fs/promises";
9
+ import path from "path";
10
+ import { fileURLToPath } from "url";
11
+ import { DEFAULT_CONFIG } from "./config.js";
12
+ import { getLLMProvider } from "./llm.js";
13
+ import { GnosysArchive } from "./archive.js";
14
+ import { GnosysMaintenanceEngine } from "./maintenance.js";
15
+ import { auditLog } from "./audit.js";
16
+ const __filename = fileURLToPath(import.meta.url);
17
+ const __dirname = path.dirname(__filename);
18
+ /**
19
+ * Phrases that trigger a deep query follow-up.
20
+ */
21
+ const NEED_MORE_INFO_PHRASES = [
22
+ "i need more information",
23
+ "i don't have enough",
24
+ "insufficient information",
25
+ "not enough context",
26
+ "no relevant information",
27
+ "cannot find",
28
+ "none of the provided memories",
29
+ "the provided context does not",
30
+ ];
31
+ export class GnosysAsk {
32
+ provider = null;
33
+ hybridSearch;
34
+ config;
35
+ promptTemplate = null;
36
+ resolver = null;
37
+ storePath = null;
38
+ constructor(hybridSearch, config, resolver, storePath) {
39
+ this.hybridSearch = hybridSearch;
40
+ this.config = config || DEFAULT_CONFIG;
41
+ this.resolver = resolver || null;
42
+ this.storePath = storePath || null;
43
+ // Initialize LLM provider via abstraction layer
44
+ try {
45
+ this.provider = getLLMProvider(this.config, "synthesis");
46
+ }
47
+ catch {
48
+ // Provider not available (e.g., no API key for Anthropic)
49
+ this.provider = null;
50
+ }
51
+ }
52
+ get isLLMAvailable() {
53
+ return this.provider !== null;
54
+ }
55
+ get providerName() {
56
+ return this.provider?.name || "none";
57
+ }
58
+ get modelName() {
59
+ return this.provider?.model || "none";
60
+ }
61
+ /**
62
+ * Load the synthesis prompt template.
63
+ */
64
+ async loadPromptTemplate() {
65
+ if (this.promptTemplate)
66
+ return this.promptTemplate;
67
+ // Try loading from the installed package prompts/ directory
68
+ const candidates = [
69
+ path.resolve(__dirname, "..", "..", "prompts", "synthesize.md"),
70
+ path.resolve(__dirname, "..", "prompts", "synthesize.md"),
71
+ path.resolve(process.cwd(), "prompts", "synthesize.md"),
72
+ ];
73
+ for (const candidate of candidates) {
74
+ try {
75
+ this.promptTemplate = await fs.readFile(candidate, "utf-8");
76
+ return this.promptTemplate;
77
+ }
78
+ catch {
79
+ // Try next
80
+ }
81
+ }
82
+ // Fallback inline prompt
83
+ this.promptTemplate = `You are Gnosys, a knowledge synthesis engine. Answer the question using ONLY the provided context memories. Cite every claim with Obsidian wikilinks [[filename.md]]. If the context is insufficient, say "I need more information to fully answer this question."
84
+
85
+ ## Context Memories
86
+
87
+ {{CONTEXT}}
88
+
89
+ ## Question
90
+
91
+ {{QUESTION}}`;
92
+ return this.promptTemplate;
93
+ }
94
+ /**
95
+ * Format retrieved memories as numbered context blocks.
96
+ */
97
+ formatContext(results) {
98
+ return results
99
+ .map((r, i) => {
100
+ const content = r.fullContent || r.snippet;
101
+ return `### [${i + 1}] ${r.title}\n**File:** ${r.relativePath}\n**Score:** ${r.score.toFixed(4)}\n\n${content}`;
102
+ })
103
+ .join("\n\n---\n\n");
104
+ }
105
+ /**
106
+ * Extract a refined search query from a partial answer that needs more info.
107
+ */
108
+ extractRefinedQuery(question, _partialAnswer) {
109
+ // Take the original question but add "related" to broaden the search
110
+ return `${question} related details`;
111
+ }
112
+ /**
113
+ * Ask a question and get a synthesized answer with citations.
114
+ */
115
+ async ask(question, options) {
116
+ if (!this.provider) {
117
+ const providerName = this.config.llm.defaultProvider;
118
+ throw new Error(providerName === "anthropic"
119
+ ? "No ANTHROPIC_API_KEY set. gnosys_ask requires an LLM for synthesis. " +
120
+ "Set the ANTHROPIC_API_KEY environment variable or switch to Ollama: gnosys config set provider ollama"
121
+ : `LLM provider "${providerName}" is not available. Check your configuration.`);
122
+ }
123
+ const limit = options?.limit || 15;
124
+ const mode = options?.mode || "hybrid";
125
+ const callbacks = options?.callbacks;
126
+ // Step 1: Hybrid search for relevant memories
127
+ let results = await this.hybridSearch.hybridSearch(question, limit, mode);
128
+ callbacks?.onSearchComplete?.(results.length, mode);
129
+ if (results.length === 0) {
130
+ return {
131
+ answer: "No relevant memories found. Try importing some data first with `gnosys import` or creating memories with `gnosys add`.",
132
+ sources: [],
133
+ deepQueryUsed: false,
134
+ searchMode: mode,
135
+ dearchivedIds: [],
136
+ };
137
+ }
138
+ // Step 2: Load full content for top results
139
+ results = await this.hybridSearch.loadContent(results);
140
+ // Step 3: Build prompt
141
+ const template = await this.loadPromptTemplate();
142
+ let context = this.formatContext(results);
143
+ // Prepend federated/cross-scope context if provided
144
+ if (options?.additionalContext) {
145
+ context = `## Cross-Scope Context (Federated Search)\n${options.additionalContext}\n\n## Local Context\n${context}`;
146
+ }
147
+ const systemPrompt = template
148
+ .replace("{{CONTEXT}}", context)
149
+ .replace("{{QUESTION}}", question);
150
+ // Step 4: LLM synthesis via abstraction layer
151
+ let answer;
152
+ if (options?.stream && callbacks?.onToken) {
153
+ answer = await this.provider.generate(question, { system: systemPrompt, stream: true }, { onToken: callbacks.onToken });
154
+ }
155
+ else {
156
+ answer = await this.provider.generate(question, { system: systemPrompt });
157
+ }
158
+ // Step 5: Check for deep query trigger
159
+ let deepQueryUsed = false;
160
+ const answerLower = answer.toLowerCase();
161
+ const needsMoreInfo = NEED_MORE_INFO_PHRASES.some((phrase) => answerLower.includes(phrase));
162
+ if (needsMoreInfo) {
163
+ const refinedQuery = this.extractRefinedQuery(question, answer);
164
+ callbacks?.onDeepQuery?.(refinedQuery);
165
+ // Run follow-up search
166
+ const moreResults = await this.hybridSearch.hybridSearch(refinedQuery, limit, mode);
167
+ if (moreResults.length > 0) {
168
+ // Merge with original results (dedup by path)
169
+ const existingPaths = new Set(results.map((r) => r.relativePath));
170
+ const newResults = moreResults.filter((r) => !existingPaths.has(r.relativePath));
171
+ if (newResults.length > 0) {
172
+ const enrichedNew = await this.hybridSearch.loadContent(newResults);
173
+ const allResults = [...results, ...enrichedNew];
174
+ // Re-synthesize with expanded context
175
+ const expandedContext = this.formatContext(allResults);
176
+ const expandedPrompt = template
177
+ .replace("{{CONTEXT}}", expandedContext)
178
+ .replace("{{QUESTION}}", question);
179
+ if (options?.stream && callbacks?.onToken) {
180
+ answer = await this.provider.generate(question, { system: expandedPrompt, stream: true }, { onToken: callbacks.onToken });
181
+ }
182
+ else {
183
+ answer = await this.provider.generate(question, {
184
+ system: expandedPrompt,
185
+ });
186
+ }
187
+ results = allResults;
188
+ deepQueryUsed = true;
189
+ }
190
+ }
191
+ }
192
+ // Step 6: Extract sources from the answer (only cited files)
193
+ const sources = this.extractCitedSources(answer, results);
194
+ callbacks?.onSourcesReady?.(sources);
195
+ // Step 7: Auto-dearchive — move used archive memories back to active
196
+ const dearchivedIds = await this.dearchiveUsedMemories(results, sources);
197
+ // Audit log
198
+ auditLog({
199
+ operation: "ask",
200
+ query: question,
201
+ resultCount: sources.length,
202
+ details: {
203
+ deepQueryUsed,
204
+ dearchivedCount: dearchivedIds.length,
205
+ searchMode: mode,
206
+ },
207
+ });
208
+ return {
209
+ answer,
210
+ sources,
211
+ deepQueryUsed,
212
+ searchMode: mode,
213
+ dearchivedIds,
214
+ };
215
+ }
216
+ /**
217
+ * Dearchive memories that were used in the synthesis.
218
+ * Uses deterministic fallback: if cited paths don't match archive results,
219
+ * falls back to title-matching from the answer text to ensure anything
220
+ * the answer actually references gets dearchived.
221
+ */
222
+ async dearchiveUsedMemories(results, sources) {
223
+ if (!this.storePath || !this.resolver)
224
+ return [];
225
+ // Find archive results that were cited (or all archive results if they contributed to the answer)
226
+ const archiveResults = results.filter((r) => r.fromArchive && r.memoryId);
227
+ if (archiveResults.length === 0)
228
+ return [];
229
+ // Determine which archive results were actually used
230
+ const citedPaths = new Set(sources.map((s) => s.relativePath));
231
+ let usedArchiveIds = archiveResults
232
+ .filter((r) => citedPaths.has(r.relativePath))
233
+ .map((r) => r.memoryId)
234
+ .filter(Boolean);
235
+ // Deterministic fallback: if no archive results matched by path,
236
+ // check if any archive memory titles appear in the cited sources' titles
237
+ if (usedArchiveIds.length === 0) {
238
+ const citedTitles = new Set(sources.map((s) => s.title.toLowerCase()));
239
+ usedArchiveIds = archiveResults
240
+ .filter((r) => citedTitles.has(r.title.toLowerCase()))
241
+ .map((r) => r.memoryId)
242
+ .filter(Boolean);
243
+ }
244
+ // Final fallback: dearchive ALL archive results that were in the search context
245
+ // (they contributed to the LLM's answer even if not explicitly cited)
246
+ if (usedArchiveIds.length === 0 && archiveResults.length > 0) {
247
+ usedArchiveIds = archiveResults
248
+ .map((r) => r.memoryId)
249
+ .filter(Boolean);
250
+ }
251
+ if (usedArchiveIds.length === 0)
252
+ return [];
253
+ try {
254
+ const archive = new GnosysArchive(this.storePath);
255
+ if (!archive.isAvailable())
256
+ return [];
257
+ const writeTarget = this.resolver.getWriteTarget();
258
+ if (!writeTarget) {
259
+ archive.close();
260
+ return [];
261
+ }
262
+ const restored = await archive.dearchiveBatch(usedArchiveIds, writeTarget.store);
263
+ archive.close();
264
+ // Reinforce the restored memories
265
+ if (restored.length > 0) {
266
+ try {
267
+ await GnosysMaintenanceEngine.reinforceBatch(writeTarget.store, restored);
268
+ }
269
+ catch {
270
+ // Reinforcement is best-effort
271
+ }
272
+ }
273
+ return usedArchiveIds;
274
+ }
275
+ catch {
276
+ return [];
277
+ }
278
+ }
279
+ /**
280
+ * Extract sources that were actually cited in the answer.
281
+ */
282
+ extractCitedSources(answer, results) {
283
+ const cited = [];
284
+ const seen = new Set();
285
+ // Match [[filename.md]] patterns
286
+ const wikiLinkRegex = /\[\[([^\]]+)\]\]/g;
287
+ let match;
288
+ while ((match = wikiLinkRegex.exec(answer)) !== null) {
289
+ const cited_file = match[1];
290
+ // Find matching result
291
+ for (const r of results) {
292
+ const filename = r.relativePath.split("/").pop() || r.relativePath;
293
+ if ((r.relativePath === cited_file ||
294
+ r.relativePath.endsWith(cited_file) ||
295
+ filename === cited_file ||
296
+ filename === cited_file + ".md") &&
297
+ !seen.has(r.relativePath)) {
298
+ seen.add(r.relativePath);
299
+ cited.push({ relativePath: r.relativePath, title: r.title });
300
+ break;
301
+ }
302
+ }
303
+ }
304
+ // If no wikilinks found in answer, include all search results as sources
305
+ if (cited.length === 0) {
306
+ for (const r of results) {
307
+ if (!seen.has(r.relativePath)) {
308
+ seen.add(r.relativePath);
309
+ cited.push({ relativePath: r.relativePath, title: r.title });
310
+ }
311
+ }
312
+ }
313
+ return cited;
314
+ }
315
+ }
316
+ //# sourceMappingURL=ask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask.js","sourceRoot":"","sources":["../../src/lib/ask.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Gnosys Audit — Structured JSON logging for every memory operation.
3
+ *
4
+ * Provides observability for enterprise agent systems. Every read, write,
5
+ * reinforce, dearchive, and recall operation is logged with timestamps
6
+ * and optional traceIds for correlation with the outer orchestrator.
7
+ *
8
+ * Logs are stored in .gnosys/.config/audit.jsonl (append-only).
9
+ */
10
+ export interface AuditEntry {
11
+ timestamp: string;
12
+ operation: AuditOperation;
13
+ memoryId?: string;
14
+ memoryTitle?: string;
15
+ query?: string;
16
+ resultCount?: number;
17
+ durationMs?: number;
18
+ traceId?: string;
19
+ details?: Record<string, unknown>;
20
+ }
21
+ export type AuditOperation = "read" | "write" | "update" | "delete" | "reinforce" | "dearchive" | "archive" | "maintain" | "search" | "ask" | "recall" | "consolidate" | "decay";
22
+ /**
23
+ * Initialize the audit log for a specific store path.
24
+ * Creates .gnosys/.config/audit.jsonl if it doesn't exist.
25
+ */
26
+ export declare function initAudit(storePath: string): void;
27
+ /**
28
+ * Log an audit entry. Fire-and-forget — never blocks the caller.
29
+ */
30
+ export declare function auditLog(entry: Omit<AuditEntry, "timestamp">): void;
31
+ /**
32
+ * Read audit entries, optionally filtered by days.
33
+ */
34
+ export declare function readAuditLog(storePath: string, options?: {
35
+ days?: number;
36
+ operation?: AuditOperation;
37
+ limit?: number;
38
+ }): AuditEntry[];
39
+ /**
40
+ * Format audit entries as a human-readable timeline.
41
+ */
42
+ export declare function formatAuditTimeline(entries: AuditEntry[]): string;
43
+ /**
44
+ * Close the audit stream cleanly.
45
+ */
46
+ export declare function closeAudit(): void;
47
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/lib/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,cAAc,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,WAAW,GACX,WAAW,GACX,SAAS,GACT,UAAU,GACV,QAAQ,GACR,KAAK,GACL,QAAQ,GACR,aAAa,GACb,OAAO,CAAC;AAOZ;;;GAGG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAcjD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,GACnC,IAAI,CASN;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,cAAc,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACtE,UAAU,EAAE,CAwCd;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CA6CjE;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAKjC"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Gnosys Audit — Structured JSON logging for every memory operation.
3
+ *
4
+ * Provides observability for enterprise agent systems. Every read, write,
5
+ * reinforce, dearchive, and recall operation is logged with timestamps
6
+ * and optional traceIds for correlation with the outer orchestrator.
7
+ *
8
+ * Logs are stored in .gnosys/.config/audit.jsonl (append-only).
9
+ */
10
+ import fs from "fs";
11
+ import path from "path";
12
+ // ─── Module State ───────────────────────────────────────────────────────
13
+ let auditFilePath = null;
14
+ let auditStream = null;
15
+ /**
16
+ * Initialize the audit log for a specific store path.
17
+ * Creates .gnosys/.config/audit.jsonl if it doesn't exist.
18
+ */
19
+ export function initAudit(storePath) {
20
+ const configDir = path.join(storePath, ".config");
21
+ // Ensure .config dir exists (sync — called once at startup)
22
+ try {
23
+ fs.mkdirSync(configDir, { recursive: true });
24
+ }
25
+ catch {
26
+ // Already exists
27
+ }
28
+ auditFilePath = path.join(configDir, "audit.jsonl");
29
+ // Open append-only write stream
30
+ auditStream = fs.createWriteStream(auditFilePath, { flags: "a" });
31
+ }
32
+ /**
33
+ * Log an audit entry. Fire-and-forget — never blocks the caller.
34
+ */
35
+ export function auditLog(entry) {
36
+ const full = {
37
+ timestamp: new Date().toISOString(),
38
+ ...entry,
39
+ };
40
+ if (auditStream && !auditStream.destroyed) {
41
+ auditStream.write(JSON.stringify(full) + "\n");
42
+ }
43
+ }
44
+ /**
45
+ * Read audit entries, optionally filtered by days.
46
+ */
47
+ export function readAuditLog(storePath, options) {
48
+ const logPath = path.join(storePath, ".config", "audit.jsonl");
49
+ let raw;
50
+ try {
51
+ raw = fs.readFileSync(logPath, "utf-8");
52
+ }
53
+ catch {
54
+ return [];
55
+ }
56
+ const lines = raw.trim().split("\n").filter(Boolean);
57
+ let entries = [];
58
+ for (const line of lines) {
59
+ try {
60
+ entries.push(JSON.parse(line));
61
+ }
62
+ catch {
63
+ // Skip malformed lines
64
+ }
65
+ }
66
+ // Filter by days
67
+ if (options?.days) {
68
+ const cutoff = new Date();
69
+ cutoff.setDate(cutoff.getDate() - options.days);
70
+ const cutoffStr = cutoff.toISOString();
71
+ entries = entries.filter((e) => e.timestamp >= cutoffStr);
72
+ }
73
+ // Filter by operation
74
+ if (options?.operation) {
75
+ entries = entries.filter((e) => e.operation === options.operation);
76
+ }
77
+ // Limit (take most recent)
78
+ if (options?.limit) {
79
+ entries = entries.slice(-options.limit);
80
+ }
81
+ return entries;
82
+ }
83
+ /**
84
+ * Format audit entries as a human-readable timeline.
85
+ */
86
+ export function formatAuditTimeline(entries) {
87
+ if (entries.length === 0) {
88
+ return "No audit entries found for the specified period.";
89
+ }
90
+ const lines = [
91
+ `Gnosys Audit Trail — ${entries.length} operations`,
92
+ "═".repeat(60),
93
+ "",
94
+ ];
95
+ // Group by date
96
+ const byDate = new Map();
97
+ for (const entry of entries) {
98
+ const date = entry.timestamp.split("T")[0];
99
+ if (!byDate.has(date))
100
+ byDate.set(date, []);
101
+ byDate.get(date).push(entry);
102
+ }
103
+ for (const [date, dayEntries] of byDate) {
104
+ lines.push(`── ${date} (${dayEntries.length} ops) ──`);
105
+ for (const e of dayEntries) {
106
+ const time = e.timestamp.split("T")[1]?.split(".")[0] || "";
107
+ const duration = e.durationMs ? ` (${e.durationMs.toFixed(1)}ms)` : "";
108
+ const trace = e.traceId ? ` [trace:${e.traceId.substring(0, 8)}]` : "";
109
+ const memory = e.memoryId ? ` → ${e.memoryId}` : "";
110
+ const query = e.query ? ` q="${e.query.substring(0, 30)}"` : "";
111
+ const count = e.resultCount !== undefined ? ` (${e.resultCount} results)` : "";
112
+ lines.push(` ${time} ${e.operation.toUpperCase().padEnd(12)}${memory}${query}${count}${duration}${trace}`);
113
+ }
114
+ lines.push("");
115
+ }
116
+ // Summary
117
+ const opCounts = new Map();
118
+ for (const e of entries) {
119
+ opCounts.set(e.operation, (opCounts.get(e.operation) || 0) + 1);
120
+ }
121
+ lines.push("Summary:");
122
+ for (const [op, count] of [...opCounts.entries()].sort((a, b) => b[1] - a[1])) {
123
+ lines.push(` ${op}: ${count}`);
124
+ }
125
+ return lines.join("\n");
126
+ }
127
+ /**
128
+ * Close the audit stream cleanly.
129
+ */
130
+ export function closeAudit() {
131
+ if (auditStream && !auditStream.destroyed) {
132
+ auditStream.end();
133
+ auditStream = null;
134
+ }
135
+ }
136
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/lib/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Gnosys Bootstrap — Batch-ingest existing documents into the memory store.
3
+ *
4
+ * Scans a directory for markdown/text files and creates memories from them.
5
+ * Supports both raw import (no LLM) and enriched import (LLM structures content).
6
+ */
7
+ import { GnosysStore, MemoryFrontmatter } from "./store.js";
8
+ export interface BootstrapOptions {
9
+ /** Source directory to scan */
10
+ sourceDir: string;
11
+ /** File glob patterns to include */
12
+ patterns?: string[];
13
+ /** Whether to skip files that already exist in the store */
14
+ skipExisting?: boolean;
15
+ /** Default category for ingested files */
16
+ defaultCategory?: string;
17
+ /** Default author */
18
+ defaultAuthor?: "human" | "ai" | "human+ai";
19
+ /** Default authority level */
20
+ defaultAuthority?: "declared" | "observed" | "imported" | "inferred";
21
+ /** Default confidence */
22
+ defaultConfidence?: number;
23
+ /** Whether to preserve existing frontmatter if present */
24
+ preserveFrontmatter?: boolean;
25
+ /** Dry run - report what would be imported without writing */
26
+ dryRun?: boolean;
27
+ }
28
+ export interface BootstrapResult {
29
+ /** Files that were successfully imported */
30
+ imported: string[];
31
+ /** Files that were skipped (already exist) */
32
+ skipped: string[];
33
+ /** Files that failed to import */
34
+ failed: Array<{
35
+ path: string;
36
+ error: string;
37
+ }>;
38
+ /** Total files scanned */
39
+ totalScanned: number;
40
+ }
41
+ /**
42
+ * Scan a directory and discover importable files.
43
+ */
44
+ export declare function discoverFiles(sourceDir: string, patterns?: string[]): Promise<string[]>;
45
+ /**
46
+ * Parse a single file and prepare it for import.
47
+ */
48
+ export declare function parseFileForImport(content: string, relativePath: string, options: BootstrapOptions): {
49
+ frontmatter: Partial<MemoryFrontmatter>;
50
+ body: string;
51
+ };
52
+ /**
53
+ * Bootstrap: batch-import files from a directory into a Gnosys store.
54
+ */
55
+ export declare function bootstrap(store: GnosysStore, options: BootstrapOptions): Promise<BootstrapResult>;
56
+ //# sourceMappingURL=bootstrap.d.ts.map