gauss-ai 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 (232) hide show
  1. package/CHANGELOG.md +489 -0
  2. package/LICENSE +21 -0
  3. package/README.md +269 -0
  4. package/dist/a2a/index.cjs +7 -0
  5. package/dist/a2a/index.cjs.map +1 -0
  6. package/dist/a2a/index.d.cts +30 -0
  7. package/dist/a2a/index.d.ts +30 -0
  8. package/dist/a2a/index.js +7 -0
  9. package/dist/a2a/index.js.map +1 -0
  10. package/dist/agent-UIQDSYCE.js +16 -0
  11. package/dist/agent-UIQDSYCE.js.map +1 -0
  12. package/dist/agent-builder-8W3mBR-N.d.ts +1075 -0
  13. package/dist/agent-builder-GEMYdb1p.d.cts +1075 -0
  14. package/dist/agent-graph-AMQYAWNF.js +1422 -0
  15. package/dist/agent-graph-AMQYAWNF.js.map +1 -0
  16. package/dist/ai-sdk-mcp.adapter-SEN6KHNU.js +124 -0
  17. package/dist/ai-sdk-mcp.adapter-SEN6KHNU.js.map +1 -0
  18. package/dist/browser/index.js +10 -0
  19. package/dist/browser/index.js.map +1 -0
  20. package/dist/bun-runtime.adapter-MQDAJLQM.js +8 -0
  21. package/dist/bun-runtime.adapter-MQDAJLQM.js.map +1 -0
  22. package/dist/bun-runtime.adapter-XKOUXVAK.cjs +8 -0
  23. package/dist/bun-runtime.adapter-XKOUXVAK.cjs.map +1 -0
  24. package/dist/chat-A3XMRPJL.js +129 -0
  25. package/dist/chat-A3XMRPJL.js.map +1 -0
  26. package/dist/chunk-2ZRU47NC.js +91 -0
  27. package/dist/chunk-2ZRU47NC.js.map +1 -0
  28. package/dist/chunk-3LD3JTH4.cjs +18 -0
  29. package/dist/chunk-3LD3JTH4.cjs.map +1 -0
  30. package/dist/chunk-5FE5TG2W.cjs +16 -0
  31. package/dist/chunk-5FE5TG2W.cjs.map +1 -0
  32. package/dist/chunk-6XF673YC.cjs +436 -0
  33. package/dist/chunk-6XF673YC.cjs.map +1 -0
  34. package/dist/chunk-7CKWZJNS.js +230 -0
  35. package/dist/chunk-7CKWZJNS.js.map +1 -0
  36. package/dist/chunk-BI2G665F.js +4588 -0
  37. package/dist/chunk-BI2G665F.js.map +1 -0
  38. package/dist/chunk-C5NLWJS2.js +139 -0
  39. package/dist/chunk-C5NLWJS2.js.map +1 -0
  40. package/dist/chunk-CJZ66SU3.cjs +4321 -0
  41. package/dist/chunk-CJZ66SU3.cjs.map +1 -0
  42. package/dist/chunk-DAMT2CXW.cjs +91 -0
  43. package/dist/chunk-DAMT2CXW.cjs.map +1 -0
  44. package/dist/chunk-E7WG3MO5.js +18 -0
  45. package/dist/chunk-E7WG3MO5.js.map +1 -0
  46. package/dist/chunk-EFDM6R4J.js +99 -0
  47. package/dist/chunk-EFDM6R4J.js.map +1 -0
  48. package/dist/chunk-F7WIPPEO.js +256 -0
  49. package/dist/chunk-F7WIPPEO.js.map +1 -0
  50. package/dist/chunk-FAYDE67N.js +6927 -0
  51. package/dist/chunk-FAYDE67N.js.map +1 -0
  52. package/dist/chunk-GAE2KKCM.js +21 -0
  53. package/dist/chunk-GAE2KKCM.js.map +1 -0
  54. package/dist/chunk-INLNGRXM.cjs +130 -0
  55. package/dist/chunk-INLNGRXM.cjs.map +1 -0
  56. package/dist/chunk-JKXKXB5O.js +130 -0
  57. package/dist/chunk-JKXKXB5O.js.map +1 -0
  58. package/dist/chunk-K6SAETGP.js +375 -0
  59. package/dist/chunk-K6SAETGP.js.map +1 -0
  60. package/dist/chunk-KEASLAYR.js +157 -0
  61. package/dist/chunk-KEASLAYR.js.map +1 -0
  62. package/dist/chunk-KKJVNM6O.js +436 -0
  63. package/dist/chunk-KKJVNM6O.js.map +1 -0
  64. package/dist/chunk-KYIMVRIM.js +16 -0
  65. package/dist/chunk-KYIMVRIM.js.map +1 -0
  66. package/dist/chunk-MB7NXIZD.js +4321 -0
  67. package/dist/chunk-MB7NXIZD.js.map +1 -0
  68. package/dist/chunk-MHHDXPGE.js +209 -0
  69. package/dist/chunk-MHHDXPGE.js.map +1 -0
  70. package/dist/chunk-NE6JJA5W.js +401 -0
  71. package/dist/chunk-NE6JJA5W.js.map +1 -0
  72. package/dist/chunk-PF46XZBF.cjs +6927 -0
  73. package/dist/chunk-PF46XZBF.cjs.map +1 -0
  74. package/dist/chunk-PSJIAGDE.cjs +375 -0
  75. package/dist/chunk-PSJIAGDE.cjs.map +1 -0
  76. package/dist/chunk-PWOQDXNQ.js +16 -0
  77. package/dist/chunk-PWOQDXNQ.js.map +1 -0
  78. package/dist/chunk-QYOMQBBZ.cjs +230 -0
  79. package/dist/chunk-QYOMQBBZ.cjs.map +1 -0
  80. package/dist/chunk-UDFXLC4J.cjs +16 -0
  81. package/dist/chunk-UDFXLC4J.cjs.map +1 -0
  82. package/dist/chunk-UO4NGXRT.cjs +259 -0
  83. package/dist/chunk-UO4NGXRT.cjs.map +1 -0
  84. package/dist/chunk-UPFDFLEW.js +40 -0
  85. package/dist/chunk-UPFDFLEW.js.map +1 -0
  86. package/dist/chunk-V55JSQS7.cjs +16 -0
  87. package/dist/chunk-V55JSQS7.cjs.map +1 -0
  88. package/dist/chunk-VJADHXZL.cjs +16 -0
  89. package/dist/chunk-VJADHXZL.cjs.map +1 -0
  90. package/dist/chunk-VRWD7LCI.js +59 -0
  91. package/dist/chunk-VRWD7LCI.js.map +1 -0
  92. package/dist/chunk-WKKQ443C.js +487 -0
  93. package/dist/chunk-WKKQ443C.js.map +1 -0
  94. package/dist/chunk-X2GHUHAF.js +436 -0
  95. package/dist/chunk-X2GHUHAF.js.map +1 -0
  96. package/dist/chunk-XLGW3XNI.cjs +256 -0
  97. package/dist/chunk-XLGW3XNI.cjs.map +1 -0
  98. package/dist/chunk-ZFJKX4DP.js +16 -0
  99. package/dist/chunk-ZFJKX4DP.js.map +1 -0
  100. package/dist/chunk-ZM2OEWM2.js +259 -0
  101. package/dist/chunk-ZM2OEWM2.js.map +1 -0
  102. package/dist/chunk-ZNAIP2XV.js +16 -0
  103. package/dist/chunk-ZNAIP2XV.js.map +1 -0
  104. package/dist/chunk-ZYFAZYSL.js +42 -0
  105. package/dist/chunk-ZYFAZYSL.js.map +1 -0
  106. package/dist/cli/index.js +421 -0
  107. package/dist/cli/index.js.map +1 -0
  108. package/dist/config-4MHT6TQW.js +153 -0
  109. package/dist/config-4MHT6TQW.js.map +1 -0
  110. package/dist/config-REERQFK4.cjs +153 -0
  111. package/dist/config-REERQFK4.cjs.map +1 -0
  112. package/dist/cost-tracker-JLOU7IZJ.js +7 -0
  113. package/dist/cost-tracker-JLOU7IZJ.js.map +1 -0
  114. package/dist/demo-C52GMSYH.js +188 -0
  115. package/dist/demo-C52GMSYH.js.map +1 -0
  116. package/dist/deno/index.js +306 -0
  117. package/dist/deno/index.js.map +1 -0
  118. package/dist/deno-runtime.adapter-F744HY7K.js +8 -0
  119. package/dist/deno-runtime.adapter-F744HY7K.js.map +1 -0
  120. package/dist/deno-runtime.adapter-RFEVNSCV.cjs +8 -0
  121. package/dist/deno-runtime.adapter-RFEVNSCV.cjs.map +1 -0
  122. package/dist/dev-D7DDVDA4.js +218 -0
  123. package/dist/dev-D7DDVDA4.js.map +1 -0
  124. package/dist/edge/index.js +10 -0
  125. package/dist/edge/index.js.map +1 -0
  126. package/dist/edge-runtime.adapter-UQCW2F7X.js +8 -0
  127. package/dist/edge-runtime.adapter-UQCW2F7X.js.map +1 -0
  128. package/dist/edge-runtime.adapter-YED6F3AY.cjs +8 -0
  129. package/dist/edge-runtime.adapter-YED6F3AY.cjs.map +1 -0
  130. package/dist/graph-MGFAQZ5W.js +50 -0
  131. package/dist/graph-MGFAQZ5W.js.map +1 -0
  132. package/dist/graph-visualization-HBSVQXJK.js +9 -0
  133. package/dist/graph-visualization-HBSVQXJK.js.map +1 -0
  134. package/dist/index-BRgqNnh3.d.cts +982 -0
  135. package/dist/index-CZxpYUxZ.d.ts +982 -0
  136. package/dist/index.cjs +14789 -0
  137. package/dist/index.cjs.map +1 -0
  138. package/dist/index.d.cts +10275 -0
  139. package/dist/index.d.ts +10275 -0
  140. package/dist/index.js +14789 -0
  141. package/dist/index.js.map +1 -0
  142. package/dist/init-CFWXTQ35.js +133 -0
  143. package/dist/init-CFWXTQ35.js.map +1 -0
  144. package/dist/llm-VWO4MC7J.cjs +17 -0
  145. package/dist/llm-VWO4MC7J.cjs.map +1 -0
  146. package/dist/llm-XLXVSPBI.js +17 -0
  147. package/dist/llm-XLXVSPBI.js.map +1 -0
  148. package/dist/logging-WRAK5ZXT.js +33 -0
  149. package/dist/logging-WRAK5ZXT.js.map +1 -0
  150. package/dist/metrics-FAHZVVD4.js +47 -0
  151. package/dist/metrics-FAHZVVD4.js.map +1 -0
  152. package/dist/node/index.cjs +280 -0
  153. package/dist/node/index.cjs.map +1 -0
  154. package/dist/node/index.d.cts +51 -0
  155. package/dist/node/index.d.ts +51 -0
  156. package/dist/node/index.js +280 -0
  157. package/dist/node/index.js.map +1 -0
  158. package/dist/node-runtime.adapter-5L7PJ6W2.js +8 -0
  159. package/dist/node-runtime.adapter-5L7PJ6W2.js.map +1 -0
  160. package/dist/node-runtime.adapter-CCRZVGHB.cjs +8 -0
  161. package/dist/node-runtime.adapter-CCRZVGHB.cjs.map +1 -0
  162. package/dist/persist-usage-WTBTCWEF.js +7 -0
  163. package/dist/persist-usage-WTBTCWEF.js.map +1 -0
  164. package/dist/plugin-RCPBWUUA.js +207 -0
  165. package/dist/plugin-RCPBWUUA.js.map +1 -0
  166. package/dist/plugins/index.cjs +75 -0
  167. package/dist/plugins/index.cjs.map +1 -0
  168. package/dist/plugins/index.d.cts +8 -0
  169. package/dist/plugins/index.d.ts +8 -0
  170. package/dist/plugins/index.js +75 -0
  171. package/dist/plugins/index.js.map +1 -0
  172. package/dist/plugins-L4ING3CX.js +4625 -0
  173. package/dist/plugins-L4ING3CX.js.map +1 -0
  174. package/dist/providers/index.cjs +189 -0
  175. package/dist/providers/index.cjs.map +1 -0
  176. package/dist/providers/index.d.cts +168 -0
  177. package/dist/providers/index.d.ts +168 -0
  178. package/dist/providers/index.js +189 -0
  179. package/dist/providers/index.js.map +1 -0
  180. package/dist/providers-3RNQ5CKZ.js +59 -0
  181. package/dist/providers-3RNQ5CKZ.js.map +1 -0
  182. package/dist/providers-66GPXUGQ.cjs +59 -0
  183. package/dist/providers-66GPXUGQ.cjs.map +1 -0
  184. package/dist/repl-K6QN4I2S.js +678 -0
  185. package/dist/repl-K6QN4I2S.js.map +1 -0
  186. package/dist/rest/index.cjs +17 -0
  187. package/dist/rest/index.cjs.map +1 -0
  188. package/dist/rest/index.d.cts +102 -0
  189. package/dist/rest/index.d.ts +102 -0
  190. package/dist/rest/index.js +17 -0
  191. package/dist/rest/index.js.map +1 -0
  192. package/dist/runtime-deno.js +15 -0
  193. package/dist/runtime-deno.js.map +1 -0
  194. package/dist/runtime-edge.js +15 -0
  195. package/dist/runtime-edge.js.map +1 -0
  196. package/dist/runtime-node.js +15 -0
  197. package/dist/runtime-node.js.map +1 -0
  198. package/dist/scraping/index.cjs +11 -0
  199. package/dist/scraping/index.cjs.map +1 -0
  200. package/dist/scraping/index.d.cts +17 -0
  201. package/dist/scraping/index.d.ts +17 -0
  202. package/dist/scraping/index.js +11 -0
  203. package/dist/scraping/index.js.map +1 -0
  204. package/dist/semantic-scraping.port-CZWUea88.d.cts +54 -0
  205. package/dist/semantic-scraping.port-CZWUea88.d.ts +54 -0
  206. package/dist/server/index.js +166 -0
  207. package/dist/server/index.js.map +1 -0
  208. package/dist/testing/index.cjs +25 -0
  209. package/dist/testing/index.cjs.map +1 -0
  210. package/dist/testing/index.d.cts +63 -0
  211. package/dist/testing/index.d.ts +63 -0
  212. package/dist/testing/index.js +25 -0
  213. package/dist/testing/index.js.map +1 -0
  214. package/dist/token-counter.port-CRgxZZGe.d.ts +334 -0
  215. package/dist/token-counter.port-D7BHMCRR.d.cts +334 -0
  216. package/dist/tools-BZM33OBZ.js +10 -0
  217. package/dist/tools-BZM33OBZ.js.map +1 -0
  218. package/dist/tracing-XA3TEWP4.js +48 -0
  219. package/dist/tracing-XA3TEWP4.js.map +1 -0
  220. package/dist/types-CVsP7gFI.d.cts +235 -0
  221. package/dist/types-CVsP7gFI.d.ts +235 -0
  222. package/dist/virtual-fs.adapter-BBLS-3AY.d.ts +26 -0
  223. package/dist/virtual-fs.adapter-nb0CTYOj.d.cts +26 -0
  224. package/dist/workflow/index.cjs +9 -0
  225. package/dist/workflow/index.cjs.map +1 -0
  226. package/dist/workflow/index.d.cts +62 -0
  227. package/dist/workflow/index.d.ts +62 -0
  228. package/dist/workflow/index.js +9 -0
  229. package/dist/workflow/index.js.map +1 -0
  230. package/dist/workflow.port-BaCttxrw.d.cts +153 -0
  231. package/dist/workflow.port-BaCttxrw.d.ts +153 -0
  232. package/package.json +230 -0
@@ -0,0 +1,209 @@
1
+ // src/cli/config.ts
2
+ import { readFileSync, writeFileSync, existsSync, chmodSync, appendFileSync } from "fs";
3
+ import { join } from "path";
4
+ import { homedir } from "os";
5
+ var CONFIG_FILE = ".gaussrc";
6
+ var MAX_HISTORY_LINES = 1e3;
7
+ function configPath() {
8
+ return join(homedir(), CONFIG_FILE);
9
+ }
10
+ function loadConfig() {
11
+ const path = configPath();
12
+ if (!existsSync(path)) return { keys: {} };
13
+ try {
14
+ const raw = readFileSync(path, "utf-8");
15
+ const parsed = JSON.parse(raw);
16
+ return {
17
+ keys: parsed.keys ?? {},
18
+ defaultProvider: parsed.defaultProvider,
19
+ defaultModel: parsed.defaultModel,
20
+ mcpServers: parsed.mcpServers
21
+ };
22
+ } catch {
23
+ console.error("Warning: ~/.gaussrc is corrupted or unreadable. Using empty config.");
24
+ return { keys: {} };
25
+ }
26
+ }
27
+ function saveConfig(config) {
28
+ const path = configPath();
29
+ writeFileSync(path, JSON.stringify(config, null, 2) + "\n", {
30
+ encoding: "utf-8",
31
+ mode: 384
32
+ });
33
+ chmodSync(path, 384);
34
+ }
35
+ function setKey(provider, apiKey) {
36
+ const config = loadConfig();
37
+ config.keys[provider] = apiKey;
38
+ saveConfig(config);
39
+ }
40
+ function getKey(provider) {
41
+ return loadConfig().keys[provider];
42
+ }
43
+ function deleteKey(provider) {
44
+ const config = loadConfig();
45
+ if (!(provider in config.keys)) return false;
46
+ delete config.keys[provider];
47
+ saveConfig(config);
48
+ return true;
49
+ }
50
+ function listKeys() {
51
+ return loadConfig().keys;
52
+ }
53
+ var ENV_MAP = {
54
+ openai: "OPENAI_API_KEY",
55
+ anthropic: "ANTHROPIC_API_KEY",
56
+ google: "GOOGLE_GENERATIVE_AI_API_KEY",
57
+ groq: "GROQ_API_KEY",
58
+ mistral: "MISTRAL_API_KEY",
59
+ openrouter: "OPENROUTER_API_KEY"
60
+ };
61
+ function envVarName(provider) {
62
+ return ENV_MAP[provider] ?? "";
63
+ }
64
+ function resolveApiKey(provider, cliKey) {
65
+ return cliKey ?? getKey(provider) ?? process.env[ENV_MAP[provider] ?? ""];
66
+ }
67
+ function setDefaultProvider(provider) {
68
+ const config = loadConfig();
69
+ config.defaultProvider = provider;
70
+ saveConfig(config);
71
+ }
72
+ function setDefaultModel(model) {
73
+ const config = loadConfig();
74
+ config.defaultModel = model;
75
+ saveConfig(config);
76
+ }
77
+ function getDefaultProvider() {
78
+ return loadConfig().defaultProvider;
79
+ }
80
+ function getDefaultModelFromConfig() {
81
+ return loadConfig().defaultModel;
82
+ }
83
+ function getMcpServers() {
84
+ return loadConfig().mcpServers ?? [];
85
+ }
86
+ function addMcpServer(config) {
87
+ const cfg = loadConfig();
88
+ cfg.mcpServers = (cfg.mcpServers ?? []).filter((s) => s.id !== config.id);
89
+ cfg.mcpServers.push(config);
90
+ saveConfig(cfg);
91
+ }
92
+ function removeMcpServer(serverId) {
93
+ const cfg = loadConfig();
94
+ const servers = cfg.mcpServers ?? [];
95
+ const filtered = servers.filter((s) => s.id !== serverId);
96
+ if (filtered.length === servers.length) return false;
97
+ cfg.mcpServers = filtered;
98
+ saveConfig(cfg);
99
+ return true;
100
+ }
101
+ var HISTORY_FILE = ".gauss_history";
102
+ function historyPath() {
103
+ return join(homedir(), HISTORY_FILE);
104
+ }
105
+ function loadHistory() {
106
+ const path = historyPath();
107
+ if (!existsSync(path)) return [];
108
+ try {
109
+ const lines = readFileSync(path, "utf-8").split("\n").filter(Boolean);
110
+ if (lines.length > MAX_HISTORY_LINES) {
111
+ const trimmed = lines.slice(-MAX_HISTORY_LINES);
112
+ writeFileSync(path, trimmed.join("\n") + "\n", { encoding: "utf-8", mode: 384 });
113
+ chmodSync(path, 384);
114
+ return trimmed;
115
+ }
116
+ return lines;
117
+ } catch {
118
+ return [];
119
+ }
120
+ }
121
+ var historyPermsFixed = false;
122
+ function appendHistory(line) {
123
+ try {
124
+ const path = historyPath();
125
+ appendFileSync(path, line + "\n", { encoding: "utf-8", mode: 384 });
126
+ if (!historyPermsFixed) {
127
+ chmodSync(path, 384);
128
+ historyPermsFixed = true;
129
+ }
130
+ } catch {
131
+ }
132
+ }
133
+
134
+ // src/cli/providers.ts
135
+ var SUPPORTED_PROVIDERS = [
136
+ "openai",
137
+ "anthropic",
138
+ "google",
139
+ "groq",
140
+ "mistral",
141
+ "openrouter"
142
+ ];
143
+ var DEFAULT_MODELS = {
144
+ openai: "gpt-5.2",
145
+ anthropic: "claude-sonnet-4-20250514",
146
+ google: "gemini-2.5-flash-preview-05-20",
147
+ groq: "llama-3.3-70b-versatile",
148
+ mistral: "mistral-large-latest",
149
+ openrouter: "openai/gpt-5.2"
150
+ };
151
+ function isValidProvider(name) {
152
+ return SUPPORTED_PROVIDERS.includes(name);
153
+ }
154
+ function getDefaultModel(provider) {
155
+ return DEFAULT_MODELS[provider];
156
+ }
157
+ async function createModel(provider, apiKey, modelId) {
158
+ const model = modelId ?? DEFAULT_MODELS[provider];
159
+ switch (provider) {
160
+ case "openai": {
161
+ const { createOpenAI } = await import("@ai-sdk/openai");
162
+ return createOpenAI({ apiKey })(model);
163
+ }
164
+ case "anthropic": {
165
+ const { createAnthropic } = await import("@ai-sdk/anthropic");
166
+ return createAnthropic({ apiKey })(model);
167
+ }
168
+ case "google": {
169
+ const { createGoogleGenerativeAI } = await import("@ai-sdk/google");
170
+ return createGoogleGenerativeAI({ apiKey })(model);
171
+ }
172
+ case "groq": {
173
+ const { createGroq } = await import("@ai-sdk/groq");
174
+ return createGroq({ apiKey })(model);
175
+ }
176
+ case "mistral": {
177
+ const { createMistral } = await import("@ai-sdk/mistral");
178
+ return createMistral({ apiKey })(model);
179
+ }
180
+ case "openrouter": {
181
+ const { createOpenRouter } = await import("@openrouter/ai-sdk-provider");
182
+ return createOpenRouter({ apiKey })(model);
183
+ }
184
+ }
185
+ }
186
+
187
+ export {
188
+ loadConfig,
189
+ setKey,
190
+ deleteKey,
191
+ listKeys,
192
+ ENV_MAP,
193
+ envVarName,
194
+ resolveApiKey,
195
+ setDefaultProvider,
196
+ setDefaultModel,
197
+ getDefaultProvider,
198
+ getDefaultModelFromConfig,
199
+ getMcpServers,
200
+ addMcpServer,
201
+ removeMcpServer,
202
+ loadHistory,
203
+ appendHistory,
204
+ SUPPORTED_PROVIDERS,
205
+ isValidProvider,
206
+ getDefaultModel,
207
+ createModel
208
+ };
209
+ //# sourceMappingURL=chunk-MHHDXPGE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/config.ts","../src/cli/providers.ts"],"sourcesContent":["// =============================================================================\n// CLI Config — .gaussrc file management\n// =============================================================================\n\nimport { readFileSync, writeFileSync, existsSync, unlinkSync, chmodSync, appendFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { McpServerConfig } from \"../ports/mcp.port.js\";\n\nconst CONFIG_FILE = \".gaussrc\";\n\n/** Maximum number of history lines to retain on disk */\nconst MAX_HISTORY_LINES = 1000;\n\nexport interface GaussConfig {\n keys: Record<string, string>;\n defaultProvider?: string;\n defaultModel?: string;\n mcpServers?: McpServerConfig[];\n}\n\nfunction configPath(): string {\n return join(homedir(), CONFIG_FILE);\n}\n\nexport function loadConfig(): GaussConfig {\n const path = configPath();\n if (!existsSync(path)) return { keys: {} };\n try {\n const raw = readFileSync(path, \"utf-8\");\n const parsed = JSON.parse(raw) as Partial<GaussConfig>;\n return {\n keys: parsed.keys ?? {},\n defaultProvider: parsed.defaultProvider,\n defaultModel: parsed.defaultModel,\n mcpServers: parsed.mcpServers,\n };\n } catch {\n console.error(\"Warning: ~/.gaussrc is corrupted or unreadable. Using empty config.\");\n return { keys: {} };\n }\n}\n\nexport function saveConfig(config: GaussConfig): void {\n const path = configPath();\n writeFileSync(path, JSON.stringify(config, null, 2) + \"\\n\", {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n chmodSync(path, 0o600);\n}\n\nexport function setKey(provider: string, apiKey: string): void {\n const config = loadConfig();\n config.keys[provider] = apiKey;\n saveConfig(config);\n}\n\nexport function getKey(provider: string): string | undefined {\n return loadConfig().keys[provider];\n}\n\nexport function deleteKey(provider: string): boolean {\n const config = loadConfig();\n if (!(provider in config.keys)) return false;\n delete config.keys[provider];\n saveConfig(config);\n return true;\n}\n\nexport function listKeys(): Record<string, string> {\n return loadConfig().keys;\n}\n\n// Environment variable fallback mapping\nexport const ENV_MAP: Record<string, string> = {\n openai: \"OPENAI_API_KEY\",\n anthropic: \"ANTHROPIC_API_KEY\",\n google: \"GOOGLE_GENERATIVE_AI_API_KEY\",\n groq: \"GROQ_API_KEY\",\n mistral: \"MISTRAL_API_KEY\",\n openrouter: \"OPENROUTER_API_KEY\",\n};\n\nexport function envVarName(provider: string): string {\n return ENV_MAP[provider] ?? \"\";\n}\n\nexport function resolveApiKey(provider: string, cliKey?: string): string | undefined {\n return cliKey ?? getKey(provider) ?? process.env[ENV_MAP[provider] ?? \"\"];\n}\n\nexport function setDefaultProvider(provider: string): void {\n const config = loadConfig();\n config.defaultProvider = provider;\n saveConfig(config);\n}\n\nexport function setDefaultModel(model: string): void {\n const config = loadConfig();\n config.defaultModel = model;\n saveConfig(config);\n}\n\nexport function getDefaultProvider(): string | undefined {\n return loadConfig().defaultProvider;\n}\n\nexport function getDefaultModelFromConfig(): string | undefined {\n return loadConfig().defaultModel;\n}\n\nexport function getMcpServers(): McpServerConfig[] {\n return loadConfig().mcpServers ?? [];\n}\n\nexport function addMcpServer(config: McpServerConfig): void {\n const cfg = loadConfig();\n cfg.mcpServers = (cfg.mcpServers ?? []).filter((s) => s.id !== config.id);\n cfg.mcpServers.push(config);\n saveConfig(cfg);\n}\n\nexport function removeMcpServer(serverId: string): boolean {\n const cfg = loadConfig();\n const servers = cfg.mcpServers ?? [];\n const filtered = servers.filter((s) => s.id !== serverId);\n if (filtered.length === servers.length) return false;\n cfg.mcpServers = filtered;\n saveConfig(cfg);\n return true;\n}\n\n// =============================================================================\n// Persistent REPL History\n// =============================================================================\n\nconst HISTORY_FILE = \".gauss_history\";\n\nfunction historyPath(): string {\n return join(homedir(), HISTORY_FILE);\n}\n\nexport function loadHistory(): string[] {\n const path = historyPath();\n if (!existsSync(path)) return [];\n try {\n const lines = readFileSync(path, \"utf-8\").split(\"\\n\").filter(Boolean);\n if (lines.length > MAX_HISTORY_LINES) {\n const trimmed = lines.slice(-MAX_HISTORY_LINES);\n writeFileSync(path, trimmed.join(\"\\n\") + \"\\n\", { encoding: \"utf-8\", mode: 0o600 });\n chmodSync(path, 0o600);\n return trimmed;\n }\n return lines;\n } catch {\n return [];\n }\n}\n\nlet historyPermsFixed = false;\n\nexport function appendHistory(line: string): void {\n try {\n const path = historyPath();\n appendFileSync(path, line + \"\\n\", { encoding: \"utf-8\", mode: 0o600 });\n if (!historyPermsFixed) {\n chmodSync(path, 0o600);\n historyPermsFixed = true;\n }\n } catch {\n // Silently fail\n }\n}\n","// =============================================================================\n// CLI Providers — Dynamic provider factory (lazy-loaded peer deps)\n// =============================================================================\n\nimport type { LanguageModel } from \"../core/llm/index.js\";\n\nexport const SUPPORTED_PROVIDERS = [\n \"openai\",\n \"anthropic\",\n \"google\",\n \"groq\",\n \"mistral\",\n \"openrouter\",\n] as const;\n\nexport type ProviderName = (typeof SUPPORTED_PROVIDERS)[number];\n\nconst DEFAULT_MODELS: Record<ProviderName, string> = {\n openai: \"gpt-5.2\",\n anthropic: \"claude-sonnet-4-20250514\",\n google: \"gemini-2.5-flash-preview-05-20\",\n groq: \"llama-3.3-70b-versatile\",\n mistral: \"mistral-large-latest\",\n openrouter: \"openai/gpt-5.2\",\n};\n\nexport function isValidProvider(name: string): name is ProviderName {\n return (SUPPORTED_PROVIDERS as readonly string[]).includes(name);\n}\n\nexport function getDefaultModel(provider: ProviderName): string {\n return DEFAULT_MODELS[provider];\n}\n\nexport async function createModel(\n provider: ProviderName,\n apiKey: string,\n modelId?: string,\n): Promise<LanguageModel> {\n const model = modelId ?? DEFAULT_MODELS[provider];\n\n switch (provider) {\n case \"openai\": {\n const { createOpenAI } = await import(\"@ai-sdk/openai\");\n return createOpenAI({ apiKey })(model);\n }\n case \"anthropic\": {\n const { createAnthropic } = await import(\"@ai-sdk/anthropic\");\n return createAnthropic({ apiKey })(model);\n }\n case \"google\": {\n const { createGoogleGenerativeAI } = await import(\"@ai-sdk/google\");\n return createGoogleGenerativeAI({ apiKey })(model);\n }\n case \"groq\": {\n const { createGroq } = await import(\"@ai-sdk/groq\");\n return createGroq({ apiKey })(model);\n }\n case \"mistral\": {\n const { createMistral } = await import(\"@ai-sdk/mistral\");\n return createMistral({ apiKey })(model);\n }\n case \"openrouter\": {\n const { createOpenRouter } = await import(\"@openrouter/ai-sdk-provider\");\n return createOpenRouter({ apiKey })(model);\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,401 @@
1
+ import {
2
+ globToRegex
3
+ } from "./chunk-UPFDFLEW.js";
4
+
5
+ // src/edge/opfs-fs.adapter.ts
6
+ async function getOpfsRoot() {
7
+ const nav = globalThis.navigator;
8
+ if (!nav?.storage?.getDirectory) {
9
+ throw new Error("OPFS is not available in this environment");
10
+ }
11
+ return nav.storage.getDirectory();
12
+ }
13
+ var OpfsFilesystem = class {
14
+ rootName;
15
+ constructor(options = {}) {
16
+ this.rootName = options.rootName ?? "gauss";
17
+ }
18
+ // ---------------------------------------------------------------------------
19
+ // Private helpers
20
+ // ---------------------------------------------------------------------------
21
+ async getZoneDir(zone) {
22
+ const root = await getOpfsRoot();
23
+ const appDir = await root.getDirectoryHandle(this.rootName, { create: true });
24
+ return appDir.getDirectoryHandle(zone, { create: true });
25
+ }
26
+ async traverseToParent(dir, segments, create) {
27
+ let current = dir;
28
+ for (let i = 0; i < segments.length - 1; i++) {
29
+ current = await current.getDirectoryHandle(segments[i], { create });
30
+ }
31
+ return { parent: current, name: segments[segments.length - 1] };
32
+ }
33
+ parsePath(path) {
34
+ const segments = path.split("/").filter((s) => s !== "" && s !== ".");
35
+ if (segments.length === 0) {
36
+ throw new Error("Path cannot be empty");
37
+ }
38
+ return segments;
39
+ }
40
+ async collectFiles(dir, prefix) {
41
+ const results = [];
42
+ for await (const entry of dir.values()) {
43
+ const entryPath = prefix ? `${prefix}/${entry.name}` : entry.name;
44
+ if (entry.kind === "file") {
45
+ results.push({ path: entryPath, handle: entry });
46
+ } else {
47
+ const children = await this.collectFiles(
48
+ entry,
49
+ entryPath
50
+ );
51
+ results.push(...children);
52
+ }
53
+ }
54
+ return results;
55
+ }
56
+ // ---------------------------------------------------------------------------
57
+ // FilesystemPort implementation
58
+ // ---------------------------------------------------------------------------
59
+ async read(path, zone = "transient") {
60
+ const zoneDir = await this.getZoneDir(zone);
61
+ const segments = this.parsePath(path);
62
+ const { parent, name } = await this.traverseToParent(zoneDir, segments, false);
63
+ const fileHandle = await parent.getFileHandle(name);
64
+ const file = await fileHandle.getFile();
65
+ return file.text();
66
+ }
67
+ async write(path, content, zone = "transient") {
68
+ const zoneDir = await this.getZoneDir(zone);
69
+ const segments = this.parsePath(path);
70
+ const { parent, name } = await this.traverseToParent(zoneDir, segments, true);
71
+ const fileHandle = await parent.getFileHandle(name, { create: true });
72
+ const writable = await fileHandle.createWritable();
73
+ await writable.write(content);
74
+ await writable.close();
75
+ }
76
+ async exists(path, zone = "transient") {
77
+ try {
78
+ const zoneDir = await this.getZoneDir(zone);
79
+ const segments = this.parsePath(path);
80
+ const { parent, name } = await this.traverseToParent(zoneDir, segments, false);
81
+ try {
82
+ await parent.getFileHandle(name);
83
+ return true;
84
+ } catch {
85
+ await parent.getDirectoryHandle(name);
86
+ return true;
87
+ }
88
+ } catch {
89
+ return false;
90
+ }
91
+ }
92
+ async delete(path, zone = "transient") {
93
+ try {
94
+ const zoneDir = await this.getZoneDir(zone);
95
+ const segments = this.parsePath(path);
96
+ const { parent, name } = await this.traverseToParent(zoneDir, segments, false);
97
+ await parent.removeEntry(name, { recursive: true });
98
+ } catch {
99
+ }
100
+ }
101
+ async list(path, options = {}, zone = "transient") {
102
+ const zoneDir = await this.getZoneDir(zone);
103
+ const segments = this.parsePath(path);
104
+ let targetDir = zoneDir;
105
+ for (const seg of segments) {
106
+ targetDir = await targetDir.getDirectoryHandle(seg);
107
+ }
108
+ const maxDepth = options.maxDepth ?? (options.recursive ? Infinity : 1);
109
+ return this.listEntries(targetDir, "", maxDepth, 1, options.includeHidden ?? false);
110
+ }
111
+ async listEntries(dir, prefix, maxDepth, currentDepth, includeHidden) {
112
+ if (currentDepth > maxDepth) return [];
113
+ const results = [];
114
+ for await (const entry of dir.values()) {
115
+ if (!includeHidden && entry.name.startsWith(".")) continue;
116
+ const entryPath = prefix ? `${prefix}/${entry.name}` : entry.name;
117
+ if (entry.kind === "file") {
118
+ const file = await entry.getFile();
119
+ results.push({
120
+ name: entry.name,
121
+ path: entryPath,
122
+ isDirectory: false,
123
+ size: file.size,
124
+ modifiedAt: file.lastModified
125
+ });
126
+ } else {
127
+ results.push({
128
+ name: entry.name,
129
+ path: entryPath,
130
+ isDirectory: true,
131
+ size: 0,
132
+ modifiedAt: Date.now()
133
+ });
134
+ const children = await this.listEntries(
135
+ entry,
136
+ entryPath,
137
+ maxDepth,
138
+ currentDepth + 1,
139
+ includeHidden
140
+ );
141
+ results.push(...children);
142
+ }
143
+ }
144
+ return results;
145
+ }
146
+ async stat(path, zone = "transient") {
147
+ const zoneDir = await this.getZoneDir(zone);
148
+ const segments = this.parsePath(path);
149
+ const { parent, name } = await this.traverseToParent(zoneDir, segments, false);
150
+ try {
151
+ const fileHandle = await parent.getFileHandle(name);
152
+ const file = await fileHandle.getFile();
153
+ return {
154
+ size: file.size,
155
+ isDirectory: false,
156
+ isFile: true,
157
+ createdAt: file.lastModified,
158
+ modifiedAt: file.lastModified
159
+ };
160
+ } catch {
161
+ await parent.getDirectoryHandle(name);
162
+ return {
163
+ size: 0,
164
+ isDirectory: true,
165
+ isFile: false,
166
+ createdAt: Date.now(),
167
+ modifiedAt: Date.now()
168
+ };
169
+ }
170
+ }
171
+ async glob(pattern, zone = "transient") {
172
+ const zoneDir = await this.getZoneDir(zone);
173
+ const allFiles = await this.collectFiles(zoneDir, "");
174
+ const regex = globToRegex(pattern);
175
+ return allFiles.map((f) => f.path).filter((p) => regex.test(p));
176
+ }
177
+ async search(pattern, options = {}, zone = "transient") {
178
+ const zoneDir = await this.getZoneDir(zone);
179
+ const allFiles = await this.collectFiles(zoneDir, "");
180
+ const flags = options.caseSensitive === false ? "gi" : "g";
181
+ const regex = new RegExp(pattern, flags);
182
+ const fileRegex = options.filePattern ? globToRegex(options.filePattern) : null;
183
+ const max = options.maxResults ?? Infinity;
184
+ const results = [];
185
+ for (const { path: filePath, handle } of allFiles) {
186
+ if (fileRegex && !fileRegex.test(filePath)) continue;
187
+ const file = await handle.getFile();
188
+ const content = await file.text();
189
+ const lines = content.split("\n");
190
+ for (let i = 0; i < lines.length && results.length < max; i++) {
191
+ regex.lastIndex = 0;
192
+ const match = regex.exec(lines[i]);
193
+ if (match) {
194
+ results.push({
195
+ filePath,
196
+ lineNumber: i + 1,
197
+ lineContent: lines[i],
198
+ matchStart: match.index,
199
+ matchEnd: match.index + match[0].length
200
+ });
201
+ }
202
+ }
203
+ if (results.length >= max) break;
204
+ }
205
+ return results;
206
+ }
207
+ async syncToPersistent() {
208
+ }
209
+ async clearTransient() {
210
+ const root = await getOpfsRoot();
211
+ const appDir = await root.getDirectoryHandle(this.rootName, { create: true });
212
+ try {
213
+ await appDir.removeEntry("transient", { recursive: true });
214
+ } catch {
215
+ }
216
+ await appDir.getDirectoryHandle("transient", { create: true });
217
+ }
218
+ };
219
+
220
+ // src/edge/indexeddb-memory.adapter.ts
221
+ var DB_VERSION = 1;
222
+ var STORE_TODOS = "todos";
223
+ var STORE_CHECKPOINTS = "checkpoints";
224
+ var STORE_CONVERSATIONS = "conversations";
225
+ var STORE_METADATA = "metadata";
226
+ function getIDB() {
227
+ const idb = globalThis.indexedDB;
228
+ if (!idb) {
229
+ throw new Error("IndexedDB is not available in this environment");
230
+ }
231
+ return idb;
232
+ }
233
+ function idbRequest(request) {
234
+ return new Promise((resolve, reject) => {
235
+ request.onsuccess = () => resolve(request.result);
236
+ request.onerror = () => reject(request.error);
237
+ });
238
+ }
239
+ function idbTransaction(db, stores, mode) {
240
+ return db.transaction(stores, mode);
241
+ }
242
+ var IndexedDbMemoryAdapter = class {
243
+ dbName;
244
+ db = null;
245
+ dbPromise = null;
246
+ constructor(options = {}) {
247
+ this.dbName = options.dbName ?? "gauss-memory";
248
+ }
249
+ // ---------------------------------------------------------------------------
250
+ // DB lifecycle
251
+ // ---------------------------------------------------------------------------
252
+ async getDb() {
253
+ if (this.db) return this.db;
254
+ if (!this.dbPromise) {
255
+ this.dbPromise = this.openDb();
256
+ }
257
+ return this.dbPromise;
258
+ }
259
+ openDb() {
260
+ const idb = getIDB();
261
+ return new Promise((resolve, reject) => {
262
+ const request = idb.open(this.dbName, DB_VERSION);
263
+ request.onupgradeneeded = () => {
264
+ const db = request.result;
265
+ if (!db.objectStoreNames.contains(STORE_TODOS)) {
266
+ db.createObjectStore(STORE_TODOS);
267
+ }
268
+ if (!db.objectStoreNames.contains(STORE_CHECKPOINTS)) {
269
+ db.createObjectStore(STORE_CHECKPOINTS);
270
+ }
271
+ if (!db.objectStoreNames.contains(STORE_CONVERSATIONS)) {
272
+ db.createObjectStore(STORE_CONVERSATIONS);
273
+ }
274
+ if (!db.objectStoreNames.contains(STORE_METADATA)) {
275
+ db.createObjectStore(STORE_METADATA);
276
+ }
277
+ };
278
+ request.onsuccess = () => {
279
+ this.db = request.result;
280
+ resolve(this.db);
281
+ };
282
+ request.onerror = () => {
283
+ this.dbPromise = null;
284
+ reject(request.error);
285
+ };
286
+ });
287
+ }
288
+ // ---------------------------------------------------------------------------
289
+ // Todos
290
+ // ---------------------------------------------------------------------------
291
+ async saveTodos(sessionId, todos) {
292
+ const db = await this.getDb();
293
+ const tx = idbTransaction(db, [STORE_TODOS], "readwrite");
294
+ await idbRequest(tx.objectStore(STORE_TODOS).put(todos, sessionId));
295
+ }
296
+ async loadTodos(sessionId) {
297
+ const db = await this.getDb();
298
+ const tx = idbTransaction(db, [STORE_TODOS], "readonly");
299
+ const result = await idbRequest(tx.objectStore(STORE_TODOS).get(sessionId));
300
+ return result ?? [];
301
+ }
302
+ // ---------------------------------------------------------------------------
303
+ // Checkpoints
304
+ // ---------------------------------------------------------------------------
305
+ async saveCheckpoint(sessionId, checkpoint) {
306
+ const db = await this.getDb();
307
+ const key = `${sessionId}:${checkpoint.id}`;
308
+ const tx = idbTransaction(db, [STORE_CHECKPOINTS], "readwrite");
309
+ await idbRequest(tx.objectStore(STORE_CHECKPOINTS).put(checkpoint, key));
310
+ }
311
+ async loadLatestCheckpoint(sessionId) {
312
+ const checkpoints = await this.listCheckpoints(sessionId);
313
+ if (checkpoints.length === 0) return null;
314
+ return checkpoints[checkpoints.length - 1] ?? null;
315
+ }
316
+ async listCheckpoints(sessionId) {
317
+ const db = await this.getDb();
318
+ const tx = idbTransaction(db, [STORE_CHECKPOINTS], "readonly");
319
+ const store = tx.objectStore(STORE_CHECKPOINTS);
320
+ const allKeys = await idbRequest(store.getAllKeys());
321
+ const prefix = `${sessionId}:`;
322
+ const matchingKeys = allKeys.filter(
323
+ (k) => k.startsWith(prefix)
324
+ );
325
+ const results = [];
326
+ for (const key of matchingKeys) {
327
+ const cp = await idbRequest(store.get(key));
328
+ if (cp) results.push(cp);
329
+ }
330
+ results.sort((a, b) => a.createdAt - b.createdAt);
331
+ return results;
332
+ }
333
+ async deleteOldCheckpoints(sessionId, keepCount) {
334
+ const checkpoints = await this.listCheckpoints(sessionId);
335
+ if (checkpoints.length <= keepCount) return;
336
+ const toDelete = checkpoints.slice(0, checkpoints.length - keepCount);
337
+ const db = await this.getDb();
338
+ const tx = idbTransaction(db, [STORE_CHECKPOINTS], "readwrite");
339
+ const store = tx.objectStore(STORE_CHECKPOINTS);
340
+ for (const cp of toDelete) {
341
+ await idbRequest(store.delete(`${sessionId}:${cp.id}`));
342
+ }
343
+ }
344
+ // ---------------------------------------------------------------------------
345
+ // Conversations
346
+ // ---------------------------------------------------------------------------
347
+ async saveConversation(sessionId, messages) {
348
+ const db = await this.getDb();
349
+ const tx = idbTransaction(db, [STORE_CONVERSATIONS], "readwrite");
350
+ await idbRequest(
351
+ tx.objectStore(STORE_CONVERSATIONS).put(messages, sessionId)
352
+ );
353
+ }
354
+ async loadConversation(sessionId) {
355
+ const db = await this.getDb();
356
+ const tx = idbTransaction(db, [STORE_CONVERSATIONS], "readonly");
357
+ const result = await idbRequest(
358
+ tx.objectStore(STORE_CONVERSATIONS).get(sessionId)
359
+ );
360
+ return result ?? [];
361
+ }
362
+ // ---------------------------------------------------------------------------
363
+ // Metadata
364
+ // ---------------------------------------------------------------------------
365
+ async saveMetadata(sessionId, key, value) {
366
+ const db = await this.getDb();
367
+ const tx = idbTransaction(db, [STORE_METADATA], "readwrite");
368
+ await idbRequest(
369
+ tx.objectStore(STORE_METADATA).put(value, `${sessionId}:${key}`)
370
+ );
371
+ }
372
+ async loadMetadata(sessionId, key) {
373
+ const db = await this.getDb();
374
+ const tx = idbTransaction(db, [STORE_METADATA], "readonly");
375
+ const result = await idbRequest(
376
+ tx.objectStore(STORE_METADATA).get(`${sessionId}:${key}`)
377
+ );
378
+ return result ?? null;
379
+ }
380
+ async deleteMetadata(sessionId, key) {
381
+ const db = await this.getDb();
382
+ const tx = idbTransaction(db, [STORE_METADATA], "readwrite");
383
+ await idbRequest(
384
+ tx.objectStore(STORE_METADATA).delete(`${sessionId}:${key}`)
385
+ );
386
+ }
387
+ // ---------------------------------------------------------------------------
388
+ // Cleanup
389
+ // ---------------------------------------------------------------------------
390
+ close() {
391
+ this.db?.close();
392
+ this.db = null;
393
+ this.dbPromise = null;
394
+ }
395
+ };
396
+
397
+ export {
398
+ OpfsFilesystem,
399
+ IndexedDbMemoryAdapter
400
+ };
401
+ //# sourceMappingURL=chunk-NE6JJA5W.js.map