profclaw 2.0.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (477) hide show
  1. package/.env.example +14 -2
  2. package/CHANGELOG.md +37 -0
  3. package/CONTRIBUTING.md +20 -0
  4. package/Dockerfile +39 -23
  5. package/README.md +174 -40
  6. package/dist/agents/agent-summary.d.ts +44 -0
  7. package/dist/agents/agent-summary.js +176 -0
  8. package/dist/agents/auto-memory.d.ts +59 -0
  9. package/dist/agents/auto-memory.js +310 -0
  10. package/dist/agents/checkpoint-manager.d.ts +76 -0
  11. package/dist/agents/checkpoint-manager.js +156 -0
  12. package/dist/agents/circuit-breaker.d.ts +54 -0
  13. package/dist/agents/circuit-breaker.js +153 -0
  14. package/dist/agents/context-compactor.d.ts +70 -0
  15. package/dist/agents/context-compactor.js +361 -0
  16. package/dist/agents/conversation-branch.d.ts +55 -0
  17. package/dist/agents/conversation-branch.js +115 -0
  18. package/dist/agents/error-recovery.d.ts +44 -0
  19. package/dist/agents/error-recovery.js +197 -0
  20. package/dist/agents/events.d.ts +76 -0
  21. package/dist/agents/events.js +8 -0
  22. package/dist/agents/executor.d.ts +35 -1
  23. package/dist/agents/executor.js +573 -124
  24. package/dist/agents/file-snapshots.d.ts +72 -0
  25. package/dist/agents/file-snapshots.js +182 -0
  26. package/dist/agents/index.d.ts +2 -0
  27. package/dist/agents/orchestrator.d.ts +183 -0
  28. package/dist/agents/orchestrator.js +495 -0
  29. package/dist/agents/permissions.d.ts +63 -0
  30. package/dist/agents/permissions.js +138 -0
  31. package/dist/agents/plan-mode.d.ts +71 -0
  32. package/dist/agents/plan-mode.js +186 -0
  33. package/dist/agents/prompt-suggestions.d.ts +33 -0
  34. package/dist/agents/prompt-suggestions.js +208 -0
  35. package/dist/agents/rate-limit-monitor.d.ts +56 -0
  36. package/dist/agents/rate-limit-monitor.js +224 -0
  37. package/dist/agents/result-store.d.ts +37 -0
  38. package/dist/agents/result-store.js +104 -0
  39. package/dist/agents/session-diff.d.ts +43 -0
  40. package/dist/agents/session-diff.js +258 -0
  41. package/dist/agents/tool-loader.d.ts +65 -0
  42. package/dist/agents/tool-loader.js +273 -0
  43. package/dist/agents/transcript.d.ts +96 -0
  44. package/dist/agents/transcript.js +267 -0
  45. package/dist/agents/worktree-manager.d.ts +80 -0
  46. package/dist/agents/worktree-manager.js +203 -0
  47. package/dist/auth/middleware.js +14 -0
  48. package/dist/chat/agentic-executor.d.ts +7 -0
  49. package/dist/chat/agentic-executor.js +253 -30
  50. package/dist/chat/conversations.d.ts +2 -0
  51. package/dist/chat/conversations.js +8 -0
  52. package/dist/chat/execution/executor.d.ts +8 -0
  53. package/dist/chat/execution/executor.js +157 -103
  54. package/dist/chat/execution/index.js +5 -1
  55. package/dist/chat/execution/tool-router.js +40 -14
  56. package/dist/chat/execution/tools/canvas.d.ts +2 -2
  57. package/dist/chat/execution/tools/code-tools.d.ts +66 -0
  58. package/dist/chat/execution/tools/code-tools.js +353 -0
  59. package/dist/chat/execution/tools/complete-task.d.ts +2 -2
  60. package/dist/chat/execution/tools/cron-tool.d.ts +26 -10
  61. package/dist/chat/execution/tools/cron-tool.js +48 -3
  62. package/dist/chat/execution/tools/decompose-task.d.ts +58 -0
  63. package/dist/chat/execution/tools/decompose-task.js +166 -0
  64. package/dist/chat/execution/tools/exec.d.ts +5 -2
  65. package/dist/chat/execution/tools/exec.js +294 -155
  66. package/dist/chat/execution/tools/feed-tools.d.ts +77 -0
  67. package/dist/chat/execution/tools/feed-tools.js +142 -0
  68. package/dist/chat/execution/tools/file-ops.d.ts +1 -1
  69. package/dist/chat/execution/tools/github.d.ts +2 -2
  70. package/dist/chat/execution/tools/index.d.ts +14 -2
  71. package/dist/chat/execution/tools/index.js +86 -12
  72. package/dist/chat/execution/tools/integrations.d.ts +8 -8
  73. package/dist/chat/execution/tools/multi-patch.d.ts +53 -0
  74. package/dist/chat/execution/tools/multi-patch.js +373 -0
  75. package/dist/chat/execution/tools/openai-image-gen.d.ts +2 -2
  76. package/dist/chat/execution/tools/plan-tools.d.ts +80 -0
  77. package/dist/chat/execution/tools/plan-tools.js +134 -0
  78. package/dist/chat/execution/tools/profclaw-ops.d.ts +6 -6
  79. package/dist/chat/execution/tools/repl-tool.d.ts +46 -0
  80. package/dist/chat/execution/tools/repl-tool.js +207 -0
  81. package/dist/chat/execution/tools/sessions-send.d.ts +2 -2
  82. package/dist/chat/execution/tools/slack-actions.d.ts +2 -2
  83. package/dist/chat/execution/tools/system.d.ts +4 -4
  84. package/dist/chat/execution/tools/todo-tool.d.ts +72 -0
  85. package/dist/chat/execution/tools/todo-tool.js +152 -0
  86. package/dist/chat/execution/tools/tool-search.d.ts +50 -0
  87. package/dist/chat/execution/tools/tool-search.js +155 -0
  88. package/dist/chat/execution/types.d.ts +21 -14
  89. package/dist/chat/execution/workflows/executor.d.ts +11 -0
  90. package/dist/chat/execution/workflows/executor.js +99 -1
  91. package/dist/chat/execution/workflows/types.d.ts +35 -2
  92. package/dist/chat/format/index.d.ts +1 -0
  93. package/dist/chat/format/index.js +1 -0
  94. package/dist/chat/format/markdown-convert.d.ts +23 -0
  95. package/dist/chat/format/markdown-convert.js +149 -0
  96. package/dist/chat/index.d.ts +1 -1
  97. package/dist/chat/index.js +1 -1
  98. package/dist/chat/message-handler.js +58 -6
  99. package/dist/chat/proactive/index.d.ts +62 -0
  100. package/dist/chat/proactive/index.js +147 -0
  101. package/dist/chat/prompt-adapter.js +2 -0
  102. package/dist/chat/providers/irc/index.d.ts +2 -2
  103. package/dist/chat/providers/telegram/index.d.ts +2 -0
  104. package/dist/chat/providers/telegram/index.js +21 -2
  105. package/dist/chat/system-prompts.d.ts +3 -3
  106. package/dist/chat/system-prompts.js +116 -61
  107. package/dist/chat/tools.d.ts +6 -6
  108. package/dist/cli/commands/auth.js +64 -1
  109. package/dist/cli/commands/chat.js +1327 -138
  110. package/dist/cli/commands/doctor.js +222 -16
  111. package/dist/cli/commands/history.d.ts +3 -0
  112. package/dist/cli/commands/history.js +138 -0
  113. package/dist/cli/commands/import.d.ts +44 -0
  114. package/dist/cli/commands/import.js +526 -0
  115. package/dist/cli/commands/init.d.ts +13 -0
  116. package/dist/cli/commands/init.js +381 -0
  117. package/dist/cli/commands/onboard.js +210 -30
  118. package/dist/cli/commands/plan.d.ts +13 -0
  119. package/dist/cli/commands/plan.js +184 -0
  120. package/dist/cli/commands/serve.d.ts +7 -0
  121. package/dist/cli/commands/serve.js +77 -18
  122. package/dist/cli/commands/setup.js +84 -3
  123. package/dist/cli/commands/status.js +54 -0
  124. package/dist/cli/commands/tools.js +13 -13
  125. package/dist/cli/commands/tui.js +26 -1
  126. package/dist/cli/index.js +19 -0
  127. package/dist/cli/ink/App.d.ts +13 -0
  128. package/dist/cli/ink/App.js +6 -0
  129. package/dist/cli/ink/ChatApp.d.ts +60 -0
  130. package/dist/cli/ink/ChatApp.js +325 -0
  131. package/dist/cli/ink/DashboardApp.d.ts +3 -0
  132. package/dist/cli/ink/DashboardApp.js +143 -0
  133. package/dist/cli/ink/components/AgentStatus.d.ts +17 -0
  134. package/dist/cli/ink/components/AgentStatus.js +33 -0
  135. package/dist/cli/ink/components/ChannelList.d.ts +17 -0
  136. package/dist/cli/ink/components/ChannelList.js +33 -0
  137. package/dist/cli/ink/components/ConnectionStatus.d.ts +19 -0
  138. package/dist/cli/ink/components/ConnectionStatus.js +50 -0
  139. package/dist/cli/ink/components/CostBar.d.ts +19 -0
  140. package/dist/cli/ink/components/CostBar.js +35 -0
  141. package/dist/cli/ink/components/HookStatus.d.ts +15 -0
  142. package/dist/cli/ink/components/HookStatus.js +7 -0
  143. package/dist/cli/ink/components/PermissionPrompt.d.ts +21 -0
  144. package/dist/cli/ink/components/PermissionPrompt.js +51 -0
  145. package/dist/cli/ink/components/PlanView.d.ts +23 -0
  146. package/dist/cli/ink/components/PlanView.js +26 -0
  147. package/dist/cli/ink/components/ProviderList.d.ts +16 -0
  148. package/dist/cli/ink/components/ProviderList.js +16 -0
  149. package/dist/cli/ink/components/SessionHeader.d.ts +15 -0
  150. package/dist/cli/ink/components/SessionHeader.js +15 -0
  151. package/dist/cli/ink/components/StreamingMessage.d.ts +20 -0
  152. package/dist/cli/ink/components/StreamingMessage.js +27 -0
  153. package/dist/cli/ink/components/SuggestionBar.d.ts +15 -0
  154. package/dist/cli/ink/components/SuggestionBar.js +28 -0
  155. package/dist/cli/ink/components/SystemHealth.d.ts +20 -0
  156. package/dist/cli/ink/components/SystemHealth.js +39 -0
  157. package/dist/cli/ink/components/TaskList.d.ts +17 -0
  158. package/dist/cli/ink/components/TaskList.js +59 -0
  159. package/dist/cli/ink/components/ToolCall.d.ts +17 -0
  160. package/dist/cli/ink/components/ToolCall.js +43 -0
  161. package/dist/cli/ink/index.d.ts +23 -0
  162. package/dist/cli/ink/index.js +15 -0
  163. package/dist/cli/ink/keybindings.d.ts +35 -0
  164. package/dist/cli/ink/keybindings.js +105 -0
  165. package/dist/cli/ink/markdown-renderer.d.ts +47 -0
  166. package/dist/cli/ink/markdown-renderer.js +380 -0
  167. package/dist/cli/ink/output-styles.d.ts +39 -0
  168. package/dist/cli/ink/output-styles.js +119 -0
  169. package/dist/cli/interactive/auto-serve.d.ts +38 -0
  170. package/dist/cli/interactive/auto-serve.js +209 -0
  171. package/dist/cli/interactive/index.d.ts +25 -0
  172. package/dist/cli/interactive/index.js +23 -0
  173. package/dist/cli/interactive/picker.d.ts +28 -0
  174. package/dist/cli/interactive/picker.js +153 -0
  175. package/dist/cli/interactive/renderer.d.ts +26 -0
  176. package/dist/cli/interactive/renderer.js +555 -0
  177. package/dist/cli/interactive/repl.d.ts +14 -0
  178. package/dist/cli/interactive/repl.js +1516 -0
  179. package/dist/cli/interactive/stream-client.d.ts +59 -0
  180. package/dist/cli/interactive/stream-client.js +506 -0
  181. package/dist/cli/interactive/types.d.ts +121 -0
  182. package/dist/cli/interactive/types.js +10 -0
  183. package/dist/cli/utils/api.d.ts +9 -0
  184. package/dist/cli/utils/api.js +58 -2
  185. package/dist/cron/natural-language.d.ts +54 -0
  186. package/dist/cron/natural-language.js +569 -0
  187. package/dist/cron/scheduler.d.ts +34 -4
  188. package/dist/cron/scheduler.js +141 -9
  189. package/dist/cron/templates.d.ts +1 -1
  190. package/dist/cron/templates.js +219 -0
  191. package/dist/feeds/feed-engine.d.ts +149 -0
  192. package/dist/feeds/feed-engine.js +600 -0
  193. package/dist/feeds/index.d.ts +9 -0
  194. package/dist/feeds/index.js +8 -0
  195. package/dist/gateway/router.js +6 -1
  196. package/dist/hooks/built-in/audit-log.d.ts +11 -0
  197. package/dist/hooks/built-in/audit-log.js +84 -0
  198. package/dist/hooks/built-in/cost-warning.d.ts +10 -0
  199. package/dist/hooks/built-in/cost-warning.js +59 -0
  200. package/dist/hooks/built-in/dangerous-tool.d.ts +32 -0
  201. package/dist/hooks/built-in/dangerous-tool.js +80 -0
  202. package/dist/hooks/built-in/index.d.ts +14 -0
  203. package/dist/hooks/built-in/index.js +20 -0
  204. package/dist/hooks/index.d.ts +3 -0
  205. package/dist/hooks/index.js +6 -0
  206. package/dist/hooks/loader.d.ts +17 -0
  207. package/dist/hooks/loader.js +142 -0
  208. package/dist/hooks/registry.d.ts +62 -0
  209. package/dist/hooks/registry.js +127 -0
  210. package/dist/integrations/web-search.js +6 -3
  211. package/dist/memory/index.d.ts +1 -0
  212. package/dist/memory/index.js +2 -0
  213. package/dist/memory/memory-service.js +14 -13
  214. package/dist/memory/observational.d.ts +62 -0
  215. package/dist/memory/observational.js +396 -0
  216. package/dist/middleware/content-filter.d.ts +22 -0
  217. package/dist/middleware/content-filter.js +69 -0
  218. package/dist/middleware/request-validator.d.ts +159 -0
  219. package/dist/middleware/request-validator.js +93 -0
  220. package/dist/plugins/sdk.d.ts +22 -0
  221. package/dist/plugins/sdk.js +17 -1
  222. package/dist/projects/types.d.ts +10 -10
  223. package/dist/providers/ai-sdk.d.ts +11 -0
  224. package/dist/providers/ai-sdk.js +78 -19
  225. package/dist/providers/core/models.js +67 -1
  226. package/dist/providers/core/types.d.ts +3 -0
  227. package/dist/providers/index.d.ts +1 -0
  228. package/dist/providers/index.js +1 -0
  229. package/dist/providers/smart-router.d.ts +118 -0
  230. package/dist/providers/smart-router.js +685 -0
  231. package/dist/providers/types.d.ts +16 -16
  232. package/dist/routes/agents.js +50 -0
  233. package/dist/routes/auth.js +8 -1
  234. package/dist/routes/chat.js +259 -14
  235. package/dist/routes/costs.js +32 -0
  236. package/dist/routes/cron.js +80 -5
  237. package/dist/routes/feeds.d.ts +10 -0
  238. package/dist/routes/feeds.js +168 -0
  239. package/dist/routes/mcp.js +21 -0
  240. package/dist/routes/memory.js +130 -0
  241. package/dist/routes/skills.js +129 -0
  242. package/dist/routes/teams.d.ts +9 -0
  243. package/dist/routes/teams.js +210 -0
  244. package/dist/routes/tools.js +14 -0
  245. package/dist/routes/users.js +2 -0
  246. package/dist/server/route-loader.js +3 -1
  247. package/dist/server/stream-bridge.d.ts +19 -0
  248. package/dist/server/stream-bridge.js +38 -0
  249. package/dist/server.js +310 -36
  250. package/dist/skills/marketplace.d.ts +87 -0
  251. package/dist/skills/marketplace.js +268 -0
  252. package/dist/storage/index.d.ts +14 -0
  253. package/dist/storage/index.js +64 -3
  254. package/dist/storage/schema.d.ts +4 -4
  255. package/dist/storage/schema.js +1 -1
  256. package/dist/teams/index.d.ts +110 -0
  257. package/dist/teams/index.js +365 -0
  258. package/dist/tickets/types.d.ts +39 -39
  259. package/dist/types/summary.d.ts +5 -5
  260. package/dist/utils/auto-update.d.ts +23 -0
  261. package/dist/utils/auto-update.js +157 -0
  262. package/dist/utils/offline-detect.d.ts +55 -0
  263. package/dist/utils/offline-detect.js +121 -0
  264. package/dist/utils/pid-file.d.ts +36 -0
  265. package/dist/utils/pid-file.js +125 -0
  266. package/dist/utils/prevent-sleep.d.ts +27 -0
  267. package/dist/utils/prevent-sleep.js +95 -0
  268. package/dist/utils/sanitizer.d.ts +57 -0
  269. package/dist/utils/sanitizer.js +174 -0
  270. package/docker-compose.yml +13 -137
  271. package/package.json +31 -6
  272. package/skills/deploy-cloudflare/SKILL.md +62 -0
  273. package/skills/deploy-vercel/SKILL.md +67 -0
  274. package/skills/docker-deploy/SKILL.md +158 -0
  275. package/skills/full-stack-builder/SKILL.md +92 -0
  276. package/skills/humanizer/SKILL.md +488 -0
  277. package/skills/profclaw-assistant/SKILL.md +85 -56
  278. package/ui/dist/assets/ActivityView-Da6HQ8ws.js +1 -0
  279. package/ui/dist/assets/AgentList-H58R0kX3.js +1 -0
  280. package/ui/dist/assets/AnalyticsDashboard-B28AeRsc.js +1 -0
  281. package/ui/dist/assets/AreaChart-DwLzeAQ8.js +1 -0
  282. package/ui/dist/assets/CartesianChart-piKQsTAR.js +36 -0
  283. package/ui/dist/assets/ChatView-Dbj8rxU5.js +10 -0
  284. package/ui/dist/assets/CostsDashboard-C6F5df0F.js +1 -0
  285. package/ui/dist/assets/EstimateSelect-wga0rUKX.js +1 -0
  286. package/ui/dist/assets/FeedDashboard-Ef6FEzEf.js +1 -0
  287. package/ui/dist/assets/FloatingChatbot-0yhkUeCq.js +2 -0
  288. package/ui/dist/assets/InviteCodeManagement-tUXfx4Bc.js +2 -0
  289. package/ui/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  290. package/ui/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  291. package/ui/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  292. package/ui/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  293. package/ui/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  294. package/ui/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  295. package/ui/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  296. package/ui/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  297. package/ui/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  298. package/ui/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  299. package/ui/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  300. package/ui/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  301. package/ui/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  302. package/ui/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  303. package/ui/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  304. package/ui/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  305. package/ui/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  306. package/ui/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  307. package/ui/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  308. package/ui/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  309. package/ui/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  310. package/ui/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  311. package/ui/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  312. package/ui/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  313. package/ui/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  314. package/ui/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  315. package/ui/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  316. package/ui/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  317. package/ui/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  318. package/ui/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  319. package/ui/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  320. package/ui/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  321. package/ui/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  322. package/ui/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  323. package/ui/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  324. package/ui/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  325. package/ui/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  326. package/ui/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  327. package/ui/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  328. package/ui/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  329. package/ui/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  330. package/ui/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  331. package/ui/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  332. package/ui/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  333. package/ui/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  334. package/ui/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  335. package/ui/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  336. package/ui/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  337. package/ui/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  338. package/ui/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  339. package/ui/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  340. package/ui/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  341. package/ui/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  342. package/ui/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  343. package/ui/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  344. package/ui/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  345. package/ui/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  346. package/ui/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  347. package/ui/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  348. package/ui/dist/assets/MarketplacePage-DGrLtolR.js +1 -0
  349. package/ui/dist/assets/{ProjectDetail--gPfvATB.js → ProjectDetail-BgWvA6UP.js} +2 -2
  350. package/ui/dist/assets/ProjectIcon-TDuliqwg.js +1 -0
  351. package/ui/dist/assets/ProjectList-DXgM4187.js +1 -0
  352. package/ui/dist/assets/{Settings-1kaf7VHE.js → Settings-xA8Zhi3p.js} +3 -3
  353. package/ui/dist/assets/StatusIndicator-B8vfFAxg.js +1 -0
  354. package/ui/dist/assets/{SummaryDetail-DV3AmONk.js → SummaryDetail-eedRfTtF.js} +2 -2
  355. package/ui/dist/assets/SummaryList-CLNX2P84.js +1 -0
  356. package/ui/dist/assets/TaskDetail-BtWclNiR.js +1 -0
  357. package/ui/dist/assets/TaskList-JjODAgSc.js +1 -0
  358. package/ui/dist/assets/TeamsPage-CBK5iAyx.js +1 -0
  359. package/ui/dist/assets/TicketBoard-C9aJNNYp.js +1 -0
  360. package/ui/dist/assets/TicketDetail-CV5JmL31.js +1 -0
  361. package/ui/dist/assets/TicketList-68V4lzUz.js +1 -0
  362. package/ui/dist/assets/UserManagement-DKTb6UpE.js +2 -0
  363. package/ui/dist/assets/ViewSwitcher-BvdQht2Y.js +1 -0
  364. package/ui/dist/assets/alert-dialog-O6qBOv_f.js +1 -0
  365. package/ui/dist/assets/{archive-BsLa7brF.js → archive-CX7UvZpf.js} +1 -1
  366. package/ui/dist/assets/badge-BbfnwDJP.js +1 -0
  367. package/ui/dist/assets/{bug-CmZI7jqM.js → bug-3WX0394-.js} +1 -1
  368. package/ui/dist/assets/{calendar-Bf0t2B82.js → calendar-buq77TaS.js} +1 -1
  369. package/ui/dist/assets/{chevron-up-CoUsOvZj.js → chevron-up-4ymsBJRo.js} +1 -1
  370. package/ui/dist/assets/{circle-x-Dgw11LgT.js → circle-x-ByXtwR6Y.js} +1 -1
  371. package/ui/dist/assets/constants-CVdDh7p0.js +1 -0
  372. package/ui/dist/assets/{cpu-DiPMQICV.js → cpu-CiuoCeDY.js} +1 -1
  373. package/ui/dist/assets/{database-BwTfupDi.js → database-BWXSBg5a.js} +1 -1
  374. package/ui/dist/assets/dialog-lDg4NvMV.js +1 -0
  375. package/ui/dist/assets/dollar-sign-Dmijd6DP.js +1 -0
  376. package/ui/dist/assets/{ellipsis-UJx4Xnf6.js → ellipsis-vT-5SVIp.js} +1 -1
  377. package/ui/dist/assets/{ellipsis-vertical-DoULYEKn.js → ellipsis-vertical-B4tAX_bL.js} +1 -1
  378. package/ui/dist/assets/feature-markdown-DBo5Q7uq.js +289 -0
  379. package/ui/dist/assets/{file-code-B2UrJLwi.js → file-code-ChOWdKXf.js} +1 -1
  380. package/ui/dist/assets/{folder-open-BJi577JH.js → folder-open-CkOUbIiP.js} +1 -1
  381. package/ui/dist/assets/{funnel-PkaD_HSR.js → funnel-uZkoSPP-.js} +1 -1
  382. package/ui/dist/assets/{git-branch-C_K30am0.js → git-branch-CwvUxj7C.js} +1 -1
  383. package/ui/dist/assets/{git-commit-horizontal-IT6ecxWQ.js → git-commit-horizontal-lxPzCvhD.js} +1 -1
  384. package/ui/dist/assets/{globe-f-jjCa_g.js → globe-D_WpJdsj.js} +1 -1
  385. package/ui/dist/assets/{hash-DNEv8Elo.js → hash-CA0hJ7vh.js} +1 -1
  386. package/ui/dist/assets/{history-BQSBo_1Q.js → history-CEWMLELs.js} +1 -1
  387. package/ui/dist/assets/inbox-ehtOptTV.js +1 -0
  388. package/ui/dist/assets/{index-nS3EErDg.js → index-C1rhbml4.js} +3 -3
  389. package/ui/dist/assets/index-CR8gfCHv.js +1 -0
  390. package/ui/dist/assets/index-DVXMpWai.js +1 -0
  391. package/ui/dist/assets/index-DaDJMM2v.js +1 -0
  392. package/ui/dist/assets/index-Djdq_0xu.js +1 -0
  393. package/ui/dist/assets/index-M46Gcb8K.css +1 -0
  394. package/ui/dist/assets/index-sEBN7w8J.js +109 -0
  395. package/ui/dist/assets/layers-C6Mhf8Nk.js +1 -0
  396. package/ui/dist/assets/{layout-dashboard-CcKt1hXw.js → layout-dashboard-BRUM0kpT.js} +1 -1
  397. package/ui/dist/assets/{lightbulb-Jhp7FvbU.js → lightbulb-CN2q1O5l.js} +1 -1
  398. package/ui/dist/assets/{link-2-DdO7ostF.js → link-2-CC4E28yJ.js} +1 -1
  399. package/ui/dist/assets/markdown-renderer-C6ENbB0u.js +10 -0
  400. package/ui/dist/assets/markdown-renderer-CfVKi3_s.css +1 -0
  401. package/ui/dist/assets/{message-square-CBgH65X7.js → message-square-Bbb241am.js} +1 -1
  402. package/ui/dist/assets/package-CwT3IzFx.js +1 -0
  403. package/ui/dist/assets/{pencil-CYXCEPQh.js → pencil-CDmiHzoj.js} +1 -1
  404. package/ui/dist/assets/{play-d1ONaH0-.js → play-tjy5jMQX.js} +1 -1
  405. package/ui/dist/assets/popover-CFHZf3pE.js +1 -0
  406. package/ui/dist/assets/progress-BboUHuLf.js +1 -0
  407. package/ui/dist/assets/{rocket-DhvUetsk.js → rocket--8ZHgdXJ.js} +1 -1
  408. package/ui/dist/assets/select-n108rXny.js +1 -0
  409. package/ui/dist/assets/{send-P0r5D7td.js → send-Cu7MR2Qh.js} +1 -1
  410. package/ui/dist/assets/server-DmodxZp-.js +1 -0
  411. package/ui/dist/assets/{settings-2-ocj5uHGx.js → settings-2-CkRNqkxj.js} +1 -1
  412. package/ui/dist/assets/sheet-7aUJkyzU.js +1 -0
  413. package/ui/dist/assets/{shield-check-DfVdE34l.js → shield-check-ViI3nMKE.js} +1 -1
  414. package/ui/dist/assets/{shield-off-8l0J6R-8.js → shield-off-DN3tagkn.js} +1 -1
  415. package/ui/dist/assets/skeleton-C0E1Nfro.js +1 -0
  416. package/ui/dist/assets/{smartphone-77_g3SQn.js → smartphone-5FghiXpA.js} +1 -1
  417. package/ui/dist/assets/{square-Ckzsr3Rn.js → square-DiNSx8K7.js} +1 -1
  418. package/ui/dist/assets/star-DhdFVidS.js +1 -0
  419. package/ui/dist/assets/switch-CIgVbZqQ.js +1 -0
  420. package/ui/dist/assets/table-BC56FVMV.js +1 -0
  421. package/ui/dist/assets/{tag-C35mgoEv.js → tag-CH_vQliw.js} +1 -1
  422. package/ui/dist/assets/textarea-CxDiKFXZ.js +1 -0
  423. package/ui/dist/assets/{timer-DHJBS2w1.js → timer-CdGVTb60.js} +1 -1
  424. package/ui/dist/assets/tooltip-BuW9A5UO.js +1 -0
  425. package/ui/dist/assets/{trash-2-keO5tKPE.js → trash-2-CucZJL0N.js} +1 -1
  426. package/ui/dist/assets/trending-down-BCezC1z2.js +1 -0
  427. package/ui/dist/assets/{trending-up-BBv8KbrY.js → trending-up-C5OYX2k2.js} +1 -1
  428. package/ui/dist/assets/vendor-query-C0p7b53x.js +4 -0
  429. package/ui/dist/assets/vendor-react-Mc5_kfYG.js +12 -0
  430. package/ui/dist/assets/vendor-ui-CXPAUBFv.js +51 -0
  431. package/ui/dist/assets/{wand-sparkles-BusQ52ZK.js → wand-sparkles-BaH6pJnc.js} +1 -1
  432. package/ui/dist/assets/{wrench-02YaOSiK.js → wrench-CjxjP6ok.js} +1 -1
  433. package/ui/dist/index.html +5 -2
  434. package/ui/dist/assets/ActivityView-BeshZXmE.js +0 -1
  435. package/ui/dist/assets/AgentList-QVHeldPi.js +0 -1
  436. package/ui/dist/assets/AnalyticsDashboard-C9R97dXE.js +0 -1
  437. package/ui/dist/assets/AreaChart-B73gaiVQ.js +0 -1
  438. package/ui/dist/assets/CartesianChart-CXYL2R-A.js +0 -36
  439. package/ui/dist/assets/ChatView-qjZErlrp.js +0 -10
  440. package/ui/dist/assets/CostsDashboard-O4DCLy1i.js +0 -1
  441. package/ui/dist/assets/EstimateSelect-1hQf4Osk.js +0 -1
  442. package/ui/dist/assets/FloatingChatbot-BZBzrJxd.js +0 -2
  443. package/ui/dist/assets/InviteCodeManagement-LEoGqYeA.js +0 -2
  444. package/ui/dist/assets/ProjectIcon-Chd_ofsw.js +0 -1
  445. package/ui/dist/assets/ProjectList-BvUfVB6c.js +0 -4
  446. package/ui/dist/assets/StatusIndicator-pRfkNcdV.js +0 -1
  447. package/ui/dist/assets/SummaryList-B6kXiTxL.js +0 -1
  448. package/ui/dist/assets/TaskDetail-CV6CzbOS.js +0 -1
  449. package/ui/dist/assets/TaskList-DL7brQKd.js +0 -1
  450. package/ui/dist/assets/TicketBoard-CrkkFj7C.js +0 -1
  451. package/ui/dist/assets/TicketDetail-hnnYclpD.js +0 -1
  452. package/ui/dist/assets/TicketList-CsDAyQCL.js +0 -1
  453. package/ui/dist/assets/UserManagement-BGFQyTSr.js +0 -2
  454. package/ui/dist/assets/ViewSwitcher-CnL0OqA8.js +0 -1
  455. package/ui/dist/assets/alert-dialog-SKM6Gjz4.js +0 -7
  456. package/ui/dist/assets/badge-CVHH1a-v.js +0 -1
  457. package/ui/dist/assets/brain-6o_RHVpe.js +0 -1
  458. package/ui/dist/assets/constants-Q5Zivl-a.js +0 -1
  459. package/ui/dist/assets/dialog-BUqN9Psj.js +0 -1
  460. package/ui/dist/assets/index-BUmnwPQr.js +0 -1
  461. package/ui/dist/assets/index-BfF5G4Cw.js +0 -1
  462. package/ui/dist/assets/index-C8N375c2.js +0 -1
  463. package/ui/dist/assets/index-CuxnqVVz.css +0 -1
  464. package/ui/dist/assets/index-CzMM3QOk.js +0 -1
  465. package/ui/dist/assets/index-lJlNPFVJ.js +0 -67
  466. package/ui/dist/assets/layers-jFqVrWMD.js +0 -1
  467. package/ui/dist/assets/markdown-renderer-n1ToC4XQ.js +0 -36
  468. package/ui/dist/assets/popover-CrmZgoWu.js +0 -1
  469. package/ui/dist/assets/progress-uv4SPkL5.js +0 -1
  470. package/ui/dist/assets/select-CeQ8AHGy.js +0 -1
  471. package/ui/dist/assets/server-CVHTZB72.js +0 -1
  472. package/ui/dist/assets/sheet-DuQExSho.js +0 -1
  473. package/ui/dist/assets/skeleton-TFiFJ3nB.js +0 -1
  474. package/ui/dist/assets/switch-CAePkd6k.js +0 -1
  475. package/ui/dist/assets/table-ZjAZ7hkt.js +0 -1
  476. package/ui/dist/assets/textarea-DsVPnSgR.js +0 -1
  477. package/ui/dist/assets/tooltip-BYmQ331W.js +0 -1
@@ -0,0 +1,526 @@
1
+ /**
2
+ * Import/Migration CLI Command
3
+ *
4
+ * Imports data from other AI assistants into profClaw:
5
+ * - OpenClaw: memories, skills, conversation history
6
+ * - ChatGPT: exported conversations (JSON)
7
+ * - Aider: chat history
8
+ *
9
+ * Usage:
10
+ * profclaw import --from openclaw [--path ~/.openclaw]
11
+ * profclaw import --from chatgpt --file conversations.json
12
+ * profclaw import --from aider [--path .]
13
+ */
14
+ import { readFile, readdir, stat } from 'node:fs/promises';
15
+ import { join, basename } from 'node:path';
16
+ import { homedir } from 'node:os';
17
+ import { Command } from 'commander';
18
+ import { createContextualLogger } from '../../utils/logger.js';
19
+ const log = createContextualLogger('Import');
20
+ // OpenClaw Import
21
+ /**
22
+ * Discover OpenClaw data directory.
23
+ * Checks: ~/.openclaw, OPENCLAW_HOME env, provided path.
24
+ */
25
+ function findOpenClawPath(providedPath) {
26
+ if (providedPath)
27
+ return providedPath;
28
+ if (process.env['OPENCLAW_HOME'])
29
+ return process.env['OPENCLAW_HOME'];
30
+ return join(homedir(), '.openclaw');
31
+ }
32
+ /**
33
+ * Parse an OpenClaw MEMORY.md index file to find memory file paths.
34
+ */
35
+ function parseMemoryIndex(content, basePath) {
36
+ const paths = [];
37
+ const linkPattern = /\[([^\]]+)\]\(([^)]+)\)/g;
38
+ let match;
39
+ while ((match = linkPattern.exec(content)) !== null) {
40
+ const relPath = match[2];
41
+ if (relPath.endsWith('.md') && !relPath.startsWith('http')) {
42
+ paths.push(join(basePath, relPath));
43
+ }
44
+ }
45
+ return paths;
46
+ }
47
+ /**
48
+ * Parse an OpenClaw memory file (YAML frontmatter + markdown body).
49
+ */
50
+ function parseOpenClawMemory(content, filePath) {
51
+ // Parse YAML frontmatter
52
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
53
+ if (!frontmatterMatch) {
54
+ // No frontmatter - treat entire content as memory
55
+ return {
56
+ name: basename(filePath, '.md'),
57
+ type: 'general',
58
+ content: content.trim(),
59
+ source: 'openclaw',
60
+ };
61
+ }
62
+ const [, yaml, body] = frontmatterMatch;
63
+ const metadata = {};
64
+ for (const line of yaml.split('\n')) {
65
+ const colonIdx = line.indexOf(':');
66
+ if (colonIdx > 0) {
67
+ const key = line.slice(0, colonIdx).trim();
68
+ const value = line.slice(colonIdx + 1).trim();
69
+ metadata[key] = value;
70
+ }
71
+ }
72
+ return {
73
+ name: metadata['name'] ?? basename(filePath, '.md'),
74
+ type: metadata['type'] ?? 'general',
75
+ content: body.trim(),
76
+ description: metadata['description'],
77
+ source: 'openclaw',
78
+ };
79
+ }
80
+ /**
81
+ * Import memories from OpenClaw.
82
+ */
83
+ async function importOpenClawMemories(basePath) {
84
+ const memories = [];
85
+ const errors = [];
86
+ // Check for MEMORY.md index
87
+ const indexPath = join(basePath, 'MEMORY.md');
88
+ let memoryPaths = [];
89
+ try {
90
+ const indexContent = await readFile(indexPath, 'utf8');
91
+ memoryPaths = parseMemoryIndex(indexContent, basePath);
92
+ }
93
+ catch {
94
+ // No index - scan memory/ directory
95
+ const memoryDir = join(basePath, 'memory');
96
+ try {
97
+ const files = await readdir(memoryDir);
98
+ memoryPaths = files
99
+ .filter(f => f.endsWith('.md'))
100
+ .map(f => join(memoryDir, f));
101
+ }
102
+ catch {
103
+ errors.push('No MEMORY.md index or memory/ directory found');
104
+ return { memories, errors };
105
+ }
106
+ }
107
+ // Parse each memory file
108
+ for (const memPath of memoryPaths) {
109
+ try {
110
+ const content = await readFile(memPath, 'utf8');
111
+ const parsed = parseOpenClawMemory(content, memPath);
112
+ if (parsed)
113
+ memories.push(parsed);
114
+ }
115
+ catch (err) {
116
+ errors.push(`Failed to read ${memPath}: ${err instanceof Error ? err.message : String(err)}`);
117
+ }
118
+ }
119
+ return { memories, errors };
120
+ }
121
+ /**
122
+ * Discover OpenClaw skills (SKILL.md files).
123
+ */
124
+ async function importOpenClawSkills(basePath) {
125
+ const skills = [];
126
+ const errors = [];
127
+ const skillDirs = [
128
+ join(basePath, 'skills'),
129
+ join(basePath, 'agent-skills'),
130
+ ];
131
+ for (const dir of skillDirs) {
132
+ try {
133
+ const entries = await readdir(dir, { withFileTypes: true });
134
+ for (const entry of entries) {
135
+ if (entry.isDirectory()) {
136
+ const skillFile = join(dir, entry.name, 'SKILL.md');
137
+ try {
138
+ await stat(skillFile);
139
+ skills.push(entry.name);
140
+ }
141
+ catch {
142
+ // No SKILL.md in this dir
143
+ }
144
+ }
145
+ }
146
+ }
147
+ catch {
148
+ // Directory doesn't exist
149
+ }
150
+ }
151
+ return { skills, errors };
152
+ }
153
+ /**
154
+ * Parse a ChatGPT conversation export (JSON format).
155
+ */
156
+ function parseChatGPTExport(content) {
157
+ const conversations = [];
158
+ const errors = [];
159
+ try {
160
+ const data = JSON.parse(content);
161
+ if (!Array.isArray(data)) {
162
+ errors.push('Expected array of conversations in ChatGPT export');
163
+ return { conversations, errors };
164
+ }
165
+ for (const conv of data) {
166
+ try {
167
+ const messages = [];
168
+ if (conv.mapping) {
169
+ // Extract messages from mapping (ChatGPT's internal format)
170
+ const sorted = Object.values(conv.mapping)
171
+ .filter(node => node.message?.content?.parts?.length)
172
+ .sort((a, b) => (a.message?.create_time ?? 0) - (b.message?.create_time ?? 0));
173
+ for (const node of sorted) {
174
+ const msg = node.message;
175
+ if (!msg?.author?.role || !msg.content?.parts?.length)
176
+ continue;
177
+ const role = msg.author.role === 'user' ? 'user'
178
+ : msg.author.role === 'assistant' ? 'assistant'
179
+ : 'system';
180
+ messages.push({
181
+ role,
182
+ content: msg.content.parts.join('\n'),
183
+ timestamp: msg.create_time
184
+ ? new Date(msg.create_time * 1000).toISOString()
185
+ : undefined,
186
+ });
187
+ }
188
+ }
189
+ if (messages.length > 0) {
190
+ conversations.push({
191
+ id: `chatgpt-${conversations.length}`,
192
+ title: conv.title ?? `Conversation ${conversations.length + 1}`,
193
+ messages,
194
+ source: 'chatgpt',
195
+ });
196
+ }
197
+ }
198
+ catch (err) {
199
+ errors.push(`Failed to parse conversation: ${err instanceof Error ? err.message : String(err)}`);
200
+ }
201
+ }
202
+ }
203
+ catch (err) {
204
+ errors.push(`Invalid JSON: ${err instanceof Error ? err.message : String(err)}`);
205
+ }
206
+ return { conversations, errors };
207
+ }
208
+ /**
209
+ * Extract memories from ChatGPT conversations.
210
+ * Looks for patterns: preferences, decisions, facts.
211
+ */
212
+ function extractMemoriesFromConversations(conversations) {
213
+ const memories = [];
214
+ const seenTopics = new Set();
215
+ for (const conv of conversations) {
216
+ const userMessages = conv.messages.filter(m => m.role === 'user');
217
+ // Extract preferences
218
+ for (const msg of userMessages) {
219
+ const prefMatch = msg.content.match(/\b(?:I (?:use|prefer|like|work with|always))\s+(\w[\w\s.-]{2,30})/i);
220
+ if (prefMatch && !seenTopics.has(prefMatch[1].toLowerCase())) {
221
+ seenTopics.add(prefMatch[1].toLowerCase());
222
+ memories.push({
223
+ name: `preference-${prefMatch[1].toLowerCase().replace(/\s+/g, '-')}`,
224
+ type: 'user',
225
+ content: `User prefers: ${prefMatch[1]}. Context: "${msg.content.slice(0, 100)}"`,
226
+ source: 'chatgpt',
227
+ });
228
+ }
229
+ }
230
+ // Extract topic as a high-level memory if conversation is substantial
231
+ if (userMessages.length >= 3 && conv.title) {
232
+ const topicKey = conv.title.toLowerCase().slice(0, 30);
233
+ if (!seenTopics.has(topicKey)) {
234
+ seenTopics.add(topicKey);
235
+ memories.push({
236
+ name: `topic-${topicKey.replace(/[^\w]/g, '-')}`,
237
+ type: 'project',
238
+ content: `Discussion about: ${conv.title}. ${userMessages.length} messages. First question: "${userMessages[0].content.slice(0, 100)}"`,
239
+ source: 'chatgpt',
240
+ });
241
+ }
242
+ }
243
+ }
244
+ return memories;
245
+ }
246
+ // Aider Import
247
+ /**
248
+ * Parse Aider chat history files (.aider.chat.history.md).
249
+ */
250
+ async function importAiderHistory(basePath) {
251
+ const conversations = [];
252
+ const errors = [];
253
+ const historyFiles = [
254
+ join(basePath, '.aider.chat.history.md'),
255
+ join(basePath, '.aider', 'chat-history.md'),
256
+ ];
257
+ for (const histFile of historyFiles) {
258
+ try {
259
+ const content = await readFile(histFile, 'utf8');
260
+ const sections = content.split(/^#{1,2}\s+/m).filter(Boolean);
261
+ for (const section of sections) {
262
+ const lines = section.split('\n');
263
+ const title = lines[0]?.trim() ?? 'Aider session';
264
+ const messages = [];
265
+ let currentRole = null;
266
+ let currentContent = [];
267
+ for (const line of lines.slice(1)) {
268
+ if (line.startsWith('> ') || line.startsWith('#### ')) {
269
+ // Save previous message
270
+ if (currentRole && currentContent.length > 0) {
271
+ messages.push({ role: currentRole, content: currentContent.join('\n').trim() });
272
+ currentContent = [];
273
+ }
274
+ currentRole = line.startsWith('> ') ? 'user' : 'assistant';
275
+ currentContent.push(line.replace(/^> |^#### /, ''));
276
+ }
277
+ else if (currentRole) {
278
+ currentContent.push(line);
279
+ }
280
+ }
281
+ // Save last message
282
+ if (currentRole && currentContent.length > 0) {
283
+ messages.push({ role: currentRole, content: currentContent.join('\n').trim() });
284
+ }
285
+ if (messages.length > 0) {
286
+ conversations.push({
287
+ id: `aider-${conversations.length}`,
288
+ title,
289
+ messages,
290
+ source: 'aider',
291
+ });
292
+ }
293
+ }
294
+ }
295
+ catch {
296
+ // File doesn't exist - try next
297
+ }
298
+ }
299
+ if (conversations.length === 0) {
300
+ errors.push('No Aider chat history found');
301
+ }
302
+ return { conversations, errors };
303
+ }
304
+ // Main Import Function
305
+ /**
306
+ * Import data from another AI assistant into profClaw.
307
+ * Returns a summary of what was imported.
308
+ */
309
+ export async function importFrom(source, options = {}) {
310
+ const start = Date.now();
311
+ const result = {
312
+ source,
313
+ memories: 0,
314
+ conversations: 0,
315
+ skills: 0,
316
+ preferences: 0,
317
+ errors: [],
318
+ duration: 0,
319
+ };
320
+ log.info(`Starting import from ${source}`, { path: options.path, file: options.file, dryRun: options.dryRun });
321
+ try {
322
+ switch (source) {
323
+ case 'openclaw': {
324
+ const basePath = findOpenClawPath(options.path);
325
+ // Import memories
326
+ const { memories, errors: memErrors } = await importOpenClawMemories(basePath);
327
+ result.errors.push(...memErrors);
328
+ if (!options.dryRun) {
329
+ // Persist memories to experience store
330
+ const { recordExperience } = await import('../../memory/experience-store.js');
331
+ for (const mem of memories) {
332
+ try {
333
+ await recordExperience({
334
+ type: mem.type === 'user' ? 'user_preference'
335
+ : mem.type === 'feedback' ? 'task_solution'
336
+ : 'task_solution',
337
+ intent: mem.name,
338
+ solution: { content: mem.content, importedFrom: 'openclaw' },
339
+ successScore: 0.8,
340
+ tags: ['imported', 'openclaw', mem.type],
341
+ sourceConversationId: 'import-openclaw',
342
+ userId: undefined,
343
+ });
344
+ result.memories++;
345
+ }
346
+ catch (err) {
347
+ result.errors.push(`Failed to persist memory ${mem.name}: ${err instanceof Error ? err.message : String(err)}`);
348
+ }
349
+ }
350
+ }
351
+ else {
352
+ result.memories = memories.length;
353
+ }
354
+ // Import skills
355
+ const { skills, errors: skillErrors } = await importOpenClawSkills(basePath);
356
+ result.errors.push(...skillErrors);
357
+ result.skills = skills.length;
358
+ // Extract preferences from memories
359
+ const prefMemories = memories.filter(m => m.type === 'user' || m.type === 'feedback');
360
+ result.preferences = prefMemories.length;
361
+ break;
362
+ }
363
+ case 'chatgpt': {
364
+ const filePath = options.file ?? options.path;
365
+ if (!filePath) {
366
+ result.errors.push('ChatGPT import requires --file <path> pointing to conversations.json export');
367
+ break;
368
+ }
369
+ const content = await readFile(filePath, 'utf8');
370
+ const { conversations, errors } = parseChatGPTExport(content);
371
+ result.errors.push(...errors);
372
+ result.conversations = conversations.length;
373
+ // Extract memories from conversations
374
+ const extracted = extractMemoriesFromConversations(conversations);
375
+ if (!options.dryRun) {
376
+ const { recordExperience } = await import('../../memory/experience-store.js');
377
+ for (const mem of extracted) {
378
+ try {
379
+ await recordExperience({
380
+ type: mem.type === 'user' ? 'user_preference' : 'task_solution',
381
+ intent: mem.name,
382
+ solution: { content: mem.content, importedFrom: 'chatgpt' },
383
+ successScore: 0.7,
384
+ tags: ['imported', 'chatgpt', mem.type],
385
+ sourceConversationId: 'import-chatgpt',
386
+ });
387
+ result.memories++;
388
+ }
389
+ catch {
390
+ // Skip individual failures
391
+ }
392
+ }
393
+ }
394
+ else {
395
+ result.memories = extracted.length;
396
+ }
397
+ result.preferences = extracted.filter(m => m.type === 'user').length;
398
+ break;
399
+ }
400
+ case 'aider': {
401
+ const basePath = options.path ?? process.cwd();
402
+ const { conversations, errors } = await importAiderHistory(basePath);
403
+ result.errors.push(...errors);
404
+ result.conversations = conversations.length;
405
+ // Extract solution patterns from Aider conversations
406
+ const memories = extractMemoriesFromConversations(conversations);
407
+ if (!options.dryRun) {
408
+ const { recordExperience } = await import('../../memory/experience-store.js');
409
+ for (const mem of memories) {
410
+ try {
411
+ await recordExperience({
412
+ type: 'task_solution',
413
+ intent: mem.name,
414
+ solution: { content: mem.content, importedFrom: 'aider' },
415
+ successScore: 0.7,
416
+ tags: ['imported', 'aider'],
417
+ sourceConversationId: 'import-aider',
418
+ });
419
+ result.memories++;
420
+ }
421
+ catch {
422
+ // Skip individual failures
423
+ }
424
+ }
425
+ }
426
+ else {
427
+ result.memories = memories.length;
428
+ }
429
+ break;
430
+ }
431
+ }
432
+ }
433
+ catch (error) {
434
+ result.errors.push(`Import failed: ${error instanceof Error ? error.message : String(error)}`);
435
+ }
436
+ result.duration = Date.now() - start;
437
+ log.info(`Import from ${source} complete`, {
438
+ memories: result.memories,
439
+ conversations: result.conversations,
440
+ skills: result.skills,
441
+ preferences: result.preferences,
442
+ errors: result.errors.length,
443
+ duration: result.duration,
444
+ });
445
+ return result;
446
+ }
447
+ /**
448
+ * List available import sources and their expected paths.
449
+ */
450
+ export function listImportSources() {
451
+ return [
452
+ {
453
+ source: 'openclaw',
454
+ description: 'Import memories, skills, and preferences from OpenClaw',
455
+ defaultPath: join(homedir(), '.openclaw'),
456
+ format: 'MEMORY.md + memory/*.md files',
457
+ },
458
+ {
459
+ source: 'chatgpt',
460
+ description: 'Import conversations and extract preferences from ChatGPT export',
461
+ defaultPath: 'conversations.json (from Settings > Data Controls > Export Data)',
462
+ format: 'JSON array of conversations',
463
+ },
464
+ {
465
+ source: 'aider',
466
+ description: 'Import coding session history from Aider',
467
+ defaultPath: '.aider.chat.history.md in project root',
468
+ format: 'Markdown chat history',
469
+ },
470
+ ];
471
+ }
472
+ // CLI Command
473
+ export function importCommands() {
474
+ const cmd = new Command('import')
475
+ .description('Import data from other AI assistants (OpenClaw, ChatGPT, Aider)');
476
+ cmd
477
+ .command('run')
478
+ .description('Import data from a source')
479
+ .requiredOption('--from <source>', 'Source to import from: openclaw, chatgpt, aider')
480
+ .option('--path <path>', 'Path to source data directory')
481
+ .option('--file <file>', 'Path to export file (for chatgpt)')
482
+ .option('--dry-run', 'Preview what would be imported without persisting', false)
483
+ .action(async (options) => {
484
+ const source = options.from;
485
+ if (!['openclaw', 'chatgpt', 'aider'].includes(source)) {
486
+ console.error(`Unknown source: ${source}. Use: openclaw, chatgpt, aider`);
487
+ process.exit(1);
488
+ }
489
+ console.log(`Importing from ${source}${options.dryRun ? ' (dry run)' : ''}...`);
490
+ const result = await importFrom(source, {
491
+ path: options.path,
492
+ file: options.file,
493
+ dryRun: options.dryRun,
494
+ });
495
+ console.log(`\nImport ${result.errors.length === 0 ? 'complete' : 'finished with errors'}:`);
496
+ console.log(` Memories: ${result.memories}`);
497
+ console.log(` Conversations: ${result.conversations}`);
498
+ console.log(` Skills: ${result.skills}`);
499
+ console.log(` Preferences: ${result.preferences}`);
500
+ console.log(` Duration: ${result.duration}ms`);
501
+ if (result.errors.length > 0) {
502
+ console.log(`\n Errors (${result.errors.length}):`);
503
+ for (const err of result.errors.slice(0, 5)) {
504
+ console.log(` - ${err}`);
505
+ }
506
+ if (result.errors.length > 5) {
507
+ console.log(` ... and ${result.errors.length - 5} more`);
508
+ }
509
+ }
510
+ });
511
+ cmd
512
+ .command('sources')
513
+ .description('List available import sources')
514
+ .action(() => {
515
+ const sources = listImportSources();
516
+ console.log('Available import sources:\n');
517
+ for (const s of sources) {
518
+ console.log(` ${s.source}`);
519
+ console.log(` ${s.description}`);
520
+ console.log(` Default path: ${s.defaultPath}`);
521
+ console.log(` Format: ${s.format}\n`);
522
+ }
523
+ });
524
+ return cmd;
525
+ }
526
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1,13 @@
1
+ /**
2
+ * CLI Init Command
3
+ *
4
+ * Scans the current project directory and generates a `.profclaw/context.md`
5
+ * file describing the tech stack, structure, build/test commands, and conventions.
6
+ *
7
+ * Usage:
8
+ * profclaw init # interactive (asks before overwriting)
9
+ * profclaw init --force # overwrite without prompting
10
+ */
11
+ import { Command } from 'commander';
12
+ export declare function initCommand(): Command;
13
+ //# sourceMappingURL=init.d.ts.map