profclaw 2.0.0 → 2.4.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 (519) hide show
  1. package/.env.example +14 -2
  2. package/CHANGELOG.md +52 -0
  3. package/CONTRIBUTING.md +20 -0
  4. package/Dockerfile +39 -23
  5. package/README.md +178 -41
  6. package/config/pricing.yml +26 -2
  7. package/dist/agents/agent-summary.d.ts +44 -0
  8. package/dist/agents/agent-summary.js +176 -0
  9. package/dist/agents/auto-memory.d.ts +59 -0
  10. package/dist/agents/auto-memory.js +310 -0
  11. package/dist/agents/checkpoint-manager.d.ts +76 -0
  12. package/dist/agents/checkpoint-manager.js +156 -0
  13. package/dist/agents/circuit-breaker.d.ts +54 -0
  14. package/dist/agents/circuit-breaker.js +153 -0
  15. package/dist/agents/command-sandbox.d.ts +93 -0
  16. package/dist/agents/command-sandbox.js +235 -0
  17. package/dist/agents/context-compactor.d.ts +70 -0
  18. package/dist/agents/context-compactor.js +361 -0
  19. package/dist/agents/conversation-branch.d.ts +55 -0
  20. package/dist/agents/conversation-branch.js +115 -0
  21. package/dist/agents/error-recovery.d.ts +44 -0
  22. package/dist/agents/error-recovery.js +197 -0
  23. package/dist/agents/events.d.ts +76 -0
  24. package/dist/agents/events.js +8 -0
  25. package/dist/agents/executor-runner.d.ts +135 -0
  26. package/dist/agents/executor-runner.js +303 -0
  27. package/dist/agents/executor.d.ts +37 -1
  28. package/dist/agents/executor.js +606 -124
  29. package/dist/agents/file-snapshots.d.ts +72 -0
  30. package/dist/agents/file-snapshots.js +182 -0
  31. package/dist/agents/index.d.ts +2 -0
  32. package/dist/agents/orchestrator.d.ts +183 -0
  33. package/dist/agents/orchestrator.js +495 -0
  34. package/dist/agents/output-truncator.d.ts +59 -0
  35. package/dist/agents/output-truncator.js +128 -0
  36. package/dist/agents/permissions.d.ts +63 -0
  37. package/dist/agents/permissions.js +138 -0
  38. package/dist/agents/plan-mode.d.ts +71 -0
  39. package/dist/agents/plan-mode.js +186 -0
  40. package/dist/agents/prompt-suggestions.d.ts +33 -0
  41. package/dist/agents/prompt-suggestions.js +208 -0
  42. package/dist/agents/rate-limit-monitor.d.ts +56 -0
  43. package/dist/agents/rate-limit-monitor.js +224 -0
  44. package/dist/agents/receipt/receipt-cli.d.ts +43 -0
  45. package/dist/agents/receipt/receipt-cli.js +82 -0
  46. package/dist/agents/receipt/receipt-types.d.ts +136 -0
  47. package/dist/agents/receipt/receipt-types.js +19 -0
  48. package/dist/agents/receipt/receipt-verify.d.ts +19 -0
  49. package/dist/agents/receipt/receipt-verify.js +176 -0
  50. package/dist/agents/receipt/receipt-view.d.ts +29 -0
  51. package/dist/agents/receipt/receipt-view.js +227 -0
  52. package/dist/agents/receipt/receipt-writer.d.ts +47 -0
  53. package/dist/agents/receipt/receipt-writer.js +186 -0
  54. package/dist/agents/result-store.d.ts +43 -0
  55. package/dist/agents/result-store.js +145 -0
  56. package/dist/agents/session-diff.d.ts +49 -0
  57. package/dist/agents/session-diff.js +249 -0
  58. package/dist/agents/tool-loader.d.ts +65 -0
  59. package/dist/agents/tool-loader.js +273 -0
  60. package/dist/agents/tool-selector.d.ts +123 -0
  61. package/dist/agents/tool-selector.js +321 -0
  62. package/dist/agents/transcript.d.ts +96 -0
  63. package/dist/agents/transcript.js +267 -0
  64. package/dist/agents/verified-run-git.d.ts +49 -0
  65. package/dist/agents/verified-run-git.js +82 -0
  66. package/dist/agents/verified-run.d.ts +149 -0
  67. package/dist/agents/verified-run.js +402 -0
  68. package/dist/agents/verifier.d.ts +64 -0
  69. package/dist/agents/verifier.js +186 -0
  70. package/dist/agents/worktree-manager.d.ts +80 -0
  71. package/dist/agents/worktree-manager.js +203 -0
  72. package/dist/agents/worktree-tools.d.ts +47 -0
  73. package/dist/agents/worktree-tools.js +246 -0
  74. package/dist/auth/middleware.js +14 -0
  75. package/dist/chat/agentic-executor.d.ts +7 -0
  76. package/dist/chat/agentic-executor.js +263 -32
  77. package/dist/chat/conversations.d.ts +2 -0
  78. package/dist/chat/conversations.js +8 -0
  79. package/dist/chat/execution/executor.d.ts +8 -0
  80. package/dist/chat/execution/executor.js +157 -103
  81. package/dist/chat/execution/index.js +5 -1
  82. package/dist/chat/execution/sandbox.d.ts +8 -0
  83. package/dist/chat/execution/sandbox.js +25 -1
  84. package/dist/chat/execution/tool-router.js +40 -14
  85. package/dist/chat/execution/tools/canvas.d.ts +2 -2
  86. package/dist/chat/execution/tools/code-tools.d.ts +66 -0
  87. package/dist/chat/execution/tools/code-tools.js +353 -0
  88. package/dist/chat/execution/tools/complete-task.d.ts +2 -2
  89. package/dist/chat/execution/tools/cron-tool.d.ts +26 -10
  90. package/dist/chat/execution/tools/cron-tool.js +48 -3
  91. package/dist/chat/execution/tools/decompose-task.d.ts +58 -0
  92. package/dist/chat/execution/tools/decompose-task.js +166 -0
  93. package/dist/chat/execution/tools/exec.d.ts +5 -2
  94. package/dist/chat/execution/tools/exec.js +294 -155
  95. package/dist/chat/execution/tools/feed-tools.d.ts +77 -0
  96. package/dist/chat/execution/tools/feed-tools.js +142 -0
  97. package/dist/chat/execution/tools/file-ops.d.ts +1 -1
  98. package/dist/chat/execution/tools/github.d.ts +2 -2
  99. package/dist/chat/execution/tools/index.d.ts +14 -2
  100. package/dist/chat/execution/tools/index.js +86 -12
  101. package/dist/chat/execution/tools/integrations.d.ts +8 -8
  102. package/dist/chat/execution/tools/multi-patch.d.ts +53 -0
  103. package/dist/chat/execution/tools/multi-patch.js +373 -0
  104. package/dist/chat/execution/tools/openai-image-gen.d.ts +2 -2
  105. package/dist/chat/execution/tools/plan-tools.d.ts +80 -0
  106. package/dist/chat/execution/tools/plan-tools.js +134 -0
  107. package/dist/chat/execution/tools/profclaw-ops.d.ts +6 -6
  108. package/dist/chat/execution/tools/repl-tool.d.ts +46 -0
  109. package/dist/chat/execution/tools/repl-tool.js +207 -0
  110. package/dist/chat/execution/tools/sessions-send.d.ts +2 -2
  111. package/dist/chat/execution/tools/slack-actions.d.ts +2 -2
  112. package/dist/chat/execution/tools/system.d.ts +4 -4
  113. package/dist/chat/execution/tools/todo-tool.d.ts +72 -0
  114. package/dist/chat/execution/tools/todo-tool.js +152 -0
  115. package/dist/chat/execution/tools/tool-search.d.ts +50 -0
  116. package/dist/chat/execution/tools/tool-search.js +155 -0
  117. package/dist/chat/execution/tools/tts-speak.d.ts +2 -2
  118. package/dist/chat/execution/types.d.ts +21 -14
  119. package/dist/chat/execution/workflows/executor.d.ts +11 -0
  120. package/dist/chat/execution/workflows/executor.js +99 -1
  121. package/dist/chat/execution/workflows/types.d.ts +35 -2
  122. package/dist/chat/format/index.d.ts +1 -0
  123. package/dist/chat/format/index.js +1 -0
  124. package/dist/chat/format/markdown-convert.d.ts +23 -0
  125. package/dist/chat/format/markdown-convert.js +149 -0
  126. package/dist/chat/index.d.ts +1 -1
  127. package/dist/chat/index.js +1 -1
  128. package/dist/chat/message-handler.js +58 -6
  129. package/dist/chat/meta-tool-handlers.d.ts +18 -0
  130. package/dist/chat/meta-tool-handlers.js +51 -0
  131. package/dist/chat/proactive/index.d.ts +62 -0
  132. package/dist/chat/proactive/index.js +147 -0
  133. package/dist/chat/prompt-adapter.js +2 -0
  134. package/dist/chat/providers/irc/index.d.ts +2 -2
  135. package/dist/chat/providers/telegram/index.d.ts +2 -0
  136. package/dist/chat/providers/telegram/index.js +21 -2
  137. package/dist/chat/system-prompts.d.ts +3 -3
  138. package/dist/chat/system-prompts.js +121 -61
  139. package/dist/chat/tool-handler.d.ts +2 -0
  140. package/dist/chat/tool-handler.js +47 -3
  141. package/dist/chat/tools.d.ts +6 -6
  142. package/dist/cli/commands/auth.js +64 -1
  143. package/dist/cli/commands/chat.js +1327 -138
  144. package/dist/cli/commands/doctor.js +222 -16
  145. package/dist/cli/commands/history.d.ts +3 -0
  146. package/dist/cli/commands/history.js +138 -0
  147. package/dist/cli/commands/import.d.ts +44 -0
  148. package/dist/cli/commands/import.js +526 -0
  149. package/dist/cli/commands/init.d.ts +13 -0
  150. package/dist/cli/commands/init.js +381 -0
  151. package/dist/cli/commands/onboard.js +210 -30
  152. package/dist/cli/commands/plan.d.ts +13 -0
  153. package/dist/cli/commands/plan.js +184 -0
  154. package/dist/cli/commands/receipt.d.ts +7 -0
  155. package/dist/cli/commands/receipt.js +90 -0
  156. package/dist/cli/commands/run.d.ts +28 -0
  157. package/dist/cli/commands/run.js +204 -0
  158. package/dist/cli/commands/serve.d.ts +7 -0
  159. package/dist/cli/commands/serve.js +77 -18
  160. package/dist/cli/commands/setup.js +84 -3
  161. package/dist/cli/commands/status.js +54 -0
  162. package/dist/cli/commands/tools.js +13 -13
  163. package/dist/cli/commands/tui.js +26 -1
  164. package/dist/cli/index.js +23 -0
  165. package/dist/cli/ink/App.d.ts +13 -0
  166. package/dist/cli/ink/App.js +6 -0
  167. package/dist/cli/ink/ChatApp.d.ts +60 -0
  168. package/dist/cli/ink/ChatApp.js +325 -0
  169. package/dist/cli/ink/DashboardApp.d.ts +3 -0
  170. package/dist/cli/ink/DashboardApp.js +143 -0
  171. package/dist/cli/ink/components/AgentStatus.d.ts +17 -0
  172. package/dist/cli/ink/components/AgentStatus.js +33 -0
  173. package/dist/cli/ink/components/ChannelList.d.ts +17 -0
  174. package/dist/cli/ink/components/ChannelList.js +33 -0
  175. package/dist/cli/ink/components/ConnectionStatus.d.ts +19 -0
  176. package/dist/cli/ink/components/ConnectionStatus.js +50 -0
  177. package/dist/cli/ink/components/CostBar.d.ts +19 -0
  178. package/dist/cli/ink/components/CostBar.js +35 -0
  179. package/dist/cli/ink/components/HookStatus.d.ts +15 -0
  180. package/dist/cli/ink/components/HookStatus.js +7 -0
  181. package/dist/cli/ink/components/PermissionPrompt.d.ts +21 -0
  182. package/dist/cli/ink/components/PermissionPrompt.js +51 -0
  183. package/dist/cli/ink/components/PlanView.d.ts +23 -0
  184. package/dist/cli/ink/components/PlanView.js +26 -0
  185. package/dist/cli/ink/components/ProviderList.d.ts +16 -0
  186. package/dist/cli/ink/components/ProviderList.js +16 -0
  187. package/dist/cli/ink/components/SessionHeader.d.ts +15 -0
  188. package/dist/cli/ink/components/SessionHeader.js +15 -0
  189. package/dist/cli/ink/components/StreamingMessage.d.ts +20 -0
  190. package/dist/cli/ink/components/StreamingMessage.js +27 -0
  191. package/dist/cli/ink/components/SuggestionBar.d.ts +15 -0
  192. package/dist/cli/ink/components/SuggestionBar.js +28 -0
  193. package/dist/cli/ink/components/SystemHealth.d.ts +20 -0
  194. package/dist/cli/ink/components/SystemHealth.js +39 -0
  195. package/dist/cli/ink/components/TaskList.d.ts +17 -0
  196. package/dist/cli/ink/components/TaskList.js +59 -0
  197. package/dist/cli/ink/components/ToolCall.d.ts +17 -0
  198. package/dist/cli/ink/components/ToolCall.js +43 -0
  199. package/dist/cli/ink/index.d.ts +23 -0
  200. package/dist/cli/ink/index.js +15 -0
  201. package/dist/cli/ink/keybindings.d.ts +35 -0
  202. package/dist/cli/ink/keybindings.js +105 -0
  203. package/dist/cli/ink/markdown-renderer.d.ts +47 -0
  204. package/dist/cli/ink/markdown-renderer.js +380 -0
  205. package/dist/cli/ink/output-styles.d.ts +39 -0
  206. package/dist/cli/ink/output-styles.js +119 -0
  207. package/dist/cli/interactive/auto-serve.d.ts +38 -0
  208. package/dist/cli/interactive/auto-serve.js +209 -0
  209. package/dist/cli/interactive/index.d.ts +25 -0
  210. package/dist/cli/interactive/index.js +23 -0
  211. package/dist/cli/interactive/picker.d.ts +28 -0
  212. package/dist/cli/interactive/picker.js +153 -0
  213. package/dist/cli/interactive/renderer.d.ts +26 -0
  214. package/dist/cli/interactive/renderer.js +555 -0
  215. package/dist/cli/interactive/repl.d.ts +14 -0
  216. package/dist/cli/interactive/repl.js +1516 -0
  217. package/dist/cli/interactive/stream-client.d.ts +59 -0
  218. package/dist/cli/interactive/stream-client.js +506 -0
  219. package/dist/cli/interactive/types.d.ts +121 -0
  220. package/dist/cli/interactive/types.js +10 -0
  221. package/dist/cli/utils/api.d.ts +9 -0
  222. package/dist/cli/utils/api.js +58 -2
  223. package/dist/costs/token-tracker.d.ts +10 -1
  224. package/dist/costs/token-tracker.js +37 -5
  225. package/dist/cron/natural-language.d.ts +54 -0
  226. package/dist/cron/natural-language.js +569 -0
  227. package/dist/cron/scheduler.d.ts +34 -4
  228. package/dist/cron/scheduler.js +141 -9
  229. package/dist/cron/templates.d.ts +1 -1
  230. package/dist/cron/templates.js +219 -0
  231. package/dist/feeds/feed-engine.d.ts +149 -0
  232. package/dist/feeds/feed-engine.js +600 -0
  233. package/dist/feeds/index.d.ts +9 -0
  234. package/dist/feeds/index.js +8 -0
  235. package/dist/gateway/router.js +6 -1
  236. package/dist/hooks/built-in/audit-log.d.ts +11 -0
  237. package/dist/hooks/built-in/audit-log.js +84 -0
  238. package/dist/hooks/built-in/cost-warning.d.ts +10 -0
  239. package/dist/hooks/built-in/cost-warning.js +59 -0
  240. package/dist/hooks/built-in/dangerous-tool.d.ts +32 -0
  241. package/dist/hooks/built-in/dangerous-tool.js +80 -0
  242. package/dist/hooks/built-in/index.d.ts +14 -0
  243. package/dist/hooks/built-in/index.js +20 -0
  244. package/dist/hooks/index.d.ts +3 -0
  245. package/dist/hooks/index.js +6 -0
  246. package/dist/hooks/loader.d.ts +17 -0
  247. package/dist/hooks/loader.js +142 -0
  248. package/dist/hooks/registry.d.ts +62 -0
  249. package/dist/hooks/registry.js +127 -0
  250. package/dist/integrations/web-search.js +6 -3
  251. package/dist/memory/index.d.ts +1 -0
  252. package/dist/memory/index.js +2 -0
  253. package/dist/memory/memory-service.js +14 -13
  254. package/dist/memory/observational.d.ts +62 -0
  255. package/dist/memory/observational.js +396 -0
  256. package/dist/middleware/content-filter.d.ts +22 -0
  257. package/dist/middleware/content-filter.js +69 -0
  258. package/dist/middleware/request-validator.d.ts +159 -0
  259. package/dist/middleware/request-validator.js +93 -0
  260. package/dist/plugins/sdk.d.ts +22 -0
  261. package/dist/plugins/sdk.js +17 -1
  262. package/dist/projects/types.d.ts +10 -10
  263. package/dist/providers/ai-sdk.d.ts +11 -0
  264. package/dist/providers/ai-sdk.js +111 -56
  265. package/dist/providers/core/models.js +114 -6
  266. package/dist/providers/core/types.d.ts +7 -0
  267. package/dist/providers/index.d.ts +1 -0
  268. package/dist/providers/index.js +1 -0
  269. package/dist/providers/prompt-cache.d.ts +68 -0
  270. package/dist/providers/prompt-cache.js +165 -0
  271. package/dist/providers/smart-router.d.ts +118 -0
  272. package/dist/providers/smart-router.js +693 -0
  273. package/dist/providers/types.d.ts +16 -16
  274. package/dist/routes/agents.js +50 -0
  275. package/dist/routes/auth.js +8 -1
  276. package/dist/routes/chat.js +280 -18
  277. package/dist/routes/costs.js +32 -0
  278. package/dist/routes/cron.js +80 -5
  279. package/dist/routes/feeds.d.ts +10 -0
  280. package/dist/routes/feeds.js +168 -0
  281. package/dist/routes/mcp.js +21 -0
  282. package/dist/routes/memory.js +130 -0
  283. package/dist/routes/skills.js +129 -0
  284. package/dist/routes/teams.d.ts +9 -0
  285. package/dist/routes/teams.js +210 -0
  286. package/dist/routes/tools.js +14 -0
  287. package/dist/routes/users.js +2 -0
  288. package/dist/server/route-loader.js +3 -1
  289. package/dist/server/stream-bridge.d.ts +19 -0
  290. package/dist/server/stream-bridge.js +38 -0
  291. package/dist/server.js +313 -36
  292. package/dist/skills/marketplace.d.ts +87 -0
  293. package/dist/skills/marketplace.js +268 -0
  294. package/dist/storage/index.d.ts +14 -0
  295. package/dist/storage/index.js +64 -3
  296. package/dist/storage/schema.d.ts +4 -4
  297. package/dist/storage/schema.js +1 -1
  298. package/dist/teams/index.d.ts +110 -0
  299. package/dist/teams/index.js +365 -0
  300. package/dist/tickets/types.d.ts +39 -39
  301. package/dist/types/summary.d.ts +5 -5
  302. package/dist/utils/auto-update.d.ts +23 -0
  303. package/dist/utils/auto-update.js +157 -0
  304. package/dist/utils/offline-detect.d.ts +55 -0
  305. package/dist/utils/offline-detect.js +121 -0
  306. package/dist/utils/pid-file.d.ts +36 -0
  307. package/dist/utils/pid-file.js +125 -0
  308. package/dist/utils/prevent-sleep.d.ts +27 -0
  309. package/dist/utils/prevent-sleep.js +95 -0
  310. package/dist/utils/sanitizer.d.ts +57 -0
  311. package/dist/utils/sanitizer.js +174 -0
  312. package/docker-compose.yml +13 -137
  313. package/package.json +31 -6
  314. package/skills/deploy-cloudflare/SKILL.md +62 -0
  315. package/skills/deploy-vercel/SKILL.md +67 -0
  316. package/skills/docker-deploy/SKILL.md +158 -0
  317. package/skills/full-stack-builder/SKILL.md +92 -0
  318. package/skills/humanizer/SKILL.md +488 -0
  319. package/skills/profclaw-assistant/SKILL.md +85 -56
  320. package/ui/dist/assets/ActivityView-Da6HQ8ws.js +1 -0
  321. package/ui/dist/assets/AgentList-H58R0kX3.js +1 -0
  322. package/ui/dist/assets/AnalyticsDashboard-B28AeRsc.js +1 -0
  323. package/ui/dist/assets/AreaChart-DwLzeAQ8.js +1 -0
  324. package/ui/dist/assets/CartesianChart-piKQsTAR.js +36 -0
  325. package/ui/dist/assets/ChatView-Dbj8rxU5.js +10 -0
  326. package/ui/dist/assets/CostsDashboard-C6F5df0F.js +1 -0
  327. package/ui/dist/assets/EstimateSelect-wga0rUKX.js +1 -0
  328. package/ui/dist/assets/FeedDashboard-Ef6FEzEf.js +1 -0
  329. package/ui/dist/assets/FloatingChatbot-0yhkUeCq.js +2 -0
  330. package/ui/dist/assets/InviteCodeManagement-tUXfx4Bc.js +2 -0
  331. package/ui/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  332. package/ui/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  333. package/ui/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  334. package/ui/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  335. package/ui/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  336. package/ui/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  337. package/ui/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  338. package/ui/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  339. package/ui/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  340. package/ui/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  341. package/ui/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  342. package/ui/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  343. package/ui/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  344. package/ui/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  345. package/ui/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  346. package/ui/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  347. package/ui/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  348. package/ui/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  349. package/ui/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  350. package/ui/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  351. package/ui/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  352. package/ui/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  353. package/ui/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  354. package/ui/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  355. package/ui/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  356. package/ui/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  357. package/ui/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  358. package/ui/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  359. package/ui/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  360. package/ui/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  361. package/ui/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  362. package/ui/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  363. package/ui/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  364. package/ui/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  365. package/ui/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  366. package/ui/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  367. package/ui/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  368. package/ui/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  369. package/ui/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  370. package/ui/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  371. package/ui/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  372. package/ui/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  373. package/ui/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  374. package/ui/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  375. package/ui/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  376. package/ui/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  377. package/ui/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  378. package/ui/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  379. package/ui/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  380. package/ui/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  381. package/ui/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  382. package/ui/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  383. package/ui/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  384. package/ui/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  385. package/ui/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  386. package/ui/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  387. package/ui/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  388. package/ui/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  389. package/ui/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  390. package/ui/dist/assets/MarketplacePage-DGrLtolR.js +1 -0
  391. package/ui/dist/assets/{ProjectDetail--gPfvATB.js → ProjectDetail-BgWvA6UP.js} +2 -2
  392. package/ui/dist/assets/ProjectIcon-TDuliqwg.js +1 -0
  393. package/ui/dist/assets/ProjectList-DXgM4187.js +1 -0
  394. package/ui/dist/assets/{Settings-1kaf7VHE.js → Settings-xA8Zhi3p.js} +3 -3
  395. package/ui/dist/assets/StatusIndicator-B8vfFAxg.js +1 -0
  396. package/ui/dist/assets/{SummaryDetail-DV3AmONk.js → SummaryDetail-eedRfTtF.js} +2 -2
  397. package/ui/dist/assets/SummaryList-CLNX2P84.js +1 -0
  398. package/ui/dist/assets/TaskDetail-BtWclNiR.js +1 -0
  399. package/ui/dist/assets/TaskList-JjODAgSc.js +1 -0
  400. package/ui/dist/assets/TeamsPage-CBK5iAyx.js +1 -0
  401. package/ui/dist/assets/TicketBoard-C9aJNNYp.js +1 -0
  402. package/ui/dist/assets/TicketDetail-CV5JmL31.js +1 -0
  403. package/ui/dist/assets/TicketList-68V4lzUz.js +1 -0
  404. package/ui/dist/assets/UserManagement-DKTb6UpE.js +2 -0
  405. package/ui/dist/assets/ViewSwitcher-BvdQht2Y.js +1 -0
  406. package/ui/dist/assets/alert-dialog-O6qBOv_f.js +1 -0
  407. package/ui/dist/assets/{archive-BsLa7brF.js → archive-CX7UvZpf.js} +1 -1
  408. package/ui/dist/assets/badge-BbfnwDJP.js +1 -0
  409. package/ui/dist/assets/{bug-CmZI7jqM.js → bug-3WX0394-.js} +1 -1
  410. package/ui/dist/assets/{calendar-Bf0t2B82.js → calendar-buq77TaS.js} +1 -1
  411. package/ui/dist/assets/{chevron-up-CoUsOvZj.js → chevron-up-4ymsBJRo.js} +1 -1
  412. package/ui/dist/assets/{circle-x-Dgw11LgT.js → circle-x-ByXtwR6Y.js} +1 -1
  413. package/ui/dist/assets/constants-CVdDh7p0.js +1 -0
  414. package/ui/dist/assets/{cpu-DiPMQICV.js → cpu-CiuoCeDY.js} +1 -1
  415. package/ui/dist/assets/{database-BwTfupDi.js → database-BWXSBg5a.js} +1 -1
  416. package/ui/dist/assets/dialog-lDg4NvMV.js +1 -0
  417. package/ui/dist/assets/dollar-sign-Dmijd6DP.js +1 -0
  418. package/ui/dist/assets/{ellipsis-UJx4Xnf6.js → ellipsis-vT-5SVIp.js} +1 -1
  419. package/ui/dist/assets/{ellipsis-vertical-DoULYEKn.js → ellipsis-vertical-B4tAX_bL.js} +1 -1
  420. package/ui/dist/assets/feature-markdown-DBo5Q7uq.js +289 -0
  421. package/ui/dist/assets/{file-code-B2UrJLwi.js → file-code-ChOWdKXf.js} +1 -1
  422. package/ui/dist/assets/{folder-open-BJi577JH.js → folder-open-CkOUbIiP.js} +1 -1
  423. package/ui/dist/assets/{funnel-PkaD_HSR.js → funnel-uZkoSPP-.js} +1 -1
  424. package/ui/dist/assets/{git-branch-C_K30am0.js → git-branch-CwvUxj7C.js} +1 -1
  425. package/ui/dist/assets/{git-commit-horizontal-IT6ecxWQ.js → git-commit-horizontal-lxPzCvhD.js} +1 -1
  426. package/ui/dist/assets/{globe-f-jjCa_g.js → globe-D_WpJdsj.js} +1 -1
  427. package/ui/dist/assets/{hash-DNEv8Elo.js → hash-CA0hJ7vh.js} +1 -1
  428. package/ui/dist/assets/{history-BQSBo_1Q.js → history-CEWMLELs.js} +1 -1
  429. package/ui/dist/assets/inbox-ehtOptTV.js +1 -0
  430. package/ui/dist/assets/{index-nS3EErDg.js → index-C1rhbml4.js} +3 -3
  431. package/ui/dist/assets/index-CR8gfCHv.js +1 -0
  432. package/ui/dist/assets/index-DVXMpWai.js +1 -0
  433. package/ui/dist/assets/index-DaDJMM2v.js +1 -0
  434. package/ui/dist/assets/index-Djdq_0xu.js +1 -0
  435. package/ui/dist/assets/index-M46Gcb8K.css +1 -0
  436. package/ui/dist/assets/index-sEBN7w8J.js +109 -0
  437. package/ui/dist/assets/layers-C6Mhf8Nk.js +1 -0
  438. package/ui/dist/assets/{layout-dashboard-CcKt1hXw.js → layout-dashboard-BRUM0kpT.js} +1 -1
  439. package/ui/dist/assets/{lightbulb-Jhp7FvbU.js → lightbulb-CN2q1O5l.js} +1 -1
  440. package/ui/dist/assets/{link-2-DdO7ostF.js → link-2-CC4E28yJ.js} +1 -1
  441. package/ui/dist/assets/markdown-renderer-C6ENbB0u.js +10 -0
  442. package/ui/dist/assets/markdown-renderer-CfVKi3_s.css +1 -0
  443. package/ui/dist/assets/{message-square-CBgH65X7.js → message-square-Bbb241am.js} +1 -1
  444. package/ui/dist/assets/package-CwT3IzFx.js +1 -0
  445. package/ui/dist/assets/{pencil-CYXCEPQh.js → pencil-CDmiHzoj.js} +1 -1
  446. package/ui/dist/assets/{play-d1ONaH0-.js → play-tjy5jMQX.js} +1 -1
  447. package/ui/dist/assets/popover-CFHZf3pE.js +1 -0
  448. package/ui/dist/assets/progress-BboUHuLf.js +1 -0
  449. package/ui/dist/assets/{rocket-DhvUetsk.js → rocket--8ZHgdXJ.js} +1 -1
  450. package/ui/dist/assets/select-n108rXny.js +1 -0
  451. package/ui/dist/assets/{send-P0r5D7td.js → send-Cu7MR2Qh.js} +1 -1
  452. package/ui/dist/assets/server-DmodxZp-.js +1 -0
  453. package/ui/dist/assets/{settings-2-ocj5uHGx.js → settings-2-CkRNqkxj.js} +1 -1
  454. package/ui/dist/assets/sheet-7aUJkyzU.js +1 -0
  455. package/ui/dist/assets/{shield-check-DfVdE34l.js → shield-check-ViI3nMKE.js} +1 -1
  456. package/ui/dist/assets/{shield-off-8l0J6R-8.js → shield-off-DN3tagkn.js} +1 -1
  457. package/ui/dist/assets/skeleton-C0E1Nfro.js +1 -0
  458. package/ui/dist/assets/{smartphone-77_g3SQn.js → smartphone-5FghiXpA.js} +1 -1
  459. package/ui/dist/assets/{square-Ckzsr3Rn.js → square-DiNSx8K7.js} +1 -1
  460. package/ui/dist/assets/star-DhdFVidS.js +1 -0
  461. package/ui/dist/assets/switch-CIgVbZqQ.js +1 -0
  462. package/ui/dist/assets/table-BC56FVMV.js +1 -0
  463. package/ui/dist/assets/{tag-C35mgoEv.js → tag-CH_vQliw.js} +1 -1
  464. package/ui/dist/assets/textarea-CxDiKFXZ.js +1 -0
  465. package/ui/dist/assets/{timer-DHJBS2w1.js → timer-CdGVTb60.js} +1 -1
  466. package/ui/dist/assets/tooltip-BuW9A5UO.js +1 -0
  467. package/ui/dist/assets/{trash-2-keO5tKPE.js → trash-2-CucZJL0N.js} +1 -1
  468. package/ui/dist/assets/trending-down-BCezC1z2.js +1 -0
  469. package/ui/dist/assets/{trending-up-BBv8KbrY.js → trending-up-C5OYX2k2.js} +1 -1
  470. package/ui/dist/assets/vendor-query-C0p7b53x.js +4 -0
  471. package/ui/dist/assets/vendor-react-Mc5_kfYG.js +12 -0
  472. package/ui/dist/assets/vendor-ui-CXPAUBFv.js +51 -0
  473. package/ui/dist/assets/{wand-sparkles-BusQ52ZK.js → wand-sparkles-BaH6pJnc.js} +1 -1
  474. package/ui/dist/assets/{wrench-02YaOSiK.js → wrench-CjxjP6ok.js} +1 -1
  475. package/ui/dist/index.html +5 -2
  476. package/ui/dist/assets/ActivityView-BeshZXmE.js +0 -1
  477. package/ui/dist/assets/AgentList-QVHeldPi.js +0 -1
  478. package/ui/dist/assets/AnalyticsDashboard-C9R97dXE.js +0 -1
  479. package/ui/dist/assets/AreaChart-B73gaiVQ.js +0 -1
  480. package/ui/dist/assets/CartesianChart-CXYL2R-A.js +0 -36
  481. package/ui/dist/assets/ChatView-qjZErlrp.js +0 -10
  482. package/ui/dist/assets/CostsDashboard-O4DCLy1i.js +0 -1
  483. package/ui/dist/assets/EstimateSelect-1hQf4Osk.js +0 -1
  484. package/ui/dist/assets/FloatingChatbot-BZBzrJxd.js +0 -2
  485. package/ui/dist/assets/InviteCodeManagement-LEoGqYeA.js +0 -2
  486. package/ui/dist/assets/ProjectIcon-Chd_ofsw.js +0 -1
  487. package/ui/dist/assets/ProjectList-BvUfVB6c.js +0 -4
  488. package/ui/dist/assets/StatusIndicator-pRfkNcdV.js +0 -1
  489. package/ui/dist/assets/SummaryList-B6kXiTxL.js +0 -1
  490. package/ui/dist/assets/TaskDetail-CV6CzbOS.js +0 -1
  491. package/ui/dist/assets/TaskList-DL7brQKd.js +0 -1
  492. package/ui/dist/assets/TicketBoard-CrkkFj7C.js +0 -1
  493. package/ui/dist/assets/TicketDetail-hnnYclpD.js +0 -1
  494. package/ui/dist/assets/TicketList-CsDAyQCL.js +0 -1
  495. package/ui/dist/assets/UserManagement-BGFQyTSr.js +0 -2
  496. package/ui/dist/assets/ViewSwitcher-CnL0OqA8.js +0 -1
  497. package/ui/dist/assets/alert-dialog-SKM6Gjz4.js +0 -7
  498. package/ui/dist/assets/badge-CVHH1a-v.js +0 -1
  499. package/ui/dist/assets/brain-6o_RHVpe.js +0 -1
  500. package/ui/dist/assets/constants-Q5Zivl-a.js +0 -1
  501. package/ui/dist/assets/dialog-BUqN9Psj.js +0 -1
  502. package/ui/dist/assets/index-BUmnwPQr.js +0 -1
  503. package/ui/dist/assets/index-BfF5G4Cw.js +0 -1
  504. package/ui/dist/assets/index-C8N375c2.js +0 -1
  505. package/ui/dist/assets/index-CuxnqVVz.css +0 -1
  506. package/ui/dist/assets/index-CzMM3QOk.js +0 -1
  507. package/ui/dist/assets/index-lJlNPFVJ.js +0 -67
  508. package/ui/dist/assets/layers-jFqVrWMD.js +0 -1
  509. package/ui/dist/assets/markdown-renderer-n1ToC4XQ.js +0 -36
  510. package/ui/dist/assets/popover-CrmZgoWu.js +0 -1
  511. package/ui/dist/assets/progress-uv4SPkL5.js +0 -1
  512. package/ui/dist/assets/select-CeQ8AHGy.js +0 -1
  513. package/ui/dist/assets/server-CVHTZB72.js +0 -1
  514. package/ui/dist/assets/sheet-DuQExSho.js +0 -1
  515. package/ui/dist/assets/skeleton-TFiFJ3nB.js +0 -1
  516. package/ui/dist/assets/switch-CAePkd6k.js +0 -1
  517. package/ui/dist/assets/table-ZjAZ7hkt.js +0 -1
  518. package/ui/dist/assets/textarea-DsVPnSgR.js +0 -1
  519. package/ui/dist/assets/tooltip-BYmQ331W.js +0 -1
@@ -0,0 +1,208 @@
1
+ /**
2
+ * PromptSuggestionEngine
3
+ *
4
+ * Generates contextual follow-up prompt suggestions based on the current
5
+ * conversation context. All logic is local — no LLM calls.
6
+ */
7
+ // ── Helpers ───────────────────────────────────────────────────────────────────
8
+ const CODE_PATTERNS = [
9
+ /```[\w]*\n/,
10
+ /function\s+\w+/,
11
+ /class\s+\w+/,
12
+ /const\s+\w+\s*=/,
13
+ /import\s+/,
14
+ /export\s+/,
15
+ /\.(ts|js|tsx|jsx|py|go|rs|java)\b/,
16
+ /\bcode\b/i,
17
+ /\bimplementation\b/i,
18
+ /\brefactor\b/i,
19
+ ];
20
+ const ERROR_PATTERNS = [
21
+ /\berror\b/i,
22
+ /\bfailed\b/i,
23
+ /\bfailure\b/i,
24
+ /\bexception\b/i,
25
+ /\bthrew\b/i,
26
+ /\bcrash\b/i,
27
+ /\bundefined\b/i,
28
+ /\bnull\b/i,
29
+ /\btrace\b/i,
30
+ /\bstack\b/i,
31
+ ];
32
+ const FILE_EDIT_PATTERNS = [
33
+ /\bedited\b/i,
34
+ /\bmodified\b/i,
35
+ /\bupdated\b/i,
36
+ /\bwrote\b/i,
37
+ /\bchanged\b/i,
38
+ /\bsaved\b/i,
39
+ /\bfile\b/i,
40
+ ];
41
+ const CONCEPT_PATTERNS = [
42
+ /\bexplain\b/i,
43
+ /\bhow\s+does\b/i,
44
+ /\bwhat\s+is\b/i,
45
+ /\bwhy\b/i,
46
+ /\bwhen\s+should\b/i,
47
+ /\bdifference\b/i,
48
+ ];
49
+ function containsAny(text, patterns) {
50
+ return patterns.some((p) => p.test(text));
51
+ }
52
+ /** Extract a plausible code subject from the assistant message (best-effort). */
53
+ function extractCodeSubject(response) {
54
+ // Try to find a function/class name
55
+ const fnMatch = response.match(/function\s+(\w+)/);
56
+ if (fnMatch)
57
+ return fnMatch[1] ?? 'this';
58
+ const classMatch = response.match(/class\s+(\w+)/);
59
+ if (classMatch)
60
+ return classMatch[1] ?? 'this';
61
+ const constMatch = response.match(/const\s+(\w+)\s*=/);
62
+ if (constMatch)
63
+ return constMatch[1] ?? 'this';
64
+ return 'this';
65
+ }
66
+ /** Extract the first tool name from the list or a default. */
67
+ function extractToolName(tools) {
68
+ return tools[0] ?? 'this tool';
69
+ }
70
+ // ── Engine ────────────────────────────────────────────────────────────────────
71
+ export class PromptSuggestionEngine {
72
+ /**
73
+ * Generate up to 3 contextual follow-up suggestions.
74
+ *
75
+ * Rules (local, no LLM):
76
+ * - If assistant mentioned code → "Can you explain X?" or "Write tests for this"
77
+ * - If assistant used tools → "What else can you do with {tool}?"
78
+ * - If short conversation → exploratory prompts
79
+ * - If error was mentioned → "How do I fix this?" or "What caused this?"
80
+ * - If file was edited → "Show me the diff" or "Run the tests"
81
+ * - Vary by conversation length (early = broad, late = specific)
82
+ * - Always cap at 3
83
+ */
84
+ generateSuggestions(context) {
85
+ const { lastUserMessage, lastAssistantResponse, toolsUsed = [], conversationLength } = context;
86
+ const combined = lastUserMessage + ' ' + lastAssistantResponse;
87
+ const suggestions = [];
88
+ const hasCode = containsAny(combined, CODE_PATTERNS);
89
+ const hasError = containsAny(combined, ERROR_PATTERNS);
90
+ const hasFileEdit = containsAny(combined, FILE_EDIT_PATTERNS);
91
+ const hasTools = toolsUsed.length > 0;
92
+ const hasConcept = containsAny(combined, CONCEPT_PATTERNS);
93
+ const isEarlyConversation = conversationLength <= 4;
94
+ // --- Error-related suggestions (highest priority) ---
95
+ if (hasError) {
96
+ suggestions.push({
97
+ text: 'How do I fix this error?',
98
+ category: 'follow-up',
99
+ });
100
+ suggestions.push({
101
+ text: 'What caused this error and how can I prevent it?',
102
+ category: 'deeper',
103
+ });
104
+ }
105
+ // --- File edit suggestions ---
106
+ if (hasFileEdit && !hasError) {
107
+ suggestions.push({
108
+ text: '/diff',
109
+ category: 'action',
110
+ });
111
+ suggestions.push({
112
+ text: 'Run the tests to verify the changes',
113
+ category: 'action',
114
+ });
115
+ }
116
+ // --- Code-related suggestions ---
117
+ if (hasCode && !hasError) {
118
+ const subject = extractCodeSubject(lastAssistantResponse);
119
+ suggestions.push({
120
+ text: `Can you explain how ${subject} works?`,
121
+ category: 'deeper',
122
+ });
123
+ suggestions.push({
124
+ text: 'Write tests for this',
125
+ category: 'action',
126
+ });
127
+ if (conversationLength > 4) {
128
+ suggestions.push({
129
+ text: 'Optimize this for performance',
130
+ category: 'related',
131
+ });
132
+ }
133
+ }
134
+ // --- Tool usage suggestions ---
135
+ if (hasTools && !hasError) {
136
+ const toolName = extractToolName(toolsUsed);
137
+ suggestions.push({
138
+ text: `What else can you do with ${toolName}?`,
139
+ category: 'related',
140
+ });
141
+ }
142
+ // --- Concept / explanation suggestions ---
143
+ if (hasConcept && !hasError && !hasCode) {
144
+ suggestions.push({
145
+ text: 'Can you give me a concrete example?',
146
+ category: 'follow-up',
147
+ });
148
+ suggestions.push({
149
+ text: 'What are the trade-offs?',
150
+ category: 'deeper',
151
+ });
152
+ }
153
+ // --- Early conversation: broad exploratory prompts ---
154
+ if (isEarlyConversation && suggestions.length < 2) {
155
+ suggestions.push({
156
+ text: 'What else can you help me with?',
157
+ category: 'related',
158
+ });
159
+ suggestions.push({
160
+ text: 'Can you elaborate on that?',
161
+ category: 'follow-up',
162
+ });
163
+ }
164
+ // --- Late conversation: specific follow-up ---
165
+ if (!isEarlyConversation && suggestions.length < 2) {
166
+ suggestions.push({
167
+ text: 'Summarize what we have done so far',
168
+ category: 'follow-up',
169
+ });
170
+ suggestions.push({
171
+ text: 'What should we do next?',
172
+ category: 'action',
173
+ });
174
+ }
175
+ // --- Always ensure at least 2 sensible defaults ---
176
+ if (suggestions.length === 0) {
177
+ suggestions.push({
178
+ text: 'Tell me more about this',
179
+ category: 'follow-up',
180
+ });
181
+ suggestions.push({
182
+ text: 'How does this compare to alternatives?',
183
+ category: 'related',
184
+ });
185
+ }
186
+ // Cap at 3, deduplicate by text
187
+ const seen = new Set();
188
+ const unique = [];
189
+ for (const s of suggestions) {
190
+ if (!seen.has(s.text)) {
191
+ seen.add(s.text);
192
+ unique.push(s);
193
+ }
194
+ if (unique.length === 3)
195
+ break;
196
+ }
197
+ return unique;
198
+ }
199
+ }
200
+ // ── Singleton ─────────────────────────────────────────────────────────────────
201
+ let _engine = null;
202
+ export function getPromptSuggestionEngine() {
203
+ if (!_engine) {
204
+ _engine = new PromptSuggestionEngine();
205
+ }
206
+ return _engine;
207
+ }
208
+ //# sourceMappingURL=prompt-suggestions.js.map
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Rate Limit Monitor
3
+ *
4
+ * Tracks API rate limit state per provider by parsing standard x-ratelimit-*
5
+ * response headers. Surfaces warnings when usage thresholds are reached and
6
+ * can suggest alternative providers when limits are critical.
7
+ */
8
+ export interface RateLimitState {
9
+ provider: string;
10
+ model: string;
11
+ requestsUsed: number;
12
+ requestsLimit?: number;
13
+ tokensUsed: number;
14
+ tokensLimit?: number;
15
+ /** Unix timestamp (ms) when limits reset */
16
+ resetAt?: number;
17
+ warningLevel: 'none' | 'info' | 'warning' | 'critical';
18
+ }
19
+ export interface WarnResult {
20
+ warn: boolean;
21
+ message: string;
22
+ level: RateLimitState['warningLevel'];
23
+ }
24
+ export declare class RateLimitMonitor {
25
+ private states;
26
+ constructor();
27
+ /**
28
+ * Update rate limit state from API response headers.
29
+ * Parses the standard x-ratelimit-* header set used by OpenAI-compatible APIs
30
+ * and Anthropic:
31
+ * x-ratelimit-limit-requests
32
+ * x-ratelimit-remaining-requests
33
+ * x-ratelimit-limit-tokens
34
+ * x-ratelimit-remaining-tokens
35
+ * x-ratelimit-reset-requests
36
+ * x-ratelimit-reset-tokens
37
+ */
38
+ updateFromHeaders(provider: string, headers: Record<string, string>): void;
39
+ /** Get current rate limit state for a provider. */
40
+ getState(provider: string): RateLimitState | undefined;
41
+ /**
42
+ * Check whether the user should be warned about rate limit usage.
43
+ * Returns the highest-severity warning across requests and tokens.
44
+ */
45
+ shouldWarn(provider: string): WarnResult;
46
+ /**
47
+ * Suggest an alternative provider when the given provider is at a high usage level.
48
+ * Returns undefined if no switch is recommended.
49
+ */
50
+ suggestAlternative(provider: string, availableProviders: string[]): string | undefined;
51
+ /** Return a snapshot of all tracked provider states. */
52
+ getAll(): RateLimitState[];
53
+ private getOrCreate;
54
+ }
55
+ export declare function getRateLimitMonitor(): RateLimitMonitor;
56
+ //# sourceMappingURL=rate-limit-monitor.d.ts.map
@@ -0,0 +1,224 @@
1
+ /**
2
+ * Rate Limit Monitor
3
+ *
4
+ * Tracks API rate limit state per provider by parsing standard x-ratelimit-*
5
+ * response headers. Surfaces warnings when usage thresholds are reached and
6
+ * can suggest alternative providers when limits are critical.
7
+ */
8
+ // === Constants ===
9
+ const THRESHOLD_INFO = 0.75;
10
+ const THRESHOLD_WARNING = 0.90;
11
+ const THRESHOLD_CRITICAL = 0.95;
12
+ // Provider preference order for suggesting alternatives (prefer local)
13
+ const PROVIDER_PREFERENCE = ['ollama', 'anthropic', 'openai', 'azure', 'google', 'cerebras'];
14
+ function defaultState(provider) {
15
+ return {
16
+ provider,
17
+ model: 'unknown',
18
+ requestsUsed: 0,
19
+ tokensUsed: 0,
20
+ warningLevel: 'none',
21
+ };
22
+ }
23
+ /**
24
+ * Parse a reset timestamp header value.
25
+ * Accepts either a Unix timestamp (seconds) or a relative duration like "1m30s".
26
+ */
27
+ function parseResetHeader(value) {
28
+ const trimmed = value.trim();
29
+ // ISO 8601 / epoch seconds (pure number)
30
+ const asNumber = Number(trimmed);
31
+ if (!isNaN(asNumber) && asNumber > 0) {
32
+ // If it looks like seconds since epoch (> year 2000), treat as epoch seconds
33
+ if (asNumber > 1_000_000_000) {
34
+ return asNumber * 1000; // convert to ms
35
+ }
36
+ // Otherwise treat as seconds from now
37
+ return Date.now() + asNumber * 1000;
38
+ }
39
+ // Relative duration: e.g. "1m30s", "45s", "2m"
40
+ const durationMatch = trimmed.match(/^(?:(\d+)m)?(?:(\d+(?:\.\d+)?)s)?$/);
41
+ if (durationMatch) {
42
+ const minutes = parseInt(durationMatch[1] ?? '0', 10);
43
+ const seconds = parseFloat(durationMatch[2] ?? '0');
44
+ const totalMs = (minutes * 60 + seconds) * 1000;
45
+ if (totalMs > 0) {
46
+ return Date.now() + totalMs;
47
+ }
48
+ }
49
+ return undefined;
50
+ }
51
+ function computeWarningLevel(used, limit) {
52
+ const ratio = used / limit;
53
+ if (ratio >= THRESHOLD_CRITICAL)
54
+ return 'critical';
55
+ if (ratio >= THRESHOLD_WARNING)
56
+ return 'warning';
57
+ if (ratio >= THRESHOLD_INFO)
58
+ return 'info';
59
+ return 'none';
60
+ }
61
+ // === RateLimitMonitor ===
62
+ export class RateLimitMonitor {
63
+ states;
64
+ constructor() {
65
+ this.states = new Map();
66
+ }
67
+ /**
68
+ * Update rate limit state from API response headers.
69
+ * Parses the standard x-ratelimit-* header set used by OpenAI-compatible APIs
70
+ * and Anthropic:
71
+ * x-ratelimit-limit-requests
72
+ * x-ratelimit-remaining-requests
73
+ * x-ratelimit-limit-tokens
74
+ * x-ratelimit-remaining-tokens
75
+ * x-ratelimit-reset-requests
76
+ * x-ratelimit-reset-tokens
77
+ */
78
+ updateFromHeaders(provider, headers) {
79
+ const state = this.getOrCreate(provider);
80
+ const limitRequests = headers['x-ratelimit-limit-requests'];
81
+ const remainingRequests = headers['x-ratelimit-remaining-requests'];
82
+ const limitTokens = headers['x-ratelimit-limit-tokens'];
83
+ const remainingTokens = headers['x-ratelimit-remaining-tokens'];
84
+ const resetRequests = headers['x-ratelimit-reset-requests'];
85
+ const resetTokens = headers['x-ratelimit-reset-tokens'];
86
+ if (limitRequests !== undefined) {
87
+ state.requestsLimit = parseInt(limitRequests, 10);
88
+ }
89
+ if (remainingRequests !== undefined && state.requestsLimit !== undefined) {
90
+ const remaining = parseInt(remainingRequests, 10);
91
+ state.requestsUsed = state.requestsLimit - remaining;
92
+ }
93
+ if (limitTokens !== undefined) {
94
+ state.tokensLimit = parseInt(limitTokens, 10);
95
+ }
96
+ if (remainingTokens !== undefined && state.tokensLimit !== undefined) {
97
+ const remaining = parseInt(remainingTokens, 10);
98
+ state.tokensUsed = state.tokensLimit - remaining;
99
+ }
100
+ // Pick the earliest reset timestamp if both are present
101
+ const resetMs = [resetRequests, resetTokens]
102
+ .filter((v) => v !== undefined)
103
+ .map(parseResetHeader)
104
+ .filter((v) => v !== undefined)
105
+ .sort((a, b) => a - b)[0];
106
+ if (resetMs !== undefined) {
107
+ state.resetAt = resetMs;
108
+ }
109
+ // Recalculate warning level — use whichever ratio is higher
110
+ let highestLevel = 'none';
111
+ if (state.requestsLimit && state.requestsLimit > 0) {
112
+ const reqLevel = computeWarningLevel(state.requestsUsed, state.requestsLimit);
113
+ if (levelIndex(reqLevel) > levelIndex(highestLevel)) {
114
+ highestLevel = reqLevel;
115
+ }
116
+ }
117
+ if (state.tokensLimit && state.tokensLimit > 0) {
118
+ const tokLevel = computeWarningLevel(state.tokensUsed, state.tokensLimit);
119
+ if (levelIndex(tokLevel) > levelIndex(highestLevel)) {
120
+ highestLevel = tokLevel;
121
+ }
122
+ }
123
+ state.warningLevel = highestLevel;
124
+ }
125
+ /** Get current rate limit state for a provider. */
126
+ getState(provider) {
127
+ return this.states.get(provider);
128
+ }
129
+ /**
130
+ * Check whether the user should be warned about rate limit usage.
131
+ * Returns the highest-severity warning across requests and tokens.
132
+ */
133
+ shouldWarn(provider) {
134
+ const state = this.states.get(provider);
135
+ if (!state || state.warningLevel === 'none') {
136
+ return { warn: false, message: '', level: 'none' };
137
+ }
138
+ const parts = [];
139
+ if (state.requestsLimit && state.requestsLimit > 0) {
140
+ const pct = Math.round((state.requestsUsed / state.requestsLimit) * 100);
141
+ parts.push(`${pct}% of request quota used`);
142
+ }
143
+ if (state.tokensLimit && state.tokensLimit > 0) {
144
+ const pct = Math.round((state.tokensUsed / state.tokensLimit) * 100);
145
+ parts.push(`${pct}% of token quota used`);
146
+ }
147
+ let resetNote = '';
148
+ if (state.resetAt) {
149
+ const remainMs = state.resetAt - Date.now();
150
+ if (remainMs > 0) {
151
+ const remainSec = Math.ceil(remainMs / 1000);
152
+ const mins = Math.floor(remainSec / 60);
153
+ const secs = remainSec % 60;
154
+ resetNote = mins > 0
155
+ ? ` (resets in ${mins}m ${secs}s)`
156
+ : ` (resets in ${secs}s)`;
157
+ }
158
+ }
159
+ const prefix = state.warningLevel === 'critical'
160
+ ? 'Rate limit critical'
161
+ : state.warningLevel === 'warning'
162
+ ? 'Approaching rate limit'
163
+ : 'Rate limit notice';
164
+ const message = `${prefix} [${provider}]: ${parts.join(', ')}${resetNote}`;
165
+ return {
166
+ warn: true,
167
+ message,
168
+ level: state.warningLevel,
169
+ };
170
+ }
171
+ /**
172
+ * Suggest an alternative provider when the given provider is at a high usage level.
173
+ * Returns undefined if no switch is recommended.
174
+ */
175
+ suggestAlternative(provider, availableProviders) {
176
+ const state = this.states.get(provider);
177
+ if (!state || levelIndex(state.warningLevel) < levelIndex('warning')) {
178
+ return undefined;
179
+ }
180
+ // Find a provider with no warning or lower warning level
181
+ const candidates = availableProviders
182
+ .filter(p => p !== provider)
183
+ .sort((a, b) => {
184
+ // Prefer low-warning providers first, then follow preference order
185
+ const aLevel = levelIndex(this.states.get(a)?.warningLevel ?? 'none');
186
+ const bLevel = levelIndex(this.states.get(b)?.warningLevel ?? 'none');
187
+ if (aLevel !== bLevel)
188
+ return aLevel - bLevel;
189
+ return PROVIDER_PREFERENCE.indexOf(a) - PROVIDER_PREFERENCE.indexOf(b);
190
+ });
191
+ return candidates[0];
192
+ }
193
+ /** Return a snapshot of all tracked provider states. */
194
+ getAll() {
195
+ return Array.from(this.states.values()).map(s => ({ ...s }));
196
+ }
197
+ // Private helpers
198
+ getOrCreate(provider) {
199
+ let state = this.states.get(provider);
200
+ if (!state) {
201
+ state = defaultState(provider);
202
+ this.states.set(provider, state);
203
+ }
204
+ return state;
205
+ }
206
+ }
207
+ // Numeric ordering of warning levels (for comparison)
208
+ function levelIndex(level) {
209
+ switch (level) {
210
+ case 'none': return 0;
211
+ case 'info': return 1;
212
+ case 'warning': return 2;
213
+ case 'critical': return 3;
214
+ }
215
+ }
216
+ // === Singleton ===
217
+ let _monitor;
218
+ export function getRateLimitMonitor() {
219
+ if (!_monitor) {
220
+ _monitor = new RateLimitMonitor();
221
+ }
222
+ return _monitor;
223
+ }
224
+ //# sourceMappingURL=rate-limit-monitor.js.map
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Helpers that connect receipts to the CLI: key handling and writer setup.
3
+ */
4
+ import { ReceiptWriter } from './receipt-writer.js';
5
+ export interface RunReceiptArgs {
6
+ projectRoot: string;
7
+ runId: string;
8
+ /** --sign-key path; falls back to env PROFCLAW_RECEIPT_KEY */
9
+ signKeyPath?: string;
10
+ env?: NodeJS.ProcessEnv;
11
+ }
12
+ /** Create the writer for a run. Signing is off unless a key path is given. */
13
+ export declare function createRunReceipt(args: RunReceiptArgs): ReceiptWriter;
14
+ /** Version of the running profclaw package, or 'unknown'. */
15
+ export declare function toolVersion(): string;
16
+ export interface KeyPairFiles {
17
+ privateKeyPath: string;
18
+ publicKeyPath: string;
19
+ }
20
+ /** Write an Ed25519 keypair into dir. The private key file is mode 0600. */
21
+ export declare function generateKeyPairFiles(dir: string): KeyPairFiles;
22
+ /** Short one-line description of tool arguments. Long values are cut so files are not copied into the receipt. */
23
+ export declare function summarizeArgs(args: Record<string, unknown>, maxChars?: number): string;
24
+ export interface RunReceiptSetup {
25
+ runId: string;
26
+ receipt?: ReceiptWriter;
27
+ /** Hook for ExecutorRunner: records each tool call */
28
+ onToolCall?: (event: {
29
+ attempt: number;
30
+ name: string;
31
+ args: Record<string, unknown>;
32
+ durationMs: number;
33
+ ok: boolean;
34
+ }) => void;
35
+ }
36
+ /** Everything `profclaw run` needs to record a receipt; a no-op setup when disabled. */
37
+ export declare function setupRunReceipt(args: {
38
+ enabled: boolean;
39
+ projectRoot: string;
40
+ signKeyPath?: string;
41
+ env?: NodeJS.ProcessEnv;
42
+ }): RunReceiptSetup;
43
+ //# sourceMappingURL=receipt-cli.d.ts.map
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Helpers that connect receipts to the CLI: key handling and writer setup.
3
+ */
4
+ import { createRequire } from 'node:module';
5
+ import { generateKeyPairSync } from 'node:crypto';
6
+ import { mkdirSync, writeFileSync } from 'node:fs';
7
+ import { join } from 'node:path';
8
+ import { randomUUID } from 'node:crypto';
9
+ import { ReceiptWriter, defaultReceiptPath, loadSignerFromFile } from './receipt-writer.js';
10
+ /** Create the writer for a run. Signing is off unless a key path is given. */
11
+ export function createRunReceipt(args) {
12
+ const env = args.env ?? process.env;
13
+ const keyPath = args.signKeyPath ?? (env['PROFCLAW_RECEIPT_KEY']?.trim() || undefined);
14
+ return new ReceiptWriter({
15
+ path: defaultReceiptPath(args.projectRoot, args.runId, env),
16
+ signer: keyPath ? loadSignerFromFile(keyPath) : undefined,
17
+ });
18
+ }
19
+ /** Version of the running profclaw package, or 'unknown'. */
20
+ export function toolVersion() {
21
+ try {
22
+ const pkg = createRequire(import.meta.url)('../../../package.json');
23
+ return typeof pkg.version === 'string' ? pkg.version : 'unknown';
24
+ }
25
+ catch {
26
+ return 'unknown';
27
+ }
28
+ }
29
+ /** Write an Ed25519 keypair into dir. The private key file is mode 0600. */
30
+ export function generateKeyPairFiles(dir) {
31
+ mkdirSync(dir, { recursive: true });
32
+ const { publicKey, privateKey } = generateKeyPairSync('ed25519');
33
+ const privateKeyPath = join(dir, 'receipt-key.pem');
34
+ const publicKeyPath = join(dir, 'receipt-key.pub.pem');
35
+ writeFileSync(privateKeyPath, privateKey.export({ type: 'pkcs8', format: 'pem' }), { mode: 0o600, flag: 'wx' });
36
+ writeFileSync(publicKeyPath, publicKey.export({ type: 'spki', format: 'pem' }), { mode: 0o644, flag: 'wx' });
37
+ return { privateKeyPath, publicKeyPath };
38
+ }
39
+ function argsSummaryChars(env) {
40
+ const n = Number(env['PROFCLAW_RECEIPT_ARGS_CHARS']);
41
+ return Number.isFinite(n) && n > 0 ? Math.floor(n) : 300;
42
+ }
43
+ /** Short one-line description of tool arguments. Long values are cut so files are not copied into the receipt. */
44
+ export function summarizeArgs(args, maxChars = 300) {
45
+ const perValue = Math.max(16, Math.floor(maxChars / 3));
46
+ const parts = Object.entries(args).map(([key, value]) => {
47
+ const text = typeof value === 'string' ? value : JSON.stringify(value) ?? 'undefined';
48
+ const short = text.length > perValue ? `${text.slice(0, perValue)}...(${text.length} chars)` : text;
49
+ return `${key}=${JSON.stringify(short)}`;
50
+ });
51
+ const joined = parts.join(' ');
52
+ return joined.length > maxChars ? `${joined.slice(0, maxChars)}...` : joined;
53
+ }
54
+ /** Everything `profclaw run` needs to record a receipt; a no-op setup when disabled. */
55
+ export function setupRunReceipt(args) {
56
+ const runId = randomUUID().slice(0, 8);
57
+ if (!args.enabled)
58
+ return { runId };
59
+ const env = args.env ?? process.env;
60
+ const receipt = createRunReceipt({ projectRoot: args.projectRoot, runId, signKeyPath: args.signKeyPath, env });
61
+ const cap = argsSummaryChars(env);
62
+ return {
63
+ runId,
64
+ receipt,
65
+ onToolCall: (e) => {
66
+ try {
67
+ receipt.append('tool_call', {
68
+ attempt: e.attempt,
69
+ name: e.name,
70
+ argsSummary: summarizeArgs(e.args, cap),
71
+ redacted: false,
72
+ durationMs: e.durationMs,
73
+ ok: e.ok,
74
+ });
75
+ }
76
+ catch {
77
+ // Receipt problems must never break the agent; a missing event shows up as a bad chain or gap.
78
+ }
79
+ },
80
+ };
81
+ }
82
+ //# sourceMappingURL=receipt-cli.js.map