@phuetz/code-buddy 0.1.18 → 0.1.20

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 (355) hide show
  1. package/dist/agent/background-tasks.d.ts +49 -0
  2. package/dist/agent/background-tasks.js +153 -0
  3. package/dist/agent/background-tasks.js.map +1 -0
  4. package/dist/agent/definitions/agent-definition-loader.d.ts +21 -0
  5. package/dist/agent/definitions/agent-definition-loader.js +161 -0
  6. package/dist/agent/definitions/agent-definition-loader.js.map +1 -0
  7. package/dist/agent/definitions/index.d.ts +1 -0
  8. package/dist/agent/definitions/index.js +2 -0
  9. package/dist/agent/definitions/index.js.map +1 -0
  10. package/dist/agent/extended-thinking.d.ts +64 -0
  11. package/dist/agent/extended-thinking.js +103 -0
  12. package/dist/agent/extended-thinking.js.map +1 -0
  13. package/dist/agent/prompt-suggestions.d.ts +55 -0
  14. package/dist/agent/prompt-suggestions.js +125 -0
  15. package/dist/agent/prompt-suggestions.js.map +1 -0
  16. package/dist/agent/rewind-manager.d.ts +59 -0
  17. package/dist/agent/rewind-manager.js +124 -0
  18. package/dist/agent/rewind-manager.js.map +1 -0
  19. package/dist/agent/teams/agent-team.d.ts +54 -0
  20. package/dist/agent/teams/agent-team.js +114 -0
  21. package/dist/agent/teams/agent-team.js.map +1 -0
  22. package/dist/agent/teams/index.d.ts +1 -0
  23. package/dist/agent/teams/index.js +2 -0
  24. package/dist/agent/teams/index.js.map +1 -0
  25. package/dist/agent/teams/team-v2.d.ts +166 -0
  26. package/dist/agent/teams/team-v2.js +376 -0
  27. package/dist/agent/teams/team-v2.js.map +1 -0
  28. package/dist/analytics/dashboard.js +1 -1
  29. package/dist/analytics/dashboard.js.map +1 -1
  30. package/dist/channels/imessage/index.d.ts +40 -0
  31. package/dist/channels/imessage/index.js +69 -0
  32. package/dist/channels/imessage/index.js.map +1 -0
  33. package/dist/channels/line/index.d.ts +36 -0
  34. package/dist/channels/line/index.js +71 -0
  35. package/dist/channels/line/index.js.map +1 -0
  36. package/dist/channels/mattermost/index.d.ts +34 -0
  37. package/dist/channels/mattermost/index.js +56 -0
  38. package/dist/channels/mattermost/index.js.map +1 -0
  39. package/dist/channels/nextcloud-talk/index.d.ts +37 -0
  40. package/dist/channels/nextcloud-talk/index.js +67 -0
  41. package/dist/channels/nextcloud-talk/index.js.map +1 -0
  42. package/dist/channels/niche-channels.d.ts +61 -0
  43. package/dist/channels/niche-channels.js +131 -0
  44. package/dist/channels/niche-channels.js.map +1 -0
  45. package/dist/channels/nostr/index.d.ts +30 -0
  46. package/dist/channels/nostr/index.js +68 -0
  47. package/dist/channels/nostr/index.js.map +1 -0
  48. package/dist/channels/twilio-voice/index.d.ts +37 -0
  49. package/dist/channels/twilio-voice/index.js +76 -0
  50. package/dist/channels/twilio-voice/index.js.map +1 -0
  51. package/dist/channels/whatsapp/index.js +0 -1
  52. package/dist/channels/whatsapp/index.js.map +1 -1
  53. package/dist/channels/zalo/index.d.ts +28 -0
  54. package/dist/channels/zalo/index.js +53 -0
  55. package/dist/channels/zalo/index.js.map +1 -0
  56. package/dist/cloud/cloud-sessions.d.ts +56 -0
  57. package/dist/cloud/cloud-sessions.js +187 -0
  58. package/dist/cloud/cloud-sessions.js.map +1 -0
  59. package/dist/codebuddy/tool-definitions/advanced-tools.d.ts +1 -0
  60. package/dist/codebuddy/tool-definitions/advanced-tools.js +24 -0
  61. package/dist/codebuddy/tool-definitions/advanced-tools.js.map +1 -1
  62. package/dist/codebuddy/tool-definitions/index.d.ts +1 -1
  63. package/dist/codebuddy/tool-definitions/index.js +1 -1
  64. package/dist/codebuddy/tool-definitions/index.js.map +1 -1
  65. package/dist/commands/delegate.js +2 -2
  66. package/dist/commands/delegate.js.map +1 -1
  67. package/dist/commands/features.d.ts +1 -1
  68. package/dist/commands/features.js +1 -1
  69. package/dist/commands/handlers/auth-handler.d.ts +32 -0
  70. package/dist/commands/handlers/auth-handler.js +137 -0
  71. package/dist/commands/handlers/auth-handler.js.map +1 -0
  72. package/dist/commands/handlers/context-handler.d.ts +46 -0
  73. package/dist/commands/handlers/context-handler.js +102 -0
  74. package/dist/commands/handlers/context-handler.js.map +1 -0
  75. package/dist/commands/handlers/core-handlers.js +1 -1
  76. package/dist/commands/handlers/core-handlers.js.map +1 -1
  77. package/dist/commands/handlers/keybindings-handler.d.ts +30 -0
  78. package/dist/commands/handlers/keybindings-handler.js +124 -0
  79. package/dist/commands/handlers/keybindings-handler.js.map +1 -0
  80. package/dist/commands/handlers/missing-handlers.js +15 -14
  81. package/dist/commands/handlers/missing-handlers.js.map +1 -1
  82. package/dist/commands/handlers/session-commands.d.ts +17 -0
  83. package/dist/commands/handlers/session-commands.js +119 -0
  84. package/dist/commands/handlers/session-commands.js.map +1 -0
  85. package/dist/commands/handlers/worktree-handlers.d.ts +1 -1
  86. package/dist/commands/handlers/worktree-handlers.js +2 -2
  87. package/dist/commands/slash/builtin-commands.js +2 -2
  88. package/dist/commands/slash/builtin-commands.js.map +1 -1
  89. package/dist/config/admin-config.d.ts +54 -0
  90. package/dist/config/admin-config.js +144 -0
  91. package/dist/config/admin-config.js.map +1 -0
  92. package/dist/config/advanced-config.d.ts +118 -0
  93. package/dist/config/advanced-config.js +364 -0
  94. package/dist/config/advanced-config.js.map +1 -0
  95. package/dist/config/constants.d.ts +2 -2
  96. package/dist/config/constants.js +2 -2
  97. package/dist/config/constants.js.map +1 -1
  98. package/dist/config/managed-policies.d.ts +50 -0
  99. package/dist/config/managed-policies.js +120 -0
  100. package/dist/config/managed-policies.js.map +1 -0
  101. package/dist/config/settings-hierarchy.d.ts +59 -0
  102. package/dist/config/settings-hierarchy.js +188 -0
  103. package/dist/config/settings-hierarchy.js.map +1 -0
  104. package/dist/config/toml-config.js +1 -1
  105. package/dist/config/toml-config.js.map +1 -1
  106. package/dist/config/tool-profiles.d.ts +37 -0
  107. package/dist/config/tool-profiles.js +150 -0
  108. package/dist/config/tool-profiles.js.map +1 -0
  109. package/dist/config/user-settings.d.ts +31 -0
  110. package/dist/config/user-settings.js +66 -0
  111. package/dist/config/user-settings.js.map +1 -0
  112. package/dist/context/context-files.d.ts +1 -1
  113. package/dist/context/context-files.js +3 -3
  114. package/dist/context/context-files.js.map +1 -1
  115. package/dist/context/partial-summarizer.d.ts +32 -0
  116. package/dist/context/partial-summarizer.js +144 -0
  117. package/dist/context/partial-summarizer.js.map +1 -0
  118. package/dist/desktop/desktop-app.d.ts +44 -0
  119. package/dist/desktop/desktop-app.js +136 -0
  120. package/dist/desktop/desktop-app.js.map +1 -0
  121. package/dist/features/index.d.ts +1 -1
  122. package/dist/features/index.js +2 -2
  123. package/dist/features/index.js.map +1 -1
  124. package/dist/git/worktree-sessions.d.ts +24 -0
  125. package/dist/git/worktree-sessions.js +93 -0
  126. package/dist/git/worktree-sessions.js.map +1 -0
  127. package/dist/hooks/advanced-hooks.d.ts +110 -0
  128. package/dist/hooks/advanced-hooks.js +256 -0
  129. package/dist/hooks/advanced-hooks.js.map +1 -0
  130. package/dist/hooks/async-hooks.d.ts +73 -0
  131. package/dist/hooks/async-hooks.js +213 -0
  132. package/dist/hooks/async-hooks.js.map +1 -0
  133. package/dist/hooks/env-persistence.d.ts +58 -0
  134. package/dist/hooks/env-persistence.js +195 -0
  135. package/dist/hooks/env-persistence.js.map +1 -0
  136. package/dist/hooks/hook-events.d.ts +36 -0
  137. package/dist/hooks/hook-events.js +55 -0
  138. package/dist/hooks/hook-events.js.map +1 -0
  139. package/dist/hooks/hook-system.js +1 -1
  140. package/dist/hooks/hook-system.js.map +1 -1
  141. package/dist/hooks/smart-hooks.d.ts +85 -0
  142. package/dist/hooks/smart-hooks.js +199 -0
  143. package/dist/hooks/smart-hooks.js.map +1 -0
  144. package/dist/ide/jetbrains-plugin.d.ts +55 -0
  145. package/dist/ide/jetbrains-plugin.js +156 -0
  146. package/dist/ide/jetbrains-plugin.js.map +1 -0
  147. package/dist/ide/vscode-extension.d.ts +94 -0
  148. package/dist/ide/vscode-extension.js +229 -0
  149. package/dist/ide/vscode-extension.js.map +1 -0
  150. package/dist/index.js +77 -3
  151. package/dist/index.js.map +1 -1
  152. package/dist/input/file-autocomplete.d.ts +42 -0
  153. package/dist/input/file-autocomplete.js +154 -0
  154. package/dist/input/file-autocomplete.js.map +1 -0
  155. package/dist/integrations/chrome-bridge.d.ts +90 -0
  156. package/dist/integrations/chrome-bridge.js +151 -0
  157. package/dist/integrations/chrome-bridge.js.map +1 -0
  158. package/dist/integrations/github-action-runner.d.ts +40 -0
  159. package/dist/integrations/github-action-runner.js +163 -0
  160. package/dist/integrations/github-action-runner.js.map +1 -0
  161. package/dist/integrations/github-actions.js +1 -1
  162. package/dist/integrations/github-actions.js.map +1 -1
  163. package/dist/integrations/gitlab-ci-runner.d.ts +34 -0
  164. package/dist/integrations/gitlab-ci-runner.js +104 -0
  165. package/dist/integrations/gitlab-ci-runner.js.map +1 -0
  166. package/dist/integrations/pr-session-linker.d.ts +44 -0
  167. package/dist/integrations/pr-session-linker.js +103 -0
  168. package/dist/integrations/pr-session-linker.js.map +1 -0
  169. package/dist/integrations/tailscale.d.ts +36 -0
  170. package/dist/integrations/tailscale.js +101 -0
  171. package/dist/integrations/tailscale.js.map +1 -0
  172. package/dist/lsp/lsp-client.d.ts +68 -0
  173. package/dist/lsp/lsp-client.js +182 -0
  174. package/dist/lsp/lsp-client.js.map +1 -0
  175. package/dist/lsp/server.js +3 -3
  176. package/dist/lsp/server.js.map +1 -1
  177. package/dist/mcp/connectors.d.ts +28 -0
  178. package/dist/mcp/connectors.js +148 -0
  179. package/dist/mcp/connectors.js.map +1 -0
  180. package/dist/mcp/index.d.ts +7 -4
  181. package/dist/mcp/index.js +7 -4
  182. package/dist/mcp/index.js.map +1 -1
  183. package/dist/mcp/mcp-auto-discovery.d.ts +49 -0
  184. package/dist/mcp/mcp-auto-discovery.js +104 -0
  185. package/dist/mcp/mcp-auto-discovery.js.map +1 -0
  186. package/dist/mcp/mcp-server.d.ts +70 -0
  187. package/dist/mcp/mcp-server.js +374 -0
  188. package/dist/mcp/mcp-server.js.map +1 -0
  189. package/dist/memory/auto-memory.d.ts +53 -0
  190. package/dist/memory/auto-memory.js +250 -0
  191. package/dist/memory/auto-memory.js.map +1 -0
  192. package/dist/memory/hybrid-search.d.ts +51 -0
  193. package/dist/memory/hybrid-search.js +199 -0
  194. package/dist/memory/hybrid-search.js.map +1 -0
  195. package/dist/memory/memory-flush.d.ts +51 -0
  196. package/dist/memory/memory-flush.js +102 -0
  197. package/dist/memory/memory-flush.js.map +1 -0
  198. package/dist/memory/subagent-memory.d.ts +73 -0
  199. package/dist/memory/subagent-memory.js +172 -0
  200. package/dist/memory/subagent-memory.js.map +1 -0
  201. package/dist/nodes/device-node.d.ts +40 -0
  202. package/dist/nodes/device-node.js +117 -0
  203. package/dist/nodes/device-node.js.map +1 -0
  204. package/dist/observability/dashboard.d.ts +1 -1
  205. package/dist/observability/dashboard.js +2 -2
  206. package/dist/observability/dashboard.js.map +1 -1
  207. package/dist/offline/offline-mode.d.ts +1 -1
  208. package/dist/offline/offline-mode.js +1 -1
  209. package/dist/output/json-schema-output.d.ts +67 -0
  210. package/dist/output/json-schema-output.js +273 -0
  211. package/dist/output/json-schema-output.js.map +1 -0
  212. package/dist/persistence/session-picker.d.ts +22 -0
  213. package/dist/persistence/session-picker.js +47 -0
  214. package/dist/persistence/session-picker.js.map +1 -0
  215. package/dist/persistence/session-store.d.ts +11 -0
  216. package/dist/persistence/session-store.js +17 -0
  217. package/dist/persistence/session-store.js.map +1 -1
  218. package/dist/plugins/git-pinned-marketplace.d.ts +39 -0
  219. package/dist/plugins/git-pinned-marketplace.js +152 -0
  220. package/dist/plugins/git-pinned-marketplace.js.map +1 -0
  221. package/dist/plugins/marketplace.d.ts +1 -1
  222. package/dist/plugins/marketplace.js +1 -1
  223. package/dist/plugins/plugin-manifest.d.ts +116 -0
  224. package/dist/plugins/plugin-manifest.js +283 -0
  225. package/dist/plugins/plugin-manifest.js.map +1 -0
  226. package/dist/prompts/index.d.ts +1 -1
  227. package/dist/prompts/index.js +1 -1
  228. package/dist/providers/local-llm-provider.d.ts +1 -1
  229. package/dist/providers/local-llm-provider.js +1 -1
  230. package/dist/sandbox/os-sandbox.d.ts +49 -1
  231. package/dist/sandbox/os-sandbox.js +347 -6
  232. package/dist/sandbox/os-sandbox.js.map +1 -1
  233. package/dist/scripting/codebuddy-bindings.js +1 -1
  234. package/dist/scripting/codebuddy-bindings.js.map +1 -1
  235. package/dist/sdk/agent-sdk.d.ts +61 -0
  236. package/dist/sdk/agent-sdk.js +90 -0
  237. package/dist/sdk/agent-sdk.js.map +1 -0
  238. package/dist/security/index.d.ts +1 -1
  239. package/dist/security/index.js +1 -1
  240. package/dist/security/permission-modes.d.ts +76 -0
  241. package/dist/security/permission-modes.js +195 -0
  242. package/dist/security/permission-modes.js.map +1 -0
  243. package/dist/security/permission-patterns.d.ts +61 -0
  244. package/dist/security/permission-patterns.js +171 -0
  245. package/dist/security/permission-patterns.js.map +1 -0
  246. package/dist/security/safe-binaries.d.ts +23 -0
  247. package/dist/security/safe-binaries.js +96 -0
  248. package/dist/security/safe-binaries.js.map +1 -0
  249. package/dist/security/sender-policies.d.ts +46 -0
  250. package/dist/security/sender-policies.js +90 -0
  251. package/dist/security/sender-policies.js.map +1 -0
  252. package/dist/server/dashboard.d.ts +53 -0
  253. package/dist/server/dashboard.js +93 -0
  254. package/dist/server/dashboard.js.map +1 -0
  255. package/dist/services/system-prompt-override.d.ts +34 -0
  256. package/dist/services/system-prompt-override.js +64 -0
  257. package/dist/services/system-prompt-override.js.map +1 -0
  258. package/dist/skills/skill-enhancements.d.ts +37 -0
  259. package/dist/skills/skill-enhancements.js +69 -0
  260. package/dist/skills/skill-enhancements.js.map +1 -0
  261. package/dist/telemetry/otel-tracer.d.ts +98 -0
  262. package/dist/telemetry/otel-tracer.js +245 -0
  263. package/dist/telemetry/otel-tracer.js.map +1 -0
  264. package/dist/templates/export/html.template.js +2 -2
  265. package/dist/templates/export/markdown.template.js +1 -1
  266. package/dist/templates/export/markdown.template.js.map +1 -1
  267. package/dist/themes/default-themes.d.ts +1 -1
  268. package/dist/themes/default-themes.js +1 -1
  269. package/dist/themes/index.d.ts +1 -1
  270. package/dist/themes/index.js +1 -1
  271. package/dist/themes/theme-manager.d.ts +1 -1
  272. package/dist/themes/theme-manager.js +1 -1
  273. package/dist/themes/theme.d.ts +1 -1
  274. package/dist/themes/theme.js +1 -1
  275. package/dist/tools/browser-stub.d.ts +61 -0
  276. package/dist/tools/browser-stub.js +184 -0
  277. package/dist/tools/browser-stub.js.map +1 -0
  278. package/dist/tools/gateway-tool.d.ts +43 -0
  279. package/dist/tools/gateway-tool.js +92 -0
  280. package/dist/tools/gateway-tool.js.map +1 -0
  281. package/dist/tools/image-stub.d.ts +32 -0
  282. package/dist/tools/image-stub.js +97 -0
  283. package/dist/tools/image-stub.js.map +1 -0
  284. package/dist/tools/js-repl.d.ts +78 -0
  285. package/dist/tools/js-repl.js +280 -0
  286. package/dist/tools/js-repl.js.map +1 -0
  287. package/dist/tools/message-tool.d.ts +42 -0
  288. package/dist/tools/message-tool.js +113 -0
  289. package/dist/tools/message-tool.js.map +1 -0
  290. package/dist/types/errors.d.ts +1 -1
  291. package/dist/types/errors.js +1 -1
  292. package/dist/ui/app.js +1 -1
  293. package/dist/ui/app.js.map +1 -1
  294. package/dist/ui/cli-enhancements.d.ts +178 -0
  295. package/dist/ui/cli-enhancements.js +430 -0
  296. package/dist/ui/cli-enhancements.js.map +1 -0
  297. package/dist/ui/components/HelpSystem.d.ts +1 -1
  298. package/dist/ui/components/HelpSystem.js +1 -1
  299. package/dist/ui/context/theme-context.d.ts +1 -1
  300. package/dist/ui/context/theme-context.js +1 -1
  301. package/dist/ui/dashboard/dashboard.js +1 -1
  302. package/dist/ui/dashboard/dashboard.js.map +1 -1
  303. package/dist/ui/status-line.d.ts +90 -0
  304. package/dist/ui/status-line.js +160 -0
  305. package/dist/ui/status-line.js.map +1 -0
  306. package/dist/ui/terminal-enhancements.d.ts +34 -0
  307. package/dist/ui/terminal-enhancements.js +97 -0
  308. package/dist/ui/terminal-enhancements.js.map +1 -0
  309. package/dist/ui/ui-enhancements.d.ts +38 -0
  310. package/dist/ui/ui-enhancements.js +116 -0
  311. package/dist/ui/ui-enhancements.js.map +1 -0
  312. package/dist/undo/checkpoint-manager.d.ts +1 -1
  313. package/dist/undo/checkpoint-manager.js +1 -1
  314. package/dist/utils/codebuddy-home.d.ts +1 -1
  315. package/dist/utils/codebuddy-home.js +1 -1
  316. package/dist/utils/conversation-export.js +3 -3
  317. package/dist/utils/conversation-export.js.map +1 -1
  318. package/dist/utils/custom-commands.js +1 -1
  319. package/dist/utils/custom-instructions.js +4 -1
  320. package/dist/utils/custom-instructions.js.map +1 -1
  321. package/dist/utils/debug-logger.d.ts +1 -1
  322. package/dist/utils/debug-logger.js +1 -1
  323. package/dist/utils/errors.d.ts +2 -2
  324. package/dist/utils/errors.js +2 -2
  325. package/dist/utils/export-manager.js +3 -3
  326. package/dist/utils/export-manager.js.map +1 -1
  327. package/dist/utils/headless-output.js +1 -1
  328. package/dist/utils/headless-output.js.map +1 -1
  329. package/dist/utils/init-project.d.ts +1 -1
  330. package/dist/utils/init-project.js +20 -20
  331. package/dist/utils/init-project.js.map +1 -1
  332. package/dist/utils/logger.d.ts +1 -1
  333. package/dist/utils/logger.js +1 -1
  334. package/dist/utils/output-schema-validator.d.ts +40 -0
  335. package/dist/utils/output-schema-validator.js +137 -0
  336. package/dist/utils/output-schema-validator.js.map +1 -0
  337. package/dist/utils/safety-misc.d.ts +24 -0
  338. package/dist/utils/safety-misc.js +91 -0
  339. package/dist/utils/safety-misc.js.map +1 -0
  340. package/dist/utils/session-enhancements.d.ts +40 -0
  341. package/dist/utils/session-enhancements.js +118 -0
  342. package/dist/utils/session-enhancements.js.map +1 -0
  343. package/dist/utils/shell-completions.js +6 -6
  344. package/dist/utils/shell-snapshot.d.ts +38 -0
  345. package/dist/utils/shell-snapshot.js +323 -0
  346. package/dist/utils/shell-snapshot.js.map +1 -0
  347. package/dist/utils/stream-json-formatter.d.ts +77 -0
  348. package/dist/utils/stream-json-formatter.js +61 -0
  349. package/dist/utils/stream-json-formatter.js.map +1 -0
  350. package/dist/utils/terminal-notifications.js +1 -1
  351. package/dist/utils/terminal-notifications.js.map +1 -1
  352. package/dist/workflows/lobster-engine.d.ts +43 -0
  353. package/dist/workflows/lobster-engine.js +167 -0
  354. package/dist/workflows/lobster-engine.js.map +1 -0
  355. package/package.json +3 -6
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Output Schema Validator
3
+ *
4
+ * Validates headless mode JSON output against a JSON Schema file (draft-07 subset).
5
+ * Supports: type, properties, required, enum, pattern, minLength, maxLength,
6
+ * minimum, maximum, items, additionalProperties.
7
+ *
8
+ * No external dependencies - uses basic manual JSON Schema validation.
9
+ */
10
+ import fs from 'fs';
11
+ import path from 'path';
12
+ /**
13
+ * Load and parse a JSON Schema file from disk.
14
+ */
15
+ export function loadSchema(schemaPath) {
16
+ const resolved = path.resolve(schemaPath);
17
+ const content = fs.readFileSync(resolved, 'utf-8');
18
+ return JSON.parse(content);
19
+ }
20
+ /**
21
+ * Validate a value against a JSON Schema (draft-07 subset).
22
+ */
23
+ function validateValue(value, schema, path) {
24
+ const errors = [];
25
+ // Type check
26
+ if (schema.type !== undefined) {
27
+ const types = Array.isArray(schema.type) ? schema.type : [schema.type];
28
+ const actualType = getJSONType(value);
29
+ if (!types.includes(actualType)) {
30
+ errors.push(`${path}: expected type ${types.join(' | ')}, got ${actualType}`);
31
+ return errors; // No point checking further if type is wrong
32
+ }
33
+ }
34
+ // Enum check
35
+ if (schema.enum !== undefined) {
36
+ if (!schema.enum.some(e => JSON.stringify(e) === JSON.stringify(value))) {
37
+ errors.push(`${path}: value ${JSON.stringify(value)} not in enum [${schema.enum.map(e => JSON.stringify(e)).join(', ')}]`);
38
+ }
39
+ }
40
+ // String-specific checks
41
+ if (typeof value === 'string') {
42
+ if (schema.pattern !== undefined) {
43
+ const regex = new RegExp(schema.pattern);
44
+ if (!regex.test(value)) {
45
+ errors.push(`${path}: string "${value}" does not match pattern "${schema.pattern}"`);
46
+ }
47
+ }
48
+ if (schema.minLength !== undefined && value.length < schema.minLength) {
49
+ errors.push(`${path}: string length ${value.length} is less than minLength ${schema.minLength}`);
50
+ }
51
+ if (schema.maxLength !== undefined && value.length > schema.maxLength) {
52
+ errors.push(`${path}: string length ${value.length} exceeds maxLength ${schema.maxLength}`);
53
+ }
54
+ }
55
+ // Number-specific checks
56
+ if (typeof value === 'number') {
57
+ if (schema.minimum !== undefined && value < schema.minimum) {
58
+ errors.push(`${path}: value ${value} is less than minimum ${schema.minimum}`);
59
+ }
60
+ if (schema.maximum !== undefined && value > schema.maximum) {
61
+ errors.push(`${path}: value ${value} exceeds maximum ${schema.maximum}`);
62
+ }
63
+ }
64
+ // Object-specific checks
65
+ if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
66
+ const obj = value;
67
+ // Required properties
68
+ if (schema.required) {
69
+ for (const req of schema.required) {
70
+ if (!(req in obj)) {
71
+ errors.push(`${path}: missing required property "${req}"`);
72
+ }
73
+ }
74
+ }
75
+ // Validate properties
76
+ if (schema.properties) {
77
+ for (const [key, propSchema] of Object.entries(schema.properties)) {
78
+ if (key in obj) {
79
+ errors.push(...validateValue(obj[key], propSchema, `${path}.${key}`));
80
+ }
81
+ }
82
+ }
83
+ // Additional properties check
84
+ if (schema.additionalProperties === false && schema.properties) {
85
+ const allowed = new Set(Object.keys(schema.properties));
86
+ for (const key of Object.keys(obj)) {
87
+ if (!allowed.has(key)) {
88
+ errors.push(`${path}: unexpected additional property "${key}"`);
89
+ }
90
+ }
91
+ }
92
+ }
93
+ // Array-specific checks
94
+ if (Array.isArray(value)) {
95
+ if (schema.items) {
96
+ for (let i = 0; i < value.length; i++) {
97
+ errors.push(...validateValue(value[i], schema.items, `${path}[${i}]`));
98
+ }
99
+ }
100
+ }
101
+ return errors;
102
+ }
103
+ /**
104
+ * Get the JSON Schema type string for a value.
105
+ */
106
+ function getJSONType(value) {
107
+ if (value === null)
108
+ return 'null';
109
+ if (Array.isArray(value))
110
+ return 'array';
111
+ return typeof value; // 'string' | 'number' | 'boolean' | 'object' | 'undefined'
112
+ }
113
+ /**
114
+ * Validate output against a JSON Schema file.
115
+ *
116
+ * @param output - The parsed output value to validate
117
+ * @param schemaPath - Path to the JSON Schema file
118
+ * @returns Validation result with errors array
119
+ */
120
+ export function validateOutputSchema(output, schemaPath) {
121
+ try {
122
+ const schema = loadSchema(schemaPath);
123
+ const errors = validateValue(output, schema, '$');
124
+ return {
125
+ valid: errors.length === 0,
126
+ errors,
127
+ };
128
+ }
129
+ catch (err) {
130
+ const message = err instanceof Error ? err.message : String(err);
131
+ return {
132
+ valid: false,
133
+ errors: [`Failed to load or parse schema: ${message}`],
134
+ };
135
+ }
136
+ }
137
+ //# sourceMappingURL=output-schema-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-schema-validator.js","sourceRoot":"","sources":["../../src/utils/output-schema-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Safety & Misc Utilities
3
+ *
4
+ * NestedLaunchGuard: prevents recursive CLI launches
5
+ * ConfigBackupManager: timestamped config file backups with pruning
6
+ * FeedbackCommand: pre-filled GitHub issue URL generation
7
+ */
8
+ export declare class NestedLaunchGuard {
9
+ private envKey;
10
+ isNestedLaunch(): boolean;
11
+ setSessionMarker(sessionId: string): void;
12
+ getWarning(): string;
13
+ }
14
+ export declare class ConfigBackupManager {
15
+ createBackup(filePath: string): string;
16
+ listBackups(filePath: string): string[];
17
+ pruneBackups(filePath: string, keep?: number): string[];
18
+ restoreBackup(backupPath: string, targetPath: string): void;
19
+ }
20
+ export declare class FeedbackCommand {
21
+ getRepoUrl(): string;
22
+ generateIssueUrl(title?: string, body?: string): string;
23
+ formatFeedbackMessage(): string;
24
+ }
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Safety & Misc Utilities
3
+ *
4
+ * NestedLaunchGuard: prevents recursive CLI launches
5
+ * ConfigBackupManager: timestamped config file backups with pruning
6
+ * FeedbackCommand: pre-filled GitHub issue URL generation
7
+ */
8
+ import * as fs from 'fs';
9
+ import * as path from 'path';
10
+ import { logger } from '../utils/logger.js';
11
+ // ============================================================================
12
+ // NestedLaunchGuard
13
+ // ============================================================================
14
+ export class NestedLaunchGuard {
15
+ envKey = 'CODEBUDDY_SESSION_ID';
16
+ isNestedLaunch() {
17
+ return !!process.env[this.envKey];
18
+ }
19
+ setSessionMarker(sessionId) {
20
+ process.env[this.envKey] = sessionId;
21
+ logger.debug(`Session marker set: ${sessionId}`);
22
+ }
23
+ getWarning() {
24
+ return 'Warning: You are launching Code Buddy inside an existing session. This may cause unexpected behavior. Use a separate terminal instead.';
25
+ }
26
+ }
27
+ // ============================================================================
28
+ // ConfigBackupManager
29
+ // ============================================================================
30
+ export class ConfigBackupManager {
31
+ createBackup(filePath) {
32
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
33
+ const backupPath = `${filePath}.${timestamp}.bak`;
34
+ fs.copyFileSync(filePath, backupPath);
35
+ logger.info(`Backup created: ${backupPath}`);
36
+ return backupPath;
37
+ }
38
+ listBackups(filePath) {
39
+ const dir = path.dirname(filePath);
40
+ const base = path.basename(filePath);
41
+ if (!fs.existsSync(dir))
42
+ return [];
43
+ const files = fs.readdirSync(dir);
44
+ return files
45
+ .filter(f => f.startsWith(base + '.') && f.endsWith('.bak'))
46
+ .map(f => path.join(dir, f))
47
+ .sort();
48
+ }
49
+ pruneBackups(filePath, keep = 5) {
50
+ const backups = this.listBackups(filePath);
51
+ const toRemove = backups.slice(0, Math.max(0, backups.length - keep));
52
+ for (const bp of toRemove) {
53
+ fs.unlinkSync(bp);
54
+ logger.debug(`Pruned backup: ${bp}`);
55
+ }
56
+ return toRemove;
57
+ }
58
+ restoreBackup(backupPath, targetPath) {
59
+ fs.copyFileSync(backupPath, targetPath);
60
+ logger.info(`Restored ${backupPath} -> ${targetPath}`);
61
+ }
62
+ }
63
+ // ============================================================================
64
+ // FeedbackCommand
65
+ // ============================================================================
66
+ export class FeedbackCommand {
67
+ getRepoUrl() {
68
+ return 'https://github.com/phuetz/code-buddy/issues/new';
69
+ }
70
+ generateIssueUrl(title, body) {
71
+ const base = this.getRepoUrl();
72
+ const params = new URLSearchParams();
73
+ if (title)
74
+ params.set('title', title);
75
+ if (body)
76
+ params.set('body', body);
77
+ const qs = params.toString();
78
+ return qs ? `${base}?${qs}` : base;
79
+ }
80
+ formatFeedbackMessage() {
81
+ return [
82
+ 'We appreciate your feedback!',
83
+ '',
84
+ 'To report a bug or request a feature, open a GitHub issue:',
85
+ ` ${this.getRepoUrl()}`,
86
+ '',
87
+ 'Please include steps to reproduce and your environment details.',
88
+ ].join('\n');
89
+ }
90
+ }
91
+ //# sourceMappingURL=safety-misc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety-misc.js","sourceRoot":"","sources":["../../src/utils/safety-misc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Session & Misc Enhancements
3
+ * Per-session settings, update channels, and elevated mode management.
4
+ */
5
+ export declare class SessionPersistentSettings {
6
+ private static instance;
7
+ private sessions;
8
+ static getInstance(): SessionPersistentSettings;
9
+ static resetInstance(): void;
10
+ set(sessionId: string, key: string, value: unknown): void;
11
+ get(sessionId: string, key: string): unknown;
12
+ getAll(sessionId: string): Record<string, unknown>;
13
+ clear(sessionId: string): void;
14
+ }
15
+ export declare class UpdateChannelManager {
16
+ private static instance;
17
+ readonly channels: readonly ["stable", "beta", "dev"];
18
+ private currentChannel;
19
+ static getInstance(): UpdateChannelManager;
20
+ static resetInstance(): void;
21
+ getCurrentChannel(): string;
22
+ setChannel(channel: string): void;
23
+ getLatestVersion(channel: string): {
24
+ version: string;
25
+ channel: string;
26
+ date: string;
27
+ };
28
+ isValidChannel(channel: string): boolean;
29
+ }
30
+ export declare class ElevatedModeManager {
31
+ private static instance;
32
+ private elevated;
33
+ static getInstance(): ElevatedModeManager;
34
+ static resetInstance(): void;
35
+ isElevated(): boolean;
36
+ enable(): void;
37
+ disable(): void;
38
+ toggle(): boolean;
39
+ getWarning(): string;
40
+ }
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Session & Misc Enhancements
3
+ * Per-session settings, update channels, and elevated mode management.
4
+ */
5
+ import { logger } from './logger.js';
6
+ export class SessionPersistentSettings {
7
+ static instance = null;
8
+ sessions = new Map();
9
+ static getInstance() {
10
+ if (!SessionPersistentSettings.instance) {
11
+ SessionPersistentSettings.instance = new SessionPersistentSettings();
12
+ }
13
+ return SessionPersistentSettings.instance;
14
+ }
15
+ static resetInstance() {
16
+ SessionPersistentSettings.instance = null;
17
+ }
18
+ set(sessionId, key, value) {
19
+ if (!this.sessions.has(sessionId)) {
20
+ this.sessions.set(sessionId, new Map());
21
+ }
22
+ this.sessions.get(sessionId).set(key, value);
23
+ logger.debug(`Session ${sessionId}: set ${key}`);
24
+ }
25
+ get(sessionId, key) {
26
+ return this.sessions.get(sessionId)?.get(key);
27
+ }
28
+ getAll(sessionId) {
29
+ const map = this.sessions.get(sessionId);
30
+ if (!map)
31
+ return {};
32
+ const result = {};
33
+ for (const [k, v] of map) {
34
+ result[k] = v;
35
+ }
36
+ return result;
37
+ }
38
+ clear(sessionId) {
39
+ this.sessions.delete(sessionId);
40
+ logger.debug(`Session ${sessionId}: cleared`);
41
+ }
42
+ }
43
+ export class UpdateChannelManager {
44
+ static instance = null;
45
+ channels = ['stable', 'beta', 'dev'];
46
+ currentChannel = 'stable';
47
+ static getInstance() {
48
+ if (!UpdateChannelManager.instance) {
49
+ UpdateChannelManager.instance = new UpdateChannelManager();
50
+ }
51
+ return UpdateChannelManager.instance;
52
+ }
53
+ static resetInstance() {
54
+ UpdateChannelManager.instance = null;
55
+ }
56
+ getCurrentChannel() {
57
+ return this.currentChannel;
58
+ }
59
+ setChannel(channel) {
60
+ if (!this.isValidChannel(channel)) {
61
+ throw new Error(`Invalid channel: ${channel}. Must be one of: ${this.channels.join(', ')}`);
62
+ }
63
+ this.currentChannel = channel;
64
+ logger.debug(`Update channel set to: ${channel}`);
65
+ }
66
+ getLatestVersion(channel) {
67
+ if (!this.isValidChannel(channel)) {
68
+ throw new Error(`Invalid channel: ${channel}`);
69
+ }
70
+ // Stub implementation
71
+ const versions = {
72
+ stable: '1.0.0',
73
+ beta: '1.1.0-beta.1',
74
+ dev: '1.2.0-dev.1',
75
+ };
76
+ return {
77
+ version: versions[channel] || '0.0.0',
78
+ channel,
79
+ date: new Date().toISOString(),
80
+ };
81
+ }
82
+ isValidChannel(channel) {
83
+ return this.channels.includes(channel);
84
+ }
85
+ }
86
+ export class ElevatedModeManager {
87
+ static instance = null;
88
+ elevated = false;
89
+ static getInstance() {
90
+ if (!ElevatedModeManager.instance) {
91
+ ElevatedModeManager.instance = new ElevatedModeManager();
92
+ }
93
+ return ElevatedModeManager.instance;
94
+ }
95
+ static resetInstance() {
96
+ ElevatedModeManager.instance = null;
97
+ }
98
+ isElevated() {
99
+ return this.elevated;
100
+ }
101
+ enable() {
102
+ this.elevated = true;
103
+ logger.debug('Elevated mode enabled');
104
+ }
105
+ disable() {
106
+ this.elevated = false;
107
+ logger.debug('Elevated mode disabled');
108
+ }
109
+ toggle() {
110
+ this.elevated = !this.elevated;
111
+ logger.debug(`Elevated mode toggled to: ${this.elevated}`);
112
+ return this.elevated;
113
+ }
114
+ getWarning() {
115
+ return 'WARNING: Elevated mode bypasses safety confirmations. Use with caution.';
116
+ }
117
+ }
118
+ //# sourceMappingURL=session-enhancements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-enhancements.js","sourceRoot":"","sources":["../../src/utils/session-enhancements.ts"],"names":[],"mappings":"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"}
@@ -72,7 +72,7 @@ function generateBashCompletion() {
72
72
  const modes = APPROVAL_MODES.join(' ');
73
73
  const themes = THEMES.join(' ');
74
74
  return `#!/bin/bash
75
- # Grok CLI Bash Completion
75
+ # Code Buddy Bash Completion
76
76
  # Source this file or add to ~/.bashrc
77
77
 
78
78
  _codebuddy_completions() {
@@ -140,7 +140,7 @@ _codebuddy_theme_completions() {
140
140
  COMPREPLY=( $(compgen -W "\${themes}" -- "\${COMP_WORDS[COMP_CWORD]}") )
141
141
  }
142
142
 
143
- echo "Grok CLI bash completions loaded"
143
+ echo "Code Buddy bash completions loaded"
144
144
  `;
145
145
  }
146
146
  // ============================================================================
@@ -162,7 +162,7 @@ function generateZshCompletion() {
162
162
  const modes = APPROVAL_MODES.join(' ');
163
163
  const themes = THEMES.join(' ');
164
164
  return `#compdef grok code-buddy
165
- # Grok CLI Zsh Completion
165
+ # Code Buddy Zsh Completion
166
166
  # Save to ~/.zsh/completions/_codebuddy or /usr/local/share/zsh/site-functions/_codebuddy
167
167
 
168
168
  _codebuddy() {
@@ -245,7 +245,7 @@ function generateFishCompletion() {
245
245
  const desc = c.description.replace(/'/g, "\\'");
246
246
  return `complete -c grok -n '__fish_codebuddy_in_prompt' -a '${c.name}' -d '${desc}'`;
247
247
  }).join('\n');
248
- return `# Grok CLI Fish Completion
248
+ return `# Code Buddy Fish Completion
249
249
  # Save to ~/.config/fish/completions/grok.fish
250
250
 
251
251
  # Helper function to detect if we're in the prompt context
@@ -293,7 +293,7 @@ function generatePowerShellCompletion() {
293
293
  const models = MODELS.map(m => `'${m}'`).join(', ');
294
294
  const modes = APPROVAL_MODES.map(m => `'${m}'`).join(', ');
295
295
  const themes = THEMES.map(t => `'${t}'`).join(', ');
296
- return `# Grok CLI PowerShell Completion
296
+ return `# Code Buddy PowerShell Completion
297
297
  # Save to $PROFILE or run: grok --completions powershell | Out-File -Append $PROFILE
298
298
 
299
299
  $_codebuddyOptions = @(${CLI_OPTIONS.map(o => `'${o.name}'`).join(', ')})
@@ -375,7 +375,7 @@ Register-ArgumentCompleter -Native -CommandName grok, code-buddy -ScriptBlock {
375
375
  }
376
376
  }
377
377
 
378
- Write-Host "Grok CLI PowerShell completions loaded" -ForegroundColor Green
378
+ Write-Host "Code Buddy PowerShell completions loaded" -ForegroundColor Green
379
379
  `;
380
380
  }
381
381
  // ============================================================================
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Shell Environment Snapshots
3
+ *
4
+ * Captures the user's shell environment for better context awareness.
5
+ * Includes shell type, env vars (filtered for safety), aliases, rc files,
6
+ * and common tool versions.
7
+ *
8
+ * Can be injected into the system prompt to help the agent understand
9
+ * the user's development environment.
10
+ */
11
+ export interface ShellSnapshot {
12
+ /** Detected shell (bash, zsh, fish, sh) */
13
+ shell: string;
14
+ /** Filtered environment variables (safe ones only) */
15
+ env: Record<string, string>;
16
+ /** Parsed aliases from rc files */
17
+ aliases: string[];
18
+ /** Shell function names */
19
+ functions: string[];
20
+ /** Which rc files exist */
21
+ rcFiles: string[];
22
+ /** Node.js version */
23
+ nodeVersion?: string;
24
+ /** npm version */
25
+ npmVersion?: string;
26
+ /** Git version */
27
+ gitVersion?: string;
28
+ /** Python version */
29
+ pythonVersion?: string;
30
+ }
31
+ /**
32
+ * Capture a snapshot of the current shell environment.
33
+ */
34
+ export declare function captureShellSnapshot(): Promise<ShellSnapshot>;
35
+ /**
36
+ * Format a shell snapshot as a concise prompt string for system prompt injection.
37
+ */
38
+ export declare function formatSnapshotForPrompt(snapshot: ShellSnapshot): string;