@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
@@ -688,6 +688,129 @@ export function registerSkillsCommands(program) {
688
688
  console.log(` ! ${error}`);
689
689
  }
690
690
  });
691
+ // ── Import external skills (Hermes / a repository), firewall-gated ──────────
692
+ skills
693
+ .command('import')
694
+ .description('Import external skills from a directory or a named source (firewall-gated)')
695
+ .option('--dir <path>', 'import from a local directory')
696
+ .option('--source <name>', 'import from a named source (see `skills sources`)')
697
+ .option('--apply', 'install (default is a dry run)')
698
+ .option('--include-review', "also import skills the firewall flags as 'review'")
699
+ .option('--overwrite', 'overwrite an already-imported skill')
700
+ .option('--category <c>', 'only import skills whose path contains this')
701
+ .option('--json', 'output JSON')
702
+ .action(async (opts) => {
703
+ const { importSkills } = await import('../../skills/skill-importer.js');
704
+ const { getSource, resolveSourceDir } = await import('../../skills/skill-sources.js');
705
+ let dir;
706
+ let label = 'import';
707
+ if (opts.dir) {
708
+ dir = opts.dir.startsWith('~') ? path.join(os.homedir(), opts.dir.slice(1)) : opts.dir;
709
+ label = path.basename(dir);
710
+ }
711
+ else if (opts.source) {
712
+ const src = getSource(opts.source);
713
+ if (!src) {
714
+ console.log(`Unknown source: ${opts.source} (see \`buddy skills sources list\`)`);
715
+ return;
716
+ }
717
+ dir = resolveSourceDir(src);
718
+ label = src.name;
719
+ }
720
+ else {
721
+ console.log('Specify --dir <path> or --source <name>.');
722
+ return;
723
+ }
724
+ const fs = await import('fs');
725
+ if (!fs.existsSync(dir)) {
726
+ console.log(`Directory not found: ${dir}`);
727
+ return;
728
+ }
729
+ const report = importSkills(dir, {
730
+ source: label,
731
+ dryRun: opts.apply !== true,
732
+ includeReview: opts.includeReview === true,
733
+ overwrite: opts.overwrite === true,
734
+ ...(opts.category ? { category: opts.category } : {}),
735
+ });
736
+ if (opts.json) {
737
+ console.log(JSON.stringify({ source: label, report }, null, 2));
738
+ return;
739
+ }
740
+ console.log(report.dryRun ? `Dry run (use --apply to install) — "${label}"` : `Imported from "${label}"`);
741
+ console.log(` ${report.dryRun ? 'would import' : 'imported'}: ${report.imported.length} · quarantined: ${report.quarantined.length} · review: ${report.review.length} · skipped: ${report.skipped.length}`);
742
+ if (report.quarantined.length) {
743
+ console.log(' ⚠️ quarantined by firewall:');
744
+ for (const q of report.quarantined.slice(0, 15))
745
+ console.log(` - ${q.sourcePath}`);
746
+ }
747
+ if (report.imported.length) {
748
+ console.log(` ✓ ${report.dryRun ? 'would import' : 'imported'}:`);
749
+ for (const s of report.imported.slice(0, 30))
750
+ console.log(` - ${s.name}`);
751
+ }
752
+ });
753
+ skills
754
+ .command('imported')
755
+ .description('List imported skills (with provenance + pinned status)')
756
+ .option('--json', 'output JSON')
757
+ .action(async (opts) => {
758
+ const fs = await import('fs');
759
+ const { parseSkillFile } = await import('../../skills/parser.js');
760
+ const root = path.join(os.homedir(), '.codebuddy', 'skills', 'managed');
761
+ const items = [];
762
+ if (fs.existsSync(root)) {
763
+ for (const e of fs.readdirSync(root, { withFileTypes: true })) {
764
+ if (!e.isDirectory() || !e.name.startsWith('imported-'))
765
+ continue;
766
+ const md = path.join(root, e.name, 'SKILL.md');
767
+ if (!fs.existsSync(md))
768
+ continue;
769
+ let pinned = false;
770
+ let source;
771
+ try {
772
+ const sk = parseSkillFile(fs.readFileSync(md, 'utf-8'), md, 'managed');
773
+ pinned = sk.metadata.pinned === true;
774
+ source = sk.metadata.source;
775
+ }
776
+ catch { /* ignore */ }
777
+ items.push({ name: e.name, pinned, ...(source ? { source } : {}) });
778
+ }
779
+ }
780
+ if (opts.json) {
781
+ console.log(JSON.stringify({ imported: items }, null, 2));
782
+ return;
783
+ }
784
+ console.log(items.length ? items.map((s) => ` ${s.pinned ? '📌' : ' '} ${s.name}${s.source ? ` (source: ${s.source})` : ''}`).join('\n') : 'No imported skills');
785
+ });
786
+ const sources = skills.command('sources').description('Manage skill sources (the import referential)');
787
+ sources
788
+ .command('list')
789
+ .option('--json', 'output JSON')
790
+ .action(async (opts) => {
791
+ const { listSources } = await import('../../skills/skill-sources.js');
792
+ const list = listSources();
793
+ if (opts.json) {
794
+ console.log(JSON.stringify({ sources: list }, null, 2));
795
+ return;
796
+ }
797
+ console.log(list.length ? list.map((s) => ` ${s.name} [${s.type}] ${s.location}`).join('\n') : 'No skill sources configured');
798
+ });
799
+ sources
800
+ .command('add <name> <location>')
801
+ .description('Register a skill source (a local dir or a git url)')
802
+ .option('--type <type>', "'dir' or 'git'")
803
+ .action(async (name, location, opts) => {
804
+ const { addSource } = await import('../../skills/skill-sources.js');
805
+ const src = addSource(name, location, opts.type);
806
+ console.log(`Added source ${src.name} [${src.type}] → ${src.location}`);
807
+ });
808
+ sources
809
+ .command('remove <name>')
810
+ .action(async (name) => {
811
+ const { removeSource } = await import('../../skills/skill-sources.js');
812
+ console.log(removeSource(name) ? `Removed source ${name}` : `No such source: ${name}`);
813
+ });
691
814
  }
692
815
  async function toggleSkill(name, enabled, opts) {
693
816
  const { getSkillsHub } = await import('../../skills/hub.js');
@@ -42,7 +42,7 @@ const coreCommands = [
42
42
  },
43
43
  {
44
44
  name: 'init',
45
- description: 'Initialize .codebuddy directory with templates',
45
+ description: 'Scaffold .codebuddy, then analyze the repo and write a tailored AGENTS.md (use `--fast` for the deterministic template only)',
46
46
  prompt: '__INIT_GROK__',
47
47
  filePath: '',
48
48
  isBuiltin: true
@@ -163,7 +163,8 @@ function pickStory(store, projectId, explicitId) {
163
163
  }
164
164
  return story;
165
165
  }
166
- const approved = store.listStories(projectId, 'approved'); // oldest first (createdAt)
166
+ const approved = store.listStories(projectId, 'approved')
167
+ .sort((a, b) => a.createdAt - b.createdAt || a.id.localeCompare(b.id));
167
168
  const first = approved[0];
168
169
  if (!first) {
169
170
  console.log('No approved stories. Approve one with: buddy spec story approve <id> --by <name>');
@@ -18,7 +18,7 @@ import { Command } from 'commander';
18
18
  import { getSpecStore } from '../spec/spec-store.js';
19
19
  import { startSpecPlan, advanceSpecPlan, runSpecPlanToCompletion, } from '../spec/spec-plan-runner.js';
20
20
  import { getSettingsManager } from '../utils/settings-manager.js';
21
- import { PROVIDERS } from './provider.js';
21
+ import { resolveCommandProvider } from './llm-provider-resolution.js';
22
22
  /**
23
23
  * Build the `plan` sub-command group.
24
24
  * @param llmProvider override for tests; defaults to a real CodeBuddyClient.
@@ -150,23 +150,12 @@ function printAdvanceResult(store, projectId, result) {
150
150
  // ============================================================================
151
151
  async function defaultLlmProvider() {
152
152
  const settingsManager = getSettingsManager();
153
- const userSettings = settingsManager.loadUserSettings();
154
- const providerKey = userSettings.provider || 'grok';
155
- const providerInfo = PROVIDERS[providerKey];
156
- let apiKey = process.env[providerInfo?.envVar || ''] || '';
157
- if (!apiKey) {
158
- apiKey =
159
- process.env.GROK_API_KEY ||
160
- process.env.ANTHROPIC_API_KEY ||
161
- process.env.OPENAI_API_KEY ||
162
- process.env.GEMINI_API_KEY ||
163
- '';
164
- }
165
- if (!apiKey)
153
+ const resolved = resolveCommandProvider();
154
+ if (!resolved)
166
155
  throw new Error('No API key configured. Run: buddy onboard');
167
156
  const { CodeBuddyClient } = await import('../codebuddy/client.js');
168
- const model = settingsManager.getCurrentModel() || providerInfo?.defaultModel;
169
- const client = new CodeBuddyClient(apiKey, model, providerInfo?.baseURL);
157
+ const model = settingsManager.getCurrentModel() || resolved.model;
158
+ const client = new CodeBuddyClient(resolved.apiKey, model, resolved.baseURL);
170
159
  return async (system, user) => {
171
160
  const response = await client.chat([
172
161
  { role: 'system', content: system },
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function createTunnelCommand(): Command;
@@ -0,0 +1,48 @@
1
+ import { Command } from 'commander';
2
+ import { TunnelManager } from '../server/tunnel-manager.js';
3
+ import { logger } from '../utils/logger.js';
4
+ export function createTunnelCommand() {
5
+ const cmd = new Command('tunnel')
6
+ .description('Manage ngrok tunnels for the Code Buddy remote gateway');
7
+ cmd.command('start')
8
+ .description('Start an ngrok tunnel')
9
+ .option('-p, --port <number>', 'Port to tunnel to', '3000')
10
+ .option('--domain <string>', 'Custom ngrok domain')
11
+ .option('--authtoken <string>', 'ngrok authtoken (or set NGROK_AUTHTOKEN env var)')
12
+ .option('--server', 'Start the local HTTP server along with the tunnel')
13
+ .action(async (opts) => {
14
+ const port = parseInt(opts.port, 10);
15
+ if (opts.server) {
16
+ // dynamically import server to start it
17
+ try {
18
+ const { startServer } = await import('../server/index.js');
19
+ await startServer({ port });
20
+ logger.info(`Local server started on port ${port}`);
21
+ }
22
+ catch (error) {
23
+ logger.error('Failed to start local server', { error });
24
+ process.exit(1);
25
+ }
26
+ }
27
+ try {
28
+ const url = await TunnelManager.startTunnel({
29
+ port,
30
+ domain: opts.domain,
31
+ authtoken: opts.authtoken,
32
+ });
33
+ console.log(`\nTunnel started successfully!`);
34
+ console.log(`Forwarding: ${url} -> http://localhost:${port}\n`);
35
+ // Keep process alive if just tunneling
36
+ process.on('SIGINT', async () => {
37
+ await TunnelManager.stopTunnel();
38
+ process.exit(0);
39
+ });
40
+ }
41
+ catch (error) {
42
+ console.error('Failed to start tunnel:', error instanceof Error ? error.message : String(error));
43
+ process.exit(1);
44
+ }
45
+ });
46
+ return cmd;
47
+ }
48
+ //# sourceMappingURL=tunnel.js.map
@@ -1,4 +1,4 @@
1
- import { appendFile, mkdir, readFile, stat } from 'fs/promises';
1
+ import { appendFile, mkdir, readFile, rename, stat } from 'fs/promises';
2
2
  import * as crypto from 'crypto';
3
3
  import * as path from 'path';
4
4
  const DEFAULT_RECENT_LIMIT = 10;
@@ -138,6 +138,16 @@ export async function recordCompanionPercept(input, options = {}) {
138
138
  }
139
139
  : percept;
140
140
  await mkdir(path.dirname(storePath), { recursive: true });
141
+ // Rotate when large (the disk-guard lesson, mirroring dreams.jsonl): a long-running
142
+ // companion appends a percept per event, so cap growth + keep one backup.
143
+ try {
144
+ const info = await stat(storePath);
145
+ if (info.size > 1024 * 1024)
146
+ await rename(storePath, `${storePath}.1`);
147
+ }
148
+ catch {
149
+ /* no file yet */
150
+ }
141
151
  await appendFile(storePath, `${JSON.stringify(storedPercept)}\n`, 'utf8');
142
152
  return percept;
143
153
  }
@@ -44,9 +44,10 @@ export declare class ConfigResolver extends EventEmitter {
44
44
  private resolveFromProfile;
45
45
  /**
46
46
  * Resolve from environment variables
47
- * Priority: Gemini > Grok > OpenAI > Anthropic
47
+ * Priority comes from the runtime provider catalog.
48
48
  */
49
49
  private resolveFromEnv;
50
+ private normalizeDetectedProvider;
50
51
  /**
51
52
  * Get built-in default configuration
52
53
  */
@@ -11,6 +11,7 @@
11
11
  */
12
12
  import { EventEmitter } from 'events';
13
13
  import { logger } from '../utils/logger.js';
14
+ import { detectProviderFromEnv } from '../utils/provider-detector.js';
14
15
  import { DEFAULT_PROFILES, DEFAULT_CONNECTION_CONFIG, } from './types.js';
15
16
  // ============================================================================
16
17
  // Config Resolver
@@ -121,49 +122,16 @@ export class ConfigResolver extends EventEmitter {
121
122
  }
122
123
  /**
123
124
  * Resolve from environment variables
124
- * Priority: Gemini > Grok > OpenAI > Anthropic
125
+ * Priority comes from the runtime provider catalog.
125
126
  */
126
127
  resolveFromEnv() {
127
- // Check Gemini first (preferred)
128
- const geminiKey = process.env.GOOGLE_API_KEY || process.env.GEMINI_API_KEY;
129
- if (geminiKey) {
128
+ const detected = detectProviderFromEnv();
129
+ if (detected) {
130
130
  return {
131
- baseURL: 'https://generativelanguage.googleapis.com/v1beta',
132
- apiKey: geminiKey,
133
- model: process.env.GEMINI_MODEL || 'gemini-2.5-flash',
134
- provider: 'gemini',
135
- source: 'environment',
136
- };
137
- }
138
- // Check Grok
139
- const grokKey = process.env.GROK_API_KEY || process.env.XAI_API_KEY;
140
- if (grokKey) {
141
- const baseURL = process.env.GROK_BASE_URL || 'https://api.x.ai/v1';
142
- return {
143
- baseURL,
144
- apiKey: grokKey,
145
- model: process.env.GROK_MODEL || 'grok-code-fast-1',
146
- provider: 'grok',
147
- source: 'environment',
148
- };
149
- }
150
- // Check OpenAI
151
- if (process.env.OPENAI_API_KEY) {
152
- return {
153
- baseURL: 'https://api.openai.com/v1',
154
- apiKey: process.env.OPENAI_API_KEY,
155
- model: process.env.OPENAI_MODEL || 'gpt-4o',
156
- provider: 'openai',
157
- source: 'environment',
158
- };
159
- }
160
- // Check Anthropic
161
- if (process.env.ANTHROPIC_API_KEY) {
162
- return {
163
- baseURL: 'https://api.anthropic.com/v1',
164
- apiKey: process.env.ANTHROPIC_API_KEY,
165
- model: process.env.ANTHROPIC_MODEL || 'claude-sonnet-4-20250514',
166
- provider: 'claude',
131
+ baseURL: detected.baseURL,
132
+ apiKey: detected.apiKey,
133
+ model: detected.defaultModel,
134
+ provider: this.normalizeDetectedProvider(detected.provider),
167
135
  source: 'environment',
168
136
  };
169
137
  }
@@ -177,6 +145,13 @@ export class ConfigResolver extends EventEmitter {
177
145
  source: 'environment',
178
146
  };
179
147
  }
148
+ normalizeDetectedProvider(provider) {
149
+ if (provider === 'anthropic')
150
+ return 'claude';
151
+ if (provider === 'unknown')
152
+ return 'grok';
153
+ return provider;
154
+ }
180
155
  /**
181
156
  * Get built-in default configuration
182
157
  */
@@ -215,6 +190,44 @@ export class ConfigResolver extends EventEmitter {
215
190
  return 'together';
216
191
  if (urlLower.includes('fireworks.ai'))
217
192
  return 'fireworks';
193
+ if (urlLower.includes('openrouter.ai'))
194
+ return 'openrouter';
195
+ if (urlLower.includes('novita.ai'))
196
+ return 'novita';
197
+ if (urlLower.includes('z.ai') || urlLower.includes('bigmodel'))
198
+ return 'zai';
199
+ if (urlLower.includes('moonshot.ai'))
200
+ return 'kimi-coding';
201
+ if (urlLower.includes('moonshot.cn'))
202
+ return 'kimi-coding-cn';
203
+ if (urlLower.includes('arcee.ai'))
204
+ return 'arcee';
205
+ if (urlLower.includes('gmi-serving.com'))
206
+ return 'gmi';
207
+ if (urlLower.includes('minimax.io'))
208
+ return 'minimax';
209
+ if (urlLower.includes('minimaxi.com'))
210
+ return 'minimax-cn';
211
+ if (urlLower.includes('dashscope') || urlLower.includes('aliyuncs.com'))
212
+ return 'alibaba';
213
+ if (urlLower.includes('kilo.ai'))
214
+ return 'kilocode';
215
+ if (urlLower.includes('xiaomimimo.com'))
216
+ return 'xiaomi';
217
+ if (urlLower.includes('tencentmaas.com'))
218
+ return 'tencent-tokenhub';
219
+ if (urlLower.includes('opencode.ai/zen/go'))
220
+ return 'opencode-go';
221
+ if (urlLower.includes('opencode.ai/zen'))
222
+ return 'opencode-zen';
223
+ if (urlLower.includes('router.huggingface.co') || urlLower.includes('huggingface.co'))
224
+ return 'huggingface';
225
+ if (urlLower.includes('api.nvidia.com'))
226
+ return 'nvidia';
227
+ if (urlLower.includes('ollama.com'))
228
+ return 'ollama-cloud';
229
+ if (urlLower.includes('stepfun.ai'))
230
+ return 'stepfun';
218
231
  // Local providers (by port)
219
232
  if (urlLower.includes(':1234'))
220
233
  return 'lmstudio';
@@ -393,7 +406,7 @@ export class ConfigResolver extends EventEmitter {
393
406
  };
394
407
  }
395
408
  }
396
- catch (error) {
409
+ catch (_error) {
397
410
  // Server not available on this port, try next
398
411
  continue;
399
412
  }
@@ -282,10 +282,38 @@ export declare const SUPPORTED_MODELS: {
282
282
  readonly maxTokens: 32768;
283
283
  readonly provider: "ollama";
284
284
  };
285
+ readonly 'qwen3.5-ctx32k': {
286
+ readonly maxTokens: 32768;
287
+ readonly provider: "ollama";
288
+ };
289
+ readonly 'qwen3.5:35b': {
290
+ readonly maxTokens: 32768;
291
+ readonly provider: "ollama";
292
+ };
293
+ readonly 'qwen3.6:27b': {
294
+ readonly maxTokens: 32768;
295
+ readonly provider: "ollama";
296
+ };
297
+ readonly 'qwen3.6:35b-a3b-q4_K_M': {
298
+ readonly maxTokens: 32768;
299
+ readonly provider: "ollama";
300
+ };
301
+ readonly 'devstral-small-2': {
302
+ readonly maxTokens: 131072;
303
+ readonly provider: "ollama";
304
+ };
305
+ readonly 'devstral-small-2:24b-instruct-2512-q4_K_M': {
306
+ readonly maxTokens: 131072;
307
+ readonly provider: "ollama";
308
+ };
285
309
  readonly phi3: {
286
310
  readonly maxTokens: 4096;
287
311
  readonly provider: "ollama";
288
312
  };
313
+ readonly 'gemma4:12b': {
314
+ readonly maxTokens: 8192;
315
+ readonly provider: "ollama";
316
+ };
289
317
  readonly gemma2: {
290
318
  readonly maxTokens: 8192;
291
319
  readonly provider: "ollama";
@@ -149,7 +149,14 @@ export const SUPPORTED_MODELS = {
149
149
  'deepseek-coder-v2': { maxTokens: 131072, provider: 'ollama' },
150
150
  'qwen2.5': { maxTokens: 32768, provider: 'ollama' },
151
151
  'qwen2.5-coder:7b': { maxTokens: 32768, provider: 'ollama' },
152
+ 'qwen3.5-ctx32k': { maxTokens: 32768, provider: 'ollama' },
153
+ 'qwen3.5:35b': { maxTokens: 32768, provider: 'ollama' },
154
+ 'qwen3.6:27b': { maxTokens: 32768, provider: 'ollama' },
155
+ 'qwen3.6:35b-a3b-q4_K_M': { maxTokens: 32768, provider: 'ollama' },
156
+ 'devstral-small-2': { maxTokens: 131072, provider: 'ollama' },
157
+ 'devstral-small-2:24b-instruct-2512-q4_K_M': { maxTokens: 131072, provider: 'ollama' },
152
158
  'phi3': { maxTokens: 4096, provider: 'ollama' },
159
+ 'gemma4:12b': { maxTokens: 8192, provider: 'ollama' },
153
160
  'gemma2': { maxTokens: 8192, provider: 'ollama' },
154
161
  'command-r': { maxTokens: 131072, provider: 'ollama' },
155
162
  };