profclaw 0.0.1-beta.3 โ 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 +54 -34
- package/CONTRIBUTING.md +23 -5
- package/Dockerfile +39 -23
- package/README.md +271 -72
- 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 +15 -3
- package/dist/chat/execution/tools/index.js +125 -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/slack/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/models.js +39 -26
- package/dist/cli/commands/onboard.js +263 -98
- 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 +375 -91
- 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 -6
- 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/providers.d.ts +15 -0
- package/dist/cli/providers.js +41 -0
- package/dist/cli/utils/api.d.ts +9 -0
- package/dist/cli/utils/api.js +58 -2
- package/dist/core/deployment.js +2 -0
- 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 +97 -18
- 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/channels.d.ts +12 -0
- package/dist/routes/channels.js +166 -0
- 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 +4 -1
- package/dist/server/stream-bridge.d.ts +19 -0
- package/dist/server/stream-bridge.js +38 -0
- package/dist/server.js +421 -141
- 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/git-workflow/SKILL.md +3 -3
- 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-DlYUcOss.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-CgPqzUvj.js โ Settings-xA8Zhi3p.js} +3 -3
- package/ui/dist/assets/StatusIndicator-B8vfFAxg.js +1 -0
- package/ui/dist/assets/{SummaryDetail-CwLAfHgJ.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-CGck7gxR.js โ archive-CX7UvZpf.js} +1 -1
- package/ui/dist/assets/badge-BbfnwDJP.js +1 -0
- package/ui/dist/assets/{bug-DqSGPUUE.js โ bug-3WX0394-.js} +1 -1
- package/ui/dist/assets/{calendar-BuZ4zbPW.js โ calendar-buq77TaS.js} +1 -1
- package/ui/dist/assets/{chevron-up-DcJ4LL_N.js โ chevron-up-4ymsBJRo.js} +1 -1
- package/ui/dist/assets/{circle-x-C78PNZjF.js โ circle-x-ByXtwR6Y.js} +1 -1
- package/ui/dist/assets/constants-CVdDh7p0.js +1 -0
- package/ui/dist/assets/{cpu-Ck6AoG8c.js โ cpu-CiuoCeDY.js} +1 -1
- package/ui/dist/assets/{database-CA2w8Lvt.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-FhHKRbfl.js โ ellipsis-vT-5SVIp.js} +1 -1
- package/ui/dist/assets/{ellipsis-vertical-CO0UqE4-.js โ ellipsis-vertical-B4tAX_bL.js} +1 -1
- package/ui/dist/assets/feature-markdown-DBo5Q7uq.js +289 -0
- package/ui/dist/assets/{file-code-ChnhYYj1.js โ file-code-ChOWdKXf.js} +1 -1
- package/ui/dist/assets/{folder-open-CHwA1-ve.js โ folder-open-CkOUbIiP.js} +1 -1
- package/ui/dist/assets/{funnel-ByEjRFNB.js โ funnel-uZkoSPP-.js} +1 -1
- package/ui/dist/assets/{git-branch-GTOPQgU4.js โ git-branch-CwvUxj7C.js} +1 -1
- package/ui/dist/assets/{git-commit-horizontal-F5M84Kut.js โ git-commit-horizontal-lxPzCvhD.js} +1 -1
- package/ui/dist/assets/{globe-CQWfr7hT.js โ globe-D_WpJdsj.js} +1 -1
- package/ui/dist/assets/{hash-nKC9gtLg.js โ hash-CA0hJ7vh.js} +1 -1
- package/ui/dist/assets/{history-DfFSA9xJ.js โ history-CEWMLELs.js} +1 -1
- package/ui/dist/assets/inbox-ehtOptTV.js +1 -0
- package/ui/dist/assets/{index-a4Fxq0Hb.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-WmgjMhWF.js โ layout-dashboard-BRUM0kpT.js} +1 -1
- package/ui/dist/assets/{lightbulb-Bo8hEr7B.js โ lightbulb-CN2q1O5l.js} +1 -1
- package/ui/dist/assets/{link-2-YqrpQXBH.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-CD0H5hot.js โ message-square-Bbb241am.js} +1 -1
- package/ui/dist/assets/package-CwT3IzFx.js +1 -0
- package/ui/dist/assets/{pencil-DpFnj5dn.js โ pencil-CDmiHzoj.js} +1 -1
- package/ui/dist/assets/{play-DVgea_jT.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-BFxPYGx9.js โ rocket--8ZHgdXJ.js} +1 -1
- package/ui/dist/assets/select-n108rXny.js +1 -0
- package/ui/dist/assets/{send-eYnW_7n-.js โ send-Cu7MR2Qh.js} +1 -1
- package/ui/dist/assets/server-DmodxZp-.js +1 -0
- package/ui/dist/assets/{settings-2-scXUOuE_.js โ settings-2-CkRNqkxj.js} +1 -1
- package/ui/dist/assets/sheet-7aUJkyzU.js +1 -0
- package/ui/dist/assets/{shield-check-PEr7nmVw.js โ shield-check-ViI3nMKE.js} +1 -1
- package/ui/dist/assets/{shield-off-CLtXio62.js โ shield-off-DN3tagkn.js} +1 -1
- package/ui/dist/assets/skeleton-C0E1Nfro.js +1 -0
- package/ui/dist/assets/{smartphone-DusFfY0U.js โ smartphone-5FghiXpA.js} +1 -1
- package/ui/dist/assets/{square-e1yxB2eR.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-tAwMmQ9G.js โ tag-CH_vQliw.js} +1 -1
- package/ui/dist/assets/textarea-CxDiKFXZ.js +1 -0
- package/ui/dist/assets/{timer-Vel1N3RP.js โ timer-CdGVTb60.js} +1 -1
- package/ui/dist/assets/tooltip-BuW9A5UO.js +1 -0
- package/ui/dist/assets/{trash-2-eM-CNwsZ.js โ trash-2-CucZJL0N.js} +1 -1
- package/ui/dist/assets/trending-down-BCezC1z2.js +1 -0
- package/ui/dist/assets/{trending-up-BGafmjRo.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-DPvcd9Pi.js โ wand-sparkles-BaH6pJnc.js} +1 -1
- package/ui/dist/assets/{wrench-B8s3zYVV.js โ wrench-CjxjP6ok.js} +1 -1
- package/ui/dist/index.html +5 -2
- package/dist/chat/auto-reply.d.ts +0 -90
- package/dist/chat/auto-reply.js +0 -272
- package/dist/chat/execution/pty.d.ts +0 -92
- package/dist/chat/execution/pty.js +0 -285
- package/dist/chat/execution/tools/glinr-ops.d.ts +0 -202
- package/dist/chat/execution/tools/glinr-ops.js +0 -694
- package/dist/cli/commands/browser.d.ts +0 -3
- package/dist/cli/commands/browser.js +0 -138
- package/dist/cli/commands/canvas.d.ts +0 -3
- package/dist/cli/commands/canvas.js +0 -155
- package/dist/cli/commands/nodes.d.ts +0 -3
- package/dist/cli/commands/nodes.js +0 -193
- package/dist/diagnostics/exporters.d.ts +0 -21
- package/dist/diagnostics/exporters.js +0 -138
- package/dist/diagnostics/index.d.ts +0 -10
- package/dist/diagnostics/index.js +0 -9
- package/dist/diagnostics/middleware.d.ts +0 -12
- package/dist/diagnostics/middleware.js +0 -58
- package/dist/diagnostics/tracer.d.ts +0 -133
- package/dist/diagnostics/tracer.js +0 -257
- package/dist/discovery/index.d.ts +0 -8
- package/dist/discovery/index.js +0 -7
- package/dist/discovery/mdns.d.ts +0 -40
- package/dist/discovery/mdns.js +0 -249
- package/dist/plugins/registry.d.ts +0 -122
- package/dist/plugins/registry.js +0 -352
- package/dist/plugins/sandbox.d.ts +0 -77
- package/dist/plugins/sandbox.js +0 -287
- package/dist/plugins/search/brave.d.ts +0 -9
- package/dist/plugins/search/brave.js +0 -157
- package/dist/plugins/search/duckduckgo.d.ts +0 -9
- package/dist/plugins/search/duckduckgo.js +0 -171
- package/dist/plugins/search/index.d.ts +0 -13
- package/dist/plugins/search/index.js +0 -23
- package/dist/plugins/search/searxng.d.ts +0 -9
- package/dist/plugins/search/searxng.js +0 -170
- package/dist/plugins/search/serper.d.ts +0 -9
- package/dist/plugins/search/serper.js +0 -135
- package/dist/plugins/search/tavily.d.ts +0 -9
- package/dist/plugins/search/tavily.js +0 -146
- package/dist/providers/adapters/anthropic.d.ts +0 -26
- package/dist/providers/adapters/anthropic.js +0 -306
- package/dist/providers/adapters/base.d.ts +0 -53
- package/dist/providers/adapters/base.js +0 -99
- package/dist/providers/adapters/ollama.d.ts +0 -30
- package/dist/providers/adapters/ollama.js +0 -292
- package/dist/utils/ai-cache.d.ts +0 -72
- package/dist/utils/ai-cache.js +0 -204
- package/dist/utils/file-lock.d.ts +0 -85
- package/dist/utils/file-lock.js +0 -204
- package/ui/dist/assets/ActivityView-DIPQSJ_d.js +0 -1
- package/ui/dist/assets/AgentList-CqyaYrcq.js +0 -1
- package/ui/dist/assets/AnalyticsDashboard-C-mjuGHT.js +0 -1
- package/ui/dist/assets/AreaChart-CfYWmbtr.js +0 -1
- package/ui/dist/assets/CartesianChart-BaQ3It0c.js +0 -36
- package/ui/dist/assets/ChatView-DxxQy6pl.js +0 -10
- package/ui/dist/assets/CostsDashboard-CDBBcGkg.js +0 -1
- package/ui/dist/assets/EstimateSelect-CDjf5qKl.js +0 -1
- package/ui/dist/assets/FloatingChatbot-CZHjvJIe.js +0 -2
- package/ui/dist/assets/InviteCodeManagement-DTm-IPTm.js +0 -2
- package/ui/dist/assets/ProjectIcon-BMRpnM04.js +0 -1
- package/ui/dist/assets/ProjectList-D85TN0i0.js +0 -4
- package/ui/dist/assets/StatusIndicator-yig0uZEA.js +0 -1
- package/ui/dist/assets/SummaryList-BvS5Idnu.js +0 -1
- package/ui/dist/assets/TaskDetail-zarC1fOt.js +0 -1
- package/ui/dist/assets/TaskList-CyJq3ANE.js +0 -1
- package/ui/dist/assets/TicketBoard-BlWr3-iH.js +0 -1
- package/ui/dist/assets/TicketDetail-DmqWKj2W.js +0 -1
- package/ui/dist/assets/TicketList-Scj4pMWa.js +0 -1
- package/ui/dist/assets/UserManagement-BH7uG7dw.js +0 -2
- package/ui/dist/assets/ViewSwitcher-3HzZUdWn.js +0 -1
- package/ui/dist/assets/alert-dialog-DWPb2IfQ.js +0 -7
- package/ui/dist/assets/badge-DEmc3Z_l.js +0 -1
- package/ui/dist/assets/brain-CfFdLVqb.js +0 -1
- package/ui/dist/assets/constants-DhDjZe4P.js +0 -1
- package/ui/dist/assets/dialog-BOdGWhgE.js +0 -1
- package/ui/dist/assets/index--JkIxVXb.js +0 -67
- package/ui/dist/assets/index-Ca3vk7Gq.js +0 -1
- package/ui/dist/assets/index-DHGvP9mp.js +0 -1
- package/ui/dist/assets/index-DeI8lKRR.js +0 -1
- package/ui/dist/assets/index-WclMPci1.css +0 -1
- package/ui/dist/assets/index-Z4-RtZcs.js +0 -1
- package/ui/dist/assets/layers-DFeLExSa.js +0 -1
- package/ui/dist/assets/markdown-renderer-Croje6Xe.js +0 -36
- package/ui/dist/assets/popover-JXecfWG5.js +0 -1
- package/ui/dist/assets/progress-C1ghf1Fu.js +0 -1
- package/ui/dist/assets/select-MADP8m6Q.js +0 -1
- package/ui/dist/assets/server-CPMaysH8.js +0 -1
- package/ui/dist/assets/sheet-r6NSOxi-.js +0 -1
- package/ui/dist/assets/skeleton-C9oEzNlU.js +0 -1
- package/ui/dist/assets/switch-tNs0n-kz.js +0 -1
- package/ui/dist/assets/table-CXxtLicg.js +0 -1
- package/ui/dist/assets/textarea-BjiEeIWh.js +0 -1
- package/ui/dist/assets/tooltip-ZMwtfr1J.js +0 -1
|
@@ -11,9 +11,9 @@ import { registerBuiltinTools } from '../../chat/execution/tools/index.js';
|
|
|
11
11
|
import { getToolRegistry } from '../../chat/execution/registry.js';
|
|
12
12
|
// Lazy initialization - only register tools when a tools command actually runs
|
|
13
13
|
let toolsInitialized = false;
|
|
14
|
-
function getRegistry() {
|
|
14
|
+
async function getRegistry() {
|
|
15
15
|
if (!toolsInitialized) {
|
|
16
|
-
registerBuiltinTools();
|
|
16
|
+
await registerBuiltinTools();
|
|
17
17
|
toolsInitialized = true;
|
|
18
18
|
}
|
|
19
19
|
return getToolRegistry();
|
|
@@ -93,7 +93,7 @@ export function toolsCommands() {
|
|
|
93
93
|
.option('--json', 'Output as JSON')
|
|
94
94
|
.option('-c, --category <cat>', 'Filter by category')
|
|
95
95
|
.action(async (options) => {
|
|
96
|
-
const registry = getRegistry();
|
|
96
|
+
const registry = await getRegistry();
|
|
97
97
|
let toolList = registry.list();
|
|
98
98
|
if (options.category) {
|
|
99
99
|
toolList = toolList.filter((t) => t.category === options.category);
|
|
@@ -145,7 +145,7 @@ export function toolsCommands() {
|
|
|
145
145
|
.description('Show detailed information about a tool')
|
|
146
146
|
.option('--json', 'Output as JSON')
|
|
147
147
|
.action(async (name, options) => {
|
|
148
|
-
const registry = getRegistry();
|
|
148
|
+
const registry = await getRegistry();
|
|
149
149
|
const tool = registry.get(name);
|
|
150
150
|
if (!tool) {
|
|
151
151
|
error(`Tool '${name}' not found`);
|
|
@@ -192,7 +192,7 @@ export function toolsCommands() {
|
|
|
192
192
|
.option('--json', 'Output result as JSON')
|
|
193
193
|
.option('-y, --yes', 'Skip approval for moderate tools')
|
|
194
194
|
.action(async (name, options) => {
|
|
195
|
-
const registry = getRegistry();
|
|
195
|
+
const registry = await getRegistry();
|
|
196
196
|
const tool = registry.get(name);
|
|
197
197
|
if (!tool) {
|
|
198
198
|
error(`Tool '${name}' not found`);
|
|
@@ -270,7 +270,7 @@ export function toolsCommands() {
|
|
|
270
270
|
.option('--json', 'Output as JSON')
|
|
271
271
|
.action(async (commandParts, options) => {
|
|
272
272
|
const command = commandParts.join(' ');
|
|
273
|
-
const registry = getRegistry();
|
|
273
|
+
const registry = await getRegistry();
|
|
274
274
|
const tool = registry.get('exec');
|
|
275
275
|
if (!tool) {
|
|
276
276
|
error('exec tool not found');
|
|
@@ -308,7 +308,7 @@ export function toolsCommands() {
|
|
|
308
308
|
.option('-s, --short', 'Short format')
|
|
309
309
|
.option('-w, --workdir <path>', 'Repository path')
|
|
310
310
|
.action(async (options) => {
|
|
311
|
-
const registry = getRegistry();
|
|
311
|
+
const registry = await getRegistry();
|
|
312
312
|
const tool = registry.get('git_status');
|
|
313
313
|
if (!tool) {
|
|
314
314
|
error('git_status tool not found');
|
|
@@ -332,7 +332,7 @@ export function toolsCommands() {
|
|
|
332
332
|
.option('-t, --type <type>', 'Info type: all, cpu, memory, os, network', 'all')
|
|
333
333
|
.option('--json', 'Output as JSON')
|
|
334
334
|
.action(async (options) => {
|
|
335
|
-
const registry = getRegistry();
|
|
335
|
+
const registry = await getRegistry();
|
|
336
336
|
const tool = registry.get('system_info');
|
|
337
337
|
if (!tool) {
|
|
338
338
|
error('system_info tool not found');
|
|
@@ -359,7 +359,7 @@ export function toolsCommands() {
|
|
|
359
359
|
.description('Shortcut: Show environment variables')
|
|
360
360
|
.option('-f, --filter <pattern>', 'Filter by pattern')
|
|
361
361
|
.action(async (name, options) => {
|
|
362
|
-
const registry = getRegistry();
|
|
362
|
+
const registry = await getRegistry();
|
|
363
363
|
const tool = registry.get('env');
|
|
364
364
|
if (!tool) {
|
|
365
365
|
error('env tool not found');
|
|
@@ -381,7 +381,7 @@ export function toolsCommands() {
|
|
|
381
381
|
.command('which <command>')
|
|
382
382
|
.description('Shortcut: Find command location')
|
|
383
383
|
.action(async (command) => {
|
|
384
|
-
const registry = getRegistry();
|
|
384
|
+
const registry = await getRegistry();
|
|
385
385
|
const tool = registry.get('which');
|
|
386
386
|
if (!tool) {
|
|
387
387
|
error('which tool not found');
|
|
@@ -403,7 +403,7 @@ export function toolsCommands() {
|
|
|
403
403
|
.description('Shortcut: Read a file')
|
|
404
404
|
.option('-l, --lines <n>', 'Max lines to read', '100')
|
|
405
405
|
.action(async (filePath, options) => {
|
|
406
|
-
const registry = getRegistry();
|
|
406
|
+
const registry = await getRegistry();
|
|
407
407
|
const tool = registry.get('read_file');
|
|
408
408
|
if (!tool) {
|
|
409
409
|
error('read_file tool not found');
|
|
@@ -431,7 +431,7 @@ export function toolsCommands() {
|
|
|
431
431
|
.option('-p, --path <dir>', 'Search directory', '.')
|
|
432
432
|
.option('-t, --type <type>', 'File type: file, directory, both', 'file')
|
|
433
433
|
.action(async (pattern, options) => {
|
|
434
|
-
const registry = getRegistry();
|
|
434
|
+
const registry = await getRegistry();
|
|
435
435
|
const tool = registry.get('search_files');
|
|
436
436
|
if (!tool) {
|
|
437
437
|
error('search_files tool not found');
|
|
@@ -469,7 +469,7 @@ export function toolsCommands() {
|
|
|
469
469
|
.option('-i, --ignore-case', 'Case insensitive')
|
|
470
470
|
.option('-c, --context <n>', 'Context lines', '0')
|
|
471
471
|
.action(async (pattern, searchPath, options) => {
|
|
472
|
-
const registry = getRegistry();
|
|
472
|
+
const registry = await getRegistry();
|
|
473
473
|
const tool = registry.get('grep');
|
|
474
474
|
if (!tool) {
|
|
475
475
|
error('grep tool not found');
|
package/dist/cli/commands/tui.js
CHANGED
|
@@ -2,6 +2,20 @@ import { Command } from 'commander';
|
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import { api } from '../utils/api.js';
|
|
4
4
|
import { spinner, error, createTable, formatRelativeTime, truncate } from '../utils/output.js';
|
|
5
|
+
async function launchInkDashboard() {
|
|
6
|
+
// Check if we have a real TTY (Ink needs raw mode)
|
|
7
|
+
if (!process.stdin.isTTY) {
|
|
8
|
+
console.error(chalk.red('Error: Ink TUI requires an interactive terminal (TTY).'));
|
|
9
|
+
console.error(chalk.dim('Run this command directly in your terminal, not piped.'));
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
// Dynamic import so ink is only loaded when --ink flag is used
|
|
13
|
+
const { render } = await import('ink');
|
|
14
|
+
const React = await import('react');
|
|
15
|
+
const { DashboardApp } = await import('../ink/DashboardApp.js');
|
|
16
|
+
const { waitUntilExit } = render(React.createElement(DashboardApp));
|
|
17
|
+
await waitUntilExit();
|
|
18
|
+
}
|
|
5
19
|
function formatUptime(seconds) {
|
|
6
20
|
const d = Math.floor(seconds / 86400);
|
|
7
21
|
const h = Math.floor((seconds % 86400) / 3600);
|
|
@@ -130,8 +144,19 @@ export function tuiCommand() {
|
|
|
130
144
|
const cmd = new Command('tui')
|
|
131
145
|
.description('Show terminal dashboard')
|
|
132
146
|
.option('--watch', 'Refresh dashboard every 5 seconds')
|
|
133
|
-
.option('--interval <seconds>', 'Refresh interval in seconds', '5')
|
|
147
|
+
.option('--interval <seconds>', 'Refresh interval in seconds', '5')
|
|
148
|
+
.option('--ink', 'Launch rich interactive Ink dashboard (tabs, auto-refresh, keyboard nav)');
|
|
134
149
|
cmd.action(async (options) => {
|
|
150
|
+
if (options.ink) {
|
|
151
|
+
try {
|
|
152
|
+
await launchInkDashboard();
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
error(err instanceof Error ? err.message : 'Failed to launch Ink dashboard');
|
|
156
|
+
process.exit(1);
|
|
157
|
+
}
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
135
160
|
try {
|
|
136
161
|
await renderDashboard();
|
|
137
162
|
if (options.watch) {
|
package/dist/cli/index.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { Command } from 'commander';
|
|
3
3
|
import chalk from 'chalk';
|
|
4
4
|
import figlet from 'figlet';
|
|
5
|
+
import { checkForUpdate, formatUpdateMessage } from '../utils/auto-update.js';
|
|
5
6
|
import { taskCommands } from './commands/task.js';
|
|
6
7
|
import { ticketCommands } from './commands/ticket.js';
|
|
7
8
|
import { summaryCommands } from './commands/summary.js';
|
|
@@ -23,18 +24,19 @@ import { sessionCommands } from './commands/session.js';
|
|
|
23
24
|
import { doctorCommand } from './commands/doctor.js';
|
|
24
25
|
import { providerCommands } from './commands/provider.js';
|
|
25
26
|
import { mcpCommands } from './commands/mcp.js';
|
|
26
|
-
import { browserCommands } from './commands/browser.js';
|
|
27
27
|
import { devicesCommands } from './commands/devices.js';
|
|
28
28
|
import { daemonCommand } from './commands/daemon.js';
|
|
29
29
|
import { completionCommands } from './commands/completion.js';
|
|
30
|
-
import { canvasCommands } from './commands/canvas.js';
|
|
31
30
|
import { webhooksCommands } from './commands/webhooks.js';
|
|
32
31
|
import { channelsCommands } from './commands/channels.js';
|
|
33
32
|
import { securityCommands } from './commands/security.js';
|
|
34
33
|
import { logsCommand } from './commands/logs.js';
|
|
35
34
|
import { modelsCommands } from './commands/models.js';
|
|
36
|
-
import { nodesCommands } from './commands/nodes.js';
|
|
37
35
|
import { tuiCommand } from './commands/tui.js';
|
|
36
|
+
import { importCommands } from './commands/import.js';
|
|
37
|
+
import { historyCommands } from './commands/history.js';
|
|
38
|
+
import { planCommands } from './commands/plan.js';
|
|
39
|
+
import { initCommand } from './commands/init.js';
|
|
38
40
|
const VERSION = '2.0.0';
|
|
39
41
|
// ASCII Banner
|
|
40
42
|
function showBanner() {
|
|
@@ -77,18 +79,19 @@ program.addCommand(doctorCommand());
|
|
|
77
79
|
program.addCommand(providerCommands());
|
|
78
80
|
program.addCommand(mcpCommands());
|
|
79
81
|
// Phase 9 - OpenClaw parity commands
|
|
80
|
-
program.addCommand(browserCommands());
|
|
81
82
|
program.addCommand(devicesCommands());
|
|
82
83
|
program.addCommand(daemonCommand());
|
|
83
84
|
program.addCommand(completionCommands());
|
|
84
|
-
program.addCommand(canvasCommands());
|
|
85
85
|
program.addCommand(webhooksCommands());
|
|
86
86
|
program.addCommand(channelsCommands());
|
|
87
87
|
program.addCommand(securityCommands());
|
|
88
88
|
program.addCommand(logsCommand());
|
|
89
89
|
program.addCommand(modelsCommands());
|
|
90
|
-
program.addCommand(nodesCommands());
|
|
91
90
|
program.addCommand(tuiCommand());
|
|
91
|
+
program.addCommand(importCommands());
|
|
92
|
+
program.addCommand(historyCommands());
|
|
93
|
+
program.addCommand(planCommands());
|
|
94
|
+
program.addCommand(initCommand());
|
|
92
95
|
// Default action (no command) - show banner and help
|
|
93
96
|
program.action(() => {
|
|
94
97
|
showBanner();
|
|
@@ -124,4 +127,14 @@ program.action(() => {
|
|
|
124
127
|
});
|
|
125
128
|
// Parse and execute (parseAsync required for async command actions)
|
|
126
129
|
await program.parseAsync();
|
|
130
|
+
// Non-blocking update check โ runs after the main command completes.
|
|
131
|
+
// Only checks if 24h have elapsed (enforced inside checkForUpdate via cache).
|
|
132
|
+
checkForUpdate().then((info) => {
|
|
133
|
+
const msg = formatUpdateMessage(info);
|
|
134
|
+
if (msg) {
|
|
135
|
+
console.log('\n' + chalk.yellow(' ' + msg));
|
|
136
|
+
}
|
|
137
|
+
}).catch(() => {
|
|
138
|
+
// Update check is best-effort; never surface errors to the user
|
|
139
|
+
});
|
|
127
140
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ink App Wrapper
|
|
3
|
+
*
|
|
4
|
+
* Root container for all Ink-based TUI screens. Provides consistent
|
|
5
|
+
* padding and flex column layout.
|
|
6
|
+
*/
|
|
7
|
+
import React from 'react';
|
|
8
|
+
interface AppProps {
|
|
9
|
+
children: React.ReactNode;
|
|
10
|
+
}
|
|
11
|
+
export declare const App: React.FC<AppProps>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=App.d.ts.map
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChatApp โ Full Interactive Chat TUI
|
|
3
|
+
*
|
|
4
|
+
* Layout:
|
|
5
|
+
* โ SessionHeader โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
6
|
+
* โ message history (StreamingMessage list) โ
|
|
7
|
+
* โ AgentStatus (while streaming) โ
|
|
8
|
+
* โ PermissionPrompt (overlay when needed) โ
|
|
9
|
+
* โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
|
|
10
|
+
* โ CostBar โ
|
|
11
|
+
* โ > TextInput โ
|
|
12
|
+
* โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
13
|
+
*/
|
|
14
|
+
import React from 'react';
|
|
15
|
+
import { type SessionHeaderProps } from './components/SessionHeader.js';
|
|
16
|
+
import { type AgentStatusState } from './components/AgentStatus.js';
|
|
17
|
+
import { type PermissionDecision, type PermissionLevel } from './components/PermissionPrompt.js';
|
|
18
|
+
import type { ChatMessage } from '../interactive/types.js';
|
|
19
|
+
import type { Suggestion } from '../../agents/prompt-suggestions.js';
|
|
20
|
+
export interface PendingPermission {
|
|
21
|
+
toolName: string;
|
|
22
|
+
args: Record<string, unknown>;
|
|
23
|
+
permissionLevel: PermissionLevel;
|
|
24
|
+
reason?: string;
|
|
25
|
+
resolve: (decision: PermissionDecision) => void;
|
|
26
|
+
}
|
|
27
|
+
export interface PickerOption {
|
|
28
|
+
label: string;
|
|
29
|
+
value: string;
|
|
30
|
+
description?: string;
|
|
31
|
+
active?: boolean;
|
|
32
|
+
disabled?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface ChatAppProps {
|
|
35
|
+
sessionInfo: Omit<SessionHeaderProps, 'sessionId'> & {
|
|
36
|
+
sessionId: string;
|
|
37
|
+
};
|
|
38
|
+
tokensUsed: number;
|
|
39
|
+
tokensMax: number;
|
|
40
|
+
estimatedCost?: number;
|
|
41
|
+
agentStatus: AgentStatusState;
|
|
42
|
+
agentAction?: string;
|
|
43
|
+
stepCount: number;
|
|
44
|
+
elapsedMs: number;
|
|
45
|
+
messages: ChatMessage[];
|
|
46
|
+
streamingContent?: string;
|
|
47
|
+
pendingPermission?: PendingPermission;
|
|
48
|
+
availableModels?: PickerOption[];
|
|
49
|
+
availableProviders?: PickerOption[];
|
|
50
|
+
suggestions?: Suggestion[];
|
|
51
|
+
/** Connection status forwarded from the stream client / offline detector */
|
|
52
|
+
connectionStatus?: 'connected' | 'reconnecting' | 'disconnected';
|
|
53
|
+
/** Measured round-trip latency in ms (updated after each successful ping) */
|
|
54
|
+
connectionLatencyMs?: number;
|
|
55
|
+
onSubmit: (message: string) => void;
|
|
56
|
+
onPermissionDecision?: (decision: PermissionDecision) => void;
|
|
57
|
+
onCancel?: () => void;
|
|
58
|
+
}
|
|
59
|
+
export declare const ChatApp: React.FC<ChatAppProps>;
|
|
60
|
+
//# sourceMappingURL=ChatApp.d.ts.map
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* ChatApp โ Full Interactive Chat TUI
|
|
4
|
+
*
|
|
5
|
+
* Layout:
|
|
6
|
+
* โ SessionHeader โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
7
|
+
* โ message history (StreamingMessage list) โ
|
|
8
|
+
* โ AgentStatus (while streaming) โ
|
|
9
|
+
* โ PermissionPrompt (overlay when needed) โ
|
|
10
|
+
* โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
|
|
11
|
+
* โ CostBar โ
|
|
12
|
+
* โ > TextInput โ
|
|
13
|
+
* โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
14
|
+
*/
|
|
15
|
+
import { useState, useCallback, useEffect } from 'react';
|
|
16
|
+
import { Box, Text, useApp, useInput } from 'ink';
|
|
17
|
+
import TextInput from 'ink-text-input';
|
|
18
|
+
import { App } from './App.js';
|
|
19
|
+
import { SessionHeader } from './components/SessionHeader.js';
|
|
20
|
+
import { StreamingMessage } from './components/StreamingMessage.js';
|
|
21
|
+
import { AgentStatus } from './components/AgentStatus.js';
|
|
22
|
+
import { CostBar } from './components/CostBar.js';
|
|
23
|
+
import { PermissionPrompt, } from './components/PermissionPrompt.js';
|
|
24
|
+
import { SuggestionBar } from './components/SuggestionBar.js';
|
|
25
|
+
import { ConnectionStatus } from './components/ConnectionStatus.js';
|
|
26
|
+
const SLASH_COMMANDS = [
|
|
27
|
+
{ name: '/model', description: 'Switch AI model', hasSubPicker: true, immediate: false },
|
|
28
|
+
{ name: '/provider', description: 'Switch provider', hasSubPicker: true, immediate: false },
|
|
29
|
+
{ name: '/agentic', description: 'Toggle agentic mode (tools + multi-step)', hasSubPicker: false, immediate: true },
|
|
30
|
+
{ name: '/effort', description: 'Set effort: low | medium | high', hasSubPicker: false, immediate: false },
|
|
31
|
+
{ name: '/thinking', description: 'Toggle thinking display', hasSubPicker: false, immediate: true },
|
|
32
|
+
{ name: '/tools', description: 'Toggle tool call verbosity', hasSubPicker: false, immediate: true },
|
|
33
|
+
{ name: '/new', description: 'Start a fresh conversation', hasSubPicker: false, immediate: true },
|
|
34
|
+
{ name: '/sessions', description: 'List recent conversations', hasSubPicker: false, immediate: true },
|
|
35
|
+
{ name: '/resume', description: 'Resume a session by id prefix', hasSubPicker: false, immediate: false },
|
|
36
|
+
{ name: '/status', description: 'Server and provider health', hasSubPicker: false, immediate: true },
|
|
37
|
+
{ name: '/insights', description: 'Session and server usage analytics', hasSubPicker: false, immediate: true },
|
|
38
|
+
{ name: '/run', description: 'Execute a shell command', hasSubPicker: false, immediate: false },
|
|
39
|
+
{ name: '/retry', description: 'Retry last message', hasSubPicker: false, immediate: true },
|
|
40
|
+
{ name: '/diff', description: 'Show unified diff of all file changes this session', hasSubPicker: false, immediate: true },
|
|
41
|
+
{ name: '/rewind', description: 'List or restore file snapshots (optional: <path> or --turn <n>)', hasSubPicker: false, immediate: false },
|
|
42
|
+
{ name: '/compact', description: 'Compact context โ summarize old turns (--llm for LLM summary)', hasSubPicker: false, immediate: true },
|
|
43
|
+
{ name: '/branch', description: 'Fork conversation at current turn (or /branch <n> for turn N)', hasSubPicker: false, immediate: false },
|
|
44
|
+
{ name: '/branches', description: 'List all branches for this conversation', hasSubPicker: false, immediate: true },
|
|
45
|
+
{ name: '/clear', description: 'Clear display', hasSubPicker: false, immediate: true },
|
|
46
|
+
{ name: '/help', description: 'Show all commands', hasSubPicker: false, immediate: true },
|
|
47
|
+
{ name: '/exit', description: 'Quit', hasSubPicker: false, immediate: true },
|
|
48
|
+
];
|
|
49
|
+
// Max number of history entries to retain
|
|
50
|
+
const MAX_HISTORY = 50;
|
|
51
|
+
export const ChatApp = ({ sessionInfo, tokensUsed, tokensMax, estimatedCost, agentStatus, agentAction, stepCount, elapsedMs, messages, streamingContent, pendingPermission, availableModels = [], availableProviders = [], suggestions = [], connectionStatus = 'connected', connectionLatencyMs, onSubmit, onPermissionDecision, onCancel, }) => {
|
|
52
|
+
const { exit } = useApp();
|
|
53
|
+
const [inputValue, setInputValue] = useState('');
|
|
54
|
+
const [pickerMode, setPickerMode] = useState('none');
|
|
55
|
+
const [selectedIdx, setSelectedIdx] = useState(0);
|
|
56
|
+
const [subPickerTitle, setSubPickerTitle] = useState('');
|
|
57
|
+
const [subPickerItems, setSubPickerItems] = useState([]);
|
|
58
|
+
const [subPickerCommand, setSubPickerCommand] = useState('');
|
|
59
|
+
// โโ Multiline state โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
60
|
+
const [isMultiline, setIsMultiline] = useState(false);
|
|
61
|
+
const [multilineLines, setMultilineLines] = useState([]);
|
|
62
|
+
// โโ Input history state โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
63
|
+
const [inputHistory, setInputHistory] = useState([]);
|
|
64
|
+
const [historyIndex, setHistoryIndex] = useState(-1);
|
|
65
|
+
// Saved draft before navigating history (so Down arrow restores it)
|
|
66
|
+
const [historyDraft, setHistoryDraft] = useState('');
|
|
67
|
+
const isStreaming = agentStatus === 'thinking' || agentStatus === 'executing';
|
|
68
|
+
// Compute matching commands when in command picker mode
|
|
69
|
+
const inCommandPicker = inputValue.startsWith('/') && inputValue.indexOf(' ') === -1 && !isStreaming && !isMultiline;
|
|
70
|
+
const matchingCmds = inCommandPicker
|
|
71
|
+
? SLASH_COMMANDS.filter(c => c.name.startsWith(inputValue.toLowerCase()))
|
|
72
|
+
: [];
|
|
73
|
+
// Auto-show/hide command picker
|
|
74
|
+
useEffect(() => {
|
|
75
|
+
if (inCommandPicker && matchingCmds.length > 0 && pickerMode === 'none') {
|
|
76
|
+
setPickerMode('commands');
|
|
77
|
+
setSelectedIdx(0);
|
|
78
|
+
}
|
|
79
|
+
else if (!inCommandPicker && pickerMode === 'commands') {
|
|
80
|
+
setPickerMode('none');
|
|
81
|
+
}
|
|
82
|
+
}, [inCommandPicker, matchingCmds.length, pickerMode]);
|
|
83
|
+
// Current picker items
|
|
84
|
+
const pickerItems = pickerMode === 'commands'
|
|
85
|
+
? matchingCmds.map(c => ({ label: c.name, value: c.name, description: c.description }))
|
|
86
|
+
: pickerMode === 'sub'
|
|
87
|
+
? subPickerItems
|
|
88
|
+
: [];
|
|
89
|
+
// Keep index in bounds
|
|
90
|
+
const maxIdx = Math.max(0, pickerItems.length - 1);
|
|
91
|
+
const safeIdx = Math.min(selectedIdx, maxIdx);
|
|
92
|
+
// Ghost text
|
|
93
|
+
const ghostText = pickerMode === 'commands' && matchingCmds.length > 0
|
|
94
|
+
? (matchingCmds[safeIdx]?.name ?? '').slice(inputValue.length)
|
|
95
|
+
: '';
|
|
96
|
+
// Open sub-picker for a command
|
|
97
|
+
const openSubPicker = useCallback((cmd) => {
|
|
98
|
+
if (cmd.name === '/model') {
|
|
99
|
+
setSubPickerTitle(`Select Model (${availableModels.length} available)`);
|
|
100
|
+
setSubPickerItems(availableModels);
|
|
101
|
+
setSubPickerCommand('/model');
|
|
102
|
+
}
|
|
103
|
+
else if (cmd.name === '/provider') {
|
|
104
|
+
setSubPickerTitle(`Select Provider (${availableProviders.length} available)`);
|
|
105
|
+
setSubPickerItems(availableProviders);
|
|
106
|
+
setSubPickerCommand('/provider');
|
|
107
|
+
}
|
|
108
|
+
setPickerMode('sub');
|
|
109
|
+
setSelectedIdx(0);
|
|
110
|
+
setInputValue('');
|
|
111
|
+
}, [availableModels, availableProviders]);
|
|
112
|
+
// โโ Ctrl+C handler โ always active to intercept before Ink's default exit โโโโ
|
|
113
|
+
useInput((input, key) => {
|
|
114
|
+
if (!key.ctrl || input !== 'c')
|
|
115
|
+
return;
|
|
116
|
+
if (isStreaming) {
|
|
117
|
+
// Cancel the in-flight stream; do not exit
|
|
118
|
+
onCancel?.();
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (inputValue.length > 0 || isMultiline) {
|
|
122
|
+
// Clear pending input
|
|
123
|
+
setInputValue('');
|
|
124
|
+
setIsMultiline(false);
|
|
125
|
+
setMultilineLines([]);
|
|
126
|
+
setHistoryIndex(-1);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
// Nothing to cancel โ exit normally
|
|
130
|
+
exit();
|
|
131
|
+
});
|
|
132
|
+
// โโ Alt+Enter / history navigation โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
133
|
+
useInput((input, key) => {
|
|
134
|
+
// Alt+Enter: toggle multiline mode
|
|
135
|
+
if (key.meta && key.return) {
|
|
136
|
+
if (!isMultiline) {
|
|
137
|
+
setIsMultiline(true);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
// Cancel multiline; discard accumulated lines
|
|
141
|
+
setIsMultiline(false);
|
|
142
|
+
setMultilineLines([]);
|
|
143
|
+
}
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
// Up arrow: navigate backward through history (picker closed, not in multiline)
|
|
147
|
+
if (key.upArrow && pickerMode === 'none' && !isMultiline) {
|
|
148
|
+
if (inputHistory.length === 0)
|
|
149
|
+
return;
|
|
150
|
+
if (historyIndex === -1) {
|
|
151
|
+
setHistoryDraft(inputValue);
|
|
152
|
+
}
|
|
153
|
+
const newIdx = historyIndex === -1
|
|
154
|
+
? inputHistory.length - 1
|
|
155
|
+
: Math.max(0, historyIndex - 1);
|
|
156
|
+
setHistoryIndex(newIdx);
|
|
157
|
+
setInputValue(inputHistory[newIdx] ?? '');
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
// Down arrow: navigate forward through history (picker closed, not in multiline)
|
|
161
|
+
if (key.downArrow && pickerMode === 'none' && !isMultiline) {
|
|
162
|
+
if (historyIndex === -1)
|
|
163
|
+
return;
|
|
164
|
+
const newIdx = historyIndex + 1;
|
|
165
|
+
if (newIdx >= inputHistory.length) {
|
|
166
|
+
setHistoryIndex(-1);
|
|
167
|
+
setInputValue(historyDraft);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
setHistoryIndex(newIdx);
|
|
171
|
+
setInputValue(inputHistory[newIdx] ?? '');
|
|
172
|
+
}
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
// Ctrl+Enter in multiline mode: submit all accumulated lines + current line
|
|
176
|
+
if (isMultiline && key.ctrl && key.return) {
|
|
177
|
+
const allLines = [...multilineLines, inputValue].filter(l => l.length > 0);
|
|
178
|
+
if (allLines.length === 0)
|
|
179
|
+
return;
|
|
180
|
+
const combined = allLines.join('\n');
|
|
181
|
+
setIsMultiline(false);
|
|
182
|
+
setMultilineLines([]);
|
|
183
|
+
setInputValue('');
|
|
184
|
+
setHistoryIndex(-1);
|
|
185
|
+
setHistoryDraft('');
|
|
186
|
+
setInputHistory(prev => {
|
|
187
|
+
const next = [...prev, combined];
|
|
188
|
+
return next.length > MAX_HISTORY ? next.slice(next.length - MAX_HISTORY) : next;
|
|
189
|
+
});
|
|
190
|
+
onSubmit(combined);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
void input;
|
|
194
|
+
}, { isActive: !isStreaming && pendingPermission === undefined });
|
|
195
|
+
// โโ Picker keyboard navigation โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
196
|
+
useInput((_input, key) => {
|
|
197
|
+
if (pickerMode === 'none' || pickerItems.length === 0)
|
|
198
|
+
return;
|
|
199
|
+
if (key.upArrow) {
|
|
200
|
+
setSelectedIdx(prev => {
|
|
201
|
+
let next = prev <= 0 ? pickerItems.length - 1 : prev - 1;
|
|
202
|
+
// Skip disabled items
|
|
203
|
+
let attempts = 0;
|
|
204
|
+
while (pickerItems[next] && pickerItems[next]?.disabled && attempts < pickerItems.length) {
|
|
205
|
+
next = next <= 0 ? pickerItems.length - 1 : next - 1;
|
|
206
|
+
attempts++;
|
|
207
|
+
}
|
|
208
|
+
return next;
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
else if (key.downArrow) {
|
|
212
|
+
setSelectedIdx(prev => {
|
|
213
|
+
let next = prev >= pickerItems.length - 1 ? 0 : prev + 1;
|
|
214
|
+
let attempts = 0;
|
|
215
|
+
while (pickerItems[next] && pickerItems[next]?.disabled && attempts < pickerItems.length) {
|
|
216
|
+
next = next >= pickerItems.length - 1 ? 0 : next + 1;
|
|
217
|
+
attempts++;
|
|
218
|
+
}
|
|
219
|
+
return next;
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
else if (key.escape) {
|
|
223
|
+
setPickerMode('none');
|
|
224
|
+
setInputValue('');
|
|
225
|
+
setSelectedIdx(0);
|
|
226
|
+
}
|
|
227
|
+
}, { isActive: pickerMode !== 'none' && !isStreaming });
|
|
228
|
+
const handleSubmit = useCallback((value) => {
|
|
229
|
+
// In multiline mode, Enter appends the current line and moves to the next
|
|
230
|
+
if (isMultiline) {
|
|
231
|
+
setMultilineLines(prev => [...prev, value]);
|
|
232
|
+
setInputValue('');
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
const trimmed = value.trim();
|
|
236
|
+
// Sub-picker: Enter selects the highlighted option (skip disabled)
|
|
237
|
+
if (pickerMode === 'sub' && subPickerItems.length > 0) {
|
|
238
|
+
const item = subPickerItems[safeIdx];
|
|
239
|
+
if (item && !(item.disabled)) {
|
|
240
|
+
setPickerMode('none');
|
|
241
|
+
setInputValue('');
|
|
242
|
+
setSelectedIdx(0);
|
|
243
|
+
onSubmit(`${subPickerCommand} ${item.value}`);
|
|
244
|
+
}
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
// Command picker: Enter selects highlighted command
|
|
248
|
+
if (pickerMode === 'commands' && matchingCmds.length > 0) {
|
|
249
|
+
const cmd = matchingCmds[safeIdx];
|
|
250
|
+
if (cmd) {
|
|
251
|
+
if (cmd.hasSubPicker) {
|
|
252
|
+
openSubPicker(cmd);
|
|
253
|
+
}
|
|
254
|
+
else if (cmd.immediate) {
|
|
255
|
+
setPickerMode('none');
|
|
256
|
+
setInputValue('');
|
|
257
|
+
setSelectedIdx(0);
|
|
258
|
+
if (cmd.name === '/exit') {
|
|
259
|
+
exit();
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
onSubmit(cmd.name);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
if (trimmed.length === 0)
|
|
268
|
+
return;
|
|
269
|
+
if (trimmed === '/exit' || trimmed === '/quit') {
|
|
270
|
+
exit();
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
setInputValue('');
|
|
274
|
+
setSelectedIdx(0);
|
|
275
|
+
setPickerMode('none');
|
|
276
|
+
setHistoryIndex(-1);
|
|
277
|
+
setHistoryDraft('');
|
|
278
|
+
setInputHistory(prev => {
|
|
279
|
+
const next = [...prev, trimmed];
|
|
280
|
+
return next.length > MAX_HISTORY ? next.slice(next.length - MAX_HISTORY) : next;
|
|
281
|
+
});
|
|
282
|
+
onSubmit(trimmed);
|
|
283
|
+
}, [
|
|
284
|
+
onSubmit,
|
|
285
|
+
exit,
|
|
286
|
+
pickerMode,
|
|
287
|
+
safeIdx,
|
|
288
|
+
matchingCmds,
|
|
289
|
+
subPickerItems,
|
|
290
|
+
subPickerCommand,
|
|
291
|
+
openSubPicker,
|
|
292
|
+
isMultiline,
|
|
293
|
+
]);
|
|
294
|
+
const handlePermission = useCallback((decision) => {
|
|
295
|
+
if (pendingPermission) {
|
|
296
|
+
pendingPermission.resolve(decision);
|
|
297
|
+
}
|
|
298
|
+
onPermissionDecision?.(decision);
|
|
299
|
+
}, [pendingPermission, onPermissionDecision]);
|
|
300
|
+
// โโ Prompt prefix โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
301
|
+
const promptPrefix = isMultiline ? '... ' : '> ';
|
|
302
|
+
return (_jsxs(App, { children: [_jsxs(Box, { flexDirection: "row", justifyContent: "space-between", alignItems: "center", children: [_jsx(SessionHeader, { model: sessionInfo.model, provider: sessionInfo.provider, sessionId: sessionInfo.sessionId, mode: sessionInfo.mode }), connectionStatus !== 'connected' && (_jsx(Box, { paddingX: 1, children: _jsx(ConnectionStatus, { status: connectionStatus, latencyMs: connectionLatencyMs, provider: sessionInfo.provider }) }))] }), connectionStatus === 'disconnected' && (_jsxs(Box, { borderStyle: "round", borderColor: "red", paddingX: 2, paddingY: 0, marginX: 1, children: [_jsx(Text, { color: "red", bold: true, children: "Server unreachable \u2014 waiting for connection..." }), _jsx(Text, { dimColor: true, children: " Messages will be sent once the server is back online." })] })), connectionStatus === 'reconnecting' && (_jsx(Box, { paddingX: 1, children: _jsx(Text, { color: "yellow", children: "Reconnecting to server..." }) })), _jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingY: 1, children: [messages.map((msg, idx) => (_jsx(StreamingMessage, { role: msg.role === 'system' ? 'assistant' : msg.role, content: msg.content, model: msg.model }, `msg-${msg.timestamp?.getTime?.() ?? idx}-${idx}`))), streamingContent !== undefined && streamingContent.length > 0 && (_jsx(StreamingMessage, { role: "assistant", content: streamingContent, isStreaming: true, model: sessionInfo.model }))] }), (isStreaming || agentStatus === 'complete') && (_jsx(AgentStatus, { status: agentStatus, currentAction: agentAction, stepCount: stepCount, tokensUsed: tokensUsed, elapsedMs: elapsedMs })), pendingPermission !== undefined && (_jsx(PermissionPrompt, { toolName: pendingPermission.toolName, args: pendingPermission.args, permissionLevel: pendingPermission.permissionLevel, reason: pendingPermission.reason, onDecision: handlePermission })), pickerMode !== 'none' && pickerItems.length > 0 && (() => {
|
|
303
|
+
const MAX_VISIBLE = 6;
|
|
304
|
+
const total = pickerItems.length;
|
|
305
|
+
const start = Math.max(0, Math.min(safeIdx - Math.floor(MAX_VISIBLE / 2), total - MAX_VISIBLE));
|
|
306
|
+
const visible = pickerItems.slice(start, start + MAX_VISIBLE);
|
|
307
|
+
const showScrollUp = start > 0;
|
|
308
|
+
const showScrollDown = start + MAX_VISIBLE < total;
|
|
309
|
+
const title = pickerMode === 'sub' ? subPickerTitle : 'Commands';
|
|
310
|
+
return (_jsx(Box, { flexDirection: "column", paddingX: 2, children: _jsxs(Box, { borderStyle: "round", borderColor: "cyan", flexDirection: "column", paddingX: 1, children: [_jsxs(Text, { bold: true, color: "cyan", children: [' ', title] }), _jsx(Text, { dimColor: true, children: ' โ'.repeat(20) }), showScrollUp && _jsxs(Text, { dimColor: true, children: [" \u2191 more (", start, " above)"] }), visible.map((item) => {
|
|
311
|
+
const realIdx = pickerItems.indexOf(item);
|
|
312
|
+
const isSelected = realIdx === safeIdx;
|
|
313
|
+
const isDisabled = item.disabled;
|
|
314
|
+
return (_jsxs(Box, { gap: 1, children: [_jsxs(Text, { color: isDisabled ? 'gray' : isSelected ? 'cyan' : undefined, bold: isSelected && !isDisabled, inverse: isSelected && !isDisabled, dimColor: isDisabled, strikethrough: isDisabled, children: [' ', item.label.padEnd(20)] }), item.description && _jsx(Text, { dimColor: true, children: item.description }), item.active && !isDisabled && _jsx(Text, { color: "green", children: " \u25CF" }), isDisabled && _jsx(Text, { color: "gray", children: " \u2298" })] }, item.value + (isDisabled ? '-disabled' : '')));
|
|
315
|
+
}), showScrollDown && _jsxs(Text, { dimColor: true, children: [" \u2193 more (", total - start - MAX_VISIBLE, " below)"] }), _jsx(Text, { dimColor: true, children: " \u2191\u2193 navigate \u00B7 Enter select \u00B7 Esc back" })] }) }));
|
|
316
|
+
})(), suggestions.length > 0 && !isStreaming && pickerMode === 'none' && (_jsx(SuggestionBar, { suggestions: suggestions, isActive: pendingPermission === undefined && !isStreaming && pickerMode === 'none', onSelect: (text) => {
|
|
317
|
+
onSubmit(text);
|
|
318
|
+
} })), isMultiline && multilineLines.length > 0 && (_jsx(Box, { flexDirection: "column", paddingX: 1, children: multilineLines.map((line, idx) => (_jsxs(Box, { flexDirection: "row", gap: 0, children: [_jsx(Text, { color: "yellow", bold: true, children: '... ' }), _jsx(Text, { children: line })] }, idx))) })), _jsxs(Box, { flexDirection: "row", gap: 0, paddingX: 1, children: [_jsx(Text, { color: isMultiline ? 'yellow' : 'cyan', bold: true, children: promptPrefix }), connectionStatus === 'disconnected' ? (_jsx(Text, { dimColor: true, color: "red", children: "Offline \u2014 waiting for server..." })) : pendingPermission === undefined && !isStreaming ? (_jsxs(Box, { flexDirection: "row", children: [_jsx(TextInput, { value: inputValue, onChange: (val) => { setInputValue(val); if (!isMultiline)
|
|
319
|
+
setSelectedIdx(0); }, onSubmit: handleSubmit, placeholder: isMultiline
|
|
320
|
+
? 'Add line... (Ctrl+Enter to send ยท Alt+Enter to cancel)'
|
|
321
|
+
: 'Message profClaw... (/ for commands)' }), ghostText.length > 0 && _jsx(Text, { dimColor: true, children: ghostText })] })) : (_jsx(Text, { dimColor: true, children: pendingPermission !== undefined
|
|
322
|
+
? 'Waiting for permission...'
|
|
323
|
+
: 'Agent is working... (Ctrl+C to cancel)' }))] }), isMultiline && (_jsx(Box, { paddingX: 1, children: _jsx(Text, { dimColor: true, children: " multiline \u2014 Enter adds line \u00B7 Ctrl+Enter sends \u00B7 Alt+Enter cancels" }) })), _jsx(CostBar, { tokensUsed: tokensUsed, tokensMax: tokensMax, estimatedCost: estimatedCost })] }));
|
|
324
|
+
};
|
|
325
|
+
//# sourceMappingURL=ChatApp.js.map
|