profclaw 2.0.0 → 2.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 (477) hide show
  1. package/.env.example +14 -2
  2. package/CHANGELOG.md +37 -0
  3. package/CONTRIBUTING.md +20 -0
  4. package/Dockerfile +39 -23
  5. package/README.md +174 -40
  6. package/dist/agents/agent-summary.d.ts +44 -0
  7. package/dist/agents/agent-summary.js +176 -0
  8. package/dist/agents/auto-memory.d.ts +59 -0
  9. package/dist/agents/auto-memory.js +310 -0
  10. package/dist/agents/checkpoint-manager.d.ts +76 -0
  11. package/dist/agents/checkpoint-manager.js +156 -0
  12. package/dist/agents/circuit-breaker.d.ts +54 -0
  13. package/dist/agents/circuit-breaker.js +153 -0
  14. package/dist/agents/context-compactor.d.ts +70 -0
  15. package/dist/agents/context-compactor.js +361 -0
  16. package/dist/agents/conversation-branch.d.ts +55 -0
  17. package/dist/agents/conversation-branch.js +115 -0
  18. package/dist/agents/error-recovery.d.ts +44 -0
  19. package/dist/agents/error-recovery.js +197 -0
  20. package/dist/agents/events.d.ts +76 -0
  21. package/dist/agents/events.js +8 -0
  22. package/dist/agents/executor.d.ts +35 -1
  23. package/dist/agents/executor.js +573 -124
  24. package/dist/agents/file-snapshots.d.ts +72 -0
  25. package/dist/agents/file-snapshots.js +182 -0
  26. package/dist/agents/index.d.ts +2 -0
  27. package/dist/agents/orchestrator.d.ts +183 -0
  28. package/dist/agents/orchestrator.js +495 -0
  29. package/dist/agents/permissions.d.ts +63 -0
  30. package/dist/agents/permissions.js +138 -0
  31. package/dist/agents/plan-mode.d.ts +71 -0
  32. package/dist/agents/plan-mode.js +186 -0
  33. package/dist/agents/prompt-suggestions.d.ts +33 -0
  34. package/dist/agents/prompt-suggestions.js +208 -0
  35. package/dist/agents/rate-limit-monitor.d.ts +56 -0
  36. package/dist/agents/rate-limit-monitor.js +224 -0
  37. package/dist/agents/result-store.d.ts +37 -0
  38. package/dist/agents/result-store.js +104 -0
  39. package/dist/agents/session-diff.d.ts +43 -0
  40. package/dist/agents/session-diff.js +258 -0
  41. package/dist/agents/tool-loader.d.ts +65 -0
  42. package/dist/agents/tool-loader.js +273 -0
  43. package/dist/agents/transcript.d.ts +96 -0
  44. package/dist/agents/transcript.js +267 -0
  45. package/dist/agents/worktree-manager.d.ts +80 -0
  46. package/dist/agents/worktree-manager.js +203 -0
  47. package/dist/auth/middleware.js +14 -0
  48. package/dist/chat/agentic-executor.d.ts +7 -0
  49. package/dist/chat/agentic-executor.js +253 -30
  50. package/dist/chat/conversations.d.ts +2 -0
  51. package/dist/chat/conversations.js +8 -0
  52. package/dist/chat/execution/executor.d.ts +8 -0
  53. package/dist/chat/execution/executor.js +157 -103
  54. package/dist/chat/execution/index.js +5 -1
  55. package/dist/chat/execution/tool-router.js +40 -14
  56. package/dist/chat/execution/tools/canvas.d.ts +2 -2
  57. package/dist/chat/execution/tools/code-tools.d.ts +66 -0
  58. package/dist/chat/execution/tools/code-tools.js +353 -0
  59. package/dist/chat/execution/tools/complete-task.d.ts +2 -2
  60. package/dist/chat/execution/tools/cron-tool.d.ts +26 -10
  61. package/dist/chat/execution/tools/cron-tool.js +48 -3
  62. package/dist/chat/execution/tools/decompose-task.d.ts +58 -0
  63. package/dist/chat/execution/tools/decompose-task.js +166 -0
  64. package/dist/chat/execution/tools/exec.d.ts +5 -2
  65. package/dist/chat/execution/tools/exec.js +294 -155
  66. package/dist/chat/execution/tools/feed-tools.d.ts +77 -0
  67. package/dist/chat/execution/tools/feed-tools.js +142 -0
  68. package/dist/chat/execution/tools/file-ops.d.ts +1 -1
  69. package/dist/chat/execution/tools/github.d.ts +2 -2
  70. package/dist/chat/execution/tools/index.d.ts +14 -2
  71. package/dist/chat/execution/tools/index.js +86 -12
  72. package/dist/chat/execution/tools/integrations.d.ts +8 -8
  73. package/dist/chat/execution/tools/multi-patch.d.ts +53 -0
  74. package/dist/chat/execution/tools/multi-patch.js +373 -0
  75. package/dist/chat/execution/tools/openai-image-gen.d.ts +2 -2
  76. package/dist/chat/execution/tools/plan-tools.d.ts +80 -0
  77. package/dist/chat/execution/tools/plan-tools.js +134 -0
  78. package/dist/chat/execution/tools/profclaw-ops.d.ts +6 -6
  79. package/dist/chat/execution/tools/repl-tool.d.ts +46 -0
  80. package/dist/chat/execution/tools/repl-tool.js +207 -0
  81. package/dist/chat/execution/tools/sessions-send.d.ts +2 -2
  82. package/dist/chat/execution/tools/slack-actions.d.ts +2 -2
  83. package/dist/chat/execution/tools/system.d.ts +4 -4
  84. package/dist/chat/execution/tools/todo-tool.d.ts +72 -0
  85. package/dist/chat/execution/tools/todo-tool.js +152 -0
  86. package/dist/chat/execution/tools/tool-search.d.ts +50 -0
  87. package/dist/chat/execution/tools/tool-search.js +155 -0
  88. package/dist/chat/execution/types.d.ts +21 -14
  89. package/dist/chat/execution/workflows/executor.d.ts +11 -0
  90. package/dist/chat/execution/workflows/executor.js +99 -1
  91. package/dist/chat/execution/workflows/types.d.ts +35 -2
  92. package/dist/chat/format/index.d.ts +1 -0
  93. package/dist/chat/format/index.js +1 -0
  94. package/dist/chat/format/markdown-convert.d.ts +23 -0
  95. package/dist/chat/format/markdown-convert.js +149 -0
  96. package/dist/chat/index.d.ts +1 -1
  97. package/dist/chat/index.js +1 -1
  98. package/dist/chat/message-handler.js +58 -6
  99. package/dist/chat/proactive/index.d.ts +62 -0
  100. package/dist/chat/proactive/index.js +147 -0
  101. package/dist/chat/prompt-adapter.js +2 -0
  102. package/dist/chat/providers/irc/index.d.ts +2 -2
  103. package/dist/chat/providers/telegram/index.d.ts +2 -0
  104. package/dist/chat/providers/telegram/index.js +21 -2
  105. package/dist/chat/system-prompts.d.ts +3 -3
  106. package/dist/chat/system-prompts.js +116 -61
  107. package/dist/chat/tools.d.ts +6 -6
  108. package/dist/cli/commands/auth.js +64 -1
  109. package/dist/cli/commands/chat.js +1327 -138
  110. package/dist/cli/commands/doctor.js +222 -16
  111. package/dist/cli/commands/history.d.ts +3 -0
  112. package/dist/cli/commands/history.js +138 -0
  113. package/dist/cli/commands/import.d.ts +44 -0
  114. package/dist/cli/commands/import.js +526 -0
  115. package/dist/cli/commands/init.d.ts +13 -0
  116. package/dist/cli/commands/init.js +381 -0
  117. package/dist/cli/commands/onboard.js +210 -30
  118. package/dist/cli/commands/plan.d.ts +13 -0
  119. package/dist/cli/commands/plan.js +184 -0
  120. package/dist/cli/commands/serve.d.ts +7 -0
  121. package/dist/cli/commands/serve.js +77 -18
  122. package/dist/cli/commands/setup.js +84 -3
  123. package/dist/cli/commands/status.js +54 -0
  124. package/dist/cli/commands/tools.js +13 -13
  125. package/dist/cli/commands/tui.js +26 -1
  126. package/dist/cli/index.js +19 -0
  127. package/dist/cli/ink/App.d.ts +13 -0
  128. package/dist/cli/ink/App.js +6 -0
  129. package/dist/cli/ink/ChatApp.d.ts +60 -0
  130. package/dist/cli/ink/ChatApp.js +325 -0
  131. package/dist/cli/ink/DashboardApp.d.ts +3 -0
  132. package/dist/cli/ink/DashboardApp.js +143 -0
  133. package/dist/cli/ink/components/AgentStatus.d.ts +17 -0
  134. package/dist/cli/ink/components/AgentStatus.js +33 -0
  135. package/dist/cli/ink/components/ChannelList.d.ts +17 -0
  136. package/dist/cli/ink/components/ChannelList.js +33 -0
  137. package/dist/cli/ink/components/ConnectionStatus.d.ts +19 -0
  138. package/dist/cli/ink/components/ConnectionStatus.js +50 -0
  139. package/dist/cli/ink/components/CostBar.d.ts +19 -0
  140. package/dist/cli/ink/components/CostBar.js +35 -0
  141. package/dist/cli/ink/components/HookStatus.d.ts +15 -0
  142. package/dist/cli/ink/components/HookStatus.js +7 -0
  143. package/dist/cli/ink/components/PermissionPrompt.d.ts +21 -0
  144. package/dist/cli/ink/components/PermissionPrompt.js +51 -0
  145. package/dist/cli/ink/components/PlanView.d.ts +23 -0
  146. package/dist/cli/ink/components/PlanView.js +26 -0
  147. package/dist/cli/ink/components/ProviderList.d.ts +16 -0
  148. package/dist/cli/ink/components/ProviderList.js +16 -0
  149. package/dist/cli/ink/components/SessionHeader.d.ts +15 -0
  150. package/dist/cli/ink/components/SessionHeader.js +15 -0
  151. package/dist/cli/ink/components/StreamingMessage.d.ts +20 -0
  152. package/dist/cli/ink/components/StreamingMessage.js +27 -0
  153. package/dist/cli/ink/components/SuggestionBar.d.ts +15 -0
  154. package/dist/cli/ink/components/SuggestionBar.js +28 -0
  155. package/dist/cli/ink/components/SystemHealth.d.ts +20 -0
  156. package/dist/cli/ink/components/SystemHealth.js +39 -0
  157. package/dist/cli/ink/components/TaskList.d.ts +17 -0
  158. package/dist/cli/ink/components/TaskList.js +59 -0
  159. package/dist/cli/ink/components/ToolCall.d.ts +17 -0
  160. package/dist/cli/ink/components/ToolCall.js +43 -0
  161. package/dist/cli/ink/index.d.ts +23 -0
  162. package/dist/cli/ink/index.js +15 -0
  163. package/dist/cli/ink/keybindings.d.ts +35 -0
  164. package/dist/cli/ink/keybindings.js +105 -0
  165. package/dist/cli/ink/markdown-renderer.d.ts +47 -0
  166. package/dist/cli/ink/markdown-renderer.js +380 -0
  167. package/dist/cli/ink/output-styles.d.ts +39 -0
  168. package/dist/cli/ink/output-styles.js +119 -0
  169. package/dist/cli/interactive/auto-serve.d.ts +38 -0
  170. package/dist/cli/interactive/auto-serve.js +209 -0
  171. package/dist/cli/interactive/index.d.ts +25 -0
  172. package/dist/cli/interactive/index.js +23 -0
  173. package/dist/cli/interactive/picker.d.ts +28 -0
  174. package/dist/cli/interactive/picker.js +153 -0
  175. package/dist/cli/interactive/renderer.d.ts +26 -0
  176. package/dist/cli/interactive/renderer.js +555 -0
  177. package/dist/cli/interactive/repl.d.ts +14 -0
  178. package/dist/cli/interactive/repl.js +1516 -0
  179. package/dist/cli/interactive/stream-client.d.ts +59 -0
  180. package/dist/cli/interactive/stream-client.js +506 -0
  181. package/dist/cli/interactive/types.d.ts +121 -0
  182. package/dist/cli/interactive/types.js +10 -0
  183. package/dist/cli/utils/api.d.ts +9 -0
  184. package/dist/cli/utils/api.js +58 -2
  185. package/dist/cron/natural-language.d.ts +54 -0
  186. package/dist/cron/natural-language.js +569 -0
  187. package/dist/cron/scheduler.d.ts +34 -4
  188. package/dist/cron/scheduler.js +141 -9
  189. package/dist/cron/templates.d.ts +1 -1
  190. package/dist/cron/templates.js +219 -0
  191. package/dist/feeds/feed-engine.d.ts +149 -0
  192. package/dist/feeds/feed-engine.js +600 -0
  193. package/dist/feeds/index.d.ts +9 -0
  194. package/dist/feeds/index.js +8 -0
  195. package/dist/gateway/router.js +6 -1
  196. package/dist/hooks/built-in/audit-log.d.ts +11 -0
  197. package/dist/hooks/built-in/audit-log.js +84 -0
  198. package/dist/hooks/built-in/cost-warning.d.ts +10 -0
  199. package/dist/hooks/built-in/cost-warning.js +59 -0
  200. package/dist/hooks/built-in/dangerous-tool.d.ts +32 -0
  201. package/dist/hooks/built-in/dangerous-tool.js +80 -0
  202. package/dist/hooks/built-in/index.d.ts +14 -0
  203. package/dist/hooks/built-in/index.js +20 -0
  204. package/dist/hooks/index.d.ts +3 -0
  205. package/dist/hooks/index.js +6 -0
  206. package/dist/hooks/loader.d.ts +17 -0
  207. package/dist/hooks/loader.js +142 -0
  208. package/dist/hooks/registry.d.ts +62 -0
  209. package/dist/hooks/registry.js +127 -0
  210. package/dist/integrations/web-search.js +6 -3
  211. package/dist/memory/index.d.ts +1 -0
  212. package/dist/memory/index.js +2 -0
  213. package/dist/memory/memory-service.js +14 -13
  214. package/dist/memory/observational.d.ts +62 -0
  215. package/dist/memory/observational.js +396 -0
  216. package/dist/middleware/content-filter.d.ts +22 -0
  217. package/dist/middleware/content-filter.js +69 -0
  218. package/dist/middleware/request-validator.d.ts +159 -0
  219. package/dist/middleware/request-validator.js +93 -0
  220. package/dist/plugins/sdk.d.ts +22 -0
  221. package/dist/plugins/sdk.js +17 -1
  222. package/dist/projects/types.d.ts +10 -10
  223. package/dist/providers/ai-sdk.d.ts +11 -0
  224. package/dist/providers/ai-sdk.js +78 -19
  225. package/dist/providers/core/models.js +67 -1
  226. package/dist/providers/core/types.d.ts +3 -0
  227. package/dist/providers/index.d.ts +1 -0
  228. package/dist/providers/index.js +1 -0
  229. package/dist/providers/smart-router.d.ts +118 -0
  230. package/dist/providers/smart-router.js +685 -0
  231. package/dist/providers/types.d.ts +16 -16
  232. package/dist/routes/agents.js +50 -0
  233. package/dist/routes/auth.js +8 -1
  234. package/dist/routes/chat.js +259 -14
  235. package/dist/routes/costs.js +32 -0
  236. package/dist/routes/cron.js +80 -5
  237. package/dist/routes/feeds.d.ts +10 -0
  238. package/dist/routes/feeds.js +168 -0
  239. package/dist/routes/mcp.js +21 -0
  240. package/dist/routes/memory.js +130 -0
  241. package/dist/routes/skills.js +129 -0
  242. package/dist/routes/teams.d.ts +9 -0
  243. package/dist/routes/teams.js +210 -0
  244. package/dist/routes/tools.js +14 -0
  245. package/dist/routes/users.js +2 -0
  246. package/dist/server/route-loader.js +3 -1
  247. package/dist/server/stream-bridge.d.ts +19 -0
  248. package/dist/server/stream-bridge.js +38 -0
  249. package/dist/server.js +310 -36
  250. package/dist/skills/marketplace.d.ts +87 -0
  251. package/dist/skills/marketplace.js +268 -0
  252. package/dist/storage/index.d.ts +14 -0
  253. package/dist/storage/index.js +64 -3
  254. package/dist/storage/schema.d.ts +4 -4
  255. package/dist/storage/schema.js +1 -1
  256. package/dist/teams/index.d.ts +110 -0
  257. package/dist/teams/index.js +365 -0
  258. package/dist/tickets/types.d.ts +39 -39
  259. package/dist/types/summary.d.ts +5 -5
  260. package/dist/utils/auto-update.d.ts +23 -0
  261. package/dist/utils/auto-update.js +157 -0
  262. package/dist/utils/offline-detect.d.ts +55 -0
  263. package/dist/utils/offline-detect.js +121 -0
  264. package/dist/utils/pid-file.d.ts +36 -0
  265. package/dist/utils/pid-file.js +125 -0
  266. package/dist/utils/prevent-sleep.d.ts +27 -0
  267. package/dist/utils/prevent-sleep.js +95 -0
  268. package/dist/utils/sanitizer.d.ts +57 -0
  269. package/dist/utils/sanitizer.js +174 -0
  270. package/docker-compose.yml +13 -137
  271. package/package.json +31 -6
  272. package/skills/deploy-cloudflare/SKILL.md +62 -0
  273. package/skills/deploy-vercel/SKILL.md +67 -0
  274. package/skills/docker-deploy/SKILL.md +158 -0
  275. package/skills/full-stack-builder/SKILL.md +92 -0
  276. package/skills/humanizer/SKILL.md +488 -0
  277. package/skills/profclaw-assistant/SKILL.md +85 -56
  278. package/ui/dist/assets/ActivityView-Da6HQ8ws.js +1 -0
  279. package/ui/dist/assets/AgentList-H58R0kX3.js +1 -0
  280. package/ui/dist/assets/AnalyticsDashboard-B28AeRsc.js +1 -0
  281. package/ui/dist/assets/AreaChart-DwLzeAQ8.js +1 -0
  282. package/ui/dist/assets/CartesianChart-piKQsTAR.js +36 -0
  283. package/ui/dist/assets/ChatView-Dbj8rxU5.js +10 -0
  284. package/ui/dist/assets/CostsDashboard-C6F5df0F.js +1 -0
  285. package/ui/dist/assets/EstimateSelect-wga0rUKX.js +1 -0
  286. package/ui/dist/assets/FeedDashboard-Ef6FEzEf.js +1 -0
  287. package/ui/dist/assets/FloatingChatbot-0yhkUeCq.js +2 -0
  288. package/ui/dist/assets/InviteCodeManagement-tUXfx4Bc.js +2 -0
  289. package/ui/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  290. package/ui/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  291. package/ui/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  292. package/ui/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  293. package/ui/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  294. package/ui/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  295. package/ui/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  296. package/ui/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  297. package/ui/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  298. package/ui/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  299. package/ui/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  300. package/ui/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  301. package/ui/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  302. package/ui/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  303. package/ui/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  304. package/ui/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  305. package/ui/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  306. package/ui/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  307. package/ui/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  308. package/ui/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  309. package/ui/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  310. package/ui/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  311. package/ui/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  312. package/ui/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  313. package/ui/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  314. package/ui/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  315. package/ui/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  316. package/ui/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  317. package/ui/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  318. package/ui/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  319. package/ui/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  320. package/ui/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  321. package/ui/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  322. package/ui/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  323. package/ui/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  324. package/ui/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  325. package/ui/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  326. package/ui/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  327. package/ui/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  328. package/ui/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  329. package/ui/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  330. package/ui/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  331. package/ui/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  332. package/ui/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  333. package/ui/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  334. package/ui/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  335. package/ui/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  336. package/ui/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  337. package/ui/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  338. package/ui/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  339. package/ui/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  340. package/ui/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  341. package/ui/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  342. package/ui/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  343. package/ui/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  344. package/ui/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  345. package/ui/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  346. package/ui/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  347. package/ui/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  348. package/ui/dist/assets/MarketplacePage-DGrLtolR.js +1 -0
  349. package/ui/dist/assets/{ProjectDetail--gPfvATB.js → ProjectDetail-BgWvA6UP.js} +2 -2
  350. package/ui/dist/assets/ProjectIcon-TDuliqwg.js +1 -0
  351. package/ui/dist/assets/ProjectList-DXgM4187.js +1 -0
  352. package/ui/dist/assets/{Settings-1kaf7VHE.js → Settings-xA8Zhi3p.js} +3 -3
  353. package/ui/dist/assets/StatusIndicator-B8vfFAxg.js +1 -0
  354. package/ui/dist/assets/{SummaryDetail-DV3AmONk.js → SummaryDetail-eedRfTtF.js} +2 -2
  355. package/ui/dist/assets/SummaryList-CLNX2P84.js +1 -0
  356. package/ui/dist/assets/TaskDetail-BtWclNiR.js +1 -0
  357. package/ui/dist/assets/TaskList-JjODAgSc.js +1 -0
  358. package/ui/dist/assets/TeamsPage-CBK5iAyx.js +1 -0
  359. package/ui/dist/assets/TicketBoard-C9aJNNYp.js +1 -0
  360. package/ui/dist/assets/TicketDetail-CV5JmL31.js +1 -0
  361. package/ui/dist/assets/TicketList-68V4lzUz.js +1 -0
  362. package/ui/dist/assets/UserManagement-DKTb6UpE.js +2 -0
  363. package/ui/dist/assets/ViewSwitcher-BvdQht2Y.js +1 -0
  364. package/ui/dist/assets/alert-dialog-O6qBOv_f.js +1 -0
  365. package/ui/dist/assets/{archive-BsLa7brF.js → archive-CX7UvZpf.js} +1 -1
  366. package/ui/dist/assets/badge-BbfnwDJP.js +1 -0
  367. package/ui/dist/assets/{bug-CmZI7jqM.js → bug-3WX0394-.js} +1 -1
  368. package/ui/dist/assets/{calendar-Bf0t2B82.js → calendar-buq77TaS.js} +1 -1
  369. package/ui/dist/assets/{chevron-up-CoUsOvZj.js → chevron-up-4ymsBJRo.js} +1 -1
  370. package/ui/dist/assets/{circle-x-Dgw11LgT.js → circle-x-ByXtwR6Y.js} +1 -1
  371. package/ui/dist/assets/constants-CVdDh7p0.js +1 -0
  372. package/ui/dist/assets/{cpu-DiPMQICV.js → cpu-CiuoCeDY.js} +1 -1
  373. package/ui/dist/assets/{database-BwTfupDi.js → database-BWXSBg5a.js} +1 -1
  374. package/ui/dist/assets/dialog-lDg4NvMV.js +1 -0
  375. package/ui/dist/assets/dollar-sign-Dmijd6DP.js +1 -0
  376. package/ui/dist/assets/{ellipsis-UJx4Xnf6.js → ellipsis-vT-5SVIp.js} +1 -1
  377. package/ui/dist/assets/{ellipsis-vertical-DoULYEKn.js → ellipsis-vertical-B4tAX_bL.js} +1 -1
  378. package/ui/dist/assets/feature-markdown-DBo5Q7uq.js +289 -0
  379. package/ui/dist/assets/{file-code-B2UrJLwi.js → file-code-ChOWdKXf.js} +1 -1
  380. package/ui/dist/assets/{folder-open-BJi577JH.js → folder-open-CkOUbIiP.js} +1 -1
  381. package/ui/dist/assets/{funnel-PkaD_HSR.js → funnel-uZkoSPP-.js} +1 -1
  382. package/ui/dist/assets/{git-branch-C_K30am0.js → git-branch-CwvUxj7C.js} +1 -1
  383. package/ui/dist/assets/{git-commit-horizontal-IT6ecxWQ.js → git-commit-horizontal-lxPzCvhD.js} +1 -1
  384. package/ui/dist/assets/{globe-f-jjCa_g.js → globe-D_WpJdsj.js} +1 -1
  385. package/ui/dist/assets/{hash-DNEv8Elo.js → hash-CA0hJ7vh.js} +1 -1
  386. package/ui/dist/assets/{history-BQSBo_1Q.js → history-CEWMLELs.js} +1 -1
  387. package/ui/dist/assets/inbox-ehtOptTV.js +1 -0
  388. package/ui/dist/assets/{index-nS3EErDg.js → index-C1rhbml4.js} +3 -3
  389. package/ui/dist/assets/index-CR8gfCHv.js +1 -0
  390. package/ui/dist/assets/index-DVXMpWai.js +1 -0
  391. package/ui/dist/assets/index-DaDJMM2v.js +1 -0
  392. package/ui/dist/assets/index-Djdq_0xu.js +1 -0
  393. package/ui/dist/assets/index-M46Gcb8K.css +1 -0
  394. package/ui/dist/assets/index-sEBN7w8J.js +109 -0
  395. package/ui/dist/assets/layers-C6Mhf8Nk.js +1 -0
  396. package/ui/dist/assets/{layout-dashboard-CcKt1hXw.js → layout-dashboard-BRUM0kpT.js} +1 -1
  397. package/ui/dist/assets/{lightbulb-Jhp7FvbU.js → lightbulb-CN2q1O5l.js} +1 -1
  398. package/ui/dist/assets/{link-2-DdO7ostF.js → link-2-CC4E28yJ.js} +1 -1
  399. package/ui/dist/assets/markdown-renderer-C6ENbB0u.js +10 -0
  400. package/ui/dist/assets/markdown-renderer-CfVKi3_s.css +1 -0
  401. package/ui/dist/assets/{message-square-CBgH65X7.js → message-square-Bbb241am.js} +1 -1
  402. package/ui/dist/assets/package-CwT3IzFx.js +1 -0
  403. package/ui/dist/assets/{pencil-CYXCEPQh.js → pencil-CDmiHzoj.js} +1 -1
  404. package/ui/dist/assets/{play-d1ONaH0-.js → play-tjy5jMQX.js} +1 -1
  405. package/ui/dist/assets/popover-CFHZf3pE.js +1 -0
  406. package/ui/dist/assets/progress-BboUHuLf.js +1 -0
  407. package/ui/dist/assets/{rocket-DhvUetsk.js → rocket--8ZHgdXJ.js} +1 -1
  408. package/ui/dist/assets/select-n108rXny.js +1 -0
  409. package/ui/dist/assets/{send-P0r5D7td.js → send-Cu7MR2Qh.js} +1 -1
  410. package/ui/dist/assets/server-DmodxZp-.js +1 -0
  411. package/ui/dist/assets/{settings-2-ocj5uHGx.js → settings-2-CkRNqkxj.js} +1 -1
  412. package/ui/dist/assets/sheet-7aUJkyzU.js +1 -0
  413. package/ui/dist/assets/{shield-check-DfVdE34l.js → shield-check-ViI3nMKE.js} +1 -1
  414. package/ui/dist/assets/{shield-off-8l0J6R-8.js → shield-off-DN3tagkn.js} +1 -1
  415. package/ui/dist/assets/skeleton-C0E1Nfro.js +1 -0
  416. package/ui/dist/assets/{smartphone-77_g3SQn.js → smartphone-5FghiXpA.js} +1 -1
  417. package/ui/dist/assets/{square-Ckzsr3Rn.js → square-DiNSx8K7.js} +1 -1
  418. package/ui/dist/assets/star-DhdFVidS.js +1 -0
  419. package/ui/dist/assets/switch-CIgVbZqQ.js +1 -0
  420. package/ui/dist/assets/table-BC56FVMV.js +1 -0
  421. package/ui/dist/assets/{tag-C35mgoEv.js → tag-CH_vQliw.js} +1 -1
  422. package/ui/dist/assets/textarea-CxDiKFXZ.js +1 -0
  423. package/ui/dist/assets/{timer-DHJBS2w1.js → timer-CdGVTb60.js} +1 -1
  424. package/ui/dist/assets/tooltip-BuW9A5UO.js +1 -0
  425. package/ui/dist/assets/{trash-2-keO5tKPE.js → trash-2-CucZJL0N.js} +1 -1
  426. package/ui/dist/assets/trending-down-BCezC1z2.js +1 -0
  427. package/ui/dist/assets/{trending-up-BBv8KbrY.js → trending-up-C5OYX2k2.js} +1 -1
  428. package/ui/dist/assets/vendor-query-C0p7b53x.js +4 -0
  429. package/ui/dist/assets/vendor-react-Mc5_kfYG.js +12 -0
  430. package/ui/dist/assets/vendor-ui-CXPAUBFv.js +51 -0
  431. package/ui/dist/assets/{wand-sparkles-BusQ52ZK.js → wand-sparkles-BaH6pJnc.js} +1 -1
  432. package/ui/dist/assets/{wrench-02YaOSiK.js → wrench-CjxjP6ok.js} +1 -1
  433. package/ui/dist/index.html +5 -2
  434. package/ui/dist/assets/ActivityView-BeshZXmE.js +0 -1
  435. package/ui/dist/assets/AgentList-QVHeldPi.js +0 -1
  436. package/ui/dist/assets/AnalyticsDashboard-C9R97dXE.js +0 -1
  437. package/ui/dist/assets/AreaChart-B73gaiVQ.js +0 -1
  438. package/ui/dist/assets/CartesianChart-CXYL2R-A.js +0 -36
  439. package/ui/dist/assets/ChatView-qjZErlrp.js +0 -10
  440. package/ui/dist/assets/CostsDashboard-O4DCLy1i.js +0 -1
  441. package/ui/dist/assets/EstimateSelect-1hQf4Osk.js +0 -1
  442. package/ui/dist/assets/FloatingChatbot-BZBzrJxd.js +0 -2
  443. package/ui/dist/assets/InviteCodeManagement-LEoGqYeA.js +0 -2
  444. package/ui/dist/assets/ProjectIcon-Chd_ofsw.js +0 -1
  445. package/ui/dist/assets/ProjectList-BvUfVB6c.js +0 -4
  446. package/ui/dist/assets/StatusIndicator-pRfkNcdV.js +0 -1
  447. package/ui/dist/assets/SummaryList-B6kXiTxL.js +0 -1
  448. package/ui/dist/assets/TaskDetail-CV6CzbOS.js +0 -1
  449. package/ui/dist/assets/TaskList-DL7brQKd.js +0 -1
  450. package/ui/dist/assets/TicketBoard-CrkkFj7C.js +0 -1
  451. package/ui/dist/assets/TicketDetail-hnnYclpD.js +0 -1
  452. package/ui/dist/assets/TicketList-CsDAyQCL.js +0 -1
  453. package/ui/dist/assets/UserManagement-BGFQyTSr.js +0 -2
  454. package/ui/dist/assets/ViewSwitcher-CnL0OqA8.js +0 -1
  455. package/ui/dist/assets/alert-dialog-SKM6Gjz4.js +0 -7
  456. package/ui/dist/assets/badge-CVHH1a-v.js +0 -1
  457. package/ui/dist/assets/brain-6o_RHVpe.js +0 -1
  458. package/ui/dist/assets/constants-Q5Zivl-a.js +0 -1
  459. package/ui/dist/assets/dialog-BUqN9Psj.js +0 -1
  460. package/ui/dist/assets/index-BUmnwPQr.js +0 -1
  461. package/ui/dist/assets/index-BfF5G4Cw.js +0 -1
  462. package/ui/dist/assets/index-C8N375c2.js +0 -1
  463. package/ui/dist/assets/index-CuxnqVVz.css +0 -1
  464. package/ui/dist/assets/index-CzMM3QOk.js +0 -1
  465. package/ui/dist/assets/index-lJlNPFVJ.js +0 -67
  466. package/ui/dist/assets/layers-jFqVrWMD.js +0 -1
  467. package/ui/dist/assets/markdown-renderer-n1ToC4XQ.js +0 -36
  468. package/ui/dist/assets/popover-CrmZgoWu.js +0 -1
  469. package/ui/dist/assets/progress-uv4SPkL5.js +0 -1
  470. package/ui/dist/assets/select-CeQ8AHGy.js +0 -1
  471. package/ui/dist/assets/server-CVHTZB72.js +0 -1
  472. package/ui/dist/assets/sheet-DuQExSho.js +0 -1
  473. package/ui/dist/assets/skeleton-TFiFJ3nB.js +0 -1
  474. package/ui/dist/assets/switch-CAePkd6k.js +0 -1
  475. package/ui/dist/assets/table-ZjAZ7hkt.js +0 -1
  476. package/ui/dist/assets/textarea-DsVPnSgR.js +0 -1
  477. package/ui/dist/assets/tooltip-BYmQ331W.js +0 -1
@@ -29,11 +29,16 @@ import { buildSystemPrompt } from './system-prompts.js';
29
29
  import { createConversation, addMessage, getConversationMessages, } from './conversations.js';
30
30
  import { needsCompaction, compactMessages } from './memory.js';
31
31
  import { getSessionModel } from './execution/tools/session-status.js';
32
+ import { routeQuery, recordRoutingDecision, isSmartRouterEnabled } from '../providers/smart-router.js';
33
+ import { AutomationPatternDetector } from './proactive/index.js';
34
+ import { observeWindow } from '../memory/observational.js';
32
35
  // CONSTANTS
33
36
  /** Max concurrent AI calls to prevent overload (inspired by NanoClaw GroupQueue) */
34
37
  const MAX_CONCURRENT = parseInt(process.env['POOL_MAX_CONCURRENT'] ?? '50', 10);
35
38
  /** Currently processing count */
36
39
  let activeCount = 0;
40
+ /** Singleton automation pattern detector - learns across all conversations */
41
+ const patternDetector = new AutomationPatternDetector({ minOccurrences: 3 });
37
42
  // CONVERSATION CACHE
38
43
  /** In-memory cache: "telegram:default:12345" -> conversationId */
39
44
  const channelConversations = new Map();
@@ -151,8 +156,22 @@ async function handleIncomingMessage(event, _context) {
151
156
  const result = await compactMessages(messages);
152
157
  messages = result.messages;
153
158
  }
154
- // Resolve model - per-conversation override or system default
155
- const modelOverride = getSessionModel(conversationId);
159
+ // Resolve model - per-conversation override, smart routing, or system default
160
+ const sessionModel = getSessionModel(conversationId);
161
+ // Smart Model Router: auto-select cheapest capable model when no explicit override
162
+ const { aiProvider } = await import('../providers/ai-sdk.js');
163
+ let resolvedModel = sessionModel;
164
+ let routingDecision;
165
+ if (!sessionModel && isSmartRouterEnabled()) {
166
+ const availableProviders = new Set(aiProvider.getConfiguredProviders());
167
+ routingDecision = routeQuery(message.text, availableProviders, {
168
+ conversationLength: messages.length,
169
+ hasToolUse: false, // simple chat path has no tools
170
+ hasImages: false,
171
+ });
172
+ resolvedModel = routingDecision.selectedModel.id;
173
+ recordRoutingDecision(routingDecision);
174
+ }
156
175
  // Build system prompt with channel personality
157
176
  const personality = groupManager.getPersonality(message.chatId, message.provider);
158
177
  const promptContext = {
@@ -160,7 +179,7 @@ async function handleIncomingMessage(event, _context) {
160
179
  name: message.senderName || message.senderUsername,
161
180
  },
162
181
  runtime: {
163
- model: modelOverride,
182
+ model: resolvedModel,
164
183
  conversationId,
165
184
  },
166
185
  };
@@ -182,11 +201,10 @@ async function handleIncomingMessage(event, _context) {
182
201
  content: message.text,
183
202
  timestamp: message.timestamp.toISOString(),
184
203
  });
185
- // Call AI (lazy import to avoid loading all AI SDKs at startup)
186
- const { aiProvider } = await import('../providers/ai-sdk.js');
204
+ // Call AI with smart-routed or user-selected model
187
205
  const response = await aiProvider.chat({
188
206
  messages: aiMessages,
189
- model: modelOverride,
207
+ model: resolvedModel,
190
208
  systemPrompt,
191
209
  temperature: 0.7,
192
210
  });
@@ -227,7 +245,41 @@ async function handleIncomingMessage(event, _context) {
227
245
  conversationId,
228
246
  model: response.model,
229
247
  tokens: response.usage.totalTokens,
248
+ ...(routingDecision && {
249
+ smartRouted: true,
250
+ complexity: routingDecision.complexity.tier,
251
+ savings: `${routingDecision.savingsPercent}%`,
252
+ }),
230
253
  });
254
+ // Track query for automation pattern detection (non-blocking)
255
+ patternDetector.recordQuery(message.text);
256
+ const automationHint = patternDetector.detectPatterns();
257
+ if (automationHint) {
258
+ // Send a follow-up suggestion message
259
+ const hint = automationHint.suggestion;
260
+ const suggestionText = `${hint.message}\n\nI can set this up: "${hint.templateName}" (${hint.suggestedCron}).\nJust say "automate it" or "set it up" to create this automation.`;
261
+ sendProviderMessage({
262
+ provider: message.provider,
263
+ accountId: message.accountId,
264
+ to: message.chatId,
265
+ text: suggestionText,
266
+ threadId: replyTarget.threadId,
267
+ }).catch(() => { }); // fire and forget
268
+ logger.info('[MessageHandler] Automation pattern detected', {
269
+ pattern: automationHint.pattern,
270
+ count: automationHint.count,
271
+ template: hint.templateName,
272
+ });
273
+ }
274
+ // Observational memory: extract learnings every 10 messages (async, non-blocking)
275
+ if (messages.length > 0 && messages.length % 10 === 0) {
276
+ const observationMessages = messages.map(m => ({
277
+ role: m.role,
278
+ content: m.content,
279
+ }));
280
+ observeWindow(conversationId, observationMessages, 20, message.senderUsername)
281
+ .catch(() => { }); // fire and forget
282
+ }
231
283
  }
232
284
  catch (error) {
233
285
  logger.error('[MessageHandler] Failed to process message', {
@@ -163,5 +163,67 @@ export declare class BackgroundResearcher {
163
163
  inject(taskId: string, results: ResearchResult[]): void;
164
164
  private run;
165
165
  }
166
+ export interface PatternMatch {
167
+ pattern: string;
168
+ count: number;
169
+ firstSeen: number;
170
+ lastSeen: number;
171
+ /** Suggested automation */
172
+ suggestion: AutomationSuggestion;
173
+ }
174
+ export interface AutomationSuggestion {
175
+ message: string;
176
+ templateName: string;
177
+ suggestedCron: string;
178
+ params: Record<string, unknown>;
179
+ }
180
+ /**
181
+ * Detects repeated patterns in user queries and suggests automations.
182
+ *
183
+ * Tracks query frequency, tool usage patterns, and timing to identify
184
+ * tasks that should be automated via cron jobs.
185
+ */
186
+ export declare class AutomationPatternDetector {
187
+ private queryHistory;
188
+ private dismissedPatterns;
189
+ private maxHistory;
190
+ private readonly minOccurrences;
191
+ private readonly windowMs;
192
+ /** Max 1 suggestion per session */
193
+ private suggestedThisSession;
194
+ constructor(options?: {
195
+ /** Min occurrences before suggesting automation (default: 3) */
196
+ minOccurrences?: number;
197
+ /** Time window to look at (default: 7 days) */
198
+ windowMs?: number;
199
+ });
200
+ /**
201
+ * Record a user query for pattern analysis.
202
+ */
203
+ recordQuery(query: string, toolsUsed?: string[]): void;
204
+ /**
205
+ * Check for automation-worthy patterns.
206
+ * Returns a suggestion if a pattern is detected, or null.
207
+ * Only returns one suggestion per session to avoid fatigue.
208
+ */
209
+ detectPatterns(): PatternMatch | null;
210
+ /**
211
+ * User dismissed a suggestion - don't suggest it again.
212
+ */
213
+ dismiss(pattern: string): void;
214
+ /**
215
+ * Reset session state (call at session start).
216
+ */
217
+ resetSession(): void;
218
+ /**
219
+ * Normalize a query for pattern matching.
220
+ * Strips dates, numbers, and common filler to find the core intent.
221
+ */
222
+ private normalizeQuery;
223
+ /**
224
+ * Build an automation suggestion from a detected pattern.
225
+ */
226
+ private buildSuggestion;
227
+ }
166
228
  export {};
167
229
  //# sourceMappingURL=index.d.ts.map
@@ -720,4 +720,151 @@ export class BackgroundResearcher {
720
720
  }
721
721
  }
722
722
  }
723
+ /**
724
+ * Detects repeated patterns in user queries and suggests automations.
725
+ *
726
+ * Tracks query frequency, tool usage patterns, and timing to identify
727
+ * tasks that should be automated via cron jobs.
728
+ */
729
+ export class AutomationPatternDetector {
730
+ queryHistory = [];
731
+ dismissedPatterns = new Set();
732
+ maxHistory = 500;
733
+ minOccurrences;
734
+ windowMs;
735
+ /** Max 1 suggestion per session */
736
+ suggestedThisSession = false;
737
+ constructor(options) {
738
+ this.minOccurrences = options?.minOccurrences ?? 3;
739
+ this.windowMs = options?.windowMs ?? 7 * 24 * 60 * 60 * 1000;
740
+ }
741
+ /**
742
+ * Record a user query for pattern analysis.
743
+ */
744
+ recordQuery(query, toolsUsed = []) {
745
+ this.queryHistory.push({
746
+ query,
747
+ normalized: this.normalizeQuery(query),
748
+ timestamp: Date.now(),
749
+ toolsUsed,
750
+ });
751
+ // Trim old entries
752
+ if (this.queryHistory.length > this.maxHistory) {
753
+ this.queryHistory = this.queryHistory.slice(-this.maxHistory);
754
+ }
755
+ }
756
+ /**
757
+ * Check for automation-worthy patterns.
758
+ * Returns a suggestion if a pattern is detected, or null.
759
+ * Only returns one suggestion per session to avoid fatigue.
760
+ */
761
+ detectPatterns() {
762
+ if (this.suggestedThisSession)
763
+ return null;
764
+ const cutoff = Date.now() - this.windowMs;
765
+ const recent = this.queryHistory.filter((q) => q.timestamp >= cutoff);
766
+ // Group by normalized query
767
+ const groups = new Map();
768
+ for (const record of recent) {
769
+ const existing = groups.get(record.normalized) || [];
770
+ existing.push(record);
771
+ groups.set(record.normalized, existing);
772
+ }
773
+ // Find patterns that exceed threshold
774
+ for (const [normalized, records] of groups) {
775
+ if (records.length < this.minOccurrences)
776
+ continue;
777
+ if (this.dismissedPatterns.has(normalized))
778
+ continue;
779
+ const suggestion = this.buildSuggestion(normalized, records);
780
+ if (!suggestion)
781
+ continue;
782
+ this.suggestedThisSession = true;
783
+ return {
784
+ pattern: normalized,
785
+ count: records.length,
786
+ firstSeen: records[0].timestamp,
787
+ lastSeen: records[records.length - 1].timestamp,
788
+ suggestion,
789
+ };
790
+ }
791
+ return null;
792
+ }
793
+ /**
794
+ * User dismissed a suggestion - don't suggest it again.
795
+ */
796
+ dismiss(pattern) {
797
+ this.dismissedPatterns.add(pattern);
798
+ }
799
+ /**
800
+ * Reset session state (call at session start).
801
+ */
802
+ resetSession() {
803
+ this.suggestedThisSession = false;
804
+ }
805
+ /**
806
+ * Normalize a query for pattern matching.
807
+ * Strips dates, numbers, and common filler to find the core intent.
808
+ */
809
+ normalizeQuery(query) {
810
+ return query
811
+ .toLowerCase()
812
+ .replace(/\b(today|yesterday|this week|last week|this morning)\b/g, '')
813
+ .replace(/\b\d{4}[-/]\d{2}[-/]\d{2}\b/g, '')
814
+ .replace(/\b\d+\b/g, 'N')
815
+ .replace(/\s+/g, ' ')
816
+ .trim();
817
+ }
818
+ /**
819
+ * Build an automation suggestion from a detected pattern.
820
+ */
821
+ buildSuggestion(normalized, records) {
822
+ // Detect common tool patterns
823
+ const toolCounts = new Map();
824
+ for (const record of records) {
825
+ for (const tool of record.toolsUsed) {
826
+ toolCounts.set(tool, (toolCounts.get(tool) || 0) + 1);
827
+ }
828
+ }
829
+ const usesWebSearch = (toolCounts.get('web_search') || 0) >= 2;
830
+ const usesWebFetch = (toolCounts.get('web_fetch') || 0) >= 2;
831
+ // News/research patterns
832
+ if (usesWebSearch || normalized.includes('news') || normalized.includes('latest') || normalized.includes('update')) {
833
+ return {
834
+ message: `You've asked about this ${records.length} times recently. Want me to set up a daily digest?`,
835
+ templateName: 'Morning AI News Digest',
836
+ suggestedCron: '0 7 * * 1-5',
837
+ params: { prompt: records[records.length - 1].query },
838
+ };
839
+ }
840
+ // Status/report patterns
841
+ if (normalized.includes('status') || normalized.includes('summary') || normalized.includes('report')) {
842
+ return {
843
+ message: `You check this regularly. Want me to generate this report automatically?`,
844
+ templateName: 'Daily Status Report',
845
+ suggestedCron: '0 9 * * 1-5',
846
+ params: { prompt: records[records.length - 1].query },
847
+ };
848
+ }
849
+ // Health/monitoring patterns
850
+ if (normalized.includes('health') || normalized.includes('check') || normalized.includes('monitor')) {
851
+ return {
852
+ message: `You run this check often. Want me to monitor this automatically?`,
853
+ templateName: 'Health Check',
854
+ suggestedCron: '*/30 * * * *',
855
+ params: { prompt: records[records.length - 1].query },
856
+ };
857
+ }
858
+ // Generic repeated task
859
+ if (records.length >= 5) {
860
+ return {
861
+ message: `You've done this ${records.length} times. Want me to automate it on a schedule?`,
862
+ templateName: 'Custom AI Agent Task',
863
+ suggestedCron: '0 9 * * *',
864
+ params: { prompt: records[records.length - 1].query },
865
+ };
866
+ }
867
+ return null;
868
+ }
869
+ }
723
870
  //# sourceMappingURL=index.js.map
@@ -71,6 +71,8 @@ function getContextWindow(modelId) {
71
71
  return 32768;
72
72
  if (/phi/i.test(modelId))
73
73
  return 16384;
74
+ if (/gemma-?4/i.test(modelId))
75
+ return 128000;
74
76
  if (/gemma/i.test(modelId))
75
77
  return 8192;
76
78
  return 32768;
@@ -47,10 +47,10 @@ export declare const IRCAccountConfigSchema: z.ZodObject<{
47
47
  channels: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
48
48
  useTLS: z.ZodDefault<z.ZodBoolean>;
49
49
  }, "strip", z.ZodTypeAny, {
50
+ port: number;
50
51
  id: string;
51
52
  provider: "irc";
52
53
  enabled: boolean;
53
- port: number;
54
54
  useTLS: boolean;
55
55
  name?: string | undefined;
56
56
  isDefault?: boolean | undefined;
@@ -62,10 +62,10 @@ export declare const IRCAccountConfigSchema: z.ZodObject<{
62
62
  id: string;
63
63
  provider: "irc";
64
64
  name?: string | undefined;
65
+ port?: number | undefined;
65
66
  isDefault?: boolean | undefined;
66
67
  enabled?: boolean | undefined;
67
68
  password?: string | undefined;
68
- port?: number | undefined;
69
69
  channels?: string[] | undefined;
70
70
  server?: string | undefined;
71
71
  nick?: string | undefined;
@@ -28,6 +28,7 @@ interface TelegramChat {
28
28
  }
29
29
  interface TelegramMessage {
30
30
  message_id: number;
31
+ message_thread_id?: number;
31
32
  from?: TelegramUser;
32
33
  chat: TelegramChat;
33
34
  date: number;
@@ -48,6 +49,7 @@ interface TelegramMessage {
48
49
  file_name?: string;
49
50
  mime_type?: string;
50
51
  };
52
+ is_topic_message?: boolean;
51
53
  }
52
54
  interface TelegramCallbackQuery {
53
55
  id: string;
@@ -46,7 +46,7 @@ const capabilities = {
46
46
  reactions: true,
47
47
  edit: true,
48
48
  delete: true,
49
- threads: false, // Telegram uses reply-to
49
+ threads: true, // Forum topics via message_thread_id
50
50
  media: true,
51
51
  richBlocks: false, // Uses HTML/Markdown
52
52
  oauth: false,
@@ -176,11 +176,26 @@ const outboundAdapter = {
176
176
  const chunks = textChunks.length > 0 ? textChunks : [undefined];
177
177
  let replyToId = message.replyToId ? parseInt(message.replyToId, 10) : undefined;
178
178
  let firstMessage;
179
+ // Parse topic from threadId or "chatId:topic:topicId" format in `to`
180
+ let targetChatId = message.to;
181
+ let topicId;
182
+ if (message.threadId) {
183
+ topicId = parseInt(message.threadId, 10);
184
+ }
185
+ else if (targetChatId.includes(':topic:')) {
186
+ const parts = targetChatId.split(':topic:');
187
+ targetChatId = parts[0];
188
+ topicId = parseInt(parts[1], 10);
189
+ }
179
190
  for (const [index, chunk] of chunks.entries()) {
180
191
  const params = {
181
- chat_id: message.to,
192
+ chat_id: targetChatId,
182
193
  parse_mode: 'HTML',
183
194
  };
195
+ // Forum topic support
196
+ if (topicId && !isNaN(topicId)) {
197
+ params.message_thread_id = topicId;
198
+ }
184
199
  if (chunk !== undefined) {
185
200
  params.text = chunk;
186
201
  }
@@ -288,6 +303,10 @@ const inboundAdapter = {
288
303
  chatType: getChatType(message.chat.type),
289
304
  chatId: String(message.chat.id),
290
305
  chatName: message.chat.title || message.chat.first_name,
306
+ // Forum topic support: include topic ID as threadId
307
+ threadId: message.message_thread_id
308
+ ? String(message.message_thread_id)
309
+ : undefined,
291
310
  replyToId: message.reply_to_message
292
311
  ? String(message.reply_to_message.message_id)
293
312
  : undefined,
@@ -13,10 +13,10 @@ export interface RuntimeInfo {
13
13
  conversationId?: string;
14
14
  sessionOverride?: string;
15
15
  }
16
- export declare const PROFCLAW_CONTEXT = "You are profClaw Assistant, an AI helper integrated into profClaw Task Manager.\n\nprofClaw is a task orchestration platform for AI-assisted development - managing tickets, routing work to AI agents, and tracking progress.\n\n## Response Style\n- Be helpful and concise\n- Use markdown for structure\n- Match effort to the request - simple questions get simple answers\n- Ask clarifying questions when needed";
16
+ export declare const PROFCLAW_CONTEXT = "You are profClaw, a personal AI assistant running inside profClaw engine.\nYou help with coding, research, automation, and general tasks. You have access to tools - use them.\n\n## Response Style\n- Be concise and direct. No filler, no preamble.\n- Do NOT use emoji headers, LaTeX, or excessive formatting.\n- Use short paragraphs and plain markdown (headers, bold, code blocks only when needed).\n- Match the user's tone \u2014 casual question gets a casual answer.\n- Lead with the answer, then explain only if needed.";
17
17
  export declare const GROUNDING_SUFFIX = "\n\n## Important Reminder\nYou are a chat assistant, not an execution engine. You can:\n- Help draft content, analyze information, and answer questions\n- Provide guidance on how to use profClaw\n\nYou CANNOT:\n- Execute code, run scripts, or make API calls\n- Directly modify tasks, tickets, or any data\n- Access external systems or the user's files\n\nIf asked to \"run\" or \"execute\" something, explain that you can help write or draft it, but the user needs to execute it themselves through the profClaw UI or API.";
18
- export declare const TOOL_ENABLED_SUFFIX = "\n\n## Tool Usage\nYou have access to tools that allow you to:\n- **Read files** and search codebases\n- **Fetch web content** from URLs (web_fetch tool)\n- **Browse websites** interactively (browser_navigate, browser_screenshot)\n- **Execute system commands** (with user approval for dangerous ones)\n- **Access profClaw operations** (list tasks, tickets, etc.)\n\nWhen the user asks you to do something that requires these capabilities:\n1. Use the appropriate tool - don't say you can't do it\n2. If a tool requires approval, explain what you're trying to do and wait for approval\n3. After tool execution, continue the conversation and explain what you found/did\n4. If a tool fails, explain the error and suggest alternatives\n\n**IMPORTANT**: When a tool returns \"pending\" or \"requires approval\", tell the user you're waiting for their approval in the UI, then STOP and wait. Do not continue until approval is given.\n\n**After approval**: Once a tool is approved and executed, summarize the results and continue helping the user.";
19
- export declare const AGENT_MODE_SUFFIX = "\n\n## Tool Usage\nYou have access to tools. Use them when you NEED external data or actions.\n\n**DO NOT use tools for:**\n- Greetings (\"hi\", \"hello\") \u2192 Just respond naturally\n- Questions about yourself \u2192 Explain from knowledge\n- General knowledge questions \u2192 Answer directly\n- Acknowledgments, thanks, small talk \u2192 Just respond\n\n**USE tools when you need to:**\n- Read files, fetch web data, run commands\n- Create/update tickets, projects, or other profClaw resources\n- Perform any action the user explicitly requests\n\n**When using tools:**\n- Chain tools to complete multi-step requests \u2014 don't stop after one call\n- Use parallel tool calls when steps are independent\n- Do NOT ask for confirmation \u2014 just execute the requested actions\n- After all steps are done, call `complete_task` with a summary\n\n**When NOT using tools:**\n- Respond with text directly \u2014 do NOT call `complete_task` for text-only responses";
18
+ export declare const TOOL_ENABLED_SUFFIX = "\n\n## Tools \u2014 YOU MUST USE THEM\nYou have real tools that execute actions. You are NOT limited to text responses.\n\nALWAYS call a tool when the user asks you to:\n- Search the web \u2192 call web_search\n- Read a URL or website \u2192 call web_fetch\n- Read a file \u2192 call read_file\n- Run a command \u2192 call exec\n- Write a file \u2192 call write_file\n\nDo NOT say \"I can't browse the web\" or \"I can't access files.\" You CAN. Call the tool.\nIf you're unsure, call the tool anyway \u2014 it's better to try and fail than refuse.";
19
+ export declare const AGENT_MODE_SUFFIX = "\n\n## Tool Call Style\nDo not narrate routine tool calls - just call the tool.\nNarrate only for multi-step work, complex problems, or sensitive actions.\nWhen a tool exists for an action, use it directly. Never say \"I can't do that\" when a tool can.\n\n## Tool Usage\nYou have tools. Use them when the task requires external data or actions.\n\n**ALWAYS use tools for:**\n- Any search/lookup/research request -> web_search\n- Reading a URL/website -> web_fetch\n- File operations -> read_file, write_file, edit_file, grep\n- Running commands -> exec\n- Git/GitHub operations -> git_*, github_pr, create_pr\n- Code quality -> typecheck, lint, build, test_run\n- \"What is X?\" about anything specific -> web_search (do NOT guess)\n\n**Skip tools only for:** greetings, thanks, simple math, questions about yourself.\n\n**Rules:**\n- Chain tools for multi-step tasks. Do not stop after one call.\n- Use parallel calls when steps are independent.\n- Do NOT ask permission. Just execute.\n- If a tool fails, try an alternative approach.\n- After completing work, call complete_task with a brief summary.\n- For text-only replies, do NOT call complete_task.\n\n## Skills\nYou have access to skills (see Available Skills list). Before starting a complex task:\n1. Scan the skills list for a relevant skill\n2. If found, read the skill's SKILL.md with read_file to get detailed instructions\n3. Follow the skill's workflow\n\n## Workspace\nTreat the current directory as your workspace. Use relative paths.\nWhen modifying code: read first, then edit, then verify (typecheck/test).\n\n## Safety\nDo not pursue independent goals beyond the user's request.\nPrioritize safety and human oversight. If instructions conflict, ask.\nDo not manipulate access controls or bypass safeguards.";
20
20
  export interface ChatPreset {
21
21
  id: string;
22
22
  name: string;