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.
- package/.env.example +14 -2
- package/CHANGELOG.md +37 -0
- package/CONTRIBUTING.md +20 -0
- package/Dockerfile +39 -23
- package/README.md +174 -40
- package/dist/agents/agent-summary.d.ts +44 -0
- package/dist/agents/agent-summary.js +176 -0
- package/dist/agents/auto-memory.d.ts +59 -0
- package/dist/agents/auto-memory.js +310 -0
- package/dist/agents/checkpoint-manager.d.ts +76 -0
- package/dist/agents/checkpoint-manager.js +156 -0
- package/dist/agents/circuit-breaker.d.ts +54 -0
- package/dist/agents/circuit-breaker.js +153 -0
- package/dist/agents/context-compactor.d.ts +70 -0
- package/dist/agents/context-compactor.js +361 -0
- package/dist/agents/conversation-branch.d.ts +55 -0
- package/dist/agents/conversation-branch.js +115 -0
- package/dist/agents/error-recovery.d.ts +44 -0
- package/dist/agents/error-recovery.js +197 -0
- package/dist/agents/events.d.ts +76 -0
- package/dist/agents/events.js +8 -0
- package/dist/agents/executor.d.ts +35 -1
- package/dist/agents/executor.js +573 -124
- package/dist/agents/file-snapshots.d.ts +72 -0
- package/dist/agents/file-snapshots.js +182 -0
- package/dist/agents/index.d.ts +2 -0
- package/dist/agents/orchestrator.d.ts +183 -0
- package/dist/agents/orchestrator.js +495 -0
- package/dist/agents/permissions.d.ts +63 -0
- package/dist/agents/permissions.js +138 -0
- package/dist/agents/plan-mode.d.ts +71 -0
- package/dist/agents/plan-mode.js +186 -0
- package/dist/agents/prompt-suggestions.d.ts +33 -0
- package/dist/agents/prompt-suggestions.js +208 -0
- package/dist/agents/rate-limit-monitor.d.ts +56 -0
- package/dist/agents/rate-limit-monitor.js +224 -0
- package/dist/agents/result-store.d.ts +37 -0
- package/dist/agents/result-store.js +104 -0
- package/dist/agents/session-diff.d.ts +43 -0
- package/dist/agents/session-diff.js +258 -0
- package/dist/agents/tool-loader.d.ts +65 -0
- package/dist/agents/tool-loader.js +273 -0
- package/dist/agents/transcript.d.ts +96 -0
- package/dist/agents/transcript.js +267 -0
- package/dist/agents/worktree-manager.d.ts +80 -0
- package/dist/agents/worktree-manager.js +203 -0
- package/dist/auth/middleware.js +14 -0
- package/dist/chat/agentic-executor.d.ts +7 -0
- package/dist/chat/agentic-executor.js +253 -30
- package/dist/chat/conversations.d.ts +2 -0
- package/dist/chat/conversations.js +8 -0
- package/dist/chat/execution/executor.d.ts +8 -0
- package/dist/chat/execution/executor.js +157 -103
- package/dist/chat/execution/index.js +5 -1
- package/dist/chat/execution/tool-router.js +40 -14
- package/dist/chat/execution/tools/canvas.d.ts +2 -2
- package/dist/chat/execution/tools/code-tools.d.ts +66 -0
- package/dist/chat/execution/tools/code-tools.js +353 -0
- package/dist/chat/execution/tools/complete-task.d.ts +2 -2
- package/dist/chat/execution/tools/cron-tool.d.ts +26 -10
- package/dist/chat/execution/tools/cron-tool.js +48 -3
- package/dist/chat/execution/tools/decompose-task.d.ts +58 -0
- package/dist/chat/execution/tools/decompose-task.js +166 -0
- package/dist/chat/execution/tools/exec.d.ts +5 -2
- package/dist/chat/execution/tools/exec.js +294 -155
- package/dist/chat/execution/tools/feed-tools.d.ts +77 -0
- package/dist/chat/execution/tools/feed-tools.js +142 -0
- package/dist/chat/execution/tools/file-ops.d.ts +1 -1
- package/dist/chat/execution/tools/github.d.ts +2 -2
- package/dist/chat/execution/tools/index.d.ts +14 -2
- package/dist/chat/execution/tools/index.js +86 -12
- package/dist/chat/execution/tools/integrations.d.ts +8 -8
- package/dist/chat/execution/tools/multi-patch.d.ts +53 -0
- package/dist/chat/execution/tools/multi-patch.js +373 -0
- package/dist/chat/execution/tools/openai-image-gen.d.ts +2 -2
- package/dist/chat/execution/tools/plan-tools.d.ts +80 -0
- package/dist/chat/execution/tools/plan-tools.js +134 -0
- package/dist/chat/execution/tools/profclaw-ops.d.ts +6 -6
- package/dist/chat/execution/tools/repl-tool.d.ts +46 -0
- package/dist/chat/execution/tools/repl-tool.js +207 -0
- package/dist/chat/execution/tools/sessions-send.d.ts +2 -2
- package/dist/chat/execution/tools/slack-actions.d.ts +2 -2
- package/dist/chat/execution/tools/system.d.ts +4 -4
- package/dist/chat/execution/tools/todo-tool.d.ts +72 -0
- package/dist/chat/execution/tools/todo-tool.js +152 -0
- package/dist/chat/execution/tools/tool-search.d.ts +50 -0
- package/dist/chat/execution/tools/tool-search.js +155 -0
- package/dist/chat/execution/types.d.ts +21 -14
- package/dist/chat/execution/workflows/executor.d.ts +11 -0
- package/dist/chat/execution/workflows/executor.js +99 -1
- package/dist/chat/execution/workflows/types.d.ts +35 -2
- package/dist/chat/format/index.d.ts +1 -0
- package/dist/chat/format/index.js +1 -0
- package/dist/chat/format/markdown-convert.d.ts +23 -0
- package/dist/chat/format/markdown-convert.js +149 -0
- package/dist/chat/index.d.ts +1 -1
- package/dist/chat/index.js +1 -1
- package/dist/chat/message-handler.js +58 -6
- package/dist/chat/proactive/index.d.ts +62 -0
- package/dist/chat/proactive/index.js +147 -0
- package/dist/chat/prompt-adapter.js +2 -0
- package/dist/chat/providers/irc/index.d.ts +2 -2
- package/dist/chat/providers/telegram/index.d.ts +2 -0
- package/dist/chat/providers/telegram/index.js +21 -2
- package/dist/chat/system-prompts.d.ts +3 -3
- package/dist/chat/system-prompts.js +116 -61
- package/dist/chat/tools.d.ts +6 -6
- package/dist/cli/commands/auth.js +64 -1
- package/dist/cli/commands/chat.js +1327 -138
- package/dist/cli/commands/doctor.js +222 -16
- package/dist/cli/commands/history.d.ts +3 -0
- package/dist/cli/commands/history.js +138 -0
- package/dist/cli/commands/import.d.ts +44 -0
- package/dist/cli/commands/import.js +526 -0
- package/dist/cli/commands/init.d.ts +13 -0
- package/dist/cli/commands/init.js +381 -0
- package/dist/cli/commands/onboard.js +210 -30
- package/dist/cli/commands/plan.d.ts +13 -0
- package/dist/cli/commands/plan.js +184 -0
- package/dist/cli/commands/serve.d.ts +7 -0
- package/dist/cli/commands/serve.js +77 -18
- package/dist/cli/commands/setup.js +84 -3
- package/dist/cli/commands/status.js +54 -0
- package/dist/cli/commands/tools.js +13 -13
- package/dist/cli/commands/tui.js +26 -1
- package/dist/cli/index.js +19 -0
- package/dist/cli/ink/App.d.ts +13 -0
- package/dist/cli/ink/App.js +6 -0
- package/dist/cli/ink/ChatApp.d.ts +60 -0
- package/dist/cli/ink/ChatApp.js +325 -0
- package/dist/cli/ink/DashboardApp.d.ts +3 -0
- package/dist/cli/ink/DashboardApp.js +143 -0
- package/dist/cli/ink/components/AgentStatus.d.ts +17 -0
- package/dist/cli/ink/components/AgentStatus.js +33 -0
- package/dist/cli/ink/components/ChannelList.d.ts +17 -0
- package/dist/cli/ink/components/ChannelList.js +33 -0
- package/dist/cli/ink/components/ConnectionStatus.d.ts +19 -0
- package/dist/cli/ink/components/ConnectionStatus.js +50 -0
- package/dist/cli/ink/components/CostBar.d.ts +19 -0
- package/dist/cli/ink/components/CostBar.js +35 -0
- package/dist/cli/ink/components/HookStatus.d.ts +15 -0
- package/dist/cli/ink/components/HookStatus.js +7 -0
- package/dist/cli/ink/components/PermissionPrompt.d.ts +21 -0
- package/dist/cli/ink/components/PermissionPrompt.js +51 -0
- package/dist/cli/ink/components/PlanView.d.ts +23 -0
- package/dist/cli/ink/components/PlanView.js +26 -0
- package/dist/cli/ink/components/ProviderList.d.ts +16 -0
- package/dist/cli/ink/components/ProviderList.js +16 -0
- package/dist/cli/ink/components/SessionHeader.d.ts +15 -0
- package/dist/cli/ink/components/SessionHeader.js +15 -0
- package/dist/cli/ink/components/StreamingMessage.d.ts +20 -0
- package/dist/cli/ink/components/StreamingMessage.js +27 -0
- package/dist/cli/ink/components/SuggestionBar.d.ts +15 -0
- package/dist/cli/ink/components/SuggestionBar.js +28 -0
- package/dist/cli/ink/components/SystemHealth.d.ts +20 -0
- package/dist/cli/ink/components/SystemHealth.js +39 -0
- package/dist/cli/ink/components/TaskList.d.ts +17 -0
- package/dist/cli/ink/components/TaskList.js +59 -0
- package/dist/cli/ink/components/ToolCall.d.ts +17 -0
- package/dist/cli/ink/components/ToolCall.js +43 -0
- package/dist/cli/ink/index.d.ts +23 -0
- package/dist/cli/ink/index.js +15 -0
- package/dist/cli/ink/keybindings.d.ts +35 -0
- package/dist/cli/ink/keybindings.js +105 -0
- package/dist/cli/ink/markdown-renderer.d.ts +47 -0
- package/dist/cli/ink/markdown-renderer.js +380 -0
- package/dist/cli/ink/output-styles.d.ts +39 -0
- package/dist/cli/ink/output-styles.js +119 -0
- package/dist/cli/interactive/auto-serve.d.ts +38 -0
- package/dist/cli/interactive/auto-serve.js +209 -0
- package/dist/cli/interactive/index.d.ts +25 -0
- package/dist/cli/interactive/index.js +23 -0
- package/dist/cli/interactive/picker.d.ts +28 -0
- package/dist/cli/interactive/picker.js +153 -0
- package/dist/cli/interactive/renderer.d.ts +26 -0
- package/dist/cli/interactive/renderer.js +555 -0
- package/dist/cli/interactive/repl.d.ts +14 -0
- package/dist/cli/interactive/repl.js +1516 -0
- package/dist/cli/interactive/stream-client.d.ts +59 -0
- package/dist/cli/interactive/stream-client.js +506 -0
- package/dist/cli/interactive/types.d.ts +121 -0
- package/dist/cli/interactive/types.js +10 -0
- package/dist/cli/utils/api.d.ts +9 -0
- package/dist/cli/utils/api.js +58 -2
- package/dist/cron/natural-language.d.ts +54 -0
- package/dist/cron/natural-language.js +569 -0
- package/dist/cron/scheduler.d.ts +34 -4
- package/dist/cron/scheduler.js +141 -9
- package/dist/cron/templates.d.ts +1 -1
- package/dist/cron/templates.js +219 -0
- package/dist/feeds/feed-engine.d.ts +149 -0
- package/dist/feeds/feed-engine.js +600 -0
- package/dist/feeds/index.d.ts +9 -0
- package/dist/feeds/index.js +8 -0
- package/dist/gateway/router.js +6 -1
- package/dist/hooks/built-in/audit-log.d.ts +11 -0
- package/dist/hooks/built-in/audit-log.js +84 -0
- package/dist/hooks/built-in/cost-warning.d.ts +10 -0
- package/dist/hooks/built-in/cost-warning.js +59 -0
- package/dist/hooks/built-in/dangerous-tool.d.ts +32 -0
- package/dist/hooks/built-in/dangerous-tool.js +80 -0
- package/dist/hooks/built-in/index.d.ts +14 -0
- package/dist/hooks/built-in/index.js +20 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.js +6 -0
- package/dist/hooks/loader.d.ts +17 -0
- package/dist/hooks/loader.js +142 -0
- package/dist/hooks/registry.d.ts +62 -0
- package/dist/hooks/registry.js +127 -0
- package/dist/integrations/web-search.js +6 -3
- package/dist/memory/index.d.ts +1 -0
- package/dist/memory/index.js +2 -0
- package/dist/memory/memory-service.js +14 -13
- package/dist/memory/observational.d.ts +62 -0
- package/dist/memory/observational.js +396 -0
- package/dist/middleware/content-filter.d.ts +22 -0
- package/dist/middleware/content-filter.js +69 -0
- package/dist/middleware/request-validator.d.ts +159 -0
- package/dist/middleware/request-validator.js +93 -0
- package/dist/plugins/sdk.d.ts +22 -0
- package/dist/plugins/sdk.js +17 -1
- package/dist/projects/types.d.ts +10 -10
- package/dist/providers/ai-sdk.d.ts +11 -0
- package/dist/providers/ai-sdk.js +78 -19
- package/dist/providers/core/models.js +67 -1
- package/dist/providers/core/types.d.ts +3 -0
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.js +1 -0
- package/dist/providers/smart-router.d.ts +118 -0
- package/dist/providers/smart-router.js +685 -0
- package/dist/providers/types.d.ts +16 -16
- package/dist/routes/agents.js +50 -0
- package/dist/routes/auth.js +8 -1
- package/dist/routes/chat.js +259 -14
- package/dist/routes/costs.js +32 -0
- package/dist/routes/cron.js +80 -5
- package/dist/routes/feeds.d.ts +10 -0
- package/dist/routes/feeds.js +168 -0
- package/dist/routes/mcp.js +21 -0
- package/dist/routes/memory.js +130 -0
- package/dist/routes/skills.js +129 -0
- package/dist/routes/teams.d.ts +9 -0
- package/dist/routes/teams.js +210 -0
- package/dist/routes/tools.js +14 -0
- package/dist/routes/users.js +2 -0
- package/dist/server/route-loader.js +3 -1
- package/dist/server/stream-bridge.d.ts +19 -0
- package/dist/server/stream-bridge.js +38 -0
- package/dist/server.js +310 -36
- package/dist/skills/marketplace.d.ts +87 -0
- package/dist/skills/marketplace.js +268 -0
- package/dist/storage/index.d.ts +14 -0
- package/dist/storage/index.js +64 -3
- package/dist/storage/schema.d.ts +4 -4
- package/dist/storage/schema.js +1 -1
- package/dist/teams/index.d.ts +110 -0
- package/dist/teams/index.js +365 -0
- package/dist/tickets/types.d.ts +39 -39
- package/dist/types/summary.d.ts +5 -5
- package/dist/utils/auto-update.d.ts +23 -0
- package/dist/utils/auto-update.js +157 -0
- package/dist/utils/offline-detect.d.ts +55 -0
- package/dist/utils/offline-detect.js +121 -0
- package/dist/utils/pid-file.d.ts +36 -0
- package/dist/utils/pid-file.js +125 -0
- package/dist/utils/prevent-sleep.d.ts +27 -0
- package/dist/utils/prevent-sleep.js +95 -0
- package/dist/utils/sanitizer.d.ts +57 -0
- package/dist/utils/sanitizer.js +174 -0
- package/docker-compose.yml +13 -137
- package/package.json +31 -6
- package/skills/deploy-cloudflare/SKILL.md +62 -0
- package/skills/deploy-vercel/SKILL.md +67 -0
- package/skills/docker-deploy/SKILL.md +158 -0
- package/skills/full-stack-builder/SKILL.md +92 -0
- package/skills/humanizer/SKILL.md +488 -0
- package/skills/profclaw-assistant/SKILL.md +85 -56
- package/ui/dist/assets/ActivityView-Da6HQ8ws.js +1 -0
- package/ui/dist/assets/AgentList-H58R0kX3.js +1 -0
- package/ui/dist/assets/AnalyticsDashboard-B28AeRsc.js +1 -0
- package/ui/dist/assets/AreaChart-DwLzeAQ8.js +1 -0
- package/ui/dist/assets/CartesianChart-piKQsTAR.js +36 -0
- package/ui/dist/assets/ChatView-Dbj8rxU5.js +10 -0
- package/ui/dist/assets/CostsDashboard-C6F5df0F.js +1 -0
- package/ui/dist/assets/EstimateSelect-wga0rUKX.js +1 -0
- package/ui/dist/assets/FeedDashboard-Ef6FEzEf.js +1 -0
- package/ui/dist/assets/FloatingChatbot-0yhkUeCq.js +2 -0
- package/ui/dist/assets/InviteCodeManagement-tUXfx4Bc.js +2 -0
- package/ui/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/ui/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/ui/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/ui/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/ui/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/ui/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/ui/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/ui/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/ui/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/ui/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/ui/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/ui/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/ui/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/ui/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/ui/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/ui/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/ui/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/ui/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/ui/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/ui/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/ui/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/ui/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/ui/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/ui/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/ui/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/ui/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/ui/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/ui/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/ui/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/ui/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/ui/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/ui/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/ui/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/ui/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/ui/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/ui/dist/assets/MarketplacePage-DGrLtolR.js +1 -0
- package/ui/dist/assets/{ProjectDetail--gPfvATB.js → ProjectDetail-BgWvA6UP.js} +2 -2
- package/ui/dist/assets/ProjectIcon-TDuliqwg.js +1 -0
- package/ui/dist/assets/ProjectList-DXgM4187.js +1 -0
- package/ui/dist/assets/{Settings-1kaf7VHE.js → Settings-xA8Zhi3p.js} +3 -3
- package/ui/dist/assets/StatusIndicator-B8vfFAxg.js +1 -0
- package/ui/dist/assets/{SummaryDetail-DV3AmONk.js → SummaryDetail-eedRfTtF.js} +2 -2
- package/ui/dist/assets/SummaryList-CLNX2P84.js +1 -0
- package/ui/dist/assets/TaskDetail-BtWclNiR.js +1 -0
- package/ui/dist/assets/TaskList-JjODAgSc.js +1 -0
- package/ui/dist/assets/TeamsPage-CBK5iAyx.js +1 -0
- package/ui/dist/assets/TicketBoard-C9aJNNYp.js +1 -0
- package/ui/dist/assets/TicketDetail-CV5JmL31.js +1 -0
- package/ui/dist/assets/TicketList-68V4lzUz.js +1 -0
- package/ui/dist/assets/UserManagement-DKTb6UpE.js +2 -0
- package/ui/dist/assets/ViewSwitcher-BvdQht2Y.js +1 -0
- package/ui/dist/assets/alert-dialog-O6qBOv_f.js +1 -0
- package/ui/dist/assets/{archive-BsLa7brF.js → archive-CX7UvZpf.js} +1 -1
- package/ui/dist/assets/badge-BbfnwDJP.js +1 -0
- package/ui/dist/assets/{bug-CmZI7jqM.js → bug-3WX0394-.js} +1 -1
- package/ui/dist/assets/{calendar-Bf0t2B82.js → calendar-buq77TaS.js} +1 -1
- package/ui/dist/assets/{chevron-up-CoUsOvZj.js → chevron-up-4ymsBJRo.js} +1 -1
- package/ui/dist/assets/{circle-x-Dgw11LgT.js → circle-x-ByXtwR6Y.js} +1 -1
- package/ui/dist/assets/constants-CVdDh7p0.js +1 -0
- package/ui/dist/assets/{cpu-DiPMQICV.js → cpu-CiuoCeDY.js} +1 -1
- package/ui/dist/assets/{database-BwTfupDi.js → database-BWXSBg5a.js} +1 -1
- package/ui/dist/assets/dialog-lDg4NvMV.js +1 -0
- package/ui/dist/assets/dollar-sign-Dmijd6DP.js +1 -0
- package/ui/dist/assets/{ellipsis-UJx4Xnf6.js → ellipsis-vT-5SVIp.js} +1 -1
- package/ui/dist/assets/{ellipsis-vertical-DoULYEKn.js → ellipsis-vertical-B4tAX_bL.js} +1 -1
- package/ui/dist/assets/feature-markdown-DBo5Q7uq.js +289 -0
- package/ui/dist/assets/{file-code-B2UrJLwi.js → file-code-ChOWdKXf.js} +1 -1
- package/ui/dist/assets/{folder-open-BJi577JH.js → folder-open-CkOUbIiP.js} +1 -1
- package/ui/dist/assets/{funnel-PkaD_HSR.js → funnel-uZkoSPP-.js} +1 -1
- package/ui/dist/assets/{git-branch-C_K30am0.js → git-branch-CwvUxj7C.js} +1 -1
- package/ui/dist/assets/{git-commit-horizontal-IT6ecxWQ.js → git-commit-horizontal-lxPzCvhD.js} +1 -1
- package/ui/dist/assets/{globe-f-jjCa_g.js → globe-D_WpJdsj.js} +1 -1
- package/ui/dist/assets/{hash-DNEv8Elo.js → hash-CA0hJ7vh.js} +1 -1
- package/ui/dist/assets/{history-BQSBo_1Q.js → history-CEWMLELs.js} +1 -1
- package/ui/dist/assets/inbox-ehtOptTV.js +1 -0
- package/ui/dist/assets/{index-nS3EErDg.js → index-C1rhbml4.js} +3 -3
- package/ui/dist/assets/index-CR8gfCHv.js +1 -0
- package/ui/dist/assets/index-DVXMpWai.js +1 -0
- package/ui/dist/assets/index-DaDJMM2v.js +1 -0
- package/ui/dist/assets/index-Djdq_0xu.js +1 -0
- package/ui/dist/assets/index-M46Gcb8K.css +1 -0
- package/ui/dist/assets/index-sEBN7w8J.js +109 -0
- package/ui/dist/assets/layers-C6Mhf8Nk.js +1 -0
- package/ui/dist/assets/{layout-dashboard-CcKt1hXw.js → layout-dashboard-BRUM0kpT.js} +1 -1
- package/ui/dist/assets/{lightbulb-Jhp7FvbU.js → lightbulb-CN2q1O5l.js} +1 -1
- package/ui/dist/assets/{link-2-DdO7ostF.js → link-2-CC4E28yJ.js} +1 -1
- package/ui/dist/assets/markdown-renderer-C6ENbB0u.js +10 -0
- package/ui/dist/assets/markdown-renderer-CfVKi3_s.css +1 -0
- package/ui/dist/assets/{message-square-CBgH65X7.js → message-square-Bbb241am.js} +1 -1
- package/ui/dist/assets/package-CwT3IzFx.js +1 -0
- package/ui/dist/assets/{pencil-CYXCEPQh.js → pencil-CDmiHzoj.js} +1 -1
- package/ui/dist/assets/{play-d1ONaH0-.js → play-tjy5jMQX.js} +1 -1
- package/ui/dist/assets/popover-CFHZf3pE.js +1 -0
- package/ui/dist/assets/progress-BboUHuLf.js +1 -0
- package/ui/dist/assets/{rocket-DhvUetsk.js → rocket--8ZHgdXJ.js} +1 -1
- package/ui/dist/assets/select-n108rXny.js +1 -0
- package/ui/dist/assets/{send-P0r5D7td.js → send-Cu7MR2Qh.js} +1 -1
- package/ui/dist/assets/server-DmodxZp-.js +1 -0
- package/ui/dist/assets/{settings-2-ocj5uHGx.js → settings-2-CkRNqkxj.js} +1 -1
- package/ui/dist/assets/sheet-7aUJkyzU.js +1 -0
- package/ui/dist/assets/{shield-check-DfVdE34l.js → shield-check-ViI3nMKE.js} +1 -1
- package/ui/dist/assets/{shield-off-8l0J6R-8.js → shield-off-DN3tagkn.js} +1 -1
- package/ui/dist/assets/skeleton-C0E1Nfro.js +1 -0
- package/ui/dist/assets/{smartphone-77_g3SQn.js → smartphone-5FghiXpA.js} +1 -1
- package/ui/dist/assets/{square-Ckzsr3Rn.js → square-DiNSx8K7.js} +1 -1
- package/ui/dist/assets/star-DhdFVidS.js +1 -0
- package/ui/dist/assets/switch-CIgVbZqQ.js +1 -0
- package/ui/dist/assets/table-BC56FVMV.js +1 -0
- package/ui/dist/assets/{tag-C35mgoEv.js → tag-CH_vQliw.js} +1 -1
- package/ui/dist/assets/textarea-CxDiKFXZ.js +1 -0
- package/ui/dist/assets/{timer-DHJBS2w1.js → timer-CdGVTb60.js} +1 -1
- package/ui/dist/assets/tooltip-BuW9A5UO.js +1 -0
- package/ui/dist/assets/{trash-2-keO5tKPE.js → trash-2-CucZJL0N.js} +1 -1
- package/ui/dist/assets/trending-down-BCezC1z2.js +1 -0
- package/ui/dist/assets/{trending-up-BBv8KbrY.js → trending-up-C5OYX2k2.js} +1 -1
- package/ui/dist/assets/vendor-query-C0p7b53x.js +4 -0
- package/ui/dist/assets/vendor-react-Mc5_kfYG.js +12 -0
- package/ui/dist/assets/vendor-ui-CXPAUBFv.js +51 -0
- package/ui/dist/assets/{wand-sparkles-BusQ52ZK.js → wand-sparkles-BaH6pJnc.js} +1 -1
- package/ui/dist/assets/{wrench-02YaOSiK.js → wrench-CjxjP6ok.js} +1 -1
- package/ui/dist/index.html +5 -2
- package/ui/dist/assets/ActivityView-BeshZXmE.js +0 -1
- package/ui/dist/assets/AgentList-QVHeldPi.js +0 -1
- package/ui/dist/assets/AnalyticsDashboard-C9R97dXE.js +0 -1
- package/ui/dist/assets/AreaChart-B73gaiVQ.js +0 -1
- package/ui/dist/assets/CartesianChart-CXYL2R-A.js +0 -36
- package/ui/dist/assets/ChatView-qjZErlrp.js +0 -10
- package/ui/dist/assets/CostsDashboard-O4DCLy1i.js +0 -1
- package/ui/dist/assets/EstimateSelect-1hQf4Osk.js +0 -1
- package/ui/dist/assets/FloatingChatbot-BZBzrJxd.js +0 -2
- package/ui/dist/assets/InviteCodeManagement-LEoGqYeA.js +0 -2
- package/ui/dist/assets/ProjectIcon-Chd_ofsw.js +0 -1
- package/ui/dist/assets/ProjectList-BvUfVB6c.js +0 -4
- package/ui/dist/assets/StatusIndicator-pRfkNcdV.js +0 -1
- package/ui/dist/assets/SummaryList-B6kXiTxL.js +0 -1
- package/ui/dist/assets/TaskDetail-CV6CzbOS.js +0 -1
- package/ui/dist/assets/TaskList-DL7brQKd.js +0 -1
- package/ui/dist/assets/TicketBoard-CrkkFj7C.js +0 -1
- package/ui/dist/assets/TicketDetail-hnnYclpD.js +0 -1
- package/ui/dist/assets/TicketList-CsDAyQCL.js +0 -1
- package/ui/dist/assets/UserManagement-BGFQyTSr.js +0 -2
- package/ui/dist/assets/ViewSwitcher-CnL0OqA8.js +0 -1
- package/ui/dist/assets/alert-dialog-SKM6Gjz4.js +0 -7
- package/ui/dist/assets/badge-CVHH1a-v.js +0 -1
- package/ui/dist/assets/brain-6o_RHVpe.js +0 -1
- package/ui/dist/assets/constants-Q5Zivl-a.js +0 -1
- package/ui/dist/assets/dialog-BUqN9Psj.js +0 -1
- package/ui/dist/assets/index-BUmnwPQr.js +0 -1
- package/ui/dist/assets/index-BfF5G4Cw.js +0 -1
- package/ui/dist/assets/index-C8N375c2.js +0 -1
- package/ui/dist/assets/index-CuxnqVVz.css +0 -1
- package/ui/dist/assets/index-CzMM3QOk.js +0 -1
- package/ui/dist/assets/index-lJlNPFVJ.js +0 -67
- package/ui/dist/assets/layers-jFqVrWMD.js +0 -1
- package/ui/dist/assets/markdown-renderer-n1ToC4XQ.js +0 -36
- package/ui/dist/assets/popover-CrmZgoWu.js +0 -1
- package/ui/dist/assets/progress-uv4SPkL5.js +0 -1
- package/ui/dist/assets/select-CeQ8AHGy.js +0 -1
- package/ui/dist/assets/server-CVHTZB72.js +0 -1
- package/ui/dist/assets/sheet-DuQExSho.js +0 -1
- package/ui/dist/assets/skeleton-TFiFJ3nB.js +0 -1
- package/ui/dist/assets/switch-CAePkd6k.js +0 -1
- package/ui/dist/assets/table-ZjAZ7hkt.js +0 -1
- package/ui/dist/assets/textarea-DsVPnSgR.js +0 -1
- 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
|