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,85 @@
1
+ /**
2
+ * Gnosys Lensing — Filtered views of the memory store.
3
+ *
4
+ * A lens is a set of filter criteria applied to memories.
5
+ * Compound lenses combine multiple filters with AND/OR logic.
6
+ */
7
+ /**
8
+ * Apply a single lens filter to an array of memories.
9
+ */
10
+ export function applyLens(memories, lens) {
11
+ return memories.filter((m) => matchesLens(m, lens));
12
+ }
13
+ /**
14
+ * Apply a compound lens (multiple filters combined with AND/OR).
15
+ */
16
+ export function applyCompoundLens(memories, compound) {
17
+ if (compound.filters.length === 0)
18
+ return memories;
19
+ if (compound.operator === "AND") {
20
+ // AND: memory must match ALL filters
21
+ return memories.filter((m) => compound.filters.every((f) => matchesLens(m, f)));
22
+ }
23
+ else {
24
+ // OR: memory must match ANY filter
25
+ return memories.filter((m) => compound.filters.some((f) => matchesLens(m, f)));
26
+ }
27
+ }
28
+ /**
29
+ * Check if a single memory matches a lens filter.
30
+ */
31
+ function matchesLens(m, lens) {
32
+ const fm = m.frontmatter;
33
+ // Category filter
34
+ if (lens.category && fm.category !== lens.category)
35
+ return false;
36
+ // Status filter (array — memory must match one of the listed statuses)
37
+ if (lens.status && lens.status.length > 0) {
38
+ if (!lens.status.includes(fm.status))
39
+ return false;
40
+ }
41
+ // Author filter
42
+ if (lens.author && lens.author.length > 0) {
43
+ if (!lens.author.includes(fm.author))
44
+ return false;
45
+ }
46
+ // Authority filter
47
+ if (lens.authority && lens.authority.length > 0) {
48
+ if (!lens.authority.includes(fm.authority))
49
+ return false;
50
+ }
51
+ // Confidence range
52
+ if (lens.minConfidence !== undefined && fm.confidence < lens.minConfidence)
53
+ return false;
54
+ if (lens.maxConfidence !== undefined && fm.confidence > lens.maxConfidence)
55
+ return false;
56
+ // Tag matching
57
+ if (lens.tags && lens.tags.length > 0) {
58
+ const memTags = flattenTags(fm.tags);
59
+ const mode = lens.tagMatchMode ?? "any";
60
+ const matches = lens.tags.filter((t) => memTags.includes(t));
61
+ if (mode === "all" && matches.length !== lens.tags.length)
62
+ return false;
63
+ if (mode === "any" && matches.length === 0)
64
+ return false;
65
+ }
66
+ // Date filters
67
+ if (lens.createdAfter && fm.created < lens.createdAfter)
68
+ return false;
69
+ if (lens.createdBefore && fm.created > lens.createdBefore)
70
+ return false;
71
+ if (lens.modifiedAfter && fm.modified < lens.modifiedAfter)
72
+ return false;
73
+ if (lens.modifiedBefore && fm.modified > lens.modifiedBefore)
74
+ return false;
75
+ return true;
76
+ }
77
+ /**
78
+ * Flatten tags from either format to a simple string array.
79
+ */
80
+ function flattenTags(tags) {
81
+ if (Array.isArray(tags))
82
+ return tags;
83
+ return Object.values(tags).flat();
84
+ }
85
+ //# sourceMappingURL=lensing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lensing.js","sourceRoot":"","sources":["../../src/lib/lensing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Gnosys LLM Abstraction Layer — Provider-agnostic interface for LLM operations.
3
+ * Supports Anthropic (cloud) and Ollama (local). Clean factory pattern enables
4
+ * future providers (Groq, OpenAI, LM Studio) with zero changes to call sites.
5
+ */
6
+ import { GnosysConfig, LLMProviderName } from "./config.js";
7
+ export interface LLMGenerateOptions {
8
+ system?: string;
9
+ maxTokens?: number;
10
+ stream?: boolean;
11
+ }
12
+ export interface LLMStreamCallbacks {
13
+ onToken: (token: string) => void;
14
+ }
15
+ /**
16
+ * Core LLM provider interface. All providers must implement this.
17
+ */
18
+ export interface LLMProvider {
19
+ readonly name: LLMProviderName;
20
+ readonly model: string;
21
+ /**
22
+ * Generate a response from a prompt.
23
+ * Returns the full response text (non-streaming) or streams via callbacks.
24
+ */
25
+ generate(prompt: string, options?: LLMGenerateOptions, streamCallbacks?: LLMStreamCallbacks): Promise<string>;
26
+ /**
27
+ * Test connectivity to the provider.
28
+ * Returns true if reachable, throws with descriptive error if not.
29
+ */
30
+ testConnection(): Promise<boolean>;
31
+ }
32
+ export declare class AnthropicProvider implements LLMProvider {
33
+ readonly name: LLMProviderName;
34
+ readonly model: string;
35
+ private client;
36
+ private config;
37
+ constructor(model: string, apiKey: string, config?: GnosysConfig);
38
+ generate(prompt: string, options?: LLMGenerateOptions, streamCallbacks?: LLMStreamCallbacks): Promise<string>;
39
+ private streamGenerate;
40
+ testConnection(): Promise<boolean>;
41
+ }
42
+ export declare class OllamaProvider implements LLMProvider {
43
+ readonly name: LLMProviderName;
44
+ readonly model: string;
45
+ private baseUrl;
46
+ private config;
47
+ constructor(model: string, baseUrl: string, config?: GnosysConfig);
48
+ generate(prompt: string, options?: LLMGenerateOptions, streamCallbacks?: LLMStreamCallbacks): Promise<string>;
49
+ private readStream;
50
+ testConnection(): Promise<boolean>;
51
+ }
52
+ /**
53
+ * Generic OpenAI-compatible provider. Works with any service that implements
54
+ * the OpenAI /v1/chat/completions API: OpenAI, Groq, LM Studio, etc.
55
+ */
56
+ export declare class OpenAICompatibleProvider implements LLMProvider {
57
+ readonly name: LLMProviderName;
58
+ readonly model: string;
59
+ private baseUrl;
60
+ private apiKey;
61
+ private config;
62
+ constructor(name: LLMProviderName, model: string, baseUrl: string, apiKey: string, config?: GnosysConfig);
63
+ generate(prompt: string, options?: LLMGenerateOptions, streamCallbacks?: LLMStreamCallbacks): Promise<string>;
64
+ private readSSEStream;
65
+ testConnection(): Promise<boolean>;
66
+ }
67
+ /**
68
+ * Create an LLM provider for a specific task.
69
+ * Resolves provider + model from config's taskModels or defaultProvider.
70
+ */
71
+ export declare function getLLMProvider(config: GnosysConfig, task?: "structuring" | "synthesis"): LLMProvider;
72
+ /**
73
+ * Create a specific LLM provider instance.
74
+ */
75
+ export declare function createProvider(provider: LLMProviderName, model: string, config: GnosysConfig): LLMProvider;
76
+ /**
77
+ * Check if an LLM provider is available (has credentials / connectivity).
78
+ * Returns { available: boolean; error?: string }.
79
+ */
80
+ export declare function isProviderAvailable(config: GnosysConfig, provider?: LLMProviderName): {
81
+ available: boolean;
82
+ error?: string;
83
+ };
84
+ //# sourceMappingURL=llm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/lib/llm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,386 @@
1
+ /**
2
+ * Gnosys LLM Abstraction Layer — Provider-agnostic interface for LLM operations.
3
+ * Supports Anthropic (cloud) and Ollama (local). Clean factory pattern enables
4
+ * future providers (Groq, OpenAI, LM Studio) with zero changes to call sites.
5
+ */
6
+ import { DEFAULT_CONFIG, resolveTaskModel, getAnthropicApiKey, getOllamaBaseUrl, getGroqApiKey, getOpenAIApiKey, getOpenAIBaseUrl, getLMStudioBaseUrl, getProviderModel, } from "./config.js";
7
+ import { withRetry, isTransientError } from "./retry.js";
8
+ // ─── Anthropic Provider ──────────────────────────────────────────────────
9
+ export class AnthropicProvider {
10
+ name = "anthropic";
11
+ model;
12
+ client; // Anthropic SDK client
13
+ config;
14
+ constructor(model, apiKey, config) {
15
+ this.model = model;
16
+ this.config = config || DEFAULT_CONFIG;
17
+ // Dynamic import is handled in factory; here we just create the client
18
+ const Anthropic = require("@anthropic-ai/sdk").default || require("@anthropic-ai/sdk");
19
+ this.client = new Anthropic({ apiKey });
20
+ // Prevent apiKey from leaking in stack traces or serialization
21
+ Object.defineProperty(this, "_apiKey", { enumerable: false, value: undefined });
22
+ }
23
+ async generate(prompt, options, streamCallbacks) {
24
+ const maxTokens = options?.maxTokens || 4096;
25
+ if (options?.stream && streamCallbacks?.onToken) {
26
+ return this.streamGenerate(prompt, options, streamCallbacks);
27
+ }
28
+ const response = await withRetry(() => this.client.messages.create({
29
+ model: this.model,
30
+ max_tokens: maxTokens,
31
+ ...(options?.system ? { system: options.system } : {}),
32
+ messages: [{ role: "user", content: prompt }],
33
+ }), {
34
+ maxAttempts: this.config.llmRetryAttempts,
35
+ baseDelayMs: this.config.llmRetryBaseDelayMs,
36
+ isRetryable: isTransientError,
37
+ });
38
+ return response.content[0].type === "text" ? response.content[0].text || "" : "";
39
+ }
40
+ async streamGenerate(prompt, options, streamCallbacks) {
41
+ const maxTokens = options?.maxTokens || 4096;
42
+ const stream = this.client.messages.stream({
43
+ model: this.model,
44
+ max_tokens: maxTokens,
45
+ ...(options?.system ? { system: options.system } : {}),
46
+ messages: [{ role: "user", content: prompt }],
47
+ });
48
+ let fullText = "";
49
+ for await (const event of stream) {
50
+ if (event.type === "content_block_delta" &&
51
+ event.delta.type === "text_delta") {
52
+ const token = event.delta.text;
53
+ fullText += token;
54
+ streamCallbacks.onToken(token);
55
+ }
56
+ }
57
+ return fullText;
58
+ }
59
+ async testConnection() {
60
+ try {
61
+ const response = await this.client.messages.create({
62
+ model: this.model,
63
+ max_tokens: 10,
64
+ messages: [{ role: "user", content: "Say hi" }],
65
+ });
66
+ return response.content.length > 0;
67
+ }
68
+ catch (err) {
69
+ // Sanitize error message to prevent API key leakage
70
+ const msg = err instanceof Error ? err.message : String(err);
71
+ throw new Error(`Anthropic connection failed: ${msg.replace(/sk-ant-[^\s"']+/g, "sk-ant-***")}`);
72
+ }
73
+ }
74
+ }
75
+ // ─── Ollama Provider ─────────────────────────────────────────────────────
76
+ export class OllamaProvider {
77
+ name = "ollama";
78
+ model;
79
+ baseUrl;
80
+ config;
81
+ constructor(model, baseUrl, config) {
82
+ this.model = model;
83
+ this.baseUrl = baseUrl.replace(/\/$/, ""); // Strip trailing slash
84
+ this.config = config || DEFAULT_CONFIG;
85
+ }
86
+ async generate(prompt, options, streamCallbacks) {
87
+ const shouldStream = options?.stream && streamCallbacks?.onToken;
88
+ const body = {
89
+ model: this.model,
90
+ stream: !!shouldStream,
91
+ };
92
+ // Use /api/chat for system prompt support, /api/generate otherwise
93
+ if (options?.system) {
94
+ body.messages = [
95
+ { role: "system", content: options.system },
96
+ { role: "user", content: prompt },
97
+ ];
98
+ }
99
+ else {
100
+ body.messages = [{ role: "user", content: prompt }];
101
+ }
102
+ const url = `${this.baseUrl}/api/chat`;
103
+ const response = await withRetry(() => fetch(url, {
104
+ method: "POST",
105
+ headers: { "Content-Type": "application/json" },
106
+ body: JSON.stringify(body),
107
+ }), {
108
+ maxAttempts: this.config.llmRetryAttempts,
109
+ baseDelayMs: this.config.llmRetryBaseDelayMs,
110
+ isRetryable: isTransientError,
111
+ });
112
+ if (!response.ok) {
113
+ const errorText = await response.text();
114
+ throw new Error(`Ollama request failed (${response.status}): ${errorText}`);
115
+ }
116
+ if (shouldStream && streamCallbacks) {
117
+ return this.readStream(response, streamCallbacks);
118
+ }
119
+ // Non-streaming: Ollama returns one JSON object with the full response
120
+ const data = await response.json();
121
+ return data.message?.content || data.response || "";
122
+ }
123
+ async readStream(response, callbacks) {
124
+ const reader = response.body?.getReader();
125
+ if (!reader)
126
+ throw new Error("No response body for streaming");
127
+ const decoder = new TextDecoder();
128
+ let fullText = "";
129
+ while (true) {
130
+ const { done, value } = await reader.read();
131
+ if (done)
132
+ break;
133
+ const chunk = decoder.decode(value, { stream: true });
134
+ // Ollama streams one JSON object per line
135
+ const lines = chunk.split("\n").filter(Boolean);
136
+ for (const line of lines) {
137
+ try {
138
+ const parsed = JSON.parse(line);
139
+ const token = parsed.message?.content || parsed.response || "";
140
+ if (token) {
141
+ fullText += token;
142
+ callbacks.onToken(token);
143
+ }
144
+ }
145
+ catch {
146
+ // Skip malformed lines
147
+ }
148
+ }
149
+ }
150
+ return fullText;
151
+ }
152
+ async testConnection() {
153
+ try {
154
+ const response = await fetch(`${this.baseUrl}/api/tags`);
155
+ if (!response.ok) {
156
+ throw new Error(`HTTP ${response.status}`);
157
+ }
158
+ const data = await response.json();
159
+ if (!data.models || !Array.isArray(data.models)) {
160
+ throw new Error("Unexpected response format");
161
+ }
162
+ // Check if the configured model is available
163
+ const modelNames = data.models.map((m) => m.name || m.model || "");
164
+ const hasModel = modelNames.some((name) => name === this.model ||
165
+ name.startsWith(`${this.model}:`) ||
166
+ name === `${this.model}:latest`);
167
+ if (!hasModel) {
168
+ const available = modelNames.slice(0, 10).join(", ");
169
+ throw new Error(`Model "${this.model}" not found. Available: ${available || "none"}. Run: ollama pull ${this.model}`);
170
+ }
171
+ return true;
172
+ }
173
+ catch (err) {
174
+ if (err instanceof Error && err.message.includes("Model")) {
175
+ throw err; // Re-throw model-not-found with helpful message
176
+ }
177
+ throw new Error(`Ollama connection failed at ${this.baseUrl}: ${err instanceof Error ? err.message : String(err)}. Is Ollama running?`);
178
+ }
179
+ }
180
+ }
181
+ // ─── OpenAI-Compatible Provider (Groq, OpenAI, LM Studio) ──────────────
182
+ /**
183
+ * Generic OpenAI-compatible provider. Works with any service that implements
184
+ * the OpenAI /v1/chat/completions API: OpenAI, Groq, LM Studio, etc.
185
+ */
186
+ export class OpenAICompatibleProvider {
187
+ name;
188
+ model;
189
+ baseUrl;
190
+ apiKey;
191
+ config;
192
+ constructor(name, model, baseUrl, apiKey, config) {
193
+ this.name = name;
194
+ this.model = model;
195
+ this.baseUrl = baseUrl.replace(/\/$/, "");
196
+ this.apiKey = apiKey;
197
+ this.config = config || DEFAULT_CONFIG;
198
+ }
199
+ async generate(prompt, options, streamCallbacks) {
200
+ const shouldStream = options?.stream && streamCallbacks?.onToken;
201
+ const maxTokens = options?.maxTokens || 4096;
202
+ const messages = [];
203
+ if (options?.system) {
204
+ messages.push({ role: "system", content: options.system });
205
+ }
206
+ messages.push({ role: "user", content: prompt });
207
+ const body = {
208
+ model: this.model,
209
+ messages,
210
+ max_tokens: maxTokens,
211
+ stream: !!shouldStream,
212
+ };
213
+ const response = await withRetry(() => fetch(`${this.baseUrl}/chat/completions`, {
214
+ method: "POST",
215
+ headers: {
216
+ "Content-Type": "application/json",
217
+ ...(this.apiKey ? { Authorization: `Bearer ${this.apiKey}` } : {}),
218
+ },
219
+ body: JSON.stringify(body),
220
+ }), {
221
+ maxAttempts: this.config.llmRetryAttempts,
222
+ baseDelayMs: this.config.llmRetryBaseDelayMs,
223
+ isRetryable: isTransientError,
224
+ });
225
+ if (!response.ok) {
226
+ const errorText = await response.text();
227
+ // Sanitize error text to prevent API key leakage
228
+ const safeText = errorText.replace(/(?:sk-|gsk_|Bearer\s+)[^\s"']+/g, "***");
229
+ throw new Error(`${this.name} request failed (${response.status}): ${safeText}`);
230
+ }
231
+ if (shouldStream && streamCallbacks) {
232
+ return this.readSSEStream(response, streamCallbacks);
233
+ }
234
+ const data = (await response.json());
235
+ return data.choices?.[0]?.message?.content || "";
236
+ }
237
+ async readSSEStream(response, callbacks) {
238
+ const reader = response.body?.getReader();
239
+ if (!reader)
240
+ throw new Error("No response body for streaming");
241
+ const decoder = new TextDecoder();
242
+ let fullText = "";
243
+ while (true) {
244
+ const { done, value } = await reader.read();
245
+ if (done)
246
+ break;
247
+ const chunk = decoder.decode(value, { stream: true });
248
+ const lines = chunk.split("\n").filter((l) => l.startsWith("data: "));
249
+ for (const line of lines) {
250
+ const data = line.slice(6).trim();
251
+ if (data === "[DONE]")
252
+ continue;
253
+ try {
254
+ const parsed = JSON.parse(data);
255
+ const token = parsed.choices?.[0]?.delta?.content || "";
256
+ if (token) {
257
+ fullText += token;
258
+ callbacks.onToken(token);
259
+ }
260
+ }
261
+ catch {
262
+ // Skip malformed SSE lines
263
+ }
264
+ }
265
+ }
266
+ return fullText;
267
+ }
268
+ async testConnection() {
269
+ try {
270
+ const response = await fetch(`${this.baseUrl}/models`, {
271
+ headers: {
272
+ ...(this.apiKey ? { Authorization: `Bearer ${this.apiKey}` } : {}),
273
+ },
274
+ });
275
+ if (!response.ok) {
276
+ throw new Error(`HTTP ${response.status}`);
277
+ }
278
+ return true;
279
+ }
280
+ catch (err) {
281
+ throw new Error(`${this.name} connection failed at ${this.baseUrl}: ${err instanceof Error ? err.message : String(err)}`);
282
+ }
283
+ }
284
+ }
285
+ // ─── Factory ─────────────────────────────────────────────────────────────
286
+ /**
287
+ * Create an LLM provider for a specific task.
288
+ * Resolves provider + model from config's taskModels or defaultProvider.
289
+ */
290
+ export function getLLMProvider(config, task) {
291
+ const resolved = task
292
+ ? resolveTaskModel(config, task)
293
+ : { provider: config.llm.defaultProvider, model: getDefaultModel(config) };
294
+ return createProvider(resolved.provider, resolved.model, config);
295
+ }
296
+ /**
297
+ * Create a specific LLM provider instance.
298
+ */
299
+ export function createProvider(provider, model, config) {
300
+ switch (provider) {
301
+ case "anthropic": {
302
+ const apiKey = getAnthropicApiKey(config);
303
+ if (!apiKey) {
304
+ throw new Error("No Anthropic API key found. Set ANTHROPIC_API_KEY environment variable or add llm.anthropic.apiKey to gnosys.json.");
305
+ }
306
+ return new AnthropicProvider(model, apiKey, config);
307
+ }
308
+ case "ollama": {
309
+ const baseUrl = getOllamaBaseUrl(config);
310
+ return new OllamaProvider(model, baseUrl, config);
311
+ }
312
+ case "groq": {
313
+ const apiKey = getGroqApiKey(config);
314
+ if (!apiKey) {
315
+ throw new Error("No Groq API key found. Set GROQ_API_KEY environment variable or add llm.groq.apiKey to gnosys.json.");
316
+ }
317
+ return new OpenAICompatibleProvider("groq", model, "https://api.groq.com/openai/v1", apiKey, config);
318
+ }
319
+ case "openai": {
320
+ const apiKey = getOpenAIApiKey(config);
321
+ if (!apiKey) {
322
+ throw new Error("No OpenAI API key found. Set OPENAI_API_KEY environment variable or add llm.openai.apiKey to gnosys.json.");
323
+ }
324
+ const baseUrl = getOpenAIBaseUrl(config);
325
+ return new OpenAICompatibleProvider("openai", model, baseUrl, apiKey, config);
326
+ }
327
+ case "lmstudio": {
328
+ const baseUrl = getLMStudioBaseUrl(config);
329
+ return new OpenAICompatibleProvider("lmstudio", model, baseUrl, "", config);
330
+ }
331
+ default:
332
+ throw new Error(`Unsupported LLM provider: "${provider}". Supported: anthropic, ollama, groq, openai, lmstudio.`);
333
+ }
334
+ }
335
+ /**
336
+ * Get the default model for the default provider.
337
+ */
338
+ function getDefaultModel(config) {
339
+ return getProviderModel(config, config.llm.defaultProvider);
340
+ }
341
+ /**
342
+ * Check if an LLM provider is available (has credentials / connectivity).
343
+ * Returns { available: boolean; error?: string }.
344
+ */
345
+ export function isProviderAvailable(config, provider) {
346
+ const target = provider || config.llm.defaultProvider;
347
+ switch (target) {
348
+ case "anthropic": {
349
+ const apiKey = getAnthropicApiKey(config);
350
+ if (!apiKey) {
351
+ return {
352
+ available: false,
353
+ error: "No ANTHROPIC_API_KEY set. Add to environment or gnosys.json.",
354
+ };
355
+ }
356
+ return { available: true };
357
+ }
358
+ case "groq": {
359
+ const apiKey = getGroqApiKey(config);
360
+ if (!apiKey) {
361
+ return {
362
+ available: false,
363
+ error: "No GROQ_API_KEY set. Add to environment or gnosys.json.",
364
+ };
365
+ }
366
+ return { available: true };
367
+ }
368
+ case "openai": {
369
+ const apiKey = getOpenAIApiKey(config);
370
+ if (!apiKey) {
371
+ return {
372
+ available: false,
373
+ error: "No OPENAI_API_KEY set. Add to environment or gnosys.json.",
374
+ };
375
+ }
376
+ return { available: true };
377
+ }
378
+ case "ollama":
379
+ case "lmstudio":
380
+ // Local providers: assume available if configured (network check requires async)
381
+ return { available: true };
382
+ default:
383
+ return { available: false, error: `Unknown provider: ${target}` };
384
+ }
385
+ }
386
+ //# sourceMappingURL=llm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["../../src/lib/llm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Gnosys Lock — File-level locking for concurrent write safety.
3
+ *
4
+ * Prevents multiple agents (or agent + maintenance) from corrupting
5
+ * active markdown files during simultaneous writes. Uses a simple
6
+ * .gnosys/.config/write.lock file with PID tracking.
7
+ *
8
+ * Design: advisory lock with timeout + stale lock detection.
9
+ */
10
+ /**
11
+ * Acquire a write lock for the given store path.
12
+ * Returns a release function that MUST be called when done.
13
+ *
14
+ * Usage:
15
+ * const release = await acquireWriteLock(storePath, "maintain");
16
+ * try {
17
+ * // ... do writes ...
18
+ * } finally {
19
+ * release();
20
+ * }
21
+ */
22
+ export declare function acquireWriteLock(storePath: string, operation?: string): Promise<() => void>;
23
+ /**
24
+ * Enable WAL mode on a better-sqlite3 database instance.
25
+ * WAL (Write-Ahead Logging) allows concurrent reads during writes.
26
+ */
27
+ export declare function enableWAL(db: any): void;
28
+ //# sourceMappingURL=lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../src/lib/lock.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgBH;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,MAAgB,GAC1B,OAAO,CAAC,MAAM,IAAI,CAAC,CA4ErB;AAgCD;;;GAGG;AAEH,wBAAgB,SAAS,CAAC,EAAE,EAAE,GAAG,GAAG,IAAI,CAOvC"}