pikiclaw 0.3.18 → 0.3.20

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.
Files changed (44) hide show
  1. package/README.md +69 -31
  2. package/dashboard/dist/assets/AgentTab-DUJAgUKi.js +1 -0
  3. package/dashboard/dist/assets/{BrandIcon-D4rSbRRe.js → BrandIcon-BAXeIuGD.js} +1 -1
  4. package/dashboard/dist/assets/{DirBrowser-C4ZJ3OCx.js → DirBrowser-HtXAEFE-.js} +1 -1
  5. package/dashboard/dist/assets/ExtensionsTab-RVDkgg0j.js +1 -0
  6. package/dashboard/dist/assets/{IMAccessTab-DIYJqiB-.js → IMAccessTab-CbSba7oY.js} +1 -1
  7. package/dashboard/dist/assets/Modal-utaCOq7k.js +1 -0
  8. package/dashboard/dist/assets/Modals-CecSYoc7.js +1 -0
  9. package/dashboard/dist/assets/{PermissionsTab-D0ShpUJ3.js → PermissionsTab-B0vKkxaY.js} +1 -1
  10. package/dashboard/dist/assets/{Select-BdzQcfE0.js → Select-DBMtcZku.js} +1 -1
  11. package/dashboard/dist/assets/SessionPanel-Focf0sfV.js +1 -0
  12. package/dashboard/dist/assets/{SystemTab-iHn9MImg.js → SystemTab-Wx5Pb2hD.js} +1 -1
  13. package/dashboard/dist/assets/index-Bbf__IXB.js +3 -0
  14. package/dashboard/dist/assets/index-Bvi7jk1E.js +16 -0
  15. package/dashboard/dist/assets/index-DC4TENJ4.css +1 -0
  16. package/dashboard/dist/assets/{shared-Bw8XftPu.js → shared-BRvVjyDB.js} +1 -1
  17. package/dashboard/dist/index.html +2 -2
  18. package/dist/agent/index.js +6 -2
  19. package/dist/agent/mcp/bridge.js +11 -20
  20. package/dist/agent/mcp/extensions.js +355 -0
  21. package/dist/agent/mcp/registry.js +238 -0
  22. package/dist/agent/session.js +12 -2
  23. package/dist/agent/skill-installer.js +127 -0
  24. package/dist/agent/skills.js +42 -9
  25. package/dist/agent/stream.js +2 -0
  26. package/dist/bot/bot.js +11 -5
  27. package/dist/bot/commands.js +21 -1
  28. package/dist/bot/menu.js +1 -0
  29. package/dist/channels/feishu/markdown.js +2 -0
  30. package/dist/channels/telegram/bot.js +36 -0
  31. package/dist/channels/telegram/render.js +3 -13
  32. package/dist/core/process-control.js +9 -0
  33. package/dist/dashboard/routes/extensions.js +192 -0
  34. package/dist/dashboard/server.js +2 -0
  35. package/package.json +1 -1
  36. package/dashboard/dist/assets/AgentTab-BsCkJOAc.js +0 -1
  37. package/dashboard/dist/assets/ExtensionsTab-DceFj6jJ.js +0 -1
  38. package/dashboard/dist/assets/Input-BLFQdYXJ.js +0 -1
  39. package/dashboard/dist/assets/Modal-BiSivoJs.js +0 -1
  40. package/dashboard/dist/assets/Modals-Swsdzd3X.js +0 -1
  41. package/dashboard/dist/assets/SessionPanel-qtDeNODj.js +0 -1
  42. package/dashboard/dist/assets/index-BKSU7qMQ.js +0 -15
  43. package/dashboard/dist/assets/index-DEtvi88w.css +0 -1
  44. package/dashboard/dist/assets/index-ppK_28CF.js +0 -3
package/README.md CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  # pikiclaw
4
4
 
5
- **Put the world's smartest AI agents in your pocket. Command local Claude, Codex & Gemini via best IM.**
5
+ **Put the world's smartest AI agents in your pocket. Command local Claude, Codex & Gemini via IM.**
6
6
 
7
- *Let the best IM app become a top-tier Agent console on your computer*
7
+ *Turn Telegram, Feishu, or WeChat into a full-featured Agent console on your computer*
8
8
 
9
9
  ```
10
10
  npx pikiclaw@latest
@@ -41,12 +41,13 @@ pikiclaw takes a different approach:
41
41
  - **Official Agent CLIs** — Claude Code, Codex, Gemini CLI as-is, not a home-grown wrapper
42
42
  - **Your own machine** — local files, local tools, local environment
43
43
  - **Your existing IM** — Telegram, Feishu, or WeChat, no new app to learn
44
+ - **Community extensions** — install MCP servers and skills from the ecosystem with one click
44
45
 
45
46
  ```
46
47
  You (Telegram / Feishu / WeChat)
47
48
  |
48
49
  v
49
- pikiclaw
50
+ pikiclaw ←── MCP servers & community skills
50
51
  |
51
52
  v
52
53
  Claude Code / Codex / Gemini CLI
@@ -81,10 +82,11 @@ npx pikiclaw@latest
81
82
 
82
83
  This opens the **Web Dashboard** at `http://localhost:3939`, where you can:
83
84
 
85
+ - Drive agent sessions directly from the browser — full conversation, tool use, streaming
84
86
  - Connect IM channels (Telegram / Feishu / WeChat)
85
- - Configure agents and models
86
- - Manage macOS system permissions
87
- - Set up browser & desktop automation extensions
87
+ - Configure agents, models, and reasoning effort
88
+ - Browse and install community MCP servers and skills
89
+ - Manage macOS system permissions and automation extensions
88
90
  - Monitor sessions and system resources
89
91
 
90
92
  <details>
@@ -104,6 +106,10 @@ npx pikiclaw@latest --doctor # check environment only
104
106
  <details>
105
107
  <summary>Expand to see all dashboard pages</summary>
106
108
 
109
+ **Workspace** — Multi-panel agent console with session list, conversation view, tool-use traces, and input composer
110
+
111
+ <img src="docs/promo-dashboard-workspace.png" alt="Workspace" width="700">
112
+
107
113
  **IM Access** — Telegram, Feishu, WeChat channel status and configuration
108
114
 
109
115
  <img src="docs/promo-dashboard-im.png" alt="IM Access" width="700">
@@ -116,14 +122,10 @@ npx pikiclaw@latest --doctor # check environment only
116
122
 
117
123
  <img src="docs/promo-dashboard-permissions.png" alt="Permissions" width="700">
118
124
 
119
- **Extensions** — Managed browser & desktop automation (Appium Mac2)
125
+ **Extensions** — Community MCP servers, skill repos, and built-in browser & desktop automation
120
126
 
121
127
  <img src="docs/promo-dashboard-extensions.png" alt="Extensions" width="700">
122
128
 
123
- **Sessions** — Per-agent session list and runtime status
124
-
125
- <img src="docs/promo-dashboard-sessions.png" alt="Sessions" width="700">
126
-
127
129
  **System Info** — Working directory, CPU / memory / disk monitoring
128
130
 
129
131
  <img src="docs/promo-dashboard-system.png" alt="System Info" width="700">
@@ -142,12 +144,43 @@ npx pikiclaw@latest --doctor # check environment only
142
144
 
143
145
  ### Dashboard as Agent Console
144
146
 
145
- The web dashboard integrates Claude Code's core interactive experience full conversation history with tool-use activity, thinking traces, plan progress, streaming output, image attachments, and an input composer so you can drive any agent session directly from the browser, no IM required.
147
+ The web dashboard is a full-featured agent consolenot just a settings panel. It provides complete conversation history with tool-use activity, thinking traces, plan progress, streaming output, image attachments, and an input composer. You can drive any agent session directly from the browser with a multi-panel workspace layout (1 / 2 / 3 / 6 panes), no IM required.
148
+
149
+ ### Extensions & Community Plugins
150
+
151
+ pikiclaw has a two-layer extension system — **global** extensions apply to all projects, **workspace** extensions are project-scoped:
152
+
153
+ <img src="docs/promo-dashboard-extensions-add.png" alt="Add MCP Server" width="700">
154
+
155
+ **MCP Servers**
156
+ - Browse recommended servers (GitHub, Filesystem, PostgreSQL, Slack, Brave Search, Memory, Fetch, SQLite, Git, Sentry)
157
+ - Search the [MCP Registry](https://registry.modelcontextprotocol.io) for community servers
158
+ - Add custom servers (stdio or HTTP) with environment variable configuration
159
+ - Health check with MCP protocol handshake and tool discovery
160
+ - Enable / disable individual servers per scope
161
+
162
+ **Community Skills**
163
+ - Install skills from GitHub repos with one click (`owner/repo`)
164
+ - Browse recommended skill repos (Anthropic Official, Vercel Agent Skills, etc.)
165
+ - Search community skills via npm
166
+ - Skills can declare MCP dependencies via `mcp_requires`
167
+ - Global skills (`~/.pikiclaw/skills/`) and project skills (`.pikiclaw/skills/`)
168
+
169
+ All extensions are merged with priority (global < workspace < built-in) and injected into agent sessions automatically.
170
+
171
+ ### Skills
172
+
173
+ - Project-level skills at `.pikiclaw/skills/*/SKILL.md`
174
+ - Compatible with `.claude/commands/*.md`
175
+ - Legacy `.claude/skills` / `.agents/skills` support with migration path
176
+ - Install from GitHub or browse recommended repos via the dashboard
177
+ - Trigger via `/skills` and `/sk_<name>` in chat
146
178
 
147
179
  ### Runtime
148
180
 
149
181
  - Streaming preview with continuous message updates
150
182
  - Session switching, resume, and multi-turn conversations
183
+ - Session classification (answer, proposal, implementation, blocked, etc.)
151
184
  - Task queue with **Steer** — interrupt the running task and let a queued message jump ahead
152
185
  - Working directory browsing and switching
153
186
  - File attachments automatically enter the session workspace
@@ -155,29 +188,20 @@ The web dashboard integrates Claude Code's core interactive experience — full
155
188
  - Long text auto-splitting; images and files sent back to IM directly
156
189
  - Light / dark theme and i18n (Chinese & English)
157
190
 
158
- ### Skills
191
+ ### MCP Bridge & Automation
159
192
 
160
- - Project-level skills at `.pikiclaw/skills/*/SKILL.md`
161
- - Compatible with `.claude/commands/*.md`
162
- - Legacy `.claude/skills` / `.agents/skills` support with migration path
163
- - Trigger via `/skills` and `/sk_<name>` in chat
193
+ Each agent stream launches a session-scoped MCP bridge that injects tools from three sources:
194
+
195
+ 1. **Built-in tools** `im_list_files`, `im_send_file` (send files back to IM in real time)
196
+ 2. **User extensions** all enabled MCP servers (global + workspace) are merged and registered
197
+ 3. **GUI automation** (optional):
198
+ - **Browser** — managed Chrome profile via `@playwright/mcp`; log in once, reuse across tasks
199
+ - **Desktop** — Appium Mac2 with `desktop_open_app`, `desktop_snapshot`, `desktop_click`, `desktop_type`, `desktop_screenshot`
164
200
 
165
201
  ### Codex Human Loop
166
202
 
167
203
  When Codex requests additional user input mid-task, pikiclaw surfaces the question as an interactive prompt in your IM. Reply there and the task continues.
168
204
 
169
- ### MCP & GUI Automation
170
-
171
- Each agent stream launches a session-scoped MCP bridge that injects local tools:
172
-
173
- - `im_list_files` — list session workspace files
174
- - `im_send_file` — send files back to IM in real time
175
-
176
- Optional GUI capabilities:
177
-
178
- - **Browser automation** — managed Chrome profile via `@playwright/mcp`; log in once, reuse across tasks
179
- - **macOS desktop automation** — Appium Mac2 with `desktop_open_app`, `desktop_snapshot`, `desktop_click`, `desktop_type`, `desktop_screenshot`
180
-
181
205
  ---
182
206
 
183
207
  ## Commands
@@ -188,10 +212,13 @@ Optional GUI capabilities:
188
212
  | `/sessions` | View, switch, or create sessions |
189
213
  | `/agents` | Switch agent |
190
214
  | `/models` | View and switch model / reasoning effort |
215
+ | `/mode` | Toggle plan mode (reasoning effort) |
191
216
  | `/switch` | Browse and switch working directory |
217
+ | `/stop` | Stop current session |
192
218
  | `/status` | Runtime status, tokens, usage, session info |
193
219
  | `/host` | Host CPU / memory / disk / battery |
194
220
  | `/skills` | Browse project skills |
221
+ | `/ext` | Extensions overview |
195
222
  | `/restart` | Restart and re-launch bot |
196
223
  | `/sk_<name>` | Run a project skill |
197
224
 
@@ -203,11 +230,13 @@ Plain text messages are forwarded directly to the current agent.
203
230
 
204
231
  - Persistent config lives in `~/.pikiclaw/setting.json`
205
232
  - The Dashboard is the primary configuration interface
233
+ - Global MCP extensions are stored in `~/.pikiclaw/setting.json` under `extensions.mcp`
234
+ - Workspace MCP extensions use the standard `.mcp.json` format
206
235
 
207
236
  <details>
208
237
  <summary>GUI automation setup</summary>
209
238
 
210
- **Browser automation** is managed by the dashboard and runtime together — a dedicated Chrome profile is created and reused automatically. Just log in to the sites you need once in that browser.
239
+ **Browser automation** is managed by the dashboard — a dedicated Chrome profile is created and reused automatically. Log in to the sites you need once in that browser and every future agent session can reuse those credentials.
211
240
 
212
241
  **macOS desktop automation** requires Appium Mac2:
213
242
 
@@ -230,7 +259,7 @@ Relevant environment variables:
230
259
  ## Roadmap
231
260
 
232
261
  - **ACP (Agent Client Protocol) adoption** — unified driver for any ACP-compatible agent, replacing per-agent CLI output parsing. See [ACP Migration Plan](docs/acp-migration.md)
233
- - Expand session-scoped MCP bridge into a more complete top-level tool layer
262
+ - Expand extension ecosystem more recommended MCP servers, skill templates, and community tooling
234
263
  - Improve GUI automation, especially browser + desktop tool coordination
235
264
  - More IM channels (WhatsApp, etc.)
236
265
 
@@ -266,6 +295,15 @@ Contributions are welcome! Whether it's a bug fix, new feature, or documentation
266
295
  - Check out [`good first issue`](https://github.com/xiaotonng/pikiclaw/labels/good%20first%20issue) and [`help wanted`](https://github.com/xiaotonng/pikiclaw/labels/help%20wanted) labels for contribution ideas
267
296
  - Open an issue first for larger changes so we can discuss the approach
268
297
 
298
+ Common contribution areas:
299
+
300
+ | Task | Where to start |
301
+ |------|----------------|
302
+ | Add an agent driver | `src/agent/driver.ts`, `src/agent/drivers/*.ts` |
303
+ | Add an IM channel | `src/channels/base.ts`, any `src/channels/*/` |
304
+ | Add a dashboard route | `src/dashboard/routes/*.ts` |
305
+ | Change MCP tools | `src/agent/mcp/tools/*.ts`, `src/agent/mcp/bridge.ts` |
306
+
269
307
  ---
270
308
 
271
309
  ## License
@@ -0,0 +1 @@
1
+ import{r,j as e}from"./react-vendor-DTcmqLiz.js";import{u as I,e as xe,a as H,g as R,B as y,E as ge,S as q,d as Y,c as pe}from"./index-Bbf__IXB.js";import{B as he}from"./BrandIcon-BAXeIuGD.js";import{M as ve,a as be,L as P}from"./Modal-utaCOq7k.js";import{S as K}from"./Select-DBMtcZku.js";import{S as Z}from"./shared-BRvVjyDB.js";import"./router-emLofBBH.js";const je=["claude","codex","gemini"];function Ne(t){return t==="zh-CN"?{defaultsTitle:"新会话默认值",defaultsHint:"新会话会默认采用这里的智能体、模型和推理强度。",defaultsEditTitle:"编辑新会话默认值",defaultsEditHint:"在弹窗中选择默认智能体、模型和推理强度,保存后对新会话生效。",defaultsSaved:"新会话默认值已保存",editDefaults:"修改默认值",agentsTitle:"可用智能体",defaultAgent:"默认智能体",defaultModel:"默认模型",defaultEffort:"推理强度",status:"状态",model:"模型",models:"模型",version:"版本",defaultBadge:"默认",installed:"已安装",notInstalled:"未安装",noModel:"暂无可选模型",currentModelPrefix:"当前模型",availableModelsSuffix:"个可选",availableModels:"可用模型",recommendedFor:"建议场景",currentConfig:"当前配置",effort:"推理强度",readyHint:"已安装,可直接作为新会话执行智能体。",installHint:"尚未安装,需要先完成本地 CLI 安装。",noVersion:"版本未知",moreModels:s=>`+${s}`,install:"安装",installing:"安装中...",noEffort:"不支持调整",loadFailed:"无法加载智能体状态",latestVersion:"最新版本",updateAvailable:"有新版本可用",updateSkipped:"自动更新已跳过",updateFailed:"自动更新失败",update:"手动升级",updating:"升级中...",checkUpdate:"检查更新",checking:"检查中...",upToDate:"已是最新"}:{defaultsTitle:"New Session Defaults",defaultsHint:"New sessions use this agent, model, and effort by default.",defaultsEditTitle:"Edit New Session Defaults",defaultsEditHint:"Choose the default agent, model, and effort in the modal, then save them for new sessions.",defaultsSaved:"New session defaults saved",editDefaults:"Edit Defaults",agentsTitle:"Available Agents",defaultAgent:"Default Agent",defaultModel:"Default Model",defaultEffort:"Effort",status:"Status",model:"Model",models:"Models",version:"Version",defaultBadge:"Default",installed:"Installed",notInstalled:"Not installed",noModel:"No selectable models",currentModelPrefix:"Current model",availableModelsSuffix:"available",availableModels:"Available models",recommendedFor:"Recommended for",currentConfig:"Current config",effort:"Effort",readyHint:"Installed and ready for new sessions.",installHint:"Not installed locally yet.",noVersion:"Version unavailable",moreModels:s=>`+${s}`,install:"Install",installing:"Installing...",noEffort:"Not supported",loadFailed:"Failed to load agent status",latestVersion:"Latest",updateAvailable:"Update available",updateSkipped:"Auto-update skipped",updateFailed:"Auto-update failed",update:"Update",updating:"Updating...",checkUpdate:"Check update",checking:"Checking...",upToDate:"Up to date"}}function Me(t,s){const n=t.filter(u=>u.installed);return(n.length?n:t).map(u=>({value:u.agent,label:`${R(u.agent).label} · ${u.installed?u.version||s.installed:s.notInstalled}`}))}function ke(t){if(!t)return[];const s=t.models.map(n=>({value:n.id,label:n.alias?`${n.alias} · ${n.id}`:n.id}));return t.selectedModel&&!s.some(n=>n.value===t.selectedModel)&&s.unshift({value:t.selectedModel,label:t.selectedModel}),s}function Ae(t){return t?ge[t.agent].map(s=>({value:s,label:s})):[]}function Ee(t,s){if(!t.models.length)return s.noModel;const n=t.selectedModel?t.models.find(u=>u.id===t.selectedModel):t.models[0],m=n?.alias||n?.id||s.noModel;return`${s.currentModelPrefix}: ${m} · ${t.models.length} ${s.availableModelsSuffix}`}function se(t){return t?t.alias||t.id:"—"}function le(t,s){if(!t.models.length)return s.noModel;const n=t.selectedModel?t.models.find(m=>m.id===t.selectedModel):t.models[0];return se(n)}function Se(t,s=4){const n=new Set;return t.models.map(u=>({key:u.id,label:se(u)})).filter(u=>n.has(u.key)?!1:(n.add(u.key),!0)).slice(0,s)}function ee(t,s){t({defaultAgent:s.defaultAgent,agents:s.agents})}function te(t,s){return{agent:t?.agent||s,model:t?.selectedModel||"",effort:t?.selectedEffort||""}}function G({label:t,value:s,hint:n,loading:m=!1}){return e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt px-3.5 py-2.5",children:[e.jsx("div",{className:"text-[10px] font-semibold uppercase tracking-[0.14em] text-fg-5",children:t}),e.jsxs("div",{className:"mt-1 flex items-center gap-2 text-[13px] font-semibold text-fg-2",children:[m&&e.jsx(q,{className:"h-3.5 w-3.5"}),e.jsx("span",{children:s})]}),n&&e.jsx("div",{className:"mt-0.5 text-[10px] leading-relaxed text-fg-5",children:n})]})}function we({agent:t,copy:s,t:n,installing:m,onInstall:u,updatingAgent:o,checkingAgent:d,onUpdate:A,onCheckUpdate:U,loading:c=!1}){const E=R(t.agent),V=Ee(t,s),O=le(t,s),j=E.advantageKey?n(E.advantageKey):"—",D=Se(t),F=Math.max(0,t.models.length-D.length),_=t.selectedEffort||s.noEffort,S=t.version||s.noVersion,N=c?n("status.loading"):t.installed?s.installed:s.notInstalled,i=c?"muted":t.installed?"ok":"warn",w=c?n("status.loading"):t.installed?s.readyHint:s.installHint,C=c?n("status.loading"):O,g=c?n("status.loading"):_,p=c?n("status.loading"):j,h=c?n("status.loading"):V;return e.jsx("div",{className:"glass rounded-md border border-edge px-4 py-3 shadow-[0_1px_0_rgba(255,255,255,0.02),0_4px_12px_rgba(15,23,42,0.05)]",children:e.jsxs("div",{className:"grid gap-x-5 gap-y-3 xl:grid-cols-[220px_130px_220px_minmax(0,1fr)_auto] xl:items-start",children:[e.jsx("div",{className:"min-w-0",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"flex h-10 w-10 shrink-0 items-center justify-center rounded-md border border-edge bg-panel-alt",children:e.jsx(he,{brand:t.agent,size:22})}),e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("div",{className:"text-[15px] font-semibold text-fg",children:E.label}),t.isDefault&&e.jsx(Y,{variant:"accent",children:s.defaultBadge})]}),e.jsxs("div",{className:"mt-1 text-[12px] leading-relaxed text-fg-5",children:[s.version,": ",S,t.latestVersion&&t.updateAvailable&&e.jsxs("span",{className:"ml-1.5 text-amber-400",children:["→ ",t.latestVersion]}),t.latestVersion&&!t.updateAvailable&&t.installed&&e.jsx("span",{className:"ml-1.5 text-emerald-400",children:"✓"})]})]})]})}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[10px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:s.status}),e.jsx("div",{className:"mt-1.5",children:e.jsxs(Y,{variant:i,children:[c&&e.jsx(q,{className:"h-3 w-3"}),N]})}),e.jsx("div",{className:"mt-1.5 text-[12px] leading-relaxed text-fg-5",children:w})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[10px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:s.currentConfig}),e.jsxs("div",{className:"mt-1.5 space-y-1.5 text-[13px] leading-relaxed text-fg-3",children:[e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("span",{className:"w-16 shrink-0 text-fg-5",children:s.model}),e.jsx("span",{className:"min-w-0 break-words text-fg-2",children:C})]}),e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("span",{className:"w-16 shrink-0 text-fg-5",children:s.effort}),e.jsx("span",{className:"text-fg-2",children:g})]})]})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[10px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:s.recommendedFor}),e.jsx("div",{className:"mt-1.5 text-[13px] leading-relaxed text-fg-3",children:p}),e.jsx("div",{className:"mt-2.5 text-[10px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:s.availableModels}),e.jsxs("div",{className:"mt-1.5 flex flex-wrap items-center gap-1.5",children:[!c&&D.length>0?D.map(v=>e.jsx("span",{className:"inline-flex h-6 max-w-full items-center rounded-md border border-edge bg-panel-alt px-2 text-[11px] text-fg-3",title:v.key,children:e.jsx("span",{className:"truncate",children:v.label})},v.key)):e.jsx("span",{className:"text-[12px] text-fg-5",children:c?n("status.loading"):s.noModel}),!c&&F>0&&e.jsx("span",{className:"inline-flex h-6 items-center rounded-md border border-edge bg-panel-alt px-2 text-[11px] text-fg-5",children:s.moreModels(F)})]}),e.jsx("div",{className:"mt-1.5 text-[12px] leading-relaxed text-fg-5",children:h})]}),e.jsxs("div",{className:pe("flex flex-col items-start gap-1.5 xl:items-end",t.installed&&"xl:self-start"),children:[c&&e.jsxs("div",{className:"inline-flex h-7 items-center gap-2 rounded-md border border-edge bg-transparent px-2.5 text-[11px] text-fg-5",children:[e.jsx(q,{className:"h-3 w-3"}),n("status.loading")]}),!c&&!t.installed&&e.jsx(y,{variant:"outline",size:"sm",disabled:m,onClick:()=>u(t),children:m?s.installing:s.install}),!c&&t.installed&&t.updateAvailable&&e.jsx(y,{variant:"primary",size:"sm",disabled:o,onClick:()=>A(t),children:o?s.updating:s.update}),!c&&t.installed&&!t.updateAvailable&&e.jsx(y,{variant:"ghost",size:"sm",disabled:d,onClick:()=>U(t),children:d?s.checking:s.checkUpdate}),!c&&t.installed&&t.updateAvailable&&t.updateStatus==="skipped"&&t.updateDetail&&e.jsxs("div",{className:"text-[11px] leading-relaxed text-amber-400",children:[s.updateSkipped,": ",t.updateDetail]}),!c&&t.installed&&t.updateStatus==="failed"&&t.updateDetail&&e.jsxs("div",{className:"text-[11px] leading-relaxed text-red-400",children:[s.updateFailed,": ",t.updateDetail]})]})]})})}function Ve(){const t=I(l=>l.locale),s=I(l=>l.toast),n=I(l=>l.agentStatus),m=I(l=>l.setAgentStatus),u=I(l=>l.refreshAgentStatus),o=r.useMemo(()=>xe(t),[t]),d=Ne(t),[A,U]=r.useState(n?{defaultAgent:n.defaultAgent,agents:n.agents}:null),[c,E]=r.useState(!n),[V,O]=r.useState(null),[j,D]=r.useState(!1),[F,_]=r.useState(null),[S,N]=r.useState(!1),[i,w]=r.useState({agent:"codex",model:"",effort:""}),C=r.useRef(!!n);r.useEffect(()=>{n&&(ee(U,n),C.current||(C.current=!0,E(!1)))},[n]);const g=r.useCallback(l=>{ee(U,l),m(l)},[m]),p=r.useCallback(async()=>{C.current||E(!0);try{const l=await H.getAgentStatus();return g(l),O(null),C.current=!0,l}catch(l){const a=l instanceof Error?l.message:d.loadFailed;return O(a),C.current||s(a,!1),null}finally{E(!1)}},[g,d.loadFailed,s]);r.useEffect(()=>{n?u():p()},[]);const h=r.useMemo(()=>{const l=A?.agents||[],a=new Map(l.map(f=>[f.agent,f]));return je.map(f=>{const T=a.get(f);if(T)return T;const b=R(f);return{agent:f,label:b.label,installed:!1,version:void 0,installCommand:void 0,selectedModel:null,selectedEffort:null,isDefault:A?.defaultAgent===f,models:[],usage:null}})},[A]),v=A?.defaultAgent||"codex",M=h.find(l=>l.agent===v)||null,J=h.filter(l=>l.installed).length>0,ae=Me(h,d),x=h.find(l=>l.agent===i.agent)||null,L=ke(x),$=Ae(x),Q=r.useCallback(async l=>{D(!0);try{const a=await H.updateRuntimeAgent(l);if(!a.ok)throw new Error(a.error||o("config.applyFailed"));return g(a),a}catch(a){const f=a instanceof Error?a.message:o("config.applyFailed");return s(f,!1),p(),null}finally{D(!1)}},[g,p,o,s]);r.useEffect(()=>{S&&w(te(M,v))},[v,M,S]),r.useEffect(()=>{if(!S||!x)return;const l=x.selectedModel||"",a=!i.model||L.some(b=>b.value===i.model),f=x.selectedEffort||"",T=!i.effort||$.some(b=>b.value===i.effort);a&&T||w(b=>({...b,model:a?b.model:l,effort:T?b.effort:f}))},[S,i.effort,i.model,x,$,L]);const ne=r.useCallback(l=>{const a=h.find(f=>f.agent===l);a?.installed&&w(te(a,a.agent))},[h]),de=r.useCallback(async()=>{if(!x?.installed)return;const l={};if(i.agent!==v&&(l.defaultAgent=i.agent),i.model&&i.model!==(x.selectedModel||"")&&(l.agent=i.agent,l.model=i.model),i.effort&&i.effort!==(x.selectedEffort||"")&&(l.agent=i.agent,l.effort=i.effort),Object.keys(l).length===0){N(!1);return}await Q(l)&&(s(d.defaultsSaved),N(!1))},[d.defaultsSaved,v,i.agent,i.effort,i.model,x,s,Q]),ie=r.useCallback(async l=>{if(!F){_(l.agent);try{const a=await H.installAgent(l.agent);if(!a.ok)throw new Error(a.error||o("config.agentInstallFailed"));g(a),s(o("config.agentInstalled"))}catch(a){const f=a instanceof Error?a.message:o("config.agentInstallFailed");s(f,!1),p()}finally{_(a=>a===l.agent?null:a)}}},[g,F,p,o,s]),[B,W]=r.useState(null),[z,X]=r.useState(null),re=r.useCallback(async l=>{if(!B){W(l.agent);try{const a=await H.updateAgent(l.agent);if(!a.ok)throw new Error(a.error||o("config.agentInstallFailed"));g(a),s(d.upToDate)}catch(a){const f=a instanceof Error?a.message:d.updateFailed;s(f,!1),p()}finally{W(a=>a===l.agent?null:a)}}},[g,d.updateFailed,d.upToDate,p,o,s,B]),oe=r.useCallback(async l=>{if(!z){X(l.agent);try{const a=await H.checkAgentUpdate(l.agent);if(!a.ok)throw new Error(a.error||d.loadFailed);g(a)}catch(a){const f=a instanceof Error?a.message:d.loadFailed;s(f,!1),p()}finally{X(a=>a===l.agent?null:a)}}},[g,z,d.loadFailed,p,s]),k=c&&!A,ce=k?o("status.loading"):M?R(M.agent).label:d.notInstalled,fe=k?o("status.loading"):M?.installed?d.installed:d.notInstalled,ue=k?o("status.loading"):M?le(M,d):d.noModel,me=k?o("status.loading"):M?.selectedEffort||d.noEffort;return e.jsxs("div",{className:"animate-in space-y-4",children:[e.jsx("section",{className:"space-y-3",children:e.jsxs(Z,{className:"space-y-3",children:[e.jsxs("div",{className:"flex flex-col gap-3 lg:flex-row lg:items-start lg:justify-between",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-base font-semibold tracking-tight text-fg",children:d.defaultsTitle}),e.jsx("div",{className:"mt-0.5 text-[13px] leading-relaxed text-fg-4",children:d.defaultsHint})]}),e.jsx("div",{className:"flex justify-end",children:e.jsx(y,{variant:"secondary",onClick:()=>N(!0),disabled:j||!J,children:d.editDefaults})})]}),e.jsxs("div",{className:"grid gap-2.5 lg:grid-cols-3",children:[e.jsx(G,{label:d.defaultAgent,value:ce,hint:fe,loading:k}),e.jsx(G,{label:d.defaultModel,value:ue,loading:k}),e.jsx(G,{label:d.defaultEffort,value:me,loading:k})]})]})}),e.jsxs("section",{className:"space-y-3",children:[e.jsx("div",{className:"text-[11px] font-semibold uppercase tracking-[0.18em] text-fg-5",children:d.agentsTitle}),e.jsx("div",{className:"space-y-3",children:h.map(l=>e.jsx(we,{agent:l,copy:d,t:o,installing:F===l.agent,loading:k,onInstall:ie,updatingAgent:B===l.agent,checkingAgent:z===l.agent,onUpdate:re,onCheckUpdate:oe},l.agent))})]}),V&&e.jsx(Z,{className:"border-amber-500/20 bg-amber-500/5",children:e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[e.jsx("div",{className:"text-[13px] text-fg-2",children:V}),e.jsx(y,{variant:"outline",size:"sm",onClick:()=>{p()},children:o("sessions.retry")})]})}),e.jsxs(ve,{open:S,onClose:()=>N(!1),children:[e.jsx(be,{title:d.defaultsEditTitle,description:d.defaultsEditHint,onClose:()=>N(!1)}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx(P,{children:d.defaultAgent}),e.jsx(K,{value:i.agent,options:ae,onChange:ne,disabled:j||!J,placeholder:d.notInstalled})]}),e.jsxs("div",{children:[e.jsx(P,{children:d.defaultModel}),e.jsx(K,{value:i.model,options:L,onChange:l=>w(a=>({...a,model:l})),disabled:j||!x?.installed||L.length===0,placeholder:d.noModel})]}),e.jsxs("div",{children:[e.jsx(P,{children:d.defaultEffort}),e.jsx(K,{value:i.effort,options:$,onChange:l=>w(a=>({...a,effort:l})),disabled:j||!x?.installed||$.length===0,placeholder:d.noEffort})]})]}),e.jsxs("div",{className:"mt-6 flex justify-end gap-2",children:[e.jsx(y,{variant:"ghost",onClick:()=>N(!1),children:o("modal.cancel")}),e.jsx(y,{variant:"primary",disabled:j||!x?.installed,onClick:()=>{de()},children:o(j?"config.validating":"modal.save")})]})]})]})}export{Ve as AgentTab,Ve as default};
@@ -1 +1 @@
1
- import{j as t}from"./react-vendor-DTcmqLiz.js";import{c as s}from"./index-ppK_28CF.js";const o="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAF+0lEQVRYha2XbXBUZxXHf+e5u4SkCZjg0NIWnQLJLgRF5UWnL75MP9gMjqPT2eyC0qlMiYxOUAR206LOyhiSTVscp52O0xamWgu7WTp0qLUz6kht6Qed1L7M5GUTsAoDTRSIJJos2b33+GFfWMJuNqmcT/c595z/+d3nOc+9zxXKWE9Li7tm0fjyqmT6H0t/Fp8sFz9XM+UCauouH8Rx+ifmWWdP7Q0sLRbT98g3lySC/mcSQd+GGwrQt2vzx1G2ZEa6KJ3S1mJxlpOKIDyEmEM3FGCk5vw5YCw3FmFbb9hXfV2gcm/26vINBfhS+LU0qgcKXB9xT1hbr6kdDhtgcYaDxHSNwVBg92Ao0DMY8n97zgAAZnK8U2AoX1D0++rzWfkC44k6wAVghP7C3EQo8Iiijyq61oEDiV2bPjojwKk234pEsPnh/lDgzpyv/olXrwi6qyDsjsQy2ZQXmJdefPWWvp0v3uZ/CLQ9NxZINpxJj84IYDvmOUT2G/T1DD0CUB/pflnhd1eT5Mcnwl90Adi23JzPl9TbAEN7fF9AeapQW5AOicftGQFEOJ+9tEDbB9v8x99r21wLYBlnJ5AGUKhfklz8QEbY3J71nVnZceziUPAbtzvGxAB3wdPH6yPRx6cXvw4gbbm/B5zIO5SvVKjdMxAMrKvviPcpHMyLqvyoN+ybh7AUwIi+M9TaVOGI/SJwc4Fsf6rS2SqgxQBkukPDYTM40RdCZB/Z5gKmEGmzjStq2alBoDqbvF2hEWgF9oEuAvlugdx/Deaz9ZEjvcWKFwXIWaLNv14cDqmwugDvFRVOi8qOrOMdhT6BzQhvoNxzjbjItxo6o8+VqjEjAMBQa1OFXbXwh4KGuLqmDleXToHzwG1FpLs9kah/uvf98IPz08nkSuZbp+vDL4zNCJAHaQt82lH9JfCJ2cQrTFjq8hiZGrfVtQGcDQhrFNYAywELuFw15SwRgN6dvrrahcnkreGXJ0pCtDZVOFULwsCerEBJExhVGAY8FH/Z2cBvPJHY1ySx13cbaXMaqACSwCVRLqlhVNBRVTOm4lxCOSdqPkB0FdA2m5kosGGEHpC3UP2z6uRJb9fx8SwsJEL+nwBNwEKgWqBSoXaORQqtH+VNhDdErJMNnYf/ViqwbBNO3lRbVZFSS9yyIG1jucRuVuGnM6TZZL4d/wS9KEgawIH/gF5EzAWBvzecto9KPG7PqgkBTu0NLHVs7VBlcxnwS8ALgtyp6Kco3S9/OF850lQWYCD41RpMZUiUH5BZmgkRDqmyVaCqeJYeS1dqwJq4UoG56S5w7hb4PMp6YH426LJR1+qSAOrzWYPLZCvIPuAWAIHXxGGXY3geWAV6DOTrJRR+r5q8P9dskNtJ1etBVl4R19FPdh4eLQowEPR5RKxfgebOeGMqGvLMX/V0YrK/W+B+4ATCYZRnEJ5E+Q5gFM4AFwQ+I8hbLks2Ltt/ZKTUg163Rwfamrcj5q/54spvLZes9nZ2/yIx0b8jW/wCLmeLOLoCAEdeAjmYnaWPGXga9Jiia1O28+bAbt8dswJQEFF5IrO2chGVBzxdsY0r2qNnBx5uvkuELkAFedDTHj+nIl4AIzJsjL2XTAOisB+XtqryKLBcLHNyKLSpsSyAgKrKJoRtbksaPV3R5yFz7BaHOOBGOdAQib6SRV4L4KQZqe+I/wvYmZWqE1ue8nbFggjbgDoH/VOxY3vZXdDT0uKuqR37I+jdIH9JV9r3NIbjU717fLe4jPkASDVEYhW5730i2PwqIvdlZkK3eCPdv06E/GuAbmCBJxJbUnIGill13b8fyxRnRG070BiOTwG4MeuyszBSeNiw3KZFYDTzdPLzU7u3LPZEYu+qTq5Tlev+K2YESAQD94rKjqzgl72Pxd/P3VNLsgAyXJizoj161kG3Z4d1aZP6HIC36/i4tyt6dE4AasQNDIhxNnoisXevvZndJcLw9DxvpLsb5XGE9yzD2ZlqzPpVPN0SIf854FaUZz1dsW0fVqdsD5Q05Qhgg7z+oTX+Xyv2pzNX+x+eTlGviPgh3AAAAABJRU5ErkJggg==",g="/assets/codex-DYadqqp0.png",r="/assets/feishu-C4OMrjCW.ico",a="/assets/gemini-BYkEpiWr.svg",n="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20width='16px'%20height='16px'%20viewBox='0%200%2016%2016'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%3e%3cdefs%3e%3clinearGradient%20x1='50%25'%20y1='0%25'%20x2='50%25'%20y2='100%25'%20id='linearGradient-1'%3e%3cstop%20stop-color='%2338AEEB'%20offset='0%25'%3e%3c/stop%3e%3cstop%20stop-color='%23279AD1'%20offset='100%25'%3e%3c/stop%3e%3c/linearGradient%3e%3c/defs%3e%3cg%20id='Artboard'%20stroke='none'%20stroke-width='1'%20fill='none'%20fill-rule='evenodd'%3e%3ccircle%20id='Oval'%20fill='url(%23linearGradient-1)'%20cx='8'%20cy='8'%20r='8'%3e%3c/circle%3e%3cpath%20d='M3.17026167,7.83635602%20C5.78750201,6.74265999%207.53273882,6.02162863%208.40597211,5.67326193%20C10.8992306,4.67860423%2011.2454541,4.53439191%2011.5831299,4.52864956%20C11.6573986,4.52743168%2011.8385417,4.55776042%2011.9798438,4.67645833%20C12.1211458,4.79515625%2012.1635786,4.87206678%2012.1755371,4.93908691%20C12.1874957,5.00610705%2012.1862759,5.21456762%2012.1744385,5.3338623%20C12.0393279,6.69547283%2011.5259342,9.83829771%2011.2285121,11.3633248%20C11.1026617,12.008621%2010.8548582,12.2249854%2010.6149558,12.2461596%20C10.0935924,12.2921758%209.69769267,11.9156852%209.19272668,11.5981993%20C8.40255458,11.1013965%208.13911734,10.9180161%207.3721185,10.4332283%20C6.48571864,9.87297217%206.85080034,9.6784879%207.35595703,9.17524981%20C7.48815894,9.04355001%209.67825076,7.04590073%209.71077046,6.86250183%20C9.7391276,6.70257812%209.7494847,6.68189389%209.67664063,6.60973958%20C9.60379655,6.53758527%209.51674192,6.54658941%209.46083149,6.55876051%20C9.38158015,6.57601267%208.17521836,7.33962686%205.84174612,8.84960308%20C5.48344358,9.08558775%205.15890428,9.20056741%204.86812819,9.19454205%20C4.54757089,9.18789957%203.93094724,9.02070014%203.47255094,8.87778221%20C2.91030922,8.70248755%202.46345069,8.609808%202.50236203,8.31210343%20C2.52262946,8.15704047%202.74526267,7.998458%203.17026167,7.83635602%20Z'%20id='Path-3'%20fill='%23FFFFFF'%3e%3c/path%3e%3c/g%3e%3c/svg%3e",d="data:image/svg+xml,%3csvg%20width='128'%20height='128'%20viewBox='0%200%20128%20128'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20width='128'%20height='128'%20rx='28'%20fill='%2307C160'/%3e%3cpath%20d='M42%2033c-16.569%200-30%2011.64-30%2026%200%208.084%204.283%2015.306%2011.008%2020.073L18%2095l20.832-8.102A37.33%2037.33%200%200%200%2042%2087c16.569%200%2030-11.64%2030-26S58.569%2033%2042%2033Z'%20fill='%23fff'/%3e%3cpath%20d='M85%2048c-13.807%200-25%209.402-25%2021%200%2011.598%2011.193%2021%2025%2021%202.545%200%205-.319%207.29-.91L109%2095l-4.772-12.27C109.078%2079.05%20112%2074.232%20112%2069c0-11.598-12.193-21-27-21Z'%20fill='%23fff'%20opacity='.95'/%3e%3ccircle%20cx='33'%20cy='56'%20r='4.5'%20fill='%2307C160'/%3e%3ccircle%20cx='50'%20cy='56'%20r='4.5'%20fill='%2307C160'/%3e%3ccircle%20cx='77'%20cy='66'%20r='4'%20fill='%2307C160'/%3e%3ccircle%20cx='92'%20cy='66'%20r='4'%20fill='%2307C160'/%3e%3c/svg%3e",w="/assets/playwright-BldPFZgC.ico",h="/assets/appium-Ra-JU1qL.png",x="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%3e%3cpath%20d='M23.15%202.587L18.21.21a1.494%201.494%200%200%200-1.705.29l-9.46%208.63-4.12-3.128a.999.999%200%200%200-1.276.057L.327%207.261A1%201%200%200%200%20.326%208.74L3.899%2012%20.326%2015.26a1%201%200%200%200%20.001%201.479L1.65%2017.94a.999.999%200%200%200%201.276.057l4.12-3.128%209.46%208.63a1.492%201.492%200%200%200%201.704.29l4.942-2.377A1.5%201.5%200%200%200%2024%2020.06V3.939a1.5%201.5%200%200%200-.85-1.352zm-5.146%2014.861L10.826%2012l7.178-5.448v10.896z'%20fill='%23007ACC'/%3e%3c/svg%3e",f="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%3e%3crect%20width='24'%20height='24'%20rx='5.5'%20fill='%2319191C'/%3e%3cpath%20d='M7%205l10%207-4.5%201.5L15.5%2019l-2.2.8-3-5.5L7%2017z'%20fill='%23fff'/%3e%3c/svg%3e",A="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%3e%3crect%20width='24'%20height='24'%20rx='5.5'%20fill='%230BA48A'/%3e%3cpath%20d='M8%2018l2-12h2.5l-1.2%205h4.2L10%2018H8zm3.5-3.5l3-7.5'%20fill='%23fff'%20fill-rule='evenodd'/%3e%3c/svg%3e",v="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%3e%3crect%20width='24'%20height='24'%20rx='5.5'%20fill='%234A90D9'/%3e%3crect%20x='5'%20y='5'%20width='14'%20height='12'%20rx='1.5'%20fill='%236DB3F2'/%3e%3crect%20x='5'%20y='5'%20width='14'%20height='3.5'%20rx='1.5'%20fill='%233D7ABF'/%3e%3ccircle%20cx='8.5'%20cy='6.8'%20r='.8'%20fill='%23FF5F57'/%3e%3ccircle%20cx='11'%20cy='6.8'%20r='.8'%20fill='%23FEBC2E'/%3e%3ccircle%20cx='13.5'%20cy='6.8'%20r='.8'%20fill='%2328C840'/%3e%3crect%20x='7'%20y='10.5'%20width='10'%20height='1'%20rx='.5'%20fill='%23fff'%20opacity='.7'/%3e%3crect%20x='7'%20y='13'%20width='7'%20height='1'%20rx='.5'%20fill='%23fff'%20opacity='.5'/%3e%3c/svg%3e",L={claude:o,codex:g,gemini:a,telegram:n,feishu:r,weixin:d,playwright:w,appium:h,vscode:x,cursor:f,windsurf:A,finder:v};function C({brand:i,size:e=18,className:l}){const c=L[i];return c?t.jsx("img",{src:c,alt:"","aria-hidden":"true",draggable:!1,className:s("shrink-0 object-contain select-none",l),style:{width:e,height:e}}):null}export{C as B};
1
+ import{j as t}from"./react-vendor-DTcmqLiz.js";import{c as s}from"./index-Bbf__IXB.js";const o="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAF+0lEQVRYha2XbXBUZxXHf+e5u4SkCZjg0NIWnQLJLgRF5UWnL75MP9gMjqPT2eyC0qlMiYxOUAR206LOyhiSTVscp52O0xamWgu7WTp0qLUz6kht6Qed1L7M5GUTsAoDTRSIJJos2b33+GFfWMJuNqmcT/c595z/+d3nOc+9zxXKWE9Li7tm0fjyqmT6H0t/Fp8sFz9XM+UCauouH8Rx+ifmWWdP7Q0sLRbT98g3lySC/mcSQd+GGwrQt2vzx1G2ZEa6KJ3S1mJxlpOKIDyEmEM3FGCk5vw5YCw3FmFbb9hXfV2gcm/26vINBfhS+LU0qgcKXB9xT1hbr6kdDhtgcYaDxHSNwVBg92Ao0DMY8n97zgAAZnK8U2AoX1D0++rzWfkC44k6wAVghP7C3EQo8Iiijyq61oEDiV2bPjojwKk234pEsPnh/lDgzpyv/olXrwi6qyDsjsQy2ZQXmJdefPWWvp0v3uZ/CLQ9NxZINpxJj84IYDvmOUT2G/T1DD0CUB/pflnhd1eT5Mcnwl90Adi23JzPl9TbAEN7fF9AeapQW5AOicftGQFEOJ+9tEDbB9v8x99r21wLYBlnJ5AGUKhfklz8QEbY3J71nVnZceziUPAbtzvGxAB3wdPH6yPRx6cXvw4gbbm/B5zIO5SvVKjdMxAMrKvviPcpHMyLqvyoN+ybh7AUwIi+M9TaVOGI/SJwc4Fsf6rS2SqgxQBkukPDYTM40RdCZB/Z5gKmEGmzjStq2alBoDqbvF2hEWgF9oEuAvlugdx/Deaz9ZEjvcWKFwXIWaLNv14cDqmwugDvFRVOi8qOrOMdhT6BzQhvoNxzjbjItxo6o8+VqjEjAMBQa1OFXbXwh4KGuLqmDleXToHzwG1FpLs9kah/uvf98IPz08nkSuZbp+vDL4zNCJAHaQt82lH9JfCJ2cQrTFjq8hiZGrfVtQGcDQhrFNYAywELuFw15SwRgN6dvrrahcnkreGXJ0pCtDZVOFULwsCerEBJExhVGAY8FH/Z2cBvPJHY1ySx13cbaXMaqACSwCVRLqlhVNBRVTOm4lxCOSdqPkB0FdA2m5kosGGEHpC3UP2z6uRJb9fx8SwsJEL+nwBNwEKgWqBSoXaORQqtH+VNhDdErJMNnYf/ViqwbBNO3lRbVZFSS9yyIG1jucRuVuGnM6TZZL4d/wS9KEgawIH/gF5EzAWBvzecto9KPG7PqgkBTu0NLHVs7VBlcxnwS8ALgtyp6Kco3S9/OF850lQWYCD41RpMZUiUH5BZmgkRDqmyVaCqeJYeS1dqwJq4UoG56S5w7hb4PMp6YH426LJR1+qSAOrzWYPLZCvIPuAWAIHXxGGXY3geWAV6DOTrJRR+r5q8P9dskNtJ1etBVl4R19FPdh4eLQowEPR5RKxfgebOeGMqGvLMX/V0YrK/W+B+4ATCYZRnEJ5E+Q5gFM4AFwQ+I8hbLks2Ltt/ZKTUg163Rwfamrcj5q/54spvLZes9nZ2/yIx0b8jW/wCLmeLOLoCAEdeAjmYnaWPGXga9Jiia1O28+bAbt8dswJQEFF5IrO2chGVBzxdsY0r2qNnBx5uvkuELkAFedDTHj+nIl4AIzJsjL2XTAOisB+XtqryKLBcLHNyKLSpsSyAgKrKJoRtbksaPV3R5yFz7BaHOOBGOdAQib6SRV4L4KQZqe+I/wvYmZWqE1ue8nbFggjbgDoH/VOxY3vZXdDT0uKuqR37I+jdIH9JV9r3NIbjU717fLe4jPkASDVEYhW5730i2PwqIvdlZkK3eCPdv06E/GuAbmCBJxJbUnIGill13b8fyxRnRG070BiOTwG4MeuyszBSeNiw3KZFYDTzdPLzU7u3LPZEYu+qTq5Tlev+K2YESAQD94rKjqzgl72Pxd/P3VNLsgAyXJizoj161kG3Z4d1aZP6HIC36/i4tyt6dE4AasQNDIhxNnoisXevvZndJcLw9DxvpLsb5XGE9yzD2ZlqzPpVPN0SIf854FaUZz1dsW0fVqdsD5Q05Qhgg7z+oTX+Xyv2pzNX+x+eTlGviPgh3AAAAABJRU5ErkJggg==",g="/assets/codex-DYadqqp0.png",r="/assets/feishu-C4OMrjCW.ico",a="/assets/gemini-BYkEpiWr.svg",n="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20width='16px'%20height='16px'%20viewBox='0%200%2016%2016'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%3e%3cdefs%3e%3clinearGradient%20x1='50%25'%20y1='0%25'%20x2='50%25'%20y2='100%25'%20id='linearGradient-1'%3e%3cstop%20stop-color='%2338AEEB'%20offset='0%25'%3e%3c/stop%3e%3cstop%20stop-color='%23279AD1'%20offset='100%25'%3e%3c/stop%3e%3c/linearGradient%3e%3c/defs%3e%3cg%20id='Artboard'%20stroke='none'%20stroke-width='1'%20fill='none'%20fill-rule='evenodd'%3e%3ccircle%20id='Oval'%20fill='url(%23linearGradient-1)'%20cx='8'%20cy='8'%20r='8'%3e%3c/circle%3e%3cpath%20d='M3.17026167,7.83635602%20C5.78750201,6.74265999%207.53273882,6.02162863%208.40597211,5.67326193%20C10.8992306,4.67860423%2011.2454541,4.53439191%2011.5831299,4.52864956%20C11.6573986,4.52743168%2011.8385417,4.55776042%2011.9798438,4.67645833%20C12.1211458,4.79515625%2012.1635786,4.87206678%2012.1755371,4.93908691%20C12.1874957,5.00610705%2012.1862759,5.21456762%2012.1744385,5.3338623%20C12.0393279,6.69547283%2011.5259342,9.83829771%2011.2285121,11.3633248%20C11.1026617,12.008621%2010.8548582,12.2249854%2010.6149558,12.2461596%20C10.0935924,12.2921758%209.69769267,11.9156852%209.19272668,11.5981993%20C8.40255458,11.1013965%208.13911734,10.9180161%207.3721185,10.4332283%20C6.48571864,9.87297217%206.85080034,9.6784879%207.35595703,9.17524981%20C7.48815894,9.04355001%209.67825076,7.04590073%209.71077046,6.86250183%20C9.7391276,6.70257812%209.7494847,6.68189389%209.67664063,6.60973958%20C9.60379655,6.53758527%209.51674192,6.54658941%209.46083149,6.55876051%20C9.38158015,6.57601267%208.17521836,7.33962686%205.84174612,8.84960308%20C5.48344358,9.08558775%205.15890428,9.20056741%204.86812819,9.19454205%20C4.54757089,9.18789957%203.93094724,9.02070014%203.47255094,8.87778221%20C2.91030922,8.70248755%202.46345069,8.609808%202.50236203,8.31210343%20C2.52262946,8.15704047%202.74526267,7.998458%203.17026167,7.83635602%20Z'%20id='Path-3'%20fill='%23FFFFFF'%3e%3c/path%3e%3c/g%3e%3c/svg%3e",d="data:image/svg+xml,%3csvg%20width='128'%20height='128'%20viewBox='0%200%20128%20128'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20width='128'%20height='128'%20rx='28'%20fill='%2307C160'/%3e%3cpath%20d='M42%2033c-16.569%200-30%2011.64-30%2026%200%208.084%204.283%2015.306%2011.008%2020.073L18%2095l20.832-8.102A37.33%2037.33%200%200%200%2042%2087c16.569%200%2030-11.64%2030-26S58.569%2033%2042%2033Z'%20fill='%23fff'/%3e%3cpath%20d='M85%2048c-13.807%200-25%209.402-25%2021%200%2011.598%2011.193%2021%2025%2021%202.545%200%205-.319%207.29-.91L109%2095l-4.772-12.27C109.078%2079.05%20112%2074.232%20112%2069c0-11.598-12.193-21-27-21Z'%20fill='%23fff'%20opacity='.95'/%3e%3ccircle%20cx='33'%20cy='56'%20r='4.5'%20fill='%2307C160'/%3e%3ccircle%20cx='50'%20cy='56'%20r='4.5'%20fill='%2307C160'/%3e%3ccircle%20cx='77'%20cy='66'%20r='4'%20fill='%2307C160'/%3e%3ccircle%20cx='92'%20cy='66'%20r='4'%20fill='%2307C160'/%3e%3c/svg%3e",w="/assets/playwright-BldPFZgC.ico",h="/assets/appium-Ra-JU1qL.png",x="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%3e%3cpath%20d='M23.15%202.587L18.21.21a1.494%201.494%200%200%200-1.705.29l-9.46%208.63-4.12-3.128a.999.999%200%200%200-1.276.057L.327%207.261A1%201%200%200%200%20.326%208.74L3.899%2012%20.326%2015.26a1%201%200%200%200%20.001%201.479L1.65%2017.94a.999.999%200%200%200%201.276.057l4.12-3.128%209.46%208.63a1.492%201.492%200%200%200%201.704.29l4.942-2.377A1.5%201.5%200%200%200%2024%2020.06V3.939a1.5%201.5%200%200%200-.85-1.352zm-5.146%2014.861L10.826%2012l7.178-5.448v10.896z'%20fill='%23007ACC'/%3e%3c/svg%3e",f="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%3e%3crect%20width='24'%20height='24'%20rx='5.5'%20fill='%2319191C'/%3e%3cpath%20d='M7%205l10%207-4.5%201.5L15.5%2019l-2.2.8-3-5.5L7%2017z'%20fill='%23fff'/%3e%3c/svg%3e",A="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%3e%3crect%20width='24'%20height='24'%20rx='5.5'%20fill='%230BA48A'/%3e%3cpath%20d='M8%2018l2-12h2.5l-1.2%205h4.2L10%2018H8zm3.5-3.5l3-7.5'%20fill='%23fff'%20fill-rule='evenodd'/%3e%3c/svg%3e",v="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%3e%3crect%20width='24'%20height='24'%20rx='5.5'%20fill='%234A90D9'/%3e%3crect%20x='5'%20y='5'%20width='14'%20height='12'%20rx='1.5'%20fill='%236DB3F2'/%3e%3crect%20x='5'%20y='5'%20width='14'%20height='3.5'%20rx='1.5'%20fill='%233D7ABF'/%3e%3ccircle%20cx='8.5'%20cy='6.8'%20r='.8'%20fill='%23FF5F57'/%3e%3ccircle%20cx='11'%20cy='6.8'%20r='.8'%20fill='%23FEBC2E'/%3e%3ccircle%20cx='13.5'%20cy='6.8'%20r='.8'%20fill='%2328C840'/%3e%3crect%20x='7'%20y='10.5'%20width='10'%20height='1'%20rx='.5'%20fill='%23fff'%20opacity='.7'/%3e%3crect%20x='7'%20y='13'%20width='7'%20height='1'%20rx='.5'%20fill='%23fff'%20opacity='.5'/%3e%3c/svg%3e",L={claude:o,codex:g,gemini:a,telegram:n,feishu:r,weixin:d,playwright:w,appium:h,vscode:x,cursor:f,windsurf:A,finder:v};function C({brand:i,size:e=18,className:l}){const c=L[i];return c?t.jsx("img",{src:c,alt:"","aria-hidden":"true",draggable:!1,className:s("shrink-0 object-contain select-none",l),style:{width:e,height:e}}):null}export{C as B};
@@ -1 +1 @@
1
- import{r,j as e}from"./react-vendor-DTcmqLiz.js";import{a as I,k as P,S as z}from"./index-ppK_28CF.js";function W({initialPath:x,maxHeight:j=420,minHeight:N=200,onSelect:p,compact:l,t:o}){const[y,k]=r.useState(""),[h,m]=r.useState(""),[g,w]=r.useState([]),[i,S]=r.useState(""),[C,$]=r.useState(!1),[D,B]=r.useState([]),[E,c]=r.useState(!1),[u,d]=r.useState(""),a=r.useCallback(async t=>{c(!0),d("");try{const s=await I.lsDir(t);if(!s.ok){d(s.error||o("modal.cannotRead")),c(!1);return}k(s.path),m(s.path),w(s.dirs),S(s.parent),$(s.isGit);const G=s.path.split("/").filter(Boolean);let v="";B(G.map(b=>(v+="/"+b,{label:b,path:v}))),p?.(s.path,s.isGit)}catch{d(o("modal.loadFailed"))}finally{c(!1)}},[o,p]);r.useEffect(()=>{x!==void 0&&a(x||void 0)},[]);const n=l?"text-[11px]":"text-xs",f=l?"py-[5px]":"py-[7px]";return e.jsxs("div",{children:[e.jsxs("div",{className:`flex items-center gap-1 ${l?"text-[10px]":"text-[11px]"} font-mono text-fg-4 mb-2 flex-wrap`,children:[e.jsx("span",{className:"cursor-pointer hover:text-fg-2 transition-colors",onClick:()=>a("/"),children:"~"}),D.map((t,s)=>e.jsxs("span",{children:[e.jsx("span",{className:"text-fg-6",children:"/"}),e.jsx("span",{className:"cursor-pointer hover:text-fg-2 transition-colors",onClick:()=>a(t.path),children:t.label})]},s)),C&&e.jsx(P,{variant:"accent",className:"ml-1 !text-[9px] !py-0 !px-1.5",children:"git"})]}),e.jsxs("div",{className:"relative",children:[!l&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"pointer-events-none absolute inset-x-0 top-0 z-10 h-5 rounded-t-lg",style:{background:"linear-gradient(to bottom, var(--th-panel-alt), rgba(0, 0, 0, 0))"}}),e.jsx("div",{className:"pointer-events-none absolute inset-x-0 bottom-0 z-10 h-5 rounded-b-lg",style:{background:"linear-gradient(to top, var(--th-panel-alt), rgba(0, 0, 0, 0))"}})]}),e.jsx("div",{className:"border border-edge rounded-lg overflow-y-auto overscroll-contain scroll-smooth bg-panel-alt",style:{maxHeight:j,minHeight:N,scrollbarGutter:"stable"},children:E?e.jsx("div",{className:`${n} text-fg-5 p-4 text-center flex items-center justify-center gap-2`,children:e.jsx(z,{className:"h-3 w-3 text-fg-5"})}):u?e.jsx("div",{className:`${n} text-red-500/70 p-4`,children:u}):e.jsxs(e.Fragment,{children:[i&&i!==y&&e.jsxs("div",{className:`flex items-center gap-2 px-3 ${f} cursor-pointer hover:bg-panel transition-colors border-b border-edge`,onClick:()=>a(i),children:[e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",className:"text-fg-5 shrink-0",children:e.jsx("polyline",{points:"15 18 9 12 15 6"})}),e.jsx("span",{className:`${n} text-fg-4`,children:".."})]}),g.length===0&&!i&&e.jsx("div",{className:`${n} text-fg-5 p-4 text-center`,children:o("modal.emptyDir")}),g.map(t=>e.jsxs("div",{className:`flex items-center gap-2 px-3 ${f} cursor-pointer hover:bg-panel transition-colors`,onClick:()=>a(t.path),children:[e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:t.name===".git"?"var(--th-primary)":"currentColor",strokeWidth:"1.8",className:"text-fg-5 shrink-0",children:e.jsx("path",{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"})}),e.jsx("span",{className:`${n} text-fg-3`,children:t.name})]},t.path))]})})]}),e.jsx("div",{className:"mt-2",children:e.jsx("input",{className:`w-full rounded-lg border border-edge bg-inset px-2.5 py-1.5 ${n} font-mono text-fg outline-none placeholder:text-fg-5 focus:border-edge-h transition-colors`,placeholder:o("modal.manualInput"),value:h,onChange:t=>m(t.target.value),onKeyDown:t=>{t.key==="Enter"&&a(h)}})})]})}export{W as D};
1
+ import{r,j as e}from"./react-vendor-DTcmqLiz.js";import{a as I,d as P,S as z}from"./index-Bbf__IXB.js";function W({initialPath:x,maxHeight:j=420,minHeight:N=200,onSelect:p,compact:l,t:o}){const[y,k]=r.useState(""),[h,m]=r.useState(""),[g,w]=r.useState([]),[i,S]=r.useState(""),[C,$]=r.useState(!1),[D,B]=r.useState([]),[E,c]=r.useState(!1),[u,d]=r.useState(""),a=r.useCallback(async t=>{c(!0),d("");try{const s=await I.lsDir(t);if(!s.ok){d(s.error||o("modal.cannotRead")),c(!1);return}k(s.path),m(s.path),w(s.dirs),S(s.parent),$(s.isGit);const G=s.path.split("/").filter(Boolean);let v="";B(G.map(b=>(v+="/"+b,{label:b,path:v}))),p?.(s.path,s.isGit)}catch{d(o("modal.loadFailed"))}finally{c(!1)}},[o,p]);r.useEffect(()=>{x!==void 0&&a(x||void 0)},[]);const n=l?"text-[11px]":"text-xs",f=l?"py-[5px]":"py-[7px]";return e.jsxs("div",{children:[e.jsxs("div",{className:`flex items-center gap-1 ${l?"text-[10px]":"text-[11px]"} font-mono text-fg-4 mb-2 flex-wrap`,children:[e.jsx("span",{className:"cursor-pointer hover:text-fg-2 transition-colors",onClick:()=>a("/"),children:"~"}),D.map((t,s)=>e.jsxs("span",{children:[e.jsx("span",{className:"text-fg-6",children:"/"}),e.jsx("span",{className:"cursor-pointer hover:text-fg-2 transition-colors",onClick:()=>a(t.path),children:t.label})]},s)),C&&e.jsx(P,{variant:"accent",className:"ml-1 !text-[9px] !py-0 !px-1.5",children:"git"})]}),e.jsxs("div",{className:"relative",children:[!l&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"pointer-events-none absolute inset-x-0 top-0 z-10 h-5 rounded-t-lg",style:{background:"linear-gradient(to bottom, var(--th-panel-alt), rgba(0, 0, 0, 0))"}}),e.jsx("div",{className:"pointer-events-none absolute inset-x-0 bottom-0 z-10 h-5 rounded-b-lg",style:{background:"linear-gradient(to top, var(--th-panel-alt), rgba(0, 0, 0, 0))"}})]}),e.jsx("div",{className:"border border-edge rounded-lg overflow-y-auto overscroll-contain scroll-smooth bg-panel-alt",style:{maxHeight:j,minHeight:N,scrollbarGutter:"stable"},children:E?e.jsx("div",{className:`${n} text-fg-5 p-4 text-center flex items-center justify-center gap-2`,children:e.jsx(z,{className:"h-3 w-3 text-fg-5"})}):u?e.jsx("div",{className:`${n} text-red-500/70 p-4`,children:u}):e.jsxs(e.Fragment,{children:[i&&i!==y&&e.jsxs("div",{className:`flex items-center gap-2 px-3 ${f} cursor-pointer hover:bg-panel transition-colors border-b border-edge`,onClick:()=>a(i),children:[e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",className:"text-fg-5 shrink-0",children:e.jsx("polyline",{points:"15 18 9 12 15 6"})}),e.jsx("span",{className:`${n} text-fg-4`,children:".."})]}),g.length===0&&!i&&e.jsx("div",{className:`${n} text-fg-5 p-4 text-center`,children:o("modal.emptyDir")}),g.map(t=>e.jsxs("div",{className:`flex items-center gap-2 px-3 ${f} cursor-pointer hover:bg-panel transition-colors`,onClick:()=>a(t.path),children:[e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:t.name===".git"?"var(--th-primary)":"currentColor",strokeWidth:"1.8",className:"text-fg-5 shrink-0",children:e.jsx("path",{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"})}),e.jsx("span",{className:`${n} text-fg-3`,children:t.name})]},t.path))]})})]}),e.jsx("div",{className:"mt-2",children:e.jsx("input",{className:`w-full rounded-lg border border-edge bg-inset px-2.5 py-1.5 ${n} font-mono text-fg outline-none placeholder:text-fg-5 focus:border-edge-h transition-colors`,placeholder:o("modal.manualInput"),value:h,onChange:t=>m(t.target.value),onKeyDown:t=>{t.key==="Enter"&&a(h)}})})]})}export{W as D};
@@ -0,0 +1 @@
1
+ import{r as l,j as e}from"./react-vendor-DTcmqLiz.js";import{u as q,a as f,b as se,B as m,S as R,D as oe,d as te,c as de}from"./index-Bbf__IXB.js";import{B as le}from"./BrandIcon-BAXeIuGD.js";import{M as re,a as ce,I as $}from"./Modal-utaCOq7k.js";import{S as ie,a as G,b as Q,c as Y}from"./shared-BRvVjyDB.js";import"./router-emLofBBH.js";function n(c,o,t){return c==="zh-CN"?o:t}function me(c){if(c.type==="http"&&c.url)return c.url;const o=c.args||[],t=c.command||"";return t==="npx"&&o.length>=2?o.filter(p=>p!=="-y").join(" "):[t,...o].join(" ")}function xe(c,o){const[t,p]=l.useState(c);return l.useEffect(()=>{const r=setTimeout(()=>p(c),o);return()=>clearTimeout(r)},[c,o]),t}const K=()=>e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M12 22v-5"}),e.jsx("path",{d:"M9 8V2"}),e.jsx("path",{d:"M15 8V2"}),e.jsx("path",{d:"M18 8v5a6 6 0 0 1-12 0V8z"})]}),ae=()=>e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:e.jsx("polygon",{points:"13 2 3 14 12 14 11 22 21 10 12 10 13 2"})}),he=()=>e.jsxs("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",children:[e.jsx("circle",{cx:"11",cy:"11",r:"8"}),e.jsx("line",{x1:"21",y1:"21",x2:"16.65",y2:"16.65"})]});function ue({open:c,onClose:o,locale:t,recommended:p,installedNames:r,scope:x,workdir:b,onAdded:w}){const v=q(a=>a.toast),[B,C]=l.useState(""),S=xe(B,300),[M,j]=l.useState([]),[L,d]=l.useState(!1),[u,E]=l.useState(!1),[g,T]=l.useState(null),[F,_]=l.useState({}),[U,P]=l.useState(!1),[A,V]=l.useState(""),[I,D]=l.useState(""),[H,k]=l.useState(""),[h,z]=l.useState({});l.useEffect(()=>{c&&(C(""),j([]),T(null),P(!1),V(""),D(""),k(""),z({}))},[c]),l.useEffect(()=>{if(!S.trim()){j([]);return}let a=!1;return d(!0),f.searchMcp(S.trim()).then(s=>{a||j(s.results||[])}).catch(()=>{a||j([])}).finally(()=>{a||d(!1)}),()=>{a=!0}},[S]);const N=l.useCallback(async(a,s)=>{E(!0);try{await f.addMcpExtension(a,s,x,b),v(n(t,`${a} 已添加`,`${a} added`),!0),w(),o()}catch(i){v(i?.message||"Failed",!1)}finally{E(!1)}},[x,b,t,v,w,o]),J=l.useCallback(a=>{const s=Object.keys(a.envSchema);if(s.length>0){T({name:a.id,command:a.command,args:a.args.join(" "),envSchema:a.envSchema}),_(Object.fromEntries(s.map(i=>[i,""])));return}N(a.id,{command:a.command,args:a.args,enabled:!0})},[N]),X=l.useCallback(a=>{const s=a.npmPackage||a.name;N(a.name.replace(/^@/,"").replace(/\//g,"-"),{command:"npx",args:["-y",s],enabled:!0})},[N]),ee=l.useCallback(()=>{if(!g)return;const a=Object.fromEntries(Object.entries(F).filter(([,i])=>i.trim())),s=g.args.trim()?g.args.trim().split(/\s+/):[];N(g.name,{command:g.command,args:s,env:Object.keys(a).length?a:void 0,enabled:!0})},[g,F,N]),O=l.useCallback(()=>{if(!A.trim()||!I.trim())return;const a=H.trim()?H.trim().split(/\s+/):[],s=Object.fromEntries(Object.entries(h).filter(([,i])=>i.trim()));N(A.trim(),{command:I.trim(),args:a,env:Object.keys(s).length?s:void 0,enabled:!0})},[A,I,H,h,N]),W=!!B.trim(),Z=W?null:p;return e.jsxs(re,{open:c,onClose:o,wide:!0,children:[e.jsx(ce,{title:n(t,"添加 MCP 服务","Add MCP Server"),description:x==="global"?n(t,"添加到全局配置,对所有工作区生效。","Added to global config, available across all workspaces."):n(t,"添加到当前工作区 .mcp.json 文件。","Added to the workspace .mcp.json file."),onClose:o}),g?e.jsxs("div",{className:"space-y-4 animate-in",children:[e.jsxs("div",{className:"flex items-center gap-2 rounded-lg border border-edge bg-panel-alt px-3 py-2",children:[e.jsx("div",{className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-md border border-edge bg-panel text-fg-3",children:e.jsx(K,{})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"text-[13px] font-semibold text-fg",children:g.name}),e.jsxs("div",{className:"mt-0.5 font-mono text-[11px] text-fg-5",children:[g.command," ",g.args]})]})]}),e.jsx("div",{className:"space-y-2",children:Object.entries(g.envSchema).map(([a,s])=>e.jsxs("div",{children:[e.jsxs("label",{className:"mb-1 flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:[a,s.required&&e.jsx("span",{className:"text-err",children:"*"})]}),e.jsx($,{value:F[a]||"",onChange:i=>_({...F,[a]:i.target.value}),type:s.secret?"password":"text",placeholder:s.description})]},a))}),e.jsxs("div",{className:"flex justify-end gap-2 border-t border-edge pt-3",children:[e.jsx(m,{variant:"ghost",onClick:()=>T(null),children:n(t,"返回","Back")}),e.jsx(m,{variant:"primary",disabled:u,onClick:ee,children:u?e.jsx(R,{}):n(t,"安装","Install")})]})]}):U?e.jsxs("div",{className:"space-y-3 animate-in",children:[e.jsxs("button",{className:"mb-1 flex items-center gap-1 text-[12px] text-fg-4 hover:text-fg-2 transition-colors",onClick:()=>P(!1),children:[e.jsx("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:e.jsx("polyline",{points:"15 18 9 12 15 6"})}),n(t,"返回搜索","Back to search")]}),e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2",children:[e.jsxs("div",{children:[e.jsx("label",{className:"mb-1.5 block text-[11px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:n(t,"名称","Name")}),e.jsx($,{value:A,onChange:a=>V(a.target.value),placeholder:"my-server"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1.5 block text-[11px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:n(t,"命令","Command")}),e.jsx($,{value:I,onChange:a=>D(a.target.value),placeholder:"npx",className:"font-mono"})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1.5 block text-[11px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:n(t,"参数","Arguments")}),e.jsx($,{value:H,onChange:a=>k(a.target.value),placeholder:"-y @example/server",className:"font-mono"})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"mb-1.5 flex items-center justify-between",children:[e.jsx("span",{className:"text-[11px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:n(t,"环境变量","Env")}),e.jsxs("button",{className:"text-[11px] font-medium text-primary hover:text-primary/80 transition-colors",onClick:()=>z({...h,NEW_KEY:""}),children:["+ ",n(t,"添加","Add")]})]}),Object.entries(h).length>0&&e.jsx("div",{className:"space-y-1 rounded-md border border-edge bg-inset/50 p-2",children:Object.entries(h).map(([a,s])=>e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx($,{className:"w-2/5 !h-7 !text-[12px] font-mono",value:a,onChange:i=>{const y={...h};delete y[a],y[i.target.value]=s,z(y)},placeholder:"KEY"}),e.jsx($,{className:"flex-1 !h-7 !text-[12px] font-mono",value:s,onChange:i=>z({...h,[a]:i.target.value}),type:a.toLowerCase().includes("token")||a.toLowerCase().includes("secret")||a.toLowerCase().includes("key")?"password":"text",placeholder:"value"}),e.jsx("button",{className:"shrink-0 rounded p-1 text-fg-5 transition-colors hover:bg-panel-h hover:text-err",onClick:()=>{const i={...h};delete i[a],z(i)},children:e.jsxs("svg",{width:"9",height:"9",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]},a))})]}),e.jsxs("div",{className:"flex justify-end gap-2 border-t border-edge pt-3",children:[e.jsx(m,{variant:"ghost",onClick:()=>P(!1),children:n(t,"取消","Cancel")}),e.jsx(m,{variant:"primary",disabled:!A.trim()||!I.trim()||u,onClick:O,children:u?e.jsx(R,{}):n(t,"添加","Add")})]})]}):e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"relative group",children:[e.jsx("div",{className:"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-fg-5/50 group-focus-within:text-fg-4 transition-colors",children:e.jsx(he,{})}),e.jsx("input",{value:B,onChange:a=>C(a.target.value),placeholder:n(t,"搜索 MCP 服务...","Search MCP servers..."),className:"w-full rounded-lg border border-edge bg-inset/50 py-2.5 pl-9 pr-3 text-[13px] text-fg outline-none placeholder:text-fg-5/40 focus:border-primary/30 focus:bg-inset focus:shadow-[0_0_0_3px_rgba(99,102,241,0.06)] transition-all duration-200",autoFocus:!0}),L&&e.jsx("div",{className:"absolute right-3 top-1/2 -translate-y-1/2",children:e.jsx(R,{className:"h-3.5 w-3.5"})})]}),e.jsx("div",{className:"max-h-[380px] overflow-y-auto space-y-1 -mx-1 px-1",children:W?M.length>0?M.map((a,s)=>{const i=a.name.replace(/^@/,"").replace(/\//g,"-"),y=r.has(i)||r.has(a.name);return e.jsxs("div",{className:"flex items-center gap-3 rounded-lg border border-edge/60 bg-panel-alt/40 px-3 py-2.5 transition-colors hover:border-edge hover:bg-panel-alt/70",children:[e.jsx("div",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-md border border-edge bg-panel text-fg-4",children:e.jsx(K,{})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"text-[13px] font-semibold text-fg",children:a.name}),a.description&&e.jsx("div",{className:"mt-0.5 text-[11px] leading-relaxed text-fg-4 line-clamp-2",children:a.description}),a.npmPackage&&a.npmPackage!==a.name&&e.jsx("div",{className:"mt-0.5 font-mono text-[10px] text-fg-5/60",children:a.npmPackage})]}),e.jsx(m,{variant:y?"ghost":"primary",size:"sm",disabled:y||u,onClick:()=>X(a),className:"shrink-0",children:y?n(t,"已安装","Installed"):u?e.jsx(R,{}):n(t,"安装","Install")})]},s)}):L?null:e.jsx("div",{className:"py-8 text-center text-[13px] text-fg-5",children:n(t,"未找到匹配的 MCP 服务","No matching MCP servers found")}):Z?.map(a=>{const s=r.has(a.id);return e.jsxs("div",{className:"flex items-center gap-3 rounded-lg border border-edge/60 bg-panel-alt/40 px-3 py-2.5 transition-colors hover:border-edge hover:bg-panel-alt/70",children:[e.jsx("div",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-md border border-edge bg-panel text-fg-4",children:e.jsx(K,{})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"text-[13px] font-semibold text-fg",children:a.name}),e.jsx("div",{className:"mt-0.5 text-[11px] leading-relaxed text-fg-4",children:t==="zh-CN"?a.descriptionZh:a.description})]}),e.jsx(m,{variant:s?"ghost":"primary",size:"sm",disabled:s||u,onClick:()=>J(a),className:"shrink-0",children:s?n(t,"已安装","Installed"):n(t,"安装","Install")})]},a.id)})}),e.jsx("div",{className:"border-t border-edge pt-3 text-center",children:e.jsx("button",{className:"text-[12px] text-fg-4 hover:text-fg-2 transition-colors",onClick:()=>P(!0),children:n(t,"手动配置自定义服务 →","Manually configure a custom server →")})})]})]})}function ge({open:c,onClose:o,locale:t,recommended:p,scope:r,workdir:x,onInstalled:b}){const w=q(d=>d.toast),[v,B]=l.useState(""),[C,S]=l.useState(""),[M,j]=l.useState(!1);l.useEffect(()=>{c&&(B(""),S(""))},[c]);const L=l.useCallback(async d=>{const u=(d||v).trim();if(u){j(!0);try{const E=await f.installSkill(u,r==="global",C.trim()||void 0,x);E.ok?(w(n(t,"技能安装成功","Skill installed"),!0),b(),o()):w(E.error||n(t,"安装失败","Installation failed"),!1)}catch(E){w(E?.message||"Failed",!1)}finally{j(!1)}}},[v,C,r,x,t,w,b,o]);return e.jsxs(re,{open:c,onClose:o,wide:!0,children:[e.jsx(ce,{title:n(t,"安装技能","Install Skill"),description:r==="global"?n(t,"使用 npx skills add 安装到 ~/.pikiclaw/skills/。","Uses npx skills add to install to ~/.pikiclaw/skills/."):n(t,"安装到当前工作区 .pikiclaw/skills/ 目录。","Installs to the workspace .pikiclaw/skills/ directory."),onClose:o}),p.length>0&&e.jsx("div",{className:"mb-4 space-y-2",children:p.map(d=>e.jsxs("div",{className:"flex items-center gap-3 rounded-lg border border-edge/60 bg-panel-alt/40 px-3 py-2.5 transition-colors hover:border-edge hover:bg-panel-alt/70",children:[e.jsx("div",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-md border border-edge bg-panel text-fg-4",children:e.jsx(ae,{})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"text-[13px] font-semibold text-fg",children:d.name}),e.jsx("div",{className:"mt-0.5 text-[11px] leading-relaxed text-fg-4",children:t==="zh-CN"?d.descriptionZh:d.description}),e.jsx("div",{className:"mt-0.5 font-mono text-[10px] text-fg-5/60",children:d.source})]}),e.jsx(m,{variant:"primary",size:"sm",disabled:M,onClick:()=>{L(d.source)},className:"shrink-0",children:M?e.jsx(R,{}):n(t,"安装","Install")})]},d.id))}),e.jsx("div",{className:de(p.length>0&&"border-t border-edge pt-4"),children:e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("label",{className:"mb-1.5 block text-[11px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:n(t,"GitHub 来源","GitHub Source")}),e.jsx($,{value:v,onChange:d=>B(d.target.value),placeholder:"owner/repo",className:"font-mono"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1.5 block text-[11px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:n(t,"指定技能(可选)","Specific skill (optional)")}),e.jsx($,{value:C,onChange:d=>S(d.target.value),placeholder:n(t,"留空安装全部","Leave empty for all")})]}),e.jsxs("div",{className:"flex items-center justify-between pt-1",children:[e.jsx("div",{className:"text-[11px] text-fg-5",children:n(t,"通过 npx skills add 安装","Installs via npx skills add")}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(m,{variant:"ghost",onClick:o,children:n(t,"取消","Cancel")}),e.jsx(m,{variant:"primary",disabled:!v.trim()||M,onClick:()=>{L()},children:M?e.jsx(R,{}):n(t,"安装","Install")})]})]})]})})]})}function Ne({onOpenBrowserSetup:c,onOpenDesktopSetup:o}){const t=q(s=>s.locale),p=q(s=>s.state),r=q(s=>s.toast),x=p?.config?.workdir||"",[b,w]=l.useState([]),[v,B]=l.useState([]),[C,S]=l.useState(!0),[M,j]=l.useState(!1),[L,d]=l.useState(null),[u,E]=l.useState([]),[g,T]=l.useState([]),[F,_]=l.useState(!0),[U,P]=l.useState(!1),[A,V]=l.useState(null),I=l.useMemo(()=>b.filter(s=>s.scope==="global"),[b]),D=l.useMemo(()=>u.filter(s=>s.scope==="global"),[u]),H=l.useMemo(()=>new Set(b.map(s=>s.name)),[b]),k=l.useCallback(async()=>{S(!0);try{const[s,i]=await Promise.all([f.getMcpExtensions(x),f.getRecommendedMcp()]);w(s.extensions||[]),B(i.servers||[])}catch(s){r(s?.message||"Failed",!1)}finally{S(!1)}},[x,r]),h=l.useCallback(async()=>{_(!0);try{const[s,i]=await Promise.all([f.getExtensionSkills(x),f.getRecommendedSkills()]);E(s.skills||[]),T(i.repos||[])}catch(s){r(s?.message||"Failed",!1)}finally{_(!1)}},[x,r]),z=l.useCallback(async()=>{try{V(await f.getBrowser())}catch{}},[]);l.useEffect(()=>{k()},[k]),l.useEffect(()=>{h()},[h]),l.useEffect(()=>{z()},[z,p]);const N=l.useCallback(async s=>{try{await f.updateMcpExtension(s.name,{enabled:s.config.enabled===!1},"global"),await k()}catch(i){r(i?.message||"Failed",!1)}},[r,k]),J=l.useCallback(async s=>{try{await f.removeMcpExtension(s.name,"global"),r(n(t,`${s.name} 已移除`,`${s.name} removed`),!0),await k()}catch(i){r(i?.message||"Failed",!1)}},[t,r,k]),X=l.useCallback(async s=>{d(s.name);try{const i=await f.checkMcpHealth(s.config);if(i.ok){const y=i.tools?.length??0,ne=i.elapsedMs?` (${i.elapsedMs}ms)`:"";r(n(t,`${s.name} 健康 — ${y} 工具${ne}`,`${s.name} healthy — ${y} tools${ne}`),!0)}else r(`${s.name}: ${i.error}`,!1)}catch(i){r(i?.message||"Failed",!1)}finally{d(null)}},[t,r]),ee=l.useCallback(async s=>{try{const i=await f.removeExtensionSkill(s.name,!0,x);i.ok?(r(n(t,`${s.name} 已移除`,`${s.name} removed`),!0),await h()):r(i.error||"Failed",!1)}catch(i){r(i?.message||"Failed",!1)}},[x,t,r,h]),O=A?.browser,W=A?.desktop,Z=O?O.enabled?O.running?{label:n(t,"运行中","Running"),variant:"ok"}:O.status==="ready"?{label:n(t,"就绪","Ready"),variant:"ok"}:{label:n(t,"需配置","Needs setup"),variant:"warn"}:{label:n(t,"已关闭","Disabled"),variant:"muted"}:{label:"...",variant:"muted"},a=W?W.installed?W.running?{label:n(t,"运行中","Running"),variant:"ok"}:{label:n(t,"已安装","Installed"),variant:"accent"}:{label:n(t,"未安装","Not installed"),variant:"muted"}:{label:"...",variant:"muted"};return e.jsxs("div",{className:"animate-in space-y-6",children:[e.jsx("div",{className:"text-[13px] leading-relaxed text-fg-4",children:n(t,"管理全局 MCP 服务、技能和自动化能力。项目级扩展请在工作台中对应工作区配置。","Manage global MCP servers, skills, and automation. Configure project-level extensions in the Workbench.")}),e.jsxs("section",{children:[e.jsxs("div",{className:"mb-2.5 flex items-center justify-between",children:[e.jsxs(se,{children:["MCP Servers",!C&&e.jsxs("span",{className:"ml-1.5 text-fg-5 font-normal lowercase tracking-normal",children:["(",I.length,")"]})]}),e.jsxs(m,{variant:"outline",size:"sm",onClick:()=>j(!0),children:[e.jsxs("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",className:"mr-1",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),n(t,"添加","Add")]})]}),C?e.jsx("div",{className:"flex items-center justify-center py-10",children:e.jsx(R,{})}):I.length===0?e.jsxs(ie,{className:"flex flex-col items-center justify-center py-8 text-center",children:[e.jsx("div",{className:"mb-2 flex h-10 w-10 items-center justify-center rounded-full border border-edge bg-panel-alt text-fg-5",children:e.jsx(K,{})}),e.jsx("div",{className:"text-[13px] text-fg-4",children:n(t,"暂无全局 MCP 服务","No global MCP servers")}),e.jsx("button",{className:"mt-2 text-[12px] text-primary hover:text-primary/80 transition-colors",onClick:()=>j(!0),children:n(t,"搜索并添加 →","Search and add →")})]}):e.jsx("div",{className:"space-y-1.5",children:I.map(s=>{const i=s.config.enabled===!1||s.config.disabled===!0;return e.jsxs(G,{className:i?"opacity-50":void 0,children:[e.jsx(Q,{icon:e.jsx(K,{}),title:s.name,subtitle:e.jsx("span",{className:"font-mono",children:me(s.config)}),badge:e.jsx(oe,{variant:i?"idle":"ok"})}),e.jsx("div",{className:"min-w-0 xl:col-span-2"}),e.jsx(Y,{children:e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(m,{variant:"ghost",size:"sm",onClick:()=>{X(s)},disabled:L===s.name,children:L===s.name?e.jsx(R,{}):n(t,"检查","Check")}),e.jsx(m,{variant:"ghost",size:"sm",onClick:()=>{N(s)},children:i?n(t,"启用","Enable"):n(t,"禁用","Disable")}),e.jsx(m,{variant:"ghost",size:"sm",onClick:()=>{J(s)},className:"hover:!text-err",children:n(t,"移除","Remove")})]})})]},s.name)})})]}),e.jsxs("section",{children:[e.jsxs("div",{className:"mb-2.5 flex items-center justify-between",children:[e.jsxs(se,{children:["Skills",!F&&e.jsxs("span",{className:"ml-1.5 text-fg-5 font-normal lowercase tracking-normal",children:["(",D.length,")"]})]}),e.jsxs(m,{variant:"outline",size:"sm",onClick:()=>P(!0),children:[e.jsxs("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",className:"mr-1",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),n(t,"安装","Install")]})]}),F?e.jsx("div",{className:"flex items-center justify-center py-10",children:e.jsx(R,{})}):D.length===0?e.jsxs(ie,{className:"flex flex-col items-center justify-center py-8 text-center",children:[e.jsx("div",{className:"mb-2 flex h-10 w-10 items-center justify-center rounded-full border border-edge bg-panel-alt text-fg-5",children:e.jsx(ae,{})}),e.jsx("div",{className:"text-[13px] text-fg-4",children:n(t,"暂无全局技能","No global skills")}),e.jsx("button",{className:"mt-2 text-[12px] text-primary hover:text-primary/80 transition-colors",onClick:()=>P(!0),children:n(t,"安装技能 →","Install skills →")})]}):e.jsx("div",{className:"space-y-1.5",children:D.map(s=>e.jsxs(G,{children:[e.jsx(Q,{icon:e.jsx(ae,{}),title:s.label||s.name,subtitle:s.description||void 0,badge:s.mcpRequires?.length?e.jsxs(te,{variant:"muted",children:["MCP: ",s.mcpRequires.join(", ")]}):void 0}),e.jsx("div",{className:"min-w-0 xl:col-span-2"}),e.jsx(Y,{children:e.jsx(m,{variant:"ghost",size:"sm",onClick:()=>{ee(s)},className:"hover:!text-err",children:n(t,"移除","Remove")})})]},s.name))})]}),e.jsxs("section",{children:[e.jsx("div",{className:"mb-2.5",children:e.jsx(se,{children:n(t,"内置自动化","Built-in Automation")})}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs(G,{children:[e.jsx(Q,{icon:e.jsx(le,{brand:"playwright",size:14}),title:n(t,"浏览器自动化","Browser Automation"),badge:e.jsx(te,{variant:Z.variant,children:Z.label})}),e.jsx("div",{className:"min-w-0 xl:col-span-2"}),e.jsx(Y,{children:e.jsx(m,{variant:"outline",size:"sm",onClick:c,children:O?.enabled?n(t,"管理","Manage"):n(t,"配置","Setup")})})]}),e.jsxs(G,{children:[e.jsx(Q,{icon:e.jsx(le,{brand:"appium",size:14}),title:n(t,"桌面自动化","Desktop Automation"),badge:e.jsx(te,{variant:a.variant,children:a.label})}),e.jsx("div",{className:"min-w-0 xl:col-span-2"}),e.jsx(Y,{children:e.jsx(m,{variant:"outline",size:"sm",onClick:o,children:W?.running?n(t,"管理","Manage"):n(t,"配置","Setup")})})]})]})]}),e.jsx(ue,{open:M,onClose:()=>j(!1),locale:t,recommended:v,installedNames:H,scope:"global",onAdded:k}),e.jsx(ge,{open:U,onClose:()=>P(!1),locale:t,recommended:g,scope:"global",workdir:x,onInstalled:h})]})}export{ue as AddMcpModal,Ne as ExtensionsTab,ge as InstallSkillModal};
@@ -1 +1 @@
1
- import{r as S,j as i}from"./react-vendor-DTcmqLiz.js";import{u as p,l as y,k as v,S as C,B as D}from"./index-ppK_28CF.js";import{B as A}from"./BrandIcon-D4rSbRRe.js";import{a as j,b as V,c as w,d as N}from"./shared-Bw8XftPu.js";import"./router-emLofBBH.js";function L(t){return t==="zh-CN"?{status:"状态",summary:"接入摘要",loading:"加载中",chats:"个 chat",notConnected:"未接入",configuring:"配置中",connected:"已接入",failed:"配置异常",configure:"去配置",continueSetup:"继续配置",viewSettings:"查看设置",noWeixin:"尚未登录微信账号",noTelegram:"未配置 Bot Token",noFeishu:"未配置 App ID 与应用凭证",pendingValidation:"凭证已保存,等待验证。",connectedReady:"机器人已可正常接收消息。",validationFailed:"校验失败,请检查凭证或网络。",accountLinked:"已绑定账号",tokenSaved:"Token 已保存",appCredentialsSaved:"应用凭证已保存",allowedChats:"允许",notConnectedDetail:"尚未配置账号与接入凭证。"}:{status:"Status",summary:"Summary",loading:"Loading",chats:"chats",notConnected:"Not connected",configuring:"Configuring",connected:"Connected",failed:"Needs attention",configure:"Configure",continueSetup:"Continue setup",viewSettings:"View settings",noWeixin:"Weixin account not connected yet",noTelegram:"Bot token not configured",noFeishu:"App ID and credentials not configured",pendingValidation:"Credentials are saved and waiting for validation.",connectedReady:"This channel can receive messages.",validationFailed:"Validation failed. Check credentials or network.",accountLinked:"Account linked",tokenSaved:"Token saved",appCredentialsSaved:"Credentials saved",allowedChats:"Allows",notConnectedDetail:"Account and access credentials have not been configured yet."}}function g(t,e=4,a=4){const s=t.trim();return s?s.length<=e+a+3?s:`${s.slice(0,e)}...${s.slice(-a)}`:""}function B(t){return String(t||"").split(/[\n,;]/).map(e=>e.trim()).filter(Boolean).length}function u(t,e){return String(t?.[e]||"").trim()}function R(t,e){if(!t)return e;try{return new URL(t).host||t}catch{return t}}function h(t,e,a){if(t==="weixin"){const n=u(e,"weixinAccountId"),l=u(e,"weixinBaseUrl");return n?l?`${g(n)} · ${R(l,l)}`:`${a.accountLinked} ${g(n)}`:a.noWeixin}if(t==="telegram"){const n=u(e,"telegramBotToken"),l=B(u(e,"telegramAllowedChatIds"));return n?l>0?`${a.tokenSaved} · ${a.allowedChats} ${l} ${a.chats}`:a.tokenSaved:a.noTelegram}const s=u(e,"feishuAppId"),o=u(e,"feishuAppSecret");return!s||!o?a.noFeishu:`App ID ${g(s)} · ${a.appCredentialsSaved}`}function f(t,e){return!t||!t.configured?{statusLabel:e.notConnected,statusVariant:"muted",statusDescription:t?.detail||e.notConnectedDetail,actionLabel:e.configure}:t.ready?{statusLabel:e.connected,statusVariant:"ok",statusDescription:t.detail||e.connectedReady,actionLabel:e.viewSettings}:y(t)?{statusLabel:e.configuring,statusVariant:"accent",statusDescription:t.detail||e.pendingValidation,actionLabel:e.continueSetup}:{statusLabel:e.failed,statusVariant:"warn",statusDescription:t.detail||e.validationFailed,actionLabel:e.continueSetup}}function $({meta:t,locale:e}){const a=L(e);return i.jsxs(j,{children:[i.jsx(V,{icon:i.jsx(A,{brand:t.key,size:22}),title:t.title,subtitle:t.subtitle}),i.jsxs(w,{label:a.status,children:[i.jsx("div",{className:"flex flex-wrap items-center gap-1.5",children:i.jsxs(v,{variant:t.statusVariant,children:[t.loading&&i.jsx(C,{className:"h-3 w-3"}),t.statusLabel]})}),i.jsx("div",{className:"mt-1 text-[13px] leading-relaxed text-fg-3 xl:truncate xl:whitespace-nowrap",title:t.statusDescription,children:t.statusDescription})]}),i.jsx(w,{label:t.summaryLabel,children:i.jsx("div",{className:"break-words text-[13px] leading-relaxed text-fg-3",children:t.summary})}),i.jsx(N,{children:i.jsxs(D,{variant:t.channel?.ready?"outline":"primary",size:"sm",onClick:t.onAction,disabled:t.actionDisabled,children:[t.loading&&i.jsx(C,{className:"h-3 w-3"}),t.actionLabel]})})]})}function M({onOpenWeixin:t,onOpenTelegram:e,onOpenFeishu:a}){const s=p(r=>r.state),o=p(r=>r.locale),n=L(o),l=!s,d=s?.setupState?.channels||[],m=s?.config||{},k=S.useMemo(()=>{const r=d.find(c=>c.channel==="weixin")||null,b=d.find(c=>c.channel==="telegram")||null,x=d.find(c=>c.channel==="feishu")||null;return l?[{key:"weixin",title:"Weixin",subtitle:o==="zh-CN"?"二维码登录与账号接入":"QR login and account routing",channel:null,loading:!0,summary:n.loading,summaryLabel:n.summary,statusLabel:n.loading,statusVariant:"muted",statusDescription:n.loading,actionLabel:n.loading,actionDisabled:!0,onAction:t},{key:"telegram",title:"Telegram",subtitle:o==="zh-CN"?"Bot Token 与 chat allowlist":"Bot token and chat allowlist",channel:null,loading:!0,summary:n.loading,summaryLabel:n.summary,statusLabel:n.loading,statusVariant:"muted",statusDescription:n.loading,actionLabel:n.loading,actionDisabled:!0,onAction:e},{key:"feishu",title:"Feishu",subtitle:o==="zh-CN"?"应用凭证与机器人身份":"App credentials and bot identity",channel:null,loading:!0,summary:n.loading,summaryLabel:n.summary,statusLabel:n.loading,statusVariant:"muted",statusDescription:n.loading,actionLabel:n.loading,actionDisabled:!0,onAction:a}]:[{key:"weixin",title:"Weixin",subtitle:o==="zh-CN"?"二维码登录与账号接入":"QR login and account routing",channel:r,summary:h("weixin",m,n),summaryLabel:n.summary,...f(r,n),actionDisabled:!1,onAction:t},{key:"telegram",title:"Telegram",subtitle:o==="zh-CN"?"Bot Token 与 chat allowlist":"Bot token and chat allowlist",channel:b,summary:h("telegram",m,n),summaryLabel:n.summary,...f(b,n),actionDisabled:!1,onAction:e},{key:"feishu",title:"Feishu",subtitle:o==="zh-CN"?"应用凭证与机器人身份":"App credentials and bot identity",channel:x,summary:h("feishu",m,n),summaryLabel:n.summary,...f(x,n),actionDisabled:!1,onAction:a}]},[d,m,n,l,o,a,e,t]);return i.jsx("div",{className:"animate-in space-y-3",children:k.map(r=>i.jsx($,{meta:r,locale:o},r.key))})}export{M as IMAccessTab};
1
+ import{r as S,j as i}from"./react-vendor-DTcmqLiz.js";import{u as p,m as y,d as v,S as C,B as D}from"./index-Bbf__IXB.js";import{B as A}from"./BrandIcon-BAXeIuGD.js";import{a as j,b as V,d as w,c as N}from"./shared-BRvVjyDB.js";import"./router-emLofBBH.js";function L(t){return t==="zh-CN"?{status:"状态",summary:"接入摘要",loading:"加载中",chats:"个 chat",notConnected:"未接入",configuring:"配置中",connected:"已接入",failed:"配置异常",configure:"去配置",continueSetup:"继续配置",viewSettings:"查看设置",noWeixin:"尚未登录微信账号",noTelegram:"未配置 Bot Token",noFeishu:"未配置 App ID 与应用凭证",pendingValidation:"凭证已保存,等待验证。",connectedReady:"机器人已可正常接收消息。",validationFailed:"校验失败,请检查凭证或网络。",accountLinked:"已绑定账号",tokenSaved:"Token 已保存",appCredentialsSaved:"应用凭证已保存",allowedChats:"允许",notConnectedDetail:"尚未配置账号与接入凭证。"}:{status:"Status",summary:"Summary",loading:"Loading",chats:"chats",notConnected:"Not connected",configuring:"Configuring",connected:"Connected",failed:"Needs attention",configure:"Configure",continueSetup:"Continue setup",viewSettings:"View settings",noWeixin:"Weixin account not connected yet",noTelegram:"Bot token not configured",noFeishu:"App ID and credentials not configured",pendingValidation:"Credentials are saved and waiting for validation.",connectedReady:"This channel can receive messages.",validationFailed:"Validation failed. Check credentials or network.",accountLinked:"Account linked",tokenSaved:"Token saved",appCredentialsSaved:"Credentials saved",allowedChats:"Allows",notConnectedDetail:"Account and access credentials have not been configured yet."}}function g(t,e=4,a=4){const s=t.trim();return s?s.length<=e+a+3?s:`${s.slice(0,e)}...${s.slice(-a)}`:""}function B(t){return String(t||"").split(/[\n,;]/).map(e=>e.trim()).filter(Boolean).length}function u(t,e){return String(t?.[e]||"").trim()}function R(t,e){if(!t)return e;try{return new URL(t).host||t}catch{return t}}function h(t,e,a){if(t==="weixin"){const n=u(e,"weixinAccountId"),l=u(e,"weixinBaseUrl");return n?l?`${g(n)} · ${R(l,l)}`:`${a.accountLinked} ${g(n)}`:a.noWeixin}if(t==="telegram"){const n=u(e,"telegramBotToken"),l=B(u(e,"telegramAllowedChatIds"));return n?l>0?`${a.tokenSaved} · ${a.allowedChats} ${l} ${a.chats}`:a.tokenSaved:a.noTelegram}const s=u(e,"feishuAppId"),o=u(e,"feishuAppSecret");return!s||!o?a.noFeishu:`App ID ${g(s)} · ${a.appCredentialsSaved}`}function f(t,e){return!t||!t.configured?{statusLabel:e.notConnected,statusVariant:"muted",statusDescription:t?.detail||e.notConnectedDetail,actionLabel:e.configure}:t.ready?{statusLabel:e.connected,statusVariant:"ok",statusDescription:t.detail||e.connectedReady,actionLabel:e.viewSettings}:y(t)?{statusLabel:e.configuring,statusVariant:"accent",statusDescription:t.detail||e.pendingValidation,actionLabel:e.continueSetup}:{statusLabel:e.failed,statusVariant:"warn",statusDescription:t.detail||e.validationFailed,actionLabel:e.continueSetup}}function $({meta:t,locale:e}){const a=L(e);return i.jsxs(j,{children:[i.jsx(V,{icon:i.jsx(A,{brand:t.key,size:22}),title:t.title,subtitle:t.subtitle}),i.jsxs(w,{label:a.status,children:[i.jsx("div",{className:"flex flex-wrap items-center gap-1.5",children:i.jsxs(v,{variant:t.statusVariant,children:[t.loading&&i.jsx(C,{className:"h-3 w-3"}),t.statusLabel]})}),i.jsx("div",{className:"mt-1 text-[13px] leading-relaxed text-fg-3 xl:truncate xl:whitespace-nowrap",title:t.statusDescription,children:t.statusDescription})]}),i.jsx(w,{label:t.summaryLabel,children:i.jsx("div",{className:"break-words text-[13px] leading-relaxed text-fg-3",children:t.summary})}),i.jsx(N,{children:i.jsxs(D,{variant:t.channel?.ready?"outline":"primary",size:"sm",onClick:t.onAction,disabled:t.actionDisabled,children:[t.loading&&i.jsx(C,{className:"h-3 w-3"}),t.actionLabel]})})]})}function M({onOpenWeixin:t,onOpenTelegram:e,onOpenFeishu:a}){const s=p(r=>r.state),o=p(r=>r.locale),n=L(o),l=!s,d=s?.setupState?.channels||[],m=s?.config||{},k=S.useMemo(()=>{const r=d.find(c=>c.channel==="weixin")||null,b=d.find(c=>c.channel==="telegram")||null,x=d.find(c=>c.channel==="feishu")||null;return l?[{key:"weixin",title:"Weixin",subtitle:o==="zh-CN"?"二维码登录与账号接入":"QR login and account routing",channel:null,loading:!0,summary:n.loading,summaryLabel:n.summary,statusLabel:n.loading,statusVariant:"muted",statusDescription:n.loading,actionLabel:n.loading,actionDisabled:!0,onAction:t},{key:"telegram",title:"Telegram",subtitle:o==="zh-CN"?"Bot Token 与 chat allowlist":"Bot token and chat allowlist",channel:null,loading:!0,summary:n.loading,summaryLabel:n.summary,statusLabel:n.loading,statusVariant:"muted",statusDescription:n.loading,actionLabel:n.loading,actionDisabled:!0,onAction:e},{key:"feishu",title:"Feishu",subtitle:o==="zh-CN"?"应用凭证与机器人身份":"App credentials and bot identity",channel:null,loading:!0,summary:n.loading,summaryLabel:n.summary,statusLabel:n.loading,statusVariant:"muted",statusDescription:n.loading,actionLabel:n.loading,actionDisabled:!0,onAction:a}]:[{key:"weixin",title:"Weixin",subtitle:o==="zh-CN"?"二维码登录与账号接入":"QR login and account routing",channel:r,summary:h("weixin",m,n),summaryLabel:n.summary,...f(r,n),actionDisabled:!1,onAction:t},{key:"telegram",title:"Telegram",subtitle:o==="zh-CN"?"Bot Token 与 chat allowlist":"Bot token and chat allowlist",channel:b,summary:h("telegram",m,n),summaryLabel:n.summary,...f(b,n),actionDisabled:!1,onAction:e},{key:"feishu",title:"Feishu",subtitle:o==="zh-CN"?"应用凭证与机器人身份":"App credentials and bot identity",channel:x,summary:h("feishu",m,n),summaryLabel:n.summary,...f(x,n),actionDisabled:!1,onAction:a}]},[d,m,n,l,o,a,e,t]);return i.jsx("div",{className:"animate-in space-y-3",children:k.map(r=>i.jsx($,{meta:r,locale:o},r.key))})}export{M as IMAccessTab};
@@ -0,0 +1 @@
1
+ import{j as e,r as d}from"./react-vendor-DTcmqLiz.js";import{c as s,B as x}from"./index-Bbf__IXB.js";function u({className:a,...t}){return e.jsx("input",{className:s("flex h-8 w-full rounded-md border border-edge bg-inset px-2.5 py-1.5 text-[13px] text-fg shadow-sm","transition-[border-color,box-shadow,background] duration-200 outline-none","placeholder:text-fg-5","focus:border-edge-h focus:shadow-[0_0_0_4px_var(--th-glow-a)]",a),...t})}function h({children:a,className:t}){return e.jsx("label",{className:s("mb-2 block text-sm font-medium text-fg-3",t),children:a})}function b({open:a,onClose:t,wide:r,panelStyle:i,children:o}){return d.useEffect(()=>{if(!a)return;const n=l=>{l.key==="Escape"&&t()};return document.addEventListener("keydown",n),()=>document.removeEventListener("keydown",n)},[a,t]),a?e.jsxs("div",{className:"fixed inset-0 z-100 flex items-center justify-center p-4",children:[e.jsx("div",{className:"absolute inset-0 backdrop-blur-[10px] backdrop-saturate-125",style:{background:"linear-gradient(180deg, color-mix(in oklab, var(--th-overlay) 68%, transparent), color-mix(in oklab, var(--th-overlay) 92%, transparent))"},onClick:t}),e.jsx("div",{className:"pointer-events-none absolute inset-0",style:{background:"radial-gradient(circle at center, color-mix(in oklab, white 12%, transparent), transparent 38%)"}}),e.jsx("div",{className:s("glass-strong relative max-h-[min(88vh,860px)] w-full overflow-hidden rounded-xl border border-edge-h shadow-[0_32px_96px_rgba(2,6,23,0.28),0_8px_24px_rgba(15,23,42,0.08)] animate-scale",r?"max-w-[720px]":"max-w-[480px]"),style:{...i,background:"linear-gradient(180deg, color-mix(in oklab, var(--th-modal-bg) 90%, white 10%), color-mix(in oklab, var(--th-modal-bg) 97%, white 3%))"},children:e.jsx("div",{className:"max-h-[inherit] overflow-y-auto p-6",children:o})})]}):null}function g({title:a,description:t,onClose:r}){return e.jsxs("div",{className:"mb-5 flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-base font-semibold tracking-tight text-fg",children:a}),t&&e.jsx("div",{className:"mt-1 text-sm leading-relaxed text-fg-4",children:t})]}),e.jsx(x,{variant:"ghost",size:"icon",onClick:r,className:"-mr-1 -mt-1 h-8 w-8 shrink-0",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]})}export{u as I,h as L,b as M,g as a};
@@ -0,0 +1 @@
1
+ import{r as a,j as e}from"./react-vendor-DTcmqLiz.js";import{u as y,e as L,B,a as I,d as P}from"./index-Bbf__IXB.js";import{M as W,a as q,L as U,I as G}from"./Modal-utaCOq7k.js";import{D as V}from"./DirBrowser-HtXAEFE-.js";import"./router-emLofBBH.js";const O="https://ilinkai.weixin.qq.com";function Q(c){return c instanceof Error&&(c.name==="AbortError"||/aborted/i.test(c.message))}function H(c,h){return c instanceof Error&&/timed out/i.test(c.message)?h("modal.requestTimeout"):h("modal.networkError")}function se({open:c,onClose:h}){const N=y(x=>x.state),d=y(x=>x.toast),D=y(x=>x.reloadUntil),s=y(x=>x.locale),t=a.useMemo(()=>L(s),[s]),[u,v]=a.useState(""),[g,p]=a.useState(""),[w,S]=a.useState(!1),[b,o]=a.useState(!1),[k,l]=a.useState(null),[n,T]=a.useState(!1),j=a.useRef(null),F=a.useRef(N);F.current=N,a.useEffect(()=>{c?(v(F.current?.config.telegramBotToken||""),p(F.current?.config.telegramAllowedChatIds||""),S(!1),l(null),T(!F.current?.config.telegramBotToken)):(j.current?.abort(),j.current=null,o(!1))},[c]),a.useEffect(()=>()=>{j.current?.abort(),j.current=null},[]);const i=async()=>{if(!u.trim()){d(t("modal.inputToken"),!1);return}j.current?.abort();const x=new AbortController;j.current=x,o(!0),l(null);let r=!1;try{const f=await I.validateTelegramConfig(u.trim(),g.trim(),{signal:x.signal,timeoutMs:12e3});if(!f.ok){l({ok:!1,text:"✗ "+(f.error||t("modal.validationFailed"))});return}const C=f.normalizedAllowedChatIds??g.trim();l({ok:!0,text:"✓ @"+(f.bot?.username||"bot")+(f.bot?.displayName?" ("+f.bot.displayName+")":"")});const A=new Set((N?.setupState?.channels||[]).filter(E=>(E.ready||E.configured)&&E.channel!=="telegram").map(E=>E.channel));if(A.add("telegram"),await I.saveConfig({telegramBotToken:u.trim(),telegramAllowedChatIds:C,channels:[...A]}),!await D(E=>{const z=E.setupState?.channels?.find(K=>K.channel==="telegram");return E.config.telegramBotToken===u.trim()&&(E.config.telegramAllowedChatIds||"")===C&&!!z?.ready},{attempts:10,intervalMs:350})){l({ok:!1,text:"✗ "+t("modal.refreshStateFailed")}),d(t("modal.refreshStateFailed"),!1);return}d(t("modal.tgSaved")),r=!0}catch(f){if(Q(f))return;const C=H(f,t);l({ok:!1,text:"✗ "+C}),d(C,!1)}finally{j.current===x&&(j.current=null),o(!1),r&&h()}},m=()=>{j.current?.abort(),j.current=null,h()};return e.jsxs(W,{open:c,onClose:m,children:[e.jsx(q,{title:t("modal.configureTelegram"),onClose:m}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt",children:[e.jsxs("button",{type:"button",className:"flex w-full items-center justify-between px-3 py-2 text-xs font-medium text-fg-3 hover:text-fg-2 transition-colors",onClick:()=>T(!n),children:[e.jsx("span",{children:t("modal.tgGuideTitle")}),e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:`transition-transform ${n?"rotate-180":""}`,children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})]}),n&&e.jsxs("div",{className:"space-y-1 border-t border-edge px-3 pb-3 pt-2 text-xs leading-relaxed text-fg-4",children:[e.jsx("p",{children:t("modal.tgGuideStep1")}),e.jsx("p",{children:t("modal.tgGuideStep2")}),e.jsx("p",{children:t("modal.tgGuideStep3")}),e.jsx("p",{children:t("modal.tgGuideStep4")}),e.jsx("p",{className:"mt-2 text-[11px] text-fg-5",children:t("modal.tgGuideIdTip")})]})]}),e.jsxs("div",{children:[e.jsx(U,{children:t("modal.botToken")}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(G,{type:w?"text":"password",className:"flex-1 font-mono text-xs",placeholder:t("modal.pasteToken"),value:u,onChange:x=>v(x.target.value)}),e.jsx(B,{variant:"ghost",size:"sm",className:"!w-[34px] !p-0",onClick:()=>S(!w),children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",children:[e.jsx("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"}),e.jsx("circle",{cx:"12",cy:"12",r:"3"})]})})]})]}),k&&e.jsx("div",{className:"text-xs",style:{color:k.ok?"var(--th-ok)":"var(--th-err)"},children:k.text}),e.jsxs("div",{children:[e.jsxs(U,{children:[t("modal.allowedIds")," ",e.jsxs("span",{className:"text-fg-5",children:["(",t("modal.optional"),")"]})]}),e.jsx(G,{className:"font-mono text-xs",placeholder:t("modal.commaSep"),value:g,onChange:x=>p(x.target.value)})]})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-6",children:[e.jsx(B,{variant:"ghost",onClick:m,children:t("modal.cancel")}),e.jsx(B,{variant:"primary",disabled:b,onClick:i,children:t(b?"modal.validating":"modal.validateSave")})]})]})}function ae({open:c,onClose:h}){const N=y(i=>i.state),d=y(i=>i.toast),D=y(i=>i.reloadUntil),s=y(i=>i.locale),t=a.useMemo(()=>L(s),[s]),[u,v]=a.useState(""),[g,p]=a.useState(""),[w,S]=a.useState(!1),[b,o]=a.useState(null),[k,l]=a.useState(!1),n=a.useRef(null),T=a.useRef(N);T.current=N,a.useEffect(()=>{c?(v(T.current?.config.feishuAppId||""),p(T.current?.config.feishuAppSecret||""),o(null),l(!T.current?.config.feishuAppId)):(n.current?.abort(),n.current=null,S(!1))},[c]),a.useEffect(()=>()=>{n.current?.abort(),n.current=null},[]);const j=async()=>{if(!u.trim()){d(t("modal.inputAppId"),!1);return}n.current?.abort();const i=new AbortController;n.current=i,S(!0),o(null);let m=!1;try{const x=await I.validateFeishuConfig(u.trim(),g.trim(),{signal:i.signal,timeoutMs:2e4});if(!x.ok){o({ok:!1,text:"✗ "+(x.error||t("modal.validationFailed"))});return}o({ok:!0,text:"✓ "+(x.app?.displayName||x.app?.appId||u.trim())});const r=new Set((N?.setupState?.channels||[]).filter(C=>(C.ready||C.configured)&&C.channel!=="feishu").map(C=>C.channel));if(r.add("feishu"),await I.saveConfig({feishuAppId:u.trim(),feishuAppSecret:g.trim(),channels:[...r]}),!await D(C=>{const A=C.setupState?.channels?.find(R=>R.channel==="feishu");return C.config.feishuAppId===u.trim()&&C.config.feishuAppSecret===g.trim()&&!!A?.ready},{attempts:10,intervalMs:350})){o({ok:!1,text:"✗ "+t("modal.refreshStateFailed")}),d(t("modal.refreshStateFailed"),!1);return}d(t("modal.feishuSaved")),m=!0}catch(x){if(Q(x))return;const r=H(x,t);o({ok:!1,text:"✗ "+r}),d(r,!1)}finally{n.current===i&&(n.current=null),S(!1),m&&h()}},F=()=>{n.current?.abort(),n.current=null,h()};return e.jsxs(W,{open:c,onClose:F,children:[e.jsx(q,{title:t("modal.configureFeishu"),onClose:F}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt",children:[e.jsxs("button",{type:"button",className:"flex w-full items-center justify-between px-3 py-2 text-xs font-medium text-fg-3 hover:text-fg-2 transition-colors",onClick:()=>l(!k),children:[e.jsx("span",{children:t("modal.feishuGuideTitle")}),e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:`transition-transform ${k?"rotate-180":""}`,children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})]}),k&&e.jsxs("div",{className:"space-y-1 border-t border-edge px-3 pb-3 pt-2 text-xs leading-relaxed text-fg-4",children:[e.jsx("p",{children:t("modal.feishuGuideStep1")}),e.jsx("p",{children:t("modal.feishuGuideStep2")}),e.jsx("p",{children:t("modal.feishuGuideStep3")}),e.jsx("p",{children:t("modal.feishuGuideStep4")}),e.jsx("p",{className:"ml-3 font-mono text-[11px] text-fg-5",children:t("modal.feishuGuidePerms")}),e.jsx("p",{children:t("modal.feishuGuideStep5")}),e.jsx("p",{children:t("modal.feishuGuideStep6")}),e.jsx("p",{children:t("modal.feishuGuideStep7")}),e.jsx("p",{className:"mt-2 text-[11px] text-fg-5",children:t("modal.feishuGuideCardKitTip")})]})]}),e.jsxs("div",{children:[e.jsx(U,{children:t("modal.appId")}),e.jsx(G,{className:"font-mono text-xs",placeholder:t("modal.feishuPlaceholder"),value:u,onChange:i=>v(i.target.value)})]}),e.jsxs("div",{children:[e.jsx(U,{children:t("modal.appSecret")}),e.jsx(G,{type:"password",className:"font-mono text-xs",placeholder:t("modal.appSecret"),value:g,onChange:i=>p(i.target.value)})]}),b&&e.jsx("div",{className:"text-xs",style:{color:b.ok?"var(--th-ok)":"var(--th-err)"},children:b.text})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-6",children:[e.jsx(B,{variant:"ghost",onClick:F,children:t("modal.cancel")}),e.jsx(B,{variant:"primary",disabled:w,onClick:j,children:t(w?"modal.validating":"modal.validateSave")})]})]})}function le({open:c,onClose:h}){const N=y(m=>m.state),d=y(m=>m.toast),D=y(m=>m.reloadUntil),s=y(m=>m.locale),t=a.useMemo(()=>L(s),[s]),[u,v]=a.useState(O),[g,p]=a.useState(!1),[w,S]=a.useState(""),[b,o]=a.useState(""),[k,l]=a.useState(null),n=a.useRef(null),T=a.useRef(N);T.current=N,a.useEffect(()=>{c?(v(T.current?.config.weixinBaseUrl||O),p(!1),S(""),o(""),l(null)):(n.current?.abort(),n.current=null,p(!1))},[c]),a.useEffect(()=>()=>{n.current?.abort(),n.current=null},[]);const j=()=>{n.current?.abort(),n.current=null,h()},F=a.useCallback(async(m,x,r)=>{for(;!m.signal.aborted;){const f=await I.waitWeixinLogin(x,r,{signal:m.signal,timeoutMs:45e3});if(!f.ok&&!f.connected)return l({ok:!1,text:"✗ "+(f.error||f.message||t("modal.validationFailed"))}),!1;if(f.qrcodeUrl&&S(f.qrcodeUrl),f.status==="scaned"?l({ok:!0,text:t("modal.weixinScanned")}):f.status==="expired"?l({ok:!0,text:t("modal.weixinQrRefreshed")}):f.connected||l({ok:!0,text:t("modal.weixinWaitingScan")}),!f.connected)continue;l({ok:!0,text:t("modal.weixinLoginSuccess")});const C=f.baseUrl||r,A=f.botToken||"",R=f.accountId||"",E=await I.validateWeixinConfig(C,A,R,{signal:m.signal,timeoutMs:12e3});if(!E.ok)return l({ok:!1,text:"✗ "+(E.error||t("modal.validationFailed"))}),!1;const z=E.normalizedBaseUrl||C,K=new Set((T.current?.setupState?.channels||[]).filter(M=>(M.ready||M.configured)&&M.channel!=="weixin").map(M=>M.channel));return K.add("weixin"),await I.saveConfig({weixinBaseUrl:z,weixinBotToken:A,weixinAccountId:R,channels:[...K]}),await D(M=>{const _=M.setupState?.channels?.find($=>$.channel==="weixin");return M.config.weixinBaseUrl===z&&M.config.weixinBotToken===A&&M.config.weixinAccountId===R&&!!_?.ready},{attempts:12,intervalMs:350})?(d(t("modal.weixinSaved")),!0):(l({ok:!1,text:"✗ "+t("modal.refreshStateFailed")}),d(t("modal.refreshStateFailed"),!1),!1)}return!1},[D,t,d]),i=async()=>{if(!u.trim()){d(t("modal.inputWeixinBaseUrl"),!1);return}n.current?.abort();const m=new AbortController;n.current=m,p(!0),S(""),o(""),l(null);let x=!1;try{const r=await I.startWeixinLogin(u.trim(),{signal:m.signal,timeoutMs:12e3});if(!r.ok||!r.qrcodeUrl){l({ok:!1,text:"✗ "+(r.error||r.message||t("modal.validationFailed"))});return}S(r.qrcodeUrl),o(r.sessionKey),l({ok:!0,text:t("modal.weixinWaitingScan")}),x=await F(m,r.sessionKey,u.trim())}catch(r){if(Q(r))return;const f=H(r,t);l({ok:!1,text:"✗ "+f}),d(f,!1)}finally{n.current===m&&(n.current=null),p(!1),x&&h()}};return e.jsxs(W,{open:c,onClose:j,children:[e.jsx(q,{title:t("modal.configureWeixin"),onClose:j}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"text-xs leading-relaxed text-fg-4",children:t("modal.weixinScanHint")}),e.jsxs("div",{children:[e.jsx(U,{children:t("modal.weixinBaseUrl")}),e.jsx(G,{className:"font-mono text-xs",value:u,onChange:m=>v(m.target.value),placeholder:O}),e.jsx("div",{className:"mt-1 text-[11px] text-fg-5",children:t("modal.weixinDefaultBaseUrlHint")})]}),w&&e.jsxs("div",{className:"rounded-xl border border-edge bg-panel-alt p-4",children:[e.jsx("img",{src:w,alt:t("modal.weixinQrAlt"),className:"mx-auto h-56 w-56 rounded-lg bg-white p-3 object-contain"}),b&&e.jsx("div",{className:"mt-2 truncate text-center font-mono text-[10px] text-fg-5",children:b})]}),k&&e.jsx("div",{className:"text-xs",style:{color:k.ok?"var(--th-ok)":"var(--th-err)"},children:k.text})]}),e.jsxs("div",{className:"mt-6 flex justify-end gap-2",children:[e.jsx(B,{variant:"ghost",onClick:j,children:t("modal.cancel")}),e.jsx(B,{variant:"primary",disabled:g,onClick:i,children:t(g?w?"modal.validating":"modal.weixinGeneratingQr":w?"modal.weixinRetry":"modal.weixinGenerateQr")})]})]})}function ne({open:c,onClose:h}){const N=y(l=>l.state),d=y(l=>l.toast),D=y(l=>l.reload),s=y(l=>l.locale),t=a.useMemo(()=>L(s),[s]),u=N?.bot?.workdir||N?.runtimeWorkdir||"",[v,g]=a.useState(""),[p,w]=a.useState(!1),[S,b]=a.useState(0);a.useEffect(()=>{c&&(g(u),b(l=>l+1))},[c,u]);const o=a.useCallback(l=>{g(l)},[]),k=async()=>{const l=v.trim();if(!l){d(t("modal.selectDirFirst"),!1);return}w(!0);try{const n=await I.switchWorkdir(l);n.ok?(await D(),d(t("modal.switchedTo")+n.workdir),h()):d(n.error||t("modal.switchFailed"),!1)}catch{d(t("modal.switchFailed"),!1)}finally{w(!1)}};return e.jsx(W,{open:c,onClose:p?void 0:h,panelStyle:{width:"min(500px, calc(100vw - 2rem))",maxWidth:"min(500px, calc(100vw - 2rem))"},children:p?e.jsxs("div",{className:"flex flex-col items-center justify-center py-12 gap-4 animate-in",children:[e.jsxs("svg",{width:"32",height:"32",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",className:"animate-spin text-fg-3",style:{animationDuration:"1.2s"},children:[e.jsx("polyline",{points:"23 4 23 10 17 10"}),e.jsx("path",{d:"M20.49 15a9 9 0 1 1-2.12-9.36L23 10"})]}),e.jsx("span",{className:"text-sm font-medium text-fg-3",children:t("modal.switching")}),e.jsx("span",{className:"text-xs text-fg-5 max-w-[280px] truncate",children:v})]}):e.jsxs(e.Fragment,{children:[e.jsx(q,{title:t("modal.switchWorkdir"),onClose:h}),e.jsx(V,{initialPath:u,onSelect:o,t},S),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx(B,{variant:"ghost",onClick:h,children:t("modal.cancel")}),e.jsx(B,{variant:"primary",onClick:k,children:t("modal.selectDir")})]})]})})}function re({open:c,onClose:h,onSaved:N}){const d=y(r=>r.toast),D=y(r=>r.locale),s=a.useMemo(()=>L(D),[D]),[t,u]=a.useState(null),[v,g]=a.useState(!1),[p,w]=a.useState(!1),[S,b]=a.useState(null);a.useEffect(()=>{c&&(g(!1),b(null),I.getBrowser().then(r=>{u(r),w(!!r.browser.enabled)}).catch(()=>u(null)))},[c]);const o=t?.browser,k=!!o?.enabled,l=!!o&&k!==p,n=o?.profileDir||"",T=s("ext.profileDir"),j=n,F=!!o?.chromeInstalled&&!!o?.profileCreated,i=t?o?.enabled?F?s("ext.browserReady"):o?.chromeInstalled?s("ext.chromeInstalled"):s("ext.needsSetup"):s("ext.disabled"):s("status.loading"),m=t&&o?.enabled?F?"ok":o?.chromeInstalled?"warn":"err":"muted",x=async()=>{g(!0),b(null);try{await I.saveConfig({browserEnabled:p});const r=await I.getBrowser();u(r),N?.()}catch{b({ok:!1,text:"✗ "+s("ext.browserModeSaveFailed")}),d(s("ext.browserModeSaveFailed"),!1),g(!1);return}if(!p){b({ok:!0,text:"✓ "+s("ext.browserDisabledSaved")}),d(s("ext.browserDisabledSaved")),g(!1);return}try{const r=await I.setupBrowser();if(!r.ok){b({ok:!1,text:"✗ "+(r.error||s("ext.browserLaunchFailed"))}),d(r.error||s("ext.browserLaunchFailed"),!1);return}u(f=>f?{...f,browser:r.browser}:{browser:r.browser,desktop:{enabled:!1,installed:!1,running:!1,appiumUrl:""}}),b({ok:!0,text:"✓ "+s("ext.browserEnabledLaunched")}),d(s("ext.browserEnabledLaunched")),N?.()}catch{b({ok:!1,text:"✗ "+s("ext.browserLaunchFailed")}),d(s("ext.browserLaunchFailed"),!1)}finally{g(!1)}};return e.jsxs(W,{open:c,onClose:h,children:[e.jsx(q,{title:s("ext.setupBrowser"),description:s("ext.setupBrowserDesc"),onClose:h}),e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt p-4",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(P,{variant:m,children:i}),o&&e.jsxs(e.Fragment,{children:[e.jsx(P,{variant:k?"accent":"muted",children:s(k?"ext.enabled":"ext.disabled")}),l&&e.jsx(P,{variant:"warn",children:s("ext.pendingModeChange")}),o.running&&e.jsxs(P,{variant:"accent",children:[s("ext.browserOpen"),o.pid?` · PID ${o.pid}`:""]})]})]}),e.jsxs("div",{className:"mt-3",children:[e.jsx(U,{children:T}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(G,{className:"font-mono text-xs flex-1",value:j||"—",readOnly:!0,onClick:r=>r.target.select()}),e.jsx(B,{variant:"outline",size:"sm",disabled:!j,onClick:()=>{j&&(navigator.clipboard.writeText(j),d(s("ext.step2Copied")))},children:s("ext.copyPath")})]})]}),e.jsx("div",{className:"mt-3 text-xs text-fg-5",children:s(p?"ext.profileModeDesc":"ext.browserDescDisabled")}),o?.detail&&e.jsx("div",{className:"mt-2 text-xs text-fg-5",children:o.detail}),S&&e.jsx("div",{className:"mt-3 text-xs",style:{color:S.ok?"var(--th-ok)":"var(--th-err)"},children:S.text})]}),e.jsx("div",{className:"rounded-lg border border-edge bg-panel-alt p-4",children:e.jsxs("label",{className:"flex cursor-pointer items-start gap-3",children:[e.jsx("input",{type:"checkbox",checked:p,onChange:r=>w(r.target.checked),className:"mt-0.5 h-4 w-4 rounded border border-edge bg-inset"}),e.jsxs("div",{children:[e.jsx("div",{className:"text-sm font-medium text-fg-2 mb-1",children:s("ext.browserEnableToggle")}),e.jsx("div",{className:"text-xs text-fg-4",children:s("ext.browserEnableToggleDesc")})]})]})}),e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt p-4",children:[e.jsx("div",{className:"text-sm font-medium text-fg-2 mb-1",children:s(p?"ext.step2Title":"ext.browserDisabledStepTitle")}),e.jsx("div",{className:"text-xs text-fg-4",children:s(p?"ext.step2Desc":"ext.browserDisabledHint")})]})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-6",children:[e.jsx(B,{variant:"ghost",onClick:h,children:s("modal.cancel")}),e.jsx(B,{variant:"primary",disabled:v,onClick:x,children:s(v?"ext.launching":p?"ext.enableAndLaunchBrowser":"ext.saveBrowserDisabled")})]})]})}function ie({open:c,onClose:h,onSaved:N}){const d=y(i=>i.toast),D=y(i=>i.locale),s=a.useMemo(()=>L(D),[D]),[t,u]=a.useState(!1),[v,g]=a.useState(!1),[p,w]=a.useState(!1),[S,b]=a.useState(!1),[o,k]=a.useState(!1),[l,n]=a.useState(null);a.useEffect(()=>{c&&(u(!1),b(!1),k(!1),n(null),I.getBrowser().then(i=>{g(i.desktop.installed),w(i.desktop.enabled)}).catch(()=>{}))},[c]);const T=async()=>{u(!0),n(null);try{const i=await I.desktopInstall();i.ok?(g(!0),n({ok:!0,text:"✓ "+s("ext.desktopInstalled")}),d(s("ext.desktopInstalled"))):n({ok:!1,text:"✗ "+(i.error||s("ext.desktopInstallFailed"))})}catch{n({ok:!1,text:"✗ "+s("ext.desktopInstallFailed")})}finally{u(!1)}},j=async()=>{b(!0),n(null);try{const i=await I.desktopToggle(!0);i.ok?(w(!0),n({ok:!0,text:"✓ "+s("ext.desktopStarted")}),d(s("ext.desktopStarted")),N?.()):n({ok:!1,text:"✗ "+(i.error||s("ext.desktopInstallFailed"))})}catch{n({ok:!1,text:"✗ "+s("ext.desktopInstallFailed")})}finally{b(!1)}},F=async()=>{k(!0),n(null);try{const i=await I.desktopToggle(!1);i.ok?(w(!1),n({ok:!0,text:"✓ "+s("ext.desktopStopped")}),d(s("ext.desktopStopped")),N?.()):n({ok:!1,text:"✗ "+(i.error||s("ext.desktopInstallFailed"))})}catch{n({ok:!1,text:"✗ "+s("ext.desktopInstallFailed")})}finally{k(!1)}};return e.jsxs(W,{open:c,onClose:h,children:[e.jsx(q,{title:s("ext.setupDesktop"),description:s("ext.setupDesktopDesc"),onClose:h}),e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt p-4",children:[e.jsx("div",{className:"text-sm font-medium text-fg-2 mb-1",children:s("ext.desktopStep1Title")}),e.jsx("div",{className:"text-xs text-fg-4 mb-3",children:s("ext.desktopStep1Desc")}),l&&!v&&e.jsx("div",{className:"mb-2 text-xs",style:{color:l.ok?"var(--th-ok)":"var(--th-err)"},children:l.text}),e.jsx(B,{variant:v?"ghost":"outline",size:"sm",disabled:t||v,onClick:T,children:s(t?"ext.desktopInstalling":v?"ext.desktopStep1Done":"ext.desktopStep1Action")})]}),e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt p-4",children:[e.jsx("div",{className:"text-sm font-medium text-fg-2 mb-1",children:s("ext.desktopStep2Title")}),e.jsx("div",{className:"text-xs text-fg-4 mb-3",children:s("ext.desktopStep2Desc")}),l&&v&&e.jsx("div",{className:"mb-2 text-xs",style:{color:l.ok?"var(--th-ok)":"var(--th-err)"},children:l.text}),e.jsx("div",{className:"flex items-center gap-2",children:p?e.jsx(B,{variant:"outline",size:"sm",disabled:o,onClick:F,children:s(o?"ext.desktopStopping":"ext.disable")}):e.jsx(B,{variant:"primary",size:"sm",disabled:!v||S,onClick:j,children:s(S?"ext.desktopStarting":"ext.desktopStep2Action")})})]})]}),e.jsx("div",{className:"flex justify-end gap-2 mt-6",children:e.jsx(B,{variant:"ghost",onClick:h,children:s("modal.cancel")})})]})}export{re as BrowserSetupModal,ie as DesktopSetupModal,ae as FeishuModal,se as TelegramModal,le as WeixinModal,ne as WorkdirModal};
@@ -1 +1 @@
1
- import{r as l,j as e}from"./react-vendor-DTcmqLiz.js";import{u,b as R,a as D,B as f,k as N}from"./index-ppK_28CF.js";import{a as L,b as O,c as j,d as z}from"./shared-Bw8XftPu.js";import"./router-emLofBBH.js";const E=[{key:"accessibility",labelKey:"perm.accessibility",reasonZh:"允许控制桌面应用、点击和输入。",reasonEn:"Allows controlling desktop apps with clicks and typing.",guidePathKey:"perm.pathAccessibility",icon:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("circle",{cx:"12",cy:"5",r:"1.8"}),e.jsx("path",{d:"M12 7.7v10.2"}),e.jsx("path",{d:"M8.4 10h7.2"}),e.jsx("path",{d:"M9.6 19.2 12 15.1l2.4 4.1"})]})},{key:"screenRecording",labelKey:"perm.screenRecording",reasonZh:"允许读取屏幕内容,用于截图和界面分析。",reasonEn:"Allows reading the screen for screenshots and UI inspection.",guidePathKey:"perm.pathScreenRecording",icon:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("rect",{x:"4",y:"5.5",width:"11.5",height:"10",rx:"2.4"}),e.jsx("path",{d:"m17.5 8.4 2.7-1.5v7.2l-2.7-1.5"}),e.jsx("circle",{cx:"9.75",cy:"10.5",r:"1.1",fill:"currentColor",stroke:"none"})]})},{key:"fullDiskAccess",labelKey:"perm.fullDiskAccess",reasonZh:"允许访问桌面、下载等受保护目录。",reasonEn:"Allows access to protected folders like Desktop and Downloads.",guidePathKey:"perm.pathFullDiskAccess",icon:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("rect",{x:"6.2",y:"10.1",width:"11.6",height:"8.6",rx:"2.6"}),e.jsx("path",{d:"M9 10V7.8a3 3 0 1 1 6 0V10"}),e.jsx("circle",{cx:"12",cy:"13.5",r:"0.9",fill:"currentColor",stroke:"none"}),e.jsx("path",{d:"M12 14.6v1.8"})]})}];function K(o){return o==="zh-CN"?{introWithHost:"请在 macOS 中为 {hostApp} 开启以下权限。",intro:"请在 macOS 中开启以下权限。",status:"状态",summary:"系统位置",loading:"检查中",needsGrant:"需要授权",granted:"已授权",authorize:"授权",openSettings:"前往设置",refreshState:"刷新状态",checking:"检查中...",hostGranted:"{hostApp} 已可直接使用此权限。",hostGrantedFallback:"当前宿主应用已可直接使用此权限。",needsGrantDetail:"尚未授权,可通过右侧按钮发起系统授权。",needsSettingsDetail:"需要在系统设置中手动开启此权限。"}:{introWithHost:"Grant the following permissions to {hostApp} in macOS.",intro:"Grant the following permissions in macOS.",status:"Status",summary:"System path",loading:"Checking",needsGrant:"Needs access",granted:"Granted",authorize:"Authorize",openSettings:"Open settings",refreshState:"Refresh status",checking:"Checking...",hostGranted:"{hostApp} can use this permission now.",hostGrantedFallback:"The current host app can use this permission now.",needsGrantDetail:"Access has not been granted yet. Use the button on the right to trigger the macOS prompt.",needsSettingsDetail:"This permission needs to be enabled manually in System Settings."}}function B(){const o=u(t=>t.state),d=u(t=>t.locale),h=u(t=>t.reload),i=u(t=>t.toast),a=l.useMemo(()=>R(d),[d]),s=K(d),g=o?.permissions||{},p=o?.hostApp||null,c=!o,[m,x]=l.useState(null),b=l.useMemo(()=>E.map(t=>({...t,permission:g[t.key]})),[g]),S=l.useCallback(async t=>{if(!m){x(t);try{const n=await D.requestPermission(t);if(!n.ok){i(n.error||a("perm.requestFailed"),!1);return}n.action==="already_granted"?i(a("perm.alreadyGranted")):n.action==="prompted"?i(a("perm.promptOpened")):i(a("perm.settingsOpened")),await h()}catch(n){i(n instanceof Error?n.message:a("perm.requestFailed"),!1)}finally{x(n=>n===t?null:n)}}},[h,m,a,i]),k=l.useCallback(async()=>{await h()},[h]);return e.jsxs("div",{className:"animate-in space-y-3",children:[e.jsxs("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between",children:[e.jsx("div",{className:"min-w-0 flex-1",children:e.jsx("div",{className:"text-[13px] leading-relaxed text-fg-4",children:p?s.introWithHost.replace("{hostApp}",p):s.intro})}),e.jsx(f,{variant:"outline",size:"sm",onClick:()=>{k()},children:s.refreshState})]}),b.map(t=>{const n=t.permission,r=!!n?.granted,y=!!n&&n.checkable,w=c?s.loading:n&&r?s.granted:s.needsGrant,v=c?"muted":r?"ok":"warn",A=c?s.loading:r?p?s.hostGranted.replace("{hostApp}",p):s.hostGrantedFallback:y?s.needsGrantDetail:s.needsSettingsDetail,G=c?s.checking:r?s.refreshState:y?s.authorize:s.openSettings,C=r?k:()=>{S(t.key)};return e.jsxs(L,{children:[e.jsx(O,{icon:t.icon,title:a(t.labelKey),subtitle:d==="zh-CN"?t.reasonZh:t.reasonEn}),e.jsxs(j,{label:s.status,children:[e.jsx("div",{className:"flex flex-wrap items-center gap-1.5",children:e.jsx(N,{variant:v,children:w})}),e.jsx("div",{className:"mt-1 text-[13px] leading-relaxed text-fg-3",children:A})]}),e.jsx(j,{label:s.summary,children:e.jsx("div",{className:"break-words text-[13px] leading-relaxed text-fg-3",children:a(t.guidePathKey)})}),e.jsx(z,{children:e.jsx(f,{variant:r?"outline":"primary",size:"sm",disabled:c||!!m,onClick:C,children:m===t.key?s.checking:G})})]},t.key)})]})}export{B as PermissionsTab};
1
+ import{r as l,j as e}from"./react-vendor-DTcmqLiz.js";import{u,e as R,a as D,B as f,d as N}from"./index-Bbf__IXB.js";import{a as L,b as O,d as j,c as z}from"./shared-BRvVjyDB.js";import"./router-emLofBBH.js";const E=[{key:"accessibility",labelKey:"perm.accessibility",reasonZh:"允许控制桌面应用、点击和输入。",reasonEn:"Allows controlling desktop apps with clicks and typing.",guidePathKey:"perm.pathAccessibility",icon:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("circle",{cx:"12",cy:"5",r:"1.8"}),e.jsx("path",{d:"M12 7.7v10.2"}),e.jsx("path",{d:"M8.4 10h7.2"}),e.jsx("path",{d:"M9.6 19.2 12 15.1l2.4 4.1"})]})},{key:"screenRecording",labelKey:"perm.screenRecording",reasonZh:"允许读取屏幕内容,用于截图和界面分析。",reasonEn:"Allows reading the screen for screenshots and UI inspection.",guidePathKey:"perm.pathScreenRecording",icon:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("rect",{x:"4",y:"5.5",width:"11.5",height:"10",rx:"2.4"}),e.jsx("path",{d:"m17.5 8.4 2.7-1.5v7.2l-2.7-1.5"}),e.jsx("circle",{cx:"9.75",cy:"10.5",r:"1.1",fill:"currentColor",stroke:"none"})]})},{key:"fullDiskAccess",labelKey:"perm.fullDiskAccess",reasonZh:"允许访问桌面、下载等受保护目录。",reasonEn:"Allows access to protected folders like Desktop and Downloads.",guidePathKey:"perm.pathFullDiskAccess",icon:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("rect",{x:"6.2",y:"10.1",width:"11.6",height:"8.6",rx:"2.6"}),e.jsx("path",{d:"M9 10V7.8a3 3 0 1 1 6 0V10"}),e.jsx("circle",{cx:"12",cy:"13.5",r:"0.9",fill:"currentColor",stroke:"none"}),e.jsx("path",{d:"M12 14.6v1.8"})]})}];function K(o){return o==="zh-CN"?{introWithHost:"请在 macOS 中为 {hostApp} 开启以下权限。",intro:"请在 macOS 中开启以下权限。",status:"状态",summary:"系统位置",loading:"检查中",needsGrant:"需要授权",granted:"已授权",authorize:"授权",openSettings:"前往设置",refreshState:"刷新状态",checking:"检查中...",hostGranted:"{hostApp} 已可直接使用此权限。",hostGrantedFallback:"当前宿主应用已可直接使用此权限。",needsGrantDetail:"尚未授权,可通过右侧按钮发起系统授权。",needsSettingsDetail:"需要在系统设置中手动开启此权限。"}:{introWithHost:"Grant the following permissions to {hostApp} in macOS.",intro:"Grant the following permissions in macOS.",status:"Status",summary:"System path",loading:"Checking",needsGrant:"Needs access",granted:"Granted",authorize:"Authorize",openSettings:"Open settings",refreshState:"Refresh status",checking:"Checking...",hostGranted:"{hostApp} can use this permission now.",hostGrantedFallback:"The current host app can use this permission now.",needsGrantDetail:"Access has not been granted yet. Use the button on the right to trigger the macOS prompt.",needsSettingsDetail:"This permission needs to be enabled manually in System Settings."}}function B(){const o=u(t=>t.state),d=u(t=>t.locale),h=u(t=>t.reload),i=u(t=>t.toast),a=l.useMemo(()=>R(d),[d]),s=K(d),g=o?.permissions||{},p=o?.hostApp||null,c=!o,[m,x]=l.useState(null),S=l.useMemo(()=>E.map(t=>({...t,permission:g[t.key]})),[g]),b=l.useCallback(async t=>{if(!m){x(t);try{const n=await D.requestPermission(t);if(!n.ok){i(n.error||a("perm.requestFailed"),!1);return}n.action==="already_granted"?i(a("perm.alreadyGranted")):n.action==="prompted"?i(a("perm.promptOpened")):i(a("perm.settingsOpened")),await h()}catch(n){i(n instanceof Error?n.message:a("perm.requestFailed"),!1)}finally{x(n=>n===t?null:n)}}},[h,m,a,i]),k=l.useCallback(async()=>{await h()},[h]);return e.jsxs("div",{className:"animate-in space-y-3",children:[e.jsxs("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between",children:[e.jsx("div",{className:"min-w-0 flex-1",children:e.jsx("div",{className:"text-[13px] leading-relaxed text-fg-4",children:p?s.introWithHost.replace("{hostApp}",p):s.intro})}),e.jsx(f,{variant:"outline",size:"sm",onClick:()=>{k()},children:s.refreshState})]}),S.map(t=>{const n=t.permission,r=!!n?.granted,y=!!n&&n.checkable,w=c?s.loading:n&&r?s.granted:s.needsGrant,v=c?"muted":r?"ok":"warn",A=c?s.loading:r?p?s.hostGranted.replace("{hostApp}",p):s.hostGrantedFallback:y?s.needsGrantDetail:s.needsSettingsDetail,G=c?s.checking:r?s.refreshState:y?s.authorize:s.openSettings,C=r?k:()=>{b(t.key)};return e.jsxs(L,{children:[e.jsx(O,{icon:t.icon,title:a(t.labelKey),subtitle:d==="zh-CN"?t.reasonZh:t.reasonEn}),e.jsxs(j,{label:s.status,children:[e.jsx("div",{className:"flex flex-wrap items-center gap-1.5",children:e.jsx(N,{variant:v,children:w})}),e.jsx("div",{className:"mt-1 text-[13px] leading-relaxed text-fg-3",children:A})]}),e.jsx(j,{label:s.summary,children:e.jsx("div",{className:"break-words text-[13px] leading-relaxed text-fg-3",children:a(t.guidePathKey)})}),e.jsx(z,{children:e.jsx(f,{variant:r?"outline":"primary",size:"sm",disabled:c||!!m,onClick:C,children:m===t.key?s.checking:G})})]},t.key)})]})}export{B as PermissionsTab};
@@ -1 +1 @@
1
- import{r as s,j as e,b as H}from"./react-vendor-DTcmqLiz.js";import{c}from"./index-ppK_28CF.js";function _(u,h){return!!(u&&h instanceof Node&&u.contains(h))}function M({value:u,options:h,onChange:y,className:w,placeholder:a="—",disabled:x=!1,readOnly:p=!1}){const f=h.find(n=>n.value===u),m=p||h.length<=1,[i,g]=s.useState(!1),[t,l]=s.useState(null),o=s.useRef(null),j=s.useRef(null);if(s.useEffect(()=>{if(!i)return;const n=d=>{_(o.current,d.target)||_(j.current,d.target)||g(!1)},r=d=>{d.key==="Escape"&&g(!1)};return document.addEventListener("mousedown",n),document.addEventListener("keydown",r),()=>{document.removeEventListener("mousedown",n),document.removeEventListener("keydown",r)}},[i]),s.useLayoutEffect(()=>{if(!i)return;const n=()=>{const r=o.current;if(!r)return;const d=r.getBoundingClientRect(),k=window.innerHeight-d.bottom-12,E=d.top-12,N=k<220&&E>k,L=Math.max(140,Math.min(260,N?E:k));l({left:d.left,top:N?Math.max(12,d.top-L-8):d.bottom+8,width:d.width,maxHeight:L})};return n(),window.addEventListener("resize",n),window.addEventListener("scroll",n,!0),()=>{window.removeEventListener("resize",n),window.removeEventListener("scroll",n,!0)}},[i]),m)return e.jsx("div",{className:c("flex h-8 w-full items-center rounded-md border border-edge bg-panel-alt px-2.5 text-[13px] text-fg-3 shadow-[inset_0_1px_0_var(--th-inset-hl),0_1px_2px_rgba(15,23,42,0.05)]",x&&"cursor-not-allowed opacity-50",w),children:e.jsx("span",{className:c("truncate",!f&&"text-fg-5"),children:f?.label||a})});const v=n=>{x||(y(n),g(!1))},b=i&&t?H.createPortal(e.jsx("div",{ref:j,role:"listbox",className:"fixed z-[220] overflow-hidden rounded-xl border border-edge-h bg-[var(--th-dropdown)] p-1.5 shadow-[0_24px_64px_rgba(2,6,23,0.22)] backdrop-blur-xl",style:{left:t.left,top:t.top,width:t.width},children:e.jsx("div",{className:"overflow-y-auto",style:{maxHeight:t.maxHeight},children:h.map(n=>{const r=n.value===u;return e.jsxs("button",{type:"button",role:"option","aria-selected":r,onClick:()=>v(n.value),className:c("flex w-full items-center gap-2 rounded-lg px-3 py-2 text-left text-[13px] transition-colors duration-200",r?"bg-panel text-fg shadow-[inset_0_1px_0_rgba(255,255,255,0.03)]":"text-fg-3 hover:bg-panel-alt hover:text-fg-2"),children:[e.jsx("span",{className:"min-w-0 flex-1 truncate",children:n.label}),r&&e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"shrink-0 text-fg-4",children:e.jsx("polyline",{points:"20 6 9 17 4 12"})})]},n.value)})})}),document.body):null;return e.jsxs("div",{ref:o,className:c("relative",w),children:[e.jsxs("button",{type:"button",disabled:x,"aria-haspopup":"listbox","aria-expanded":i,onClick:()=>g(n=>!n),className:c("flex h-8 w-full items-center rounded-md border border-edge bg-inset px-2.5 pr-8 text-left text-[13px] text-fg shadow-[inset_0_1px_0_var(--th-inset-hl),0_1px_2px_rgba(15,23,42,0.05)]","transition-[border-color,box-shadow,background] duration-200 outline-none","hover:border-edge-h hover:bg-panel","focus-visible:border-edge-h focus-visible:shadow-[0_0_0_4px_var(--th-glow-a)]","disabled:cursor-not-allowed disabled:opacity-50",i&&"border-edge-h bg-panel shadow-[0_0_0_4px_var(--th-glow-a)]"),children:[e.jsx("span",{className:c("min-w-0 flex-1 truncate",!f&&"text-fg-5"),children:f?.label||a}),e.jsx("span",{className:c("pointer-events-none absolute inset-y-0 right-3 flex items-center text-fg-4 transition-transform duration-200",i&&"rotate-180"),children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})})]}),b]})}function B({value:u,options:h,onChange:y,renderIcon:w}){const[a,x]=s.useState(!1),[p,f]=s.useState(null),m=s.useRef(null),i=s.useRef(null);s.useEffect(()=>{if(!a)return;const t=o=>{_(m.current,o.target)||_(i.current,o.target)||x(!1)},l=o=>{o.key==="Escape"&&x(!1)};return document.addEventListener("mousedown",t),document.addEventListener("keydown",l),()=>{document.removeEventListener("mousedown",t),document.removeEventListener("keydown",l)}},[a]),s.useLayoutEffect(()=>{if(!a)return;const t=()=>{const l=m.current;if(!l)return;const o=l.getBoundingClientRect(),v=window.innerHeight-o.bottom-12,b=o.top-12,n=v<220&&b>v,r=Math.max(140,Math.min(260,n?b:v));f({left:o.left,top:n?Math.max(12,o.top-r-8):o.bottom+8,width:Math.max(o.width,160),maxHeight:r})};return t(),window.addEventListener("resize",t),window.addEventListener("scroll",t,!0),()=>{window.removeEventListener("resize",t),window.removeEventListener("scroll",t,!0)}},[a]);const g=a&&p?H.createPortal(e.jsx("div",{ref:i,role:"listbox",className:"fixed z-[220] overflow-hidden rounded-xl border border-edge-h bg-[var(--th-dropdown)] p-1.5 shadow-[0_24px_64px_rgba(2,6,23,0.22)] backdrop-blur-xl",style:{left:p.left,top:p.top,width:p.width},children:e.jsx("div",{className:"overflow-y-auto",style:{maxHeight:p.maxHeight},children:h.map(t=>{const l=t.value===u;return e.jsxs("button",{type:"button",role:"option","aria-selected":l,onClick:()=>{y(t.value),x(!1)},className:c("flex w-full items-center gap-2.5 rounded-lg px-2.5 py-2 text-left text-[13px] transition-colors duration-200",l?"bg-panel text-fg shadow-[inset_0_1px_0_rgba(255,255,255,0.03)]":"text-fg-3 hover:bg-panel-alt hover:text-fg-2"),children:[w(t.value),e.jsx("span",{className:"min-w-0 flex-1 truncate",children:t.label}),l&&e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"shrink-0 text-fg-4",children:e.jsx("polyline",{points:"20 6 9 17 4 12"})})]},t.value)})})}),document.body):null;return e.jsxs("div",{ref:m,className:"relative shrink-0",children:[e.jsxs("button",{type:"button","aria-haspopup":"listbox","aria-expanded":a,onClick:()=>x(t=>!t),className:c("inline-flex items-center gap-1.5 rounded-lg border border-edge bg-inset px-2 py-1.5","transition-[border-color,box-shadow,background] duration-200 outline-none","hover:border-edge-h hover:bg-panel","focus-visible:border-edge-h focus-visible:shadow-[0_0_0_4px_var(--th-glow-a)]",a&&"border-edge-h bg-panel shadow-[0_0_0_4px_var(--th-glow-a)]"),children:[w(u),e.jsx("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",className:c("text-fg-5 transition-transform duration-200",a&&"rotate-180"),children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})]}),g]})}export{B as I,M as S};
1
+ import{r as s,j as e,b as H}from"./react-vendor-DTcmqLiz.js";import{c}from"./index-Bbf__IXB.js";function _(u,h){return!!(u&&h instanceof Node&&u.contains(h))}function M({value:u,options:h,onChange:y,className:w,placeholder:a="—",disabled:x=!1,readOnly:p=!1}){const f=h.find(n=>n.value===u),m=p||h.length<=1,[i,g]=s.useState(!1),[t,l]=s.useState(null),o=s.useRef(null),j=s.useRef(null);if(s.useEffect(()=>{if(!i)return;const n=d=>{_(o.current,d.target)||_(j.current,d.target)||g(!1)},r=d=>{d.key==="Escape"&&g(!1)};return document.addEventListener("mousedown",n),document.addEventListener("keydown",r),()=>{document.removeEventListener("mousedown",n),document.removeEventListener("keydown",r)}},[i]),s.useLayoutEffect(()=>{if(!i)return;const n=()=>{const r=o.current;if(!r)return;const d=r.getBoundingClientRect(),k=window.innerHeight-d.bottom-12,E=d.top-12,N=k<220&&E>k,L=Math.max(140,Math.min(260,N?E:k));l({left:d.left,top:N?Math.max(12,d.top-L-8):d.bottom+8,width:d.width,maxHeight:L})};return n(),window.addEventListener("resize",n),window.addEventListener("scroll",n,!0),()=>{window.removeEventListener("resize",n),window.removeEventListener("scroll",n,!0)}},[i]),m)return e.jsx("div",{className:c("flex h-8 w-full items-center rounded-md border border-edge bg-panel-alt px-2.5 text-[13px] text-fg-3 shadow-[inset_0_1px_0_var(--th-inset-hl),0_1px_2px_rgba(15,23,42,0.05)]",x&&"cursor-not-allowed opacity-50",w),children:e.jsx("span",{className:c("truncate",!f&&"text-fg-5"),children:f?.label||a})});const v=n=>{x||(y(n),g(!1))},b=i&&t?H.createPortal(e.jsx("div",{ref:j,role:"listbox",className:"fixed z-[220] overflow-hidden rounded-xl border border-edge-h bg-[var(--th-dropdown)] p-1.5 shadow-[0_24px_64px_rgba(2,6,23,0.22)] backdrop-blur-xl",style:{left:t.left,top:t.top,width:t.width},children:e.jsx("div",{className:"overflow-y-auto",style:{maxHeight:t.maxHeight},children:h.map(n=>{const r=n.value===u;return e.jsxs("button",{type:"button",role:"option","aria-selected":r,onClick:()=>v(n.value),className:c("flex w-full items-center gap-2 rounded-lg px-3 py-2 text-left text-[13px] transition-colors duration-200",r?"bg-panel text-fg shadow-[inset_0_1px_0_rgba(255,255,255,0.03)]":"text-fg-3 hover:bg-panel-alt hover:text-fg-2"),children:[e.jsx("span",{className:"min-w-0 flex-1 truncate",children:n.label}),r&&e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"shrink-0 text-fg-4",children:e.jsx("polyline",{points:"20 6 9 17 4 12"})})]},n.value)})})}),document.body):null;return e.jsxs("div",{ref:o,className:c("relative",w),children:[e.jsxs("button",{type:"button",disabled:x,"aria-haspopup":"listbox","aria-expanded":i,onClick:()=>g(n=>!n),className:c("flex h-8 w-full items-center rounded-md border border-edge bg-inset px-2.5 pr-8 text-left text-[13px] text-fg shadow-[inset_0_1px_0_var(--th-inset-hl),0_1px_2px_rgba(15,23,42,0.05)]","transition-[border-color,box-shadow,background] duration-200 outline-none","hover:border-edge-h hover:bg-panel","focus-visible:border-edge-h focus-visible:shadow-[0_0_0_4px_var(--th-glow-a)]","disabled:cursor-not-allowed disabled:opacity-50",i&&"border-edge-h bg-panel shadow-[0_0_0_4px_var(--th-glow-a)]"),children:[e.jsx("span",{className:c("min-w-0 flex-1 truncate",!f&&"text-fg-5"),children:f?.label||a}),e.jsx("span",{className:c("pointer-events-none absolute inset-y-0 right-3 flex items-center text-fg-4 transition-transform duration-200",i&&"rotate-180"),children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})})]}),b]})}function B({value:u,options:h,onChange:y,renderIcon:w}){const[a,x]=s.useState(!1),[p,f]=s.useState(null),m=s.useRef(null),i=s.useRef(null);s.useEffect(()=>{if(!a)return;const t=o=>{_(m.current,o.target)||_(i.current,o.target)||x(!1)},l=o=>{o.key==="Escape"&&x(!1)};return document.addEventListener("mousedown",t),document.addEventListener("keydown",l),()=>{document.removeEventListener("mousedown",t),document.removeEventListener("keydown",l)}},[a]),s.useLayoutEffect(()=>{if(!a)return;const t=()=>{const l=m.current;if(!l)return;const o=l.getBoundingClientRect(),v=window.innerHeight-o.bottom-12,b=o.top-12,n=v<220&&b>v,r=Math.max(140,Math.min(260,n?b:v));f({left:o.left,top:n?Math.max(12,o.top-r-8):o.bottom+8,width:Math.max(o.width,160),maxHeight:r})};return t(),window.addEventListener("resize",t),window.addEventListener("scroll",t,!0),()=>{window.removeEventListener("resize",t),window.removeEventListener("scroll",t,!0)}},[a]);const g=a&&p?H.createPortal(e.jsx("div",{ref:i,role:"listbox",className:"fixed z-[220] overflow-hidden rounded-xl border border-edge-h bg-[var(--th-dropdown)] p-1.5 shadow-[0_24px_64px_rgba(2,6,23,0.22)] backdrop-blur-xl",style:{left:p.left,top:p.top,width:p.width},children:e.jsx("div",{className:"overflow-y-auto",style:{maxHeight:p.maxHeight},children:h.map(t=>{const l=t.value===u;return e.jsxs("button",{type:"button",role:"option","aria-selected":l,onClick:()=>{y(t.value),x(!1)},className:c("flex w-full items-center gap-2.5 rounded-lg px-2.5 py-2 text-left text-[13px] transition-colors duration-200",l?"bg-panel text-fg shadow-[inset_0_1px_0_rgba(255,255,255,0.03)]":"text-fg-3 hover:bg-panel-alt hover:text-fg-2"),children:[w(t.value),e.jsx("span",{className:"min-w-0 flex-1 truncate",children:t.label}),l&&e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"shrink-0 text-fg-4",children:e.jsx("polyline",{points:"20 6 9 17 4 12"})})]},t.value)})})}),document.body):null;return e.jsxs("div",{ref:m,className:"relative shrink-0",children:[e.jsxs("button",{type:"button","aria-haspopup":"listbox","aria-expanded":a,onClick:()=>x(t=>!t),className:c("inline-flex items-center gap-1.5 rounded-lg border border-edge bg-inset px-2 py-1.5","transition-[border-color,box-shadow,background] duration-200 outline-none","hover:border-edge-h hover:bg-panel","focus-visible:border-edge-h focus-visible:shadow-[0_0_0_4px_var(--th-glow-a)]",a&&"border-edge-h bg-panel shadow-[0_0_0_4px_var(--th-glow-a)]"),children:[w(u),e.jsx("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",className:c("text-fg-5 transition-transform duration-200",a&&"rotate-180"),children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})]}),g]})}export{B as I,M as S};
@@ -0,0 +1 @@
1
+ import{r as t,j as s}from"./react-vendor-DTcmqLiz.js";import{u as he,e as He,g as Ne,s as Ce,a as E,S as pe,l as J}from"./index-Bbf__IXB.js";import{l as Me,n as Se,m as we,a as De,p as Pe,u as Ue,b as _e,T as $e,U as Ae,c as qe,d as xe,L as Be,I as Qe}from"./index-Bvi7jk1E.js";import"./router-emLofBBH.js";import"./Select-DBMtcZku.js";import"./Modal-utaCOq7k.js";import"./BrandIcon-BAXeIuGD.js";import"./DirBrowser-HtXAEFE-.js";import"./markdown-iTdiLvRJ.js";import"./shared-BRvVjyDB.js";import"./ExtensionsTab-RVDkgg0j.js";const Z=12,Te=160,Ke=96,Xe=20,R=new Map;function ze(v,r){return`${v}:${r}`}function Fe(v,r){for(R.delete(v),R.set(v,r);R.size>Xe;)R.delete(R.keys().next().value)}const lt=t.memo(function({session:r,workdir:d,active:ee=!0,onSessionChange:_,initialPendingPrompt:p,onPendingPromptConsumed:te}){const re=he(e=>e.locale),Re=he(e=>e.agentStatus?.agents?.find(n=>n.agent===r.agent)?.selectedEffort??null),$=r.thinkingEffort||Re,m=t.useMemo(()=>He(re),[re]),A=Ne(r.agent||""),ne=Ce(r),[a,q]=t.useState(null),[B,se]=t.useState(!p),[y,le]=t.useState(!1),[c,I]=t.useState(null),[H,O]=t.useState(!1),[ve,Q]=t.useState(null),[ye,ae]=t.useState(0),[Ie,K]=t.useState(null),[Oe,N]=t.useState(null),[u,ue]=t.useState(p||null),[k,ce]=t.useState([]),[ke,X]=t.useState(!1),[be,oe]=t.useState(null),z=t.useRef([]),fe=t.useRef(c),ie=t.useRef(H);fe.current=c,ie.current=H;const h=t.useRef(null),C=t.useRef(null),S=t.useRef(!0),x=t.useRef(!1),F=t.useRef(!1),G=t.useRef(!1),b=t.useRef(!!p),j=t.useRef(!1),M=t.useRef(!1),V=t.useRef(!1),W=t.useRef(!1);t.useEffect(()=>{V.current||!p||(V.current=!0,ae(e=>e+1),te?.())},[p,te]);const i=t.useCallback(()=>{ue(null),ce(e=>{for(const n of e)URL.revokeObjectURL(n);return[]}),z.current=[],X(!1)},[]),de=t.useCallback((e,n)=>{for(const f of z.current)URL.revokeObjectURL(f);ue(e||null);const l=n||[];ce(l),z.current=l,X(!!fe.current||ie.current)},[]),w=t.useCallback(async(e,n={})=>{try{const l=await Me({workdir:d,agent:r.agent||"",sessionId:r.sessionId,rich:!0,turnOffset:e.turnOffset,turnLimit:e.turnLimit,lastNTurns:e.lastNTurns},{force:n.force});return l.ok?Se(l):null}catch{return null}},[d,r.agent,r.sessionId]),o=t.useCallback(async({keepOlder:e,force:n=!1,scrollToBottom:l=!1})=>{if(F.current)return!1;F.current=!0;try{const f=await w({turnOffset:0,turnLimit:Z},{force:n});return f?(l&&(x.current=!0),q(me=>!me||!e?f:we(me,f)),j.current&&(j.current=!1,i()),M.current&&(M.current=!1,I(null)),!0):!1}finally{F.current=!1}},[w,i]),D=t.useCallback(async()=>{if(!a?.hasOlder||G.current)return;const e=h.current;e&&(C.current={scrollHeight:e.scrollHeight,scrollTop:e.scrollTop}),G.current=!0,le(!0);try{const n=await w({turnOffset:Math.max(0,a.totalTurns-a.startTurn),turnLimit:Z});n?q(l=>l?De(l,n):n):C.current=null}finally{G.current=!1,le(!1)}},[w,a]),P=t.useRef(null),T=t.useCallback(e=>{if(e?.sessionId&&e.sessionId!==r.sessionId&&(W.current=!0,Y.current=`${r.agent}:${e.sessionId}`,_?.({agent:r.agent||"",sessionId:e.sessionId,workdir:d})),!e){const n=P.current;O(!1),n==="streaming"?(j.current=!0,M.current=!0,o({keepOlder:!0,force:!0,scrollToBottom:S.current})):I(null),n==="done"?i():n===null&&b.current&&o({keepOlder:!0,force:!0}),b.current=!1,K(null),Q(null),N(null),P.current=null;return}Q(e.phase),K(e.taskId||null),N(e.queuedTaskId||null),e.phase==="streaming"?(I({phase:"streaming",text:e.text||"",thinking:e.thinking||"",activity:e.activity,plan:e.plan??null}),O(!0),e.queuedTaskId||X(!1),S.current&&(x.current=!0)):e.phase==="queued"?(I(null),O(!1)):e.phase==="done"&&(O(!1),P.current!=="done"&&(e.queuedTaskId||(j.current=!0),M.current=!0,o({keepOlder:!0,force:!0,scrollToBottom:S.current})),e.queuedTaskId||(b.current=!1)),P.current=e.phase},[i,o,r.sessionId,r.agent,_,d]),ge=t.useCallback(()=>{b.current=!0,ae(e=>e+1)},[]),je=t.useCallback(async e=>{try{await E.recallSessionMessage(e),i(),N(n=>n===e?null:n),K(n=>n===e?null:n)}catch{}},[i]),Le=t.useCallback(async e=>{try{await E.steerSession(e)}catch{}},[]),U=ze(r.agent||"",r.sessionId);t.useEffect(()=>{if(W.current){W.current=!1,o({keepOlder:!0,force:!0});return}let e=!1;const n=Pe({workdir:d,agent:r.agent||"",sessionId:r.sessionId,rich:!0,turnOffset:0,turnLimit:Z},{allowStale:!0}),l=!!p&&!V.current,f=n?.ok?Se(n):R.get(U)||null;return se(l?!1:!f),q(f),I(null),O(!1),Q(null),N(null),S.current=!0,x.current=!0,l||o({keepOlder:!1,force:!0}).finally(()=>{e||se(!1)}),()=>{e=!0}},[o,r.agent,r.sessionId,d,U]),t.useEffect(()=>{a&&a.turns.length>0&&Fe(U,a)},[U,a]),t.useEffect(()=>{ee&&o({keepOlder:!0,force:!0})},[ee,o]);const Y=t.useRef(`${r.agent}:${r.sessionId}`);Y.current=`${r.agent}:${r.sessionId}`,Ue("stream-update",t.useCallback(e=>{e.key===Y.current&&T(e.snapshot??null)},[T])),t.useEffect(()=>{let e=!0;return E.getSessionStreamState(r.agent||"",r.sessionId).then(n=>{e&&T(n.state)}).catch(()=>{}),()=>{e=!1}},[T,r.agent,r.sessionId,ye]),_e(t.useCallback(()=>{E.getSessionStreamState(r.agent||"",r.sessionId).then(e=>{T(e.state)}).catch(()=>{}),o({keepOlder:!0,force:!0})},[T,r.agent,r.sessionId,o])),t.useEffect(()=>{ne!=="running"&&!H&&!c&&(i(),b.current=!1)},[ne,H,c,i]),t.useLayoutEffect(()=>{const e=C.current,n=h.current;!e||!n||(C.current=null,n.scrollTop=e.scrollTop+(n.scrollHeight-e.scrollHeight))},[a?.turns.length]),t.useLayoutEffect(()=>{if(!x.current)return;const e=h.current;e&&(x.current=!1,e.scrollTop=e.scrollHeight,requestAnimationFrame(()=>{S.current&&(e.scrollTop=e.scrollHeight)}))},[a,c]),t.useLayoutEffect(()=>{if(!u)return;const e=h.current;e&&(e.scrollTop=e.scrollHeight)},[u]),t.useEffect(()=>{if(!a?.hasOlder||B||y)return;const e=h.current;e&&e.scrollHeight<=e.clientHeight+Te&&D()},[a?.hasOlder,a?.turns.length,D,B,y]);const Ee=t.useCallback(()=>{const e=h.current;if(!e)return;const n=e.scrollHeight-e.scrollTop-e.clientHeight;S.current=n<=Ke,e.scrollTop<=Te&&D()},[D]),g=a?.turns||[],L=t.useMemo(()=>{if(!c||!g.length)return g;const e=g[g.length-1];return!e.assistant||u&&e.user?.text?.trim()!==u.trim()?g:[...g.slice(0,-1),{...e,assistant:null}]},[g,c,u]);return s.jsxs("div",{className:"flex flex-col h-full overflow-hidden",children:[s.jsx("div",{ref:h,onScroll:Ee,className:"flex-1 overflow-y-auto overscroll-contain",children:B?s.jsx("div",{className:"flex items-center justify-center py-20",children:s.jsx(pe,{className:"h-5 w-5 text-fg-4"})}):L.length===0&&!u&&!k.length&&!c?s.jsx("div",{className:"py-20 text-center text-[13px] text-fg-5",children:m("hub.noMessages")}):s.jsxs("div",{className:"max-w-[900px] mx-auto px-6 py-6 space-y-0",children:[(a?.hasOlder||y)&&s.jsxs("div",{className:"mb-4 flex items-center justify-center gap-2 text-[11px] text-fg-5",children:[y?s.jsx(pe,{className:"h-3 w-3 text-fg-5"}):s.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-fg-5/35"}),s.jsx("span",{children:m(y?"hub.loadingOlderTurns":"hub.loadOlderTurnsHint")})]}),L.map((e,n)=>s.jsx($e,{turn:e,agent:r.agent||"",meta:A,model:r.model?J(r.model):void 0,effort:$,t:m,onResend:l=>{x.current=!0,de(l),E.sendSessionMessage(d,r.agent||"",r.sessionId,l).then(f=>{f.ok&&ge()}).catch(()=>{i()})},onEdit:l=>oe(l)},`${a?.startTurn||0}:${n}`)),(u||k.length>0)&&!ke&&!j.current&&!(u&&L.length>0&&L[L.length-1]?.user?.text?.trim()===u.trim())&&s.jsxs("div",{className:"session-turn",children:[s.jsx(Ae,{text:u||"",blocks:k.map(e=>({type:"image",content:e})),t:m}),!c&&s.jsx("div",{className:"mt-3 mb-5 animate-in",children:s.jsx(qe,{className:"text-fg-5"})})]}),c&&s.jsxs("div",{className:"mb-6",children:[!u&&!k.length&&s.jsx(xe,{agent:r.agent||"",meta:A,model:r.model?J(r.model):void 0,effort:$}),(u||k.length>0)&&s.jsx(xe,{agent:r.agent||"",meta:A,model:r.model?J(r.model):void 0,effort:$}),s.jsx(Be,{stream:c,t:m})]}),s.jsx("div",{className:"h-4"})]})}),s.jsx(Qe,{session:r,workdir:d,onStreamQueued:ge,onSendStart:de,onSessionChange:_,t:m,streamPhase:ve,streamTaskId:Ie,queuedTaskId:Oe,pendingPrompt:u,onRecall:je,onSteer:Le,editDraft:be,onEditDraftConsumed:()=>oe(null)})]})});export{lt as SessionPanel};