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,35 @@
1
+ /**
2
+ * Keybindings Configuration
3
+ *
4
+ * Loads, saves, and matches keyboard shortcuts.
5
+ * User overrides are read from .profclaw/keybindings.json and merged
6
+ * with the default set so unknown keys are always preserved.
7
+ */
8
+ export interface Keybinding {
9
+ key: string;
10
+ action: string;
11
+ description: string;
12
+ }
13
+ export interface KeyModifiers {
14
+ ctrl?: boolean;
15
+ alt?: boolean;
16
+ shift?: boolean;
17
+ }
18
+ export declare const DEFAULT_KEYBINDINGS: Keybinding[];
19
+ /**
20
+ * Load keybindings from the config file, merged with defaults.
21
+ * User-defined entries override defaults by `action`; entries in the config
22
+ * that don't match any default action are appended as custom bindings.
23
+ */
24
+ export declare function loadKeybindings(configPath?: string): Keybinding[];
25
+ /**
26
+ * Persist keybindings to the config file.
27
+ * Creates the .profclaw directory if it doesn't exist.
28
+ */
29
+ export declare function saveKeybindings(bindings: Keybinding[], configPath?: string): void;
30
+ /**
31
+ * Find the first keybinding matching a key + modifier combination.
32
+ * Returns undefined when no match is found.
33
+ */
34
+ export declare function matchKeybinding(key: string, modifiers: KeyModifiers, bindings: Keybinding[]): Keybinding | undefined;
35
+ //# sourceMappingURL=keybindings.d.ts.map
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Keybindings Configuration
3
+ *
4
+ * Loads, saves, and matches keyboard shortcuts.
5
+ * User overrides are read from .profclaw/keybindings.json and merged
6
+ * with the default set so unknown keys are always preserved.
7
+ */
8
+ import fs from 'fs';
9
+ import path from 'path';
10
+ // ── Defaults ──────────────────────────────────────────────────────────────────
11
+ export const DEFAULT_KEYBINDINGS = [
12
+ { key: 'ctrl+l', action: 'clear', description: 'Clear screen' },
13
+ { key: 'ctrl+c', action: 'cancel', description: 'Cancel current operation' },
14
+ { key: 'ctrl+d', action: 'exit', description: 'Quit' },
15
+ { key: 'alt+enter', action: 'multiline', description: 'Enter multiline mode' },
16
+ { key: 'shift+tab', action: 'toggle-thinking', description: 'Toggle thinking display' },
17
+ { key: 'ctrl+p', action: 'session-picker', description: 'Open session picker' },
18
+ ];
19
+ // ── Helpers ───────────────────────────────────────────────────────────────────
20
+ function defaultConfigPath() {
21
+ return path.join(process.cwd(), '.profclaw', 'keybindings.json');
22
+ }
23
+ /**
24
+ * Normalise a key string to lowercase with sorted modifiers so comparisons
25
+ * are consistent regardless of how the caller orders modifier names.
26
+ * e.g. "Ctrl+Shift+L" → "ctrl+shift+l"
27
+ */
28
+ function normaliseKey(key) {
29
+ const parts = key.toLowerCase().split('+').map(p => p.trim());
30
+ const modifiers = parts.filter(p => ['ctrl', 'alt', 'shift'].includes(p)).sort();
31
+ const rest = parts.filter(p => !['ctrl', 'alt', 'shift'].includes(p));
32
+ return [...modifiers, ...rest].join('+');
33
+ }
34
+ /**
35
+ * Build a normalised key string from a bare key name and a modifiers object
36
+ * (as produced by Ink's `useInput` hook).
37
+ */
38
+ function buildKeyString(key, modifiers) {
39
+ const parts = [];
40
+ if (modifiers.ctrl)
41
+ parts.push('ctrl');
42
+ if (modifiers.alt)
43
+ parts.push('alt');
44
+ if (modifiers.shift)
45
+ parts.push('shift');
46
+ parts.push(key.toLowerCase());
47
+ return parts.join('+');
48
+ }
49
+ // ── Public API ────────────────────────────────────────────────────────────────
50
+ /**
51
+ * Load keybindings from the config file, merged with defaults.
52
+ * User-defined entries override defaults by `action`; entries in the config
53
+ * that don't match any default action are appended as custom bindings.
54
+ */
55
+ export function loadKeybindings(configPath) {
56
+ const filePath = configPath ?? defaultConfigPath();
57
+ let userBindings = [];
58
+ if (fs.existsSync(filePath)) {
59
+ try {
60
+ const raw = fs.readFileSync(filePath, 'utf8');
61
+ userBindings = JSON.parse(raw);
62
+ }
63
+ catch {
64
+ // Malformed JSON — fall back to defaults silently
65
+ }
66
+ }
67
+ if (userBindings.length === 0) {
68
+ return [...DEFAULT_KEYBINDINGS];
69
+ }
70
+ // Merge: for each default, check if user overrides by action
71
+ const userByAction = new Map(userBindings.map(b => [b.action, b]));
72
+ const merged = DEFAULT_KEYBINDINGS.map(def => {
73
+ const override = userByAction.get(def.action);
74
+ return override ? { ...def, ...override } : def;
75
+ });
76
+ // Append any custom user bindings whose action isn't in the defaults
77
+ const defaultActions = new Set(DEFAULT_KEYBINDINGS.map(b => b.action));
78
+ for (const binding of userBindings) {
79
+ if (!defaultActions.has(binding.action)) {
80
+ merged.push(binding);
81
+ }
82
+ }
83
+ return merged;
84
+ }
85
+ /**
86
+ * Persist keybindings to the config file.
87
+ * Creates the .profclaw directory if it doesn't exist.
88
+ */
89
+ export function saveKeybindings(bindings, configPath) {
90
+ const filePath = configPath ?? defaultConfigPath();
91
+ const dir = path.dirname(filePath);
92
+ if (!fs.existsSync(dir)) {
93
+ fs.mkdirSync(dir, { recursive: true });
94
+ }
95
+ fs.writeFileSync(filePath, JSON.stringify(bindings, null, 2), 'utf8');
96
+ }
97
+ /**
98
+ * Find the first keybinding matching a key + modifier combination.
99
+ * Returns undefined when no match is found.
100
+ */
101
+ export function matchKeybinding(key, modifiers, bindings) {
102
+ const pressed = normaliseKey(buildKeyString(key, modifiers));
103
+ return bindings.find(b => normaliseKey(b.key) === pressed);
104
+ }
105
+ //# sourceMappingURL=keybindings.js.map
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Markdown Renderer for Ink TUI
3
+ *
4
+ * Converts markdown text to Ink React elements with proper formatting.
5
+ * Ports the syntax highlighting and inline formatting patterns from
6
+ * src/cli/interactive/renderer.ts, adapted to output Ink Text/Box nodes
7
+ * instead of ANSI escape codes.
8
+ *
9
+ * Supports:
10
+ * - **bold**, *italic*, `inline code`, ~~strikethrough~~
11
+ * - ```lang ... ``` code blocks with syntax highlighting
12
+ * - # ## ### headings
13
+ * - > blockquotes
14
+ * - - / * bullet lists and 1. numbered lists
15
+ * - [text](url) links
16
+ * - --- horizontal rules
17
+ */
18
+ import type { ReactElement } from 'react';
19
+ export interface RenderOptions {
20
+ maxWidth?: number;
21
+ syntaxHighlight?: boolean;
22
+ linkStyle?: 'inline' | 'footnote' | 'hidden';
23
+ }
24
+ /**
25
+ * Renders a single line of code with syntax highlighting.
26
+ * Returns an array of React elements (one per token).
27
+ */
28
+ export declare function highlightCode(code: string, language: string): ReactElement;
29
+ /**
30
+ * Convert a markdown string to Ink React elements.
31
+ *
32
+ * Handles:
33
+ * - **bold**, *italic*, `inline code`, ~~strikethrough~~
34
+ * - ```lang ... ``` code blocks with optional syntax highlighting
35
+ * - # / ## / ### headings → bold cyan
36
+ * - > blockquotes → dim italic with left border
37
+ * - - / * bullet and 1. numbered lists with indent
38
+ * - [text](url) links
39
+ * - --- horizontal rules
40
+ */
41
+ export declare function renderMarkdown(text: string, options?: RenderOptions): ReactElement;
42
+ /**
43
+ * Strip all markdown formatting from text, returning plain readable text.
44
+ * Used by /copy and /save operations.
45
+ */
46
+ export declare function stripMarkdown(text: string): string;
47
+ //# sourceMappingURL=markdown-renderer.d.ts.map
@@ -0,0 +1,380 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ // ── Syntax highlighting ───────────────────────────────────────────────────────
4
+ const JS_KEYWORDS = new Set([
5
+ 'const', 'let', 'var', 'function', 'async', 'await', 'return',
6
+ 'import', 'export', 'from', 'default', 'class', 'extends', 'super',
7
+ 'this', 'if', 'else', 'for', 'while', 'do', 'switch', 'case',
8
+ 'break', 'continue', 'try', 'catch', 'finally', 'throw', 'new',
9
+ 'delete', 'typeof', 'instanceof', 'yield', 'of', 'in', 'static',
10
+ 'get', 'set', 'enum', 'interface', 'type', 'implements', 'declare',
11
+ 'abstract', 'readonly', 'as', 'is', 'keyof', 'infer', 'satisfies',
12
+ ]);
13
+ const PY_KEYWORDS = new Set([
14
+ 'def', 'class', 'if', 'elif', 'else', 'for', 'while', 'try',
15
+ 'except', 'finally', 'with', 'as', 'import', 'from', 'return',
16
+ 'yield', 'raise', 'pass', 'break', 'continue', 'and', 'or', 'not',
17
+ 'in', 'is', 'lambda', 'global', 'nonlocal', 'True', 'False', 'None',
18
+ 'async', 'await', 'self',
19
+ ]);
20
+ const COMMON_TYPES = new Set([
21
+ 'string', 'number', 'boolean', 'void', 'null', 'undefined', 'any',
22
+ 'never', 'unknown', 'object', 'Array', 'Map', 'Set', 'Promise',
23
+ 'Record', 'Partial', 'Required', 'Readonly', 'Pick', 'Omit',
24
+ 'int', 'float', 'str', 'bool', 'list', 'dict', 'tuple',
25
+ // From the spec
26
+ 'Dict', 'List', 'Optional',
27
+ ]);
28
+ function tokenizeLine(line, lang) {
29
+ const isPython = lang === 'python' || lang === 'py';
30
+ const isBash = lang === 'bash' || lang === 'shell' || lang === 'sh';
31
+ const isJson = lang === 'json';
32
+ const isYaml = lang === 'yaml' || lang === 'yml';
33
+ // Comments (whole line)
34
+ const commentMatch = line.match(/^(\s*)(\/\/.*|#.*)$/);
35
+ if (commentMatch) {
36
+ const tokens = [];
37
+ if (commentMatch[1])
38
+ tokens.push({ kind: 'plain', value: commentMatch[1] });
39
+ tokens.push({ kind: 'comment', value: commentMatch[2] });
40
+ return tokens;
41
+ }
42
+ // For JSON/YAML, do minimal tokenization (strings + numbers)
43
+ if (isJson || isYaml || isBash) {
44
+ return tokenizeSimple(line);
45
+ }
46
+ // Full tokenization for JS/TS/Python/Go/Rust
47
+ const tokens = [];
48
+ const keywords = isPython ? PY_KEYWORDS : JS_KEYWORDS;
49
+ // We walk the string and emit tokens as we go.
50
+ // Strategy: scan for strings first (they can contain keywords), then others.
51
+ let i = 0;
52
+ let plain = '';
53
+ const flushPlain = () => {
54
+ if (!plain)
55
+ return;
56
+ // Match: identifier (possibly followed by '('), standalone number, or any other char.
57
+ // NOTE: \s* is NOT used after identifiers — whitespace is captured by the `\s+` arm
58
+ // so it is emitted as a plain token and not silently swallowed.
59
+ const wordRe = /([a-zA-Z_]\w*)(\()?|\b(\d+\.?\d*)\b|(\s+)|([\S])/g;
60
+ let wm;
61
+ const plainResult = [];
62
+ let wp = 0;
63
+ while ((wm = wordRe.exec(plain)) !== null) {
64
+ if (wm.index > wp) {
65
+ plainResult.push({ kind: 'plain', value: plain.slice(wp, wm.index) });
66
+ }
67
+ wp = wm.index + wm[0].length;
68
+ if (wm[3] !== undefined) {
69
+ // standalone number (not part of an identifier)
70
+ plainResult.push({ kind: 'number', value: wm[3] });
71
+ }
72
+ else if (wm[4] !== undefined) {
73
+ // whitespace — always emit as plain so spacing is preserved
74
+ plainResult.push({ kind: 'plain', value: wm[4] });
75
+ }
76
+ else if (wm[5] !== undefined) {
77
+ // any other non-space character
78
+ plainResult.push({ kind: 'plain', value: wm[5] });
79
+ }
80
+ else if (wm[1] !== undefined) {
81
+ const word = wm[1];
82
+ const hasParens = wm[2] !== undefined;
83
+ if (keywords.has(word)) {
84
+ plainResult.push({ kind: 'keyword', value: word });
85
+ if (hasParens)
86
+ plainResult.push({ kind: 'plain', value: '(' });
87
+ }
88
+ else if (COMMON_TYPES.has(word)) {
89
+ plainResult.push({ kind: 'type', value: word });
90
+ if (hasParens)
91
+ plainResult.push({ kind: 'plain', value: '(' });
92
+ }
93
+ else if (hasParens) {
94
+ plainResult.push({ kind: 'func', value: word });
95
+ plainResult.push({ kind: 'plain', value: '(' });
96
+ }
97
+ else {
98
+ plainResult.push({ kind: 'plain', value: word });
99
+ }
100
+ }
101
+ }
102
+ if (wp < plain.length) {
103
+ plainResult.push({ kind: 'plain', value: plain.slice(wp) });
104
+ }
105
+ tokens.push(...plainResult);
106
+ plain = '';
107
+ };
108
+ while (i < line.length) {
109
+ const ch = line[i];
110
+ // String literals (single, double, backtick)
111
+ if (ch === '"' || ch === "'" || ch === '`') {
112
+ flushPlain();
113
+ const quote = ch;
114
+ let str = quote;
115
+ i++;
116
+ while (i < line.length) {
117
+ const c = line[i];
118
+ str += c;
119
+ if (c === '\\') {
120
+ i++;
121
+ if (i < line.length) {
122
+ str += line[i];
123
+ i++;
124
+ }
125
+ continue;
126
+ }
127
+ if (c === quote) {
128
+ i++;
129
+ break;
130
+ }
131
+ i++;
132
+ }
133
+ tokens.push({ kind: 'string', value: str });
134
+ continue;
135
+ }
136
+ plain += ch;
137
+ i++;
138
+ }
139
+ flushPlain();
140
+ return tokens;
141
+ }
142
+ function tokenizeSimple(line) {
143
+ const tokens = [];
144
+ const strRe = /(["'])(?:(?!\1|\\).|\\.)*?\1|\b(\d+\.?\d*)\b/g;
145
+ let last = 0;
146
+ let m;
147
+ while ((m = strRe.exec(line)) !== null) {
148
+ if (m.index > last) {
149
+ tokens.push({ kind: 'plain', value: line.slice(last, m.index) });
150
+ }
151
+ if (m[1] !== undefined) {
152
+ tokens.push({ kind: 'string', value: m[0] });
153
+ }
154
+ else {
155
+ tokens.push({ kind: 'number', value: m[0] });
156
+ }
157
+ last = m.index + m[0].length;
158
+ }
159
+ if (last < line.length) {
160
+ tokens.push({ kind: 'plain', value: line.slice(last) });
161
+ }
162
+ return tokens;
163
+ }
164
+ function tokenColor(kind) {
165
+ switch (kind) {
166
+ case 'comment': return '#546E7A';
167
+ case 'string': return '#C3E88D';
168
+ case 'number': return '#F78C6C';
169
+ case 'keyword': return '#C792EA';
170
+ case 'type': return '#FFCB6B';
171
+ case 'func': return '#82AAFF';
172
+ default: return undefined;
173
+ }
174
+ }
175
+ /**
176
+ * Renders a single line of code with syntax highlighting.
177
+ * Returns an array of React elements (one per token).
178
+ */
179
+ export function highlightCode(code, language) {
180
+ const tokens = tokenizeLine(code, language);
181
+ return (_jsx(Text, { children: tokens.map((tok, i) => {
182
+ const color = tokenColor(tok.kind);
183
+ return color
184
+ ? _jsx(Text, { color: color, children: tok.value }, i)
185
+ : _jsx(Text, { children: tok.value }, i);
186
+ }) }));
187
+ }
188
+ function parseInline(text) {
189
+ const segments = [];
190
+ // Order matters: bold (**) before italic (*), strike (~~) before others
191
+ const re = /(\*\*(.+?)\*\*|~~(.+?)~~|\*([^*\n]+)\*(?!\*)|_([^_\n]+)_|`([^`]+)`|\[([^\]\n]+)\]\(([^)\n]+)\))/g;
192
+ let last = 0;
193
+ let m;
194
+ while ((m = re.exec(text)) !== null) {
195
+ if (m.index > last) {
196
+ segments.push({ type: 'text', value: text.slice(last, m.index) });
197
+ }
198
+ if (m[2] !== undefined) {
199
+ segments.push({ type: 'bold', value: m[2] });
200
+ }
201
+ else if (m[3] !== undefined) {
202
+ segments.push({ type: 'strike', value: m[3] });
203
+ }
204
+ else if (m[4] !== undefined) {
205
+ segments.push({ type: 'italic', value: m[4] });
206
+ }
207
+ else if (m[5] !== undefined) {
208
+ segments.push({ type: 'italic', value: m[5] });
209
+ }
210
+ else if (m[6] !== undefined) {
211
+ segments.push({ type: 'code', value: m[6] });
212
+ }
213
+ else if (m[7] !== undefined && m[8] !== undefined) {
214
+ segments.push({ type: 'link', label: m[7], url: m[8] });
215
+ }
216
+ last = m.index + m[0].length;
217
+ }
218
+ if (last < text.length) {
219
+ segments.push({ type: 'text', value: text.slice(last) });
220
+ }
221
+ return segments;
222
+ }
223
+ const InlineSegmentNode = ({ seg, linkStyle }) => {
224
+ switch (seg.type) {
225
+ case 'bold':
226
+ return _jsx(Text, { bold: true, children: seg.value });
227
+ case 'italic':
228
+ return _jsx(Text, { italic: true, children: seg.value });
229
+ case 'code':
230
+ return _jsx(Text, { color: "#F0C987", children: seg.value });
231
+ case 'strike':
232
+ return _jsx(Text, { strikethrough: true, dimColor: true, children: seg.value });
233
+ case 'link': {
234
+ if (linkStyle === 'hidden') {
235
+ return _jsx(Text, { children: seg.label });
236
+ }
237
+ if (linkStyle === 'footnote') {
238
+ return (_jsxs(Text, { children: [_jsx(Text, { color: "blue", underline: true, children: seg.label }), _jsx(Text, { dimColor: true, children: ' (' + seg.url + ')' })] }));
239
+ }
240
+ // Default: inline — label in blue + underline
241
+ return _jsx(Text, { color: "blue", underline: true, children: seg.label });
242
+ }
243
+ default:
244
+ return _jsx(Text, { children: seg.value });
245
+ }
246
+ };
247
+ const InlineText = ({ text, linkStyle }) => {
248
+ const segs = parseInline(text);
249
+ if (segs.length === 1 && segs[0].type === 'text') {
250
+ return _jsx(Text, { children: segs[0].value });
251
+ }
252
+ return (_jsx(Text, { children: segs.map((seg, i) => (_jsx(InlineSegmentNode, { seg: seg, linkStyle: linkStyle }, i))) }));
253
+ };
254
+ const BlockLine = ({ line, inCode, codeLang, linkStyle, syntaxHighlight, }) => {
255
+ // Inside code block
256
+ if (inCode) {
257
+ return (_jsxs(Box, { paddingLeft: 1, children: [_jsx(Text, { color: "#3C414B", children: "\u2502 " }), syntaxHighlight
258
+ ? highlightCode(line, codeLang)
259
+ : _jsx(Text, { color: "#F0C987", children: line })] }));
260
+ }
261
+ // H1
262
+ if (line.startsWith('# ')) {
263
+ return (_jsx(Text, { bold: true, color: "cyan", children: _jsx(InlineText, { text: line.slice(2), linkStyle: linkStyle }) }));
264
+ }
265
+ // H2
266
+ if (line.startsWith('## ')) {
267
+ return (_jsx(Text, { bold: true, color: "cyan", children: _jsx(InlineText, { text: line.slice(3), linkStyle: linkStyle }) }));
268
+ }
269
+ // H3+
270
+ if (line.startsWith('### ')) {
271
+ return (_jsx(Text, { bold: true, children: _jsx(InlineText, { text: line.slice(4), linkStyle: linkStyle }) }));
272
+ }
273
+ if (line.startsWith('#### ')) {
274
+ return (_jsx(Text, { bold: true, children: _jsx(InlineText, { text: line.slice(5), linkStyle: linkStyle }) }));
275
+ }
276
+ // Blockquote
277
+ if (line.startsWith('> ')) {
278
+ return (_jsxs(Box, { flexDirection: "row", children: [_jsx(Text, { color: "#3C414B", children: "\u2502 " }), _jsx(Text, { italic: true, dimColor: true, children: _jsx(InlineText, { text: line.slice(2), linkStyle: linkStyle }) })] }));
279
+ }
280
+ // Bullet list
281
+ const bullet = line.match(/^(\s*)([-*])\s(.*)/);
282
+ if (bullet) {
283
+ const indent = bullet[1].length;
284
+ return (_jsxs(Box, { paddingLeft: indent + 2, flexDirection: "row", gap: 1, children: [_jsx(Text, { dimColor: true, children: "\u203A" }), _jsx(InlineText, { text: bullet[3], linkStyle: linkStyle })] }));
285
+ }
286
+ // Numbered list
287
+ const num = line.match(/^(\s*)(\d+\.)\s(.*)/);
288
+ if (num) {
289
+ const indent = num[1].length;
290
+ return (_jsxs(Box, { paddingLeft: indent + 2, flexDirection: "row", gap: 1, children: [_jsx(Text, { dimColor: true, children: num[2] }), _jsx(InlineText, { text: num[3], linkStyle: linkStyle })] }));
291
+ }
292
+ // Horizontal rule
293
+ if (line.match(/^[-*_]{3,}$/)) {
294
+ return _jsx(Text, { dimColor: true, children: '─'.repeat(40) });
295
+ }
296
+ // Empty line — spacer
297
+ if (line.trim() === '') {
298
+ return _jsx(Text, { children: ' ' });
299
+ }
300
+ // Normal paragraph text
301
+ return _jsx(InlineText, { text: line, linkStyle: linkStyle });
302
+ };
303
+ // ── Code fence header/footer components ──────────────────────────────────────
304
+ const CodeFenceOpen = ({ lang }) => (_jsxs(Box, { paddingLeft: 1, children: [_jsx(Text, { dimColor: true, children: '┌───' }), lang ? _jsxs(Text, { dimColor: true, children: [" ", lang] }) : null] }));
305
+ const CodeFenceClose = () => (_jsx(Box, { paddingLeft: 1, children: _jsx(Text, { dimColor: true, children: "\u2514\u2500\u2500\u2500" }) }));
306
+ // ── Main renderMarkdown function ──────────────────────────────────────────────
307
+ /**
308
+ * Convert a markdown string to Ink React elements.
309
+ *
310
+ * Handles:
311
+ * - **bold**, *italic*, `inline code`, ~~strikethrough~~
312
+ * - ```lang ... ``` code blocks with optional syntax highlighting
313
+ * - # / ## / ### headings → bold cyan
314
+ * - > blockquotes → dim italic with left border
315
+ * - - / * bullet and 1. numbered lists with indent
316
+ * - [text](url) links
317
+ * - --- horizontal rules
318
+ */
319
+ export function renderMarkdown(text, options) {
320
+ const syntaxHighlight = options?.syntaxHighlight ?? true;
321
+ const linkStyle = options?.linkStyle ?? 'inline';
322
+ const lines = text.split('\n');
323
+ const nodes = [];
324
+ let inCode = false;
325
+ let codeLang = '';
326
+ for (let i = 0; i < lines.length; i++) {
327
+ const line = lines[i];
328
+ if (line.startsWith('```')) {
329
+ if (inCode) {
330
+ inCode = false;
331
+ nodes.push(_jsx(CodeFenceClose, {}, `cfclose-${i}`));
332
+ codeLang = '';
333
+ }
334
+ else {
335
+ inCode = true;
336
+ codeLang = line.slice(3).trim();
337
+ nodes.push(_jsx(CodeFenceOpen, { lang: codeLang }, `cfopen-${i}`));
338
+ }
339
+ continue;
340
+ }
341
+ nodes.push(_jsx(Box, { children: _jsx(BlockLine, { line: line, inCode: inCode, codeLang: codeLang, linkStyle: linkStyle, syntaxHighlight: syntaxHighlight }) }, `line-${i}`));
342
+ }
343
+ return (_jsx(Box, { flexDirection: "column", children: nodes }));
344
+ }
345
+ // ── stripMarkdown ─────────────────────────────────────────────────────────────
346
+ /**
347
+ * Strip all markdown formatting from text, returning plain readable text.
348
+ * Used by /copy and /save operations.
349
+ */
350
+ export function stripMarkdown(text) {
351
+ return text
352
+ // Code fences — remove fence markers, keep content
353
+ .replace(/^```[a-z]*\n?/gm, '')
354
+ .replace(/^```\s*$/gm, '')
355
+ // Headings — remove # prefix
356
+ .replace(/^#{1,6}\s+/gm, '')
357
+ // Bold
358
+ .replace(/\*\*(.+?)\*\*/g, '$1')
359
+ // Strikethrough
360
+ .replace(/~~(.+?)~~/g, '$1')
361
+ // Italic (asterisk and underscore)
362
+ .replace(/\*([^*\n]+)\*/g, '$1')
363
+ .replace(/_([^_\n]+)_/g, '$1')
364
+ // Inline code
365
+ .replace(/`([^`]+)`/g, '$1')
366
+ // Links — keep label, discard URL
367
+ .replace(/\[([^\]]+)\]\([^)]+\)/g, '$1')
368
+ // Blockquotes — remove leading >
369
+ .replace(/^>\s*/gm, '')
370
+ // Horizontal rules
371
+ .replace(/^[-*_]{3,}$/gm, '')
372
+ // Trim trailing whitespace per line
373
+ .split('\n')
374
+ .map((l) => l.trimEnd())
375
+ .join('\n')
376
+ // Collapse 3+ consecutive blank lines to 2
377
+ .replace(/\n{3,}/g, '\n\n')
378
+ .trim();
379
+ }
380
+ //# sourceMappingURL=markdown-renderer.js.map
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Output Styles — configurable formatting for TUI messages.
3
+ *
4
+ * Styles control how assistant messages, code blocks, and tool calls
5
+ * are presented in the terminal. Load from .profclaw/style.json or
6
+ * use one of the built-in named styles.
7
+ */
8
+ export interface OutputStyle {
9
+ name: string;
10
+ /** Prefix prepended to each line of an assistant message, e.g. '│ ' */
11
+ messagePrefix: string;
12
+ /** Chalk color name for the message prefix, e.g. 'cyan' or 'gray' */
13
+ messagePrefixColor: string;
14
+ /** Whether to draw a top/bottom border around code blocks */
15
+ codeBlockBorder: boolean;
16
+ /** Chalk color name for the code language label, e.g. 'yellow' */
17
+ codeLabelColor: string;
18
+ /** Icon shown before a tool call name, e.g. '⚙' or '->' */
19
+ toolIcon: string;
20
+ /** Chalk color name for tool call output */
21
+ toolColor: string;
22
+ /** Reduce whitespace between consecutive messages */
23
+ compact: boolean;
24
+ }
25
+ export declare const BUILT_IN_STYLES: Record<string, OutputStyle>;
26
+ /**
27
+ * Load an OutputStyle by name, or from a .profclaw/style.json config file.
28
+ *
29
+ * Resolution order:
30
+ * 1. If `name` matches a built-in style key — use it.
31
+ * 2. If a style.json file exists — merge it on top of the default style.
32
+ * If the file has a `name` field that matches a built-in, use that as
33
+ * the base instead of `default`.
34
+ * 3. Fall back to the `default` built-in style.
35
+ *
36
+ * @param name Optional style name override (e.g. from `--style minimal`).
37
+ */
38
+ export declare function loadOutputStyle(name?: string): OutputStyle;
39
+ //# sourceMappingURL=output-styles.d.ts.map