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
|
@@ -1,24 +1,33 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import * as os from 'os';
|
|
4
|
-
import { existsSync } from 'node:fs';
|
|
4
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
5
5
|
import { join } from 'node:path';
|
|
6
6
|
import { execFile } from 'node:child_process';
|
|
7
7
|
import { promisify } from 'node:util';
|
|
8
8
|
import { api } from '../utils/api.js';
|
|
9
9
|
import { success, error, info, spinner } from '../utils/output.js';
|
|
10
|
+
import { isServerRunning } from '../../utils/pid-file.js';
|
|
10
11
|
const execFileAsync = promisify(execFile);
|
|
11
12
|
async function checkNode() {
|
|
12
13
|
const version = process.version;
|
|
13
14
|
const major = parseInt(version.slice(1).split('.')[0], 10);
|
|
14
|
-
if (major >=
|
|
15
|
-
return { name: 'Node.js', status: 'pass', message: `${version}` };
|
|
15
|
+
if (major >= 20) {
|
|
16
|
+
return { name: 'Node.js', status: 'pass', message: `${version} (>= 18 required)` };
|
|
17
|
+
}
|
|
18
|
+
if (major >= 18) {
|
|
19
|
+
return {
|
|
20
|
+
name: 'Node.js',
|
|
21
|
+
status: 'warn',
|
|
22
|
+
message: `${version} (>= 20 recommended for best performance)`,
|
|
23
|
+
fix: 'nvm install 20',
|
|
24
|
+
};
|
|
16
25
|
}
|
|
17
26
|
return {
|
|
18
27
|
name: 'Node.js',
|
|
19
28
|
status: 'fail',
|
|
20
|
-
message: `${version} (requires >=
|
|
21
|
-
fix: 'nvm install
|
|
29
|
+
message: `${version} (requires >= 18)`,
|
|
30
|
+
fix: 'nvm install 20',
|
|
22
31
|
};
|
|
23
32
|
}
|
|
24
33
|
async function checkRedis() {
|
|
@@ -203,6 +212,173 @@ async function checkDiskSpace() {
|
|
|
203
212
|
return { name: 'Disk', status: 'warn', message: 'Could not check disk space' };
|
|
204
213
|
}
|
|
205
214
|
}
|
|
215
|
+
async function checkDatabaseIntegrity() {
|
|
216
|
+
const result = await api.get('/api/setup/db-integrity');
|
|
217
|
+
if (!result.ok) {
|
|
218
|
+
// Try a direct PRAGMA if server is unavailable
|
|
219
|
+
try {
|
|
220
|
+
const { existsSync: fsExists } = await import('node:fs');
|
|
221
|
+
const dbPath = join(process.cwd(), '.profclaw', 'profclaw.db');
|
|
222
|
+
if (!fsExists(dbPath)) {
|
|
223
|
+
return { name: 'DB Integrity', status: 'warn', message: 'Database file not found (server may not have run yet)' };
|
|
224
|
+
}
|
|
225
|
+
// Dynamically attempt SQLite integrity check (optional dep)
|
|
226
|
+
const betterSqlite3 = 'better-sqlite3';
|
|
227
|
+
const { default: Database } = await import(/* @vite-ignore */ betterSqlite3);
|
|
228
|
+
const db = new Database(dbPath, { readonly: true });
|
|
229
|
+
const row = db.prepare('PRAGMA integrity_check').get();
|
|
230
|
+
db.close();
|
|
231
|
+
const integrity = row?.integrity_check ?? 'unknown';
|
|
232
|
+
if (integrity === 'ok') {
|
|
233
|
+
return { name: 'DB Integrity', status: 'pass', message: 'ok' };
|
|
234
|
+
}
|
|
235
|
+
return { name: 'DB Integrity', status: 'fail', message: integrity, fix: 'Backup and recreate the database' };
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
return { name: 'DB Integrity', status: 'warn', message: 'Cannot check (server not running, SQLite unavailable)' };
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
const integrity = result.data?.integrity ?? 'ok';
|
|
242
|
+
if (integrity === 'ok') {
|
|
243
|
+
return { name: 'DB Integrity', status: 'pass', message: 'ok' };
|
|
244
|
+
}
|
|
245
|
+
return { name: 'DB Integrity', status: 'fail', message: integrity, fix: 'Backup and recreate the database' };
|
|
246
|
+
}
|
|
247
|
+
async function checkApiKeyValidation() {
|
|
248
|
+
const result = await api.get('/api/chat/providers');
|
|
249
|
+
if (!result.ok) {
|
|
250
|
+
return [{ name: 'API Keys', status: 'warn', message: 'Cannot check (server not running)', fix: 'profclaw serve' }];
|
|
251
|
+
}
|
|
252
|
+
const configured = result.data?.providers?.filter((p) => p.enabled) ?? [];
|
|
253
|
+
if (configured.length === 0) {
|
|
254
|
+
return [{ name: 'API Keys', status: 'fail', message: 'No AI providers configured', fix: 'profclaw provider add anthropic' }];
|
|
255
|
+
}
|
|
256
|
+
return configured.map((p) => {
|
|
257
|
+
const label = p.type.charAt(0).toUpperCase() + p.type.slice(1);
|
|
258
|
+
if (p.healthy) {
|
|
259
|
+
return { name: label, status: 'pass', message: 'configured' };
|
|
260
|
+
}
|
|
261
|
+
return { name: label, status: 'warn', message: `configured but unreachable${p.message ? ` (${p.message})` : ''}` };
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
async function checkPortAvailability() {
|
|
265
|
+
const port = parseInt(process.env.PORT || '3000', 10);
|
|
266
|
+
const net = await import('net');
|
|
267
|
+
return new Promise((resolve) => {
|
|
268
|
+
const server = net.createServer();
|
|
269
|
+
server.once('error', (err) => {
|
|
270
|
+
if (err.code === 'EADDRINUSE') {
|
|
271
|
+
resolve({ name: 'Port availability', status: 'pass', message: `Port ${port} in use (server likely running)` });
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
resolve({ name: 'Port availability', status: 'warn', message: `Port ${port}: ${err.message}` });
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
server.once('listening', () => {
|
|
278
|
+
server.close();
|
|
279
|
+
resolve({ name: 'Port availability', status: 'pass', message: `Port ${port} available` });
|
|
280
|
+
});
|
|
281
|
+
server.listen(port, '127.0.0.1');
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
async function checkMissingDependencies() {
|
|
285
|
+
const required = ['ink', 'react', 'chalk', 'commander'];
|
|
286
|
+
const missing = [];
|
|
287
|
+
for (const dep of required) {
|
|
288
|
+
try {
|
|
289
|
+
await import(dep);
|
|
290
|
+
}
|
|
291
|
+
catch {
|
|
292
|
+
missing.push(dep);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
if (missing.length === 0) {
|
|
296
|
+
return { name: 'Dependencies', status: 'pass', message: `${required.length} required packages present` };
|
|
297
|
+
}
|
|
298
|
+
return {
|
|
299
|
+
name: 'Dependencies',
|
|
300
|
+
status: 'fail',
|
|
301
|
+
message: `Missing: ${missing.join(', ')}`,
|
|
302
|
+
fix: `npm install ${missing.join(' ')}`,
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
async function checkConfigFileValidity() {
|
|
306
|
+
const cwd = process.cwd();
|
|
307
|
+
const errors = [];
|
|
308
|
+
const configJsonPath = join(cwd, '.profclaw', 'config.json');
|
|
309
|
+
if (existsSync(configJsonPath)) {
|
|
310
|
+
try {
|
|
311
|
+
JSON.parse(readFileSync(configJsonPath, 'utf-8'));
|
|
312
|
+
}
|
|
313
|
+
catch {
|
|
314
|
+
errors.push('config.json: invalid JSON');
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
// settings.yml validation — check it parses as basic YAML (key: value lines, no tabs)
|
|
318
|
+
const settingsYmlPath = join(cwd, 'config', 'settings.yml');
|
|
319
|
+
if (existsSync(settingsYmlPath)) {
|
|
320
|
+
try {
|
|
321
|
+
const content = readFileSync(settingsYmlPath, 'utf-8');
|
|
322
|
+
if (content.includes('\t')) {
|
|
323
|
+
errors.push('settings.yml: contains tab characters (YAML requires spaces)');
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
catch {
|
|
327
|
+
errors.push('settings.yml: unreadable');
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
if (errors.length > 0) {
|
|
331
|
+
return {
|
|
332
|
+
name: 'Config files',
|
|
333
|
+
status: 'fail',
|
|
334
|
+
message: errors.join('; '),
|
|
335
|
+
fix: 'Fix the reported config files',
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
return { name: 'Config files', status: 'pass', message: 'valid' };
|
|
339
|
+
}
|
|
340
|
+
async function checkPidFileStatus() {
|
|
341
|
+
const status = isServerRunning();
|
|
342
|
+
if (status.running) {
|
|
343
|
+
return {
|
|
344
|
+
name: 'PID file',
|
|
345
|
+
status: 'pass',
|
|
346
|
+
message: `Server running (PID ${status.pid}, port ${status.port})`,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
// Check if a stale PID file was present (isServerRunning cleans it up automatically)
|
|
350
|
+
return { name: 'PID file', status: 'pass', message: 'No server process found' };
|
|
351
|
+
}
|
|
352
|
+
async function checkDiskSpaceBytes() {
|
|
353
|
+
// macOS / Linux: use `df -k` to get kibibyte blocks for a numeric threshold check
|
|
354
|
+
try {
|
|
355
|
+
const { stdout } = await execFileAsync('df', ['-k', process.cwd()], { timeout: 5000 });
|
|
356
|
+
const lines = stdout.trim().split('\n');
|
|
357
|
+
if (lines.length >= 2) {
|
|
358
|
+
const parts = lines[1].split(/\s+/);
|
|
359
|
+
const availKB = parseInt(parts[3] || '0', 10);
|
|
360
|
+
const availMB = availKB / 1024;
|
|
361
|
+
const availGB = (availKB / 1024 / 1024).toFixed(1);
|
|
362
|
+
const usePct = parseInt(parts[4] || '0', 10);
|
|
363
|
+
if (availMB < 500) {
|
|
364
|
+
return {
|
|
365
|
+
name: 'Disk space',
|
|
366
|
+
status: 'warn',
|
|
367
|
+
message: `${availGB} GB free (< 500 MB threshold)`,
|
|
368
|
+
fix: 'Free up disk space',
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
if (usePct > 95) {
|
|
372
|
+
return { name: 'Disk space', status: 'fail', message: `${availGB} GB free (${usePct}% used)`, fix: 'Free up disk space' };
|
|
373
|
+
}
|
|
374
|
+
return { name: 'Disk space', status: 'pass', message: `${availGB} GB free` };
|
|
375
|
+
}
|
|
376
|
+
return { name: 'Disk space', status: 'pass', message: 'Readable' };
|
|
377
|
+
}
|
|
378
|
+
catch {
|
|
379
|
+
return { name: 'Disk space', status: 'warn', message: 'Could not check disk space' };
|
|
380
|
+
}
|
|
381
|
+
}
|
|
206
382
|
async function checkTailscale() {
|
|
207
383
|
const result = await api.get('/api/tunnels/status');
|
|
208
384
|
if (!result.ok) {
|
|
@@ -235,28 +411,36 @@ export function doctorCommand() {
|
|
|
235
411
|
.option('--json', 'Output as JSON')
|
|
236
412
|
.action(async (options) => {
|
|
237
413
|
console.log(chalk.bold('\nprofClaw Doctor\n'));
|
|
238
|
-
|
|
414
|
+
// Static (single-result) checks
|
|
415
|
+
const singleChecks = [
|
|
239
416
|
{ name: 'Node.js', fn: checkNode },
|
|
417
|
+
{ name: 'Disk space', fn: checkDiskSpaceBytes },
|
|
418
|
+
{ name: 'Port availability', fn: checkPortAvailability },
|
|
419
|
+
{ name: 'DB Integrity', fn: checkDatabaseIntegrity },
|
|
420
|
+
{ name: 'Ollama', fn: checkOllama },
|
|
421
|
+
{ name: 'Redis', fn: checkRedis },
|
|
422
|
+
{ name: 'Config files', fn: checkConfigFileValidity },
|
|
423
|
+
{ name: 'Dependencies', fn: checkMissingDependencies },
|
|
424
|
+
{ name: 'PID file', fn: checkPidFileStatus },
|
|
240
425
|
{ name: 'Config', fn: checkConfigFiles },
|
|
241
426
|
{ name: 'Port', fn: checkPort },
|
|
242
|
-
{ name: 'Redis', fn: checkRedis },
|
|
243
|
-
{ name: 'Ollama', fn: checkOllama },
|
|
244
427
|
{ name: 'Server', fn: checkServer },
|
|
245
428
|
{ name: 'Database', fn: checkDatabase },
|
|
246
|
-
{ name: 'AI Provider', fn: checkProvider },
|
|
247
429
|
{ name: 'Memory', fn: checkMemory },
|
|
248
430
|
{ name: 'Disk', fn: checkDiskSpace },
|
|
249
431
|
{ name: 'Cloudflared', fn: checkCloudflared },
|
|
250
432
|
{ name: 'Tailscale', fn: checkTailscale },
|
|
251
433
|
];
|
|
252
434
|
const results = [];
|
|
253
|
-
|
|
435
|
+
// Run single-result checks
|
|
436
|
+
for (const check of singleChecks) {
|
|
254
437
|
const spin = spinner(`Checking ${check.name}...`).start();
|
|
255
438
|
try {
|
|
256
439
|
const result = await check.fn();
|
|
257
440
|
results.push(result);
|
|
258
441
|
spin.stop();
|
|
259
|
-
|
|
442
|
+
if (!options.json)
|
|
443
|
+
formatCheck(result);
|
|
260
444
|
}
|
|
261
445
|
catch (err) {
|
|
262
446
|
spin.stop();
|
|
@@ -266,7 +450,30 @@ export function doctorCommand() {
|
|
|
266
450
|
message: err instanceof Error ? err.message : 'Unknown error',
|
|
267
451
|
};
|
|
268
452
|
results.push(result);
|
|
269
|
-
|
|
453
|
+
if (!options.json)
|
|
454
|
+
formatCheck(result);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
// Run multi-result check: API key validation per provider
|
|
458
|
+
{
|
|
459
|
+
const spin = spinner('Checking API keys...').start();
|
|
460
|
+
try {
|
|
461
|
+
const apiKeyResults = await checkApiKeyValidation();
|
|
462
|
+
results.push(...apiKeyResults);
|
|
463
|
+
spin.stop();
|
|
464
|
+
if (!options.json)
|
|
465
|
+
apiKeyResults.forEach(formatCheck);
|
|
466
|
+
}
|
|
467
|
+
catch (err) {
|
|
468
|
+
spin.stop();
|
|
469
|
+
const result = {
|
|
470
|
+
name: 'API Keys',
|
|
471
|
+
status: 'fail',
|
|
472
|
+
message: err instanceof Error ? err.message : 'Unknown error',
|
|
473
|
+
};
|
|
474
|
+
results.push(result);
|
|
475
|
+
if (!options.json)
|
|
476
|
+
formatCheck(result);
|
|
270
477
|
}
|
|
271
478
|
}
|
|
272
479
|
if (options.json) {
|
|
@@ -277,15 +484,14 @@ export function doctorCommand() {
|
|
|
277
484
|
const warnings = results.filter((r) => r.status === 'warn').length;
|
|
278
485
|
const failed = results.filter((r) => r.status === 'fail').length;
|
|
279
486
|
console.log('');
|
|
280
|
-
const total = results.length;
|
|
281
487
|
if (failed === 0 && warnings === 0) {
|
|
282
|
-
success(
|
|
488
|
+
success(`${passed} passed`);
|
|
283
489
|
}
|
|
284
490
|
else if (failed === 0) {
|
|
285
|
-
info(`${passed}
|
|
491
|
+
info(`${passed} passed | ${warnings} warning${warnings !== 1 ? 's' : ''} | 0 failed`);
|
|
286
492
|
}
|
|
287
493
|
else {
|
|
288
|
-
error(`${passed}
|
|
494
|
+
error(`${passed} passed | ${warnings} warning${warnings !== 1 ? 's' : ''} | ${failed} failed`);
|
|
289
495
|
process.exitCode = 1;
|
|
290
496
|
}
|
|
291
497
|
console.log('');
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { TranscriptStore } from '../../agents/transcript.js';
|
|
4
|
+
import { createTable, error, formatRelativeTime, truncate, } from '../utils/output.js';
|
|
5
|
+
function getStore() {
|
|
6
|
+
return new TranscriptStore(process.cwd());
|
|
7
|
+
}
|
|
8
|
+
export function historyCommands() {
|
|
9
|
+
const cmd = new Command('history').description('View and search conversation history');
|
|
10
|
+
// -------------------------------------------------------------------
|
|
11
|
+
// profclaw history
|
|
12
|
+
// -------------------------------------------------------------------
|
|
13
|
+
cmd
|
|
14
|
+
.command('list', { isDefault: true })
|
|
15
|
+
.alias('ls')
|
|
16
|
+
.description('List recent conversation sessions')
|
|
17
|
+
.option('-l, --limit <n>', 'Max sessions to show', '20')
|
|
18
|
+
.option('--offset <n>', 'Skip first N sessions', '0')
|
|
19
|
+
.option('--json', 'Output as JSON')
|
|
20
|
+
.action(async (options) => {
|
|
21
|
+
const store = getStore();
|
|
22
|
+
const sessions = store.listSessions({
|
|
23
|
+
limit: parseInt(options.limit, 10),
|
|
24
|
+
offset: parseInt(options.offset, 10),
|
|
25
|
+
});
|
|
26
|
+
if (options.json) {
|
|
27
|
+
console.log(JSON.stringify(sessions, null, 2));
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (sessions.length === 0) {
|
|
31
|
+
console.log(chalk.dim('No sessions found.'));
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const table = createTable(['Session ID', 'Title', 'Messages', 'Tokens', 'Last Active']);
|
|
35
|
+
for (const s of sessions) {
|
|
36
|
+
table.push([
|
|
37
|
+
chalk.dim(s.sessionId.slice(0, 12)),
|
|
38
|
+
truncate(s.title, 40),
|
|
39
|
+
String(s.messageCount),
|
|
40
|
+
chalk.dim(String(s.tokensUsed)),
|
|
41
|
+
formatRelativeTime(new Date(s.lastActivityAt)),
|
|
42
|
+
]);
|
|
43
|
+
}
|
|
44
|
+
console.log(`\n${chalk.bold('Conversation History')}`);
|
|
45
|
+
console.log(table.toString());
|
|
46
|
+
console.log(chalk.dim(`\nShowing ${sessions.length} session(s)`));
|
|
47
|
+
});
|
|
48
|
+
// -------------------------------------------------------------------
|
|
49
|
+
// profclaw history search <query>
|
|
50
|
+
// -------------------------------------------------------------------
|
|
51
|
+
cmd
|
|
52
|
+
.command('search <query>')
|
|
53
|
+
.description('Search across all transcript entries')
|
|
54
|
+
.option('-s, --session <sessionId>', 'Restrict search to a specific session')
|
|
55
|
+
.option('-l, --limit <n>', 'Max results to return', '20')
|
|
56
|
+
.option('--json', 'Output as JSON')
|
|
57
|
+
.action(async (query, options) => {
|
|
58
|
+
const store = getStore();
|
|
59
|
+
const results = store.search(query, {
|
|
60
|
+
sessionId: options.session,
|
|
61
|
+
limit: parseInt(options.limit, 10),
|
|
62
|
+
});
|
|
63
|
+
if (options.json) {
|
|
64
|
+
console.log(JSON.stringify(results, null, 2));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (results.length === 0) {
|
|
68
|
+
console.log(chalk.dim(`No matches found for "${query}".`));
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const table = createTable(['Session', 'Line', 'Type', 'Content']);
|
|
72
|
+
for (const r of results) {
|
|
73
|
+
table.push([
|
|
74
|
+
chalk.dim(r.sessionId.slice(0, 12)),
|
|
75
|
+
chalk.dim(String(r.lineNumber)),
|
|
76
|
+
chalk.cyan(r.entry.type),
|
|
77
|
+
truncate(r.entry.content, 60),
|
|
78
|
+
]);
|
|
79
|
+
}
|
|
80
|
+
console.log(`\n${chalk.bold(`Search results for "${query}"`)}`);
|
|
81
|
+
console.log(table.toString());
|
|
82
|
+
console.log(chalk.dim(`\nFound ${results.length} match(es)`));
|
|
83
|
+
});
|
|
84
|
+
// -------------------------------------------------------------------
|
|
85
|
+
// profclaw history show <sessionId>
|
|
86
|
+
// -------------------------------------------------------------------
|
|
87
|
+
cmd
|
|
88
|
+
.command('show <sessionId>')
|
|
89
|
+
.description('Show the full transcript for a session')
|
|
90
|
+
.option('--json', 'Output as JSON')
|
|
91
|
+
.option('--no-color', 'Disable color output')
|
|
92
|
+
.action(async (sessionId, options) => {
|
|
93
|
+
const store = getStore();
|
|
94
|
+
const entries = store.getSession(sessionId);
|
|
95
|
+
if (entries.length === 0) {
|
|
96
|
+
error(`No transcript found for session: ${sessionId}`);
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
if (options.json) {
|
|
100
|
+
console.log(JSON.stringify(entries, null, 2));
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
console.log(`\n${chalk.bold('Transcript')} ${chalk.dim(sessionId)}\n`);
|
|
104
|
+
for (const entry of entries) {
|
|
105
|
+
const ts = new Date(entry.timestamp).toLocaleTimeString();
|
|
106
|
+
const label = entryLabel(entry.type);
|
|
107
|
+
console.log(`${chalk.dim(ts)} ${label}`);
|
|
108
|
+
console.log(chalk.white(entry.content));
|
|
109
|
+
if (entry.metadata?.toolName) {
|
|
110
|
+
console.log(chalk.dim(` tool: ${entry.metadata.toolName}`));
|
|
111
|
+
}
|
|
112
|
+
if (entry.metadata?.tokensUsed) {
|
|
113
|
+
console.log(chalk.dim(` tokens: ${entry.metadata.tokensUsed}`));
|
|
114
|
+
}
|
|
115
|
+
console.log();
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
return cmd;
|
|
119
|
+
}
|
|
120
|
+
function entryLabel(type) {
|
|
121
|
+
switch (type) {
|
|
122
|
+
case 'user':
|
|
123
|
+
return chalk.green('> User');
|
|
124
|
+
case 'assistant':
|
|
125
|
+
return chalk.blue('~ Assistant');
|
|
126
|
+
case 'tool_call':
|
|
127
|
+
return chalk.yellow('# Tool Call');
|
|
128
|
+
case 'tool_result':
|
|
129
|
+
return chalk.yellow('# Tool Result');
|
|
130
|
+
case 'system':
|
|
131
|
+
return chalk.dim('* System');
|
|
132
|
+
case 'error':
|
|
133
|
+
return chalk.red('! Error');
|
|
134
|
+
default:
|
|
135
|
+
return chalk.dim(type);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1,44 @@
|
|
|
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 { Command } from 'commander';
|
|
15
|
+
export type ImportSource = 'openclaw' | 'chatgpt' | 'aider';
|
|
16
|
+
export interface ImportResult {
|
|
17
|
+
source: ImportSource;
|
|
18
|
+
memories: number;
|
|
19
|
+
conversations: number;
|
|
20
|
+
skills: number;
|
|
21
|
+
preferences: number;
|
|
22
|
+
errors: string[];
|
|
23
|
+
duration: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Import data from another AI assistant into profClaw.
|
|
27
|
+
* Returns a summary of what was imported.
|
|
28
|
+
*/
|
|
29
|
+
export declare function importFrom(source: ImportSource, options?: {
|
|
30
|
+
path?: string;
|
|
31
|
+
file?: string;
|
|
32
|
+
dryRun?: boolean;
|
|
33
|
+
}): Promise<ImportResult>;
|
|
34
|
+
/**
|
|
35
|
+
* List available import sources and their expected paths.
|
|
36
|
+
*/
|
|
37
|
+
export declare function listImportSources(): Array<{
|
|
38
|
+
source: ImportSource;
|
|
39
|
+
description: string;
|
|
40
|
+
defaultPath: string;
|
|
41
|
+
format: string;
|
|
42
|
+
}>;
|
|
43
|
+
export declare function importCommands(): Command;
|
|
44
|
+
//# sourceMappingURL=import.d.ts.map
|