@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
@@ -368,6 +368,13 @@ export const TOOL_METADATA = [
368
368
  priority: 6,
369
369
  description: 'Control desktop applications with app profiles, Excel automation, mouse, keyboard, windows, dialogs, form fields, dropdowns, lists, buttons, links, radios, tabs, menus, tree items, sliders, checkboxes, and assertions'
370
370
  },
371
+ {
372
+ name: 'office_macro_execute',
373
+ category: 'system',
374
+ keywords: ['office', 'excel', 'word', 'powerpoint', 'vba', 'macro', 'powershell', 'com', 'windows', 'automation'],
375
+ priority: 4,
376
+ description: 'Execute VBA or PowerShell macros in Microsoft Office apps (Excel/Word/PowerPoint) via COM — Windows only. Dangerous: runs arbitrary code, requires confirmation. Not exposed to fleet peers.'
377
+ },
371
378
  // Planning
372
379
  {
373
380
  name: 'create_todo_list',
@@ -682,6 +689,13 @@ export const TOOL_METADATA = [
682
689
  priority: 6,
683
690
  description: 'Capture one local webcam frame and record a vision percept'
684
691
  },
692
+ {
693
+ name: 'camera_analyze',
694
+ category: 'media',
695
+ keywords: ['camera', 'webcam', 'see', 'vision', 'describe', 'look', 'photo', 'companion', 'eyes', 'analyze', 'what do you see'],
696
+ priority: 7,
697
+ description: 'Capture a local webcam frame and describe it with a local multimodal vision model'
698
+ },
685
699
  {
686
700
  name: 'audio',
687
701
  category: 'media',
@@ -940,6 +954,20 @@ export const TOOL_METADATA = [
940
954
  priority: 5,
941
955
  description: 'Store persistent memory entries'
942
956
  },
957
+ {
958
+ name: 'replace_memory',
959
+ category: 'utility',
960
+ keywords: ['memory', 'replace', 'rewrite', 'update', 'persist', 'preference'],
961
+ priority: 5,
962
+ description: 'Replace an existing persistent memory entry under the memory char budget'
963
+ },
964
+ {
965
+ name: 'memory_propose',
966
+ category: 'utility',
967
+ keywords: ['memory', 'candidate', 'propose', 'review', 'long-term', 'persist'],
968
+ priority: 5,
969
+ description: 'Propose a review-gated long-term memory candidate without silently writing prompt-injected memory'
970
+ },
943
971
  {
944
972
  name: 'recall',
945
973
  category: 'utility',
@@ -0,0 +1,10 @@
1
+ import type { ToolResult } from '../types/index.js';
2
+ export interface OfficeMacroToolInput {
3
+ application: 'Excel' | 'Word' | 'PowerPoint';
4
+ macroCode: string;
5
+ type: 'vba' | 'powershell';
6
+ runHeadless?: boolean;
7
+ }
8
+ export declare class OfficeMacroTool {
9
+ execute(input: OfficeMacroToolInput): Promise<ToolResult>;
10
+ }
@@ -0,0 +1,93 @@
1
+ import { exec } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ import path from 'node:path';
4
+ import fs from 'node:fs/promises';
5
+ import os from 'node:os';
6
+ const execAsync = promisify(exec);
7
+ export class OfficeMacroTool {
8
+ async execute(input) {
9
+ if (process.platform !== 'win32') {
10
+ return {
11
+ success: false,
12
+ error: 'Office Macro Tool is only supported on Windows (win32 platform).',
13
+ };
14
+ }
15
+ try {
16
+ const { application, macroCode, type, runHeadless = false } = input;
17
+ const appName = `"${application}.Application"`;
18
+ let psScript = '';
19
+ if (type === 'powershell') {
20
+ psScript = `
21
+ $ErrorActionPreference = "Stop"
22
+ $app = New-Object -ComObject ${appName}
23
+ $app.Visible = $${!runHeadless}
24
+ try {
25
+ ${macroCode.split(/\r?\n/).map((l) => ' ' + l).join('\n')}
26
+ } finally {
27
+ # We do not automatically quit here to allow user interaction unless specified in the script
28
+ }
29
+ `.trim();
30
+ }
31
+ else if (type === 'vba') {
32
+ // Wrapper to inject VBA code into the application and run it
33
+ // This usually requires 'Trust access to the VBA project object model' in Office settings.
34
+ psScript = `
35
+ $ErrorActionPreference = "Stop"
36
+ $app = New-Object -ComObject ${appName}
37
+ $app.Visible = $${!runHeadless}
38
+ try {
39
+ $workbook = $null
40
+ if ("${application}" -eq "Excel") {
41
+ $workbook = $app.Workbooks.Add()
42
+ } elseif ("${application}" -eq "Word") {
43
+ $workbook = $app.Documents.Add()
44
+ } elseif ("${application}" -eq "PowerPoint") {
45
+ $workbook = $app.Presentations.Add()
46
+ }
47
+
48
+ if ($workbook -ne $null) {
49
+ $vbext_ct_StdModule = 1
50
+ $module = $workbook.VBProject.VBComponents.Add($vbext_ct_StdModule)
51
+ $module.CodeModule.AddFromString(@"
52
+ ${macroCode}
53
+ "@)
54
+
55
+ # We try to run the first parameterless macro found or a specific name if we can infer it.
56
+ # But commonly, for VBA injection, the user script should define a 'Sub Main()' and we run it.
57
+ $app.Run("Main")
58
+ }
59
+ } catch {
60
+ Write-Error $_.Exception.Message
61
+ } finally {
62
+ # If headless, we quit
63
+ if (${runHeadless ? '$true' : '$false'}) {
64
+ $app.Quit()
65
+ [System.Runtime.Interopservices.Marshal]::ReleaseComObject($app) | Out-Null
66
+ }
67
+ }
68
+ `.trim();
69
+ }
70
+ else {
71
+ return { success: false, error: `Unsupported macro type: ${type}` };
72
+ }
73
+ // Save to a temporary file
74
+ const tempDir = os.tmpdir();
75
+ const psFilePath = path.join(tempDir, `office_macro_${Date.now()}.ps1`);
76
+ await fs.writeFile(psFilePath, psScript, 'utf8');
77
+ // Execute via Powershell
78
+ const { stdout, stderr } = await execAsync(`powershell.exe -ExecutionPolicy Bypass -File "${psFilePath}"`, {
79
+ timeout: 60000, // 60 seconds max
80
+ });
81
+ // Cleanup
82
+ await fs.unlink(psFilePath).catch(() => { });
83
+ if (stderr) {
84
+ return { success: false, error: stderr.trim() };
85
+ }
86
+ return { success: true, output: stdout.trim() || 'Macro executed successfully.' };
87
+ }
88
+ catch (e) {
89
+ return { success: false, error: e instanceof Error ? e.message : String(e) };
90
+ }
91
+ }
92
+ }
93
+ //# sourceMappingURL=office-macro-tool.js.map
@@ -0,0 +1,25 @@
1
+ /**
2
+ * register_tool — lets Code Buddy author a NEW tool for itself at runtime.
3
+ *
4
+ * This is the "the code it builds can call its own tools" capability. On a
5
+ * passing static safety scan it writes BOTH tool registries (via LiveToolMutator):
6
+ * - FormalToolRegistry → the authored tool is immediately CALLABLE (dispatch),
7
+ * - legacy ToolRegistry → its schema becomes VISIBLE to the model next turn.
8
+ *
9
+ * Authored tools are namespaced `authored__<name>` and run SANDBOXED. Gated
10
+ * overall by `CODEBUDDY_SELF_IMPROVE=true` at the registration site (tools.ts).
11
+ *
12
+ * The static scan here is the same G1 used by the self-improvement engine
13
+ * (authored-artifact-gate). The fuller behavioural held-out gate (which proves a
14
+ * tool actually works on fresh inputs) is applied by the engine's tool-gate when
15
+ * a tool is proposed as a self-improvement against a benchmark scenario.
16
+ */
17
+ import type { ITool, ToolSchema } from './registry/types.js';
18
+ import type { ToolResult } from '../types/index.js';
19
+ export declare class RegisterToolTool implements ITool {
20
+ readonly name = "register_tool";
21
+ readonly description: string;
22
+ execute(input: Record<string, unknown>): Promise<ToolResult>;
23
+ getSchema(): ToolSchema;
24
+ }
25
+ export declare function createRegisterToolTool(): RegisterToolTool;
@@ -0,0 +1,100 @@
1
+ /**
2
+ * register_tool — lets Code Buddy author a NEW tool for itself at runtime.
3
+ *
4
+ * This is the "the code it builds can call its own tools" capability. On a
5
+ * passing static safety scan it writes BOTH tool registries (via LiveToolMutator):
6
+ * - FormalToolRegistry → the authored tool is immediately CALLABLE (dispatch),
7
+ * - legacy ToolRegistry → its schema becomes VISIBLE to the model next turn.
8
+ *
9
+ * Authored tools are namespaced `authored__<name>` and run SANDBOXED. Gated
10
+ * overall by `CODEBUDDY_SELF_IMPROVE=true` at the registration site (tools.ts).
11
+ *
12
+ * The static scan here is the same G1 used by the self-improvement engine
13
+ * (authored-artifact-gate). The fuller behavioural held-out gate (which proves a
14
+ * tool actually works on fresh inputs) is applied by the engine's tool-gate when
15
+ * a tool is proposed as a self-improvement against a benchmark scenario.
16
+ */
17
+ import { AUTHORED_LANGUAGES, toAuthoredName, } from '../agent/self-improvement/authored-tool-runtime.js';
18
+ import { inspectAuthoredCode } from '../agent/self-improvement/authored-artifact-gate.js';
19
+ import { LiveToolMutator } from '../agent/self-improvement/tool-skill-mutator.js';
20
+ import { logger } from '../utils/logger.js';
21
+ export class RegisterToolTool {
22
+ name = 'register_tool';
23
+ description = 'Author a NEW tool for yourself at runtime. Provide a name, description, JSON-schema params, ' +
24
+ 'a language (javascript|typescript|python) and the code. The code reads its call arguments as ' +
25
+ 'JSON from the CODEBUDDY_TOOL_INPUT env var and prints its result to stdout. On a passing safety ' +
26
+ 'check the tool is registered as `authored__<name>` and becomes callable by you on your next turn.';
27
+ async execute(input) {
28
+ const rawName = String(input.name ?? '').trim();
29
+ const description = String(input.description ?? '').trim();
30
+ const language = String(input.language ?? 'javascript').toLowerCase();
31
+ const code = typeof input.code === 'string' ? input.code : '';
32
+ const parameters = input.params && typeof input.params === 'object'
33
+ ? input.params
34
+ : { type: 'object', properties: {} };
35
+ if (!rawName)
36
+ return { success: false, error: 'register_tool: `name` is required.' };
37
+ if (!description)
38
+ return { success: false, error: 'register_tool: `description` is required.' };
39
+ if (!code.trim())
40
+ return { success: false, error: 'register_tool: `code` is required.' };
41
+ if (!AUTHORED_LANGUAGES.includes(language)) {
42
+ return { success: false, error: `register_tool: language must be one of ${AUTHORED_LANGUAGES.join(', ')}.` };
43
+ }
44
+ // Static safety scan (engine G1): dangerous patterns, secrets, no-src/-write, omissions.
45
+ const scan = inspectAuthoredCode(code, 'code');
46
+ if (!scan.ok) {
47
+ return { success: false, error: `register_tool: refused — ${scan.reasons.join('; ')}.` };
48
+ }
49
+ const spec = {
50
+ name: toAuthoredName(rawName),
51
+ description,
52
+ parameters,
53
+ language,
54
+ code,
55
+ };
56
+ try {
57
+ new LiveToolMutator().register(spec);
58
+ }
59
+ catch (err) {
60
+ return {
61
+ success: false,
62
+ error: `register_tool: registration failed — ${err instanceof Error ? err.message : String(err)}`,
63
+ };
64
+ }
65
+ logger.info(`[self-improve] authored tool registered: ${spec.name}`);
66
+ return {
67
+ success: true,
68
+ output: `Registered tool \`${spec.name}\`. It is now callable by you on your next turn — ` +
69
+ `call it with arguments matching its params.`,
70
+ };
71
+ }
72
+ getSchema() {
73
+ return {
74
+ name: this.name,
75
+ description: this.description,
76
+ parameters: {
77
+ type: 'object',
78
+ properties: {
79
+ name: { type: 'string', description: 'Tool name (namespaced to authored__<name>)' },
80
+ description: { type: 'string', description: 'What the tool does and when to use it' },
81
+ params: { type: 'object', description: 'JSON Schema for the tool arguments' },
82
+ language: {
83
+ type: 'string',
84
+ enum: ['javascript', 'typescript', 'python'],
85
+ description: 'Implementation language (default javascript)',
86
+ },
87
+ code: {
88
+ type: 'string',
89
+ description: 'Code that reads its args as JSON from env CODEBUDDY_TOOL_INPUT and prints its result to stdout',
90
+ },
91
+ },
92
+ required: ['name', 'description', 'code'],
93
+ },
94
+ };
95
+ }
96
+ }
97
+ export function createRegisterToolTool() {
98
+ return new RegisterToolTool();
99
+ }
100
+ //# sourceMappingURL=register-tool-handler.js.map
@@ -40,7 +40,7 @@ export { RelationshipContextTool, createRelationshipIntelligenceTools, } from '.
40
40
  export { InternetScoutPlanTool, InternetScoutRunTool, createInternetScoutTools, } from './internet-scout-tools.js';
41
41
  export { LeadScoutEnrichmentPlanTool, LeadScoutLessonCandidatesTool, LeadScoutPlanTool, LeadScoutRunTool, createLeadScoutTools, } from './lead-scout-tools.js';
42
42
  export { BrowserOperatorTool, createBrowserOperatorTools } from './browser-operator-tools.js';
43
- export { RememberTool, RecallTool, ForgetTool, createMemoryTools, } from './memory-tools.js';
43
+ export { RememberTool, ReplaceMemoryTool, MemoryProposeTool, RecallTool, ForgetTool, createMemoryTools, } from './memory-tools.js';
44
44
  export { TodoAttentionTool, RestoreContextTool, createAttentionTools, } from './attention-tools.js';
45
45
  export { LessonsAddTool, LessonsGraphTool, LessonsSearchTool, LessonsListTool, TaskVerifyTool, createLessonsTools, } from './lessons-tools.js';
46
46
  export { UserModelObserveTool, UserModelRecallTool, createUserModelTools, } from './user-model-tools.js';
@@ -91,3 +91,4 @@ import type { ITool } from './types.js';
91
91
  */
92
92
  export declare function registerBuiltinTools(registry: FormalToolRegistry): number;
93
93
  import { FormalToolRegistry } from './tool-registry.js';
94
+ export * from "./windows-tools.js";
@@ -66,7 +66,7 @@ export { LeadScoutEnrichmentPlanTool, LeadScoutLessonCandidatesTool, LeadScoutPl
66
66
  // Tool Adapters - Browser Operator (live-web session proposal)
67
67
  export { BrowserOperatorTool, createBrowserOperatorTools } from './browser-operator-tools.js';
68
68
  // Tool Adapters - Persistent Memory (remember, recall, forget)
69
- export { RememberTool, RecallTool, ForgetTool, createMemoryTools, } from './memory-tools.js';
69
+ export { RememberTool, ReplaceMemoryTool, MemoryProposeTool, RecallTool, ForgetTool, createMemoryTools, } from './memory-tools.js';
70
70
  // Tool Adapters - Attention (Todo + RestoreContext)
71
71
  export { TodoAttentionTool, RestoreContextTool, createAttentionTools, } from './attention-tools.js';
72
72
  // Tool Adapters - Lessons (self-improvement loop + verification contract)
@@ -369,4 +369,5 @@ import { createGuiTools } from './gui-tools.js';
369
369
  import { createSessionTools } from './session-tools.js';
370
370
  import { createAliasTools } from './tool-aliases.js';
371
371
  import { createGitNexusTools } from './gitnexus-tools.js';
372
+ export * from "./windows-tools.js";
372
373
  //# sourceMappingURL=index.js.map
@@ -3,6 +3,8 @@
3
3
  *
4
4
  * Tools for the agent to autonomously manage its persistent memory (CLAUDE.md style).
5
5
  * - remember: Store information in project or user memory
6
+ * - replace_memory: Replace an existing memory entry under Hermes-style bounds
7
+ * - memory_propose: Queue a long-term memory candidate for human review
6
8
  * - recall: Explicitly retrieve a memory by key
7
9
  * - forget: Remove a memory entry
8
10
  */
@@ -17,6 +19,24 @@ export declare class RememberTool implements ITool {
17
19
  getMetadata(): IToolMetadata;
18
20
  isAvailable(): boolean;
19
21
  }
22
+ export declare class ReplaceMemoryTool implements ITool {
23
+ readonly name = "replace_memory";
24
+ readonly description = "Replace an existing persistent memory entry. Use when a stored fact is obsolete or too verbose and must be rewritten under the memory char budget.";
25
+ execute(input: Record<string, unknown>): Promise<ToolResult>;
26
+ getSchema(): ToolSchema;
27
+ validate(input: unknown): IValidationResult;
28
+ getMetadata(): IToolMetadata;
29
+ isAvailable(): boolean;
30
+ }
31
+ export declare class MemoryProposeTool implements ITool {
32
+ readonly name = "memory_propose";
33
+ readonly description = "Propose a long-term memory candidate for human review. Use this instead of remember when the fact is inferred, ambiguous, or should not be silently injected into future prompts.";
34
+ execute(input: Record<string, unknown>): Promise<ToolResult>;
35
+ getSchema(): ToolSchema;
36
+ validate(input: unknown): IValidationResult;
37
+ getMetadata(): IToolMetadata;
38
+ isAvailable(): boolean;
39
+ }
20
40
  export declare class RecallTool implements ITool {
21
41
  readonly name = "recall";
22
42
  readonly description = "Explicitly retrieve a specific memory entry by its key. Use this if the information is not currently in your system prompt.";
@@ -3,10 +3,13 @@
3
3
  *
4
4
  * Tools for the agent to autonomously manage its persistent memory (CLAUDE.md style).
5
5
  * - remember: Store information in project or user memory
6
+ * - replace_memory: Replace an existing memory entry under Hermes-style bounds
7
+ * - memory_propose: Queue a long-term memory candidate for human review
6
8
  * - recall: Explicitly retrieve a memory by key
7
9
  * - forget: Remove a memory entry
8
10
  */
9
11
  import { getMemoryManager } from '../../memory/persistent-memory.js';
12
+ import { getMemoryCandidateQueue } from '../../memory/memory-candidate-queue.js';
10
13
  import { executeHermesLifecycleHook } from '../../hooks/hermes-lifecycle-hooks.js';
11
14
  // ============================================================================
12
15
  // remember
@@ -45,10 +48,10 @@ export class RememberTool {
45
48
  ? hookResult.updatedInput.category
46
49
  : category;
47
50
  }
48
- await mm.remember(key, value, { scope, category });
51
+ const result = await mm.remember(key, value, { scope, category });
49
52
  return {
50
53
  success: true,
51
- output: `Successfully remembered "${key}" in ${scope} memory (category: ${category}).`,
54
+ output: `${result.message} Usage: ${result.usage.used}/${result.usage.limit} chars (${result.usage.percent}%).`,
52
55
  };
53
56
  }
54
57
  catch (err) {
@@ -80,7 +83,7 @@ export class RememberTool {
80
83
  },
81
84
  category: {
82
85
  type: 'string',
83
- enum: ['project', 'preferences', 'decisions', 'patterns', 'custom'],
86
+ enum: ['project', 'preferences', 'decisions', 'patterns', 'context', 'custom'],
84
87
  description: 'The type of information being stored',
85
88
  },
86
89
  },
@@ -118,6 +121,223 @@ export class RememberTool {
118
121
  }
119
122
  }
120
123
  // ============================================================================
124
+ // replace_memory
125
+ // ============================================================================
126
+ export class ReplaceMemoryTool {
127
+ name = 'replace_memory';
128
+ description = 'Replace an existing persistent memory entry. Use when a stored fact is obsolete or too verbose and must be rewritten under the memory char budget.';
129
+ async execute(input) {
130
+ const mm = getMemoryManager();
131
+ let key = input.key;
132
+ let value = input.value;
133
+ let scope = input.scope ?? 'project';
134
+ let category = input.category;
135
+ try {
136
+ const hookResult = await executeHermesLifecycleHook(process.cwd(), 'before_memory_write', {
137
+ toolName: this.name,
138
+ toolInput: { key, value, scope, category },
139
+ memoryKey: key,
140
+ memoryValue: value,
141
+ memoryScope: scope,
142
+ memoryCategory: category,
143
+ });
144
+ if (!hookResult.allowed) {
145
+ return {
146
+ success: false,
147
+ error: hookResult.feedback ?? 'Memory replacement blocked by BeforeMemoryWrite hook.',
148
+ };
149
+ }
150
+ if (hookResult.updatedInput) {
151
+ key = typeof hookResult.updatedInput.key === 'string' ? hookResult.updatedInput.key : key;
152
+ value = typeof hookResult.updatedInput.value === 'string' ? hookResult.updatedInput.value : value;
153
+ scope = hookResult.updatedInput.scope === 'user' || hookResult.updatedInput.scope === 'project'
154
+ ? hookResult.updatedInput.scope
155
+ : scope;
156
+ category = typeof hookResult.updatedInput.category === 'string'
157
+ ? hookResult.updatedInput.category
158
+ : category;
159
+ }
160
+ const result = await mm.replace(key, value, { scope, category });
161
+ if (result.status === 'missing') {
162
+ return {
163
+ success: true,
164
+ output: result.message,
165
+ };
166
+ }
167
+ return {
168
+ success: true,
169
+ output: `${result.message} Usage: ${result.usage.used}/${result.usage.limit} chars (${result.usage.percent}%).`,
170
+ };
171
+ }
172
+ catch (err) {
173
+ return {
174
+ success: false,
175
+ error: `Failed to replace memory: ${err instanceof Error ? err.message : String(err)}`,
176
+ };
177
+ }
178
+ }
179
+ getSchema() {
180
+ return {
181
+ name: this.name,
182
+ description: this.description,
183
+ parameters: {
184
+ type: 'object',
185
+ properties: {
186
+ key: {
187
+ type: 'string',
188
+ description: 'Existing memory key to replace',
189
+ },
190
+ value: {
191
+ type: 'string',
192
+ description: 'New concise memory value',
193
+ },
194
+ scope: {
195
+ type: 'string',
196
+ enum: ['project', 'user'],
197
+ description: 'Memory scope to replace in (default: project)',
198
+ },
199
+ category: {
200
+ type: 'string',
201
+ enum: ['project', 'preferences', 'decisions', 'patterns', 'context', 'custom'],
202
+ description: 'Optional replacement category',
203
+ },
204
+ },
205
+ required: ['key', 'value'],
206
+ },
207
+ };
208
+ }
209
+ validate(input) {
210
+ if (typeof input !== 'object' || input === null) {
211
+ return { valid: false, errors: ['Input must be an object'] };
212
+ }
213
+ const data = input;
214
+ if (typeof data.key !== 'string' || !data.key.trim()) {
215
+ return { valid: false, errors: ['key must be a non-empty string'] };
216
+ }
217
+ if (typeof data.value !== 'string' || !data.value.trim()) {
218
+ return { valid: false, errors: ['value must be a non-empty string'] };
219
+ }
220
+ return { valid: true };
221
+ }
222
+ getMetadata() {
223
+ return {
224
+ name: this.name,
225
+ description: this.description,
226
+ category: 'utility',
227
+ keywords: ['memory', 'replace', 'rewrite', 'update', 'persist', 'preference'],
228
+ priority: 5,
229
+ requiresConfirmation: false,
230
+ modifiesFiles: true,
231
+ makesNetworkRequests: false,
232
+ };
233
+ }
234
+ isAvailable() {
235
+ return true;
236
+ }
237
+ }
238
+ // ============================================================================
239
+ // memory_propose
240
+ // ============================================================================
241
+ export class MemoryProposeTool {
242
+ name = 'memory_propose';
243
+ description = 'Propose a long-term memory candidate for human review. Use this instead of remember when the fact is inferred, ambiguous, or should not be silently injected into future prompts.';
244
+ async execute(input) {
245
+ const key = input.key;
246
+ const value = input.value;
247
+ const scope = input.scope ?? 'project';
248
+ const category = input.category ?? 'context';
249
+ const confidence = typeof input.confidence === 'number' ? input.confidence : undefined;
250
+ const rationale = typeof input.rationale === 'string' ? input.rationale : undefined;
251
+ try {
252
+ const { candidate, deduped } = getMemoryCandidateQueue(process.cwd()).propose({
253
+ key,
254
+ value,
255
+ scope,
256
+ category,
257
+ source: 'self_observed',
258
+ ...(confidence !== undefined ? { confidence } : {}),
259
+ ...(rationale ? { rationale } : {}),
260
+ });
261
+ return {
262
+ success: true,
263
+ output: `${deduped ? 'Matched existing pending' : 'Proposed'} memory candidate ${candidate.id} (${candidate.scope}/${candidate.category}). Approve with: /memory accept ${candidate.id}`,
264
+ };
265
+ }
266
+ catch (err) {
267
+ return {
268
+ success: false,
269
+ error: `memory_propose failed: ${err instanceof Error ? err.message : String(err)}`,
270
+ };
271
+ }
272
+ }
273
+ getSchema() {
274
+ return {
275
+ name: this.name,
276
+ description: this.description,
277
+ parameters: {
278
+ type: 'object',
279
+ properties: {
280
+ key: {
281
+ type: 'string',
282
+ description: 'Short kebab-case key for the memory candidate',
283
+ },
284
+ value: {
285
+ type: 'string',
286
+ description: 'Concise candidate memory value',
287
+ },
288
+ scope: {
289
+ type: 'string',
290
+ enum: ['project', 'user'],
291
+ description: 'Candidate scope (default: project)',
292
+ },
293
+ category: {
294
+ type: 'string',
295
+ enum: ['project', 'preferences', 'decisions', 'patterns', 'context', 'custom'],
296
+ description: 'Candidate category',
297
+ },
298
+ confidence: {
299
+ type: 'number',
300
+ description: 'Confidence from 0 to 1',
301
+ },
302
+ rationale: {
303
+ type: 'string',
304
+ description: 'Short evidence note for reviewer',
305
+ },
306
+ },
307
+ required: ['key', 'value'],
308
+ },
309
+ };
310
+ }
311
+ validate(input) {
312
+ if (typeof input !== 'object' || input === null) {
313
+ return { valid: false, errors: ['Input must be an object'] };
314
+ }
315
+ const data = input;
316
+ if (typeof data.key !== 'string' || !data.key.trim()) {
317
+ return { valid: false, errors: ['key must be a non-empty string'] };
318
+ }
319
+ if (typeof data.value !== 'string' || !data.value.trim()) {
320
+ return { valid: false, errors: ['value must be a non-empty string'] };
321
+ }
322
+ return { valid: true };
323
+ }
324
+ getMetadata() {
325
+ return {
326
+ name: this.name,
327
+ description: this.description,
328
+ category: 'utility',
329
+ keywords: ['memory', 'candidate', 'propose', 'review', 'long-term', 'persist'],
330
+ priority: 5,
331
+ requiresConfirmation: false,
332
+ modifiesFiles: true,
333
+ makesNetworkRequests: false,
334
+ };
335
+ }
336
+ isAvailable() {
337
+ return true;
338
+ }
339
+ }
340
+ // ============================================================================
121
341
  // recall
122
342
  // ============================================================================
123
343
  export class RecallTool {
@@ -267,6 +487,8 @@ export class ForgetTool {
267
487
  export function createMemoryTools() {
268
488
  return [
269
489
  new RememberTool(),
490
+ new ReplaceMemoryTool(),
491
+ new MemoryProposeTool(),
270
492
  new RecallTool(),
271
493
  new ForgetTool(),
272
494
  ];
@@ -221,7 +221,7 @@ export class TextToSpeechTool {
221
221
  },
222
222
  provider: {
223
223
  type: 'string',
224
- enum: ['auto', 'system', 'edge-tts', 'espeak', 'say', 'kokoro', 'audioreader'],
224
+ enum: ['auto', 'system', 'edge-tts', 'espeak', 'say', 'audioreader'],
225
225
  description: 'TTS provider. auto detects a local provider; system uses Windows SAPI.',
226
226
  },
227
227
  voice: {
@@ -1104,7 +1104,7 @@ function optionalProvider(value) {
1104
1104
  if (typeof value !== 'string' || !value.trim())
1105
1105
  return undefined;
1106
1106
  const provider = value.trim();
1107
- if (['auto', 'system', 'edge-tts', 'espeak', 'say', 'kokoro', 'audioreader'].includes(provider)) {
1107
+ if (['auto', 'system', 'edge-tts', 'espeak', 'say', 'audioreader'].includes(provider)) {
1108
1108
  return provider;
1109
1109
  }
1110
1110
  throw new Error(`Unsupported text_to_speech provider: ${provider}`);