@phuetz/code-buddy 1.1.0 → 1.3.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 (381) hide show
  1. package/README.md +211 -163
  2. package/dist/agent/autonomous/agentic-coding-contract.d.ts +12 -12
  3. package/dist/agent/base-agent.d.ts +4 -0
  4. package/dist/agent/base-agent.js +6 -0
  5. package/dist/agent/codebuddy-agent.d.ts +1 -1
  6. package/dist/agent/codebuddy-agent.js +69 -14
  7. package/dist/agent/execution/agent-executor.js +122 -12
  8. package/dist/agent/execution/tool-dependency-graph.js +7 -0
  9. package/dist/agent/execution/tool-hooks.d.ts +6 -0
  10. package/dist/agent/execution/tool-hooks.js +13 -5
  11. package/dist/agent/execution/tool-selection-strategy.d.ts +11 -2
  12. package/dist/agent/execution/tool-selection-strategy.js +67 -10
  13. package/dist/agent/extended-thinking.d.ts +8 -0
  14. package/dist/agent/extended-thinking.js +27 -0
  15. package/dist/agent/facades/infrastructure-facade.d.ts +9 -2
  16. package/dist/agent/facades/infrastructure-facade.js +15 -6
  17. package/dist/agent/hermes-browser-backends.js +151 -11
  18. package/dist/agent/hermes-claw-migrate.d.ts +59 -0
  19. package/dist/agent/hermes-claw-migrate.js +427 -26
  20. package/dist/agent/hermes-parity-manifest.js +78 -71
  21. package/dist/agent/hermes-runtime-lifecycle.d.ts +67 -0
  22. package/dist/agent/hermes-runtime-lifecycle.js +468 -0
  23. package/dist/agent/middleware/index.d.ts +1 -0
  24. package/dist/agent/middleware/index.js +1 -0
  25. package/dist/agent/middleware/visual-validation-middleware.d.ts +17 -0
  26. package/dist/agent/middleware/visual-validation-middleware.js +67 -0
  27. package/dist/agent/model-benchmark.d.ts +77 -0
  28. package/dist/agent/model-benchmark.js +309 -0
  29. package/dist/agent/model-tier.d.ts +14 -0
  30. package/dist/agent/model-tier.js +71 -0
  31. package/dist/agent/multi-agent/agents/orchestrator-agent.js +17 -6
  32. package/dist/agent/multi-agent/multi-agent-system.js +3 -1
  33. package/dist/agent/multi-agent/session-fleet-bridge.d.ts +2 -0
  34. package/dist/agent/multi-agent/session-fleet-bridge.js +9 -1
  35. package/dist/agent/multi-agent/session-tools.js +22 -5
  36. package/dist/agent/reasoning/mcts.js +20 -6
  37. package/dist/agent/self-improvement/authored-artifact-gate.d.ts +18 -0
  38. package/dist/agent/self-improvement/authored-artifact-gate.js +42 -0
  39. package/dist/agent/self-improvement/authored-tool-runtime.d.ts +27 -0
  40. package/dist/agent/self-improvement/authored-tool-runtime.js +57 -0
  41. package/dist/agent/self-improvement/authored-tool-store.d.ts +24 -0
  42. package/dist/agent/self-improvement/authored-tool-store.js +57 -0
  43. package/dist/agent/self-improvement/llm-tool-proposer.d.ts +41 -0
  44. package/dist/agent/self-improvement/llm-tool-proposer.js +136 -0
  45. package/dist/agent/self-improvement/sandbox-scorer.d.ts +17 -0
  46. package/dist/agent/self-improvement/sandbox-scorer.js +43 -0
  47. package/dist/agent/self-improvement/self-knowledge.d.ts +8 -0
  48. package/dist/agent/self-improvement/self-knowledge.js +24 -0
  49. package/dist/agent/self-improvement/skill-benchmark.d.ts +9 -0
  50. package/dist/agent/self-improvement/skill-benchmark.js +22 -0
  51. package/dist/agent/self-improvement/skill-consolidator.d.ts +71 -0
  52. package/dist/agent/self-improvement/skill-consolidator.js +137 -0
  53. package/dist/agent/self-improvement/skill-engine.d.ts +42 -0
  54. package/dist/agent/self-improvement/skill-engine.js +87 -0
  55. package/dist/agent/self-improvement/skill-gate.d.ts +19 -0
  56. package/dist/agent/self-improvement/skill-gate.js +62 -0
  57. package/dist/agent/self-improvement/skill-mutator.d.ts +74 -0
  58. package/dist/agent/self-improvement/skill-mutator.js +223 -0
  59. package/dist/agent/self-improvement/skill-proposer.d.ts +40 -0
  60. package/dist/agent/self-improvement/skill-proposer.js +82 -0
  61. package/dist/agent/self-improvement/skill-types.d.ts +41 -0
  62. package/dist/agent/self-improvement/skill-types.js +13 -0
  63. package/dist/agent/self-improvement/tool-benchmark.d.ts +10 -0
  64. package/dist/agent/self-improvement/tool-benchmark.js +37 -0
  65. package/dist/agent/self-improvement/tool-engine.d.ts +54 -0
  66. package/dist/agent/self-improvement/tool-engine.js +101 -0
  67. package/dist/agent/self-improvement/tool-gate.d.ts +20 -0
  68. package/dist/agent/self-improvement/tool-gate.js +78 -0
  69. package/dist/agent/self-improvement/tool-proposer.d.ts +31 -0
  70. package/dist/agent/self-improvement/tool-proposer.js +34 -0
  71. package/dist/agent/self-improvement/tool-skill-mutator.d.ts +40 -0
  72. package/dist/agent/self-improvement/tool-skill-mutator.js +79 -0
  73. package/dist/agent/self-improvement/tool-types.d.ts +48 -0
  74. package/dist/agent/self-improvement/tool-types.js +9 -0
  75. package/dist/agent/self-improvement/types.d.ts +3 -1
  76. package/dist/agent/session-end-flush.d.ts +6 -1
  77. package/dist/agent/session-end-flush.js +20 -4
  78. package/dist/agent/streaming/streaming-handler.d.ts +7 -0
  79. package/dist/agent/streaming/streaming-handler.js +8 -1
  80. package/dist/agent/tool-executor.js +1 -0
  81. package/dist/agent/tool-handler.d.ts +5 -0
  82. package/dist/agent/tool-handler.js +133 -4
  83. package/dist/browser-automation/browser-operator-executor.js +15 -0
  84. package/dist/browser-automation/browser-use-runner.d.ts +96 -0
  85. package/dist/browser-automation/browser-use-runner.js +492 -0
  86. package/dist/browser-automation/camofox-runner.d.ts +107 -0
  87. package/dist/browser-automation/camofox-runner.js +287 -0
  88. package/dist/channels/dingtalk/index.js +3 -0
  89. package/dist/channels/discord/client.d.ts +9 -0
  90. package/dist/channels/discord/client.js +12 -0
  91. package/dist/channels/feishu/index.d.ts +167 -1
  92. package/dist/channels/feishu/index.js +432 -7
  93. package/dist/channels/gateway-lifecycle.d.ts +132 -0
  94. package/dist/channels/gateway-lifecycle.js +219 -0
  95. package/dist/channels/google-chat/index.d.ts +5 -1
  96. package/dist/channels/google-chat/index.js +5 -1
  97. package/dist/channels/imessage/index.d.ts +14 -0
  98. package/dist/channels/imessage/index.js +64 -17
  99. package/dist/channels/index.d.ts +4 -0
  100. package/dist/channels/index.js +4 -0
  101. package/dist/channels/irc/index.d.ts +73 -3
  102. package/dist/channels/irc/index.js +446 -11
  103. package/dist/channels/line/index.js +3 -0
  104. package/dist/channels/mattermost/index.d.ts +51 -4
  105. package/dist/channels/mattermost/index.js +303 -20
  106. package/dist/channels/nextcloud-talk/index.d.ts +89 -8
  107. package/dist/channels/nextcloud-talk/index.js +367 -16
  108. package/dist/channels/nostr/index.d.ts +121 -1
  109. package/dist/channels/nostr/index.js +396 -8
  110. package/dist/channels/ntfy/index.js +3 -0
  111. package/dist/channels/qq/index.js +3 -0
  112. package/dist/channels/slash-parity.d.ts +117 -0
  113. package/dist/channels/slash-parity.js +185 -0
  114. package/dist/channels/synology-chat/index.js +3 -0
  115. package/dist/channels/teams/index.d.ts +3 -0
  116. package/dist/channels/teams/index.js +3 -0
  117. package/dist/channels/telegram/client.d.ts +9 -0
  118. package/dist/channels/telegram/client.js +12 -0
  119. package/dist/channels/twilio-voice/index.js +3 -0
  120. package/dist/channels/webchat/index.d.ts +7 -1
  121. package/dist/channels/webchat/index.js +7 -1
  122. package/dist/channels/wecom/index.js +3 -0
  123. package/dist/channels/weixin/index.js +3 -0
  124. package/dist/channels/zalo/index.js +3 -0
  125. package/dist/cli/config-loader.js +1 -1
  126. package/dist/codebuddy/client.d.ts +30 -1
  127. package/dist/codebuddy/client.js +167 -20
  128. package/dist/codebuddy/providers/provider-chatgpt-responses.d.ts +5 -0
  129. package/dist/codebuddy/providers/provider-chatgpt-responses.js +7 -1
  130. package/dist/codebuddy/providers/provider-gemini-native.js +1 -1
  131. package/dist/codebuddy/providers/provider-openai-compat.d.ts +5 -0
  132. package/dist/codebuddy/providers/provider-openai-compat.js +82 -2
  133. package/dist/codebuddy/tool-definitions/computer-control-tools.js +32 -2
  134. package/dist/codebuddy/tool-definitions/core-tools.js +3 -3
  135. package/dist/codebuddy/tool-definitions/index.d.ts +2 -1
  136. package/dist/codebuddy/tool-definitions/index.js +2 -1
  137. package/dist/codebuddy/tool-definitions/multimodal-tools.d.ts +1 -0
  138. package/dist/codebuddy/tool-definitions/multimodal-tools.js +44 -1
  139. package/dist/codebuddy/tool-definitions/windows-tools.d.ts +2 -0
  140. package/dist/codebuddy/tool-definitions/windows-tools.js +34 -0
  141. package/dist/codebuddy/tools.d.ts +8 -1
  142. package/dist/codebuddy/tools.js +67 -24
  143. package/dist/commands/cli/hermes-commands.js +108 -0
  144. package/dist/commands/cli/improve-command.js +123 -0
  145. package/dist/commands/cli/native-engine-commands.js +102 -3
  146. package/dist/commands/cli/utility-commands.js +45 -0
  147. package/dist/commands/enhanced-command-handler.js +2 -2
  148. package/dist/commands/goal-cli.d.ts +30 -0
  149. package/dist/commands/goal-cli.js +210 -27
  150. package/dist/commands/handlers/goal-handler.d.ts +9 -2
  151. package/dist/commands/handlers/goal-handler.js +36 -9
  152. package/dist/commands/handlers/infra-handlers.js +36 -0
  153. package/dist/commands/handlers/memory-handlers.js +96 -1
  154. package/dist/commands/handlers/missing-handlers.d.ts +1 -1
  155. package/dist/commands/handlers/missing-handlers.js +26 -3
  156. package/dist/commands/headless-slash.d.ts +2 -0
  157. package/dist/commands/headless-slash.js +12 -0
  158. package/dist/commands/llm-provider-resolution.d.ts +5 -3
  159. package/dist/commands/llm-provider-resolution.js +87 -33
  160. package/dist/commands/ollama.d.ts +25 -0
  161. package/dist/commands/ollama.js +100 -0
  162. package/dist/commands/provider.d.ts +5 -0
  163. package/dist/commands/provider.js +106 -55
  164. package/dist/commands/skills-cli/index.js +123 -0
  165. package/dist/commands/slash/builtin-commands.js +1 -1
  166. package/dist/commands/spec-next.js +2 -1
  167. package/dist/commands/spec-plan.js +5 -16
  168. package/dist/commands/tunnel.d.ts +2 -0
  169. package/dist/commands/tunnel.js +48 -0
  170. package/dist/companion/percepts.js +11 -1
  171. package/dist/config/config-resolver.d.ts +2 -1
  172. package/dist/config/config-resolver.js +54 -41
  173. package/dist/config/constants.d.ts +28 -0
  174. package/dist/config/constants.js +7 -0
  175. package/dist/config/env-schema.js +756 -0
  176. package/dist/config/model-tools.js +4 -4
  177. package/dist/config/toml-config.d.ts +16 -0
  178. package/dist/config/toml-config.js +3 -0
  179. package/dist/context/bootstrap-loader.js +6 -23
  180. package/dist/context/context-manager-v2.js +1 -0
  181. package/dist/context/import-directive-parser.d.ts +4 -0
  182. package/dist/context/import-directive-parser.js +51 -6
  183. package/dist/context/instruction-excludes.d.ts +30 -1
  184. package/dist/context/instruction-excludes.js +71 -1
  185. package/dist/context/jit-context.d.ts +8 -10
  186. package/dist/context/jit-context.js +28 -106
  187. package/dist/context/project-context.d.ts +90 -0
  188. package/dist/context/project-context.js +295 -0
  189. package/dist/daemon/autonomous-daemon.d.ts +1 -1
  190. package/dist/daemon/autonomous-daemon.js +3 -3
  191. package/dist/daemon/autonomous-loop.d.ts +31 -1
  192. package/dist/daemon/autonomous-loop.js +91 -4
  193. package/dist/daemon/colab-goal.js +9 -1
  194. package/dist/daemon/cron-agent-bridge.d.ts +12 -3
  195. package/dist/daemon/cron-agent-bridge.js +25 -9
  196. package/dist/desktop/codebuddy-engine-adapter.d.ts +32 -0
  197. package/dist/desktop/codebuddy-engine-adapter.js +257 -80
  198. package/dist/desktop/engine-adapter.d.ts +14 -0
  199. package/dist/desktop-automation/automation-manager.js +16 -0
  200. package/dist/desktop-automation/omniparser-runner.d.ts +63 -0
  201. package/dist/desktop-automation/omniparser-runner.js +115 -0
  202. package/dist/desktop-automation/smart-snapshot.d.ts +11 -0
  203. package/dist/desktop-automation/smart-snapshot.js +72 -5
  204. package/dist/doctor/index.js +40 -23
  205. package/dist/events/types.d.ts +11 -0
  206. package/dist/fleet/colab-store.js +14 -2
  207. package/dist/fleet/peer-session-bridge.js +50 -12
  208. package/dist/fleet/peer-tool-bridge.js +14 -0
  209. package/dist/goals/goal-decomposer.d.ts +27 -0
  210. package/dist/goals/goal-decomposer.js +293 -0
  211. package/dist/goals/goal-judge-client.d.ts +15 -0
  212. package/dist/goals/goal-judge-client.js +45 -0
  213. package/dist/goals/goal-judge.d.ts +2 -0
  214. package/dist/goals/goal-judge.js +35 -6
  215. package/dist/goals/goal-loop.d.ts +14 -0
  216. package/dist/goals/goal-loop.js +47 -2
  217. package/dist/goals/goal-manager.d.ts +6 -0
  218. package/dist/goals/goal-manager.js +67 -14
  219. package/dist/goals/goal-state.d.ts +13 -0
  220. package/dist/goals/goal-state.js +83 -13
  221. package/dist/goals/goal-store.d.ts +3 -0
  222. package/dist/goals/goal-store.js +31 -15
  223. package/dist/harness/contract.d.ts +28 -28
  224. package/dist/hooks/user-hooks.js +17 -3
  225. package/dist/identity/identity-manager.js +3 -2
  226. package/dist/index.js +481 -26
  227. package/dist/input/text-to-speech.d.ts +2 -6
  228. package/dist/input/text-to-speech.js +2 -27
  229. package/dist/integrations/screenpipe/screenpipe-client.d.ts +10 -0
  230. package/dist/integrations/screenpipe/screenpipe-client.js +12 -2
  231. package/dist/integrations/tailscale.d.ts +13 -0
  232. package/dist/integrations/tailscale.js +87 -34
  233. package/dist/knowledge/workspace-indexer.js +53 -9
  234. package/dist/mcp/client.js +1 -0
  235. package/dist/mcp/mcp-desktop-tools.d.ts +23 -0
  236. package/dist/mcp/mcp-desktop-tools.js +158 -0
  237. package/dist/mcp/mcp-resources.js +2 -3
  238. package/dist/mcp/mcp-server.js +2 -0
  239. package/dist/memory/enhanced-memory.d.ts +10 -0
  240. package/dist/memory/enhanced-memory.js +33 -2
  241. package/dist/memory/index.d.ts +3 -1
  242. package/dist/memory/index.js +4 -1
  243. package/dist/memory/memory-auto-proposer.d.ts +23 -0
  244. package/dist/memory/memory-auto-proposer.js +308 -0
  245. package/dist/memory/memory-candidate-queue.d.ts +92 -0
  246. package/dist/memory/memory-candidate-queue.js +261 -0
  247. package/dist/memory/persistent-memory.d.ts +45 -2
  248. package/dist/memory/persistent-memory.js +236 -40
  249. package/dist/ml/bayesian-qualifier.d.ts +1 -1
  250. package/dist/ml/bayesian-qualifier.js +35 -2
  251. package/dist/openclaw/gateway-bridge.js +5 -0
  252. package/dist/plugins/marketplace.d.ts +1 -0
  253. package/dist/plugins/marketplace.js +7 -0
  254. package/dist/prompts/execution-discipline.d.ts +14 -0
  255. package/dist/prompts/execution-discipline.js +29 -0
  256. package/dist/prompts/variation-injector.js +9 -2
  257. package/dist/protocols/acp/acp-agentic-runner.d.ts +7 -6
  258. package/dist/protocols/acp/acp-agentic-runner.js +115 -18
  259. package/dist/protocols/acp/acp-session-store.d.ts +23 -0
  260. package/dist/protocols/acp/acp-session-store.js +77 -0
  261. package/dist/protocols/acp/acp-stdio-server.d.ts +7 -0
  262. package/dist/protocols/acp/acp-stdio-server.js +71 -16
  263. package/dist/providers/active-llm-registry.d.ts +37 -0
  264. package/dist/providers/active-llm-registry.js +186 -0
  265. package/dist/providers/auxiliary-provider.d.ts +25 -0
  266. package/dist/providers/auxiliary-provider.js +192 -0
  267. package/dist/providers/codex-oauth.d.ts +1 -1
  268. package/dist/providers/codex-oauth.js +27 -4
  269. package/dist/providers/index.d.ts +3 -0
  270. package/dist/providers/index.js +4 -0
  271. package/dist/providers/provider-catalog.d.ts +70 -0
  272. package/dist/providers/provider-catalog.js +738 -0
  273. package/dist/providers/provider-fallback.d.ts +35 -0
  274. package/dist/providers/provider-fallback.js +171 -0
  275. package/dist/providers/xai-oauth.d.ts +128 -0
  276. package/dist/providers/xai-oauth.js +735 -0
  277. package/dist/scheduler/cron-scheduler.d.ts +15 -3
  278. package/dist/scheduler/cron-scheduler.js +53 -7
  279. package/dist/scheduler/script-runner.d.ts +2 -0
  280. package/dist/scheduler/script-runner.js +19 -4
  281. package/dist/scheduler/watchdog-handlers.js +7 -20
  282. package/dist/search/usearch-index.js +7 -2
  283. package/dist/security/tool-policy/tool-groups.js +2 -0
  284. package/dist/sensory/dreaming.d.ts +45 -0
  285. package/dist/sensory/dreaming.js +114 -0
  286. package/dist/sensory/heartbeat-scheduler.d.ts +38 -0
  287. package/dist/sensory/heartbeat-scheduler.js +72 -0
  288. package/dist/sensory/reactions.d.ts +24 -0
  289. package/dist/sensory/reactions.js +31 -0
  290. package/dist/sensory/screen-reaction.d.ts +23 -0
  291. package/dist/sensory/screen-reaction.js +59 -0
  292. package/dist/sensory/sensory-bridge.d.ts +23 -0
  293. package/dist/sensory/sensory-bridge.js +85 -0
  294. package/dist/sensory/sensory-memory.d.ts +20 -0
  295. package/dist/sensory/sensory-memory.js +39 -0
  296. package/dist/sensory/speech-reaction.d.ts +21 -0
  297. package/dist/sensory/speech-reaction.js +83 -0
  298. package/dist/sensory/vision-reaction.d.ts +31 -0
  299. package/dist/sensory/vision-reaction.js +74 -0
  300. package/dist/server/index.js +106 -2
  301. package/dist/server/routes/mobile.d.ts +12 -4
  302. package/dist/server/routes/mobile.js +116 -1
  303. package/dist/server/tls-config.d.ts +35 -0
  304. package/dist/server/tls-config.js +142 -0
  305. package/dist/server/tunnel-manager.d.ts +20 -0
  306. package/dist/server/tunnel-manager.js +58 -0
  307. package/dist/server/websocket/fleet-bridge.js +5 -0
  308. package/dist/services/prompt-builder.d.ts +11 -0
  309. package/dist/services/prompt-builder.js +124 -17
  310. package/dist/shared/engine-types.d.ts +15 -1
  311. package/dist/sidecar/sidecar-bridge.d.ts +1 -0
  312. package/dist/sidecar/sidecar-bridge.js +21 -10
  313. package/dist/skills/parser.js +3 -0
  314. package/dist/skills/skill-importer.d.ts +58 -0
  315. package/dist/skills/skill-importer.js +261 -0
  316. package/dist/skills/skill-sources.d.ts +20 -0
  317. package/dist/skills/skill-sources.js +102 -0
  318. package/dist/skills/types.d.ts +6 -0
  319. package/dist/spec/spec-store.js +8 -1
  320. package/dist/talk-mode/providers/audioreader-tts.d.ts +1 -1
  321. package/dist/talk-mode/providers/audioreader-tts.js +8 -8
  322. package/dist/templates/project-scaffolding.js +3 -2
  323. package/dist/themes/theme-schema.d.ts +10 -10
  324. package/dist/tools/application-profiles.js +38 -0
  325. package/dist/tools/bash/bash-tool.d.ts +1 -0
  326. package/dist/tools/bash/bash-tool.js +16 -2
  327. package/dist/tools/bash/command-validator.js +3 -0
  328. package/dist/tools/bash/rtk-rewrite.d.ts +16 -0
  329. package/dist/tools/bash/rtk-rewrite.js +100 -0
  330. package/dist/tools/bash/streaming-executor.js +14 -1
  331. package/dist/tools/computer-control-tool.d.ts +16 -1
  332. package/dist/tools/computer-control-tool.js +317 -5
  333. package/dist/tools/document-generator.d.ts +14 -0
  334. package/dist/tools/document-generator.js +79 -0
  335. package/dist/tools/execute-code-rpc-invoker.d.ts +26 -2
  336. package/dist/tools/execute-code-rpc-invoker.js +46 -5
  337. package/dist/tools/metadata.js +28 -0
  338. package/dist/tools/office-macro-tool.d.ts +10 -0
  339. package/dist/tools/office-macro-tool.js +93 -0
  340. package/dist/tools/register-tool-handler.d.ts +25 -0
  341. package/dist/tools/register-tool-handler.js +100 -0
  342. package/dist/tools/registry/index.d.ts +2 -1
  343. package/dist/tools/registry/index.js +2 -1
  344. package/dist/tools/registry/memory-tools.d.ts +20 -0
  345. package/dist/tools/registry/memory-tools.js +225 -3
  346. package/dist/tools/registry/multimodal-tools.js +2 -2
  347. package/dist/tools/registry/vision-tools.d.ts +33 -0
  348. package/dist/tools/registry/vision-tools.js +308 -6
  349. package/dist/tools/registry/windows-tools.d.ts +2 -0
  350. package/dist/tools/registry/windows-tools.js +47 -0
  351. package/dist/tools/registry.d.ts +6 -0
  352. package/dist/tools/registry.js +8 -0
  353. package/dist/tools/route-peer-tool.js +14 -0
  354. package/dist/tools/screenshot-tool.js +14 -2
  355. package/dist/tools/text-to-speech-tool.d.ts +1 -1
  356. package/dist/tools/text-to-speech-tool.js +2 -12
  357. package/dist/tools/tool-selector.js +3 -59
  358. package/dist/utils/config-validation/schema.d.ts +40 -7
  359. package/dist/utils/config-validation/schema.js +130 -1
  360. package/dist/utils/cost-tracker.js +21 -1
  361. package/dist/utils/disk-guard.d.ts +180 -0
  362. package/dist/utils/disk-guard.js +404 -0
  363. package/dist/utils/init-project.d.ts +7 -0
  364. package/dist/utils/init-project.js +37 -0
  365. package/dist/utils/interactive-setup.js +35 -2
  366. package/dist/utils/model-utils.js +11 -2
  367. package/dist/utils/output-sanitizer.js +11 -0
  368. package/dist/utils/provider-detector.d.ts +8 -7
  369. package/dist/utils/provider-detector.js +19 -77
  370. package/dist/utils/settings-manager.d.ts +19 -0
  371. package/dist/utils/token-display.d.ts +3 -3
  372. package/dist/utils/token-display.js +22 -4
  373. package/dist/wizard/onboarding.d.ts +39 -0
  374. package/dist/wizard/onboarding.js +433 -21
  375. package/dist/wizard/provider-onboarding.d.ts +8 -23
  376. package/dist/wizard/provider-onboarding.js +39 -158
  377. package/package.json +4 -2
  378. package/dist/plugins/provider-onboarding.d.ts +0 -23
  379. package/dist/plugins/provider-onboarding.js +0 -116
  380. package/dist/utils/kokoro-tts.d.ts +0 -8
  381. package/dist/utils/kokoro-tts.js +0 -67
@@ -1,12 +1,13 @@
1
1
  /**
2
- * Provider Onboarding
2
+ * Provider validation library
3
3
  *
4
- * Guided setup for AI providers with API key validation.
5
- * Each provider config defines the env key, base URL, and a validation
6
- * endpoint that is probed with a GET request to confirm the key works.
4
+ * Shared key/endpoint validation used by the onboarding wizard
5
+ * (`src/wizard/onboarding.ts`). Each provider config defines the env key, base
6
+ * URL, and a GET validation endpoint that is probed to confirm the key works
7
+ * AND to list the provider's available models — the same mechanism Hermes uses
8
+ * during `hermes setup` so onboarding fails fast on a bad key instead of
9
+ * persisting it and breaking the first chat.
7
10
  */
8
- import * as readline from 'readline';
9
- import { logger } from '../utils/logger.js';
10
11
  // ============================================================================
11
12
  // Provider Configs
12
13
  // ============================================================================
@@ -38,7 +39,7 @@ export const PROVIDER_CONFIGS = [
38
39
  {
39
40
  id: 'google',
40
41
  name: 'Google (Gemini)',
41
- envKey: 'GOOGLE_API_KEY',
42
+ envKey: 'GEMINI_API_KEY',
42
43
  baseUrl: 'https://generativelanguage.googleapis.com',
43
44
  validateEndpoint: '/v1beta/models',
44
45
  instructions: 'Get your API key from https://aistudio.google.com/apikey',
@@ -68,6 +69,28 @@ export const PROVIDER_CONFIGS = [
68
69
  instructions: 'Install LM Studio from https://lmstudio.ai and start the server',
69
70
  },
70
71
  ];
72
+ /**
73
+ * Map an onboarding-wizard provider id (`src/wizard/onboarding.ts`
74
+ * PROVIDER_GUIDES) to its validation config. The wizard uses friendlier ids
75
+ * (`claude`, `gemini`) than the catalog (`anthropic`, `google`), so alias them.
76
+ * OAuth/unsupported wizard ids (`chatgpt`) return undefined — they don't carry
77
+ * an API key to validate against a `/models` endpoint.
78
+ */
79
+ const GUIDE_ID_TO_CONFIG_ID = {
80
+ grok: 'grok',
81
+ openai: 'openai',
82
+ claude: 'anthropic',
83
+ anthropic: 'anthropic',
84
+ gemini: 'google',
85
+ google: 'google',
86
+ ollama: 'ollama',
87
+ lmstudio: 'lmstudio',
88
+ openrouter: 'openrouter',
89
+ };
90
+ export function getValidationConfigForGuide(guideId) {
91
+ const configId = GUIDE_ID_TO_CONFIG_ID[guideId];
92
+ return configId ? getProviderConfig(configId) : undefined;
93
+ }
71
94
  // ============================================================================
72
95
  // Validation
73
96
  // ============================================================================
@@ -114,7 +137,15 @@ export async function validateProviderKey(config, apiKey) {
114
137
  }
115
138
  if (!response.ok) {
116
139
  const errorText = await response.text().catch(() => '');
117
- if (response.status === 401 || response.status === 403) {
140
+ // Classify clear auth failures uniformly providers are inconsistent:
141
+ // OpenAI/Anthropic return 401/403, but xAI returns 400 "Incorrect API key
142
+ // provided". Without this, a plainly-bad key looks like a network blip and
143
+ // the wizard would offer to save it anyway.
144
+ const looksLikeBadKey = response.status === 401 ||
145
+ response.status === 403 ||
146
+ (response.status === 400 &&
147
+ /incorrect api key|invalid api key|invalid.*key|unauthor|api key/i.test(errorText));
148
+ if (looksLikeBadKey) {
118
149
  return { valid: false, error: 'Invalid API key (authentication failed)' };
119
150
  }
120
151
  return {
@@ -151,160 +182,10 @@ async function extractModels(config, response) {
151
182
  return [];
152
183
  }
153
184
  }
154
- // ============================================================================
155
- // Interactive Onboarding
156
- // ============================================================================
157
- /**
158
- * Run interactive onboarding for a specific provider.
159
- * Prompts for API key, validates it, and saves to the environment.
160
- */
161
- export async function runProviderOnboarding(providerId) {
162
- const config = PROVIDER_CONFIGS.find((c) => c.id === providerId);
163
- if (!config) {
164
- logger.error(`Unknown provider: ${providerId}`);
165
- return false;
166
- }
167
- const rl = readline.createInterface({
168
- input: process.stdin,
169
- output: process.stdout,
170
- });
171
- const ask = (question) => new Promise((resolve) => {
172
- rl.question(` ${question}`, (answer) => resolve(answer.trim()));
173
- });
174
- try {
175
- console.log('');
176
- console.log(` === ${config.name} Setup ===`);
177
- console.log('');
178
- console.log(` ${config.instructions}`);
179
- console.log('');
180
- // Check if already configured
181
- const existingKey = process.env[config.envKey];
182
- if (existingKey) {
183
- console.log(` ${config.envKey} is already set in your environment.`);
184
- const revalidate = await ask(' Validate existing key? (y/n) [y]: ');
185
- if (revalidate.toLowerCase() !== 'n') {
186
- console.log(' Validating...');
187
- const result = await validateProviderKey(config, existingKey);
188
- if (result.valid) {
189
- console.log(' Key is valid!');
190
- if (result.models && result.models.length > 0) {
191
- console.log(` Available models: ${result.models.slice(0, 5).join(', ')}${result.models.length > 5 ? '...' : ''}`);
192
- }
193
- rl.close();
194
- return true;
195
- }
196
- console.log(` Validation failed: ${result.error}`);
197
- }
198
- }
199
- // Local providers (Ollama, LM Studio) check connectivity only
200
- if (config.id === 'ollama' || config.id === 'lmstudio') {
201
- console.log(` Checking ${config.name} connectivity...`);
202
- const host = config.id === 'ollama'
203
- ? process.env.OLLAMA_HOST || config.baseUrl
204
- : process.env.LMSTUDIO_HOST || config.baseUrl;
205
- const result = await validateProviderKey({ ...config, baseUrl: host }, '');
206
- if (result.valid) {
207
- console.log(` ${config.name} is running and accessible!`);
208
- if (result.models && result.models.length > 0) {
209
- console.log(` Available models: ${result.models.join(', ')}`);
210
- }
211
- rl.close();
212
- return true;
213
- }
214
- console.log(` Could not connect: ${result.error}`);
215
- console.log(` Make sure ${config.name} is running.`);
216
- rl.close();
217
- return false;
218
- }
219
- // Prompt for API key
220
- const apiKey = await ask(` Enter your ${config.name} API key: `);
221
- if (!apiKey) {
222
- console.log(' No API key provided. Skipping validation.');
223
- rl.close();
224
- return false;
225
- }
226
- // Validate
227
- console.log(' Validating...');
228
- const result = await validateProviderKey(config, apiKey);
229
- if (!result.valid) {
230
- console.log(` Validation failed: ${result.error}`);
231
- console.log('');
232
- console.log(' The key was not saved. Please check your API key and try again.');
233
- rl.close();
234
- return false;
235
- }
236
- console.log(' Key is valid!');
237
- if (result.models && result.models.length > 0) {
238
- console.log(` Available models: ${result.models.slice(0, 5).join(', ')}${result.models.length > 5 ? ` (+${result.models.length - 5} more)` : ''}`);
239
- }
240
- // Set in process environment (for current session)
241
- process.env[config.envKey] = apiKey;
242
- console.log('');
243
- console.log(` ${config.envKey} set for this session.`);
244
- console.log(` To persist, add to your shell profile: export ${config.envKey}="${apiKey}"`);
245
- console.log('');
246
- rl.close();
247
- return true;
248
- }
249
- catch (err) {
250
- const msg = err instanceof Error ? err.message : String(err);
251
- logger.error('Provider onboarding failed', { provider: providerId, error: msg });
252
- rl.close();
253
- return false;
254
- }
255
- }
256
- /**
257
- * Run interactive onboarding that lets the user choose a provider.
258
- */
259
- export async function runFullProviderOnboarding() {
260
- const rl = readline.createInterface({
261
- input: process.stdin,
262
- output: process.stdout,
263
- });
264
- const askChoice = (question, choices) => new Promise((resolve) => {
265
- console.log(`\n ${question}`);
266
- choices.forEach((c, i) => console.log(` ${i + 1}. ${c}`));
267
- rl.question(` Choice [1]: `, (answer) => {
268
- const idx = parseInt(answer) - 1;
269
- resolve(idx >= 0 && idx < choices.length ? idx : 0);
270
- });
271
- });
272
- try {
273
- console.log('');
274
- console.log(' === Provider Onboarding ===');
275
- console.log('');
276
- const choiceIdx = await askChoice('Which AI provider would you like to set up?', PROVIDER_CONFIGS.map((c) => `${c.name} (${c.envKey})`));
277
- rl.close();
278
- const config = PROVIDER_CONFIGS[choiceIdx];
279
- if (!config) {
280
- logger.error('No provider configuration available to onboard');
281
- return false;
282
- }
283
- return await runProviderOnboarding(config.id);
284
- }
285
- catch (err) {
286
- const msg = err instanceof Error ? err.message : String(err);
287
- logger.error('Full provider onboarding failed', { error: msg });
288
- rl.close();
289
- return false;
290
- }
291
- }
292
185
  /**
293
186
  * Get a provider config by ID.
294
187
  */
295
188
  export function getProviderConfig(providerId) {
296
189
  return PROVIDER_CONFIGS.find((c) => c.id === providerId);
297
190
  }
298
- /**
299
- * List all configured providers (those with env keys set).
300
- */
301
- export function listConfiguredProviders() {
302
- return PROVIDER_CONFIGS.filter((c) => {
303
- if (c.id === 'ollama' || c.id === 'lmstudio') {
304
- // Local providers are always "available" (may not be running)
305
- return true;
306
- }
307
- return !!process.env[c.envKey];
308
- });
309
- }
310
191
  //# sourceMappingURL=provider-onboarding.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phuetz/code-buddy",
3
- "version": "1.1.0",
3
+ "version": "1.3.0",
4
4
  "description": "Open-source multi-provider AI coding agent for the terminal. Supports Grok, Claude, ChatGPT, Gemini, Ollama and LM Studio with 52+ tools, multi-channel messaging, skills system, and Enterprise-grade architecture.",
5
5
  "author": "Patrice Huetz <patrice.huetz@gmail.com>",
6
6
  "repository": {
@@ -69,6 +69,7 @@
69
69
  "test": "vitest run",
70
70
  "test:watch": "vitest",
71
71
  "test:coverage": "vitest run --coverage",
72
+ "test:real": "RUN_REAL_TESTS=1 vitest run",
72
73
  "lint": "eslint . --ext .js,.jsx,.ts,.tsx",
73
74
  "lint:fix": "eslint . --ext .js,.jsx,.ts,.tsx --fix",
74
75
  "format": "prettier --write \"src/**/*.{ts,tsx,js,jsx,json,md}\"",
@@ -137,6 +138,8 @@
137
138
  "@huggingface/transformers": "^4.2.0",
138
139
  "@iarna/toml": "^2.2.5",
139
140
  "@modelcontextprotocol/sdk": "^1.24.3",
141
+ "@ngrok/ngrok": "^1.7.0",
142
+ "@noble/curves": "^1.9.7",
140
143
  "@opentelemetry/api": "^1.9.0",
141
144
  "@opentelemetry/exporter-trace-otlp-http": "^0.212.0",
142
145
  "@opentelemetry/instrumentation-http": "^0.212.0",
@@ -160,7 +163,6 @@
160
163
  "google-auth-library": "^10.6.2",
161
164
  "ignore": "^5.3.2",
162
165
  "ink": "^4.4.1",
163
- "kokoro-js": "^1.2.1",
164
166
  "marked": "^15.0.12",
165
167
  "marked-terminal": "^7.3.0",
166
168
  "ml-matrix": "^6.12.2",
@@ -1,23 +0,0 @@
1
- /**
2
- * Provider Onboarding Orchestrator
3
- *
4
- * Runs the 5-phase provider onboarding lifecycle:
5
- * 1. auth — validate credentials
6
- * 2. wizard.onboarding — interactive setup
7
- * 3. discovery.run — discover available models
8
- * 4. wizard.modelPicker — let user pick a model
9
- * 5. onModelSelected — post-selection hook
10
- *
11
- * Phases that are not implemented by the provider are silently skipped.
12
- * An auth failure short-circuits the entire pipeline.
13
- *
14
- * Native Engine v2026.3.19 — Provider Plugin Onboarding Architecture.
15
- */
16
- import type { PluginProvider, OnboardingResult } from './types.js';
17
- /**
18
- * Run the full provider onboarding lifecycle.
19
- *
20
- * @param provider - The plugin provider with optional onboarding hooks
21
- * @returns An OnboardingResult summarising the outcome
22
- */
23
- export declare function runProviderOnboarding(provider: PluginProvider): Promise<OnboardingResult>;
@@ -1,116 +0,0 @@
1
- /**
2
- * Provider Onboarding Orchestrator
3
- *
4
- * Runs the 5-phase provider onboarding lifecycle:
5
- * 1. auth — validate credentials
6
- * 2. wizard.onboarding — interactive setup
7
- * 3. discovery.run — discover available models
8
- * 4. wizard.modelPicker — let user pick a model
9
- * 5. onModelSelected — post-selection hook
10
- *
11
- * Phases that are not implemented by the provider are silently skipped.
12
- * An auth failure short-circuits the entire pipeline.
13
- *
14
- * Native Engine v2026.3.19 — Provider Plugin Onboarding Architecture.
15
- */
16
- import { logger } from '../utils/logger.js';
17
- /**
18
- * Run the full provider onboarding lifecycle.
19
- *
20
- * @param provider - The plugin provider with optional onboarding hooks
21
- * @returns An OnboardingResult summarising the outcome
22
- */
23
- export async function runProviderOnboarding(provider) {
24
- const hooks = provider.onboarding;
25
- if (!hooks) {
26
- return { success: true, message: 'No onboarding hooks defined — skipped' };
27
- }
28
- const tag = `[onboarding:${provider.id}]`;
29
- // ── Phase 1: auth ─────────────────────────────────────────────────────
30
- if (hooks.auth) {
31
- logger.debug(`${tag} Phase 1/5 — auth`);
32
- try {
33
- const authResult = await hooks.auth();
34
- if (!authResult.valid) {
35
- const reason = authResult.error ?? 'unknown auth error';
36
- logger.warn(`${tag} Auth failed: ${reason}`);
37
- return { success: false, message: `Auth failed: ${reason}` };
38
- }
39
- logger.debug(`${tag} Auth succeeded`);
40
- }
41
- catch (err) {
42
- const msg = err instanceof Error ? err.message : String(err);
43
- logger.warn(`${tag} Auth threw: ${msg}`);
44
- return { success: false, message: `Auth error: ${msg}` };
45
- }
46
- }
47
- // ── Phase 2: wizard.onboarding ────────────────────────────────────────
48
- let wizardConfig;
49
- if (hooks['wizard.onboarding']) {
50
- logger.debug(`${tag} Phase 2/5 — wizard.onboarding`);
51
- try {
52
- const wizardResult = await hooks['wizard.onboarding']();
53
- if (!wizardResult.success) {
54
- logger.warn(`${tag} Onboarding wizard failed: ${wizardResult.message ?? 'unknown'}`);
55
- return wizardResult;
56
- }
57
- wizardConfig = wizardResult.config;
58
- logger.debug(`${tag} Onboarding wizard succeeded`);
59
- }
60
- catch (err) {
61
- const msg = err instanceof Error ? err.message : String(err);
62
- logger.warn(`${tag} Onboarding wizard threw: ${msg}`);
63
- return { success: false, message: `Onboarding error: ${msg}` };
64
- }
65
- }
66
- // ── Phase 3: discovery.run ────────────────────────────────────────────
67
- let models = [];
68
- if (hooks['discovery.run']) {
69
- logger.debug(`${tag} Phase 3/5 — discovery.run`);
70
- try {
71
- models = await hooks['discovery.run']();
72
- logger.debug(`${tag} Discovered ${models.length} model(s)`);
73
- }
74
- catch (err) {
75
- const msg = err instanceof Error ? err.message : String(err);
76
- logger.warn(`${tag} Discovery threw: ${msg}`);
77
- return { success: false, message: `Discovery error: ${msg}` };
78
- }
79
- }
80
- // ── Phase 4: wizard.modelPicker ───────────────────────────────────────
81
- let selectedModel;
82
- if (hooks['wizard.modelPicker'] && models.length > 0) {
83
- logger.debug(`${tag} Phase 4/5 — wizard.modelPicker`);
84
- try {
85
- selectedModel = await hooks['wizard.modelPicker'](models);
86
- logger.debug(`${tag} User selected model: ${selectedModel}`);
87
- }
88
- catch (err) {
89
- const msg = err instanceof Error ? err.message : String(err);
90
- logger.warn(`${tag} Model picker threw: ${msg}`);
91
- return { success: false, message: `Model picker error: ${msg}` };
92
- }
93
- }
94
- // ── Phase 5: onModelSelected ──────────────────────────────────────────
95
- if (hooks.onModelSelected && selectedModel) {
96
- logger.debug(`${tag} Phase 5/5 — onModelSelected`);
97
- try {
98
- await hooks.onModelSelected(selectedModel);
99
- logger.debug(`${tag} onModelSelected completed`);
100
- }
101
- catch (err) {
102
- const msg = err instanceof Error ? err.message : String(err);
103
- logger.warn(`${tag} onModelSelected threw: ${msg}`);
104
- return { success: false, message: `Post-selection error: ${msg}` };
105
- }
106
- }
107
- return {
108
- success: true,
109
- config: {
110
- ...wizardConfig,
111
- ...(selectedModel ? { selectedModel } : {}),
112
- },
113
- message: `Onboarding completed for ${provider.name}`,
114
- };
115
- }
116
- //# sourceMappingURL=provider-onboarding.js.map
@@ -1,8 +0,0 @@
1
- export declare class KokoroTTSService {
2
- private tts;
3
- private initializing;
4
- private init;
5
- generateSpeech(text: string, voice?: string): Promise<Buffer>;
6
- private float32ArrayToWav;
7
- }
8
- export declare const kokoroTtsService: KokoroTTSService;
@@ -1,67 +0,0 @@
1
- import { KokoroTTS } from 'kokoro-js';
2
- import { logger } from './logger.js';
3
- export class KokoroTTSService {
4
- tts = null;
5
- initializing = null;
6
- async init() {
7
- if (this.tts)
8
- return;
9
- if (this.initializing) {
10
- return this.initializing;
11
- }
12
- this.initializing = (async () => {
13
- logger.info('[KokoroTTS] Initializing Kokoro TTS (downloading model if not cached)...');
14
- this.tts = await KokoroTTS.from_pretrained('hexgrad/Kokoro-82M', {
15
- dtype: 'q8',
16
- device: 'cpu',
17
- });
18
- logger.info('[KokoroTTS] Kokoro TTS successfully initialized');
19
- })();
20
- await this.initializing;
21
- this.initializing = null;
22
- }
23
- async generateSpeech(text, voice = 'af_bella') {
24
- await this.init();
25
- if (!this.tts) {
26
- throw new Error('TTS engine not initialized');
27
- }
28
- logger.info(`[KokoroTTS] Generating speech for text length: ${text.length} with voice: ${voice}`);
29
- const result = await this.tts.generate(text, { voice: voice });
30
- // Convert Float32Array to 16-bit PCM WAV
31
- return this.float32ArrayToWav(result.audio, result.sampling_rate);
32
- }
33
- float32ArrayToWav(audioData, sampleRate) {
34
- const numChannels = 1; // Kokoro outputs mono audio
35
- const byteRate = sampleRate * numChannels * 2;
36
- const blockAlign = numChannels * 2;
37
- const dataSize = audioData.length * 2;
38
- const buffer = Buffer.alloc(44 + dataSize);
39
- // RIFF chunk descriptor
40
- buffer.write('RIFF', 0);
41
- buffer.writeUInt32LE(36 + dataSize, 4);
42
- buffer.write('WAVE', 8);
43
- // fmt sub-chunk
44
- buffer.write('fmt ', 12);
45
- buffer.writeUInt32LE(16, 16); // Subchunk1Size (16 for PCM)
46
- buffer.writeUInt16LE(1, 20); // AudioFormat (1 for PCM)
47
- buffer.writeUInt16LE(numChannels, 22); // NumChannels
48
- buffer.writeUInt32LE(sampleRate, 24); // SampleRate
49
- buffer.writeUInt32LE(byteRate, 28); // ByteRate
50
- buffer.writeUInt16LE(blockAlign, 32); // BlockAlign
51
- buffer.writeUInt16LE(16, 34); // BitsPerSample
52
- // data sub-chunk
53
- buffer.write('data', 36);
54
- buffer.writeUInt32LE(dataSize, 40);
55
- // Write PCM data
56
- let offset = 44;
57
- for (const sample of audioData) {
58
- const s = Math.max(-1, Math.min(1, sample));
59
- const val = s < 0 ? s * 0x8000 : s * 0x7FFF;
60
- buffer.writeInt16LE(val, offset);
61
- offset += 2;
62
- }
63
- return buffer;
64
- }
65
- }
66
- export const kokoroTtsService = new KokoroTTSService();
67
- //# sourceMappingURL=kokoro-tts.js.map