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 @@
1
+ {"version":3,"sources":["../src/cli/commands/files.ts","../src/cli/commands/bash.ts"],"sourcesContent":["// =============================================================================\n// CLI File Operations — Read, write, and check file existence\n// =============================================================================\n\nimport { readFileSync, writeFileSync, existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nexport function readFile(filePath: string): { content: string; path: string } {\n const absPath = resolve(filePath);\n if (!existsSync(absPath)) throw new Error(`File not found: ${absPath}`);\n return { content: readFileSync(absPath, \"utf-8\"), path: absPath };\n}\n\nexport function writeFile(filePath: string, content: string): string {\n const absPath = resolve(filePath);\n writeFileSync(absPath, content, \"utf-8\");\n return absPath;\n}\n\nexport function fileExists(filePath: string): boolean {\n return existsSync(resolve(filePath));\n}\n","// =============================================================================\n// CLI Bash Execution — Run shell commands with timeout and output capture\n// =============================================================================\n\nimport { execSync } from \"node:child_process\";\n\n/** Default timeout for shell command execution in ms (30 seconds) */\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nexport interface BashResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nexport function runBash(command: string, timeout = DEFAULT_TIMEOUT_MS): BashResult {\n try {\n const stdout = execSync(command, {\n encoding: \"utf-8\",\n timeout,\n maxBuffer: 1024 * 1024,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return { stdout, stderr: \"\", exitCode: 0 };\n } catch (err: unknown) {\n const e = err as { stdout?: string; stderr?: string; status?: number };\n return {\n stdout: e.stdout ?? \"\",\n stderr: e.stderr ?? \"\",\n exitCode: e.status ?? 1,\n };\n }\n}\n"],"mappings":";AAIA,SAAS,cAAc,eAAe,kBAAkB;AACxD,SAAS,eAAe;AAEjB,SAAS,SAAS,UAAqD;AAC5E,QAAM,UAAU,QAAQ,QAAQ;AAChC,MAAI,CAAC,WAAW,OAAO,EAAG,OAAM,IAAI,MAAM,mBAAmB,OAAO,EAAE;AACtE,SAAO,EAAE,SAAS,aAAa,SAAS,OAAO,GAAG,MAAM,QAAQ;AAClE;AAEO,SAAS,UAAU,UAAkB,SAAyB;AACnE,QAAM,UAAU,QAAQ,QAAQ;AAChC,gBAAc,SAAS,SAAS,OAAO;AACvC,SAAO;AACT;;;ACbA,SAAS,gBAAgB;AAGzB,IAAM,qBAAqB;AAQpB,SAAS,QAAQ,SAAiB,UAAU,oBAAgC;AACjF,MAAI;AACF,UAAM,SAAS,SAAS,SAAS;AAAA,MAC/B,UAAU;AAAA,MACV;AAAA,MACA,WAAW,OAAO;AAAA,MAClB,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC;AACD,WAAO,EAAE,QAAQ,QAAQ,IAAI,UAAU,EAAE;AAAA,EAC3C,SAAS,KAAc;AACrB,UAAM,IAAI;AACV,WAAO;AAAA,MACL,QAAQ,EAAE,UAAU;AAAA,MACpB,QAAQ,EAAE,UAAU;AAAA,MACpB,UAAU,EAAE,UAAU;AAAA,IACxB;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,421 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ SUPPORTED_PROVIDERS,
4
+ createModel,
5
+ deleteKey,
6
+ envVarName,
7
+ getDefaultModelFromConfig,
8
+ getDefaultProvider,
9
+ isValidProvider,
10
+ listKeys,
11
+ loadConfig,
12
+ resolveApiKey,
13
+ setDefaultModel,
14
+ setDefaultProvider,
15
+ setKey
16
+ } from "../chunk-MHHDXPGE.js";
17
+ import {
18
+ bold,
19
+ color,
20
+ maskKey
21
+ } from "../chunk-VRWD7LCI.js";
22
+
23
+ // src/cli/index.ts
24
+ import { parseArgs } from "util";
25
+ var VERSION = "1.2.0";
26
+ var HELP = `
27
+ ${bold("Gauss CLI")} \u2014 AI Agent Framework
28
+
29
+ ${bold("Usage:")}
30
+ gauss "<prompt>" Direct prompt with streaming
31
+ gauss chat [--provider <name>] [...] Interactive REPL
32
+ gauss run "<prompt>" [--provider <name>] Single-shot execution
33
+ gauss config set <provider> <api-key> Save API key
34
+ gauss config set-provider <name> Set default provider
35
+ gauss config set-model <name> Set default model
36
+ gauss config list List API keys
37
+ gauss config show Show full config
38
+ gauss config delete <provider> Delete API key
39
+ gauss usage Show token usage and cost estimate
40
+ gauss demo <type> [--provider <name>] Feature demos
41
+ gauss graph <config.json> [--format] Visualize agent graph
42
+ gauss dev <config.json> [--provider] Hot-reload dev mode
43
+ gauss plugin <subcommand> Plugin management
44
+ gauss init --template <name> [dir] Scaffold a new Gauss project
45
+
46
+ ${bold("Commands:")}
47
+ chat Start interactive REPL chat session
48
+ run Single-shot prompt execution
49
+ config Manage API keys and defaults in ~/.gaussrc
50
+ usage Show token usage and estimated cost
51
+ demo Run feature demos (guardrails, workflow, graph, observability)
52
+ graph Visualize an agent graph from a JSON config file
53
+ dev Hot-reload dev mode with interactive REPL
54
+ plugin Manage plugins (search, install, uninstall, list)
55
+
56
+ ${bold("Options:")}
57
+ --provider AI provider (${SUPPORTED_PROVIDERS.join(", ")})
58
+ --model Model ID override (e.g. gpt-5.2-mini, claude-sonnet-4-20250514)
59
+ --api-key API key (overrides config file and env vars)
60
+ --format Output format for graph command (ascii, mermaid)
61
+ --yolo Skip confirmations for tool execution (bash, file writes)
62
+ --help Show this help
63
+ --version Show version
64
+
65
+ ${bold("Environment Variables:")}
66
+ OPENAI_API_KEY, ANTHROPIC_API_KEY, GOOGLE_GENERATIVE_AI_API_KEY,
67
+ GROQ_API_KEY, MISTRAL_API_KEY, OPENROUTER_API_KEY
68
+
69
+ ${bold("Examples:")}
70
+ gauss "What is the capital of France?"
71
+ gauss chat --provider openai --api-key sk-...
72
+ gauss run "What is the capital of France?" --provider anthropic
73
+ gauss config set openai sk-...
74
+ gauss demo guardrails --provider openai
75
+ gauss graph agent-graph.json --format mermaid
76
+ gauss dev agent-config.json --provider openai
77
+ gauss plugin search "code review"
78
+ gauss plugin install my-plugin
79
+ `;
80
+ async function main() {
81
+ const { values, positionals } = parseArgs({
82
+ allowPositionals: true,
83
+ options: {
84
+ provider: { type: "string", short: "p" },
85
+ model: { type: "string", short: "m" },
86
+ "api-key": { type: "string", short: "k" },
87
+ format: { type: "string", short: "f" },
88
+ help: { type: "boolean", short: "h" },
89
+ version: { type: "boolean", short: "v" },
90
+ yolo: { type: "boolean" }
91
+ },
92
+ strict: false
93
+ });
94
+ if (values.help) {
95
+ console.log(HELP);
96
+ return;
97
+ }
98
+ if (values.version) {
99
+ console.log(`gauss v${VERSION}`);
100
+ return;
101
+ }
102
+ const command = positionals[0];
103
+ if (!command) {
104
+ console.log(HELP);
105
+ return;
106
+ }
107
+ switch (command) {
108
+ case "config":
109
+ return handleConfig(positionals.slice(1));
110
+ case "usage":
111
+ return handleUsage();
112
+ case "chat":
113
+ return handleChat(values);
114
+ case "run":
115
+ return handleRun(
116
+ positionals.slice(1).join(" "),
117
+ values
118
+ );
119
+ case "demo":
120
+ return handleDemo(
121
+ positionals[1],
122
+ values
123
+ );
124
+ case "graph":
125
+ return handleGraph(
126
+ positionals[1],
127
+ values
128
+ );
129
+ case "dev":
130
+ return handleDev(
131
+ positionals[1],
132
+ values
133
+ );
134
+ case "plugin":
135
+ return handlePlugin(positionals.slice(1));
136
+ case "init":
137
+ return (await import("../init-CFWXTQ35.js")).handleInit(positionals.slice(1));
138
+ default:
139
+ return handleRun(
140
+ [command, ...positionals.slice(1)].join(" "),
141
+ values
142
+ );
143
+ }
144
+ }
145
+ function handleConfig(args) {
146
+ const subcommand = args[0];
147
+ switch (subcommand) {
148
+ case "set": {
149
+ const provider = args[1];
150
+ const apiKey = args[2];
151
+ if (!provider || !apiKey) {
152
+ console.error(color("red", "Usage: gauss config set <provider> <api-key>"));
153
+ process.exitCode = 1;
154
+ return;
155
+ }
156
+ if (!isValidProvider(provider)) {
157
+ console.error(color("red", `Unknown provider: ${provider}`));
158
+ console.log(color("dim", `Available: ${SUPPORTED_PROVIDERS.join(", ")}`));
159
+ process.exitCode = 1;
160
+ return;
161
+ }
162
+ setKey(provider, apiKey);
163
+ console.log(color("green", `\u2713 API key saved for ${provider}`));
164
+ break;
165
+ }
166
+ case "list": {
167
+ const keys = listKeys();
168
+ const entries = Object.entries(keys);
169
+ if (entries.length === 0) {
170
+ console.log(color("dim", "No API keys configured. Use: gauss config set <provider> <key>"));
171
+ return;
172
+ }
173
+ console.log(bold("\nConfigured API keys:"));
174
+ for (const [provider, key] of entries) {
175
+ console.log(` ${provider}: ${color("dim", maskKey(key))}`);
176
+ }
177
+ console.log();
178
+ break;
179
+ }
180
+ case "delete": {
181
+ const provider = args[1];
182
+ if (!provider) {
183
+ console.error(color("red", "Usage: gauss config delete <provider>"));
184
+ process.exitCode = 1;
185
+ return;
186
+ }
187
+ if (deleteKey(provider)) {
188
+ console.log(color("green", `\u2713 API key deleted for ${provider}`));
189
+ } else {
190
+ console.log(color("yellow", `No API key found for ${provider}`));
191
+ }
192
+ break;
193
+ }
194
+ case "set-provider": {
195
+ const name = args[1];
196
+ if (!name) {
197
+ console.error(color("red", "Usage: gauss config set-provider <name>"));
198
+ process.exitCode = 1;
199
+ return;
200
+ }
201
+ if (!isValidProvider(name)) {
202
+ console.error(color("red", `Unknown provider: ${name}`));
203
+ console.log(color("dim", `Available: ${SUPPORTED_PROVIDERS.join(", ")}`));
204
+ process.exitCode = 1;
205
+ return;
206
+ }
207
+ setDefaultProvider(name);
208
+ console.log(color("green", `\u2713 Default provider set to ${name}`));
209
+ break;
210
+ }
211
+ case "set-model": {
212
+ const name = args[1];
213
+ if (!name) {
214
+ console.error(color("red", "Usage: gauss config set-model <name>"));
215
+ process.exitCode = 1;
216
+ return;
217
+ }
218
+ setDefaultModel(name);
219
+ console.log(color("green", `\u2713 Default model set to ${name}`));
220
+ break;
221
+ }
222
+ case "show": {
223
+ const config = loadConfig();
224
+ const entries = Object.entries(config.keys);
225
+ console.log(bold("\nConfiguration (~/.gaussrc):"));
226
+ if (entries.length === 0) {
227
+ console.log(color("dim", " No API keys configured."));
228
+ } else {
229
+ console.log(bold(" API Keys:"));
230
+ for (const [provider, key] of entries) {
231
+ console.log(` ${provider}: ${color("dim", maskKey(key))}`);
232
+ }
233
+ }
234
+ console.log(` Default provider: ${config.defaultProvider ?? color("dim", "(not set)")}`);
235
+ console.log(` Default model: ${config.defaultModel ?? color("dim", "(not set)")}`);
236
+ console.log();
237
+ break;
238
+ }
239
+ default:
240
+ console.error(color("red", "Usage: gauss config [set|set-provider|set-model|list|show|delete]"));
241
+ process.exitCode = 1;
242
+ }
243
+ }
244
+ async function handleUsage() {
245
+ const { readFileSync, existsSync } = await import("fs");
246
+ const { homedir } = await import("os");
247
+ const { join } = await import("path");
248
+ const usagePath = join(homedir(), ".gauss", "usage.ndjson");
249
+ if (!existsSync(usagePath)) {
250
+ console.log(color("dim", "No usage data found. Usage is recorded after each CLI session."));
251
+ return;
252
+ }
253
+ let records;
254
+ try {
255
+ const data = readFileSync(usagePath, "utf-8");
256
+ const lines = data.split("\n").filter((l) => l.trim());
257
+ records = lines.map((l) => JSON.parse(l));
258
+ } catch {
259
+ console.error(color("red", "Failed to parse usage data."));
260
+ process.exitCode = 1;
261
+ return;
262
+ }
263
+ if (records.length === 0) {
264
+ console.log(color("dim", "No usage records found."));
265
+ return;
266
+ }
267
+ const byModel = /* @__PURE__ */ new Map();
268
+ let totalInput = 0;
269
+ let totalOutput = 0;
270
+ for (const r of records) {
271
+ totalInput += r.inputTokens;
272
+ totalOutput += r.outputTokens;
273
+ const existing = byModel.get(r.model) ?? { inputTokens: 0, outputTokens: 0 };
274
+ existing.inputTokens += r.inputTokens;
275
+ existing.outputTokens += r.outputTokens;
276
+ byModel.set(r.model, existing);
277
+ }
278
+ const { DefaultCostTrackerAdapter } = await import("../cost-tracker-JLOU7IZJ.js");
279
+ const tracker = new DefaultCostTrackerAdapter({ silent: true });
280
+ for (const r of records) tracker.recordUsage(r);
281
+ const estimate = tracker.getEstimate();
282
+ console.log(bold("\nToken Usage Summary"));
283
+ console.log(` Total input tokens: ${color("cyan", totalInput.toLocaleString())}`);
284
+ console.log(` Total output tokens: ${color("cyan", totalOutput.toLocaleString())}`);
285
+ console.log(` Estimated cost: ${color("green", `$${estimate.totalCost.toFixed(4)}`)}`);
286
+ console.log();
287
+ if (estimate.breakdown.length > 0) {
288
+ console.log(bold(" Breakdown by model:"));
289
+ for (const b of estimate.breakdown) {
290
+ console.log(` ${b.model}: ${b.inputTokens.toLocaleString()} in / ${b.outputTokens.toLocaleString()} out \u2192 ${color("green", `$${b.cost.toFixed(4)}`)}`);
291
+ }
292
+ console.log();
293
+ }
294
+ }
295
+ async function handleChat(opts) {
296
+ const { provider, model, apiKey } = await resolveProviderAndModel(opts);
297
+ const languageModel = await createModel(provider, apiKey, model);
298
+ const { startRepl } = await import("../repl-K6QN4I2S.js");
299
+ await startRepl(languageModel, provider, apiKey, model, !!opts.yolo);
300
+ }
301
+ async function handleRun(prompt, opts) {
302
+ if (!prompt.trim()) {
303
+ console.error(color("red", 'Usage: gauss run "<prompt>" --provider <name>'));
304
+ process.exitCode = 1;
305
+ return;
306
+ }
307
+ const { provider, model, apiKey } = await resolveProviderAndModel(opts);
308
+ const languageModel = await createModel(provider, apiKey, model);
309
+ const { runChat } = await import("../chat-A3XMRPJL.js");
310
+ await runChat(prompt, languageModel, !!opts.yolo);
311
+ }
312
+ var DEMO_TYPES = ["guardrails", "workflow", "graph", "observability"];
313
+ async function handleDemo(demoType, opts) {
314
+ if (!demoType || !DEMO_TYPES.includes(demoType)) {
315
+ console.error(color("red", `Usage: gauss demo <${DEMO_TYPES.join("|")}> --provider <name>`));
316
+ process.exitCode = 1;
317
+ return;
318
+ }
319
+ const { provider, model, apiKey } = await resolveProviderAndModel(opts);
320
+ const languageModel = await createModel(provider, apiKey, model);
321
+ const { demoGuardrails, demoWorkflow, demoGraph, demoObservability } = await import("../demo-C52GMSYH.js");
322
+ switch (demoType) {
323
+ case "guardrails":
324
+ return demoGuardrails(languageModel);
325
+ case "workflow":
326
+ return demoWorkflow(languageModel);
327
+ case "graph":
328
+ return demoGraph(languageModel);
329
+ case "observability":
330
+ return demoObservability(languageModel);
331
+ }
332
+ }
333
+ async function handleGraph(configPath, opts) {
334
+ if (!configPath) {
335
+ console.error(color("red", "Usage: gauss graph <config.json> [--format ascii|mermaid]"));
336
+ process.exitCode = 1;
337
+ return;
338
+ }
339
+ const format = opts.format === "mermaid" ? "mermaid" : "ascii";
340
+ const { graphCommand } = await import("../graph-MGFAQZ5W.js");
341
+ await graphCommand(configPath, format);
342
+ }
343
+ async function handleDev(configPath, opts) {
344
+ if (!configPath) {
345
+ console.error(color("red", "Usage: gauss dev <config.json> [--provider <name>]"));
346
+ process.exitCode = 1;
347
+ return;
348
+ }
349
+ const { provider, apiKey } = await resolveProviderAndModel(opts);
350
+ const { devCommand } = await import("../dev-D7DDVDA4.js");
351
+ await devCommand(configPath, provider, apiKey, (p, k, m) => createModel(p, k, m));
352
+ }
353
+ async function handlePlugin(args) {
354
+ const subcommand = args[0];
355
+ const { pluginSearch, pluginInstall, pluginUninstall, pluginList } = await import("../plugin-RCPBWUUA.js");
356
+ switch (subcommand) {
357
+ case "search": {
358
+ const query = args.slice(1).join(" ");
359
+ if (!query) {
360
+ console.error(color("red", "Usage: gauss plugin search <query>"));
361
+ process.exitCode = 1;
362
+ return;
363
+ }
364
+ return pluginSearch(query);
365
+ }
366
+ case "install": {
367
+ const name = args[1];
368
+ if (!name) {
369
+ console.error(color("red", "Usage: gauss plugin install <name>"));
370
+ process.exitCode = 1;
371
+ return;
372
+ }
373
+ return pluginInstall(name);
374
+ }
375
+ case "uninstall": {
376
+ const name = args[1];
377
+ if (!name) {
378
+ console.error(color("red", "Usage: gauss plugin uninstall <name>"));
379
+ process.exitCode = 1;
380
+ return;
381
+ }
382
+ return pluginUninstall(name);
383
+ }
384
+ case "list":
385
+ return pluginList();
386
+ default:
387
+ console.error(color("red", "Usage: gauss plugin <search|install|uninstall|list>"));
388
+ process.exitCode = 1;
389
+ }
390
+ }
391
+ async function resolveProviderAndModel(opts) {
392
+ const providerName = opts.provider ?? getDefaultProvider() ?? "openai";
393
+ if (!isValidProvider(providerName)) {
394
+ console.error(color("red", `Unknown provider: ${providerName}`));
395
+ console.log(color("dim", `Available: ${SUPPORTED_PROVIDERS.join(", ")}`));
396
+ process.exit(1);
397
+ }
398
+ const apiKey = resolveApiKey(providerName, opts["api-key"]);
399
+ if (!apiKey) {
400
+ console.error(color("red", `No API key for provider "${providerName}".`));
401
+ console.log(color("dim", "Set one with:"));
402
+ console.log(color("dim", ` gauss config set ${providerName} <your-api-key>`));
403
+ console.log(color("dim", ` --api-key <your-api-key>`));
404
+ console.log(color("dim", ` Or set ${envVarName(providerName)} environment variable`));
405
+ process.exit(1);
406
+ }
407
+ const configProvider = getDefaultProvider();
408
+ const configModel = !opts.model && providerName === configProvider ? getDefaultModelFromConfig() : void 0;
409
+ return {
410
+ provider: providerName,
411
+ model: opts.model ?? configModel,
412
+ apiKey
413
+ };
414
+ }
415
+ main().catch((err) => {
416
+ console.error(color("red", `
417
+ \u2717 Fatal error: ${err instanceof Error ? err.message : String(err)}
418
+ `));
419
+ process.exitCode = 1;
420
+ });
421
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/index.ts"],"sourcesContent":["#!/usr/bin/env node\n// =============================================================================\n// Gauss CLI — Main entry point\n// =============================================================================\n\nimport { parseArgs } from \"node:util\";\nimport { setKey, deleteKey, listKeys, resolveApiKey, envVarName, setDefaultProvider, setDefaultModel, getDefaultProvider, getDefaultModelFromConfig, loadConfig } from \"./config.js\";\nimport { createModel, isValidProvider, SUPPORTED_PROVIDERS, getDefaultModel } from \"./providers.js\";\nimport type { ProviderName } from \"./providers.js\";\n// Heavy modules (Agent, plugins, graph) are lazy-loaded inside handlers\nimport { color, bold, maskKey } from \"./format.js\";\n\nconst VERSION = \"1.2.0\";\n\nconst HELP = `\n${bold(\"Gauss CLI\")} — AI Agent Framework\n\n${bold(\"Usage:\")}\n gauss \"<prompt>\" Direct prompt with streaming\n gauss chat [--provider <name>] [...] Interactive REPL\n gauss run \"<prompt>\" [--provider <name>] Single-shot execution\n gauss config set <provider> <api-key> Save API key\n gauss config set-provider <name> Set default provider\n gauss config set-model <name> Set default model\n gauss config list List API keys\n gauss config show Show full config\n gauss config delete <provider> Delete API key\n gauss usage Show token usage and cost estimate\n gauss demo <type> [--provider <name>] Feature demos\n gauss graph <config.json> [--format] Visualize agent graph\n gauss dev <config.json> [--provider] Hot-reload dev mode\n gauss plugin <subcommand> Plugin management\n gauss init --template <name> [dir] Scaffold a new Gauss project\n\n${bold(\"Commands:\")}\n chat Start interactive REPL chat session\n run Single-shot prompt execution\n config Manage API keys and defaults in ~/.gaussrc\n usage Show token usage and estimated cost\n demo Run feature demos (guardrails, workflow, graph, observability)\n graph Visualize an agent graph from a JSON config file\n dev Hot-reload dev mode with interactive REPL\n plugin Manage plugins (search, install, uninstall, list)\n\n${bold(\"Options:\")}\n --provider AI provider (${SUPPORTED_PROVIDERS.join(\", \")})\n --model Model ID override (e.g. gpt-5.2-mini, claude-sonnet-4-20250514)\n --api-key API key (overrides config file and env vars)\n --format Output format for graph command (ascii, mermaid)\n --yolo Skip confirmations for tool execution (bash, file writes)\n --help Show this help\n --version Show version\n\n${bold(\"Environment Variables:\")}\n OPENAI_API_KEY, ANTHROPIC_API_KEY, GOOGLE_GENERATIVE_AI_API_KEY,\n GROQ_API_KEY, MISTRAL_API_KEY, OPENROUTER_API_KEY\n\n${bold(\"Examples:\")}\n gauss \"What is the capital of France?\"\n gauss chat --provider openai --api-key sk-...\n gauss run \"What is the capital of France?\" --provider anthropic\n gauss config set openai sk-...\n gauss demo guardrails --provider openai\n gauss graph agent-graph.json --format mermaid\n gauss dev agent-config.json --provider openai\n gauss plugin search \"code review\"\n gauss plugin install my-plugin\n`;\n\nasync function main(): Promise<void> {\n const { values, positionals } = parseArgs({\n allowPositionals: true,\n options: {\n provider: { type: \"string\", short: \"p\" },\n model: { type: \"string\", short: \"m\" },\n \"api-key\": { type: \"string\", short: \"k\" },\n format: { type: \"string\", short: \"f\" },\n help: { type: \"boolean\", short: \"h\" },\n version: { type: \"boolean\", short: \"v\" },\n yolo: { type: \"boolean\" },\n },\n strict: false,\n });\n\n if (values.help) {\n console.log(HELP);\n return;\n }\n\n if (values.version) {\n console.log(`gauss v${VERSION}`);\n return;\n }\n\n const command = positionals[0];\n\n if (!command) {\n console.log(HELP);\n return;\n }\n\n switch (command) {\n case \"config\":\n return handleConfig(positionals.slice(1));\n\n case \"usage\":\n return handleUsage();\n\n case \"chat\":\n return handleChat(values as Record<string, string | boolean | undefined>);\n\n case \"run\":\n return handleRun(\n positionals.slice(1).join(\" \"),\n values as Record<string, string | boolean | undefined>,\n );\n\n case \"demo\":\n return handleDemo(\n positionals[1],\n values as Record<string, string | undefined>,\n );\n\n case \"graph\":\n return handleGraph(\n positionals[1],\n values as Record<string, string | boolean | undefined>,\n );\n\n case \"dev\":\n return handleDev(\n positionals[1],\n values as Record<string, string | boolean | undefined>,\n );\n\n case \"plugin\":\n return handlePlugin(positionals.slice(1));\n\n case \"init\":\n return (await import(\"./init.js\")).handleInit(positionals.slice(1));\n\n default:\n // Treat unknown command as a direct prompt (like claude code / opencode)\n return handleRun(\n [command, ...positionals.slice(1)].join(\" \"),\n values as Record<string, string | boolean | undefined>,\n );\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Config\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction handleConfig(args: string[]): void {\n const subcommand = args[0];\n\n switch (subcommand) {\n case \"set\": {\n const provider = args[1];\n const apiKey = args[2];\n if (!provider || !apiKey) {\n console.error(color(\"red\", \"Usage: gauss config set <provider> <api-key>\"));\n process.exitCode = 1;\n return;\n }\n if (!isValidProvider(provider)) {\n console.error(color(\"red\", `Unknown provider: ${provider}`));\n console.log(color(\"dim\", `Available: ${SUPPORTED_PROVIDERS.join(\", \")}`));\n process.exitCode = 1;\n return;\n }\n setKey(provider, apiKey);\n console.log(color(\"green\", `✓ API key saved for ${provider}`));\n break;\n }\n\n case \"list\": {\n const keys = listKeys();\n const entries = Object.entries(keys);\n if (entries.length === 0) {\n console.log(color(\"dim\", \"No API keys configured. Use: gauss config set <provider> <key>\"));\n return;\n }\n console.log(bold(\"\\nConfigured API keys:\"));\n for (const [provider, key] of entries) {\n console.log(` ${provider}: ${color(\"dim\", maskKey(key))}`);\n }\n console.log();\n break;\n }\n\n case \"delete\": {\n const provider = args[1];\n if (!provider) {\n console.error(color(\"red\", \"Usage: gauss config delete <provider>\"));\n process.exitCode = 1;\n return;\n }\n if (deleteKey(provider)) {\n console.log(color(\"green\", `✓ API key deleted for ${provider}`));\n } else {\n console.log(color(\"yellow\", `No API key found for ${provider}`));\n }\n break;\n }\n\n case \"set-provider\": {\n const name = args[1];\n if (!name) {\n console.error(color(\"red\", \"Usage: gauss config set-provider <name>\"));\n process.exitCode = 1;\n return;\n }\n if (!isValidProvider(name)) {\n console.error(color(\"red\", `Unknown provider: ${name}`));\n console.log(color(\"dim\", `Available: ${SUPPORTED_PROVIDERS.join(\", \")}`));\n process.exitCode = 1;\n return;\n }\n setDefaultProvider(name);\n console.log(color(\"green\", `✓ Default provider set to ${name}`));\n break;\n }\n\n case \"set-model\": {\n const name = args[1];\n if (!name) {\n console.error(color(\"red\", \"Usage: gauss config set-model <name>\"));\n process.exitCode = 1;\n return;\n }\n setDefaultModel(name);\n console.log(color(\"green\", `✓ Default model set to ${name}`));\n break;\n }\n\n case \"show\": {\n const config = loadConfig();\n const entries = Object.entries(config.keys);\n console.log(bold(\"\\nConfiguration (~/.gaussrc):\"));\n if (entries.length === 0) {\n console.log(color(\"dim\", \" No API keys configured.\"));\n } else {\n console.log(bold(\" API Keys:\"));\n for (const [provider, key] of entries) {\n console.log(` ${provider}: ${color(\"dim\", maskKey(key))}`);\n }\n }\n console.log(` Default provider: ${config.defaultProvider ?? color(\"dim\", \"(not set)\")}`);\n console.log(` Default model: ${config.defaultModel ?? color(\"dim\", \"(not set)\")}`);\n console.log();\n break;\n }\n\n default:\n console.error(color(\"red\", \"Usage: gauss config [set|set-provider|set-model|list|show|delete]\"));\n process.exitCode = 1;\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Usage\n// ─────────────────────────────────────────────────────────────────────────────\n\nasync function handleUsage(): Promise<void> {\n const { readFileSync, existsSync } = await import(\"node:fs\");\n const { homedir } = await import(\"node:os\");\n const { join } = await import(\"node:path\");\n\n const usagePath = join(homedir(), \".gauss\", \"usage.ndjson\");\n\n if (!existsSync(usagePath)) {\n console.log(color(\"dim\", \"No usage data found. Usage is recorded after each CLI session.\"));\n return;\n }\n\n let records: Array<{ inputTokens: number; outputTokens: number; model: string; provider: string; timestamp: number }>;\n try {\n const data = readFileSync(usagePath, \"utf-8\");\n const lines = data.split('\\n').filter(l => l.trim());\n records = lines.map(l => JSON.parse(l));\n } catch {\n console.error(color(\"red\", \"Failed to parse usage data.\"));\n process.exitCode = 1;\n return;\n }\n\n if (records.length === 0) {\n console.log(color(\"dim\", \"No usage records found.\"));\n return;\n }\n\n // Aggregate by model\n const byModel = new Map<string, { inputTokens: number; outputTokens: number }>();\n let totalInput = 0;\n let totalOutput = 0;\n\n for (const r of records) {\n totalInput += r.inputTokens;\n totalOutput += r.outputTokens;\n const existing = byModel.get(r.model) ?? { inputTokens: 0, outputTokens: 0 };\n existing.inputTokens += r.inputTokens;\n existing.outputTokens += r.outputTokens;\n byModel.set(r.model, existing);\n }\n\n const { DefaultCostTrackerAdapter } = await import(\"../adapters/cost-tracker/index.js\");\n const tracker = new DefaultCostTrackerAdapter({ silent: true });\n for (const r of records) tracker.recordUsage(r);\n const estimate = tracker.getEstimate();\n\n console.log(bold(\"\\nToken Usage Summary\"));\n console.log(` Total input tokens: ${color(\"cyan\", totalInput.toLocaleString())}`);\n console.log(` Total output tokens: ${color(\"cyan\", totalOutput.toLocaleString())}`);\n console.log(` Estimated cost: ${color(\"green\", `$${estimate.totalCost.toFixed(4)}`)}`);\n console.log();\n\n if (estimate.breakdown.length > 0) {\n console.log(bold(\" Breakdown by model:\"));\n for (const b of estimate.breakdown) {\n console.log(` ${b.model}: ${b.inputTokens.toLocaleString()} in / ${b.outputTokens.toLocaleString()} out → ${color(\"green\", `$${b.cost.toFixed(4)}`)}`);\n }\n console.log();\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Chat (REPL)\n// ─────────────────────────────────────────────────────────────────────────────\n\nasync function handleChat(opts: Record<string, string | boolean | undefined>): Promise<void> {\n const { provider, model, apiKey } = await resolveProviderAndModel(opts as Record<string, string | undefined>);\n const languageModel = await createModel(provider, apiKey, model);\n const { startRepl } = await import(\"./repl.js\");\n await startRepl(languageModel, provider, apiKey, model, !!opts.yolo);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Run (single-shot)\n// ─────────────────────────────────────────────────────────────────────────────\n\nasync function handleRun(\n prompt: string,\n opts: Record<string, string | boolean | undefined>,\n): Promise<void> {\n if (!prompt.trim()) {\n console.error(color(\"red\", 'Usage: gauss run \"<prompt>\" --provider <name>'));\n process.exitCode = 1;\n return;\n }\n const { provider, model, apiKey } = await resolveProviderAndModel(opts as Record<string, string | undefined>);\n const languageModel = await createModel(provider, apiKey, model);\n const { runChat } = await import(\"./commands/chat.js\");\n await runChat(prompt, languageModel, !!opts.yolo);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Demo\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst DEMO_TYPES = [\"guardrails\", \"workflow\", \"graph\", \"observability\"] as const;\n\nasync function handleDemo(\n demoType: string | undefined,\n opts: Record<string, string | undefined>,\n): Promise<void> {\n if (!demoType || !(DEMO_TYPES as readonly string[]).includes(demoType)) {\n console.error(color(\"red\", `Usage: gauss demo <${DEMO_TYPES.join(\"|\")}> --provider <name>`));\n process.exitCode = 1;\n return;\n }\n const { provider, model, apiKey } = await resolveProviderAndModel(opts);\n const languageModel = await createModel(provider, apiKey, model);\n const { demoGuardrails, demoWorkflow, demoGraph, demoObservability } = await import(\"./commands/demo.js\");\n\n switch (demoType) {\n case \"guardrails\":\n return demoGuardrails(languageModel);\n case \"workflow\":\n return demoWorkflow(languageModel);\n case \"graph\":\n return demoGraph(languageModel);\n case \"observability\":\n return demoObservability(languageModel);\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Graph\n// ─────────────────────────────────────────────────────────────────────────────\n\nasync function handleGraph(\n configPath: string | undefined,\n opts: Record<string, string | boolean | undefined>,\n): Promise<void> {\n if (!configPath) {\n console.error(color(\"red\", \"Usage: gauss graph <config.json> [--format ascii|mermaid]\"));\n process.exitCode = 1;\n return;\n }\n const format = (opts.format === \"mermaid\" ? \"mermaid\" : \"ascii\") as \"ascii\" | \"mermaid\";\n const { graphCommand } = await import(\"./commands/graph.js\");\n await graphCommand(configPath, format);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Dev\n// ─────────────────────────────────────────────────────────────────────────────\n\nasync function handleDev(\n configPath: string | undefined,\n opts: Record<string, string | boolean | undefined>,\n): Promise<void> {\n if (!configPath) {\n console.error(color(\"red\", \"Usage: gauss dev <config.json> [--provider <name>]\"));\n process.exitCode = 1;\n return;\n }\n const { provider, apiKey } = await resolveProviderAndModel(opts as Record<string, string | undefined>);\n const { devCommand } = await import(\"./commands/dev.js\");\n await devCommand(configPath, provider, apiKey, (p, k, m) => createModel(p as ProviderName, k, m));\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Plugin\n// ─────────────────────────────────────────────────────────────────────────────\n\nasync function handlePlugin(args: string[]): Promise<void> {\n const subcommand = args[0];\n const { pluginSearch, pluginInstall, pluginUninstall, pluginList } = await import(\"./commands/plugin.js\");\n\n switch (subcommand) {\n case \"search\": {\n const query = args.slice(1).join(\" \");\n if (!query) {\n console.error(color(\"red\", \"Usage: gauss plugin search <query>\"));\n process.exitCode = 1;\n return;\n }\n return pluginSearch(query);\n }\n case \"install\": {\n const name = args[1];\n if (!name) {\n console.error(color(\"red\", \"Usage: gauss plugin install <name>\"));\n process.exitCode = 1;\n return;\n }\n return pluginInstall(name);\n }\n case \"uninstall\": {\n const name = args[1];\n if (!name) {\n console.error(color(\"red\", \"Usage: gauss plugin uninstall <name>\"));\n process.exitCode = 1;\n return;\n }\n return pluginUninstall(name);\n }\n case \"list\":\n return pluginList();\n default:\n console.error(color(\"red\", \"Usage: gauss plugin <search|install|uninstall|list>\"));\n process.exitCode = 1;\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nasync function resolveProviderAndModel(\n opts: Record<string, string | undefined>,\n): Promise<{ provider: ProviderName; model: string | undefined; apiKey: string }> {\n const providerName = opts.provider ?? getDefaultProvider() ?? \"openai\";\n\n if (!isValidProvider(providerName)) {\n console.error(color(\"red\", `Unknown provider: ${providerName}`));\n console.log(color(\"dim\", `Available: ${SUPPORTED_PROVIDERS.join(\", \")}`));\n process.exit(1);\n }\n\n const apiKey = resolveApiKey(providerName, opts[\"api-key\"]);\n if (!apiKey) {\n console.error(color(\"red\", `No API key for provider \"${providerName}\".`));\n console.log(color(\"dim\", \"Set one with:\"));\n console.log(color(\"dim\", ` gauss config set ${providerName} <your-api-key>`));\n console.log(color(\"dim\", ` --api-key <your-api-key>`));\n console.log(color(\"dim\", ` Or set ${envVarName(providerName)} environment variable`));\n process.exit(1);\n }\n\n const configProvider = getDefaultProvider();\n const configModel =\n !opts.model && providerName === configProvider\n ? getDefaultModelFromConfig()\n : undefined;\n\n return {\n provider: providerName,\n model: opts.model ?? configModel,\n apiKey,\n };\n}\n\nmain().catch((err) => {\n console.error(color(\"red\", `\\n✗ Fatal error: ${err instanceof Error ? err.message : String(err)}\\n`));\n process.exitCode = 1;\n});\n"],"mappings":"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","names":[]}
@@ -0,0 +1,153 @@
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
+ export {
134
+ ENV_MAP,
135
+ addMcpServer,
136
+ appendHistory,
137
+ deleteKey,
138
+ envVarName,
139
+ getDefaultModelFromConfig,
140
+ getDefaultProvider,
141
+ getKey,
142
+ getMcpServers,
143
+ listKeys,
144
+ loadConfig,
145
+ loadHistory,
146
+ removeMcpServer,
147
+ resolveApiKey,
148
+ saveConfig,
149
+ setDefaultModel,
150
+ setDefaultProvider,
151
+ setKey
152
+ };
153
+ //# sourceMappingURL=config-4MHT6TQW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/config.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"],"mappings":"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","names":[]}