profclaw 2.0.0 → 2.4.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 +52 -0
- package/CONTRIBUTING.md +20 -0
- package/Dockerfile +39 -23
- package/README.md +178 -41
- package/config/pricing.yml +26 -2
- 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/command-sandbox.d.ts +93 -0
- package/dist/agents/command-sandbox.js +235 -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-runner.d.ts +135 -0
- package/dist/agents/executor-runner.js +303 -0
- package/dist/agents/executor.d.ts +37 -1
- package/dist/agents/executor.js +606 -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/output-truncator.d.ts +59 -0
- package/dist/agents/output-truncator.js +128 -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/receipt/receipt-cli.d.ts +43 -0
- package/dist/agents/receipt/receipt-cli.js +82 -0
- package/dist/agents/receipt/receipt-types.d.ts +136 -0
- package/dist/agents/receipt/receipt-types.js +19 -0
- package/dist/agents/receipt/receipt-verify.d.ts +19 -0
- package/dist/agents/receipt/receipt-verify.js +176 -0
- package/dist/agents/receipt/receipt-view.d.ts +29 -0
- package/dist/agents/receipt/receipt-view.js +227 -0
- package/dist/agents/receipt/receipt-writer.d.ts +47 -0
- package/dist/agents/receipt/receipt-writer.js +186 -0
- package/dist/agents/result-store.d.ts +43 -0
- package/dist/agents/result-store.js +145 -0
- package/dist/agents/session-diff.d.ts +49 -0
- package/dist/agents/session-diff.js +249 -0
- package/dist/agents/tool-loader.d.ts +65 -0
- package/dist/agents/tool-loader.js +273 -0
- package/dist/agents/tool-selector.d.ts +123 -0
- package/dist/agents/tool-selector.js +321 -0
- package/dist/agents/transcript.d.ts +96 -0
- package/dist/agents/transcript.js +267 -0
- package/dist/agents/verified-run-git.d.ts +49 -0
- package/dist/agents/verified-run-git.js +82 -0
- package/dist/agents/verified-run.d.ts +149 -0
- package/dist/agents/verified-run.js +402 -0
- package/dist/agents/verifier.d.ts +64 -0
- package/dist/agents/verifier.js +186 -0
- package/dist/agents/worktree-manager.d.ts +80 -0
- package/dist/agents/worktree-manager.js +203 -0
- package/dist/agents/worktree-tools.d.ts +47 -0
- package/dist/agents/worktree-tools.js +246 -0
- package/dist/auth/middleware.js +14 -0
- package/dist/chat/agentic-executor.d.ts +7 -0
- package/dist/chat/agentic-executor.js +263 -32
- 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/sandbox.d.ts +8 -0
- package/dist/chat/execution/sandbox.js +25 -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/tools/tts-speak.d.ts +2 -2
- 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/meta-tool-handlers.d.ts +18 -0
- package/dist/chat/meta-tool-handlers.js +51 -0
- 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 +121 -61
- package/dist/chat/tool-handler.d.ts +2 -0
- package/dist/chat/tool-handler.js +47 -3
- 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/receipt.d.ts +7 -0
- package/dist/cli/commands/receipt.js +90 -0
- package/dist/cli/commands/run.d.ts +28 -0
- package/dist/cli/commands/run.js +204 -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 +23 -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/costs/token-tracker.d.ts +10 -1
- package/dist/costs/token-tracker.js +37 -5
- 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 +111 -56
- package/dist/providers/core/models.js +114 -6
- package/dist/providers/core/types.d.ts +7 -0
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.js +1 -0
- package/dist/providers/prompt-cache.d.ts +68 -0
- package/dist/providers/prompt-cache.js +165 -0
- package/dist/providers/smart-router.d.ts +118 -0
- package/dist/providers/smart-router.js +693 -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 +280 -18
- 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 +313 -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,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission Dialog System
|
|
3
|
+
*
|
|
4
|
+
* Manages per-session tool permissions with configurable rules.
|
|
5
|
+
* Dangerous tools always prompt; cautious tools prompt once then remember;
|
|
6
|
+
* safe tools (or unknown tools) are auto-allowed.
|
|
7
|
+
*/
|
|
8
|
+
export type PermissionLevel = 'safe' | 'cautious' | 'dangerous';
|
|
9
|
+
export type PermissionResponse = 'allow' | 'deny' | 'always_allow' | 'always_deny';
|
|
10
|
+
export interface PermissionRule {
|
|
11
|
+
toolName: string;
|
|
12
|
+
level: PermissionLevel;
|
|
13
|
+
reason: string;
|
|
14
|
+
}
|
|
15
|
+
export interface PermissionState {
|
|
16
|
+
/** Tools permanently allowed for this session */
|
|
17
|
+
autoAllow: Set<string>;
|
|
18
|
+
/** Tools permanently denied for this session */
|
|
19
|
+
autoDeny: Set<string>;
|
|
20
|
+
}
|
|
21
|
+
export interface PermissionCheckResult {
|
|
22
|
+
allowed: boolean;
|
|
23
|
+
reason?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare const DEFAULT_PERMISSION_RULES: PermissionRule[];
|
|
26
|
+
type PromptCallback = (toolName: string, args: unknown, rule: PermissionRule) => Promise<PermissionResponse>;
|
|
27
|
+
export declare class PermissionManager {
|
|
28
|
+
private state;
|
|
29
|
+
private rules;
|
|
30
|
+
private promptCallback?;
|
|
31
|
+
constructor(rules?: PermissionRule[]);
|
|
32
|
+
/**
|
|
33
|
+
* Register the interactive prompt callback.
|
|
34
|
+
* Without this, all tools (including dangerous ones) are allowed — non-interactive mode.
|
|
35
|
+
*/
|
|
36
|
+
setPromptCallback(cb: PromptCallback): void;
|
|
37
|
+
/**
|
|
38
|
+
* Check whether a tool call is permitted.
|
|
39
|
+
*
|
|
40
|
+
* Resolution order:
|
|
41
|
+
* 1. autoAllow set → allowed immediately
|
|
42
|
+
* 2. autoDeny set → denied immediately
|
|
43
|
+
* 3. No rule / safe → allowed
|
|
44
|
+
* 4. cautious/dangerous → invoke promptCallback
|
|
45
|
+
* - allow → allow once
|
|
46
|
+
* - deny → deny once
|
|
47
|
+
* - always_allow → add to autoAllow, allow
|
|
48
|
+
* - always_deny → add to autoDeny, deny
|
|
49
|
+
* 5. No callback registered → allow (non-interactive)
|
|
50
|
+
*/
|
|
51
|
+
check(toolName: string, args?: unknown): Promise<PermissionCheckResult>;
|
|
52
|
+
/**
|
|
53
|
+
* Return the permission level for a tool, or 'safe' if no rule exists.
|
|
54
|
+
*/
|
|
55
|
+
getLevel(toolName: string): PermissionLevel;
|
|
56
|
+
/**
|
|
57
|
+
* Clear session-level autoAllow/autoDeny sets.
|
|
58
|
+
* Useful when starting a fresh session without constructing a new manager.
|
|
59
|
+
*/
|
|
60
|
+
reset(): void;
|
|
61
|
+
}
|
|
62
|
+
export {};
|
|
63
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission Dialog System
|
|
3
|
+
*
|
|
4
|
+
* Manages per-session tool permissions with configurable rules.
|
|
5
|
+
* Dangerous tools always prompt; cautious tools prompt once then remember;
|
|
6
|
+
* safe tools (or unknown tools) are auto-allowed.
|
|
7
|
+
*/
|
|
8
|
+
import { createContextualLogger } from '../utils/logger.js';
|
|
9
|
+
const log = createContextualLogger('PermissionManager');
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Default rules
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
export const DEFAULT_PERMISSION_RULES = [
|
|
14
|
+
// Dangerous — always ask
|
|
15
|
+
{ toolName: 'bash', level: 'dangerous', reason: 'Executes arbitrary shell commands' },
|
|
16
|
+
{ toolName: 'exec', level: 'dangerous', reason: 'Executes arbitrary shell commands' },
|
|
17
|
+
{ toolName: 'delete_file', level: 'dangerous', reason: 'Permanently deletes files' },
|
|
18
|
+
{ toolName: 'git_push', level: 'dangerous', reason: 'Pushes changes to remote repository' },
|
|
19
|
+
{
|
|
20
|
+
toolName: 'git_force_push',
|
|
21
|
+
level: 'dangerous',
|
|
22
|
+
reason: 'Force pushes, potentially losing remote changes',
|
|
23
|
+
},
|
|
24
|
+
// Cautious — ask first time, then remember
|
|
25
|
+
{ toolName: 'write_file', level: 'cautious', reason: 'Modifies files on disk' },
|
|
26
|
+
{ toolName: 'patch_file', level: 'cautious', reason: 'Modifies files on disk' },
|
|
27
|
+
{ toolName: 'move_file', level: 'cautious', reason: 'Moves/renames files' },
|
|
28
|
+
{ toolName: 'git_commit', level: 'cautious', reason: 'Creates git commits' },
|
|
29
|
+
{ toolName: 'git_branch', level: 'cautious', reason: 'Creates/switches git branches' },
|
|
30
|
+
// Safe — auto-allow (read_file, search_files, git_status, git_diff, etc.)
|
|
31
|
+
];
|
|
32
|
+
export class PermissionManager {
|
|
33
|
+
state;
|
|
34
|
+
rules;
|
|
35
|
+
promptCallback;
|
|
36
|
+
constructor(rules = DEFAULT_PERMISSION_RULES) {
|
|
37
|
+
this.state = {
|
|
38
|
+
autoAllow: new Set(),
|
|
39
|
+
autoDeny: new Set(),
|
|
40
|
+
};
|
|
41
|
+
this.rules = new Map();
|
|
42
|
+
for (const rule of rules) {
|
|
43
|
+
this.rules.set(rule.toolName, rule);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Register the interactive prompt callback.
|
|
48
|
+
* Without this, all tools (including dangerous ones) are allowed — non-interactive mode.
|
|
49
|
+
*/
|
|
50
|
+
setPromptCallback(cb) {
|
|
51
|
+
this.promptCallback = cb;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Check whether a tool call is permitted.
|
|
55
|
+
*
|
|
56
|
+
* Resolution order:
|
|
57
|
+
* 1. autoAllow set → allowed immediately
|
|
58
|
+
* 2. autoDeny set → denied immediately
|
|
59
|
+
* 3. No rule / safe → allowed
|
|
60
|
+
* 4. cautious/dangerous → invoke promptCallback
|
|
61
|
+
* - allow → allow once
|
|
62
|
+
* - deny → deny once
|
|
63
|
+
* - always_allow → add to autoAllow, allow
|
|
64
|
+
* - always_deny → add to autoDeny, deny
|
|
65
|
+
* 5. No callback registered → allow (non-interactive)
|
|
66
|
+
*/
|
|
67
|
+
async check(toolName, args) {
|
|
68
|
+
// 1. Session-level auto-allow
|
|
69
|
+
if (this.state.autoAllow.has(toolName)) {
|
|
70
|
+
log.debug('Tool auto-allowed (session rule)', { tool: toolName });
|
|
71
|
+
return { allowed: true };
|
|
72
|
+
}
|
|
73
|
+
// 2. Session-level auto-deny
|
|
74
|
+
if (this.state.autoDeny.has(toolName)) {
|
|
75
|
+
log.info('Tool auto-denied (session rule)', { tool: toolName });
|
|
76
|
+
return { allowed: false, reason: `Tool "${toolName}" has been denied for this session` };
|
|
77
|
+
}
|
|
78
|
+
// 3. Look up permission rule
|
|
79
|
+
const rule = this.rules.get(toolName);
|
|
80
|
+
if (!rule || rule.level === 'safe') {
|
|
81
|
+
return { allowed: true };
|
|
82
|
+
}
|
|
83
|
+
// 4. cautious or dangerous — need user confirmation
|
|
84
|
+
if (!this.promptCallback) {
|
|
85
|
+
// Non-interactive mode: allow but log
|
|
86
|
+
log.warn('No prompt callback registered — allowing tool in non-interactive mode', {
|
|
87
|
+
tool: toolName,
|
|
88
|
+
level: rule.level,
|
|
89
|
+
});
|
|
90
|
+
return { allowed: true };
|
|
91
|
+
}
|
|
92
|
+
log.debug('Prompting user for permission', { tool: toolName, level: rule.level });
|
|
93
|
+
let response;
|
|
94
|
+
try {
|
|
95
|
+
response = await this.promptCallback(toolName, args, rule);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
log.error('[PermissionManager] Prompt callback threw', {
|
|
99
|
+
tool: toolName,
|
|
100
|
+
error: error instanceof Error ? error.message : String(error),
|
|
101
|
+
});
|
|
102
|
+
// Fail-safe: deny on callback error
|
|
103
|
+
return { allowed: false, reason: 'Permission prompt failed' };
|
|
104
|
+
}
|
|
105
|
+
switch (response) {
|
|
106
|
+
case 'allow':
|
|
107
|
+
log.debug('User allowed tool (once)', { tool: toolName });
|
|
108
|
+
return { allowed: true };
|
|
109
|
+
case 'deny':
|
|
110
|
+
log.info('User denied tool (once)', { tool: toolName });
|
|
111
|
+
return { allowed: false, reason: `User denied "${toolName}"` };
|
|
112
|
+
case 'always_allow':
|
|
113
|
+
this.state.autoAllow.add(toolName);
|
|
114
|
+
log.info('User always-allowed tool for session', { tool: toolName });
|
|
115
|
+
return { allowed: true };
|
|
116
|
+
case 'always_deny':
|
|
117
|
+
this.state.autoDeny.add(toolName);
|
|
118
|
+
log.info('User always-denied tool for session', { tool: toolName });
|
|
119
|
+
return { allowed: false, reason: `User permanently denied "${toolName}" for this session` };
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Return the permission level for a tool, or 'safe' if no rule exists.
|
|
124
|
+
*/
|
|
125
|
+
getLevel(toolName) {
|
|
126
|
+
return this.rules.get(toolName)?.level ?? 'safe';
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Clear session-level autoAllow/autoDeny sets.
|
|
130
|
+
* Useful when starting a fresh session without constructing a new manager.
|
|
131
|
+
*/
|
|
132
|
+
reset() {
|
|
133
|
+
this.state.autoAllow.clear();
|
|
134
|
+
this.state.autoDeny.clear();
|
|
135
|
+
log.debug('PermissionManager session state reset');
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plan Mode - Two-phase workflow for agent task planning and execution
|
|
3
|
+
*
|
|
4
|
+
* Provides plan storage and management. Plans are persisted to
|
|
5
|
+
* .profclaw/plans/{id}.json inside the project root (or home dir fallback).
|
|
6
|
+
*/
|
|
7
|
+
export interface PlanStep {
|
|
8
|
+
index: number;
|
|
9
|
+
description: string;
|
|
10
|
+
status: 'pending' | 'in_progress' | 'completed' | 'skipped';
|
|
11
|
+
files?: string[];
|
|
12
|
+
estimatedEffort?: 'small' | 'medium' | 'large';
|
|
13
|
+
}
|
|
14
|
+
export interface Plan {
|
|
15
|
+
id: string;
|
|
16
|
+
taskId?: string;
|
|
17
|
+
title: string;
|
|
18
|
+
steps: PlanStep[];
|
|
19
|
+
status: 'draft' | 'approved' | 'in_progress' | 'completed' | 'rejected';
|
|
20
|
+
rejectionReason?: string;
|
|
21
|
+
createdAt: number;
|
|
22
|
+
approvedAt?: number;
|
|
23
|
+
completedAt?: number;
|
|
24
|
+
}
|
|
25
|
+
export declare class PlanManager {
|
|
26
|
+
private plans;
|
|
27
|
+
private plansDir;
|
|
28
|
+
constructor(projectRoot?: string);
|
|
29
|
+
/** Load all persisted plans from disk into memory */
|
|
30
|
+
private _loadAll;
|
|
31
|
+
/**
|
|
32
|
+
* Create a new plan in draft status.
|
|
33
|
+
*/
|
|
34
|
+
create(title: string, steps: Omit<PlanStep, 'status'>[]): Plan;
|
|
35
|
+
/**
|
|
36
|
+
* Approve a draft plan, transitioning it to in_progress.
|
|
37
|
+
*/
|
|
38
|
+
approve(planId: string): Plan;
|
|
39
|
+
/**
|
|
40
|
+
* Reject a draft plan.
|
|
41
|
+
*/
|
|
42
|
+
reject(planId: string, reason?: string): Plan;
|
|
43
|
+
/**
|
|
44
|
+
* Update the status of a specific step. Automatically marks the plan as
|
|
45
|
+
* completed when all steps are either completed or skipped.
|
|
46
|
+
*/
|
|
47
|
+
updateStep(planId: string, stepIndex: number, status: PlanStep['status']): Plan;
|
|
48
|
+
/**
|
|
49
|
+
* Get a plan by ID. Returns undefined if not found.
|
|
50
|
+
*/
|
|
51
|
+
get(planId: string): Plan | undefined;
|
|
52
|
+
/**
|
|
53
|
+
* Returns the currently active (in_progress) plan, if any.
|
|
54
|
+
*/
|
|
55
|
+
getActive(): Plan | undefined;
|
|
56
|
+
/**
|
|
57
|
+
* Returns all plans, sorted newest first.
|
|
58
|
+
*/
|
|
59
|
+
list(): Plan[];
|
|
60
|
+
/**
|
|
61
|
+
* Persist a plan to .profclaw/plans/{id}.json
|
|
62
|
+
*/
|
|
63
|
+
save(plan: Plan): void;
|
|
64
|
+
/**
|
|
65
|
+
* Load a single plan from disk by ID.
|
|
66
|
+
*/
|
|
67
|
+
load(planId: string): Plan | undefined;
|
|
68
|
+
private _getOrThrow;
|
|
69
|
+
}
|
|
70
|
+
export declare const planManager: PlanManager;
|
|
71
|
+
//# sourceMappingURL=plan-mode.d.ts.map
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plan Mode - Two-phase workflow for agent task planning and execution
|
|
3
|
+
*
|
|
4
|
+
* Provides plan storage and management. Plans are persisted to
|
|
5
|
+
* .profclaw/plans/{id}.json inside the project root (or home dir fallback).
|
|
6
|
+
*/
|
|
7
|
+
import { randomUUID } from 'node:crypto';
|
|
8
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { homedir } from 'node:os';
|
|
11
|
+
import { logger } from '../utils/logger.js';
|
|
12
|
+
// Helpers
|
|
13
|
+
function resolvePlansDir(projectRoot) {
|
|
14
|
+
const base = projectRoot ?? process.cwd();
|
|
15
|
+
return join(base, '.profclaw', 'plans');
|
|
16
|
+
}
|
|
17
|
+
function ensureDir(dir) {
|
|
18
|
+
if (!existsSync(dir)) {
|
|
19
|
+
mkdirSync(dir, { recursive: true });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// PlanManager
|
|
23
|
+
export class PlanManager {
|
|
24
|
+
plans;
|
|
25
|
+
plansDir;
|
|
26
|
+
constructor(projectRoot) {
|
|
27
|
+
this.plans = new Map();
|
|
28
|
+
this.plansDir = resolvePlansDir(projectRoot ?? homedir());
|
|
29
|
+
this._loadAll();
|
|
30
|
+
}
|
|
31
|
+
/** Load all persisted plans from disk into memory */
|
|
32
|
+
_loadAll() {
|
|
33
|
+
try {
|
|
34
|
+
if (!existsSync(this.plansDir))
|
|
35
|
+
return;
|
|
36
|
+
const files = readdirSync(this.plansDir).filter((f) => f.endsWith('.json'));
|
|
37
|
+
for (const file of files) {
|
|
38
|
+
const planId = file.replace(/\.json$/, '');
|
|
39
|
+
const plan = this.load(planId);
|
|
40
|
+
if (plan) {
|
|
41
|
+
this.plans.set(plan.id, plan);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
logger.warn('[PlanManager] Failed to load plans from disk:', { error: String(err) });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Create a new plan in draft status.
|
|
51
|
+
*/
|
|
52
|
+
create(title, steps) {
|
|
53
|
+
const plan = {
|
|
54
|
+
id: randomUUID(),
|
|
55
|
+
title,
|
|
56
|
+
steps: steps.map((s) => ({ ...s, status: 'pending' })),
|
|
57
|
+
status: 'draft',
|
|
58
|
+
createdAt: Date.now(),
|
|
59
|
+
};
|
|
60
|
+
this.plans.set(plan.id, plan);
|
|
61
|
+
this.save(plan);
|
|
62
|
+
logger.info('[PlanManager] Plan created:', { id: plan.id, title, stepCount: steps.length });
|
|
63
|
+
return plan;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Approve a draft plan, transitioning it to in_progress.
|
|
67
|
+
*/
|
|
68
|
+
approve(planId) {
|
|
69
|
+
const plan = this._getOrThrow(planId);
|
|
70
|
+
if (plan.status !== 'draft') {
|
|
71
|
+
throw new Error(`Plan ${planId} is not in draft status (current: ${plan.status})`);
|
|
72
|
+
}
|
|
73
|
+
const updated = {
|
|
74
|
+
...plan,
|
|
75
|
+
status: 'in_progress',
|
|
76
|
+
approvedAt: Date.now(),
|
|
77
|
+
};
|
|
78
|
+
this.plans.set(planId, updated);
|
|
79
|
+
this.save(updated);
|
|
80
|
+
logger.info('[PlanManager] Plan approved:', { id: planId });
|
|
81
|
+
return updated;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Reject a draft plan.
|
|
85
|
+
*/
|
|
86
|
+
reject(planId, reason) {
|
|
87
|
+
const plan = this._getOrThrow(planId);
|
|
88
|
+
if (plan.status !== 'draft') {
|
|
89
|
+
throw new Error(`Plan ${planId} is not in draft status (current: ${plan.status})`);
|
|
90
|
+
}
|
|
91
|
+
const updated = {
|
|
92
|
+
...plan,
|
|
93
|
+
status: 'rejected',
|
|
94
|
+
rejectionReason: reason,
|
|
95
|
+
};
|
|
96
|
+
this.plans.set(planId, updated);
|
|
97
|
+
this.save(updated);
|
|
98
|
+
logger.info('[PlanManager] Plan rejected:', { id: planId, reason });
|
|
99
|
+
return updated;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Update the status of a specific step. Automatically marks the plan as
|
|
103
|
+
* completed when all steps are either completed or skipped.
|
|
104
|
+
*/
|
|
105
|
+
updateStep(planId, stepIndex, status) {
|
|
106
|
+
const plan = this._getOrThrow(planId);
|
|
107
|
+
const stepIdx = plan.steps.findIndex((s) => s.index === stepIndex);
|
|
108
|
+
if (stepIdx === -1) {
|
|
109
|
+
throw new Error(`Step ${stepIndex} not found in plan ${planId}`);
|
|
110
|
+
}
|
|
111
|
+
const updatedSteps = plan.steps.map((s) => s.index === stepIndex ? { ...s, status } : s);
|
|
112
|
+
const allDone = updatedSteps.every((s) => s.status === 'completed' || s.status === 'skipped');
|
|
113
|
+
const updated = {
|
|
114
|
+
...plan,
|
|
115
|
+
steps: updatedSteps,
|
|
116
|
+
status: allDone ? 'completed' : plan.status,
|
|
117
|
+
completedAt: allDone ? Date.now() : plan.completedAt,
|
|
118
|
+
};
|
|
119
|
+
this.plans.set(planId, updated);
|
|
120
|
+
this.save(updated);
|
|
121
|
+
return updated;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get a plan by ID. Returns undefined if not found.
|
|
125
|
+
*/
|
|
126
|
+
get(planId) {
|
|
127
|
+
return this.plans.get(planId);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Returns the currently active (in_progress) plan, if any.
|
|
131
|
+
*/
|
|
132
|
+
getActive() {
|
|
133
|
+
for (const plan of this.plans.values()) {
|
|
134
|
+
if (plan.status === 'in_progress') {
|
|
135
|
+
return plan;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Returns all plans, sorted newest first.
|
|
142
|
+
*/
|
|
143
|
+
list() {
|
|
144
|
+
return Array.from(this.plans.values()).sort((a, b) => b.createdAt - a.createdAt);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Persist a plan to .profclaw/plans/{id}.json
|
|
148
|
+
*/
|
|
149
|
+
save(plan) {
|
|
150
|
+
try {
|
|
151
|
+
ensureDir(this.plansDir);
|
|
152
|
+
const filePath = join(this.plansDir, `${plan.id}.json`);
|
|
153
|
+
writeFileSync(filePath, JSON.stringify(plan, null, 2), 'utf-8');
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
logger.error('[PlanManager] Failed to save plan:', err);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Load a single plan from disk by ID.
|
|
161
|
+
*/
|
|
162
|
+
load(planId) {
|
|
163
|
+
try {
|
|
164
|
+
const filePath = join(this.plansDir, `${planId}.json`);
|
|
165
|
+
if (!existsSync(filePath))
|
|
166
|
+
return undefined;
|
|
167
|
+
const raw = readFileSync(filePath, 'utf-8');
|
|
168
|
+
return JSON.parse(raw);
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
logger.warn(`[PlanManager] Failed to load plan ${planId}:`, { error: String(err) });
|
|
172
|
+
return undefined;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Private helpers
|
|
176
|
+
_getOrThrow(planId) {
|
|
177
|
+
const plan = this.plans.get(planId);
|
|
178
|
+
if (!plan) {
|
|
179
|
+
throw new Error(`Plan not found: ${planId}`);
|
|
180
|
+
}
|
|
181
|
+
return plan;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Singleton instance used by tools and CLI commands
|
|
185
|
+
export const planManager = new PlanManager();
|
|
186
|
+
//# sourceMappingURL=plan-mode.js.map
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PromptSuggestionEngine
|
|
3
|
+
*
|
|
4
|
+
* Generates contextual follow-up prompt suggestions based on the current
|
|
5
|
+
* conversation context. All logic is local — no LLM calls.
|
|
6
|
+
*/
|
|
7
|
+
export interface Suggestion {
|
|
8
|
+
text: string;
|
|
9
|
+
category: 'follow-up' | 'deeper' | 'related' | 'action';
|
|
10
|
+
}
|
|
11
|
+
export interface SuggestionContext {
|
|
12
|
+
lastUserMessage: string;
|
|
13
|
+
lastAssistantResponse: string;
|
|
14
|
+
toolsUsed?: string[];
|
|
15
|
+
conversationLength: number;
|
|
16
|
+
}
|
|
17
|
+
export declare class PromptSuggestionEngine {
|
|
18
|
+
/**
|
|
19
|
+
* Generate up to 3 contextual follow-up suggestions.
|
|
20
|
+
*
|
|
21
|
+
* Rules (local, no LLM):
|
|
22
|
+
* - If assistant mentioned code → "Can you explain X?" or "Write tests for this"
|
|
23
|
+
* - If assistant used tools → "What else can you do with {tool}?"
|
|
24
|
+
* - If short conversation → exploratory prompts
|
|
25
|
+
* - If error was mentioned → "How do I fix this?" or "What caused this?"
|
|
26
|
+
* - If file was edited → "Show me the diff" or "Run the tests"
|
|
27
|
+
* - Vary by conversation length (early = broad, late = specific)
|
|
28
|
+
* - Always cap at 3
|
|
29
|
+
*/
|
|
30
|
+
generateSuggestions(context: SuggestionContext): Suggestion[];
|
|
31
|
+
}
|
|
32
|
+
export declare function getPromptSuggestionEngine(): PromptSuggestionEngine;
|
|
33
|
+
//# sourceMappingURL=prompt-suggestions.d.ts.map
|