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,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sleep Prevention Utility
|
|
3
|
+
*
|
|
4
|
+
* Prevents OS sleep/screensaver during long agent runs.
|
|
5
|
+
* - macOS: uses `caffeinate -i -w {pid}`
|
|
6
|
+
* - Linux: tries `systemd-inhibit` then falls back to `xdg-screensaver suspend`
|
|
7
|
+
* - Windows: no-op (PowerShell SetThreadExecutionState not exposed without ffi)
|
|
8
|
+
*/
|
|
9
|
+
import { spawn } from 'child_process';
|
|
10
|
+
let _instance = null;
|
|
11
|
+
export class SleepPreventer {
|
|
12
|
+
_process = null;
|
|
13
|
+
_active = false;
|
|
14
|
+
/**
|
|
15
|
+
* Start preventing OS sleep.
|
|
16
|
+
* Safe to call multiple times — subsequent calls are no-ops if already active.
|
|
17
|
+
*/
|
|
18
|
+
start() {
|
|
19
|
+
if (this._active)
|
|
20
|
+
return;
|
|
21
|
+
const platform = process.platform;
|
|
22
|
+
try {
|
|
23
|
+
if (platform === 'darwin') {
|
|
24
|
+
this._process = spawn('caffeinate', ['-i', '-w', String(process.pid)], {
|
|
25
|
+
detached: false,
|
|
26
|
+
stdio: 'ignore',
|
|
27
|
+
});
|
|
28
|
+
this._process.unref();
|
|
29
|
+
this._active = true;
|
|
30
|
+
}
|
|
31
|
+
else if (platform === 'linux') {
|
|
32
|
+
// Try systemd-inhibit first; it works on most modern distros
|
|
33
|
+
this._process = spawn('systemd-inhibit', [
|
|
34
|
+
'--what=sleep:idle',
|
|
35
|
+
'--who=profClaw',
|
|
36
|
+
'--why=Agent run in progress',
|
|
37
|
+
'--mode=block',
|
|
38
|
+
'sleep', 'infinity',
|
|
39
|
+
], { detached: false, stdio: 'ignore' });
|
|
40
|
+
this._process.unref();
|
|
41
|
+
this._process.on('error', () => {
|
|
42
|
+
// systemd-inhibit unavailable — try xdg-screensaver
|
|
43
|
+
this._process = null;
|
|
44
|
+
try {
|
|
45
|
+
const p = spawn('xdg-screensaver', ['suspend', String(process.pid)], {
|
|
46
|
+
detached: false,
|
|
47
|
+
stdio: 'ignore',
|
|
48
|
+
});
|
|
49
|
+
p.unref();
|
|
50
|
+
this._process = p;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// xdg-screensaver also unavailable — silent no-op
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
this._active = true;
|
|
57
|
+
}
|
|
58
|
+
// Windows / unknown: no-op — _active stays false
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// If spawn itself throws, treat as silent failure
|
|
62
|
+
this._process = null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Stop preventing sleep and release the system process.
|
|
67
|
+
*/
|
|
68
|
+
stop() {
|
|
69
|
+
if (!this._active)
|
|
70
|
+
return;
|
|
71
|
+
if (this._process) {
|
|
72
|
+
try {
|
|
73
|
+
this._process.kill();
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Already dead — ignore
|
|
77
|
+
}
|
|
78
|
+
this._process = null;
|
|
79
|
+
}
|
|
80
|
+
this._active = false;
|
|
81
|
+
}
|
|
82
|
+
isActive() {
|
|
83
|
+
return this._active;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Returns the shared singleton SleepPreventer instance.
|
|
88
|
+
*/
|
|
89
|
+
export function getSleepPreventer() {
|
|
90
|
+
if (!_instance) {
|
|
91
|
+
_instance = new SleepPreventer();
|
|
92
|
+
}
|
|
93
|
+
return _instance;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=prevent-sleep.js.map
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output Sanitization Utilities
|
|
3
|
+
*
|
|
4
|
+
* Protects against terminal injection, path traversal, dangerous shell commands,
|
|
5
|
+
* and sensitive data leaking into logs.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Sanitize text before displaying in a terminal.
|
|
9
|
+
*
|
|
10
|
+
* - Strips all ANSI/VT escape sequences to prevent terminal injection via
|
|
11
|
+
* malicious model responses (e.g. cursor repositioning, title bar spoofing).
|
|
12
|
+
* - Removes non-printable control characters except newlines.
|
|
13
|
+
*
|
|
14
|
+
* @param text Untrusted string from external source (model output, API data, etc.)
|
|
15
|
+
* @returns Safe string suitable for terminal display
|
|
16
|
+
*/
|
|
17
|
+
export declare function sanitizeForTerminal(text: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Sanitize a file path to prevent path traversal attacks.
|
|
20
|
+
*
|
|
21
|
+
* Checks that the resolved path is strictly inside `baseDir`.
|
|
22
|
+
* Rejects:
|
|
23
|
+
* - Paths containing `..` segments that escape the base
|
|
24
|
+
* - Absolute paths outside `baseDir`
|
|
25
|
+
* - Null bytes
|
|
26
|
+
*
|
|
27
|
+
* @param inputPath Path provided by the user / untrusted source
|
|
28
|
+
* @param baseDir Absolute directory that the path must stay inside
|
|
29
|
+
* @returns Normalized absolute path if safe, or `null` if the path is unsafe
|
|
30
|
+
*/
|
|
31
|
+
export declare function sanitizePath(inputPath: string, baseDir: string): string | null;
|
|
32
|
+
interface ShellSafetyResult {
|
|
33
|
+
safe: boolean;
|
|
34
|
+
reason?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Evaluate whether a shell command string is safe to run.
|
|
38
|
+
*
|
|
39
|
+
* This is a best-effort heuristic for the `/run` feature and is NOT a sandbox.
|
|
40
|
+
* Dangerous patterns (rm -rf, sudo, chmod 777, curl | bash, etc.) are rejected.
|
|
41
|
+
*
|
|
42
|
+
* @param cmd Raw command string submitted by the user
|
|
43
|
+
* @returns `{ safe: true }` or `{ safe: false, reason: '...' }`
|
|
44
|
+
*/
|
|
45
|
+
export declare function sanitizeShellCommand(cmd: string): ShellSafetyResult;
|
|
46
|
+
/**
|
|
47
|
+
* Redact sensitive values from a plain-text string before it reaches logs.
|
|
48
|
+
*
|
|
49
|
+
* Replaces patterns matching API keys, bearer tokens, passwords, and similar
|
|
50
|
+
* credential-shaped values with `[REDACTED]`.
|
|
51
|
+
*
|
|
52
|
+
* @param text Raw string that may contain secrets
|
|
53
|
+
* @returns String with sensitive values replaced
|
|
54
|
+
*/
|
|
55
|
+
export declare function redactSensitive(text: string): string;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=sanitizer.d.ts.map
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output Sanitization Utilities
|
|
3
|
+
*
|
|
4
|
+
* Protects against terminal injection, path traversal, dangerous shell commands,
|
|
5
|
+
* and sensitive data leaking into logs.
|
|
6
|
+
*/
|
|
7
|
+
import { resolve, normalize, relative, isAbsolute } from 'node:path';
|
|
8
|
+
// ─── Terminal sanitization ────────────────────────────────────────────────────
|
|
9
|
+
/**
|
|
10
|
+
* ANSI / VT escape sequence pattern.
|
|
11
|
+
*
|
|
12
|
+
* Handles:
|
|
13
|
+
* - CSI sequences: ESC [ <params> <final>
|
|
14
|
+
* - OSC sequences: ESC ] <text> BEL or ESC ] <text> ESC \
|
|
15
|
+
* - Two-char ESC sequences: ESC <single byte in 0x40-0x5F>
|
|
16
|
+
*
|
|
17
|
+
* Must be listed longest-match first (OSC before two-char) to avoid partial matches.
|
|
18
|
+
*/
|
|
19
|
+
const ANSI_ESCAPE_RE = /\x1B(?:\][^\x07\x1B]*(?:\x07|\x1B\\)|\[[0-?]*[ -/]*[@-~]|[@-_])/g;
|
|
20
|
+
/**
|
|
21
|
+
* Additional terminal control characters that should not appear in display output.
|
|
22
|
+
* Excludes LF (\n) and CR (\r) which are legitimate line endings.
|
|
23
|
+
*/
|
|
24
|
+
const CONTROL_CHARS_RE = /[\x00-\x08\x0B\x0C\x0E-\x1A\x1C-\x1F\x7F]/g;
|
|
25
|
+
/**
|
|
26
|
+
* Sanitize text before displaying in a terminal.
|
|
27
|
+
*
|
|
28
|
+
* - Strips all ANSI/VT escape sequences to prevent terminal injection via
|
|
29
|
+
* malicious model responses (e.g. cursor repositioning, title bar spoofing).
|
|
30
|
+
* - Removes non-printable control characters except newlines.
|
|
31
|
+
*
|
|
32
|
+
* @param text Untrusted string from external source (model output, API data, etc.)
|
|
33
|
+
* @returns Safe string suitable for terminal display
|
|
34
|
+
*/
|
|
35
|
+
export function sanitizeForTerminal(text) {
|
|
36
|
+
if (!text)
|
|
37
|
+
return text;
|
|
38
|
+
return text
|
|
39
|
+
.replace(ANSI_ESCAPE_RE, '')
|
|
40
|
+
.replace(CONTROL_CHARS_RE, '');
|
|
41
|
+
}
|
|
42
|
+
// ─── Path sanitization ────────────────────────────────────────────────────────
|
|
43
|
+
/**
|
|
44
|
+
* Sanitize a file path to prevent path traversal attacks.
|
|
45
|
+
*
|
|
46
|
+
* Checks that the resolved path is strictly inside `baseDir`.
|
|
47
|
+
* Rejects:
|
|
48
|
+
* - Paths containing `..` segments that escape the base
|
|
49
|
+
* - Absolute paths outside `baseDir`
|
|
50
|
+
* - Null bytes
|
|
51
|
+
*
|
|
52
|
+
* @param inputPath Path provided by the user / untrusted source
|
|
53
|
+
* @param baseDir Absolute directory that the path must stay inside
|
|
54
|
+
* @returns Normalized absolute path if safe, or `null` if the path is unsafe
|
|
55
|
+
*/
|
|
56
|
+
export function sanitizePath(inputPath, baseDir) {
|
|
57
|
+
if (!inputPath || typeof inputPath !== 'string')
|
|
58
|
+
return null;
|
|
59
|
+
// Reject null bytes
|
|
60
|
+
if (inputPath.includes('\x00'))
|
|
61
|
+
return null;
|
|
62
|
+
// Reject clearly absolute paths that start outside baseDir right away
|
|
63
|
+
// (resolve will handle this too, but this is a fast early-exit)
|
|
64
|
+
const normalizedBase = normalize(resolve(baseDir));
|
|
65
|
+
const resolvedInput = resolve(normalizedBase, inputPath);
|
|
66
|
+
const rel = relative(normalizedBase, resolvedInput);
|
|
67
|
+
// relative() returns something starting with '..' when outside base
|
|
68
|
+
if (rel.startsWith('..') || isAbsolute(rel))
|
|
69
|
+
return null;
|
|
70
|
+
return resolvedInput;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Patterns that indicate a dangerously destructive or privilege-escalating command.
|
|
74
|
+
* Order matters — first match wins and provides the clearest reason.
|
|
75
|
+
*/
|
|
76
|
+
const DANGEROUS_PATTERNS = [
|
|
77
|
+
// Destructive filesystem
|
|
78
|
+
{ pattern: /rm\s+(-[a-zA-Z]*f[a-zA-Z]*|-[a-zA-Z]*r[a-zA-Z]*f[a-zA-Z]*|--force|--recursive)/, reason: 'destructive rm flags detected' },
|
|
79
|
+
{ pattern: /rm\s+-rf/, reason: 'rm -rf detected' },
|
|
80
|
+
{ pattern: /:\s*\(\s*\)\s*\{.*\}/, reason: 'fork bomb pattern detected' },
|
|
81
|
+
// Privilege escalation
|
|
82
|
+
{ pattern: /\bsudo\b/, reason: 'sudo is not allowed' },
|
|
83
|
+
{ pattern: /\bsu\s+-/, reason: 'su command is not allowed' },
|
|
84
|
+
{ pattern: /chmod\s+[0-7]*7[0-7][0-7]/, reason: 'chmod 777 / world-writable permission denied' },
|
|
85
|
+
{ pattern: /chown\s+root/, reason: 'chown root is not allowed' },
|
|
86
|
+
// Remote code execution via pipe-to-shell
|
|
87
|
+
{ pattern: /\|\s*(ba|z|da|fi|c)?sh\b/, reason: 'pipe to shell is not allowed' },
|
|
88
|
+
{ pattern: /curl[^|]*\|/, reason: 'curl piped to shell is not allowed' },
|
|
89
|
+
{ pattern: /wget[^|]*\|/, reason: 'wget piped to shell is not allowed' },
|
|
90
|
+
// Disk wipe / overwrite
|
|
91
|
+
{ pattern: /\bdd\s+.*of=\/dev\/(sd|nvme|hd|disk)/, reason: 'dd write to block device is not allowed' },
|
|
92
|
+
{ pattern: /mkfs\./, reason: 'filesystem format command is not allowed' },
|
|
93
|
+
// Environment manipulation that could bypass guards
|
|
94
|
+
{ pattern: /\benv\s+-i\b/, reason: 'env -i clears environment and is not allowed' },
|
|
95
|
+
// Bypass via exec
|
|
96
|
+
{ pattern: /\bexec\s+bash\b/, reason: 'exec bash shell replacement is not allowed' },
|
|
97
|
+
];
|
|
98
|
+
/**
|
|
99
|
+
* Evaluate whether a shell command string is safe to run.
|
|
100
|
+
*
|
|
101
|
+
* This is a best-effort heuristic for the `/run` feature and is NOT a sandbox.
|
|
102
|
+
* Dangerous patterns (rm -rf, sudo, chmod 777, curl | bash, etc.) are rejected.
|
|
103
|
+
*
|
|
104
|
+
* @param cmd Raw command string submitted by the user
|
|
105
|
+
* @returns `{ safe: true }` or `{ safe: false, reason: '...' }`
|
|
106
|
+
*/
|
|
107
|
+
export function sanitizeShellCommand(cmd) {
|
|
108
|
+
if (!cmd || typeof cmd !== 'string') {
|
|
109
|
+
return { safe: false, reason: 'empty or invalid command' };
|
|
110
|
+
}
|
|
111
|
+
const trimmed = cmd.trim();
|
|
112
|
+
if (trimmed.length === 0) {
|
|
113
|
+
return { safe: false, reason: 'empty command' };
|
|
114
|
+
}
|
|
115
|
+
// Null bytes in commands indicate injection attempts
|
|
116
|
+
if (trimmed.includes('\x00')) {
|
|
117
|
+
return { safe: false, reason: 'null byte in command' };
|
|
118
|
+
}
|
|
119
|
+
for (const { pattern, reason } of DANGEROUS_PATTERNS) {
|
|
120
|
+
if (pattern.test(trimmed)) {
|
|
121
|
+
return { safe: false, reason };
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return { safe: true };
|
|
125
|
+
}
|
|
126
|
+
// ─── Sensitive value redaction ────────────────────────────────────────────────
|
|
127
|
+
/**
|
|
128
|
+
* Matches common API key / token / secret value patterns in plain text.
|
|
129
|
+
*
|
|
130
|
+
* Designed to catch values that appear in log lines such as:
|
|
131
|
+
* Authorization: Bearer sk-proj-abc123...
|
|
132
|
+
* token=ghp_abcXYZ
|
|
133
|
+
* password=s3cr3t
|
|
134
|
+
* OPENAI_API_KEY=sk-...
|
|
135
|
+
*/
|
|
136
|
+
const SENSITIVE_PATTERNS = [
|
|
137
|
+
// Authorization header value
|
|
138
|
+
{ pattern: /((?:Bearer|Basic|Token)\s+)[A-Za-z0-9\-._~+/]+=*/gi, replacement: '$1[REDACTED]' },
|
|
139
|
+
// API key prefixes (OpenAI sk-, Anthropic sk-ant-, etc.)
|
|
140
|
+
{ pattern: /\b(sk-(?:ant-|proj-)?)[A-Za-z0-9\-_]{8,}/g, replacement: '$1[REDACTED]' },
|
|
141
|
+
// GitHub tokens
|
|
142
|
+
{ pattern: /\b(gh[pousr]_)[A-Za-z0-9]{36,}/g, replacement: '$1[REDACTED]' },
|
|
143
|
+
// Generic "key-*" style tokens
|
|
144
|
+
{ pattern: /\b(key-)[A-Za-z0-9\-_]{8,}/g, replacement: '$1[REDACTED]' },
|
|
145
|
+
// Query / form param assignments: token=, password=, api_key=, apikey=, secret=
|
|
146
|
+
{
|
|
147
|
+
pattern: /\b((?:token|password|passwd|api[_-]?key|secret|access[_-]?token|refresh[_-]?token|client[_-]?secret)=)[^\s&"']+/gi,
|
|
148
|
+
replacement: '$1[REDACTED]',
|
|
149
|
+
},
|
|
150
|
+
// JSON field values: "password": "...", "token": "..."
|
|
151
|
+
{
|
|
152
|
+
pattern: /"(password|token|secret|apiKey|api_key|accessToken|access_token|refreshToken|refresh_token|clientSecret|client_secret|authorization)"\s*:\s*"[^"]{4,}"/gi,
|
|
153
|
+
replacement: '"$1": "[REDACTED]"',
|
|
154
|
+
},
|
|
155
|
+
];
|
|
156
|
+
/**
|
|
157
|
+
* Redact sensitive values from a plain-text string before it reaches logs.
|
|
158
|
+
*
|
|
159
|
+
* Replaces patterns matching API keys, bearer tokens, passwords, and similar
|
|
160
|
+
* credential-shaped values with `[REDACTED]`.
|
|
161
|
+
*
|
|
162
|
+
* @param text Raw string that may contain secrets
|
|
163
|
+
* @returns String with sensitive values replaced
|
|
164
|
+
*/
|
|
165
|
+
export function redactSensitive(text) {
|
|
166
|
+
if (!text || typeof text !== 'string')
|
|
167
|
+
return text;
|
|
168
|
+
let result = text;
|
|
169
|
+
for (const { pattern, replacement } of SENSITIVE_PATTERNS) {
|
|
170
|
+
result = result.replace(pattern, replacement);
|
|
171
|
+
}
|
|
172
|
+
return result;
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=sanitizer.js.map
|
package/docker-compose.yml
CHANGED
|
@@ -1,17 +1,12 @@
|
|
|
1
1
|
# Profiles:
|
|
2
2
|
# (default) profclaw (pro mode) + redis
|
|
3
|
-
#
|
|
4
|
-
# ai + ollama (free local AI)
|
|
5
|
-
# tools + redis-commander
|
|
6
|
-
# monitoring + prometheus + grafana
|
|
3
|
+
# ai + ollama (free local AI, optional)
|
|
7
4
|
#
|
|
8
|
-
# Quick start
|
|
9
|
-
# docker compose up -d
|
|
10
|
-
# docker compose up -d
|
|
11
|
-
# docker compose --profile ai up -d # pro + ollama
|
|
5
|
+
# Quick start:
|
|
6
|
+
# docker compose up -d # pro mode (default)
|
|
7
|
+
# docker compose --profile ai up -d # pro + ollama
|
|
12
8
|
#
|
|
13
|
-
#
|
|
14
|
-
# Use `docker compose up -d profclaw-pico` for pico-only.
|
|
9
|
+
# Copy .env.example to .env and fill in your keys before starting.
|
|
15
10
|
|
|
16
11
|
services:
|
|
17
12
|
# ===================
|
|
@@ -24,40 +19,19 @@ services:
|
|
|
24
19
|
container_name: profclaw
|
|
25
20
|
ports:
|
|
26
21
|
- "${PORT:-3000}:3000"
|
|
22
|
+
env_file:
|
|
23
|
+
- .env
|
|
27
24
|
environment:
|
|
28
|
-
# Core
|
|
25
|
+
# Core (override .env values for container-specific settings)
|
|
29
26
|
- NODE_ENV=production
|
|
30
27
|
- PORT=3000
|
|
31
28
|
- PROFCLAW_MODE=pro
|
|
32
|
-
# Redis
|
|
29
|
+
# Redis (points to the redis service in this compose network)
|
|
33
30
|
- REDIS_URL=redis://redis:6379
|
|
34
|
-
|
|
35
|
-
# Database
|
|
31
|
+
# Database (stored in the data volume)
|
|
36
32
|
- DATABASE_URL=file:/app/data/profclaw.db
|
|
37
|
-
# OpenClaw
|
|
38
|
-
- OPENCLAW_BASE_URL=${OPENCLAW_BASE_URL:-http://host.docker.internal:18789}
|
|
39
|
-
- OPENCLAW_GATEWAY_TOKEN=${OPENCLAW_GATEWAY_TOKEN}
|
|
40
|
-
- OPENCLAW_WORKING_DIR=/workspace
|
|
41
|
-
# GitHub
|
|
42
|
-
- GITHUB_TOKEN=${GITHUB_TOKEN}
|
|
43
|
-
- GITHUB_WEBHOOK_SECRET=${GITHUB_WEBHOOK_SECRET}
|
|
44
|
-
- GITHUB_AI_TASK_LABEL=${GITHUB_AI_TASK_LABEL:-ai-task}
|
|
45
|
-
# Task Queue
|
|
46
|
-
- TASK_CONCURRENCY=${TASK_CONCURRENCY:-2}
|
|
47
|
-
# AI Providers (optional)
|
|
48
|
-
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
|
|
49
|
-
- OPENAI_API_KEY=${OPENAI_API_KEY}
|
|
50
|
-
- AZURE_OPENAI_API_KEY=${AZURE_OPENAI_API_KEY}
|
|
51
|
-
- AZURE_OPENAI_ENDPOINT=${AZURE_OPENAI_ENDPOINT}
|
|
52
|
-
- GROQ_API_KEY=${GROQ_API_KEY}
|
|
53
|
-
# Ollama (free local AI)
|
|
54
|
-
- OLLAMA_BASE_URL=${OLLAMA_BASE_URL:-http://ollama:11434}
|
|
55
|
-
# Tool Execution
|
|
56
|
-
- POOL_MAX_CONCURRENT=${POOL_MAX_CONCURRENT:-50}
|
|
57
|
-
- POOL_TIMEOUT_MS=${POOL_TIMEOUT_MS:-300000}
|
|
58
33
|
volumes:
|
|
59
|
-
-
|
|
60
|
-
- workspace:/workspace
|
|
34
|
+
- ./data:/app/data
|
|
61
35
|
depends_on:
|
|
62
36
|
redis:
|
|
63
37
|
condition: service_healthy
|
|
@@ -72,38 +46,7 @@ services:
|
|
|
72
46
|
- profclaw-network
|
|
73
47
|
|
|
74
48
|
# ===================
|
|
75
|
-
#
|
|
76
|
-
# ===================
|
|
77
|
-
profclaw-pico:
|
|
78
|
-
build:
|
|
79
|
-
context: .
|
|
80
|
-
dockerfile: Dockerfile.pico
|
|
81
|
-
container_name: profclaw-pico
|
|
82
|
-
ports:
|
|
83
|
-
- "${PORT:-3000}:3000"
|
|
84
|
-
environment:
|
|
85
|
-
- NODE_ENV=production
|
|
86
|
-
- PORT=3000
|
|
87
|
-
- PROFCLAW_MODE=pico
|
|
88
|
-
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
|
|
89
|
-
- OPENAI_API_KEY=${OPENAI_API_KEY}
|
|
90
|
-
- OLLAMA_BASE_URL=${OLLAMA_BASE_URL:-http://host.docker.internal:11434}
|
|
91
|
-
volumes:
|
|
92
|
-
- profclaw-data:/app/data
|
|
93
|
-
healthcheck:
|
|
94
|
-
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
|
|
95
|
-
interval: 30s
|
|
96
|
-
timeout: 10s
|
|
97
|
-
retries: 3
|
|
98
|
-
start_period: 5s
|
|
99
|
-
restart: unless-stopped
|
|
100
|
-
profiles:
|
|
101
|
-
- pico
|
|
102
|
-
networks:
|
|
103
|
-
- profclaw-network
|
|
104
|
-
|
|
105
|
-
# ===================
|
|
106
|
-
# Redis (Task Queue)
|
|
49
|
+
# Redis (Task Queue - required for pro mode)
|
|
107
50
|
# ===================
|
|
108
51
|
redis:
|
|
109
52
|
image: redis:7-alpine
|
|
@@ -123,7 +66,7 @@ services:
|
|
|
123
66
|
- profclaw-network
|
|
124
67
|
|
|
125
68
|
# ===================
|
|
126
|
-
# Ollama (Free Local AI)
|
|
69
|
+
# Ollama (Free Local AI - optional profile)
|
|
127
70
|
# ===================
|
|
128
71
|
ollama:
|
|
129
72
|
image: ollama/ollama:latest
|
|
@@ -144,78 +87,11 @@ services:
|
|
|
144
87
|
networks:
|
|
145
88
|
- profclaw-network
|
|
146
89
|
|
|
147
|
-
# ===================
|
|
148
|
-
# Redis Commander (Dev Tools)
|
|
149
|
-
# ===================
|
|
150
|
-
redis-commander:
|
|
151
|
-
image: rediscommander/redis-commander:latest
|
|
152
|
-
container_name: profclaw-redis-ui
|
|
153
|
-
environment:
|
|
154
|
-
- REDIS_HOSTS=profclaw:redis:6379
|
|
155
|
-
ports:
|
|
156
|
-
- "${REDIS_COMMANDER_PORT:-8081}:8081"
|
|
157
|
-
depends_on:
|
|
158
|
-
redis:
|
|
159
|
-
condition: service_healthy
|
|
160
|
-
profiles:
|
|
161
|
-
- tools
|
|
162
|
-
networks:
|
|
163
|
-
- profclaw-network
|
|
164
|
-
|
|
165
|
-
# ===================
|
|
166
|
-
# Prometheus (Metrics)
|
|
167
|
-
# ===================
|
|
168
|
-
prometheus:
|
|
169
|
-
image: prom/prometheus:latest
|
|
170
|
-
container_name: profclaw-prometheus
|
|
171
|
-
ports:
|
|
172
|
-
- "${PROMETHEUS_PORT:-9090}:9090"
|
|
173
|
-
volumes:
|
|
174
|
-
- ./docker/prometheus.yml:/etc/prometheus/prometheus.yml:ro
|
|
175
|
-
- prometheus-data:/prometheus
|
|
176
|
-
command:
|
|
177
|
-
- '--config.file=/etc/prometheus/prometheus.yml'
|
|
178
|
-
- '--storage.tsdb.path=/prometheus'
|
|
179
|
-
- '--storage.tsdb.retention.time=15d'
|
|
180
|
-
profiles:
|
|
181
|
-
- monitoring
|
|
182
|
-
networks:
|
|
183
|
-
- profclaw-network
|
|
184
|
-
|
|
185
|
-
# ===================
|
|
186
|
-
# Grafana (Dashboards)
|
|
187
|
-
# ===================
|
|
188
|
-
grafana:
|
|
189
|
-
image: grafana/grafana:latest
|
|
190
|
-
container_name: profclaw-grafana
|
|
191
|
-
ports:
|
|
192
|
-
- "${GRAFANA_PORT:-3001}:3000"
|
|
193
|
-
environment:
|
|
194
|
-
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD:-admin}
|
|
195
|
-
- GF_USERS_ALLOW_SIGN_UP=false
|
|
196
|
-
volumes:
|
|
197
|
-
- grafana-data:/var/lib/grafana
|
|
198
|
-
- ./docker/grafana/provisioning:/etc/grafana/provisioning:ro
|
|
199
|
-
depends_on:
|
|
200
|
-
- prometheus
|
|
201
|
-
profiles:
|
|
202
|
-
- monitoring
|
|
203
|
-
networks:
|
|
204
|
-
- profclaw-network
|
|
205
|
-
|
|
206
90
|
volumes:
|
|
207
|
-
profclaw-data:
|
|
208
|
-
driver: local
|
|
209
91
|
redis-data:
|
|
210
92
|
driver: local
|
|
211
|
-
workspace:
|
|
212
|
-
driver: local
|
|
213
93
|
ollama-data:
|
|
214
94
|
driver: local
|
|
215
|
-
prometheus-data:
|
|
216
|
-
driver: local
|
|
217
|
-
grafana-data:
|
|
218
|
-
driver: local
|
|
219
95
|
|
|
220
96
|
networks:
|
|
221
97
|
profclaw-network:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "profclaw",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"description": "Smart, lightweight AI agent engine -- run locally on anything from a $10 board to a VPS",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -47,7 +47,8 @@
|
|
|
47
47
|
"dev:api": "tsx watch src/server.ts",
|
|
48
48
|
"dev:ui": "pnpm --dir ui dev",
|
|
49
49
|
"kill:ports": "lsof -ti :3000 | xargs kill -9 2>/dev/null || true; lsof -ti :5173 | xargs kill -9 2>/dev/null || true",
|
|
50
|
-
"build": "tsc && pnpm --dir ui build",
|
|
50
|
+
"build": "tsc --skipLibCheck && pnpm --dir ui build",
|
|
51
|
+
"build:backend": "tsc",
|
|
51
52
|
"prepublishOnly": "pnpm build",
|
|
52
53
|
"start": "node dist/server.js",
|
|
53
54
|
"profclaw": "node profclaw.mjs",
|
|
@@ -104,11 +105,11 @@
|
|
|
104
105
|
"@ai-sdk/azure": "^3.0.26",
|
|
105
106
|
"@ai-sdk/google": "^3.0.20",
|
|
106
107
|
"@ai-sdk/openai": "^3.0.25",
|
|
107
|
-
"@hono/node-server": "^1.
|
|
108
|
+
"@hono/node-server": "^1.19.10",
|
|
108
109
|
"@hono/zod-validator": "^0.4.3",
|
|
109
110
|
"@inquirer/prompts": "^8.3.0",
|
|
110
111
|
"@libsql/client": "^0.17.0",
|
|
111
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
112
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
112
113
|
"ai": "^6.0.68",
|
|
113
114
|
"ai-sdk-ollama": "^3.3.0",
|
|
114
115
|
"bullmq": "^5.34.8",
|
|
@@ -119,34 +120,58 @@
|
|
|
119
120
|
"dockerode": "^4.0.9",
|
|
120
121
|
"drizzle-orm": "^0.39.1",
|
|
121
122
|
"figlet": "^1.8.0",
|
|
123
|
+
"glin-profanity": "^3.3.0",
|
|
122
124
|
"glob": "^13.0.1",
|
|
123
|
-
"hono": "^4.
|
|
125
|
+
"hono": "^4.12.7",
|
|
126
|
+
"ink": "^5.2.1",
|
|
127
|
+
"ink-select-input": "^6.2.0",
|
|
128
|
+
"ink-spinner": "^5.0.0",
|
|
129
|
+
"ink-table": "^3.0.0",
|
|
130
|
+
"ink-text-input": "^6.0.0",
|
|
124
131
|
"ioredis": "^5.4.2",
|
|
125
132
|
"js-yaml": "^4.1.1",
|
|
126
|
-
"minimatch": "^10.
|
|
133
|
+
"minimatch": "^10.2.3",
|
|
127
134
|
"node-pty": "^1.1.0",
|
|
128
135
|
"openai": "^6.17.0",
|
|
129
136
|
"ora": "^8.1.1",
|
|
130
137
|
"playwright-core": "^1.58.1",
|
|
131
138
|
"postgres": "^3.4.5",
|
|
132
139
|
"proper-lockfile": "^4.1.2",
|
|
140
|
+
"react": "^18.3.1",
|
|
133
141
|
"sqlite-vec": "0.1.7-alpha.2",
|
|
134
142
|
"sqlite3": "^5.1.7",
|
|
135
143
|
"zod": "^3.24.1",
|
|
136
144
|
"zod-to-json-schema": "^3.25.1"
|
|
137
145
|
},
|
|
146
|
+
"pnpm": {
|
|
147
|
+
"overrides": {
|
|
148
|
+
"tar": ">=7.5.11",
|
|
149
|
+
"minimatch": ">=10.2.3",
|
|
150
|
+
"rollup": ">=4.59.0",
|
|
151
|
+
"flatted": ">=3.4.2",
|
|
152
|
+
"esbuild": ">=0.25.0",
|
|
153
|
+
"prismjs": ">=1.30.0",
|
|
154
|
+
"markdown-it": ">=14.1.1",
|
|
155
|
+
"qs": ">=6.14.2",
|
|
156
|
+
"@types/react": "^19.2.5",
|
|
157
|
+
"@types/react-dom": "^19.2.3"
|
|
158
|
+
}
|
|
159
|
+
},
|
|
138
160
|
"devDependencies": {
|
|
139
161
|
"@types/dockerode": "^4.0.1",
|
|
140
162
|
"@types/figlet": "^1.7.0",
|
|
141
163
|
"@types/js-yaml": "^4.0.9",
|
|
142
164
|
"@types/node": "^22.10.7",
|
|
143
165
|
"@types/proper-lockfile": "^4.1.4",
|
|
166
|
+
"@types/react": "^19.2.5",
|
|
144
167
|
"@types/sqlite3": "^5.1.0",
|
|
145
168
|
"@vitest/coverage-v8": "^4.0.18",
|
|
146
169
|
"@vitest/ui": "^4.0.18",
|
|
170
|
+
"ajv": "8.17.1",
|
|
147
171
|
"concurrently": "^9.1.2",
|
|
148
172
|
"drizzle-kit": "^0.30.2",
|
|
149
173
|
"eslint": "^9.18.0",
|
|
174
|
+
"ink-testing-library": "^4.0.0",
|
|
150
175
|
"tsx": "^4.19.2",
|
|
151
176
|
"typescript": "^5.7.3",
|
|
152
177
|
"typescript-eslint": "^8.54.0",
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: deploy-cloudflare
|
|
3
|
+
description: |
|
|
4
|
+
Deploy applications to Cloudflare Workers/Pages. Handles wrangler setup,
|
|
5
|
+
configuration, and deployment. Returns the live URL.
|
|
6
|
+
user-invocable: true
|
|
7
|
+
metadata:
|
|
8
|
+
profclaw:
|
|
9
|
+
emoji: "☁️"
|
|
10
|
+
category: deployment
|
|
11
|
+
requires:
|
|
12
|
+
bins: ["wrangler"]
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Deploy to Cloudflare
|
|
16
|
+
|
|
17
|
+
Deploy to Cloudflare Workers (APIs/functions) or Pages (static/SSR sites).
|
|
18
|
+
|
|
19
|
+
## When to Use
|
|
20
|
+
- User asks to deploy to Cloudflare
|
|
21
|
+
- User wants edge/serverless deployment
|
|
22
|
+
- Project is a Hono/Express API, static site, or Next.js/Remix/Astro
|
|
23
|
+
|
|
24
|
+
## Workers (API/Backend)
|
|
25
|
+
|
|
26
|
+
### 1. Generate wrangler.toml
|
|
27
|
+
```toml
|
|
28
|
+
name = "my-app"
|
|
29
|
+
main = "src/index.ts"
|
|
30
|
+
compatibility_date = "2024-01-01"
|
|
31
|
+
|
|
32
|
+
[vars]
|
|
33
|
+
ENVIRONMENT = "production"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 2. Deploy
|
|
37
|
+
```bash
|
|
38
|
+
exec command:"wrangler deploy"
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
URL: `https://my-app.<account>.workers.dev`
|
|
42
|
+
|
|
43
|
+
## Pages (Frontend/SSR)
|
|
44
|
+
|
|
45
|
+
### 1. Build the project
|
|
46
|
+
```bash
|
|
47
|
+
exec command:"pnpm build"
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 2. Deploy
|
|
51
|
+
```bash
|
|
52
|
+
exec command:"wrangler pages deploy dist"
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
URL: `https://my-app.pages.dev`
|
|
56
|
+
|
|
57
|
+
## After Deploy
|
|
58
|
+
Tell the user:
|
|
59
|
+
1. The live URL (*.workers.dev or *.pages.dev)
|
|
60
|
+
2. Custom domain: `wrangler pages domains add my-app example.com`
|
|
61
|
+
3. Logs: `wrangler tail` (real-time)
|
|
62
|
+
4. Env vars: `wrangler secret put API_KEY`
|