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
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Auto-Serve
3
+ *
4
+ * Automatically starts the profClaw server if it's not running.
5
+ * Inspired by OpenClaw's pattern where the CLI "just works" -
6
+ * you type `openclaw` and it handles server lifecycle.
7
+ *
8
+ * @package profclaw-interactive (future standalone)
9
+ */
10
+ import { spawn } from 'node:child_process';
11
+ import { resolve } from 'node:path';
12
+ import { existsSync, readFileSync } from 'node:fs';
13
+ import chalk from 'chalk';
14
+ /**
15
+ * Simple .env file parser (no external dependency).
16
+ * Handles KEY=VALUE, KEY="VALUE", comments (#), and empty lines.
17
+ */
18
+ function loadDotEnv(filePath) {
19
+ const vars = {};
20
+ try {
21
+ if (!existsSync(filePath))
22
+ return vars;
23
+ const content = readFileSync(filePath, 'utf-8');
24
+ for (const line of content.split('\n')) {
25
+ const trimmed = line.trim();
26
+ if (!trimmed || trimmed.startsWith('#'))
27
+ continue;
28
+ const eqIdx = trimmed.indexOf('=');
29
+ if (eqIdx === -1)
30
+ continue;
31
+ const key = trimmed.slice(0, eqIdx).trim();
32
+ let value = trimmed.slice(eqIdx + 1).trim();
33
+ // Strip surrounding quotes
34
+ if ((value.startsWith('"') && value.endsWith('"')) ||
35
+ (value.startsWith("'") && value.endsWith("'"))) {
36
+ value = value.slice(1, -1);
37
+ }
38
+ if (key)
39
+ vars[key] = value;
40
+ }
41
+ }
42
+ catch { /* ignore */ }
43
+ return vars;
44
+ }
45
+ /**
46
+ * Check if the profClaw server is reachable.
47
+ */
48
+ export async function checkServer(baseUrl) {
49
+ try {
50
+ const controller = new AbortController();
51
+ const timeout = setTimeout(() => controller.abort(), 3000);
52
+ const response = await fetch(`${baseUrl}/health`, {
53
+ signal: controller.signal,
54
+ headers: { 'Accept': 'application/json' },
55
+ });
56
+ clearTimeout(timeout);
57
+ // Verify it's actually profClaw (not some other service on the same port)
58
+ const text = await response.text();
59
+ if (text.startsWith('<!DOCTYPE') || text.startsWith('<html')) {
60
+ // Got HTML - some other service is on this port
61
+ return false;
62
+ }
63
+ return response.ok;
64
+ }
65
+ catch {
66
+ return false;
67
+ }
68
+ }
69
+ /**
70
+ * Find the server entry point.
71
+ */
72
+ function findServerEntry() {
73
+ // Try common locations relative to the package root
74
+ const candidates = [
75
+ resolve(process.cwd(), 'dist/server.js'),
76
+ resolve(process.cwd(), 'src/server.ts'),
77
+ ];
78
+ for (const candidate of candidates) {
79
+ if (existsSync(candidate)) {
80
+ return candidate;
81
+ }
82
+ }
83
+ return null;
84
+ }
85
+ /**
86
+ * Start the profClaw server as a background child process.
87
+ * Returns when the server is healthy or times out.
88
+ */
89
+ export async function autoStartServer(options) {
90
+ const port = options.port || 3000;
91
+ // First check if server is already running
92
+ const alreadyRunning = await checkServer(options.baseUrl);
93
+ if (alreadyRunning) {
94
+ return { success: true };
95
+ }
96
+ if (!options.silent) {
97
+ process.stdout.write(chalk.dim(' Starting server...'));
98
+ }
99
+ const serverEntry = findServerEntry();
100
+ if (!serverEntry) {
101
+ return {
102
+ success: false,
103
+ error: 'Cannot find server entry point. Run `pnpm build` first, or start the server manually with `pnpm dev`.',
104
+ };
105
+ }
106
+ // Determine runner based on file extension
107
+ const isTsFile = serverEntry.endsWith('.ts');
108
+ const runner = isTsFile ? 'tsx' : 'node';
109
+ // Load .env file (no dotenv dependency - simple parser)
110
+ const dotenvVars = loadDotEnv(resolve(process.cwd(), '.env'));
111
+ const env = {
112
+ ...process.env,
113
+ ...dotenvVars,
114
+ PORT: String(port),
115
+ NODE_ENV: process.env.NODE_ENV || 'development',
116
+ };
117
+ // Spawn server as fully detached child (cwd = project root for data/ access)
118
+ // Use 'ignore' for all stdio so the child is truly independent
119
+ // We'll detect readiness via HTTP health checks instead of stdout parsing
120
+ let serverProcess;
121
+ try {
122
+ serverProcess = spawn(runner, [serverEntry], {
123
+ env,
124
+ cwd: process.cwd(),
125
+ stdio: 'ignore',
126
+ detached: true,
127
+ });
128
+ }
129
+ catch (error) {
130
+ return {
131
+ success: false,
132
+ error: `Failed to start server: ${error instanceof Error ? error.message : String(error)}`,
133
+ };
134
+ }
135
+ // Track if process exits early
136
+ let startupError = '';
137
+ serverProcess.on('error', (err) => {
138
+ startupError = err.message;
139
+ });
140
+ serverProcess.on('exit', (code) => {
141
+ if (code !== null && code !== 0) {
142
+ startupError = `Server exited with code ${code}`;
143
+ }
144
+ });
145
+ // Fully detach - CLI can exit and server keeps running
146
+ serverProcess.unref();
147
+ // Wait for server to become healthy
148
+ const maxWaitMs = 15000;
149
+ const pollIntervalMs = 500;
150
+ const startTime = Date.now();
151
+ while (Date.now() - startTime < maxWaitMs) {
152
+ // Check for early crash
153
+ if (startupError) {
154
+ if (startupError.includes('EADDRINUSE')) {
155
+ return {
156
+ success: false,
157
+ error: `Port ${port} is already in use. Kill the process or use: PORT=${port + 1} profclaw chat`,
158
+ };
159
+ }
160
+ if (startupError.includes('exited with code')) {
161
+ return { success: false, error: `Server crashed: ${startupError.slice(0, 300)}` };
162
+ }
163
+ // Non-fatal stderr (e.g. warnings) - continue waiting
164
+ }
165
+ const healthy = await checkServer(options.baseUrl);
166
+ if (healthy) {
167
+ if (!options.silent) {
168
+ console.log(chalk.green(' ready'));
169
+ }
170
+ return { success: true, pid: serverProcess.pid };
171
+ }
172
+ await new Promise((r) => setTimeout(r, pollIntervalMs));
173
+ }
174
+ return {
175
+ success: false,
176
+ error: startupError
177
+ ? `Server failed: ${startupError.slice(0, 300)}`
178
+ : `Server did not respond within ${maxWaitMs / 1000}s. Try starting manually: pnpm dev`,
179
+ };
180
+ }
181
+ /**
182
+ * Ensure the server is running. Auto-starts if needed.
183
+ * This is the main entry point for the "just works" pattern.
184
+ */
185
+ export async function ensureServer(baseUrl, options) {
186
+ const isRunning = await checkServer(baseUrl);
187
+ if (isRunning) {
188
+ return { ok: true };
189
+ }
190
+ if (options?.autoStart === false) {
191
+ return {
192
+ ok: false,
193
+ error: `profClaw server is not running at ${baseUrl}. Start it with: pnpm dev`,
194
+ };
195
+ }
196
+ // Extract port from URL
197
+ const portMatch = baseUrl.match(/:(\d+)/);
198
+ const port = portMatch ? parseInt(portMatch[1]) : 3000;
199
+ const result = await autoStartServer({
200
+ port,
201
+ baseUrl,
202
+ silent: options?.silent,
203
+ });
204
+ if (!result.success) {
205
+ return { ok: false, error: result.error };
206
+ }
207
+ return { ok: true };
208
+ }
209
+ //# sourceMappingURL=auto-serve.js.map
@@ -0,0 +1,25 @@
1
+ /**
2
+ * profClaw Interactive CLI
3
+ *
4
+ * Claude-like interactive chat with streaming responses, tool display,
5
+ * markdown rendering, slash commands, and session management.
6
+ *
7
+ * Designed as a self-contained module that can be extracted to its own
8
+ * package in the future (e.g., @profclaw/interactive or profclaw-cli).
9
+ *
10
+ * Dependencies (all peer/optional in standalone mode):
11
+ * - chalk (terminal colors)
12
+ * - ora (spinners)
13
+ * - node:readline (input)
14
+ * - node:fs (history persistence)
15
+ *
16
+ * @package profclaw-interactive
17
+ */
18
+ export { startInteractiveREPL } from './repl.js';
19
+ export { createRenderer, renderMarkdownLite, formatElapsed, formatTokens, highlightCode } from './renderer.js';
20
+ export { streamChat, createConversation, sendMessage } from './stream-client.js';
21
+ export { ensureServer, checkServer, autoStartServer } from './auto-serve.js';
22
+ export { showPicker } from './picker.js';
23
+ export type { PickerItem, PickerOptions } from './picker.js';
24
+ export type { InteractiveOptions, REPLState, SlashCommand, ServerConfig, Session, ChatMessage, ToolCallInfo, TokenUsage, SSEEvent, SSEEventType, Renderer, } from './types.js';
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,23 @@
1
+ /**
2
+ * profClaw Interactive CLI
3
+ *
4
+ * Claude-like interactive chat with streaming responses, tool display,
5
+ * markdown rendering, slash commands, and session management.
6
+ *
7
+ * Designed as a self-contained module that can be extracted to its own
8
+ * package in the future (e.g., @profclaw/interactive or profclaw-cli).
9
+ *
10
+ * Dependencies (all peer/optional in standalone mode):
11
+ * - chalk (terminal colors)
12
+ * - ora (spinners)
13
+ * - node:readline (input)
14
+ * - node:fs (history persistence)
15
+ *
16
+ * @package profclaw-interactive
17
+ */
18
+ export { startInteractiveREPL } from './repl.js';
19
+ export { createRenderer, renderMarkdownLite, formatElapsed, formatTokens, highlightCode } from './renderer.js';
20
+ export { streamChat, createConversation, sendMessage } from './stream-client.js';
21
+ export { ensureServer, checkServer, autoStartServer } from './auto-serve.js';
22
+ export { showPicker } from './picker.js';
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Interactive Picker
3
+ *
4
+ * Arrow-key navigable selection menu for the terminal.
5
+ * Used for session picker, model picker, provider picker, etc.
6
+ *
7
+ * @package profclaw-interactive (future standalone)
8
+ */
9
+ export interface PickerItem {
10
+ id: string;
11
+ label: string;
12
+ description?: string;
13
+ dimLabel?: boolean;
14
+ }
15
+ export interface PickerOptions {
16
+ title: string;
17
+ items: PickerItem[];
18
+ /** Allow filtering by typing */
19
+ filterable?: boolean;
20
+ /** Max items to show at once (scrolls) */
21
+ pageSize?: number;
22
+ }
23
+ /**
24
+ * Show an interactive picker menu.
25
+ * Returns the selected item ID, or null if cancelled (Escape/Ctrl+C).
26
+ */
27
+ export declare function showPicker(options: PickerOptions): Promise<string | null>;
28
+ //# sourceMappingURL=picker.d.ts.map
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Interactive Picker
3
+ *
4
+ * Arrow-key navigable selection menu for the terminal.
5
+ * Used for session picker, model picker, provider picker, etc.
6
+ *
7
+ * @package profclaw-interactive (future standalone)
8
+ */
9
+ import chalk from 'chalk';
10
+ /**
11
+ * Show an interactive picker menu.
12
+ * Returns the selected item ID, or null if cancelled (Escape/Ctrl+C).
13
+ */
14
+ export function showPicker(options) {
15
+ return new Promise((resolve) => {
16
+ const { title, items, pageSize = 10 } = options;
17
+ const filterable = options.filterable !== false;
18
+ if (items.length === 0) {
19
+ console.log(chalk.dim(' No items to select.'));
20
+ resolve(null);
21
+ return;
22
+ }
23
+ let selectedIndex = 0;
24
+ let filter = '';
25
+ let filteredItems = [...items];
26
+ let scrollOffset = 0;
27
+ const gold = chalk.hex('#F6C453');
28
+ const dim = chalk.dim;
29
+ const mint = chalk.hex('#7DD3A5');
30
+ const border = chalk.hex('#3C414B');
31
+ const H = '\u2500';
32
+ const POINTER = '\u25b8'; // ▸
33
+ const w = Math.min((process.stdout.columns || 80) - 4, 68);
34
+ function applyFilter() {
35
+ if (!filter) {
36
+ filteredItems = [...items];
37
+ }
38
+ else {
39
+ const lower = filter.toLowerCase();
40
+ filteredItems = items.filter((item) => item.label.toLowerCase().includes(lower) ||
41
+ item.id.toLowerCase().includes(lower) ||
42
+ (item.description || '').toLowerCase().includes(lower));
43
+ }
44
+ selectedIndex = Math.min(selectedIndex, Math.max(0, filteredItems.length - 1));
45
+ scrollOffset = Math.max(0, Math.min(scrollOffset, filteredItems.length - pageSize));
46
+ }
47
+ function render() {
48
+ // Clear previous render
49
+ const totalLines = 3 + Math.min(filteredItems.length, pageSize) + (filterable ? 1 : 0) + 2;
50
+ process.stdout.write(`\x1b[${totalLines}A\x1b[J`);
51
+ // Header
52
+ console.log('');
53
+ console.log(` ${border(H.repeat(w))}`);
54
+ console.log(` ${gold.bold(title)}${filter ? dim(` filter: ${filter}`) : ''}`);
55
+ // Items
56
+ const visibleStart = scrollOffset;
57
+ const visibleEnd = Math.min(filteredItems.length, scrollOffset + pageSize);
58
+ if (visibleStart > 0) {
59
+ console.log(dim(` ${' '}... ${visibleStart} more above`));
60
+ }
61
+ for (let i = visibleStart; i < visibleEnd; i++) {
62
+ const item = filteredItems[i];
63
+ const isSelected = i === selectedIndex;
64
+ const pointer = isSelected ? gold(POINTER) : ' ';
65
+ const label = isSelected
66
+ ? chalk.bold(item.label)
67
+ : item.dimLabel ? dim(item.label) : item.label;
68
+ const desc = item.description ? dim(` ${item.description}`) : '';
69
+ const id = dim(` ${item.id.slice(0, 8)}`);
70
+ console.log(` ${pointer} ${label}${desc}${id}`);
71
+ }
72
+ if (visibleEnd < filteredItems.length) {
73
+ console.log(dim(` ${' '}... ${filteredItems.length - visibleEnd} more below`));
74
+ }
75
+ // Footer
76
+ console.log(` ${border(H.repeat(w))}`);
77
+ console.log(dim(` \u2191\u2193 navigate \u00b7 enter select \u00b7 esc cancel${filterable ? ' \u00b7 type to filter' : ''}`));
78
+ }
79
+ // Print initial blank lines to give render() space to overwrite
80
+ const initialLines = 3 + Math.min(items.length, pageSize) + 2;
81
+ for (let i = 0; i < initialLines; i++)
82
+ console.log('');
83
+ render();
84
+ // Enter raw mode to capture keystrokes
85
+ if (!process.stdin.isRaw) {
86
+ process.stdin.setRawMode(true);
87
+ }
88
+ process.stdin.resume();
89
+ const onKeypress = (chunk) => {
90
+ const key = chunk.toString();
91
+ // Escape
92
+ if (key === '\x1b' || key === '\x03') {
93
+ cleanup();
94
+ resolve(null);
95
+ return;
96
+ }
97
+ // Enter
98
+ if (key === '\r' || key === '\n') {
99
+ if (filteredItems.length > 0) {
100
+ const selected = filteredItems[selectedIndex];
101
+ cleanup();
102
+ resolve(selected.id);
103
+ return;
104
+ }
105
+ }
106
+ // Arrow up
107
+ if (key === '\x1b[A') {
108
+ if (selectedIndex > 0) {
109
+ selectedIndex--;
110
+ if (selectedIndex < scrollOffset)
111
+ scrollOffset = selectedIndex;
112
+ }
113
+ render();
114
+ return;
115
+ }
116
+ // Arrow down
117
+ if (key === '\x1b[B') {
118
+ if (selectedIndex < filteredItems.length - 1) {
119
+ selectedIndex++;
120
+ if (selectedIndex >= scrollOffset + pageSize)
121
+ scrollOffset = selectedIndex - pageSize + 1;
122
+ }
123
+ render();
124
+ return;
125
+ }
126
+ // Backspace
127
+ if (key === '\x7f' || key === '\b') {
128
+ if (filter.length > 0) {
129
+ filter = filter.slice(0, -1);
130
+ applyFilter();
131
+ render();
132
+ }
133
+ return;
134
+ }
135
+ // Printable character (filter)
136
+ if (filterable && key.length === 1 && key >= ' ' && key <= '~') {
137
+ filter += key;
138
+ applyFilter();
139
+ render();
140
+ return;
141
+ }
142
+ };
143
+ function cleanup() {
144
+ process.stdin.removeListener('data', onKeypress);
145
+ process.stdin.setRawMode(false);
146
+ // Clear the picker display
147
+ const totalLines = 3 + Math.min(filteredItems.length, pageSize) + 2;
148
+ process.stdout.write(`\x1b[${totalLines}A\x1b[J`);
149
+ }
150
+ process.stdin.on('data', onKeypress);
151
+ });
152
+ }
153
+ //# sourceMappingURL=picker.js.map
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Terminal Renderer - Polished CLI Output
3
+ *
4
+ * Design inspired by Claude Code, OpenClaw, Charm.sh, and clig.dev:
5
+ *
6
+ * - Response text indented 2 spaces for visual separation from prompt
7
+ * - Tool calls framed with thin Unicode box-drawing lines
8
+ * - Markdown rendered inline (bold, code, lists, headings, quotes)
9
+ * - Streaming markdown: lines formatted as they complete
10
+ * - Syntax highlighting for common languages in code blocks
11
+ * - Word-wrap respects terminal width
12
+ * - Color used intentionally: cyan for links, gold for code, dim for chrome
13
+ * - Progress within 100ms (spinner starts immediately)
14
+ * - Errors are actionable, not cryptic
15
+ * - Respects NO_COLOR env var
16
+ * - Cost/time shown only when meaningful
17
+ *
18
+ * @package profclaw-interactive (future standalone)
19
+ */
20
+ import type { Renderer } from './types.js';
21
+ export declare function highlightCode(line: string, lang: string): string;
22
+ export declare function formatElapsed(ms: number): string;
23
+ export declare function formatTokens(count: number): string;
24
+ export declare function renderMarkdownLite(text: string): string;
25
+ export declare function createRenderer(): Renderer;
26
+ //# sourceMappingURL=renderer.d.ts.map