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,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
|
|
@@ -0,0 +1,208 @@
|
|
|
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
|
+
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
8
|
+
const CODE_PATTERNS = [
|
|
9
|
+
/```[\w]*\n/,
|
|
10
|
+
/function\s+\w+/,
|
|
11
|
+
/class\s+\w+/,
|
|
12
|
+
/const\s+\w+\s*=/,
|
|
13
|
+
/import\s+/,
|
|
14
|
+
/export\s+/,
|
|
15
|
+
/\.(ts|js|tsx|jsx|py|go|rs|java)\b/,
|
|
16
|
+
/\bcode\b/i,
|
|
17
|
+
/\bimplementation\b/i,
|
|
18
|
+
/\brefactor\b/i,
|
|
19
|
+
];
|
|
20
|
+
const ERROR_PATTERNS = [
|
|
21
|
+
/\berror\b/i,
|
|
22
|
+
/\bfailed\b/i,
|
|
23
|
+
/\bfailure\b/i,
|
|
24
|
+
/\bexception\b/i,
|
|
25
|
+
/\bthrew\b/i,
|
|
26
|
+
/\bcrash\b/i,
|
|
27
|
+
/\bundefined\b/i,
|
|
28
|
+
/\bnull\b/i,
|
|
29
|
+
/\btrace\b/i,
|
|
30
|
+
/\bstack\b/i,
|
|
31
|
+
];
|
|
32
|
+
const FILE_EDIT_PATTERNS = [
|
|
33
|
+
/\bedited\b/i,
|
|
34
|
+
/\bmodified\b/i,
|
|
35
|
+
/\bupdated\b/i,
|
|
36
|
+
/\bwrote\b/i,
|
|
37
|
+
/\bchanged\b/i,
|
|
38
|
+
/\bsaved\b/i,
|
|
39
|
+
/\bfile\b/i,
|
|
40
|
+
];
|
|
41
|
+
const CONCEPT_PATTERNS = [
|
|
42
|
+
/\bexplain\b/i,
|
|
43
|
+
/\bhow\s+does\b/i,
|
|
44
|
+
/\bwhat\s+is\b/i,
|
|
45
|
+
/\bwhy\b/i,
|
|
46
|
+
/\bwhen\s+should\b/i,
|
|
47
|
+
/\bdifference\b/i,
|
|
48
|
+
];
|
|
49
|
+
function containsAny(text, patterns) {
|
|
50
|
+
return patterns.some((p) => p.test(text));
|
|
51
|
+
}
|
|
52
|
+
/** Extract a plausible code subject from the assistant message (best-effort). */
|
|
53
|
+
function extractCodeSubject(response) {
|
|
54
|
+
// Try to find a function/class name
|
|
55
|
+
const fnMatch = response.match(/function\s+(\w+)/);
|
|
56
|
+
if (fnMatch)
|
|
57
|
+
return fnMatch[1] ?? 'this';
|
|
58
|
+
const classMatch = response.match(/class\s+(\w+)/);
|
|
59
|
+
if (classMatch)
|
|
60
|
+
return classMatch[1] ?? 'this';
|
|
61
|
+
const constMatch = response.match(/const\s+(\w+)\s*=/);
|
|
62
|
+
if (constMatch)
|
|
63
|
+
return constMatch[1] ?? 'this';
|
|
64
|
+
return 'this';
|
|
65
|
+
}
|
|
66
|
+
/** Extract the first tool name from the list or a default. */
|
|
67
|
+
function extractToolName(tools) {
|
|
68
|
+
return tools[0] ?? 'this tool';
|
|
69
|
+
}
|
|
70
|
+
// ── Engine ────────────────────────────────────────────────────────────────────
|
|
71
|
+
export class PromptSuggestionEngine {
|
|
72
|
+
/**
|
|
73
|
+
* Generate up to 3 contextual follow-up suggestions.
|
|
74
|
+
*
|
|
75
|
+
* Rules (local, no LLM):
|
|
76
|
+
* - If assistant mentioned code → "Can you explain X?" or "Write tests for this"
|
|
77
|
+
* - If assistant used tools → "What else can you do with {tool}?"
|
|
78
|
+
* - If short conversation → exploratory prompts
|
|
79
|
+
* - If error was mentioned → "How do I fix this?" or "What caused this?"
|
|
80
|
+
* - If file was edited → "Show me the diff" or "Run the tests"
|
|
81
|
+
* - Vary by conversation length (early = broad, late = specific)
|
|
82
|
+
* - Always cap at 3
|
|
83
|
+
*/
|
|
84
|
+
generateSuggestions(context) {
|
|
85
|
+
const { lastUserMessage, lastAssistantResponse, toolsUsed = [], conversationLength } = context;
|
|
86
|
+
const combined = lastUserMessage + ' ' + lastAssistantResponse;
|
|
87
|
+
const suggestions = [];
|
|
88
|
+
const hasCode = containsAny(combined, CODE_PATTERNS);
|
|
89
|
+
const hasError = containsAny(combined, ERROR_PATTERNS);
|
|
90
|
+
const hasFileEdit = containsAny(combined, FILE_EDIT_PATTERNS);
|
|
91
|
+
const hasTools = toolsUsed.length > 0;
|
|
92
|
+
const hasConcept = containsAny(combined, CONCEPT_PATTERNS);
|
|
93
|
+
const isEarlyConversation = conversationLength <= 4;
|
|
94
|
+
// --- Error-related suggestions (highest priority) ---
|
|
95
|
+
if (hasError) {
|
|
96
|
+
suggestions.push({
|
|
97
|
+
text: 'How do I fix this error?',
|
|
98
|
+
category: 'follow-up',
|
|
99
|
+
});
|
|
100
|
+
suggestions.push({
|
|
101
|
+
text: 'What caused this error and how can I prevent it?',
|
|
102
|
+
category: 'deeper',
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
// --- File edit suggestions ---
|
|
106
|
+
if (hasFileEdit && !hasError) {
|
|
107
|
+
suggestions.push({
|
|
108
|
+
text: '/diff',
|
|
109
|
+
category: 'action',
|
|
110
|
+
});
|
|
111
|
+
suggestions.push({
|
|
112
|
+
text: 'Run the tests to verify the changes',
|
|
113
|
+
category: 'action',
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
// --- Code-related suggestions ---
|
|
117
|
+
if (hasCode && !hasError) {
|
|
118
|
+
const subject = extractCodeSubject(lastAssistantResponse);
|
|
119
|
+
suggestions.push({
|
|
120
|
+
text: `Can you explain how ${subject} works?`,
|
|
121
|
+
category: 'deeper',
|
|
122
|
+
});
|
|
123
|
+
suggestions.push({
|
|
124
|
+
text: 'Write tests for this',
|
|
125
|
+
category: 'action',
|
|
126
|
+
});
|
|
127
|
+
if (conversationLength > 4) {
|
|
128
|
+
suggestions.push({
|
|
129
|
+
text: 'Optimize this for performance',
|
|
130
|
+
category: 'related',
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// --- Tool usage suggestions ---
|
|
135
|
+
if (hasTools && !hasError) {
|
|
136
|
+
const toolName = extractToolName(toolsUsed);
|
|
137
|
+
suggestions.push({
|
|
138
|
+
text: `What else can you do with ${toolName}?`,
|
|
139
|
+
category: 'related',
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
// --- Concept / explanation suggestions ---
|
|
143
|
+
if (hasConcept && !hasError && !hasCode) {
|
|
144
|
+
suggestions.push({
|
|
145
|
+
text: 'Can you give me a concrete example?',
|
|
146
|
+
category: 'follow-up',
|
|
147
|
+
});
|
|
148
|
+
suggestions.push({
|
|
149
|
+
text: 'What are the trade-offs?',
|
|
150
|
+
category: 'deeper',
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
// --- Early conversation: broad exploratory prompts ---
|
|
154
|
+
if (isEarlyConversation && suggestions.length < 2) {
|
|
155
|
+
suggestions.push({
|
|
156
|
+
text: 'What else can you help me with?',
|
|
157
|
+
category: 'related',
|
|
158
|
+
});
|
|
159
|
+
suggestions.push({
|
|
160
|
+
text: 'Can you elaborate on that?',
|
|
161
|
+
category: 'follow-up',
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
// --- Late conversation: specific follow-up ---
|
|
165
|
+
if (!isEarlyConversation && suggestions.length < 2) {
|
|
166
|
+
suggestions.push({
|
|
167
|
+
text: 'Summarize what we have done so far',
|
|
168
|
+
category: 'follow-up',
|
|
169
|
+
});
|
|
170
|
+
suggestions.push({
|
|
171
|
+
text: 'What should we do next?',
|
|
172
|
+
category: 'action',
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
// --- Always ensure at least 2 sensible defaults ---
|
|
176
|
+
if (suggestions.length === 0) {
|
|
177
|
+
suggestions.push({
|
|
178
|
+
text: 'Tell me more about this',
|
|
179
|
+
category: 'follow-up',
|
|
180
|
+
});
|
|
181
|
+
suggestions.push({
|
|
182
|
+
text: 'How does this compare to alternatives?',
|
|
183
|
+
category: 'related',
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
// Cap at 3, deduplicate by text
|
|
187
|
+
const seen = new Set();
|
|
188
|
+
const unique = [];
|
|
189
|
+
for (const s of suggestions) {
|
|
190
|
+
if (!seen.has(s.text)) {
|
|
191
|
+
seen.add(s.text);
|
|
192
|
+
unique.push(s);
|
|
193
|
+
}
|
|
194
|
+
if (unique.length === 3)
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
return unique;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// ── Singleton ─────────────────────────────────────────────────────────────────
|
|
201
|
+
let _engine = null;
|
|
202
|
+
export function getPromptSuggestionEngine() {
|
|
203
|
+
if (!_engine) {
|
|
204
|
+
_engine = new PromptSuggestionEngine();
|
|
205
|
+
}
|
|
206
|
+
return _engine;
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=prompt-suggestions.js.map
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate Limit Monitor
|
|
3
|
+
*
|
|
4
|
+
* Tracks API rate limit state per provider by parsing standard x-ratelimit-*
|
|
5
|
+
* response headers. Surfaces warnings when usage thresholds are reached and
|
|
6
|
+
* can suggest alternative providers when limits are critical.
|
|
7
|
+
*/
|
|
8
|
+
export interface RateLimitState {
|
|
9
|
+
provider: string;
|
|
10
|
+
model: string;
|
|
11
|
+
requestsUsed: number;
|
|
12
|
+
requestsLimit?: number;
|
|
13
|
+
tokensUsed: number;
|
|
14
|
+
tokensLimit?: number;
|
|
15
|
+
/** Unix timestamp (ms) when limits reset */
|
|
16
|
+
resetAt?: number;
|
|
17
|
+
warningLevel: 'none' | 'info' | 'warning' | 'critical';
|
|
18
|
+
}
|
|
19
|
+
export interface WarnResult {
|
|
20
|
+
warn: boolean;
|
|
21
|
+
message: string;
|
|
22
|
+
level: RateLimitState['warningLevel'];
|
|
23
|
+
}
|
|
24
|
+
export declare class RateLimitMonitor {
|
|
25
|
+
private states;
|
|
26
|
+
constructor();
|
|
27
|
+
/**
|
|
28
|
+
* Update rate limit state from API response headers.
|
|
29
|
+
* Parses the standard x-ratelimit-* header set used by OpenAI-compatible APIs
|
|
30
|
+
* and Anthropic:
|
|
31
|
+
* x-ratelimit-limit-requests
|
|
32
|
+
* x-ratelimit-remaining-requests
|
|
33
|
+
* x-ratelimit-limit-tokens
|
|
34
|
+
* x-ratelimit-remaining-tokens
|
|
35
|
+
* x-ratelimit-reset-requests
|
|
36
|
+
* x-ratelimit-reset-tokens
|
|
37
|
+
*/
|
|
38
|
+
updateFromHeaders(provider: string, headers: Record<string, string>): void;
|
|
39
|
+
/** Get current rate limit state for a provider. */
|
|
40
|
+
getState(provider: string): RateLimitState | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* Check whether the user should be warned about rate limit usage.
|
|
43
|
+
* Returns the highest-severity warning across requests and tokens.
|
|
44
|
+
*/
|
|
45
|
+
shouldWarn(provider: string): WarnResult;
|
|
46
|
+
/**
|
|
47
|
+
* Suggest an alternative provider when the given provider is at a high usage level.
|
|
48
|
+
* Returns undefined if no switch is recommended.
|
|
49
|
+
*/
|
|
50
|
+
suggestAlternative(provider: string, availableProviders: string[]): string | undefined;
|
|
51
|
+
/** Return a snapshot of all tracked provider states. */
|
|
52
|
+
getAll(): RateLimitState[];
|
|
53
|
+
private getOrCreate;
|
|
54
|
+
}
|
|
55
|
+
export declare function getRateLimitMonitor(): RateLimitMonitor;
|
|
56
|
+
//# sourceMappingURL=rate-limit-monitor.d.ts.map
|