@tt-a1i/hive 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.en.md +15 -6
  3. package/README.md +26 -4
  4. package/dist/src/cli/hive.d.ts +4 -0
  5. package/dist/src/cli/hive.js +25 -3
  6. package/dist/src/cli/team.d.ts +8 -1
  7. package/dist/src/cli/team.js +111 -11
  8. package/dist/src/server/action-center-summary.d.ts +193 -0
  9. package/dist/src/server/action-center-summary.js +188 -0
  10. package/dist/src/server/agent-command-resolver.d.ts +6 -0
  11. package/dist/src/server/agent-command-resolver.js +16 -0
  12. package/dist/src/server/agent-manager.js +11 -1
  13. package/dist/src/server/agent-run-starter.js +47 -6
  14. package/dist/src/server/agent-runtime-types.d.ts +4 -0
  15. package/dist/src/server/agent-startup-instructions.d.ts +4 -0
  16. package/dist/src/server/agent-startup-instructions.js +35 -9
  17. package/dist/src/server/agent-stdin-dispatcher.js +17 -9
  18. package/dist/src/server/diagnostics-support-bundle.d.ts +288 -0
  19. package/dist/src/server/diagnostics-support-bundle.js +179 -0
  20. package/dist/src/server/dispatch-ledger-store.d.ts +4 -1
  21. package/dist/src/server/dispatch-ledger-store.js +46 -6
  22. package/dist/src/server/hive-envelope-escape.d.ts +2 -0
  23. package/dist/src/server/hive-envelope-escape.js +2 -0
  24. package/dist/src/server/hive-team-guidance.d.ts +1 -1
  25. package/dist/src/server/hive-team-guidance.js +67 -25
  26. package/dist/src/server/message-log-store.d.ts +1 -1
  27. package/dist/src/server/post-start-input-writer.js +8 -2
  28. package/dist/src/server/preset-launch-support.d.ts +2 -0
  29. package/dist/src/server/preset-launch-support.js +65 -2
  30. package/dist/src/server/protocol-event-stats.d.ts +39 -0
  31. package/dist/src/server/protocol-event-stats.js +84 -0
  32. package/dist/src/server/recovery-summary.js +19 -14
  33. package/dist/src/server/role-template-store.d.ts +1 -1
  34. package/dist/src/server/role-templates.d.ts +1 -0
  35. package/dist/src/server/role-templates.js +43 -29
  36. package/dist/src/server/routes-action-center.d.ts +2 -0
  37. package/dist/src/server/routes-action-center.js +37 -0
  38. package/dist/src/server/routes-diagnostics.d.ts +2 -0
  39. package/dist/src/server/routes-diagnostics.js +17 -0
  40. package/dist/src/server/routes-scenarios.d.ts +25 -0
  41. package/dist/src/server/routes-scenarios.js +89 -0
  42. package/dist/src/server/routes-settings.js +2 -11
  43. package/dist/src/server/routes-team-memory.js +52 -0
  44. package/dist/src/server/routes-team.js +40 -20
  45. package/dist/src/server/routes-workspace-memory-dreams.js +8 -0
  46. package/dist/src/server/routes-workspace-uploads.d.ts +2 -0
  47. package/dist/src/server/routes-workspace-uploads.js +154 -0
  48. package/dist/src/server/routes-workspaces.js +29 -3
  49. package/dist/src/server/routes.js +8 -0
  50. package/dist/src/server/runtime-message-builders.d.ts +0 -1
  51. package/dist/src/server/runtime-message-builders.js +0 -8
  52. package/dist/src/server/runtime-store-contract.d.ts +15 -0
  53. package/dist/src/server/runtime-store-dream.d.ts +14 -1
  54. package/dist/src/server/runtime-store-dream.js +49 -1
  55. package/dist/src/server/runtime-store-helpers.d.ts +7 -0
  56. package/dist/src/server/runtime-store-helpers.js +85 -22
  57. package/dist/src/server/runtime-store-worker-mutations.d.ts +11 -0
  58. package/dist/src/server/runtime-store-worker-mutations.js +46 -0
  59. package/dist/src/server/runtime-store-workflows.js +10 -6
  60. package/dist/src/server/runtime-store.js +34 -42
  61. package/dist/src/server/scenario-presets.d.ts +25 -0
  62. package/dist/src/server/scenario-presets.js +35 -0
  63. package/dist/src/server/sentinel-heartbeat.d.ts +30 -0
  64. package/dist/src/server/sentinel-heartbeat.js +145 -0
  65. package/dist/src/server/spawn-cli-resolver.d.ts +37 -0
  66. package/dist/src/server/spawn-cli-resolver.js +70 -0
  67. package/dist/src/server/spawn-worker-defaults.d.ts +13 -0
  68. package/dist/src/server/spawn-worker-defaults.js +45 -0
  69. package/dist/src/server/sqlite-schema-v32.d.ts +2 -0
  70. package/dist/src/server/sqlite-schema-v32.js +17 -0
  71. package/dist/src/server/sqlite-schema-v33.d.ts +3 -0
  72. package/dist/src/server/sqlite-schema-v33.js +18 -0
  73. package/dist/src/server/sqlite-schema-v34.d.ts +11 -0
  74. package/dist/src/server/sqlite-schema-v34.js +19 -0
  75. package/dist/src/server/sqlite-schema-v35.d.ts +3 -0
  76. package/dist/src/server/sqlite-schema-v35.js +23 -0
  77. package/dist/src/server/sqlite-schema.d.ts +1 -1
  78. package/dist/src/server/sqlite-schema.js +35 -1
  79. package/dist/src/server/system-message.d.ts +5 -2
  80. package/dist/src/server/system-message.js +5 -2
  81. package/dist/src/server/tasks-file-watcher.d.ts +8 -0
  82. package/dist/src/server/tasks-file-watcher.js +31 -2
  83. package/dist/src/server/team-authz.d.ts +9 -1
  84. package/dist/src/server/team-authz.js +24 -0
  85. package/dist/src/server/team-list-serializer.d.ts +2 -2
  86. package/dist/src/server/team-list-serializer.js +2 -1
  87. package/dist/src/server/team-memory-digest.js +4 -4
  88. package/dist/src/server/team-memory-dream-applier.js +24 -3
  89. package/dist/src/server/team-memory-dream-prompt.d.ts +13 -0
  90. package/dist/src/server/team-memory-dream-prompt.js +91 -0
  91. package/dist/src/server/team-memory-dream-run-store.d.ts +2 -0
  92. package/dist/src/server/team-memory-dream-run-store.js +14 -4
  93. package/dist/src/server/team-memory-dream-runner.d.ts +2 -21
  94. package/dist/src/server/team-memory-dream-runner.js +3 -148
  95. package/dist/src/server/team-memory-dream-store.d.ts +1 -1
  96. package/dist/src/server/team-memory-dream-store.js +1 -1
  97. package/dist/src/server/team-operations.d.ts +18 -2
  98. package/dist/src/server/team-operations.js +222 -33
  99. package/dist/src/server/team-recap.d.ts +10 -0
  100. package/dist/src/server/team-recap.js +73 -0
  101. package/dist/src/server/terminal-input-profile.js +95 -6
  102. package/dist/src/server/upload-limits.d.ts +2 -0
  103. package/dist/src/server/upload-limits.js +2 -0
  104. package/dist/src/server/workflow-cli-policy.d.ts +7 -2
  105. package/dist/src/server/workflow-cli-policy.js +15 -3
  106. package/dist/src/server/workflow-run-store.d.ts +1 -0
  107. package/dist/src/server/workflow-run-store.js +11 -1
  108. package/dist/src/server/workflow-runner.d.ts +4 -1
  109. package/dist/src/server/workflow-runner.js +418 -118
  110. package/dist/src/server/workflow-script-loader.d.ts +3 -2
  111. package/dist/src/server/workflow-script-loader.js +161 -0
  112. package/dist/src/server/workspace-store-contract.d.ts +2 -0
  113. package/dist/src/server/workspace-store.d.ts +1 -1
  114. package/dist/src/server/workspace-store.js +40 -30
  115. package/dist/src/server/workspace-upload-store.d.ts +40 -0
  116. package/dist/src/server/workspace-upload-store.js +295 -0
  117. package/dist/src/shared/scenario-presets.d.ts +32 -0
  118. package/dist/src/shared/scenario-presets.js +69 -0
  119. package/dist/src/shared/types.d.ts +12 -1
  120. package/package.json +1 -1
  121. package/web/dist/assets/AddWorkerDialog-DBLhwb91.js +2 -0
  122. package/web/dist/assets/AddWorkspaceFlow-cxvhVAsT.js +1 -0
  123. package/web/dist/assets/FirstRunWizard-DlEPnWWw.js +1 -0
  124. package/web/dist/assets/{MarketplaceDrawer-BFfGT8hH.js → MarketplaceDrawer-CfSiRi8e.js} +11 -11
  125. package/web/dist/assets/TaskGraphDrawer-C2JufcPs.js +1 -0
  126. package/web/dist/assets/WhatsNewDialog-vP7buLos.js +1 -0
  127. package/web/dist/assets/WorkerModal-CSorwcdP.js +1 -0
  128. package/web/dist/assets/{WorkflowsDrawer-CiIdHS6_.js → WorkflowsDrawer-BXS3w9Uq.js} +1 -1
  129. package/web/dist/assets/WorkspaceMemoryDrawer-D71ivohr.js +1 -0
  130. package/web/dist/assets/{WorkspaceTaskDrawer-CyhhEB1Z.js → WorkspaceTaskDrawer-CGCTSHKa.js} +1 -1
  131. package/web/dist/assets/index-BcwN8cCw.js +79 -0
  132. package/web/dist/assets/index-StXTPHls.css +1 -0
  133. package/web/dist/assets/{search-BtRkkEmS.js → search-BZw4T67h.js} +1 -1
  134. package/web/dist/assets/{square-terminal-lEeQUWb3.js → square-terminal-B7E57In1.js} +1 -1
  135. package/web/dist/index.html +2 -2
  136. package/web/dist/sw.js +1 -1
  137. package/dist/src/server/env-sync-message.d.ts +0 -9
  138. package/dist/src/server/env-sync-message.js +0 -29
  139. package/web/dist/assets/AddWorkerDialog-C86CwNgQ.js +0 -2
  140. package/web/dist/assets/AddWorkspaceFlow-Bm2Jz34D.js +0 -1
  141. package/web/dist/assets/FirstRunWizard-XzBoEpA5.js +0 -1
  142. package/web/dist/assets/TaskGraphDrawer-_uVH_0C1.js +0 -1
  143. package/web/dist/assets/WhatsNewDialog-DkJHmkMs.js +0 -1
  144. package/web/dist/assets/WorkerModal-BtMJEOG9.js +0 -1
  145. package/web/dist/assets/WorkspaceMemoryDrawer-C6sNocl_.js +0 -1
  146. package/web/dist/assets/index-BAiLYajK.css +0 -1
  147. package/web/dist/assets/index-K-GG8UwR.js +0 -73
@@ -0,0 +1,69 @@
1
+ const RESEARCHER_DESCRIPTION = [
2
+ 'You are a Researcher. Collect facts, data, and sources for the assigned topic.',
3
+ '工作方式 / How to work:',
4
+ '- Break the topic into key questions first, then investigate each one. / 先拆出要回答的关键问题,再逐项调查。',
5
+ '- Prefer primary sources and real project files; attach a source or file path to every conclusion. / 优先一手来源和项目内真实文件;每个结论都附上来源或文件路径。',
6
+ '- Separate facts, inferences, and unknowns; never present guesses as facts. / 区分事实、推断和未知,不把猜测写成结论。',
7
+ 'Delivery / 交付说明: include findings by topic, source list, and unresolved questions.',
8
+ ].join('\n');
9
+ const FACTCHECKER_DESCRIPTION = [
10
+ 'You are a Fact-checker. Verify research claims and evidence strength without expanding the scope by default.',
11
+ '工作方式 / How to work:',
12
+ '- Check every claim against its source and mark supported, uncertain, or unsupported. / 逐条核对结论与其来源,标注支持、存疑或不支持。',
13
+ '- Cross-check critical claims with a second source, command, or direct file read. / 对关键结论做交叉验证。',
14
+ '- When a claim is wrong, provide the corrected wording and evidence. / 发现错误时给出纠正后的表述和依据。',
15
+ 'Delivery / 交付说明: group by confidence and list refuted or uncertain claims first.',
16
+ ].join('\n');
17
+ const DRAFTER_DESCRIPTION = [
18
+ 'You are a Drafter. Turn goals and source material into a clear first-draft document.',
19
+ '工作方式 / How to work:',
20
+ '- Confirm audience, purpose, and scope before outlining and writing. / 先确认读者、目的和范围,再列提纲,后成文。',
21
+ '- Use real project code and files as the source of truth; do not invent behavior or APIs. / 以项目内真实代码和文件为准,不编造行为或接口。',
22
+ '- Mark missing material and points that need confirmation. / 标注待确认和缺素材的位置。',
23
+ 'Delivery / 交付说明: include document path, structure overview, and confirmation checklist.',
24
+ ].join('\n');
25
+ const DOC_REVIEWER_DESCRIPTION = [
26
+ 'You are a Document Reviewer. Check a draft for accuracy and readability; do not rewrite the whole document by default.',
27
+ '工作方式 / How to work:',
28
+ '- Verify technical details against real code and files first. / 先对照项目真实代码和文件核对技术细节。',
29
+ '- Check structure, terminology consistency, and whether readers can follow the document. / 检查结构、术语一致性,以及读者能否按文档完成操作。',
30
+ '- List issues by severity with concrete edits or rewrite examples. / 问题按严重度列出,给出具体修改建议或改写示例。',
31
+ 'Delivery / 交付说明: list factual errors first, then structure and wording issues.',
32
+ ].join('\n');
33
+ export const SCENARIO_PRESETS = [
34
+ {
35
+ id: 'build_review_test',
36
+ workers: [
37
+ { nameStem: 'coder', role: 'coder' },
38
+ { nameStem: 'reviewer', role: 'reviewer' },
39
+ { nameStem: 'tester', role: 'tester' },
40
+ ],
41
+ goalTemplate: {
42
+ en: 'Implement <feature>: have the Coder implement, Reviewer audit, and Tester verify; describe what to build, key constraints, and validation commands or acceptance criteria.',
43
+ zh: '实现 X 功能:让 Coder 实现、Reviewer 审查、Tester 验证;写清楚要做什么、关键约束,以及验证命令或验收标准。',
44
+ },
45
+ },
46
+ {
47
+ id: 'research_factcheck',
48
+ workers: [
49
+ { nameStem: 'researcher', role: 'custom', descriptionOverride: RESEARCHER_DESCRIPTION },
50
+ { nameStem: 'factchecker', role: 'custom', descriptionOverride: FACTCHECKER_DESCRIPTION },
51
+ ],
52
+ goalTemplate: {
53
+ en: 'Research <topic>: have the Researcher gather evidence and the Factchecker verify it; list questions, trusted sources, and the decision this research should support.',
54
+ zh: '调研 X 主题:让 Researcher 收集证据、Factchecker 复核;列出要回答的问题、可信来源要求,以及这次调研要支撑的决策。',
55
+ },
56
+ },
57
+ {
58
+ id: 'docs_pipeline',
59
+ workers: [
60
+ { nameStem: 'drafter', role: 'custom', descriptionOverride: DRAFTER_DESCRIPTION },
61
+ { nameStem: 'doc-reviewer', role: 'custom', descriptionOverride: DOC_REVIEWER_DESCRIPTION },
62
+ ],
63
+ goalTemplate: {
64
+ en: 'Write <doc>: have the Drafter write and the Doc Reviewer review; state the audience, scope, required sections, and code or files it should describe.',
65
+ zh: '撰写 X 文档:让 Drafter 撰写、Doc Reviewer 审查;写明读者、范围、必备章节,以及它要描述的代码或文件。',
66
+ },
67
+ },
68
+ ];
69
+ export const getScenarioPreset = (id) => SCENARIO_PRESETS.find((preset) => preset.id === id);
@@ -1,6 +1,6 @@
1
1
  export declare const agentStatuses: readonly ["idle", "working", "stopped"];
2
2
  export type AgentStatus = (typeof agentStatuses)[number];
3
- export type WorkerRole = 'coder' | 'reviewer' | 'tester' | 'custom';
3
+ export type WorkerRole = 'coder' | 'reviewer' | 'tester' | 'sentinel' | 'custom';
4
4
  /** How a worker came to exist: spawned by a workflow run or by the orchestrator
5
5
  * (via `team spawn`). Absent/null for user-added persistent workers. */
6
6
  export type WorkerSpawnSource = 'workflow' | 'orchestrator';
@@ -52,6 +52,13 @@ export interface TeamListItem {
52
52
  * Per AGENTS.md §8 + spec §3.3 line 162-179, HTTP JSON is snake_case.
53
53
  * Internal TS code uses TeamListItem (camelCase); serializers/deserializers convert.
54
54
  */
55
+ export interface TeamListOpenDispatchPayload {
56
+ id: string;
57
+ status: 'queued' | 'submitted';
58
+ /** Minutes since the dispatch was submitted (or created, while queued). */
59
+ age_minutes: number;
60
+ task_preview: string;
61
+ }
55
62
  export interface TeamListItemPayload {
56
63
  id: string;
57
64
  name: string;
@@ -62,4 +69,8 @@ export interface TeamListItemPayload {
62
69
  command_preset_id: string | null;
63
70
  ephemeral?: boolean;
64
71
  spawned_by?: 'orchestrator' | 'workflow' | null;
72
+ /** Present (non-empty) only when the worker has open dispatches — gives the
73
+ * orchestrator the ids + ages it needs for `team cancel`. Display-only:
74
+ * no timeouts or heartbeats are derived from this. */
75
+ open_dispatches?: TeamListOpenDispatchPayload[];
65
76
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tt-a1i/hive",
3
- "version": "2.0.1",
3
+ "version": "2.1.0",
4
4
  "description": "Browser-native hive-mind for CLI coding agents — Claude Code, Codex, OpenCode, Gemini, Hermes, Cursor, and Grok collaborate as real PTY processes via a team protocol.",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@10.30.3",
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/MarketplaceDrawer-CfSiRi8e.js","assets/index-BcwN8cCw.js","assets/index-StXTPHls.css","assets/search-BZw4T67h.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,af as ee,ag 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,ah as ue}from"./index-BcwN8cCw.js";import{S as pe}from"./search-BZw4T67h.js";import{S as he}from"./square-terminal-B7E57In1.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-CfSiRi8e.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-BcwN8cCw.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",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};
@@ -0,0 +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-BcwN8cCw.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};