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
@@ -246,11 +246,11 @@ export declare const SummarySchema: z.ZodObject<{
246
246
  }[];
247
247
  taskId?: string | undefined;
248
248
  component?: string | undefined;
249
+ startedAt?: Date | undefined;
249
250
  repository?: string | undefined;
250
251
  branch?: string | undefined;
251
252
  metadata?: Record<string, unknown> | undefined;
252
253
  sessionId?: string | undefined;
253
- startedAt?: Date | undefined;
254
254
  completedAt?: Date | undefined;
255
255
  durationMs?: number | undefined;
256
256
  model?: string | undefined;
@@ -278,12 +278,12 @@ export declare const SummarySchema: z.ZodObject<{
278
278
  whatChanged: string;
279
279
  taskId?: string | undefined;
280
280
  component?: string | undefined;
281
+ startedAt?: Date | undefined;
281
282
  repository?: string | undefined;
282
283
  branch?: string | undefined;
283
284
  labels?: string[] | undefined;
284
285
  metadata?: Record<string, unknown> | undefined;
285
286
  sessionId?: string | undefined;
286
- startedAt?: Date | undefined;
287
287
  completedAt?: Date | undefined;
288
288
  durationMs?: number | undefined;
289
289
  model?: string | undefined;
@@ -341,13 +341,13 @@ export type Artifact = ArtifactReference;
341
341
  export declare const CreateSummaryInputSchema: z.ZodObject<{
342
342
  taskId: z.ZodOptional<z.ZodString>;
343
343
  component: z.ZodOptional<z.ZodString>;
344
+ startedAt: z.ZodOptional<z.ZodDate>;
344
345
  title: z.ZodString;
345
346
  repository: z.ZodOptional<z.ZodString>;
346
347
  branch: z.ZodOptional<z.ZodString>;
347
348
  labels: z.ZodOptional<z.ZodDefault<z.ZodArray<z.ZodString, "many">>>;
348
349
  metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
349
350
  sessionId: z.ZodOptional<z.ZodString>;
350
- startedAt: z.ZodOptional<z.ZodDate>;
351
351
  completedAt: z.ZodOptional<z.ZodDate>;
352
352
  durationMs: z.ZodOptional<z.ZodNumber>;
353
353
  agent: z.ZodString;
@@ -459,12 +459,12 @@ export declare const CreateSummaryInputSchema: z.ZodObject<{
459
459
  whatChanged: string;
460
460
  taskId?: string | undefined;
461
461
  component?: string | undefined;
462
+ startedAt?: Date | undefined;
462
463
  repository?: string | undefined;
463
464
  branch?: string | undefined;
464
465
  labels?: string[] | undefined;
465
466
  metadata?: Record<string, unknown> | undefined;
466
467
  sessionId?: string | undefined;
467
- startedAt?: Date | undefined;
468
468
  completedAt?: Date | undefined;
469
469
  durationMs?: number | undefined;
470
470
  model?: string | undefined;
@@ -516,12 +516,12 @@ export declare const CreateSummaryInputSchema: z.ZodObject<{
516
516
  whatChanged: string;
517
517
  taskId?: string | undefined;
518
518
  component?: string | undefined;
519
+ startedAt?: Date | undefined;
519
520
  repository?: string | undefined;
520
521
  branch?: string | undefined;
521
522
  labels?: string[] | undefined;
522
523
  metadata?: Record<string, unknown> | undefined;
523
524
  sessionId?: string | undefined;
524
- startedAt?: Date | undefined;
525
525
  completedAt?: Date | undefined;
526
526
  durationMs?: number | undefined;
527
527
  model?: string | undefined;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Auto-Update Check
3
+ *
4
+ * Checks npm registry for newer versions of profclaw and caches the result
5
+ * for 24 hours so startup is not meaningfully delayed.
6
+ * Cache file: .profclaw/update-check.json
7
+ */
8
+ export interface UpdateInfo {
9
+ currentVersion: string;
10
+ latestVersion: string;
11
+ updateAvailable: boolean;
12
+ releaseUrl?: string;
13
+ }
14
+ /**
15
+ * Check whether a newer version of `packageName` is available on npm.
16
+ * Results are cached for 24 hours in .profclaw/update-check.json.
17
+ */
18
+ export declare function checkForUpdate(packageName?: string): Promise<UpdateInfo>;
19
+ /**
20
+ * Format an update notification message suitable for printing to the terminal.
21
+ */
22
+ export declare function formatUpdateMessage(info: UpdateInfo): string;
23
+ //# sourceMappingURL=auto-update.d.ts.map
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Auto-Update Check
3
+ *
4
+ * Checks npm registry for newer versions of profclaw and caches the result
5
+ * for 24 hours so startup is not meaningfully delayed.
6
+ * Cache file: .profclaw/update-check.json
7
+ */
8
+ import fs from 'fs';
9
+ import path from 'path';
10
+ import { createRequire } from 'module';
11
+ const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
12
+ const NPM_REGISTRY = 'https://registry.npmjs.org';
13
+ function getCacheDir() {
14
+ return path.join(process.cwd(), '.profclaw');
15
+ }
16
+ function getCachePath() {
17
+ return path.join(getCacheDir(), 'update-check.json');
18
+ }
19
+ function readCache() {
20
+ try {
21
+ const raw = fs.readFileSync(getCachePath(), 'utf8');
22
+ return JSON.parse(raw);
23
+ }
24
+ catch {
25
+ return null;
26
+ }
27
+ }
28
+ function writeCache(info) {
29
+ try {
30
+ const dir = getCacheDir();
31
+ if (!fs.existsSync(dir)) {
32
+ fs.mkdirSync(dir, { recursive: true });
33
+ }
34
+ const cache = { checkedAt: Date.now(), info };
35
+ fs.writeFileSync(getCachePath(), JSON.stringify(cache, null, 2), 'utf8');
36
+ }
37
+ catch {
38
+ // Non-fatal — update check is best-effort
39
+ }
40
+ }
41
+ function isCacheValid(cache) {
42
+ return Date.now() - cache.checkedAt < CACHE_TTL_MS;
43
+ }
44
+ function getCurrentVersion(packageName) {
45
+ try {
46
+ // Try to read from the package.json that ships with the installed package
47
+ const require = createRequire(import.meta.url);
48
+ const pkgPath = require.resolve(`${packageName}/package.json`);
49
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
50
+ return pkg.version;
51
+ }
52
+ catch {
53
+ // Fallback: read from our own package.json (works in dev / monorepo)
54
+ try {
55
+ const selfPath = path.resolve(path.dirname(new URL(import.meta.url).pathname), '../../package.json');
56
+ const pkg = JSON.parse(fs.readFileSync(selfPath, 'utf8'));
57
+ return pkg.version;
58
+ }
59
+ catch {
60
+ return '0.0.0';
61
+ }
62
+ }
63
+ }
64
+ function getPackageName() {
65
+ try {
66
+ const selfPath = path.resolve(path.dirname(new URL(import.meta.url).pathname), '../../package.json');
67
+ const pkg = JSON.parse(fs.readFileSync(selfPath, 'utf8'));
68
+ return pkg.name;
69
+ }
70
+ catch {
71
+ return 'profclaw';
72
+ }
73
+ }
74
+ /**
75
+ * Compare two semver strings.
76
+ * Returns true when `latest` is strictly newer than `current`.
77
+ */
78
+ function isNewerVersion(current, latest) {
79
+ const parse = (v) => v
80
+ .replace(/^[^0-9]*/, '')
81
+ .split('.')
82
+ .map(n => parseInt(n, 10) || 0);
83
+ const [cMaj, cMin, cPatch] = parse(current);
84
+ const [lMaj, lMin, lPatch] = parse(latest);
85
+ if (lMaj !== cMaj)
86
+ return (lMaj ?? 0) > (cMaj ?? 0);
87
+ if (lMin !== cMin)
88
+ return (lMin ?? 0) > (cMin ?? 0);
89
+ return (lPatch ?? 0) > (cPatch ?? 0);
90
+ }
91
+ /**
92
+ * Fetch the latest version from the npm registry.
93
+ * Throws if the network request fails.
94
+ */
95
+ async function fetchLatestVersion(packageName) {
96
+ const url = `${NPM_REGISTRY}/${encodeURIComponent(packageName)}/latest`;
97
+ const response = await fetch(url, {
98
+ headers: { Accept: 'application/json' },
99
+ signal: AbortSignal.timeout(5000),
100
+ });
101
+ if (!response.ok) {
102
+ throw new Error(`npm registry returned ${response.status} for ${packageName}`);
103
+ }
104
+ const data = (await response.json());
105
+ return data.version;
106
+ }
107
+ /**
108
+ * Check whether a newer version of `packageName` is available on npm.
109
+ * Results are cached for 24 hours in .profclaw/update-check.json.
110
+ */
111
+ export async function checkForUpdate(packageName) {
112
+ const pkg = packageName ?? getPackageName();
113
+ const currentVersion = getCurrentVersion(pkg);
114
+ // Serve from cache if still fresh
115
+ const cached = readCache();
116
+ if (cached && isCacheValid(cached) && cached.info.currentVersion === currentVersion) {
117
+ return cached.info;
118
+ }
119
+ try {
120
+ const latestVersion = await fetchLatestVersion(pkg);
121
+ const updateAvailable = isNewerVersion(currentVersion, latestVersion);
122
+ const info = {
123
+ currentVersion,
124
+ latestVersion,
125
+ updateAvailable,
126
+ releaseUrl: updateAvailable
127
+ ? `https://www.npmjs.com/package/${pkg}/v/${latestVersion}`
128
+ : undefined,
129
+ };
130
+ writeCache(info);
131
+ return info;
132
+ }
133
+ catch {
134
+ // Network failure — return a no-update result without caching
135
+ return {
136
+ currentVersion,
137
+ latestVersion: currentVersion,
138
+ updateAvailable: false,
139
+ };
140
+ }
141
+ }
142
+ /**
143
+ * Format an update notification message suitable for printing to the terminal.
144
+ */
145
+ export function formatUpdateMessage(info) {
146
+ if (!info.updateAvailable)
147
+ return '';
148
+ const parts = [
149
+ `Update available: ${info.currentVersion} → ${info.latestVersion}.`,
150
+ `Run: npm i -g ${getPackageName()}`,
151
+ ];
152
+ if (info.releaseUrl) {
153
+ parts.push(` ${info.releaseUrl}`);
154
+ }
155
+ return parts.join(' ');
156
+ }
157
+ //# sourceMappingURL=auto-update.js.map
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Offline Detection Utility
3
+ *
4
+ * Periodically pings the server health endpoint to detect connectivity.
5
+ * Emits status-change notifications to registered listeners.
6
+ * Queues commands locally while offline and replays them on reconnect.
7
+ */
8
+ export type OfflineStatusListener = (online: boolean) => void;
9
+ export interface QueuedCommand {
10
+ id: string;
11
+ payload: unknown;
12
+ queuedAt: number;
13
+ }
14
+ export declare class OfflineDetector {
15
+ private isOnline;
16
+ private checkInterval;
17
+ private listeners;
18
+ private serverUrl;
19
+ private commandQueue;
20
+ /**
21
+ * Start polling `serverUrl + /health` every `intervalMs` milliseconds.
22
+ * Defaults to 10 seconds.
23
+ */
24
+ start(serverUrl: string, intervalMs?: number): void;
25
+ /** Stop polling. */
26
+ stop(): void;
27
+ /**
28
+ * Register a listener that is called whenever the online status changes.
29
+ * Returns an unsubscribe function.
30
+ */
31
+ onStatusChange(cb: OfflineStatusListener): () => void;
32
+ /** Returns the current online status. */
33
+ getStatus(): boolean;
34
+ /**
35
+ * Queue a command for later replay when the server comes back online.
36
+ * Returns the queued command's id.
37
+ */
38
+ queueCommand(payload: unknown): string;
39
+ /**
40
+ * Drain and return all queued commands in FIFO order.
41
+ * The queue is cleared after calling this.
42
+ */
43
+ drainQueue(): QueuedCommand[];
44
+ /** How many commands are currently queued. */
45
+ queueLength(): number;
46
+ private check;
47
+ private ping;
48
+ private emit;
49
+ }
50
+ /**
51
+ * Returns the shared singleton OfflineDetector.
52
+ * Lazily created on first call.
53
+ */
54
+ export declare function getOfflineDetector(): OfflineDetector;
55
+ //# sourceMappingURL=offline-detect.d.ts.map
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Offline Detection Utility
3
+ *
4
+ * Periodically pings the server health endpoint to detect connectivity.
5
+ * Emits status-change notifications to registered listeners.
6
+ * Queues commands locally while offline and replays them on reconnect.
7
+ */
8
+ const DEFAULT_INTERVAL_MS = 10_000;
9
+ const HEALTH_PATH = '/health';
10
+ const PING_TIMEOUT_MS = 5_000;
11
+ export class OfflineDetector {
12
+ isOnline = true;
13
+ checkInterval = null;
14
+ listeners = [];
15
+ serverUrl = '';
16
+ commandQueue = [];
17
+ /**
18
+ * Start polling `serverUrl + /health` every `intervalMs` milliseconds.
19
+ * Defaults to 10 seconds.
20
+ */
21
+ start(serverUrl, intervalMs = DEFAULT_INTERVAL_MS) {
22
+ this.serverUrl = serverUrl;
23
+ this.stop(); // clear any existing interval
24
+ // Run an immediate check, then repeat on the interval
25
+ void this.check();
26
+ this.checkInterval = setInterval(() => { void this.check(); }, intervalMs);
27
+ }
28
+ /** Stop polling. */
29
+ stop() {
30
+ if (this.checkInterval !== null) {
31
+ clearInterval(this.checkInterval);
32
+ this.checkInterval = null;
33
+ }
34
+ }
35
+ /**
36
+ * Register a listener that is called whenever the online status changes.
37
+ * Returns an unsubscribe function.
38
+ */
39
+ onStatusChange(cb) {
40
+ this.listeners.push(cb);
41
+ return () => {
42
+ this.listeners = this.listeners.filter(l => l !== cb);
43
+ };
44
+ }
45
+ /** Returns the current online status. */
46
+ getStatus() {
47
+ return this.isOnline;
48
+ }
49
+ /**
50
+ * Queue a command for later replay when the server comes back online.
51
+ * Returns the queued command's id.
52
+ */
53
+ queueCommand(payload) {
54
+ const id = `cmd-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
55
+ this.commandQueue.push({ id, payload, queuedAt: Date.now() });
56
+ return id;
57
+ }
58
+ /**
59
+ * Drain and return all queued commands in FIFO order.
60
+ * The queue is cleared after calling this.
61
+ */
62
+ drainQueue() {
63
+ const drained = [...this.commandQueue];
64
+ this.commandQueue = [];
65
+ return drained;
66
+ }
67
+ /** How many commands are currently queued. */
68
+ queueLength() {
69
+ return this.commandQueue.length;
70
+ }
71
+ // ── Private ──────────────────────────────────────────────────────────────────
72
+ async check() {
73
+ const wasOnline = this.isOnline;
74
+ const nowOnline = await this.ping();
75
+ if (nowOnline !== wasOnline) {
76
+ this.isOnline = nowOnline;
77
+ this.emit(nowOnline);
78
+ }
79
+ }
80
+ async ping() {
81
+ const url = `${this.serverUrl}${HEALTH_PATH}`;
82
+ const controller = new AbortController();
83
+ const timer = setTimeout(() => controller.abort(), PING_TIMEOUT_MS);
84
+ try {
85
+ const res = await fetch(url, {
86
+ method: 'GET',
87
+ signal: controller.signal,
88
+ });
89
+ return res.ok;
90
+ }
91
+ catch {
92
+ return false;
93
+ }
94
+ finally {
95
+ clearTimeout(timer);
96
+ }
97
+ }
98
+ emit(online) {
99
+ for (const listener of this.listeners) {
100
+ try {
101
+ listener(online);
102
+ }
103
+ catch {
104
+ // Swallow listener errors to keep the detector running
105
+ }
106
+ }
107
+ }
108
+ }
109
+ // ── Singleton ──────────────────────────────────────────────────────────────────
110
+ let _instance = null;
111
+ /**
112
+ * Returns the shared singleton OfflineDetector.
113
+ * Lazily created on first call.
114
+ */
115
+ export function getOfflineDetector() {
116
+ if (_instance === null) {
117
+ _instance = new OfflineDetector();
118
+ }
119
+ return _instance;
120
+ }
121
+ //# sourceMappingURL=offline-detect.js.map
@@ -0,0 +1,36 @@
1
+ export interface PidData {
2
+ pid: number;
3
+ port: number;
4
+ startedAt: number;
5
+ }
6
+ /**
7
+ * Write PID file with process info.
8
+ * Creates .profclaw/ directory if it doesn't exist.
9
+ */
10
+ export declare function writePidFile(port: number): void;
11
+ /**
12
+ * Read PID file.
13
+ * Returns null if the file doesn't exist or contains malformed data.
14
+ */
15
+ export declare function readPidFile(): PidData | null;
16
+ /**
17
+ * Remove PID file if it exists.
18
+ */
19
+ export declare function removePidFile(): void;
20
+ export interface ServerRunningResult {
21
+ running: boolean;
22
+ pid?: number;
23
+ port?: number;
24
+ }
25
+ /**
26
+ * Check if a server process described by the PID file is still alive.
27
+ * If the process is dead but the PID file exists, the stale file is cleaned up.
28
+ */
29
+ export declare function isServerRunning(): ServerRunningResult;
30
+ /**
31
+ * Kill the server described by the PID file using SIGTERM.
32
+ * Polls for up to 5 seconds waiting for the process to exit.
33
+ * Returns true if the process was killed (or was already gone), false on timeout.
34
+ */
35
+ export declare function killExistingServer(): boolean;
36
+ //# sourceMappingURL=pid-file.d.ts.map
@@ -0,0 +1,125 @@
1
+ import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ const PROFCLAW_DIR = '.profclaw';
4
+ const PID_FILENAME = 'server.pid';
5
+ function getPidPath() {
6
+ return join(process.cwd(), PROFCLAW_DIR, PID_FILENAME);
7
+ }
8
+ /**
9
+ * Write PID file with process info.
10
+ * Creates .profclaw/ directory if it doesn't exist.
11
+ */
12
+ export function writePidFile(port) {
13
+ const dir = join(process.cwd(), PROFCLAW_DIR);
14
+ if (!existsSync(dir)) {
15
+ mkdirSync(dir, { recursive: true });
16
+ }
17
+ const data = {
18
+ pid: process.pid,
19
+ port,
20
+ startedAt: Date.now(),
21
+ };
22
+ writeFileSync(getPidPath(), JSON.stringify(data, null, 2), 'utf-8');
23
+ }
24
+ /**
25
+ * Read PID file.
26
+ * Returns null if the file doesn't exist or contains malformed data.
27
+ */
28
+ export function readPidFile() {
29
+ const pidPath = getPidPath();
30
+ if (!existsSync(pidPath)) {
31
+ return null;
32
+ }
33
+ try {
34
+ const raw = readFileSync(pidPath, 'utf-8');
35
+ const parsed = JSON.parse(raw);
36
+ if (parsed !== null &&
37
+ typeof parsed === 'object' &&
38
+ 'pid' in parsed &&
39
+ 'port' in parsed &&
40
+ 'startedAt' in parsed &&
41
+ typeof parsed.pid === 'number' &&
42
+ typeof parsed.port === 'number' &&
43
+ typeof parsed.startedAt === 'number') {
44
+ return parsed;
45
+ }
46
+ return null;
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ }
52
+ /**
53
+ * Remove PID file if it exists.
54
+ */
55
+ export function removePidFile() {
56
+ const pidPath = getPidPath();
57
+ if (existsSync(pidPath)) {
58
+ try {
59
+ unlinkSync(pidPath);
60
+ }
61
+ catch {
62
+ // Best effort — ignore failures (e.g. race condition on shutdown)
63
+ }
64
+ }
65
+ }
66
+ /**
67
+ * Check if a server process described by the PID file is still alive.
68
+ * If the process is dead but the PID file exists, the stale file is cleaned up.
69
+ */
70
+ export function isServerRunning() {
71
+ const data = readPidFile();
72
+ if (!data) {
73
+ return { running: false };
74
+ }
75
+ try {
76
+ // Signal 0 checks process existence without sending a real signal
77
+ process.kill(data.pid, 0);
78
+ return { running: true, pid: data.pid, port: data.port };
79
+ }
80
+ catch {
81
+ // Process doesn't exist — stale PID file
82
+ removePidFile();
83
+ return { running: false };
84
+ }
85
+ }
86
+ /**
87
+ * Kill the server described by the PID file using SIGTERM.
88
+ * Polls for up to 5 seconds waiting for the process to exit.
89
+ * Returns true if the process was killed (or was already gone), false on timeout.
90
+ */
91
+ export function killExistingServer() {
92
+ const data = readPidFile();
93
+ if (!data) {
94
+ return false;
95
+ }
96
+ try {
97
+ process.kill(data.pid, 'SIGTERM');
98
+ }
99
+ catch {
100
+ // Process already gone
101
+ removePidFile();
102
+ return true;
103
+ }
104
+ // Poll up to 5 seconds (50 × 100 ms)
105
+ const MAX_WAIT_MS = 5000;
106
+ const POLL_INTERVAL_MS = 100;
107
+ const start = Date.now();
108
+ while (Date.now() - start < MAX_WAIT_MS) {
109
+ try {
110
+ process.kill(data.pid, 0);
111
+ // Still alive — busy-wait (synchronous polling, acceptable for a CLI shutdown path)
112
+ const pollUntil = Date.now() + POLL_INTERVAL_MS;
113
+ while (Date.now() < pollUntil) {
114
+ // spin wait
115
+ }
116
+ }
117
+ catch {
118
+ // Process gone
119
+ removePidFile();
120
+ return true;
121
+ }
122
+ }
123
+ return false;
124
+ }
125
+ //# sourceMappingURL=pid-file.js.map
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Sleep Prevention Utility
3
+ *
4
+ * Prevents OS sleep/screensaver during long agent runs.
5
+ * - macOS: uses `caffeinate -i -w {pid}`
6
+ * - Linux: tries `systemd-inhibit` then falls back to `xdg-screensaver suspend`
7
+ * - Windows: no-op (PowerShell SetThreadExecutionState not exposed without ffi)
8
+ */
9
+ export declare class SleepPreventer {
10
+ private _process;
11
+ private _active;
12
+ /**
13
+ * Start preventing OS sleep.
14
+ * Safe to call multiple times — subsequent calls are no-ops if already active.
15
+ */
16
+ start(): void;
17
+ /**
18
+ * Stop preventing sleep and release the system process.
19
+ */
20
+ stop(): void;
21
+ isActive(): boolean;
22
+ }
23
+ /**
24
+ * Returns the shared singleton SleepPreventer instance.
25
+ */
26
+ export declare function getSleepPreventer(): SleepPreventer;
27
+ //# sourceMappingURL=prevent-sleep.d.ts.map