@tt-a1i/hive 2.1.11 → 2.1.13

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/CHANGELOG.md +13 -0
  2. package/README.md +13 -11
  3. package/README.zh.md +9 -8
  4. package/dist/src/cli/hive-defaults.d.ts +1 -0
  5. package/dist/src/cli/hive-defaults.js +1 -0
  6. package/dist/src/cli/hive-mcp.js +2 -1
  7. package/dist/src/cli/hive.d.ts +2 -0
  8. package/dist/src/cli/hive.js +4 -2
  9. package/dist/src/server/agent-run-starter.js +14 -0
  10. package/dist/src/server/agent-stdin-dispatcher.js +2 -2
  11. package/dist/src/server/claude-trust-store.d.ts +14 -0
  12. package/dist/src/server/claude-trust-store.js +67 -0
  13. package/dist/src/server/codex-trust-store.d.ts +14 -0
  14. package/dist/src/server/codex-trust-store.js +72 -0
  15. package/dist/src/server/command-preset-defaults.d.ts +1 -1
  16. package/dist/src/server/command-preset-defaults.js +10 -0
  17. package/dist/src/server/post-start-input-writer.d.ts +1 -0
  18. package/dist/src/server/post-start-input-writer.js +77 -34
  19. package/dist/src/server/sqlite-schema-v38.d.ts +2 -0
  20. package/dist/src/server/sqlite-schema-v38.js +26 -0
  21. package/dist/src/server/sqlite-schema.d.ts +1 -1
  22. package/dist/src/server/sqlite-schema.js +6 -1
  23. package/dist/src/server/workflow-cli-policy.d.ts +1 -1
  24. package/dist/src/server/workflow-cli-policy.js +1 -0
  25. package/package.json +3 -3
  26. package/web/dist/assets/{AddWorkerDialog-CMQdmZJQ.js → AddWorkerDialog-DcEIii34.js} +2 -2
  27. package/web/dist/assets/AddWorkspaceFlow-BTYcc0tV.js +1 -0
  28. package/web/dist/assets/{FirstRunWizard-PRHGFYry.js → FirstRunWizard-Bdb1l71P.js} +1 -1
  29. package/web/dist/assets/{MarketplaceDrawer-Dm-Z-YL8.js → MarketplaceDrawer-C1MjJMok.js} +1 -1
  30. package/web/dist/assets/{TaskGraphDrawer-HaGRlpar.js → TaskGraphDrawer-DFYARCjj.js} +1 -1
  31. package/web/dist/assets/{WhatsNewDialog-9upxbs9b.js → WhatsNewDialog-rUU_Roz8.js} +1 -1
  32. package/web/dist/assets/{WorkerModal-DAC0fORb.js → WorkerModal-CuB3F-m-.js} +1 -1
  33. package/web/dist/assets/WorkflowsDrawer-Bk87nnDw.js +1 -0
  34. package/web/dist/assets/{WorkspaceMemoryDrawer-QvVUM6qp.js → WorkspaceMemoryDrawer-DPfFpEwj.js} +1 -1
  35. package/web/dist/assets/{WorkspaceTaskDrawer-CdiraIBo.js → WorkspaceTaskDrawer-DOWlwBCm.js} +1 -1
  36. package/web/dist/assets/{index-B1vvo0-M.js → index-XUIK5lOA.js} +5 -5
  37. package/web/dist/assets/{search-DgMNPsfM.js → search-DFKWO_9l.js} +1 -1
  38. package/web/dist/assets/{square-terminal-CiDDFh5Z.js → square-terminal-D54LkZqa.js} +1 -1
  39. package/web/dist/cli-icons/pi.svg +26 -0
  40. package/web/dist/index.html +1 -1
  41. package/web/dist/manifest.webmanifest +1 -1
  42. package/web/dist/sw.js +1 -1
  43. package/web/dist/assets/AddWorkspaceFlow-arGy-LVX.js +0 -1
  44. package/web/dist/assets/WorkflowsDrawer-Dqv4vNZW.js +0 -1
@@ -39,6 +39,7 @@ const COMMANDS_WITH_BRACKETED_PASTE = new Set([
39
39
  'grok',
40
40
  'hermes',
41
41
  'opencode',
42
+ 'pi',
42
43
  ]);
43
44
  const COMMANDS_WAITING_FOR_PASTE_ACK = new Set(['claude', 'codex']);
44
45
  const BRACKETED_PASTE_END = '\u001b[201~';
@@ -54,7 +55,6 @@ const OPENCODE_INTERRUPT_STATUS_PATTERN = /\besc\s+interrupt\b/iu;
54
55
  export const toBracketedPasteSubmission = (text) => `\u001b[200~${text}\u001b[201~`;
55
56
  const toError = (error) => (error instanceof Error ? error : new Error(String(error)));
56
57
  const createRunInactiveError = (runId) => new Error(`Run became inactive before input was submitted: ${runId}`);
57
- const createPromptReadyTimeoutError = (runId, command) => new Error(`Timed out waiting for ${getCommandName(command) || command} prompt readiness: ${runId}`);
58
58
  const getSubmitAfterPasteDelayMs = (command, text) => {
59
59
  const commandName = getCommandName(command);
60
60
  if (commandName === 'grok')
@@ -84,6 +84,7 @@ const hasHermesPromptReady = (output) => {
84
84
  return /\bWelcome to Hermes Agent![\s\S]*❯/u.test(plain);
85
85
  };
86
86
  const hasGrokPromptReady = (output) => /\b(?:Enter:send|Composer\s+\S+)/u.test(output);
87
+ const hasPiPromptReady = (output) => /\bpi\s+v\d+(?:\.\d+){1,3}[\s\S]*\b(?:escape\s+interrupt|ctrl\+c\/ctrl\+d\s+clear\/exit)\b/iu.test(getPlainTerminalTail(output));
87
88
  const hasAgyPromptReady = (output) => /(?:^|\n)\s*>\s*\n\s*(?:[─-]{8,}|\?\s*for shortcuts)/u.test(getPlainTerminalOutput(output));
88
89
  const getLastNonEmptyTerminalLine = (output) => {
89
90
  const normalized = getPlainTerminalOutput(output);
@@ -138,6 +139,7 @@ const getInteractivePromptReadyState = (output, command = '') => {
138
139
  (commandName === 'agy' && hasAgyPromptReady(output)) ||
139
140
  (commandName === 'grok' && hasGrokPromptReady(output)) ||
140
141
  (commandName === 'hermes' && hasHermesPromptReady(output)) ||
142
+ (commandName === 'pi' && hasPiPromptReady(output)) ||
141
143
  ((commandName === 'gemini' || commandName === 'qwen') && hasGeminiPromptReady(output))) {
142
144
  return 'ready';
143
145
  }
@@ -184,11 +186,12 @@ const canTimeoutBeforePromptReady = (command) => {
184
186
  commandName !== 'gemini' &&
185
187
  commandName !== 'hermes' &&
186
188
  commandName !== 'opencode' &&
189
+ commandName !== 'pi' &&
187
190
  commandName !== 'qwen');
188
191
  };
189
192
  const hasPromptReadyHardTimeout = (command) => {
190
193
  const commandName = getCommandName(command);
191
- return commandName === 'hermes' || commandName === 'opencode';
194
+ return commandName === 'hermes' || commandName === 'opencode' || commandName === 'pi';
192
195
  };
193
196
  const isWritableRunStatus = (status) => status === undefined || status === 'starting' || status === 'running';
194
197
  const writeIfRunWritable = (agentManager, runId, text) => {
@@ -290,16 +293,68 @@ const submitPastedInteractiveInput = (agentManager, runId, command, text, baseli
290
293
  };
291
294
  setTimeout(trySubmit, minDelay);
292
295
  };
293
- export const createPostStartInputWriter = (agentManager, command) => {
296
+ // Synchronous write for non-interactive commands; an EPIPE/inactive failure
297
+ // still throws synchronously (before the promise is returned), preserving the
298
+ // dispatcher's contract.
299
+ const writeNonInteractiveInput = (agentManager, runId, text) => {
300
+ if (!writeIfRunWritable(agentManager, runId, `${text}\r`)) {
301
+ throw createRunInactiveError(runId);
302
+ }
303
+ return Promise.resolve();
304
+ };
305
+ // Shared delivery step for interactive (TUI) commands: snapshot the current
306
+ // output as the paste baseline, paste the text (bracketed where supported),
307
+ // then run the paste→ack→submit sequence. Used by both the post-start writer
308
+ // (after prompt readiness) and the immediate writer (skipping readiness).
309
+ const deliverPastedInteractiveInput = (agentManager, runId, command, text, output, isInitialAttempt, resolveDone, rejectDone) => {
310
+ const baselineLength = output.length;
311
+ const input = usesBracketedPaste(command) ? toBracketedPasteSubmission(text) : text;
312
+ try {
313
+ if (!writeIfRunWritable(agentManager, runId, input)) {
314
+ rejectDone(createRunInactiveError(runId));
315
+ return;
316
+ }
317
+ }
318
+ catch (error) {
319
+ if (isInitialAttempt)
320
+ throw error;
321
+ rejectDone(toError(error));
322
+ return;
323
+ }
324
+ submitPastedInteractiveInput(agentManager, runId, command, text, baselineLength, shouldWaitForPasteAck(command, text), getPasteAckSettleDelayMs(command), getPasteAckTimeoutMs(command, text), retriesSubmit(command), resolveDone, rejectDone);
325
+ };
326
+ // Immediate writer for already-running members (dispatch path): the member is
327
+ // long past its startup window, so skip prompt-readiness polling and the
328
+ // first-run setup guard entirely and paste right away. The paste→submit timing
329
+ // (bracketed paste, ack wait, codex retry) is preserved so multi-line TUI input
330
+ // is still received correctly. Mirrors createPostStartInputWriter's contract:
331
+ // an initial-attempt inactive failure throws synchronously.
332
+ export const createImmediateInteractiveInputWriter = (agentManager, command) => {
294
333
  if (!isInteractiveAgentCommand(command)) {
295
- return (runId, text) => {
296
- // Synchronous write; an EPIPE/inactive failure still throws synchronously
297
- // (before the promise is returned), preserving the dispatcher's contract.
298
- if (!writeIfRunWritable(agentManager, runId, `${text}\r`)) {
299
- throw createRunInactiveError(runId);
334
+ return (runId, text) => writeNonInteractiveInput(agentManager, runId, text);
335
+ }
336
+ return (runId, text) => new Promise((resolve, reject) => {
337
+ let output;
338
+ try {
339
+ const run = agentManager.getRun(runId);
340
+ if (!isWritableRunStatus(run.status)) {
341
+ reject(createRunInactiveError(runId));
342
+ return;
300
343
  }
301
- return Promise.resolve();
302
- };
344
+ output = run.output;
345
+ }
346
+ catch {
347
+ reject(createRunInactiveError(runId));
348
+ return;
349
+ }
350
+ // isInitialAttempt is false here: any throw becomes a rejection rather
351
+ // than a synchronous throw, since delivery happens inside the executor.
352
+ deliverPastedInteractiveInput(agentManager, runId, command, text, output, false, resolve, reject);
353
+ });
354
+ };
355
+ export const createPostStartInputWriter = (agentManager, command) => {
356
+ if (!isInteractiveAgentCommand(command)) {
357
+ return (runId, text) => writeNonInteractiveInput(agentManager, runId, text);
303
358
  }
304
359
  return (runId, text) => {
305
360
  let resolveDone;
@@ -343,30 +398,18 @@ export const createPostStartInputWriter = (agentManager, command) => {
343
398
  return;
344
399
  }
345
400
  const firstRunSetupPromptVisible = hasFirstRunSetupPrompt(output);
346
- if ((!firstRunSetupPromptVisible && isReadyToWrite(output)) ||
347
- (!firstRunSetupPromptVisible &&
348
- canTimeoutBeforePromptReady(command) &&
349
- Date.now() - startedAt >= READY_TIMEOUT_MS)) {
350
- const baselineLength = output.length;
351
- const input = usesBracketedPaste(command) ? toBracketedPasteSubmission(text) : text;
352
- try {
353
- if (!writeIfRunWritable(agentManager, runId, input)) {
354
- rejectDone(createRunInactiveError(runId));
355
- return;
356
- }
357
- }
358
- catch (error) {
359
- if (isInitialAttempt)
360
- throw error;
361
- rejectDone(toError(error));
362
- return;
363
- }
364
- submitPastedInteractiveInput(agentManager, runId, command, text, baselineLength, shouldWaitForPasteAck(command, text), getPasteAckSettleDelayMs(command), getPasteAckTimeoutMs(command, text), retriesSubmit(command), resolveDone, rejectDone);
365
- return;
366
- }
367
- if (hasPromptReadyHardTimeout(command) &&
368
- Date.now() - startedAt >= PROMPT_READY_HARD_TIMEOUT_MS) {
369
- rejectDone(createPromptReadyTimeoutError(runId, command));
401
+ const elapsed = Date.now() - startedAt;
402
+ // Fallback delivery so a readiness anchor that scrolls out of the tail
403
+ // window (e.g. pi's one-shot startup banner) never strands a dispatch.
404
+ // Commands with a soft fallback (codex/claude) deliver after the short
405
+ // READY_TIMEOUT_MS; pi/opencode/hermes deliver after the longer hard
406
+ // timeout, matching the original universal "detect-then-timeout" safety
407
+ // net. The firstRunSetupPrompt guard below still blocks delivery while a
408
+ // genuine trust/login/setup prompt is on screen.
409
+ const fallbackDeliveryDue = (canTimeoutBeforePromptReady(command) && elapsed >= READY_TIMEOUT_MS) ||
410
+ (hasPromptReadyHardTimeout(command) && elapsed >= PROMPT_READY_HARD_TIMEOUT_MS);
411
+ if (!firstRunSetupPromptVisible && (isReadyToWrite(output) || fallbackDeliveryDue)) {
412
+ deliverPastedInteractiveInput(agentManager, runId, command, text, output, isInitialAttempt, resolveDone, rejectDone);
370
413
  return;
371
414
  }
372
415
  setTimeout(tryWrite, READY_CHECK_INTERVAL_MS);
@@ -0,0 +1,2 @@
1
+ import type { Database } from 'better-sqlite3';
2
+ export declare const applySchemaVersion38: (db: Database) => void;
@@ -0,0 +1,26 @@
1
+ import { getBuiltinCommandPreset } from './command-preset-defaults.js';
2
+ export const applySchemaVersion38 = (db) => {
3
+ const hasCommandPresets = db
4
+ .prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'command_presets'")
5
+ .get();
6
+ if (!hasCommandPresets)
7
+ return;
8
+ const preset = getBuiltinCommandPreset('pi');
9
+ if (!preset)
10
+ return;
11
+ const now = Date.now();
12
+ db.prepare(`INSERT INTO command_presets (
13
+ id, display_name, command, args, env, resume_args_template, session_id_capture,
14
+ yolo_args_template, is_builtin, created_at, updated_at
15
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 1, ?, ?)
16
+ ON CONFLICT(id) DO UPDATE SET
17
+ display_name = excluded.display_name,
18
+ command = excluded.command,
19
+ args = excluded.args,
20
+ env = excluded.env,
21
+ resume_args_template = excluded.resume_args_template,
22
+ session_id_capture = excluded.session_id_capture,
23
+ yolo_args_template = excluded.yolo_args_template,
24
+ updated_at = excluded.updated_at
25
+ WHERE command_presets.is_builtin = 1`).run(preset.id, preset.displayName, preset.command, '[]', '{}', preset.resumeArgsTemplate, preset.sessionIdCapture ? JSON.stringify(preset.sessionIdCapture) : null, preset.yoloArgsTemplate ? JSON.stringify(preset.yoloArgsTemplate) : null, now, now);
26
+ };
@@ -1,3 +1,3 @@
1
1
  import type { Database } from 'better-sqlite3';
2
- export declare const CURRENT_SCHEMA_VERSION = 37;
2
+ export declare const CURRENT_SCHEMA_VERSION = 38;
3
3
  export declare const initializeRuntimeDatabase: (db: Database) => void;
@@ -30,7 +30,8 @@ import { applySchemaVersion34 } from './sqlite-schema-v34.js';
30
30
  import { applySchemaVersion35 } from './sqlite-schema-v35.js';
31
31
  import { applySchemaVersion36 } from './sqlite-schema-v36.js';
32
32
  import { applySchemaVersion37 } from './sqlite-schema-v37.js';
33
- export const CURRENT_SCHEMA_VERSION = 37;
33
+ import { applySchemaVersion38 } from './sqlite-schema-v38.js';
34
+ export const CURRENT_SCHEMA_VERSION = 38;
34
35
  // Idempotent column-add helper. SQLite doesn't have `ALTER TABLE … ADD COLUMN
35
36
  // IF NOT EXISTS`, so PRAGMA-check first. Safe to call on every init; required
36
37
  // for foreign-built DBs where the version-gated migration is skipped.
@@ -444,4 +445,8 @@ export const initializeRuntimeDatabase = (db) => {
444
445
  if (!appliedVersions.has(37)) {
445
446
  db.prepare('INSERT INTO schema_version (version, applied_at) VALUES (?, ?)').run(37, Date.now());
446
447
  }
448
+ applySchemaVersion38(db);
449
+ if (!appliedVersions.has(38)) {
450
+ db.prepare('INSERT INTO schema_version (version, applied_at) VALUES (?, ?)').run(38, Date.now());
451
+ }
447
452
  };
@@ -18,7 +18,7 @@
18
18
  * Hive worker report loop should not become workflow agent targets merely by
19
19
  * existing in settings.
20
20
  */
21
- export declare const CANONICAL_WORKFLOW_CLIS: readonly ["claude", "codex", "opencode", "gemini", "hermes", "qwen", "agy"];
21
+ export declare const CANONICAL_WORKFLOW_CLIS: readonly ["claude", "codex", "opencode", "gemini", "hermes", "qwen", "pi", "agy"];
22
22
  export type WorkflowCli = (typeof CANONICAL_WORKFLOW_CLIS)[number];
23
23
  export declare const WORKFLOW_CLI_POLICY_KEY = "workflow.cli-policy";
24
24
  export interface WorkflowCliPolicy {
@@ -25,6 +25,7 @@ export const CANONICAL_WORKFLOW_CLIS = [
25
25
  'gemini',
26
26
  'hermes',
27
27
  'qwen',
28
+ 'pi',
28
29
  'agy',
29
30
  ];
30
31
  export const WORKFLOW_CLI_POLICY_KEY = 'workflow.cli-policy';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tt-a1i/hive",
3
- "version": "2.1.11",
4
- "description": "Run Claude Code, Codex, Gemini, OpenCode, Qwen, and other CLI agents as a visible local team in your browser.",
3
+ "version": "2.1.13",
4
+ "description": "Run Claude Code, Codex, Gemini, OpenCode, Qwen, Pi, and other CLI agents as a visible local team in your browser.",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@10.30.3",
7
7
  "license": "BUSL-1.1",
@@ -53,7 +53,7 @@
53
53
  "clean": "node scripts/clean-build.mjs",
54
54
  "dev": "pnpm dev:all",
55
55
  "dev:all": "concurrently \"pnpm dev:runtime\" \"pnpm dev:web\"",
56
- "dev:runtime": "tsx src/cli/hive.ts --port 4010",
56
+ "dev:runtime": "tsx src/cli/hive.ts",
57
57
  "dev:web": "vite --config web/vite.config.ts",
58
58
  "build": "pnpm clean && tsc -p tsconfig.build.json && node scripts/prepare-build-artifacts.mjs && pnpm build:web",
59
59
  "build:web": "vite build --config web/vite.config.ts",
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/MarketplaceDrawer-Dm-Z-YL8.js","assets/index-B1vvo0-M.js","assets/index-DYIPzuPD.css","assets/search-DgMNPsfM.js"])))=>i.map(i=>d[i]);
2
- import{c as z,j as e,u as j,r as d,C as M,x as L,t as U,J as Y,Q as Z,ag as ee,ah as te,e as ae,i as re,R as se,P as ne,O as oe,k as le,m as ie,a0 as de,z as ce,X as me,T as xe,ai as ue}from"./index-B1vvo0-M.js";import{S as pe}from"./search-DgMNPsfM.js";import{S as he}from"./square-terminal-CiDDFh5Z.js";const fe=[["path",{d:"M12 7v6",key:"lw1j43"}],["path",{d:"M15 10H9",key:"o6yqo3"}],["path",{d:"M17 3a2 2 0 0 1 2 2v15a1 1 0 0 1-1.496.868l-4.512-2.578a2 2 0 0 0-1.984 0l-4.512 2.578A1 1 0 0 1 5 20V5a2 2 0 0 1 2-2z",key:"oz39mx"}]],ge=z("bookmark-plus",fe);const be=[["rect",{width:"12",height:"12",x:"2",y:"10",rx:"2",ry:"2",key:"6agr2n"}],["path",{d:"m17.92 14 3.5-3.5a2.24 2.24 0 0 0 0-3l-5-4.92a2.24 2.24 0 0 0-3 0L10 6",key:"1o487t"}],["path",{d:"M6 18h.01",key:"uhywen"}],["path",{d:"M10 14h.01",key:"ssrbsk"}],["path",{d:"M15 6h.01",key:"cblpky"}],["path",{d:"M18 9h.01",key:"2061c0"}]],ve=z("dices",be);const ke=[["path",{d:"M15 21v-5a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v5",key:"slp6dd"}],["path",{d:"M17.774 10.31a1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.451 0 1.12 1.12 0 0 0-1.548 0 2.5 2.5 0 0 1-3.452 0 1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.77-3.248l2.889-4.184A2 2 0 0 1 7 2h10a2 2 0 0 1 1.653.873l2.895 4.192a2.5 2.5 0 0 1-3.774 3.244",key:"o0xfot"}],["path",{d:"M4 10.95V19a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8.05",key:"wn3emo"}]],je=z("store",ke),ye=[{value:"coder"},{value:"reviewer"},{value:"tester"},{value:"sentinel"},{value:"custom",dashed:!0}],I=t=>`role.${t}`,S=({children:t})=>e.jsx("span",{className:"text-sm font-medium text-sec",children:t}),Ne=({active:t,spec:a,onSelect:n})=>{const{t:s}=j();return e.jsxs("button",{type:"button",onClick:n,"aria-pressed":t,"data-testid":`role-card-${a.value}`,className:`selectable-card${a.dashed?" selectable-card--dashed":""} flex items-center gap-3 px-3 py-2`,children:[e.jsx(ee,{role:a.value,size:20}),e.jsx("span",{className:"flex-1 text-left text-base font-medium text-pri",children:s(I(a.value))}),t?e.jsx(L,{size:14,className:"shrink-0 text-accent","aria-hidden":!0}):null]})},Ce=({onRoleChange:t,workerRole:a})=>{const{t:n}=j();return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(S,{children:n("addWorker.role")}),e.jsx("div",{className:"grid grid-cols-2 gap-2",children:ye.map(s=>e.jsx(Ne,{active:a===s.value,spec:s,onSelect:()=>t(s.value)},s.value))})]})},we=({customTemplates:t,disabledReason:a,onDeleteTemplate:n,onSelect:s,selectedTemplateId:c})=>{const{t:o}=j(),[g,x]=d.useState(!1),[m,u]=d.useState(""),[b,k]=d.useState(null),y=d.useRef(null),N=d.useMemo(()=>t.find(r=>r.id===c)??null,[t,c]),v=d.useMemo(()=>{const r=m.trim().toLowerCase();return r?t.filter(p=>p.name.toLowerCase().includes(r)||p.description.toLowerCase().includes(r)):t},[t,m]);return d.useEffect(()=>{if(!g)return;const r=h=>{h.key==="Escape"&&x(!1)},p=h=>{const l=y.current;l&&!l.contains(h.target)&&x(!1)};return document.addEventListener("keydown",r),document.addEventListener("pointerdown",p),()=>{document.removeEventListener("keydown",r),document.removeEventListener("pointerdown",p)}},[g]),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(S,{children:o("addWorker.template")}),e.jsxs("div",{ref:y,className:"relative",children:[e.jsxs("button",{type:"button","aria-haspopup":"listbox","aria-expanded":g,"data-testid":"role-template-picker-trigger",onClick:()=>x(r=>!r),className:"flex w-full items-center justify-between gap-2 rounded border px-3 py-2 text-left text-sm transition-colors hover:bg-3",style:{borderColor:"var(--border)",background:"var(--bg-1)"},children:[e.jsx("span",{className:"min-w-0 flex-1 truncate text-pri",children:N?N.name:o("addWorker.templatePickPlaceholder")}),e.jsx(M,{size:14,className:"shrink-0 text-ter","aria-hidden":!0})]}),g?e.jsxs("div",{role:"listbox","aria-label":o("addWorker.template"),"data-testid":"role-template-picker-menu",className:"elev-2 absolute left-0 right-0 top-full z-30 mt-1 flex max-h-72 flex-col overflow-hidden rounded border",style:{background:"var(--bg-elevated)",borderColor:"var(--border-bright)"},children:[e.jsxs("div",{className:"flex items-center gap-2 border-b px-2 py-1.5",style:{borderColor:"var(--border)"},children:[e.jsx(pe,{size:14,className:"text-ter","aria-hidden":!0}),e.jsx("input",{value:m,onChange:r=>u(r.currentTarget.value),placeholder:o("addWorker.templateSearchPlaceholder"),"data-testid":"role-template-search-input",className:"w-full bg-transparent text-sm text-pri outline-none placeholder:text-ter",spellCheck:!1})]}),e.jsx("div",{className:"flex-1 overflow-y-auto py-1",children:t.length===0?e.jsx("div",{"data-testid":"role-template-empty-state",className:"px-3 py-3 text-center text-sm text-ter",children:o("addWorker.templateEmpty")}):v.length===0?e.jsx("div",{className:"px-3 py-3 text-center text-sm text-ter",children:o("addWorker.templateNoMatch")}):v.map(r=>{const p=r.id===c;return e.jsxs("div",{className:"relative",children:[e.jsxs("button",{type:"button",role:"option","aria-selected":p,"data-testid":`role-template-option-${r.id}`,onClick:()=>{s(r.id),x(!1),u("")},className:"flex w-full items-center gap-2 px-3 py-1.5 pr-9 text-left text-sm text-pri hover:bg-3",style:p?{background:"var(--bg-3)"}:void 0,children:[e.jsx("span",{className:"min-w-0 flex-1 truncate",children:r.name}),p?e.jsx(L,{size:14,className:"shrink-0 text-accent","aria-hidden":!0}):null]}),e.jsx("button",{type:"button","aria-label":o("addWorker.templateDeleteAria",{name:r.name}),"data-testid":`role-template-delete-${r.id}`,disabled:!!a,title:a??void 0,onClick:h=>{h.preventDefault(),h.stopPropagation(),!a&&k(r)},className:"absolute right-1 top-1/2 flex h-6 w-6 -translate-y-1/2 items-center justify-center rounded text-ter transition-colors hover:bg-3 hover:text-pri",children:e.jsx(U,{size:14,"aria-hidden":!0})})]},r.id)})}),c!==null?e.jsx("button",{type:"button","data-testid":"role-template-clear",onClick:()=>{s(null),x(!1),u("")},className:"border-t px-3 py-1.5 text-left text-sm text-ter transition-colors hover:bg-3 hover:text-pri",style:{borderColor:"var(--border)"},children:o("addWorker.templateClear")}):null]}):null]}),e.jsx(Y,{open:b!==null,onOpenChange:r=>{r||k(null)},title:o("addWorker.templateDeleteTitle"),description:b?o("addWorker.templateDeleteConfirm",{name:b.name}):"",confirmLabel:o("addWorker.templateDeleteConfirmLabel"),confirmKind:"danger",onConfirm:()=>{if(!b||a)return;const r=b.id;k(null),n(r)}})]})},We=({canSaveAsTemplate:t,modified:a,onChange:n,onReset:s,onSaveAsTemplate:c,roleDescription:o,templateBusy:g,workerRole:x,writeDisabledReason:m})=>{const{t:u,language:b}=j(),[k,y]=d.useState(!1),[N,v]=d.useState(!1),[r,p]=d.useState("");d.useEffect(()=>{(x==="custom"||a)&&y(!0)},[a,x]),d.useEffect(()=>{t||(v(!1),p(""))},[t]);const h=b==="zh"?"点击展开":"Click to expand";return e.jsxs("details",{open:k,onToggle:l=>y(l.currentTarget.open),className:"group flex flex-col gap-2",children:[e.jsxs("summary",{className:"flex cursor-pointer select-none items-center justify-between gap-2 list-none rounded-lg p-2 -mx-2 hover:bg-3/50 transition-colors group/summary",children:[e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"flex h-5 w-5 items-center justify-center rounded bg-3 border border-bright/30 text-ter transition-colors group-hover/summary:text-pri group-hover/summary:border-accent/40",children:e.jsx(M,{size:12,"aria-hidden":!0,className:"-rotate-90 transition-transform duration-150 group-open:rotate-0"})}),e.jsx("span",{className:"text-sm font-semibold text-pri transition-colors group-hover/summary:text-accent",children:u("addWorker.roleInstructions")}),a?e.jsxs("span",{className:"text-xs text-ter",children:["· ",u("addWorker.modifiedFrom",{role:u(I(x))})]}):null]}),e.jsxs("div",{className:"flex items-center gap-2",children:[k?null:e.jsx("span",{className:"text-[10px] text-ter font-semibold tracking-wider uppercase opacity-60 group-hover/summary:opacity-100 group-hover/summary:text-accent transition-all pr-1",children:h}),t&&!N?e.jsxs("button",{type:"button","data-testid":"role-template-save",disabled:!!m,title:m??void 0,onClick:l=>{l.preventDefault(),l.stopPropagation(),v(!0)},className:"flex items-center gap-1 rounded px-2 py-0.5 text-xs font-medium transition-colors hover:opacity-80 disabled:cursor-not-allowed disabled:opacity-50",style:{color:"var(--accent)",background:"color-mix(in oklab, var(--accent) 14%, transparent)"},children:[e.jsx(ge,{size:12,"aria-hidden":!0}),u("addWorker.saveAsTemplate")]}):null,a?e.jsxs("button",{type:"button",className:"flex items-center gap-1 rounded px-1.5 py-0.5 text-xs text-ter transition-colors hover:bg-3 hover:text-sec",onClick:l=>{l.preventDefault(),l.stopPropagation(),s()},children:[e.jsx(Z,{size:12,"aria-hidden":!0}),u("addWorker.reset")]}):null]})]}),e.jsx("textarea",{"aria-label":"Role instructions",id:"add-worker-role-instructions",value:o,rows:5,onChange:l=>n(l.currentTarget.value),placeholder:x==="custom"?u("addWorker.customPlaceholder"):void 0,title:u("addWorker.roleInstructionsTitle"),className:"input mono resize-y text-sm",style:{minHeight:150},"data-testid":"role-instructions-textarea"}),t&&N?e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{autoFocus:!0,value:r,onChange:l=>p(l.currentTarget.value),placeholder:u("addWorker.templateNamePlaceholder"),"data-testid":"role-template-save-name",className:"input flex-1 text-sm"}),e.jsx("button",{type:"button",disabled:g||!r.trim()||!!m,title:m??void 0,"data-testid":"role-template-save-confirm",onClick:async()=>{if(m)return;const l=r.trim();if(l)try{await c(l),v(!1),p("")}catch{}},className:"icon-btn icon-btn--primary text-xs",children:u("addWorker.templateSaveConfirm")}),e.jsx("button",{type:"button","data-testid":"role-template-save-cancel",onClick:()=>{v(!1),p("")},className:"icon-btn text-xs",children:u("common.cancel")})]}):null]})},D=({active:t,command:a,displayName:n,logoPresetId:s,notFound:c=!1,testId:o,onSelect:g})=>{const{t:x}=j(),m=e.jsx("span",{className:"inline-flex h-5 w-5 shrink-0 items-center justify-center rounded border border-border bg-surface-1 text-ter","data-testid":`${o}-generic-icon`,"aria-hidden":!0,children:e.jsx(he,{size:13})});return e.jsxs("button",{type:"button",onClick:g,"aria-pressed":t,"data-testid":o,className:"selectable-card flex items-center justify-between gap-3 px-3 py-2",children:[e.jsxs("span",{className:"flex min-w-0 items-center gap-3",children:[e.jsx(te,{commandPresetId:s,fallback:m,size:22}),e.jsxs("span",{className:"flex min-w-0 flex-col items-start gap-0.5",children:[e.jsx("span",{className:"truncate text-base font-medium text-pri",children:n}),e.jsxs("span",{className:"mono truncate text-xs text-ter",children:[a,c?` · ${x("addWorker.agentNotFound")}`:""]})]})]}),t?e.jsx(L,{size:14,className:"shrink-0 text-accent","aria-hidden":!0}):null]})},Se=({active:t,preset:a,onSelect:n})=>e.jsx(D,{active:t,command:a.command,displayName:a.displayName,logoPresetId:a.id,notFound:a.available===!1,testId:`agent-radio-${a.id}`,onSelect:n}),ze=({commandPresetId:t,commandPresets:a,onPresetChange:n})=>{const{t:s}=j();return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(S,{children:s("addWorker.agentCli")}),a.length===0?e.jsx("div",{className:"text-sm text-ter",children:s("addWorker.loadingPresets")}):e.jsxs("div",{className:"grid grid-cols-2 gap-2 max-md:grid-cols-1",children:[a.map(c=>e.jsx(Se,{active:t===c.id,preset:c,onSelect:()=>n(c.id)},c.id)),e.jsx(D,{active:t==="",command:s("addWorker.genericCommand"),displayName:s("addWorker.genericAgent"),testId:"agent-radio-generic",onSelect:()=>n("")})]})]})},Me=({onChange:t,value:a})=>{const{t:n,language:s}=j(),[c,o]=d.useState(!1),g=a.trim(),x=s==="zh"?"点击展开":"Click to expand";return e.jsxs("details",{onToggle:m=>o(m.currentTarget.open),className:"group flex flex-col gap-2",children:[e.jsxs("summary",{className:"flex cursor-pointer select-none items-center justify-between gap-2 list-none rounded-lg p-2 -mx-2 hover:bg-3/50 transition-colors group/summary",children:[e.jsxs("span",{className:"flex min-w-0 items-center gap-2",children:[e.jsx("span",{className:"flex h-5 w-5 shrink-0 items-center justify-center rounded bg-3 border border-bright/30 text-ter transition-colors group-hover/summary:text-pri group-hover/summary:border-accent/40",children:e.jsx(M,{size:12,"aria-hidden":!0,className:"-rotate-90 transition-transform duration-150 group-open:rotate-0"})}),e.jsx("span",{className:"text-sm font-semibold text-pri transition-colors group-hover/summary:text-accent",children:n("addWorker.startupCommand")}),g?e.jsxs("span",{className:"truncate text-xs text-ter",children:["· ",n("addWorker.startupOverrides")]}):null]}),c?null:e.jsx("span",{className:"text-[10px] text-ter font-semibold tracking-wider uppercase opacity-60 group-hover/summary:opacity-100 group-hover/summary:text-accent transition-all pr-1",children:x})]}),e.jsxs("div",{className:"flex flex-col gap-2 rounded border bg-2 p-3",style:{borderColor:"var(--border)"},children:[e.jsx("input",{"aria-label":"Startup command",value:a,onChange:m=>t(m.currentTarget.value),placeholder:"qwen --model qwen3-coder",className:"input mono text-sm",spellCheck:!1}),e.jsx("p",{className:"text-sm leading-5 text-ter",children:n("addWorker.startupHelp",{example:"claude --resume <session-id>"})})]})]})},Le=d.lazy(()=>ue(()=>import("./MarketplaceDrawer-Dm-Z-YL8.js"),__vite__mapDeps([0,1,2,3])).then(t=>({default:t.MarketplaceDrawer}))),_e=({commandPresets:t,commandPresetId:a,creating:n=!1,customTemplates:s,onApplyMarketplaceImport:c,onClose:o,onDeleteTemplate:g,onNameChange:x,onPresetChange:m,onRandomName:u,onRoleDescriptionChange:b,onRoleDescriptionReset:k,onRoleChange:y,onSaveAsTemplate:N,onStartupCommandChange:v,onSubmit:r,onTemplateChange:p,roleDescription:h,roleDescriptionDefault:l,selectedTemplateId:P,startupCommand:E,templateBusy:B,workerName:O,workerRole:W,writeDisabledReason:w})=>{const{t:i}=j(),_=ae(),C=re(),[q,A]=d.useState(!1),[H,K]=d.useState(!1),V=d.useMemo(()=>new Set(s.map(f=>f.name)),[s]),Q=f=>{c(f),_.show({kind:"success",message:i("marketplace.imported",{name:f.name})})},J=f=>{f||o()},X=h!==l,$=t.find(f=>f.id===a),T=E.trim(),G=()=>w||(O.trim()?!a&&!T?i("addWorker.pickCliOrStartup"):$?.available===!1&&!T?i("addWorker.unavailable",{name:$.displayName}):h.trim()?null:i("addWorker.emptyInstructions"):i("addWorker.enterName")),R=f=>{const F=G();if(F){f.preventDefault(),_.show({kind:"warning",message:F});return}r(f)};return e.jsxs(se,{open:!0,onOpenChange:J,children:[e.jsxs(ne,{children:[e.jsx(oe,{"data-testid":"add-worker-overlay",className:"app-overlay fixed inset-0 z-40"}),e.jsx("div",{className:"pointer-events-none fixed inset-0 z-50 grid place-items-center p-4 max-md:items-end max-md:p-0",children:e.jsx(le,{"data-testid":"add-worker-content","data-mobile":C||void 0,className:`${C?"dialog-slide-up add-worker-sheet":"dialog-scale-pop"} elev-2 pointer-events-auto flex max-h-[calc(100vh-32px)] w-[560px] max-w-full flex-col overflow-hidden rounded-lg border pointer-coarse:max-h-[85dvh] max-md:w-full max-md:rounded-b-none max-md:rounded-t-xl`,style:{background:"var(--bg-elevated)",borderColor:"var(--border-bright)",...C?{height:"85dvh"}:{}},children:e.jsxs("form",{onSubmit:R,"aria-label":i("addWorker.title"),className:"flex min-h-0 flex-1 flex-col overflow-hidden max-h-full",children:[e.jsxs("div",{className:"flex shrink-0 items-start justify-between gap-3 border-b px-5 py-4 max-md:px-4",style:{borderColor:"var(--border)"},children:[e.jsxs("div",{className:"flex min-w-0 flex-col gap-0.5",children:[e.jsx(ie,{className:"text-lg font-semibold text-pri",children:i("addWorker.title")}),e.jsx(de,{className:"text-sm text-ter",children:i("addWorker.description",{command:"team send"})})]}),C?e.jsx(ce,{asChild:!0,children:e.jsx("button",{type:"button","aria-label":i("common.closeDialog"),"data-testid":"add-worker-close",className:"-mr-1 flex h-10 w-10 shrink-0 items-center justify-center rounded-md text-sec",style:{background:"var(--bg-2)"},children:e.jsx(me,{size:18,"aria-hidden":!0})})}):null]}),e.jsxs("div",{className:"flex flex-1 min-h-0 flex-col gap-4 overflow-y-auto px-5 py-4 max-md:gap-5 max-md:px-4",children:[e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(S,{children:i("addWorker.name")}),e.jsxs("div",{className:"relative flex items-center",children:[e.jsx("input",{autoFocus:!C,value:O,onChange:f=>x(f.target.value),placeholder:i("addWorker.namePlaceholder"),className:"input w-full pr-24",style:{borderRadius:"10px"}}),e.jsx("div",{className:"absolute right-1.5 top-1/2 -translate-y-1/2",children:e.jsx(xe,{label:i("addWorker.randomTooltip"),children:e.jsxs("button",{type:"button","aria-label":i("addWorker.randomAria"),className:"flex h-7 items-center gap-1.5 rounded-lg border border-bright/10 bg-3 px-2.5 text-xs font-semibold text-sec hover:text-pri hover:bg-4 active:scale-95 transition-all outline-none",onClick:u,"data-testid":"random-worker-name",children:[e.jsx(ve,{size:13,"aria-hidden":!0}),e.jsx("span",{children:i("addWorker.random")})]})})})]})]}),e.jsx(Ce,{workerRole:W,onRoleChange:y}),e.jsxs("button",{type:"button",onClick:()=>{K(!0),A(!0)},"data-testid":"open-marketplace",className:"marketplace-browse-btn flex cursor-pointer items-center gap-2 self-start rounded-lg border px-3 py-2 text-xs font-semibold text-sec outline-none transition-all duration-200 hover:text-pri hover:-translate-y-0.5 active:scale-98 shadow-sm hover:shadow-md",style:{background:"linear-gradient(to bottom, var(--bg-1), var(--bg-0))",borderColor:"var(--border-bright)","--tw-ring-color":"color-mix(in oklab, var(--accent) 45%, transparent)"},children:[e.jsx(je,{size:14,"aria-hidden":!0,className:"text-accent"}),e.jsx("span",{children:i("marketplace.openFromAddWorker")})]}),W==="custom"?e.jsx(we,{customTemplates:s,disabledReason:w,onDeleteTemplate:g,onSelect:p,selectedTemplateId:P}):null,e.jsx(We,{canSaveAsTemplate:W==="custom"&&!P&&h.trim().length>0,modified:X,onChange:b,onReset:k,onSaveAsTemplate:N,roleDescription:h,templateBusy:B,workerRole:W,writeDisabledReason:w}),e.jsx(ze,{commandPresetId:a,commandPresets:t,onPresetChange:m}),e.jsx(Me,{value:E,onChange:v})]}),e.jsxs("div",{className:"flex shrink-0 items-center justify-end gap-2 border-t px-5 py-3 max-md:px-4 max-md:pb-[max(12px,env(safe-area-inset-bottom))]",style:{borderColor:"var(--border)",background:"var(--bg-2)"},children:[e.jsx("button",{type:"button",onClick:o,className:`icon-btn border border-bright/20 rounded-lg hover:bg-3 hover:text-pri transition-all active:scale-95 ${C?"flex-1":""}`,"data-testid":"add-worker-cancel",children:i("addWorker.cancel")}),e.jsx("button",{type:"submit",disabled:n||!!w,title:w??void 0,className:`icon-btn icon-btn--primary rounded-lg font-bold shadow-md hover:shadow-lg transition-all active:scale-[0.97] hover:-translate-y-0.5 ${C?"flex-[2]":""}`,"data-testid":"add-worker-submit",children:i(n?"addWorker.creating":"addWorker.create")})]})]})})})]}),H?e.jsx(d.Suspense,{fallback:null,children:e.jsx(Le,{open:q,onClose:()=>A(!1),onImport:Q,importedNames:V})}):null]})};export{_e as AddWorkerDialog};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/MarketplaceDrawer-C1MjJMok.js","assets/index-XUIK5lOA.js","assets/index-DYIPzuPD.css","assets/search-DFKWO_9l.js"])))=>i.map(i=>d[i]);
2
+ import{c as z,j as e,u as j,r as d,C as M,x as L,t as U,J as Y,Q as Z,ag as ee,ah as te,e as ae,i as re,R as se,P as ne,O as oe,k as le,m as ie,a0 as de,z as ce,X as me,T as xe,ai as ue}from"./index-XUIK5lOA.js";import{S as pe}from"./search-DFKWO_9l.js";import{S as he}from"./square-terminal-D54LkZqa.js";const fe=[["path",{d:"M12 7v6",key:"lw1j43"}],["path",{d:"M15 10H9",key:"o6yqo3"}],["path",{d:"M17 3a2 2 0 0 1 2 2v15a1 1 0 0 1-1.496.868l-4.512-2.578a2 2 0 0 0-1.984 0l-4.512 2.578A1 1 0 0 1 5 20V5a2 2 0 0 1 2-2z",key:"oz39mx"}]],ge=z("bookmark-plus",fe);const be=[["rect",{width:"12",height:"12",x:"2",y:"10",rx:"2",ry:"2",key:"6agr2n"}],["path",{d:"m17.92 14 3.5-3.5a2.24 2.24 0 0 0 0-3l-5-4.92a2.24 2.24 0 0 0-3 0L10 6",key:"1o487t"}],["path",{d:"M6 18h.01",key:"uhywen"}],["path",{d:"M10 14h.01",key:"ssrbsk"}],["path",{d:"M15 6h.01",key:"cblpky"}],["path",{d:"M18 9h.01",key:"2061c0"}]],ve=z("dices",be);const ke=[["path",{d:"M15 21v-5a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v5",key:"slp6dd"}],["path",{d:"M17.774 10.31a1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.451 0 1.12 1.12 0 0 0-1.548 0 2.5 2.5 0 0 1-3.452 0 1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.77-3.248l2.889-4.184A2 2 0 0 1 7 2h10a2 2 0 0 1 1.653.873l2.895 4.192a2.5 2.5 0 0 1-3.774 3.244",key:"o0xfot"}],["path",{d:"M4 10.95V19a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8.05",key:"wn3emo"}]],je=z("store",ke),ye=[{value:"coder"},{value:"reviewer"},{value:"tester"},{value:"sentinel"},{value:"custom",dashed:!0}],I=t=>`role.${t}`,S=({children:t})=>e.jsx("span",{className:"text-sm font-medium text-sec",children:t}),Ne=({active:t,spec:a,onSelect:n})=>{const{t:s}=j();return e.jsxs("button",{type:"button",onClick:n,"aria-pressed":t,"data-testid":`role-card-${a.value}`,className:`selectable-card${a.dashed?" selectable-card--dashed":""} flex items-center gap-3 px-3 py-2`,children:[e.jsx(ee,{role:a.value,size:20}),e.jsx("span",{className:"flex-1 text-left text-base font-medium text-pri",children:s(I(a.value))}),t?e.jsx(L,{size:14,className:"shrink-0 text-accent","aria-hidden":!0}):null]})},Ce=({onRoleChange:t,workerRole:a})=>{const{t:n}=j();return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(S,{children:n("addWorker.role")}),e.jsx("div",{className:"grid grid-cols-2 gap-2",children:ye.map(s=>e.jsx(Ne,{active:a===s.value,spec:s,onSelect:()=>t(s.value)},s.value))})]})},we=({customTemplates:t,disabledReason:a,onDeleteTemplate:n,onSelect:s,selectedTemplateId:c})=>{const{t:o}=j(),[g,x]=d.useState(!1),[m,u]=d.useState(""),[b,k]=d.useState(null),y=d.useRef(null),N=d.useMemo(()=>t.find(r=>r.id===c)??null,[t,c]),v=d.useMemo(()=>{const r=m.trim().toLowerCase();return r?t.filter(p=>p.name.toLowerCase().includes(r)||p.description.toLowerCase().includes(r)):t},[t,m]);return d.useEffect(()=>{if(!g)return;const r=h=>{h.key==="Escape"&&x(!1)},p=h=>{const l=y.current;l&&!l.contains(h.target)&&x(!1)};return document.addEventListener("keydown",r),document.addEventListener("pointerdown",p),()=>{document.removeEventListener("keydown",r),document.removeEventListener("pointerdown",p)}},[g]),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(S,{children:o("addWorker.template")}),e.jsxs("div",{ref:y,className:"relative",children:[e.jsxs("button",{type:"button","aria-haspopup":"listbox","aria-expanded":g,"data-testid":"role-template-picker-trigger",onClick:()=>x(r=>!r),className:"flex w-full items-center justify-between gap-2 rounded border px-3 py-2 text-left text-sm transition-colors hover:bg-3",style:{borderColor:"var(--border)",background:"var(--bg-1)"},children:[e.jsx("span",{className:"min-w-0 flex-1 truncate text-pri",children:N?N.name:o("addWorker.templatePickPlaceholder")}),e.jsx(M,{size:14,className:"shrink-0 text-ter","aria-hidden":!0})]}),g?e.jsxs("div",{role:"listbox","aria-label":o("addWorker.template"),"data-testid":"role-template-picker-menu",className:"elev-2 absolute left-0 right-0 top-full z-30 mt-1 flex max-h-72 flex-col overflow-hidden rounded border",style:{background:"var(--bg-elevated)",borderColor:"var(--border-bright)"},children:[e.jsxs("div",{className:"flex items-center gap-2 border-b px-2 py-1.5",style:{borderColor:"var(--border)"},children:[e.jsx(pe,{size:14,className:"text-ter","aria-hidden":!0}),e.jsx("input",{value:m,onChange:r=>u(r.currentTarget.value),placeholder:o("addWorker.templateSearchPlaceholder"),"data-testid":"role-template-search-input",className:"w-full bg-transparent text-sm text-pri outline-none placeholder:text-ter",spellCheck:!1})]}),e.jsx("div",{className:"flex-1 overflow-y-auto py-1",children:t.length===0?e.jsx("div",{"data-testid":"role-template-empty-state",className:"px-3 py-3 text-center text-sm text-ter",children:o("addWorker.templateEmpty")}):v.length===0?e.jsx("div",{className:"px-3 py-3 text-center text-sm text-ter",children:o("addWorker.templateNoMatch")}):v.map(r=>{const p=r.id===c;return e.jsxs("div",{className:"relative",children:[e.jsxs("button",{type:"button",role:"option","aria-selected":p,"data-testid":`role-template-option-${r.id}`,onClick:()=>{s(r.id),x(!1),u("")},className:"flex w-full items-center gap-2 px-3 py-1.5 pr-9 text-left text-sm text-pri hover:bg-3",style:p?{background:"var(--bg-3)"}:void 0,children:[e.jsx("span",{className:"min-w-0 flex-1 truncate",children:r.name}),p?e.jsx(L,{size:14,className:"shrink-0 text-accent","aria-hidden":!0}):null]}),e.jsx("button",{type:"button","aria-label":o("addWorker.templateDeleteAria",{name:r.name}),"data-testid":`role-template-delete-${r.id}`,disabled:!!a,title:a??void 0,onClick:h=>{h.preventDefault(),h.stopPropagation(),!a&&k(r)},className:"absolute right-1 top-1/2 flex h-6 w-6 -translate-y-1/2 items-center justify-center rounded text-ter transition-colors hover:bg-3 hover:text-pri",children:e.jsx(U,{size:14,"aria-hidden":!0})})]},r.id)})}),c!==null?e.jsx("button",{type:"button","data-testid":"role-template-clear",onClick:()=>{s(null),x(!1),u("")},className:"border-t px-3 py-1.5 text-left text-sm text-ter transition-colors hover:bg-3 hover:text-pri",style:{borderColor:"var(--border)"},children:o("addWorker.templateClear")}):null]}):null]}),e.jsx(Y,{open:b!==null,onOpenChange:r=>{r||k(null)},title:o("addWorker.templateDeleteTitle"),description:b?o("addWorker.templateDeleteConfirm",{name:b.name}):"",confirmLabel:o("addWorker.templateDeleteConfirmLabel"),confirmKind:"danger",onConfirm:()=>{if(!b||a)return;const r=b.id;k(null),n(r)}})]})},We=({canSaveAsTemplate:t,modified:a,onChange:n,onReset:s,onSaveAsTemplate:c,roleDescription:o,templateBusy:g,workerRole:x,writeDisabledReason:m})=>{const{t:u,language:b}=j(),[k,y]=d.useState(!1),[N,v]=d.useState(!1),[r,p]=d.useState("");d.useEffect(()=>{(x==="custom"||a)&&y(!0)},[a,x]),d.useEffect(()=>{t||(v(!1),p(""))},[t]);const h=b==="zh"?"点击展开":"Click to expand";return e.jsxs("details",{open:k,onToggle:l=>y(l.currentTarget.open),className:"group flex flex-col gap-2",children:[e.jsxs("summary",{className:"flex cursor-pointer select-none items-center justify-between gap-2 list-none rounded-lg p-2 -mx-2 hover:bg-3/50 transition-colors group/summary",children:[e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"flex h-5 w-5 items-center justify-center rounded bg-3 border border-bright/30 text-ter transition-colors group-hover/summary:text-pri group-hover/summary:border-accent/40",children:e.jsx(M,{size:12,"aria-hidden":!0,className:"-rotate-90 transition-transform duration-150 group-open:rotate-0"})}),e.jsx("span",{className:"text-sm font-semibold text-pri transition-colors group-hover/summary:text-accent",children:u("addWorker.roleInstructions")}),a?e.jsxs("span",{className:"text-xs text-ter",children:["· ",u("addWorker.modifiedFrom",{role:u(I(x))})]}):null]}),e.jsxs("div",{className:"flex items-center gap-2",children:[k?null:e.jsx("span",{className:"text-[10px] text-ter font-semibold tracking-wider uppercase opacity-60 group-hover/summary:opacity-100 group-hover/summary:text-accent transition-all pr-1",children:h}),t&&!N?e.jsxs("button",{type:"button","data-testid":"role-template-save",disabled:!!m,title:m??void 0,onClick:l=>{l.preventDefault(),l.stopPropagation(),v(!0)},className:"flex items-center gap-1 rounded px-2 py-0.5 text-xs font-medium transition-colors hover:opacity-80 disabled:cursor-not-allowed disabled:opacity-50",style:{color:"var(--accent)",background:"color-mix(in oklab, var(--accent) 14%, transparent)"},children:[e.jsx(ge,{size:12,"aria-hidden":!0}),u("addWorker.saveAsTemplate")]}):null,a?e.jsxs("button",{type:"button",className:"flex items-center gap-1 rounded px-1.5 py-0.5 text-xs text-ter transition-colors hover:bg-3 hover:text-sec",onClick:l=>{l.preventDefault(),l.stopPropagation(),s()},children:[e.jsx(Z,{size:12,"aria-hidden":!0}),u("addWorker.reset")]}):null]})]}),e.jsx("textarea",{"aria-label":"Role instructions",id:"add-worker-role-instructions",value:o,rows:5,onChange:l=>n(l.currentTarget.value),placeholder:x==="custom"?u("addWorker.customPlaceholder"):void 0,title:u("addWorker.roleInstructionsTitle"),className:"input mono resize-y text-sm",style:{minHeight:150},"data-testid":"role-instructions-textarea"}),t&&N?e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{autoFocus:!0,value:r,onChange:l=>p(l.currentTarget.value),placeholder:u("addWorker.templateNamePlaceholder"),"data-testid":"role-template-save-name",className:"input flex-1 text-sm"}),e.jsx("button",{type:"button",disabled:g||!r.trim()||!!m,title:m??void 0,"data-testid":"role-template-save-confirm",onClick:async()=>{if(m)return;const l=r.trim();if(l)try{await c(l),v(!1),p("")}catch{}},className:"icon-btn icon-btn--primary text-xs",children:u("addWorker.templateSaveConfirm")}),e.jsx("button",{type:"button","data-testid":"role-template-save-cancel",onClick:()=>{v(!1),p("")},className:"icon-btn text-xs",children:u("common.cancel")})]}):null]})},D=({active:t,command:a,displayName:n,logoPresetId:s,notFound:c=!1,testId:o,onSelect:g})=>{const{t:x}=j(),m=e.jsx("span",{className:"inline-flex h-5 w-5 shrink-0 items-center justify-center rounded border border-border bg-surface-1 text-ter","data-testid":`${o}-generic-icon`,"aria-hidden":!0,children:e.jsx(he,{size:13})});return e.jsxs("button",{type:"button",onClick:g,"aria-pressed":t,"data-testid":o,className:"selectable-card flex items-center justify-between gap-3 px-3 py-2",children:[e.jsxs("span",{className:"flex min-w-0 items-center gap-3",children:[e.jsx(te,{commandPresetId:s,fallback:m,size:22}),e.jsxs("span",{className:"flex min-w-0 flex-col items-start gap-0.5",children:[e.jsx("span",{className:"truncate text-base font-medium text-pri",children:n}),e.jsxs("span",{className:"mono truncate text-xs text-ter",children:[a,c?` · ${x("addWorker.agentNotFound")}`:""]})]})]}),t?e.jsx(L,{size:14,className:"shrink-0 text-accent","aria-hidden":!0}):null]})},Se=({active:t,preset:a,onSelect:n})=>e.jsx(D,{active:t,command:a.command,displayName:a.displayName,logoPresetId:a.id,notFound:a.available===!1,testId:`agent-radio-${a.id}`,onSelect:n}),ze=({commandPresetId:t,commandPresets:a,onPresetChange:n})=>{const{t:s}=j();return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(S,{children:s("addWorker.agentCli")}),a.length===0?e.jsx("div",{className:"text-sm text-ter",children:s("addWorker.loadingPresets")}):e.jsxs("div",{className:"grid grid-cols-2 gap-2 max-md:grid-cols-1",children:[a.map(c=>e.jsx(Se,{active:t===c.id,preset:c,onSelect:()=>n(c.id)},c.id)),e.jsx(D,{active:t==="",command:s("addWorker.genericCommand"),displayName:s("addWorker.genericAgent"),testId:"agent-radio-generic",onSelect:()=>n("")})]})]})},Me=({onChange:t,value:a})=>{const{t:n,language:s}=j(),[c,o]=d.useState(!1),g=a.trim(),x=s==="zh"?"点击展开":"Click to expand";return e.jsxs("details",{onToggle:m=>o(m.currentTarget.open),className:"group flex flex-col gap-2",children:[e.jsxs("summary",{className:"flex cursor-pointer select-none items-center justify-between gap-2 list-none rounded-lg p-2 -mx-2 hover:bg-3/50 transition-colors group/summary",children:[e.jsxs("span",{className:"flex min-w-0 items-center gap-2",children:[e.jsx("span",{className:"flex h-5 w-5 shrink-0 items-center justify-center rounded bg-3 border border-bright/30 text-ter transition-colors group-hover/summary:text-pri group-hover/summary:border-accent/40",children:e.jsx(M,{size:12,"aria-hidden":!0,className:"-rotate-90 transition-transform duration-150 group-open:rotate-0"})}),e.jsx("span",{className:"text-sm font-semibold text-pri transition-colors group-hover/summary:text-accent",children:n("addWorker.startupCommand")}),g?e.jsxs("span",{className:"truncate text-xs text-ter",children:["· ",n("addWorker.startupOverrides")]}):null]}),c?null:e.jsx("span",{className:"text-[10px] text-ter font-semibold tracking-wider uppercase opacity-60 group-hover/summary:opacity-100 group-hover/summary:text-accent transition-all pr-1",children:x})]}),e.jsxs("div",{className:"flex flex-col gap-2 rounded border bg-2 p-3",style:{borderColor:"var(--border)"},children:[e.jsx("input",{"aria-label":"Startup command",value:a,onChange:m=>t(m.currentTarget.value),placeholder:"qwen --model qwen3-coder",className:"input mono text-sm",spellCheck:!1}),e.jsx("p",{className:"text-sm leading-5 text-ter",children:n("addWorker.startupHelp",{example:"claude --resume <session-id>"})})]})]})},Le=d.lazy(()=>ue(()=>import("./MarketplaceDrawer-C1MjJMok.js"),__vite__mapDeps([0,1,2,3])).then(t=>({default:t.MarketplaceDrawer}))),_e=({commandPresets:t,commandPresetId:a,creating:n=!1,customTemplates:s,onApplyMarketplaceImport:c,onClose:o,onDeleteTemplate:g,onNameChange:x,onPresetChange:m,onRandomName:u,onRoleDescriptionChange:b,onRoleDescriptionReset:k,onRoleChange:y,onSaveAsTemplate:N,onStartupCommandChange:v,onSubmit:r,onTemplateChange:p,roleDescription:h,roleDescriptionDefault:l,selectedTemplateId:P,startupCommand:E,templateBusy:B,workerName:O,workerRole:W,writeDisabledReason:w})=>{const{t:i}=j(),_=ae(),C=re(),[q,A]=d.useState(!1),[H,K]=d.useState(!1),V=d.useMemo(()=>new Set(s.map(f=>f.name)),[s]),Q=f=>{c(f),_.show({kind:"success",message:i("marketplace.imported",{name:f.name})})},J=f=>{f||o()},X=h!==l,$=t.find(f=>f.id===a),T=E.trim(),G=()=>w||(O.trim()?!a&&!T?i("addWorker.pickCliOrStartup"):$?.available===!1&&!T?i("addWorker.unavailable",{name:$.displayName}):h.trim()?null:i("addWorker.emptyInstructions"):i("addWorker.enterName")),R=f=>{const F=G();if(F){f.preventDefault(),_.show({kind:"warning",message:F});return}r(f)};return e.jsxs(se,{open:!0,onOpenChange:J,children:[e.jsxs(ne,{children:[e.jsx(oe,{"data-testid":"add-worker-overlay",className:"app-overlay fixed inset-0 z-40"}),e.jsx("div",{className:"pointer-events-none fixed inset-0 z-50 grid place-items-center p-4 max-md:items-end max-md:p-0",children:e.jsx(le,{"data-testid":"add-worker-content","data-mobile":C||void 0,className:`${C?"dialog-slide-up add-worker-sheet":"dialog-scale-pop"} elev-2 pointer-events-auto flex max-h-[calc(100vh-32px)] w-[560px] max-w-full flex-col overflow-hidden rounded-lg border pointer-coarse:max-h-[85dvh] max-md:w-full max-md:rounded-b-none max-md:rounded-t-xl`,style:{background:"var(--bg-elevated)",borderColor:"var(--border-bright)",...C?{height:"85dvh"}:{}},children:e.jsxs("form",{onSubmit:R,"aria-label":i("addWorker.title"),className:"flex min-h-0 flex-1 flex-col overflow-hidden max-h-full",children:[e.jsxs("div",{className:"flex shrink-0 items-start justify-between gap-3 border-b px-5 py-4 max-md:px-4",style:{borderColor:"var(--border)"},children:[e.jsxs("div",{className:"flex min-w-0 flex-col gap-0.5",children:[e.jsx(ie,{className:"text-lg font-semibold text-pri",children:i("addWorker.title")}),e.jsx(de,{className:"text-sm text-ter",children:i("addWorker.description",{command:"team send"})})]}),C?e.jsx(ce,{asChild:!0,children:e.jsx("button",{type:"button","aria-label":i("common.closeDialog"),"data-testid":"add-worker-close",className:"-mr-1 flex h-10 w-10 shrink-0 items-center justify-center rounded-md text-sec",style:{background:"var(--bg-2)"},children:e.jsx(me,{size:18,"aria-hidden":!0})})}):null]}),e.jsxs("div",{className:"flex flex-1 min-h-0 flex-col gap-4 overflow-y-auto px-5 py-4 max-md:gap-5 max-md:px-4",children:[e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(S,{children:i("addWorker.name")}),e.jsxs("div",{className:"relative flex items-center",children:[e.jsx("input",{autoFocus:!C,value:O,onChange:f=>x(f.target.value),placeholder:i("addWorker.namePlaceholder"),className:"input w-full pr-24",style:{borderRadius:"10px"}}),e.jsx("div",{className:"absolute right-1.5 top-1/2 -translate-y-1/2",children:e.jsx(xe,{label:i("addWorker.randomTooltip"),children:e.jsxs("button",{type:"button","aria-label":i("addWorker.randomAria"),className:"flex h-7 items-center gap-1.5 rounded-lg border border-bright/10 bg-3 px-2.5 text-xs font-semibold text-sec hover:text-pri hover:bg-4 active:scale-95 transition-all outline-none",onClick:u,"data-testid":"random-worker-name",children:[e.jsx(ve,{size:13,"aria-hidden":!0}),e.jsx("span",{children:i("addWorker.random")})]})})})]})]}),e.jsx(Ce,{workerRole:W,onRoleChange:y}),e.jsxs("button",{type:"button",onClick:()=>{K(!0),A(!0)},"data-testid":"open-marketplace",className:"marketplace-browse-btn flex cursor-pointer items-center gap-2 self-start rounded-lg border px-3 py-2 text-xs font-semibold text-sec outline-none transition-all duration-200 hover:text-pri hover:-translate-y-0.5 active:scale-98 shadow-sm hover:shadow-md",style:{background:"linear-gradient(to bottom, var(--bg-1), var(--bg-0))",borderColor:"var(--border-bright)","--tw-ring-color":"color-mix(in oklab, var(--accent) 45%, transparent)"},children:[e.jsx(je,{size:14,"aria-hidden":!0,className:"text-accent"}),e.jsx("span",{children:i("marketplace.openFromAddWorker")})]}),W==="custom"?e.jsx(we,{customTemplates:s,disabledReason:w,onDeleteTemplate:g,onSelect:p,selectedTemplateId:P}):null,e.jsx(We,{canSaveAsTemplate:W==="custom"&&!P&&h.trim().length>0,modified:X,onChange:b,onReset:k,onSaveAsTemplate:N,roleDescription:h,templateBusy:B,workerRole:W,writeDisabledReason:w}),e.jsx(ze,{commandPresetId:a,commandPresets:t,onPresetChange:m}),e.jsx(Me,{value:E,onChange:v})]}),e.jsxs("div",{className:"flex shrink-0 items-center justify-end gap-2 border-t px-5 py-3 max-md:px-4 max-md:pb-[max(12px,env(safe-area-inset-bottom))]",style:{borderColor:"var(--border)",background:"var(--bg-2)"},children:[e.jsx("button",{type:"button",onClick:o,className:`icon-btn border border-bright/20 rounded-lg hover:bg-3 hover:text-pri transition-all active:scale-95 ${C?"flex-1":""}`,"data-testid":"add-worker-cancel",children:i("addWorker.cancel")}),e.jsx("button",{type:"submit",disabled:n||!!w,title:w??void 0,className:`icon-btn icon-btn--primary rounded-lg font-bold shadow-md hover:shadow-lg transition-all active:scale-[0.97] hover:-translate-y-0.5 ${C?"flex-[2]":""}`,"data-testid":"add-worker-submit",children:i(n?"addWorker.creating":"addWorker.create")})]})]})})})]}),H?e.jsx(d.Suspense,{fallback:null,children:e.jsx(Le,{open:q,onClose:()=>A(!1),onImport:Q,importedNames:V})}):null]})};export{_e as AddWorkerDialog};
@@ -0,0 +1 @@
1
+ import{c as A,u as R,r as c,j as e,C as B,x as oe,$ as pe,R as G,P as K,O as X,k as Y,m as J,a0 as se,a1 as Ne,q as Ce,b as F,a2 as _e,a3 as Pe,i as Se,z as Ee,X as ze,a4 as ue,a5 as Re,a6 as $e,a7 as Me}from"./index-XUIK5lOA.js";const De=[["path",{d:"m5 12 7-7 7 7",key:"hav0vg"}],["path",{d:"M12 19V5",key:"x0mq9r"}]],Ie=A("arrow-up",De);const Le=[["path",{d:"M10.7 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v4.1",key:"1bw5m7"}],["path",{d:"m21 21-1.9-1.9",key:"1g2n9r"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}]],Ae=A("folder-search",Le);const Oe=[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}]],Q=A("folder",Oe);const Fe=[["path",{d:"M15 6a9 9 0 0 0-9 9V3",key:"1cii5b"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}]],me=A("git-branch",Fe);const Be=[["path",{d:"M10 16h.01",key:"1bzywj"}],["path",{d:"M2.212 11.577a2 2 0 0 0-.212.896V18a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-5.527a2 2 0 0 0-.212-.896L18.55 5.11A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"18tbho"}],["path",{d:"M21.946 12.013H2.054",key:"zqlbp7"}],["path",{d:"M6 16h.01",key:"1pmjb7"}]],We=A("hard-drive",Be);const Te=[["path",{d:"M10 8h4",key:"1sr2af"}],["path",{d:"M12 21v-9",key:"17s77i"}],["path",{d:"M12 8V3",key:"13r4qs"}],["path",{d:"M17 16h4",key:"h1uq16"}],["path",{d:"M19 12V3",key:"o1uvq1"}],["path",{d:"M19 21v-5",key:"qua636"}],["path",{d:"M3 14h4",key:"bcjad9"}],["path",{d:"M5 10V3",key:"cb8scm"}],["path",{d:"M5 21v-7",key:"1w1uti"}]],ee=A("sliders-vertical",Te),xe=t=>{const s=t.trim();if(s.length<2)return s;const n=s[0],a=s[s.length-1];return(n==='"'||n==="'")&&n===a?s.slice(1,-1):s},qe={claude:"/cli-icons/claude.png",codex:"/cli-icons/codex.png",opencode:"/cli-icons/opencode.svg",gemini:"/cli-icons/gemini.png",hermes:"/cli-icons/hermes.png",qwen:"/cli-icons/qwen.png",pi:"/cli-icons/pi.svg",agy:"/cli-icons/agy.png",cursor:"/cli-icons/cursor.ico",grok:"/cli-icons/grok.ico"},le=({id:t,className:s})=>{const[n,a]=c.useState(!1),r=qe[t];return r&&!n?e.jsx("img",{src:r,alt:"",onError:()=>a(!0),className:`${s} object-contain rounded-xs ${t==="opencode"?"bg-[#ebebeb] p-[1px]":""}`}):e.jsx(pe,{size:14,className:s})},he=({error:t,onChange:s,presets:n,value:a})=>{const{t:r}=R(),[m,i]=c.useState(!1),l=c.useRef(null),f=n.find(x=>x.id===a),o=a==="",d=f?[f.command,...f.args].join(" ").trim():r(o?"workspace.preset.genericPreview":"workspace.preset.loading"),p=f?.displayName??(o?r("workspace.preset.generic"):"Claude Code (CC)"),k=n.length===0&&!o;return c.useEffect(()=>{if(!m)return;const x=h=>{l.current?.contains(h.target)||i(!1)},u=h=>{h.key==="Escape"&&i(!1)};return document.addEventListener("mousedown",x),document.addEventListener("keydown",u),()=>{document.removeEventListener("mousedown",x),document.removeEventListener("keydown",u)}},[m]),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("span",{className:"text-xs font-medium uppercase tracking-wider text-ter",children:r("workspace.preset.label")}),e.jsxs("div",{ref:l,className:"cli-select group relative",children:[e.jsx(le,{id:a,className:"cli-select__leading w-3.5 h-3.5"}),e.jsx("button",{type:"button","aria-haspopup":"listbox","aria-expanded":m,"aria-disabled":k||void 0,className:"cli-select__field cli-select__field--button text-left","data-testid":"workspace-command-preset","data-value":a,disabled:k,onClick:()=>i(x=>!x),children:p}),e.jsx(B,{size:14,"aria-hidden":!0,className:"cli-select__trailing"}),m&&n.length>0?e.jsxs("div",{role:"listbox","aria-label":r("workspace.preset.optionsAria"),className:"cli-select__menu","data-testid":"workspace-command-preset-menu",children:[n.map(x=>{const u=x.id===a,h=x.available===!1;return e.jsxs("button",{type:"button",role:"option","aria-selected":u,"data-testid":`workspace-command-preset-option-${x.id}`,className:"cli-select__option",onClick:()=>{s(x.id),i(!1)},children:[e.jsx(oe,{size:12,"aria-hidden":!0,className:"cli-select__check",style:{opacity:u?1:0}}),e.jsx(le,{id:x.id,className:"w-3.5 h-3.5 text-ter shrink-0"}),e.jsxs("span",{children:[x.displayName,h?r("workspace.preset.notFoundSuffix"):""]})]},x.id)}),e.jsxs("button",{type:"button",role:"option","aria-selected":o,"data-testid":"workspace-command-preset-option-generic",className:"cli-select__option",onClick:()=>{s(""),i(!1)},children:[e.jsx(oe,{size:12,"aria-hidden":!0,className:"cli-select__check",style:{opacity:o?1:0}}),e.jsx(pe,{size:14,className:"text-ter shrink-0"}),e.jsx("span",{children:r("workspace.preset.generic")})]})]}):null]}),e.jsxs("div",{className:"mono flex items-center gap-1.5 truncate text-xs text-ter",title:d,children:[e.jsx("span",{className:"text-sec",children:"$"}),e.jsx("span",{className:"truncate",children:d})]}),t?e.jsx("span",{className:"text-xs",style:{color:"var(--status-red)"},children:t}):null]})},H=t=>(t.split(/[\\/]/).filter(Boolean).pop()??"").replace(/:$/u,""),Z=({children:t})=>e.jsx("span",{className:"text-xs font-medium uppercase tracking-wider text-ter",children:t}),Ve=({probe:t,pasteFallbackDefault:s=!1,commandPresetError:n,commandPresetId:a,commandPresets:r,onCancel:m,onCommandPresetChange:i,onCreate:l,onOpenServerBrowse:f,onTryDemo:o})=>{const{t:d}=R(),p=t?.path??"",k=t?.suggested_name??H(p),[x,u]=c.useState(k),[h,j]=c.useState(""),[y,S]=c.useState(s),[C,E]=c.useState(!1),[z,$]=c.useState("");c.useEffect(()=>{u(t?.suggested_name??H(t?.path??""))},[t?.path,t?.suggested_name]);const b=xe(h),_=H(b),g=y&&b.length>0?b:t?.path??"",P=z.trim(),N=r.find(v=>v.id===a),T=r.length===0&&!n,I=!a&&P.length===0,O=N?.available===!1&&P.length===0,q=I?d("workspace.preset.genericRequiresStartup"):O?d("workspace.preset.notInstalled",{name:N.displayName}):null,te=r.length>0&&r.every(v=>v.available===!1),V=x.trim().length>0&&g.length>0&&!T&&!I&&!O,U=()=>{V&&l({commandPresetId:a||null,name:x.trim(),path:g,...P?{startupCommand:P}:{}})};return c.useEffect(()=>{y&&b.length>0&&u(_)},[y,b,_]),e.jsx(G,{open:!0,onOpenChange:v=>!v&&m(),children:e.jsxs(K,{children:[e.jsx(X,{"data-testid":"confirm-workspace-overlay",className:"app-overlay fixed inset-0 z-40"}),e.jsx("div",{className:"pointer-events-none fixed inset-0 z-50 grid place-items-center p-4",children:e.jsxs(Y,{"data-testid":"confirm-workspace-dialog",className:"dialog-scale-pop elev-2 pointer-events-auto flex w-[480px] max-w-full flex-col rounded-lg border",style:{background:"var(--bg-elevated)",borderColor:"var(--border-bright)"},children:[e.jsxs("div",{className:"flex items-center gap-3 border-b px-5 py-4",style:{borderColor:"var(--border)"},children:[e.jsx("div",{className:"flex h-9 w-9 shrink-0 items-center justify-center rounded",style:{background:"color-mix(in oklab, var(--accent) 12%, transparent)",color:"var(--accent)"},children:e.jsx(Q,{size:18,"aria-hidden":!0})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx(J,{className:"text-lg font-semibold text-pri",children:d("workspace.confirm.title")}),e.jsx(se,{className:"text-xs text-ter",children:d("workspace.confirm.description")})]})]}),e.jsxs("div",{className:"flex flex-col gap-4 px-5 py-4",children:[e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(Z,{children:d("workspace.field.path")}),e.jsx("input",{type:"hidden",value:t?.path??"","data-testid":"confirm-workspace-path",readOnly:!0}),e.jsxs("div",{className:"flex items-center justify-between gap-3 rounded-lg border p-3 transition-all",style:{background:"var(--bg-2)",borderColor:"var(--border)"},children:[e.jsx("div",{className:"min-w-0 flex-1",children:e.jsx("span",{className:"block truncate font-mono text-sm text-pri",title:t?.path??"",children:t?.path||d("workspace.field.pathEmptyPlaceholder")})}),t?.is_git_repository?e.jsxs("div",{className:"shrink-0 flex items-center gap-1.5 rounded px-2 py-0.5 text-xs font-medium",style:{background:"color-mix(in oklab, var(--status-blue) 12%, transparent)",color:"var(--status-blue)",border:"1px solid color-mix(in oklab, var(--status-blue) 25%, transparent)"},"data-testid":"confirm-workspace-git-badge",children:[e.jsx(me,{size:12,"aria-hidden":!0}),e.jsx("span",{className:"truncate max-w-[90px]",children:t.current_branch??d("workspace.git.detached")})]}):null]}),t?.ok&&!t?.is_git_repository&&e.jsx("span",{className:"text-xs text-ter pl-1",children:d("workspace.git.none")})]}),e.jsxs("label",{className:"flex flex-col gap-2",children:[e.jsx(Z,{children:d("workspace.field.name")}),e.jsx("input",{value:x,onChange:v=>u(v.target.value),placeholder:H(t?.path??"")||d("workspace.field.nameDefaultPlaceholder"),className:"input","data-testid":"confirm-workspace-name"})]}),e.jsx(he,{error:n??q,onChange:i,presets:r,value:a}),O&&N?e.jsx(Ne,{presetId:N.id,presetName:N.displayName}):null,e.jsx("p",{className:"rounded-lg border p-3 text-xs text-sec",style:{background:"color-mix(in oklab, var(--status-yellow) 5%, transparent)",borderColor:"color-mix(in oklab, var(--status-yellow) 25%, transparent)"},"data-testid":"yolo-mode-notice",children:d("workspace.yolo.notice")}),te&&o?e.jsxs("div",{className:"flex flex-col gap-2 rounded-lg border p-3",style:{background:"color-mix(in oklab, var(--accent) 6%, transparent)",borderColor:"color-mix(in oklab, var(--accent) 30%, transparent)"},"data-testid":"cli-none-available",children:[e.jsx("span",{className:"text-xs text-sec",children:d("workspace.preset.noneAvailable")}),e.jsxs("button",{type:"button",onClick:o,className:"icon-btn w-full justify-center inline-flex items-center gap-2","data-testid":"cli-try-demo",children:[e.jsx(Ce,{size:13,"aria-hidden":!0}),d("workspace.preset.tryDemo")]})]}):null,e.jsxs("div",{className:"mt-2 rounded-lg border overflow-hidden transition-all",style:{borderColor:"var(--border)",background:"var(--bg-1)"},children:[e.jsxs("button",{type:"button",onClick:()=>E(v=>!v),className:"flex w-full items-center justify-between px-3.5 py-2.5 text-left text-xs font-semibold uppercase tracking-wider text-sec hover:bg-3 transition-colors cursor-pointer","data-testid":"confirm-workspace-startup-toggle",children:[e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx(ee,{size:12,"aria-hidden":!0,className:"text-ter"}),d("workspace.advanced.startup")]}),C?e.jsx(B,{size:14,"aria-hidden":!0}):e.jsx(F,{size:14,"aria-hidden":!0})]}),C?e.jsxs("div",{className:"flex flex-col gap-2 border-t p-3.5 transition-all",style:{background:"var(--bg-2)",borderColor:"var(--border)"},children:[e.jsx(Z,{children:d("workspace.field.startup")}),e.jsx("input",{type:"text",value:z,onChange:v=>$(v.target.value),placeholder:d("workspace.field.startupPlaceholder"),className:"input mono text-sm","data-testid":"confirm-workspace-startup-command"}),e.jsx("span",{className:"text-[11px] text-ter normal-case tracking-normal leading-relaxed",children:d("workspace.startup.hint")})]}):null]}),e.jsxs("div",{className:"rounded-lg border overflow-hidden transition-all",style:{borderColor:"var(--border)",background:"var(--bg-1)"},children:[e.jsxs("button",{type:"button",onClick:()=>S(v=>!v),className:"flex w-full items-center justify-between px-3.5 py-2.5 text-left text-xs font-semibold uppercase tracking-wider text-sec hover:bg-3 transition-colors cursor-pointer","data-testid":"confirm-workspace-paste-toggle",children:[e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx(ee,{size:12,"aria-hidden":!0,className:"text-ter"}),d("workspace.advanced.pastePath")]}),y?e.jsx(B,{size:14,"aria-hidden":!0}):e.jsx(F,{size:14,"aria-hidden":!0})]}),y?e.jsxs("div",{className:"flex flex-col gap-2 border-t p-3.5 transition-all",style:{background:"var(--bg-2)",borderColor:"var(--border)"},children:[e.jsx(Z,{children:d("workspace.field.absolutePath")}),e.jsx("input",{type:"text",value:h,onChange:v=>j(v.target.value),placeholder:d("workspace.field.absolutePathPlaceholder"),className:"input mono text-sm","data-testid":"confirm-workspace-paste-path"})]}):null]}),e.jsxs("button",{type:"button",onClick:f,className:"flex items-center justify-between w-full rounded-lg border border-dashed px-3.5 py-2.5 text-left text-xs font-semibold uppercase tracking-wider text-sec hover:bg-3 hover:text-pri transition-all cursor-pointer",style:{borderColor:"var(--border)"},"data-testid":"confirm-workspace-browse-toggle",children:[e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx(Q,{size:12,"aria-hidden":!0,className:"text-ter"}),d("workspace.advanced.browse")]}),e.jsx(F,{size:14,"aria-hidden":!0})]})]}),e.jsxs("div",{className:"flex items-center justify-end gap-2 border-t px-5 py-3",style:{borderColor:"var(--border)"},children:[e.jsx("button",{type:"button",onClick:m,className:"icon-btn",children:d("common.cancel")}),e.jsx("button",{type:"button",onClick:U,disabled:!V,"data-testid":"confirm-workspace-create",className:"icon-btn icon-btn--primary",children:d("workspace.confirm.create")})]})]})})]})})},L="hive://windows-drives",Ue=({entries:t,error:s,loading:n,onNavigate:a,onSelect:r,selected:m})=>{const{t:i}=R();return e.jsx("div",{className:"scroll-y min-h-[200px] flex-1 border-t border-b",style:{borderColor:"var(--border)"},"data-testid":"fs-entry-list",children:n?e.jsx("p",{className:"p-4 text-center text-xs text-ter",children:i("common.loading")}):s?e.jsx("p",{className:"p-4 text-center text-xs",style:{color:"var(--status-red)"},"data-testid":"fs-browse-error",children:s}):t.length===0?e.jsx("p",{className:"p-4 text-center text-xs text-ter",children:i("workspace.browse.empty")}):e.jsx("ul",{children:t.map(l=>{const f=m===l.path;return e.jsxs("li",{className:"flex items-center gap-0",children:[e.jsxs("button",{type:"button","data-testid":`fs-entry-${l.name}`,onClick:()=>r(l.path),onDoubleClick:()=>a(l.path),className:"flex flex-1 items-center gap-2 px-3 py-2 text-left text-xs hover:bg-3",style:f?{background:"var(--bg-3)",color:"var(--text-primary)"}:{color:"var(--text-primary)"},children:[e.jsx("span",{"aria-hidden":!0,className:"inline-flex items-center text-sec",children:l.is_git_repository?e.jsx(me,{size:14}):e.jsx(Q,{size:14})}),e.jsx("span",{className:"mono flex-1 truncate",children:l.name}),l.is_git_repository?e.jsx("span",{className:"text-xs uppercase tracking-wider",style:{color:"var(--accent)"},children:i("workspace.browse.gitBadge")}):null]}),e.jsx("button",{type:"button","data-testid":`fs-entry-open-${l.name}`,onClick:()=>a(l.path),"aria-label":i("workspace.browse.openAria",{name:l.name}),className:"px-3 py-2 text-xs text-ter hover:text-pri",children:"→"})]},l.path)})})})},He=({probe:t,suggestedName:s,onSuggestedNameChange:n})=>{const{t:a}=R(),r=!!t&&t.ok&&t.is_dir;return e.jsxs("div",{className:"flex flex-col gap-2 rounded border p-3 text-xs",style:{background:"var(--bg-1)",borderColor:"var(--border)"},"data-testid":"fs-selection-preview",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-ter uppercase tracking-wider text-xs",children:a("workspace.browse.selected")}),t?.is_git_repository?e.jsx("span",{className:"role-badge role-badge--coder","data-testid":"fs-preview-git-badge",children:a("workspace.git.short",{branch:t.current_branch??a("workspace.git.detached")})}):r?e.jsx("span",{className:"text-ter text-xs",children:a("workspace.git.noneShort")}):null]}),e.jsx("span",{className:"mono truncate text-pri","data-testid":"fs-preview-path",children:t?.path??"—"}),e.jsxs("label",{className:"mt-1 flex flex-col gap-1 text-ter",children:[e.jsx("span",{className:"text-xs uppercase tracking-wider",children:a("workspace.field.name")}),e.jsx("input",{type:"text",value:s,onChange:m=>n(m.target.value),disabled:!r,autoCapitalize:"none",autoCorrect:"off",spellCheck:!1,className:"mono rounded border px-2 py-1 text-sm text-pri disabled:opacity-50 max-md:text-base",style:{background:"var(--bg-0)",borderColor:"var(--border)"},"data-testid":"fs-preview-name-input"})]})]})},fe=t=>{const s=t.lastIndexOf("\\"),n=t.lastIndexOf("/");return s>=0&&s>n?"\\":n>=0?"/":/^[A-Za-z]:/u.test(t)?"\\":"/"},Ze=(t,s)=>{if(t===L)return s;const a=t.replace(/[\\/]+$/,"").split(/[\\/]/).filter(Boolean),r=a[a.length-1];return r?`~ (${r})`:t},W=t=>t.replace(/[\\/]+$/u,"")||t,ce=t=>/^[A-Za-z]:($|[\\/])/u.test(t),ie=t=>/^\\\\[^\\/]+[\\/][^\\/]+/u.test(t),be=(t,s)=>ce(t)&&ce(s)||ie(t)&&ie(s),Ge=t=>{const s=/^(?:\\\\|\/\/)(?<server>[^\\/]+)[\\/](?<share>[^\\/]+)[\\/]*(?<rest>.*)$/u.exec(t);if(!s?.groups)return null;const{server:n,share:a,rest:r}=s.groups,m=`\\\\${n}\\${a}\\`;return{label:`\\\\${n}\\${a}`,rest:r,root:m}},Ke=(t,s)=>{const n=W(t),a=W(s);return be(n,a)?n.toLowerCase()===a.toLowerCase():n===a},Xe=(t,s)=>{const n=W(t),a=W(s);if(a==="/"||a==="\\")return n.startsWith(a);const r=be(n,a),m=r?n.toLowerCase():n,i=r?a.toLowerCase():a;if(m===i)return!0;if(!m.startsWith(i))return!1;const l=m[i.length];return l==="/"||l==="\\"},Ye=(t,s,n="This PC")=>{if(!s||!t)return[];const a=[{label:Ze(s,n),path:s}];if(Ke(t,s))return a;if(s===L){const o=Ge(t);if(o){a.push({label:o.label,path:o.root});const h=o.rest.split(/[\\/]/).filter(Boolean);let j=o.root.replace(/[\\/]+$/,"");for(const y of h)j=`${j}\\${y}`,a.push({label:y,path:j});return a}const d=/^(?<drive>[A-Za-z]:)[\\/]*(?<rest>.*)$/u.exec(t),p=d?.groups?.drive;if(!p)return a;const k=`${p}\\`;a.push({label:p,path:k});const x=(d.groups?.rest??"").split(/[\\/]/).filter(Boolean);let u=k.replace(/[\\/]+$/,"");for(const h of x)u=`${u}\\${h}`,a.push({label:h,path:u});return a}const r=W(s),m=Xe(t,r)?t.slice(r.length).replace(/^[\\/]+/,""):"";if(!m)return a;const i=fe(r),l=m.split(/[\\/]/).filter(Boolean);let f=r;for(const o of l)f=`${f}${i}${o}`,a.push({label:o,path:f});return a},de={current_path:"",entries:[],error:null,ok:!1,parent_path:null,root_path:""},Je=t=>{const[s,n]=c.useState(de),[a,r]=c.useState(!1),[m,i]=c.useState(null),[l,f]=c.useState(null),o=c.useRef(0),d=c.useRef(0),p=c.useCallback(()=>{d.current++,i(null),f(null)},[]),k=c.useCallback(async u=>{const h=++o.current;r(!0);try{const j=await _e(u);if(o.current!==h)return;n(j),j.ok?i(j.current_path):p()}catch{}finally{o.current===h&&r(!1)}},[p]);c.useEffect(()=>{if(!t){o.current++,n(de),p();return}k("")},[p,t,k]),c.useEffect(()=>{if(!m){f(null);return}const u=++d.current;Pe(m).then(h=>{d.current===u&&f(h)}).catch(h=>{console.debug("[hive] discarded:fsBrowser.probe (likely stale token)",h)})},[m]);const x=c.useCallback(u=>{i(u)},[]);return{browse:s,loading:a,navigate:k,probe:l,selectEntry:x,selected:m}},Qe=t=>(t.split(/[\\/]/).filter(Boolean).pop()??"").replace(/:$/u,""),ge=({commandPresetError:t,commandPresetId:s,commandPresets:n,onClose:a,onCommandPresetChange:r,onCreate:m,open:i,initialAdvanced:l=!1,manualHint:f})=>{const{t:o}=R(),d=Se(),{browse:p,loading:k,navigate:x,probe:u,selectEntry:h,selected:j}=Je(i),[y,S]=c.useState(""),[C,E]=c.useState(l),[z,$]=c.useState(""),[b,_]=c.useState(!1),[g,P]=c.useState(""),N=xe(z),T=Qe(N);if(c.useEffect(()=>{i||(S(""),E(l),$(""),_(!1),P(""))},[i,l]),c.useEffect(()=>{u?.suggested_name&&S(u.suggested_name)},[u?.suggested_name]),c.useEffect(()=>{C&&N.length>0&&S(T)},[C,T,N]),!i)return null;const I=o("workspace.browse.drivesRoot"),O=p.root_path===L?I:p.root_path,q=Ye(p.current_path,p.root_path,I),te=p.root_path===L&&p.current_path!==L,V=fe(p.current_path||p.root_path),U=n.find(w=>w.id===s),v=g.trim(),ke=n.length===0&&!t,ae=!s&&v.length===0,re=U?.available===!1&&v.length===0,ve=ae?o("workspace.preset.genericRequiresStartup"):re?o("workspace.preset.notInstalled",{name:U.displayName}):null,we=y.trim().length>0&&(u?.is_dir===!0||C&&N.length>0)&&!ke&&!ae&&!re,je=()=>{const w=C&&N.length>0?N:u?.path??"";w&&m({commandPresetId:s||null,name:y.trim(),path:w,...v?{startupCommand:v}:{}})};return e.jsx(G,{open:!0,onOpenChange:w=>!w&&a(),children:e.jsxs(K,{children:[e.jsx(X,{"data-testid":"server-browse-overlay",className:"app-overlay fixed inset-0 z-40"}),e.jsx("div",{className:"pointer-events-none fixed inset-0 z-50 grid place-items-center max-md:items-end max-md:p-0 p-4",children:e.jsxs(Y,{"data-testid":"add-workspace-dialog","data-mobile":d||void 0,className:`${d?"dialog-slide-up":"dialog-scale-pop"} elev-2 pointer-events-auto flex w-[760px] max-w-[calc(100vw-32px)] flex-col rounded-lg border max-md:w-full max-md:max-w-full max-md:rounded-b-none max-md:rounded-t-xl`,style:{height:d?"85dvh":"min(600px, calc(100vh - 64px))",background:"var(--bg-elevated)",borderColor:"var(--border-bright)"},children:[e.jsxs("div",{className:"flex shrink-0 items-center gap-3 border-b px-5 py-4",style:{borderColor:"var(--border)"},children:[e.jsx("div",{className:"flex h-9 w-9 shrink-0 items-center justify-center rounded",style:{background:"color-mix(in oklab, var(--accent) 12%, transparent)",color:"var(--accent)"},children:e.jsx(Q,{size:18,"aria-hidden":!0})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx(J,{className:"text-lg font-semibold text-pri",children:o("workspace.browse.title")}),e.jsx(se,{className:"mono truncate text-xs text-ter","data-testid":"fs-root-path",children:p.root_path?o("workspace.browse.root",{path:O}):o("workspace.browse.rootLoading")})]}),e.jsx(Ee,{asChild:!0,children:e.jsx("button",{type:"button","aria-label":o("common.closeDialog"),className:"flex h-7 w-7 items-center justify-center rounded text-sec hover:bg-3 hover:text-pri",children:e.jsx(ze,{size:14,"aria-hidden":!0})})})]}),e.jsxs("nav",{className:"flex shrink-0 items-center gap-1 border-b px-4 py-2 text-xs",style:{borderColor:"var(--border)"},"aria-label":o("workspace.browse.breadcrumb"),"data-testid":"fs-breadcrumb",children:[e.jsxs("button",{type:"button",onClick:()=>p.parent_path?x(p.parent_path):null,disabled:!p.parent_path,"aria-label":o("workspace.browse.parentAria"),className:"flex items-center gap-1 rounded px-2 py-0.5 text-sec hover:bg-3 hover:text-pri disabled:opacity-40",children:[e.jsx(Ie,{size:12,"aria-hidden":!0})," ",o("workspace.browse.up")]}),te?e.jsxs("button",{type:"button",onClick:()=>x(L),"aria-label":o("workspace.browse.drivesAria"),"data-testid":"fs-browse-drives",className:"flex items-center gap-1 rounded px-2 py-0.5 text-sec hover:bg-3 hover:text-pri",children:[e.jsx(We,{size:12,"aria-hidden":!0})," ",I]}):null,e.jsx("div",{className:"mx-2 h-4 w-px",style:{background:"var(--border)"}}),q.map((w,ne)=>{const ye=ne===q.length-1;return e.jsxs("span",{className:"flex items-center gap-0.5",children:[ne>0?e.jsx("span",{className:"text-ter",children:V}):null,ye?e.jsx("span",{className:"px-1 py-0.5 font-medium text-pri",children:w.label}):e.jsx("button",{type:"button",onClick:()=>x(w.path),className:"rounded px-1 py-0.5 text-sec hover:bg-3 hover:text-pri",children:w.label})]},w.path)})]}),e.jsxs("div",{className:"flex min-h-0 flex-1 max-md:flex-col",children:[e.jsx("div",{className:"flex min-h-0 flex-1 flex-col max-md:min-h-[40%]",children:e.jsx(Ue,{entries:p.entries,error:p.ok?null:p.error,loading:k,onNavigate:x,onSelect:h,selected:j})}),e.jsxs("div",{className:"flex w-[280px] shrink-0 flex-col gap-3 border-l p-4 max-md:w-full max-md:border-l-0 max-md:border-t max-md:max-h-[45%] max-md:overflow-y-auto",style:{borderColor:"var(--border)"},children:[e.jsx(He,{onSuggestedNameChange:S,probe:u,suggestedName:y}),e.jsx(he,{error:t??ve,onChange:r,presets:n,value:s}),e.jsxs("div",{className:"rounded-lg border overflow-hidden transition-all",style:{borderColor:"var(--border)",background:"var(--bg-1)"},children:[e.jsxs("button",{type:"button",onClick:()=>_(w=>!w),className:"flex w-full items-center justify-between px-3 py-2 text-left text-xs font-semibold uppercase tracking-wider text-sec hover:bg-3 transition-colors cursor-pointer",children:[e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx(ee,{size:12,"aria-hidden":!0,className:"text-ter"}),o("workspace.advanced.startup")]}),b?e.jsx(B,{size:14,"aria-hidden":!0}):e.jsx(F,{size:14,"aria-hidden":!0})]}),b?e.jsxs("div",{className:"flex flex-col gap-2 border-t p-3 transition-all",style:{background:"var(--bg-2)",borderColor:"var(--border)"},children:[e.jsx("span",{className:"text-xs font-medium uppercase tracking-wider text-ter",children:o("workspace.field.startup")}),e.jsx("input",{type:"text",value:g,onChange:w=>P(w.target.value),placeholder:o("workspace.field.startupPlaceholder"),className:"input mono text-sm max-md:text-base",autoCapitalize:"none",autoCorrect:"off",spellCheck:!1,inputMode:"text","data-testid":"fs-startup-command"}),e.jsx("span",{className:"text-xs normal-case tracking-normal text-ter leading-relaxed",children:o("workspace.startup.hintShort")})]}):null]}),e.jsxs("div",{className:"rounded-lg border overflow-hidden transition-all",style:{borderColor:"var(--border)",background:"var(--bg-1)"},children:[e.jsxs("button",{type:"button",onClick:()=>E(w=>!w),className:"flex w-full items-center justify-between px-3 py-2 text-left text-xs font-semibold uppercase tracking-wider text-sec hover:bg-3 transition-colors cursor-pointer",children:[e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx(ee,{size:12,"aria-hidden":!0,className:"text-ter"}),o("workspace.advanced.pastePath")]}),C?e.jsx(B,{size:14,"aria-hidden":!0}):e.jsx(F,{size:14,"aria-hidden":!0})]}),C?e.jsxs("div",{className:"flex flex-col gap-2 border-t p-3 transition-all",style:{background:"var(--bg-2)",borderColor:"var(--border)"},children:[e.jsx("span",{className:"text-xs font-medium uppercase tracking-wider text-ter",children:o("workspace.field.absolutePath")}),f?e.jsx("span",{"data-testid":"fs-manual-hint",className:"text-xs normal-case tracking-normal text-ter leading-relaxed",children:f}):null,e.jsx("input",{type:"text",value:z,onChange:w=>$(w.target.value),placeholder:o("workspace.field.absolutePathPlaceholder"),className:"input mono text-sm max-md:text-base",autoCapitalize:"none",autoCorrect:"off",spellCheck:!1,inputMode:"url","data-testid":"fs-manual-path"})]}):null]})]})]}),e.jsxs("div",{className:"flex shrink-0 items-center justify-end gap-2 border-t px-5 py-3",style:{borderColor:"var(--border)"},children:[e.jsx("button",{type:"button",onClick:a,className:"icon-btn",children:o("common.cancel")}),e.jsx("button",{type:"button",onClick:je,disabled:!we,"data-testid":"add-workspace-create",className:"icon-btn icon-btn--primary",children:o("workspace.confirm.create")})]})]})})]})})},M="claude",et=t=>t.some(s=>s.id===M&&s.available)?M:t.find(s=>s.available)?.id??t[0]?.id??M,tt=(t=typeof navigator>"u"?void 0:navigator)=>{if(!t)return!1;const s=[t.userAgentData?.platform,t.platform,t.userAgent].filter(n=>typeof n=="string"&&n.length>0).join(" ");return/\bWindows?\b|\bWin(?:32|64|CE)\b|Windows NT/i.test(s)},st=({trigger:t,onClose:s,onCreate:n,onTryDemo:a})=>{const{t:r}=R(),m=c.useRef(r);c.useEffect(()=>{m.current=r},[r]);const[i,l]=c.useState({kind:"idle"}),[f,o]=c.useState([]),[d,p]=c.useState(M),[k,x]=c.useState(null),u=c.useRef({error:null,id:M,presets:[]}),h=c.useRef(s);c.useEffect(()=>{h.current=s},[s]),c.useEffect(()=>{if(t===0)return;let b=!1;x(null);const _=ue().then(g=>{if(b)return;const P=g.some(N=>N.id===u.current.id&&N.available)?u.current.id:et(g);u.current={error:null,id:P,presets:g},o(g),p(P)}).catch(()=>{if(b)return;const g=m.current("workspace.preset.loadFailed");u.current={error:g,id:M,presets:[]},o([]),p(M),x(g)});return tt()?(l({kind:"browse"}),()=>{b=!0}):(l({kind:"picking"}),Re().then(async g=>{if(await _,!b){if(g.canceled){if(g.error){l({kind:"error",message:g.error});return}l({kind:"idle"}),h.current();return}if(!g.supported){l({kind:"confirm",probe:null,pasteDefault:!0});return}if(!g.probe?.ok||!g.probe.is_dir){l({kind:"error",message:g.error??m.current("workspace.error.outsideSandbox")});return}l({kind:"confirm",probe:g.probe,pasteDefault:!1})}}).catch(g=>{if(b)return;const P=g instanceof Error?g.message:m.current("workspace.error.pickerFailed");l({kind:"error",message:P})}),()=>{b=!0})},[t]);const j=()=>{l({kind:"idle"}),s()},y=a?()=>{l({kind:"idle"}),s(),a()}:void 0,S=b=>{Promise.resolve(n(b)).then(()=>l({kind:"idle"})).catch(_=>{const g=_ instanceof Error?_.message:r("workspace.error.createFailed");l({kind:"error",title:r("workspace.error.createTitle"),message:g})})},C=b=>{u.current={...u.current,id:b},p(b)},E=f.length>0||k?f:u.current.presets,z=d===""?"":E.length>0&&!E.some(b=>b.id===d&&b.available)?u.current.id:d,$=k??u.current.error;if(i.kind==="idle")return null;if(i.kind==="picking"){const b=()=>l({kind:"idle"});return e.jsx(G,{open:!0,onOpenChange:_=>!_&&b(),children:e.jsxs(K,{children:[e.jsx(X,{className:"app-overlay fixed inset-0 z-40"}),e.jsxs(Y,{"data-testid":"add-workspace-picking","aria-describedby":void 0,className:"fixed inset-0 z-50 flex items-center justify-center p-4",children:[e.jsx(J,{className:"sr-only",children:r("workspace.picking.title")}),e.jsxs("div",{"data-testid":"add-workspace-picking-panel",className:"dialog-scale-pop elev-2 flex items-center gap-3 rounded-lg border px-5 py-4",style:{background:"var(--bg-elevated)",borderColor:"var(--border-bright)"},children:[e.jsx(Ae,{size:18,"aria-hidden":!0,className:"animate-pulse",style:{color:"var(--accent)"}}),e.jsx("span",{className:"text-sm text-pri",children:r("workspace.picking.message")})]})]})]})})}return i.kind==="error"?e.jsx(G,{open:!0,onOpenChange:b=>!b&&j(),children:e.jsxs(K,{children:[e.jsx(X,{className:"app-overlay fixed inset-0 z-40"}),e.jsx("div",{className:"pointer-events-none fixed inset-0 z-50 grid place-items-center p-4",children:e.jsxs(Y,{"data-testid":"add-workspace-error",className:"dialog-scale-pop elev-2 pointer-events-auto w-[440px] max-w-[calc(100vw-32px)] rounded-lg border p-5",style:{background:"var(--bg-elevated)",borderColor:"var(--border-bright)"},children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx("div",{className:"flex h-9 w-9 shrink-0 items-center justify-center rounded",style:{background:"color-mix(in oklab, var(--status-red) 14%, transparent)",color:"var(--status-red)"},children:e.jsx($e,{size:18,"aria-hidden":!0})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx(J,{className:"text-lg font-semibold text-pri",children:i.title??r("workspace.error.pickerFailed")}),e.jsx(se,{className:"mt-1.5 break-words text-sm text-ter",children:i.message})]})]}),e.jsxs("div",{className:"mt-5 flex justify-end gap-2",children:[e.jsx("button",{type:"button",onClick:j,className:"icon-btn",children:r("common.close")}),e.jsx("button",{type:"button",onClick:()=>l({kind:"confirm",probe:null,pasteDefault:!0}),className:"icon-btn icon-btn--primary",children:r("workspace.error.pastePathInstead")})]})]})})]})}):i.kind==="browse"?e.jsx(ge,{commandPresetError:$,commandPresetId:z,commandPresets:E,onClose:j,onCommandPresetChange:C,onCreate:S,open:!0}):e.jsx(Ve,{commandPresetError:$,commandPresetId:z,commandPresets:E,pasteFallbackDefault:i.pasteDefault,probe:i.probe,onCancel:j,onCommandPresetChange:C,onCreate:S,onOpenServerBrowse:()=>l({kind:"browse"}),...y?{onTryDemo:y}:{}})},D="claude",at=t=>t.some(s=>s.id===D&&s.available)?D:t.find(s=>s.available)?.id??t[0]?.id??D,rt=t=>{const{t:s}=R(),n=c.useRef(s);c.useEffect(()=>{n.current=s},[s]);const[a,r]=c.useState([]),[m,i]=c.useState(D),[l,f]=c.useState(null),o=c.useRef(D);return c.useEffect(()=>{if(!t)return;let p=!1;return f(null),ue().then(k=>{if(p)return;const u=k.some(h=>h.id===o.current&&h.available)?o.current:at(k);o.current=u,r(k),i(u)}).catch(()=>{p||(o.current=D,r([]),i(D),f(n.current("workspace.preset.loadFailed")))}),()=>{p=!0}},[t]),{commandPresets:a,commandPresetId:m,commandPresetError:l,onCommandPresetChange:p=>{o.current=p,i(p)}}},nt=({trigger:t,onClose:s,onCreate:n})=>{const{t:a}=R(),[r,m]=c.useState(!1),i=c.useRef(0);c.useEffect(()=>{t>0&&t!==i.current&&m(!0)},[t]);const l=rt(r),f=()=>{i.current=t,m(!1),s()},o=d=>{Promise.resolve(n(d)).then(()=>{i.current=t,m(!1)})};return r?e.jsx(ge,{open:!0,initialAdvanced:!0,manualHint:a("workspace.add.manualHint"),commandPresetError:l.commandPresetError,commandPresetId:l.commandPresetId,commandPresets:l.commandPresets,onClose:f,onCommandPresetChange:l.onCommandPresetChange,onCreate:o}):null},lt=({trigger:t,onClose:s,onCreate:n,onTryDemo:a})=>{const{mode:r}=Me();return r==="mobile"?e.jsx(nt,{trigger:t,onClose:s,onCreate:n}):e.jsx(st,{trigger:t,onClose:s,onCreate:n,...a?{onTryDemo:a}:{}})};export{lt as AddWorkspaceFlow};
@@ -1 +1 @@
1
- import{u as f,r as h,j as e,R as j,P as b,O as N,k as v,a0 as g,m as c}from"./index-B1vvo0-M.js";const y=({open:o,onClose:r,onAddWorkspace:d,onTryDemo:x})=>{const{t:s}=f(),[l,n]=h.useState(0),m=t=>{t||(n(0),r())},i=(t=!0)=>{n(0),r(t)},a=l===2;return e.jsx(j,{open:o,onOpenChange:m,children:e.jsxs(b,{children:[e.jsx(N,{className:"app-overlay fixed inset-0 z-40"}),e.jsx("div",{className:"pointer-events-none fixed inset-0 z-50 grid place-items-center p-4",children:e.jsxs(v,{"aria-label":s("firstRun.title"),className:"dialog-scale-pop elev-2 pointer-events-auto w-[480px] max-w-[calc(100vw-32px)] rounded-lg border p-6",style:{background:"var(--bg-elevated)",borderColor:"var(--border-bright)"},children:[e.jsx(g,{className:"sr-only",children:s("firstRun.step",{current:l+1,total:3})}),e.jsxs("div",{className:"min-h-[200px]",children:[l===0&&e.jsxs("div",{className:"flex flex-col items-center gap-4 py-4 text-center",children:[e.jsx("div",{"aria-hidden":!0,className:"flex h-14 w-14 items-center justify-center rounded-lg",style:{background:"color-mix(in oklab, var(--accent) 15%, transparent)",color:"var(--accent)",border:"1px solid color-mix(in oklab, var(--accent) 30%, transparent)"},children:e.jsx("img",{alt:"",className:"h-10 w-10 object-contain","data-testid":"first-run-logo",draggable:!1,src:"/logo.png"})}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(c,{className:"text-xl font-semibold text-pri",children:s("firstRun.title")}),e.jsx("p",{className:"text-sm text-sec",children:s("firstRun.desc")}),e.jsx("p",{className:"text-xs text-ter",children:s("firstRun.subtitle")})]})]}),l>0&&e.jsx(c,{className:"sr-only",children:s("firstRun.title")}),l===1&&e.jsxs("div",{className:"flex flex-col gap-4 py-2",children:[e.jsx("h2",{className:"text-lg font-semibold text-pri",children:s("firstRun.howItWorks")}),e.jsx("ol",{className:"flex flex-col gap-3",children:[{n:1,title:s("firstRun.slide1Title"),desc:s("firstRun.slide1Desc")},{n:2,title:s("firstRun.slide2Title"),desc:s("firstRun.slide2Desc")},{n:3,title:s("firstRun.slide3Title"),desc:s("firstRun.slide3Desc")}].map(({n:t,title:u,desc:p})=>e.jsxs("li",{className:"flex items-start gap-3",children:[e.jsx("span",{className:"flex h-6 w-6 shrink-0 items-center justify-center rounded-full text-xs font-medium",style:{background:"var(--bg-elevated)",border:"1px solid var(--border-bright)",color:"var(--accent)"},children:t}),e.jsxs("div",{children:[e.jsx("div",{className:"text-sm font-medium text-pri",children:u}),e.jsx("div",{className:"text-xs text-sec",children:p})]})]},t))})]}),l===2&&e.jsxs("div",{className:"flex flex-col gap-3 py-2",children:[e.jsx("h2",{className:"text-lg font-semibold text-pri",children:s("firstRun.getStarted")}),e.jsx("p",{className:"text-sm text-sec",children:s("firstRun.optionDesc")}),e.jsxs("div",{className:"mt-2 flex flex-col gap-2",children:[e.jsx("button",{type:"button",onClick:()=>{d(),i(!1)},className:"icon-btn icon-btn--primary w-full justify-center",children:s("firstRun.addWorkspace")}),e.jsx("button",{type:"button",onClick:()=>{x(),i(!0)},className:"icon-btn w-full justify-center",children:s("firstRun.tryDemo")}),e.jsx("button",{type:"button",onClick:()=>i(),className:"text-xs text-sec underline hover:text-pri mt-1",children:s("firstRun.skipForNow")})]})]})]}),e.jsxs("div",{className:"mt-5 flex items-center justify-between",children:[e.jsx("span",{className:"text-xs text-ter",children:s("firstRun.step",{current:l+1,total:3})}),e.jsxs("div",{className:"flex items-center gap-2",children:[l>0&&!a&&e.jsx("button",{type:"button",onClick:()=>n(t=>t-1),className:"icon-btn",children:s("firstRun.back")}),!a&&e.jsx("button",{type:"button",onClick:()=>n(t=>t+1),className:"icon-btn icon-btn--primary",children:s("firstRun.next")}),e.jsx("button",{type:"button",onClick:()=>i(),className:"text-xs text-ter underline hover:text-sec",children:s("firstRun.skip")})]})]})]})})]})})};export{y as FirstRunWizard};
1
+ import{u as f,r as h,j as e,R as j,P as b,O as N,k as v,a0 as g,m as c}from"./index-XUIK5lOA.js";const y=({open:o,onClose:r,onAddWorkspace:d,onTryDemo:x})=>{const{t:s}=f(),[l,n]=h.useState(0),m=t=>{t||(n(0),r())},i=(t=!0)=>{n(0),r(t)},a=l===2;return e.jsx(j,{open:o,onOpenChange:m,children:e.jsxs(b,{children:[e.jsx(N,{className:"app-overlay fixed inset-0 z-40"}),e.jsx("div",{className:"pointer-events-none fixed inset-0 z-50 grid place-items-center p-4",children:e.jsxs(v,{"aria-label":s("firstRun.title"),className:"dialog-scale-pop elev-2 pointer-events-auto w-[480px] max-w-[calc(100vw-32px)] rounded-lg border p-6",style:{background:"var(--bg-elevated)",borderColor:"var(--border-bright)"},children:[e.jsx(g,{className:"sr-only",children:s("firstRun.step",{current:l+1,total:3})}),e.jsxs("div",{className:"min-h-[200px]",children:[l===0&&e.jsxs("div",{className:"flex flex-col items-center gap-4 py-4 text-center",children:[e.jsx("div",{"aria-hidden":!0,className:"flex h-14 w-14 items-center justify-center rounded-lg",style:{background:"color-mix(in oklab, var(--accent) 15%, transparent)",color:"var(--accent)",border:"1px solid color-mix(in oklab, var(--accent) 30%, transparent)"},children:e.jsx("img",{alt:"",className:"h-10 w-10 object-contain","data-testid":"first-run-logo",draggable:!1,src:"/logo.png"})}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(c,{className:"text-xl font-semibold text-pri",children:s("firstRun.title")}),e.jsx("p",{className:"text-sm text-sec",children:s("firstRun.desc")}),e.jsx("p",{className:"text-xs text-ter",children:s("firstRun.subtitle")})]})]}),l>0&&e.jsx(c,{className:"sr-only",children:s("firstRun.title")}),l===1&&e.jsxs("div",{className:"flex flex-col gap-4 py-2",children:[e.jsx("h2",{className:"text-lg font-semibold text-pri",children:s("firstRun.howItWorks")}),e.jsx("ol",{className:"flex flex-col gap-3",children:[{n:1,title:s("firstRun.slide1Title"),desc:s("firstRun.slide1Desc")},{n:2,title:s("firstRun.slide2Title"),desc:s("firstRun.slide2Desc")},{n:3,title:s("firstRun.slide3Title"),desc:s("firstRun.slide3Desc")}].map(({n:t,title:u,desc:p})=>e.jsxs("li",{className:"flex items-start gap-3",children:[e.jsx("span",{className:"flex h-6 w-6 shrink-0 items-center justify-center rounded-full text-xs font-medium",style:{background:"var(--bg-elevated)",border:"1px solid var(--border-bright)",color:"var(--accent)"},children:t}),e.jsxs("div",{children:[e.jsx("div",{className:"text-sm font-medium text-pri",children:u}),e.jsx("div",{className:"text-xs text-sec",children:p})]})]},t))})]}),l===2&&e.jsxs("div",{className:"flex flex-col gap-3 py-2",children:[e.jsx("h2",{className:"text-lg font-semibold text-pri",children:s("firstRun.getStarted")}),e.jsx("p",{className:"text-sm text-sec",children:s("firstRun.optionDesc")}),e.jsxs("div",{className:"mt-2 flex flex-col gap-2",children:[e.jsx("button",{type:"button",onClick:()=>{d(),i(!1)},className:"icon-btn icon-btn--primary w-full justify-center",children:s("firstRun.addWorkspace")}),e.jsx("button",{type:"button",onClick:()=>{x(),i(!0)},className:"icon-btn w-full justify-center",children:s("firstRun.tryDemo")}),e.jsx("button",{type:"button",onClick:()=>i(),className:"text-xs text-sec underline hover:text-pri mt-1",children:s("firstRun.skipForNow")})]})]})]}),e.jsxs("div",{className:"mt-5 flex items-center justify-between",children:[e.jsx("span",{className:"text-xs text-ter",children:s("firstRun.step",{current:l+1,total:3})}),e.jsxs("div",{className:"flex items-center gap-2",children:[l>0&&!a&&e.jsx("button",{type:"button",onClick:()=>n(t=>t-1),className:"icon-btn",children:s("firstRun.back")}),!a&&e.jsx("button",{type:"button",onClick:()=>n(t=>t+1),className:"icon-btn icon-btn--primary",children:s("firstRun.next")}),e.jsx("button",{type:"button",onClick:()=>i(),className:"text-xs text-ter underline hover:text-sec",children:s("firstRun.skip")})]})]})]})})]})})};export{y as FirstRunWizard};