@phuetz/code-buddy 0.1.12 → 0.1.14

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 (321) hide show
  1. package/README.md +228 -13
  2. package/dist/agent/architect-mode.d.ts +11 -0
  3. package/dist/agent/architect-mode.js +133 -25
  4. package/dist/agent/architect-mode.js.map +1 -1
  5. package/dist/agent/codebuddy-agent.d.ts +24 -0
  6. package/dist/agent/codebuddy-agent.js +118 -16
  7. package/dist/agent/codebuddy-agent.js.map +1 -1
  8. package/dist/agent/execution/agent-executor.d.ts +9 -0
  9. package/dist/agent/execution/agent-executor.js +62 -1
  10. package/dist/agent/execution/agent-executor.js.map +1 -1
  11. package/dist/agent/message-queue.d.ts +77 -0
  12. package/dist/agent/message-queue.js +116 -0
  13. package/dist/agent/message-queue.js.map +1 -0
  14. package/dist/agent/middleware/auto-observation.d.ts +37 -0
  15. package/dist/agent/middleware/auto-observation.js +231 -0
  16. package/dist/agent/middleware/auto-observation.js.map +1 -0
  17. package/dist/agent/middleware/index.d.ts +2 -0
  18. package/dist/agent/middleware/index.js +1 -0
  19. package/dist/agent/middleware/index.js.map +1 -1
  20. package/dist/agent/tool-handler.js +3 -2
  21. package/dist/agent/tool-handler.js.map +1 -1
  22. package/dist/agent/turn-diff-tracker.js +3 -0
  23. package/dist/agent/turn-diff-tracker.js.map +1 -1
  24. package/dist/agent/types.d.ts +7 -2
  25. package/dist/analytics/budget-alerts.d.ts +81 -0
  26. package/dist/analytics/budget-alerts.js +126 -0
  27. package/dist/analytics/budget-alerts.js.map +1 -0
  28. package/dist/analytics/cost-predictor.d.ts +79 -0
  29. package/dist/analytics/cost-predictor.js +150 -0
  30. package/dist/analytics/cost-predictor.js.map +1 -0
  31. package/dist/analytics/index.d.ts +2 -0
  32. package/dist/analytics/index.js +2 -0
  33. package/dist/analytics/index.js.map +1 -1
  34. package/dist/auth/profile-manager.d.ts +205 -0
  35. package/dist/auth/profile-manager.js +484 -0
  36. package/dist/auth/profile-manager.js.map +1 -0
  37. package/dist/browser-automation/browser-manager.d.ts +79 -1
  38. package/dist/browser-automation/browser-manager.js +265 -2
  39. package/dist/browser-automation/browser-manager.js.map +1 -1
  40. package/dist/browser-automation/profile-manager.d.ts +32 -0
  41. package/dist/browser-automation/profile-manager.js +83 -0
  42. package/dist/browser-automation/profile-manager.js.map +1 -0
  43. package/dist/browser-automation/route-interceptor.d.ts +29 -0
  44. package/dist/browser-automation/route-interceptor.js +103 -0
  45. package/dist/browser-automation/route-interceptor.js.map +1 -0
  46. package/dist/browser-automation/screenshot-annotator.d.ts +23 -0
  47. package/dist/browser-automation/screenshot-annotator.js +86 -0
  48. package/dist/browser-automation/screenshot-annotator.js.map +1 -0
  49. package/dist/browser-automation/types.d.ts +47 -0
  50. package/dist/cache/llm-response-cache.js +3 -0
  51. package/dist/cache/llm-response-cache.js.map +1 -1
  52. package/dist/canvas/canvas-server.js +4 -3
  53. package/dist/canvas/canvas-server.js.map +1 -1
  54. package/dist/channels/discord/client.d.ts +2 -1
  55. package/dist/channels/discord/client.js +28 -16
  56. package/dist/channels/discord/client.js.map +1 -1
  57. package/dist/channels/dm-pairing.js +6 -3
  58. package/dist/channels/dm-pairing.js.map +1 -1
  59. package/dist/channels/google-chat/index.d.ts +210 -0
  60. package/dist/channels/google-chat/index.js +505 -0
  61. package/dist/channels/google-chat/index.js.map +1 -0
  62. package/dist/channels/group-security.d.ts +182 -0
  63. package/dist/channels/group-security.js +407 -0
  64. package/dist/channels/group-security.js.map +1 -0
  65. package/dist/channels/index.d.ts +17 -1
  66. package/dist/channels/index.js +16 -0
  67. package/dist/channels/index.js.map +1 -1
  68. package/dist/channels/matrix/index.d.ts +181 -0
  69. package/dist/channels/matrix/index.js +643 -0
  70. package/dist/channels/matrix/index.js.map +1 -0
  71. package/dist/channels/offline-queue.d.ts +92 -0
  72. package/dist/channels/offline-queue.js +112 -0
  73. package/dist/channels/offline-queue.js.map +1 -0
  74. package/dist/channels/reconnection-manager.d.ts +117 -0
  75. package/dist/channels/reconnection-manager.js +171 -0
  76. package/dist/channels/reconnection-manager.js.map +1 -0
  77. package/dist/channels/signal/index.d.ts +184 -0
  78. package/dist/channels/signal/index.js +488 -0
  79. package/dist/channels/signal/index.js.map +1 -0
  80. package/dist/channels/slack/client.d.ts +2 -1
  81. package/dist/channels/slack/client.js +30 -15
  82. package/dist/channels/slack/client.js.map +1 -1
  83. package/dist/channels/teams/index.d.ts +196 -0
  84. package/dist/channels/teams/index.js +477 -0
  85. package/dist/channels/teams/index.js.map +1 -0
  86. package/dist/channels/telegram/client.d.ts +3 -1
  87. package/dist/channels/telegram/client.js +29 -2
  88. package/dist/channels/telegram/client.js.map +1 -1
  89. package/dist/channels/webchat/index.d.ts +103 -0
  90. package/dist/channels/webchat/index.js +697 -0
  91. package/dist/channels/webchat/index.js.map +1 -0
  92. package/dist/channels/whatsapp/index.d.ts +105 -0
  93. package/dist/channels/whatsapp/index.js +533 -0
  94. package/dist/channels/whatsapp/index.js.map +1 -0
  95. package/dist/codebuddy/client.js +11 -5
  96. package/dist/codebuddy/client.js.map +1 -1
  97. package/dist/codebuddy/tool-definitions/advanced-tools.d.ts +1 -0
  98. package/dist/codebuddy/tool-definitions/advanced-tools.js +103 -3
  99. package/dist/codebuddy/tool-definitions/advanced-tools.js.map +1 -1
  100. package/dist/codebuddy/tool-definitions/index.d.ts +1 -1
  101. package/dist/codebuddy/tool-definitions/index.js +1 -1
  102. package/dist/codebuddy/tool-definitions/index.js.map +1 -1
  103. package/dist/codebuddy/tools.js +3 -1
  104. package/dist/codebuddy/tools.js.map +1 -1
  105. package/dist/commands/cli/config-command.d.ts +8 -0
  106. package/dist/commands/cli/config-command.js +90 -0
  107. package/dist/commands/cli/config-command.js.map +1 -0
  108. package/dist/commands/cli/openclaw-commands.d.ts +12 -0
  109. package/dist/commands/cli/openclaw-commands.js +446 -0
  110. package/dist/commands/cli/openclaw-commands.js.map +1 -0
  111. package/dist/commands/cli/utility-commands.js +30 -0
  112. package/dist/commands/cli/utility-commands.js.map +1 -1
  113. package/dist/commands/client-dispatcher.js +22 -2
  114. package/dist/commands/client-dispatcher.js.map +1 -1
  115. package/dist/commands/enhanced-command-handler.js +21 -2
  116. package/dist/commands/enhanced-command-handler.js.map +1 -1
  117. package/dist/commands/handlers/extra-handlers.d.ts +30 -0
  118. package/dist/commands/handlers/extra-handlers.js +547 -0
  119. package/dist/commands/handlers/extra-handlers.js.map +1 -0
  120. package/dist/commands/handlers/index.d.ts +1 -0
  121. package/dist/commands/handlers/index.js +2 -0
  122. package/dist/commands/handlers/index.js.map +1 -1
  123. package/dist/commands/slash/builtin-commands.js +41 -34
  124. package/dist/commands/slash/builtin-commands.js.map +1 -1
  125. package/dist/config/env-schema.d.ts +58 -0
  126. package/dist/config/env-schema.js +789 -0
  127. package/dist/config/env-schema.js.map +1 -0
  128. package/dist/config/feature-flags.js +2 -1
  129. package/dist/config/feature-flags.js.map +1 -1
  130. package/dist/context/bootstrap-loader.d.ts +48 -0
  131. package/dist/context/bootstrap-loader.js +123 -0
  132. package/dist/context/bootstrap-loader.js.map +1 -0
  133. package/dist/context/codebase-rag/chunker.js +2 -2
  134. package/dist/context/codebase-rag/chunker.js.map +1 -1
  135. package/dist/copilot/copilot-proxy.d.ts +15 -1
  136. package/dist/copilot/copilot-proxy.js +92 -23
  137. package/dist/copilot/copilot-proxy.js.map +1 -1
  138. package/dist/daemon/health-monitor.js +11 -7
  139. package/dist/daemon/health-monitor.js.map +1 -1
  140. package/dist/daemon/heartbeat.d.ts +112 -0
  141. package/dist/daemon/heartbeat.js +339 -0
  142. package/dist/daemon/heartbeat.js.map +1 -0
  143. package/dist/desktop-automation/smart-snapshot.d.ts +11 -0
  144. package/dist/desktop-automation/smart-snapshot.js +38 -0
  145. package/dist/desktop-automation/smart-snapshot.js.map +1 -1
  146. package/dist/extensions/extension-loader.js +4 -0
  147. package/dist/extensions/extension-loader.js.map +1 -1
  148. package/dist/identity/identity-manager.d.ts +95 -0
  149. package/dist/identity/identity-manager.js +242 -0
  150. package/dist/identity/identity-manager.js.map +1 -0
  151. package/dist/index.js +147 -17
  152. package/dist/index.js.map +1 -1
  153. package/dist/input/text-to-speech.js +4 -2
  154. package/dist/input/text-to-speech.js.map +1 -1
  155. package/dist/input/voice-control.js +5 -3
  156. package/dist/input/voice-control.js.map +1 -1
  157. package/dist/integrations/github-integration.js +1 -1
  158. package/dist/integrations/github-integration.js.map +1 -1
  159. package/dist/orchestration/orchestrator.js +3 -0
  160. package/dist/orchestration/orchestrator.js.map +1 -1
  161. package/dist/persistence/conversation-branches.js +2 -1
  162. package/dist/persistence/conversation-branches.js.map +1 -1
  163. package/dist/persistence/session-store.d.ts +1 -1
  164. package/dist/persistence/session-store.js +1 -1
  165. package/dist/persistence/session-store.js.map +1 -1
  166. package/dist/plugins/plugin-system.js +5 -2
  167. package/dist/plugins/plugin-system.js.map +1 -1
  168. package/dist/providers/gemini-provider.js +6 -4
  169. package/dist/providers/gemini-provider.js.map +1 -1
  170. package/dist/providers/local-llm-provider.js +8 -0
  171. package/dist/providers/local-llm-provider.js.map +1 -1
  172. package/dist/sandbox/auto-sandbox.d.ts +59 -0
  173. package/dist/sandbox/auto-sandbox.js +145 -0
  174. package/dist/sandbox/auto-sandbox.js.map +1 -0
  175. package/dist/scheduler/cron-scheduler.js +2 -0
  176. package/dist/scheduler/cron-scheduler.js.map +1 -1
  177. package/dist/scheduler/scheduler.js +11 -2
  178. package/dist/scheduler/scheduler.js.map +1 -1
  179. package/dist/security/audit-logger.d.ts +127 -0
  180. package/dist/security/audit-logger.js +194 -0
  181. package/dist/security/audit-logger.js.map +1 -0
  182. package/dist/security/bash-allowlist/allowlist-store.js +3 -2
  183. package/dist/security/bash-allowlist/allowlist-store.js.map +1 -1
  184. package/dist/security/bash-parser.js +0 -2
  185. package/dist/security/bash-parser.js.map +1 -1
  186. package/dist/security/code-validator.d.ts +51 -0
  187. package/dist/security/code-validator.js +185 -0
  188. package/dist/security/code-validator.js.map +1 -0
  189. package/dist/security/dangerous-patterns.d.ts +68 -0
  190. package/dist/security/dangerous-patterns.js +218 -0
  191. package/dist/security/dangerous-patterns.js.map +1 -0
  192. package/dist/security/remote-approval.d.ts +65 -0
  193. package/dist/security/remote-approval.js +138 -0
  194. package/dist/security/remote-approval.js.map +1 -0
  195. package/dist/security/security-audit.d.ts +7 -0
  196. package/dist/security/security-audit.js +23 -0
  197. package/dist/security/security-audit.js.map +1 -1
  198. package/dist/security/syntax-validator.d.ts +17 -0
  199. package/dist/security/syntax-validator.js +292 -0
  200. package/dist/security/syntax-validator.js.map +1 -0
  201. package/dist/server/index.js +277 -2
  202. package/dist/server/index.js.map +1 -1
  203. package/dist/server/middleware/logging.js +9 -1
  204. package/dist/server/middleware/logging.js.map +1 -1
  205. package/dist/server/routes/memory.js +4 -1
  206. package/dist/server/routes/memory.js.map +1 -1
  207. package/dist/server/routes/metrics.js +1 -1
  208. package/dist/server/routes/metrics.js.map +1 -1
  209. package/dist/server/routes/sessions.js +5 -4
  210. package/dist/server/routes/sessions.js.map +1 -1
  211. package/dist/server/websocket/handler.js +8 -2
  212. package/dist/server/websocket/handler.js.map +1 -1
  213. package/dist/services/prompt-builder.js +16 -0
  214. package/dist/services/prompt-builder.js.map +1 -1
  215. package/dist/skills/hub.d.ts +231 -0
  216. package/dist/skills/hub.js +694 -0
  217. package/dist/skills/hub.js.map +1 -0
  218. package/dist/skills/skill-loader.js +1 -1
  219. package/dist/skills/skill-loader.js.map +1 -1
  220. package/dist/skills/skill-manager.js +2 -1
  221. package/dist/skills/skill-manager.js.map +1 -1
  222. package/dist/skills/skill-registry.js +4 -0
  223. package/dist/skills/skill-registry.js.map +1 -1
  224. package/dist/talk-mode/providers/audioreader-tts.js +1 -0
  225. package/dist/talk-mode/providers/audioreader-tts.js.map +1 -1
  226. package/dist/tools/apply-patch.d.ts +1 -0
  227. package/dist/tools/apply-patch.js +66 -12
  228. package/dist/tools/apply-patch.js.map +1 -1
  229. package/dist/tools/bash/bash-tool.d.ts +123 -0
  230. package/dist/tools/bash/bash-tool.js +549 -0
  231. package/dist/tools/bash/bash-tool.js.map +1 -0
  232. package/dist/tools/bash/command-validator.d.ts +49 -0
  233. package/dist/tools/bash/command-validator.js +223 -0
  234. package/dist/tools/bash/command-validator.js.map +1 -0
  235. package/dist/tools/bash/index.d.ts +7 -0
  236. package/dist/tools/bash/index.js +8 -0
  237. package/dist/tools/bash/index.js.map +1 -0
  238. package/dist/tools/bash/security-patterns.d.ts +44 -0
  239. package/dist/tools/bash/security-patterns.js +234 -0
  240. package/dist/tools/bash/security-patterns.js.map +1 -0
  241. package/dist/tools/bash/streaming-executor.d.ts +23 -0
  242. package/dist/tools/bash/streaming-executor.js +134 -0
  243. package/dist/tools/bash/streaming-executor.js.map +1 -0
  244. package/dist/tools/bash.js +5 -3
  245. package/dist/tools/bash.js.map +1 -1
  246. package/dist/tools/code-formatter.js +41 -27
  247. package/dist/tools/code-formatter.js.map +1 -1
  248. package/dist/tools/code-review.js +1 -1
  249. package/dist/tools/code-review.js.map +1 -1
  250. package/dist/tools/computer-control-tool.js +21 -0
  251. package/dist/tools/computer-control-tool.js.map +1 -1
  252. package/dist/tools/document-tool.js +3 -2
  253. package/dist/tools/document-tool.js.map +1 -1
  254. package/dist/tools/git-tool.d.ts +45 -0
  255. package/dist/tools/git-tool.js +224 -2
  256. package/dist/tools/git-tool.js.map +1 -1
  257. package/dist/tools/index.d.ts +1 -1
  258. package/dist/tools/index.js +1 -1
  259. package/dist/tools/index.js.map +1 -1
  260. package/dist/tools/morph-editor.js +1 -0
  261. package/dist/tools/morph-editor.js.map +1 -1
  262. package/dist/tools/multi-edit.js +31 -3
  263. package/dist/tools/multi-edit.js.map +1 -1
  264. package/dist/tools/notebook-tool.js +8 -2
  265. package/dist/tools/notebook-tool.js.map +1 -1
  266. package/dist/tools/process-tool.d.ts +69 -0
  267. package/dist/tools/process-tool.js +222 -0
  268. package/dist/tools/process-tool.js.map +1 -0
  269. package/dist/tools/registry/git-tools.d.ts +32 -0
  270. package/dist/tools/registry/git-tools.js +211 -0
  271. package/dist/tools/registry/git-tools.js.map +1 -0
  272. package/dist/tools/registry/index.d.ts +2 -0
  273. package/dist/tools/registry/index.js +8 -0
  274. package/dist/tools/registry/index.js.map +1 -1
  275. package/dist/tools/registry/misc-tools.d.ts +32 -4
  276. package/dist/tools/registry/misc-tools.js +230 -90
  277. package/dist/tools/registry/misc-tools.js.map +1 -1
  278. package/dist/tools/registry/process-tools.d.ts +20 -0
  279. package/dist/tools/registry/process-tools.js +141 -0
  280. package/dist/tools/registry/process-tools.js.map +1 -0
  281. package/dist/tools/registry/types.d.ts +2 -0
  282. package/dist/tools/search.js +4 -2
  283. package/dist/tools/search.js.map +1 -1
  284. package/dist/tools/video-tool.js +30 -14
  285. package/dist/tools/video-tool.js.map +1 -1
  286. package/dist/tools/web-search.js +4 -1
  287. package/dist/tools/web-search.js.map +1 -1
  288. package/dist/ui/components/ChatInterface.js +9 -0
  289. package/dist/ui/components/ChatInterface.js.map +1 -1
  290. package/dist/utils/autonomy-manager.js +3 -2
  291. package/dist/utils/autonomy-manager.js.map +1 -1
  292. package/dist/utils/config-validation/schema.d.ts +15 -15
  293. package/dist/utils/confirmation-service.d.ts +16 -0
  294. package/dist/utils/confirmation-service.js +37 -3
  295. package/dist/utils/confirmation-service.js.map +1 -1
  296. package/dist/utils/custom-instructions.js +2 -1
  297. package/dist/utils/custom-instructions.js.map +1 -1
  298. package/dist/utils/diff-generator.js +3 -1
  299. package/dist/utils/diff-generator.js.map +1 -1
  300. package/dist/utils/graceful-shutdown.js +9 -9
  301. package/dist/utils/graceful-shutdown.js.map +1 -1
  302. package/dist/utils/head-tail-truncation.d.ts +18 -0
  303. package/dist/utils/head-tail-truncation.js +127 -0
  304. package/dist/utils/head-tail-truncation.js.map +1 -1
  305. package/dist/utils/history-manager.js +3 -2
  306. package/dist/utils/history-manager.js.map +1 -1
  307. package/dist/utils/logger.d.ts +2 -0
  308. package/dist/utils/logger.js +18 -3
  309. package/dist/utils/logger.js.map +1 -1
  310. package/dist/utils/performance.js +16 -15
  311. package/dist/utils/performance.js.map +1 -1
  312. package/dist/utils/stream-helpers.js +4 -2
  313. package/dist/utils/stream-helpers.js.map +1 -1
  314. package/dist/utils/update-notifier.js +2 -1
  315. package/dist/utils/update-notifier.js.map +1 -1
  316. package/dist/workflows/pipeline.d.ts +54 -1
  317. package/dist/workflows/pipeline.js +128 -7
  318. package/dist/workflows/pipeline.js.map +1 -1
  319. package/dist/workflows/step-manager.js +2 -1
  320. package/dist/workflows/step-manager.js.map +1 -1
  321. package/package.json +6 -3
@@ -0,0 +1,789 @@
1
+ /**
2
+ * Environment Variable Schema & Validation
3
+ *
4
+ * Central registry of all environment variables used by Code Buddy.
5
+ * Provides validation, documentation, and a CLI summary.
6
+ */
7
+ /**
8
+ * Complete schema of all environment variables used across the codebase.
9
+ */
10
+ export const ENV_SCHEMA = [
11
+ // ---- Core ----
12
+ {
13
+ name: 'GROK_API_KEY',
14
+ type: 'string',
15
+ description: 'Primary API key (xAI / Grok)',
16
+ required: true,
17
+ sensitive: true,
18
+ category: 'core',
19
+ },
20
+ {
21
+ name: 'GROK_BASE_URL',
22
+ type: 'string',
23
+ default: 'https://api.x.ai/v1',
24
+ description: 'Custom API endpoint for Grok',
25
+ category: 'core',
26
+ },
27
+ {
28
+ name: 'GROK_MODEL',
29
+ type: 'string',
30
+ default: 'grok-3-fast-latest',
31
+ description: 'Default LLM model to use',
32
+ category: 'core',
33
+ },
34
+ {
35
+ name: 'YOLO_MODE',
36
+ type: 'boolean',
37
+ default: 'false',
38
+ description: 'Full autonomy mode (400 tool rounds, higher cost limit)',
39
+ category: 'core',
40
+ },
41
+ {
42
+ name: 'MAX_COST',
43
+ type: 'number',
44
+ default: '10',
45
+ description: 'Session cost limit in dollars',
46
+ category: 'core',
47
+ min: 0,
48
+ max: 10000,
49
+ },
50
+ {
51
+ name: 'MORPH_API_KEY',
52
+ type: 'string',
53
+ description: 'Morph API key for fast file editing',
54
+ sensitive: true,
55
+ category: 'core',
56
+ },
57
+ {
58
+ name: 'CODEBUDDY_MAX_TOKENS',
59
+ type: 'number',
60
+ description: 'Override max output tokens for LLM responses',
61
+ category: 'core',
62
+ min: 1,
63
+ max: 1000000,
64
+ },
65
+ {
66
+ name: 'CODEBUDDY_MAX_CONTEXT',
67
+ type: 'number',
68
+ description: 'Override max context window size',
69
+ category: 'core',
70
+ min: 1000,
71
+ },
72
+ {
73
+ name: 'GROK_FORCE_TOOLS',
74
+ type: 'boolean',
75
+ default: 'false',
76
+ description: 'Force function calling mode for local models',
77
+ category: 'core',
78
+ },
79
+ {
80
+ name: 'GROK_CONVERT_TOOL_MESSAGES',
81
+ type: 'boolean',
82
+ default: 'false',
83
+ description: 'Convert tool messages for providers that lack native support',
84
+ category: 'core',
85
+ },
86
+ {
87
+ name: 'GROK_HOME',
88
+ type: 'string',
89
+ description: 'Custom home directory for Code Buddy config/data',
90
+ category: 'core',
91
+ },
92
+ {
93
+ name: 'GROK_VIM_MODE',
94
+ type: 'boolean',
95
+ default: 'false',
96
+ description: 'Enable vim-style key bindings in the terminal UI',
97
+ category: 'core',
98
+ },
99
+ {
100
+ name: 'GROK_SKIP_PERMISSIONS',
101
+ type: 'boolean',
102
+ default: 'false',
103
+ description: 'Bypass all permission checks (dangerous, containers only)',
104
+ category: 'core',
105
+ },
106
+ {
107
+ name: 'CODEBUDDY_SESSIONS_DIR',
108
+ type: 'string',
109
+ description: 'Custom directory for session persistence files',
110
+ category: 'core',
111
+ },
112
+ // ---- Provider API Keys ----
113
+ {
114
+ name: 'XAI_API_KEY',
115
+ type: 'string',
116
+ description: 'Alias for GROK_API_KEY (xAI provider)',
117
+ sensitive: true,
118
+ category: 'provider',
119
+ },
120
+ {
121
+ name: 'OPENAI_API_KEY',
122
+ type: 'string',
123
+ description: 'OpenAI API key',
124
+ sensitive: true,
125
+ category: 'provider',
126
+ },
127
+ {
128
+ name: 'OPENAI_BASE_URL',
129
+ type: 'string',
130
+ default: 'https://api.openai.com/v1',
131
+ description: 'Custom OpenAI-compatible endpoint',
132
+ category: 'provider',
133
+ },
134
+ {
135
+ name: 'OPENAI_MODEL',
136
+ type: 'string',
137
+ default: 'gpt-4o',
138
+ description: 'Default OpenAI model',
139
+ category: 'provider',
140
+ },
141
+ {
142
+ name: 'ANTHROPIC_API_KEY',
143
+ type: 'string',
144
+ description: 'Anthropic API key',
145
+ sensitive: true,
146
+ category: 'provider',
147
+ },
148
+ {
149
+ name: 'ANTHROPIC_MODEL',
150
+ type: 'string',
151
+ default: 'claude-sonnet-4-20250514',
152
+ description: 'Default Anthropic model',
153
+ category: 'provider',
154
+ },
155
+ {
156
+ name: 'GOOGLE_API_KEY',
157
+ type: 'string',
158
+ description: 'Google AI API key (Gemini)',
159
+ sensitive: true,
160
+ category: 'provider',
161
+ },
162
+ {
163
+ name: 'GEMINI_API_KEY',
164
+ type: 'string',
165
+ description: 'Alias for GOOGLE_API_KEY',
166
+ sensitive: true,
167
+ category: 'provider',
168
+ },
169
+ {
170
+ name: 'GEMINI_MODEL',
171
+ type: 'string',
172
+ default: 'gemini-2.5-flash',
173
+ description: 'Default Gemini model',
174
+ category: 'provider',
175
+ },
176
+ {
177
+ name: 'ELEVENLABS_API_KEY',
178
+ type: 'string',
179
+ description: 'ElevenLabs TTS API key',
180
+ sensitive: true,
181
+ category: 'provider',
182
+ },
183
+ // ---- Search ----
184
+ {
185
+ name: 'BRAVE_API_KEY',
186
+ type: 'string',
187
+ description: 'Brave Search API key for MCP web search',
188
+ sensitive: true,
189
+ category: 'search',
190
+ },
191
+ {
192
+ name: 'EXA_API_KEY',
193
+ type: 'string',
194
+ description: 'Exa neural search API key for MCP',
195
+ sensitive: true,
196
+ category: 'search',
197
+ },
198
+ {
199
+ name: 'PERPLEXITY_API_KEY',
200
+ type: 'string',
201
+ description: 'Perplexity AI search key (direct or via OpenRouter)',
202
+ sensitive: true,
203
+ category: 'search',
204
+ },
205
+ {
206
+ name: 'OPENROUTER_API_KEY',
207
+ type: 'string',
208
+ description: 'OpenRouter key (alternative for Perplexity)',
209
+ sensitive: true,
210
+ category: 'search',
211
+ },
212
+ {
213
+ name: 'PERPLEXITY_MODEL',
214
+ type: 'string',
215
+ default: 'perplexity/sonar-pro',
216
+ description: 'Perplexity model to use for search',
217
+ category: 'search',
218
+ },
219
+ {
220
+ name: 'SERPER_API_KEY',
221
+ type: 'string',
222
+ description: 'Serper API key for web/browser search',
223
+ sensitive: true,
224
+ category: 'search',
225
+ },
226
+ // ---- Server ----
227
+ {
228
+ name: 'PORT',
229
+ type: 'number',
230
+ default: '3000',
231
+ description: 'HTTP server listen port',
232
+ category: 'server',
233
+ min: 1,
234
+ max: 65535,
235
+ },
236
+ {
237
+ name: 'HOST',
238
+ type: 'string',
239
+ default: '0.0.0.0',
240
+ description: 'HTTP server listen address',
241
+ category: 'server',
242
+ },
243
+ {
244
+ name: 'CORS_ORIGINS',
245
+ type: 'string',
246
+ default: '*',
247
+ description: 'Comma-separated list of allowed CORS origins',
248
+ category: 'server',
249
+ },
250
+ {
251
+ name: 'RATE_LIMIT_MAX',
252
+ type: 'number',
253
+ default: '100',
254
+ description: 'Max requests per rate-limit window',
255
+ category: 'server',
256
+ min: 1,
257
+ },
258
+ {
259
+ name: 'RATE_LIMIT_WINDOW',
260
+ type: 'number',
261
+ default: '60000',
262
+ description: 'Rate-limit window in milliseconds',
263
+ category: 'server',
264
+ min: 1000,
265
+ },
266
+ {
267
+ name: 'AUTH_ENABLED',
268
+ type: 'boolean',
269
+ default: 'true',
270
+ description: 'Enable JWT authentication on the API server',
271
+ category: 'server',
272
+ },
273
+ {
274
+ name: 'WS_ENABLED',
275
+ type: 'boolean',
276
+ default: 'true',
277
+ description: 'Enable WebSocket support on the server',
278
+ category: 'server',
279
+ },
280
+ {
281
+ name: 'LOGGING',
282
+ type: 'boolean',
283
+ default: 'true',
284
+ description: 'Enable HTTP request logging',
285
+ category: 'server',
286
+ },
287
+ {
288
+ name: 'MAX_REQUEST_SIZE',
289
+ type: 'string',
290
+ default: '10mb',
291
+ description: 'Maximum HTTP request body size',
292
+ category: 'server',
293
+ },
294
+ {
295
+ name: 'JWT_EXPIRATION',
296
+ type: 'string',
297
+ default: '24h',
298
+ description: 'JWT token expiration duration',
299
+ category: 'server',
300
+ },
301
+ // ---- Security ----
302
+ {
303
+ name: 'JWT_SECRET',
304
+ type: 'string',
305
+ description: 'Secret for API server JWT authentication',
306
+ sensitive: true,
307
+ category: 'security',
308
+ },
309
+ {
310
+ name: 'SECURITY_MODE',
311
+ type: 'string',
312
+ description: 'Security tier: suggest, auto-edit, or full-auto',
313
+ category: 'security',
314
+ pattern: /^(suggest|auto-edit|full-auto)$/,
315
+ },
316
+ {
317
+ name: 'SECURITY_HEADERS',
318
+ type: 'boolean',
319
+ default: 'true',
320
+ description: 'Enable security headers on HTTP responses',
321
+ category: 'security',
322
+ },
323
+ {
324
+ name: 'DM_POLICY',
325
+ type: 'string',
326
+ description: 'DM pairing security policy',
327
+ category: 'security',
328
+ },
329
+ {
330
+ name: 'ARCHIVE_PASSWORD',
331
+ type: 'string',
332
+ description: 'Default password for encrypted archives',
333
+ sensitive: true,
334
+ category: 'security',
335
+ },
336
+ // ---- Debug ----
337
+ {
338
+ name: 'DEBUG',
339
+ type: 'string',
340
+ description: 'Enable debug logging (true or comma-separated namespaces)',
341
+ category: 'debug',
342
+ },
343
+ {
344
+ name: 'GROK_DEBUG',
345
+ type: 'boolean',
346
+ default: 'false',
347
+ description: 'Enable Code Buddy debug mode',
348
+ category: 'debug',
349
+ },
350
+ {
351
+ name: 'CACHE_TRACE',
352
+ type: 'boolean',
353
+ default: 'false',
354
+ description: 'Enable prompt construction debug tracing',
355
+ category: 'debug',
356
+ },
357
+ {
358
+ name: 'PERF_TIMING',
359
+ type: 'boolean',
360
+ default: 'false',
361
+ description: 'Log startup performance timings',
362
+ category: 'debug',
363
+ },
364
+ {
365
+ name: 'LOG_LEVEL',
366
+ type: 'string',
367
+ description: 'Logging level (debug, info, warn, error)',
368
+ category: 'debug',
369
+ pattern: /^(debug|info|warn|error)$/,
370
+ },
371
+ {
372
+ name: 'LOG_FORMAT',
373
+ type: 'string',
374
+ default: 'text',
375
+ description: 'Log output format (text or json)',
376
+ category: 'debug',
377
+ pattern: /^(text|json)$/,
378
+ },
379
+ {
380
+ name: 'LOG_FILE',
381
+ type: 'string',
382
+ description: 'Path to write log output to a file',
383
+ category: 'debug',
384
+ },
385
+ {
386
+ name: 'MCP_DEBUG',
387
+ type: 'boolean',
388
+ default: 'false',
389
+ description: 'Enable MCP protocol debug logging',
390
+ category: 'debug',
391
+ },
392
+ {
393
+ name: 'VERBOSE',
394
+ type: 'boolean',
395
+ default: 'false',
396
+ description: 'Enable verbose output',
397
+ category: 'debug',
398
+ },
399
+ {
400
+ name: 'DEBUG_LEVEL',
401
+ type: 'string',
402
+ description: 'Debug logging level (trace, debug, info)',
403
+ category: 'debug',
404
+ },
405
+ {
406
+ name: 'DEBUG_OUTPUT',
407
+ type: 'string',
408
+ description: 'Debug output destination (console, file, both)',
409
+ category: 'debug',
410
+ },
411
+ {
412
+ name: 'DEBUG_FILE',
413
+ type: 'string',
414
+ description: 'File path for debug log output',
415
+ category: 'debug',
416
+ },
417
+ {
418
+ name: 'DEBUG_JSON',
419
+ type: 'boolean',
420
+ default: 'false',
421
+ description: 'Output debug logs as JSON',
422
+ category: 'debug',
423
+ },
424
+ {
425
+ name: 'DEBUG_TIMING',
426
+ type: 'boolean',
427
+ default: 'false',
428
+ description: 'Include timing information in debug logs',
429
+ category: 'debug',
430
+ },
431
+ {
432
+ name: 'DEBUG_API',
433
+ type: 'boolean',
434
+ default: 'false',
435
+ description: 'Log API request/response details',
436
+ category: 'debug',
437
+ },
438
+ {
439
+ name: 'DEBUG_TOOLS',
440
+ type: 'boolean',
441
+ default: 'false',
442
+ description: 'Log tool execution details',
443
+ category: 'debug',
444
+ },
445
+ {
446
+ name: 'DEBUG_PROMPTS',
447
+ type: 'boolean',
448
+ default: 'false',
449
+ description: 'Log full prompt content sent to LLM',
450
+ category: 'debug',
451
+ },
452
+ // ---- Voice ----
453
+ {
454
+ name: 'PICOVOICE_ACCESS_KEY',
455
+ type: 'string',
456
+ description: 'Picovoice key for Porcupine wake word detection',
457
+ sensitive: true,
458
+ category: 'voice',
459
+ },
460
+ {
461
+ name: 'VOSK_MODEL_PATH',
462
+ type: 'string',
463
+ default: '/usr/share/vosk/model',
464
+ description: 'Path to Vosk speech recognition model',
465
+ category: 'voice',
466
+ },
467
+ {
468
+ name: 'WHISPER_CPP_PATH',
469
+ type: 'string',
470
+ default: 'whisper',
471
+ description: 'Path to whisper.cpp binary',
472
+ category: 'voice',
473
+ },
474
+ {
475
+ name: 'WHISPER_MODEL_PATH',
476
+ type: 'string',
477
+ default: 'models/ggml-base.bin',
478
+ description: 'Path to whisper model file',
479
+ category: 'voice',
480
+ },
481
+ {
482
+ name: 'DEEPGRAM_API_KEY',
483
+ type: 'string',
484
+ description: 'Deepgram speech-to-text API key',
485
+ sensitive: true,
486
+ category: 'voice',
487
+ },
488
+ // ---- Cache ----
489
+ {
490
+ name: 'CODEBUDDY_CACHE_DISABLED',
491
+ type: 'boolean',
492
+ default: 'false',
493
+ description: 'Disable all caching',
494
+ category: 'cache',
495
+ },
496
+ {
497
+ name: 'CODEBUDDY_CACHE_DIR',
498
+ type: 'string',
499
+ description: 'Custom cache directory path',
500
+ category: 'cache',
501
+ },
502
+ {
503
+ name: 'CODEBUDDY_CACHE_MODE',
504
+ type: 'string',
505
+ description: 'Cache mode: performance or memory',
506
+ category: 'cache',
507
+ pattern: /^(performance|memory)$/,
508
+ },
509
+ {
510
+ name: 'CODEBUDDY_AUTODETECT_LOCAL_LLAMA',
511
+ type: 'boolean',
512
+ default: 'false',
513
+ description: 'Auto-detect local LLaMA/Ollama instances',
514
+ category: 'cache',
515
+ },
516
+ // ---- Metrics ----
517
+ {
518
+ name: 'METRICS_CONSOLE',
519
+ type: 'boolean',
520
+ default: 'false',
521
+ description: 'Export metrics to console',
522
+ category: 'metrics',
523
+ },
524
+ {
525
+ name: 'METRICS_FILE',
526
+ type: 'boolean',
527
+ default: 'false',
528
+ description: 'Export metrics to a file',
529
+ category: 'metrics',
530
+ },
531
+ {
532
+ name: 'METRICS_PATH',
533
+ type: 'string',
534
+ description: 'File path for metrics export',
535
+ category: 'metrics',
536
+ },
537
+ {
538
+ name: 'METRICS_INTERVAL',
539
+ type: 'number',
540
+ default: '60000',
541
+ description: 'Metrics export interval in milliseconds',
542
+ category: 'metrics',
543
+ min: 1000,
544
+ },
545
+ // ---- Display ----
546
+ {
547
+ name: 'NO_COLOR',
548
+ type: 'boolean',
549
+ default: 'false',
550
+ description: 'Disable color output (standard NO_COLOR convention)',
551
+ category: 'display',
552
+ },
553
+ {
554
+ name: 'NO_EMOJI',
555
+ type: 'boolean',
556
+ default: 'false',
557
+ description: 'Disable emoji in output',
558
+ category: 'display',
559
+ },
560
+ {
561
+ name: 'PREFERS_REDUCED_MOTION',
562
+ type: 'boolean',
563
+ default: 'false',
564
+ description: 'Reduce animations in terminal UI',
565
+ category: 'display',
566
+ },
567
+ {
568
+ name: 'FORCE_HIGH_CONTRAST',
569
+ type: 'boolean',
570
+ default: 'false',
571
+ description: 'Force high-contrast rendering',
572
+ category: 'display',
573
+ },
574
+ {
575
+ name: 'SCREEN_READER',
576
+ type: 'boolean',
577
+ default: 'false',
578
+ description: 'Enable screen reader mode',
579
+ category: 'display',
580
+ },
581
+ // ---- Git / CI ----
582
+ {
583
+ name: 'GITHUB_TOKEN',
584
+ type: 'string',
585
+ description: 'GitHub personal access token',
586
+ sensitive: true,
587
+ category: 'provider',
588
+ },
589
+ {
590
+ name: 'GITLAB_TOKEN',
591
+ type: 'string',
592
+ description: 'GitLab personal access token',
593
+ sensitive: true,
594
+ category: 'provider',
595
+ },
596
+ // ---- Browser Automation ----
597
+ {
598
+ name: 'CHROME_REMOTE_DEBUGGING_PORT',
599
+ type: 'number',
600
+ description: 'Chrome DevTools Protocol port',
601
+ category: 'debug',
602
+ min: 1,
603
+ max: 65535,
604
+ },
605
+ {
606
+ name: 'CDP_URL',
607
+ type: 'string',
608
+ description: 'Chrome DevTools Protocol WebSocket URL',
609
+ category: 'debug',
610
+ },
611
+ // ---- Node / Runtime (read but not owned by Code Buddy) ----
612
+ {
613
+ name: 'NODE_ENV',
614
+ type: 'string',
615
+ default: 'development',
616
+ description: 'Node.js environment (development, production, test)',
617
+ category: 'core',
618
+ pattern: /^(development|production|test)$/,
619
+ },
620
+ ];
621
+ // ---------------------------------------------------------------------------
622
+ // Lookup helpers
623
+ // ---------------------------------------------------------------------------
624
+ const schemaByName = new Map(ENV_SCHEMA.map(def => [def.name, def]));
625
+ /**
626
+ * Look up a single env var definition by name.
627
+ */
628
+ export function getEnvDef(name) {
629
+ return schemaByName.get(name);
630
+ }
631
+ /**
632
+ * Validate the current `process.env` against the schema.
633
+ *
634
+ * - Required vars that are missing produce **errors**.
635
+ * - Type mismatches and out-of-range values produce **warnings**.
636
+ */
637
+ export function validateEnv(env = process.env) {
638
+ const errors = [];
639
+ const warnings = [];
640
+ for (const def of ENV_SCHEMA) {
641
+ const raw = env[def.name];
642
+ // Required check
643
+ if (def.required && (raw === undefined || raw === '')) {
644
+ errors.push(`${def.name} is required but not set. ${def.description}`);
645
+ continue;
646
+ }
647
+ // Skip further checks if not set
648
+ if (raw === undefined || raw === '') {
649
+ continue;
650
+ }
651
+ // Type validation
652
+ switch (def.type) {
653
+ case 'number': {
654
+ const num = Number(raw);
655
+ if (isNaN(num)) {
656
+ warnings.push(`${def.name} should be a number but got "${raw}"`);
657
+ }
658
+ else {
659
+ if (def.min !== undefined && num < def.min) {
660
+ warnings.push(`${def.name}=${raw} is below minimum ${def.min}`);
661
+ }
662
+ if (def.max !== undefined && num > def.max) {
663
+ warnings.push(`${def.name}=${raw} is above maximum ${def.max}`);
664
+ }
665
+ }
666
+ break;
667
+ }
668
+ case 'boolean': {
669
+ if (!['true', 'false', '1', '0', ''].includes(raw.toLowerCase())) {
670
+ warnings.push(`${def.name} should be a boolean (true/false) but got "${raw}"`);
671
+ }
672
+ break;
673
+ }
674
+ case 'string': {
675
+ if (def.pattern && !def.pattern.test(raw)) {
676
+ warnings.push(`${def.name}="${raw}" does not match expected pattern ${def.pattern}`);
677
+ }
678
+ break;
679
+ }
680
+ }
681
+ }
682
+ return {
683
+ valid: errors.length === 0,
684
+ warnings,
685
+ errors,
686
+ };
687
+ }
688
+ // ---------------------------------------------------------------------------
689
+ // Summary / CLI output
690
+ // ---------------------------------------------------------------------------
691
+ /**
692
+ * Mask a sensitive value for display.
693
+ * Shows first 4 chars and masks the rest, or just '****' if too short.
694
+ */
695
+ export function maskValue(value) {
696
+ if (value.length <= 8) {
697
+ return '****';
698
+ }
699
+ return value.slice(0, 4) + '****' + value.slice(-4);
700
+ }
701
+ /**
702
+ * Category display labels.
703
+ */
704
+ const CATEGORY_LABELS = {
705
+ core: 'Core',
706
+ provider: 'Provider API Keys',
707
+ server: 'Server',
708
+ security: 'Security',
709
+ debug: 'Debug & Logging',
710
+ voice: 'Voice & Speech',
711
+ search: 'Search',
712
+ cache: 'Cache',
713
+ metrics: 'Metrics',
714
+ display: 'Display & Accessibility',
715
+ };
716
+ /**
717
+ * Generate a formatted summary of all environment variables for CLI output.
718
+ */
719
+ export function getEnvSummary(env = process.env) {
720
+ const lines = [];
721
+ const validation = validateEnv(env);
722
+ lines.push('Code Buddy Environment Configuration');
723
+ lines.push('='.repeat(50));
724
+ // Group by category
725
+ const grouped = new Map();
726
+ for (const def of ENV_SCHEMA) {
727
+ const list = grouped.get(def.category) || [];
728
+ list.push(def);
729
+ grouped.set(def.category, list);
730
+ }
731
+ // Ordered categories
732
+ const categoryOrder = [
733
+ 'core', 'provider', 'search', 'server', 'security',
734
+ 'debug', 'voice', 'cache', 'metrics', 'display',
735
+ ];
736
+ for (const cat of categoryOrder) {
737
+ const defs = grouped.get(cat);
738
+ if (!defs)
739
+ continue;
740
+ lines.push('');
741
+ lines.push(`[${CATEGORY_LABELS[cat]}]`);
742
+ for (const def of defs) {
743
+ const raw = env[def.name];
744
+ const isSet = raw !== undefined && raw !== '';
745
+ let displayValue;
746
+ if (!isSet) {
747
+ displayValue = def.default !== undefined ? `(default: ${def.default})` : '(not set)';
748
+ }
749
+ else if (def.sensitive) {
750
+ displayValue = maskValue(raw);
751
+ }
752
+ else {
753
+ displayValue = raw;
754
+ }
755
+ const status = isSet ? '*' : ' ';
756
+ const req = def.required ? ' [required]' : '';
757
+ lines.push(` ${status} ${def.name}=${displayValue}${req}`);
758
+ lines.push(` ${def.description}`);
759
+ }
760
+ }
761
+ // Validation summary
762
+ if (validation.errors.length > 0 || validation.warnings.length > 0) {
763
+ lines.push('');
764
+ lines.push('-'.repeat(50));
765
+ if (validation.errors.length > 0) {
766
+ lines.push('');
767
+ lines.push('Errors:');
768
+ for (const err of validation.errors) {
769
+ lines.push(` ! ${err}`);
770
+ }
771
+ }
772
+ if (validation.warnings.length > 0) {
773
+ lines.push('');
774
+ lines.push('Warnings:');
775
+ for (const warn of validation.warnings) {
776
+ lines.push(` ? ${warn}`);
777
+ }
778
+ }
779
+ }
780
+ lines.push('');
781
+ const setCount = ENV_SCHEMA.filter(d => {
782
+ const v = env[d.name];
783
+ return v !== undefined && v !== '';
784
+ }).length;
785
+ lines.push(`${setCount}/${ENV_SCHEMA.length} variables set`);
786
+ lines.push(`Legend: * = set, [required] = must be configured`);
787
+ return lines.join('\n');
788
+ }
789
+ //# sourceMappingURL=env-schema.js.map