@runfusion/fusion 0.46.0 → 0.47.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 (115) hide show
  1. package/dist/bin.js +16961 -14719
  2. package/dist/client/.vite/manifest.json +238 -238
  3. package/dist/client/assets/{AgentDetailView-D1cA9Bfj.js → AgentDetailView-D9lYcdOS.js} +1 -1
  4. package/dist/client/assets/{AgentPermissionPolicyEditor-DE0wv8-L.js → AgentPermissionPolicyEditor-Bn_PEeQW.js} +1 -1
  5. package/dist/client/assets/{AgentsView-Bm_FA_1w.js → AgentsView-BRbnFmv3.js} +3 -3
  6. package/dist/client/assets/{ChatView-CHEkov6q.js → ChatView-Batci7-w.js} +3 -3
  7. package/dist/client/assets/{CommandCenter-Cfgek-dC.js → CommandCenter-DAUgvVMX.js} +1 -1
  8. package/dist/client/assets/DevServerView-HdEXR5UB.js +1 -0
  9. package/dist/client/assets/DevServerView-iBondC7z.css +1 -0
  10. package/dist/client/assets/{DirectoryPicker-etVwa-6X.js → DirectoryPicker-DrCiUJlF.js} +1 -1
  11. package/dist/client/assets/{DocumentsView-e8ZTdPIZ.js → DocumentsView-C0KxPWex.js} +1 -1
  12. package/dist/client/assets/{EvalsView-CjDRQFMQ.js → EvalsView-wCfi9Rkj.js} +1 -1
  13. package/dist/client/assets/{ExperimentalAgentOnboardingModal-DXR0OAsR.js → ExperimentalAgentOnboardingModal-Crck6eJe.js} +1 -1
  14. package/dist/client/assets/{GoalsView-WWDKVslN.js → GoalsView-sFGHX3Wt.js} +1 -1
  15. package/dist/client/assets/{InsightsView-DxIfxOzx.js → InsightsView-jl0cX1um.js} +2 -2
  16. package/dist/client/assets/{MemoryView-BVW2hkWf.js → MemoryView-Bwv99M_s.js} +1 -1
  17. package/dist/client/assets/{PiExtensionsManager-CpSfMok2.js → PiExtensionsManager-BsA3tCZh.js} +3 -3
  18. package/dist/client/assets/{PluginManager-CpBCy656.js → PluginManager-Bgd8Hj0a.js} +1 -1
  19. package/dist/client/assets/{PullRequestView-BMspX1ga.js → PullRequestView-CqO16SNt.js} +2 -2
  20. package/dist/client/assets/{ResearchView--YEtcv_s.js → ResearchView-CfRsbJWS.js} +1 -1
  21. package/dist/client/assets/{SecretsView-CC6QDMWN.js → SecretsView-CHomYGnm.js} +1 -1
  22. package/dist/client/assets/SessionTerminal-DcYUuwbV.js +2 -0
  23. package/dist/client/assets/{SettingsModal-4d_p8D7W.js → SettingsModal-CX5GLed_.js} +1 -1
  24. package/dist/client/assets/SettingsModal-CvbiSIHS.css +1 -0
  25. package/dist/client/assets/SettingsModal-ybSf6HDn.js +21 -0
  26. package/dist/client/assets/SetupWizardModal-D2BQL0df.js +2 -0
  27. package/dist/client/assets/{ShadcnColorPicker-HX3j1v66.js → ShadcnColorPicker-B-8x0Gci.js} +1 -1
  28. package/dist/client/assets/{SkillsView-mdFVTX-r.js → SkillsView-4iqYHf9N.js} +1 -1
  29. package/dist/client/assets/{TodoView-DQVugDpW.js → TodoView-BJsknVS6.js} +2 -2
  30. package/dist/client/assets/WorkflowNodeEditor-BOouksjw.css +1 -0
  31. package/dist/client/assets/WorkflowNodeEditor-QdwW4bY5.js +8 -0
  32. package/dist/client/assets/{agentSkills-C2v1wbxh.js → agentSkills-CwR8s-gl.js} +1 -1
  33. package/dist/client/assets/{architectureDiagram-3BPJPVTR-CGEhhgX_.js → architectureDiagram-3BPJPVTR-rav0thhm.js} +1 -1
  34. package/dist/client/assets/{blockDiagram-GPEHLZMM-D0DTo0HT.js → blockDiagram-GPEHLZMM-x9Opikul.js} +1 -1
  35. package/dist/client/assets/{c4Diagram-AAUBKEIU-DNykNaRb.js → c4Diagram-AAUBKEIU-BGrWtNPI.js} +1 -1
  36. package/dist/client/assets/channel-BFVfY8Ks.js +1 -0
  37. package/dist/client/assets/{chunk-2J33WTMH-5oQfAhmr.js → chunk-2J33WTMH-BMFvL-OW.js} +1 -1
  38. package/dist/client/assets/{chunk-4BX2VUAB-BqLZXgFw.js → chunk-4BX2VUAB-CWTOrH7n.js} +1 -1
  39. package/dist/client/assets/{chunk-55IACEB6-C1oIjX3T.js → chunk-55IACEB6-l48k3a4l.js} +1 -1
  40. package/dist/client/assets/{chunk-727SXJPM-BaovQTgk.js → chunk-727SXJPM-DeynG6ym.js} +1 -1
  41. package/dist/client/assets/{chunk-AQP2D5EJ-B4ikBK42.js → chunk-AQP2D5EJ-B9ndyq3h.js} +1 -1
  42. package/dist/client/assets/{chunk-FMBD7UC4-5zgtNnG2.js → chunk-FMBD7UC4-DV2d1-q1.js} +1 -1
  43. package/dist/client/assets/{chunk-ND2GUHAM-ByrypRna.js → chunk-ND2GUHAM-D0Dl37Mc.js} +1 -1
  44. package/dist/client/assets/{chunk-QZHKN3VN-B7D1exsu.js → chunk-QZHKN3VN-NGiOWxhM.js} +1 -1
  45. package/dist/client/assets/classDiagram-4FO5ZUOK-pfX_P8V9.js +1 -0
  46. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-pfX_P8V9.js +1 -0
  47. package/dist/client/assets/{cose-bilkent-S5V4N54A-CQmiNzGr.js → cose-bilkent-S5V4N54A-2ojNpRS8.js} +1 -1
  48. package/dist/client/assets/{dagre-BM42HDAG-BH8Uk0Up.js → dagre-BM42HDAG-BaIP71Bo.js} +1 -1
  49. package/dist/client/assets/{dashboard-view-CWJ-b59n.js → dashboard-view-CC2QtNhx.js} +1 -1
  50. package/dist/client/assets/{dashboard-view-D3PWY2PH.js → dashboard-view-hB7ta6sK.js} +1 -1
  51. package/dist/client/assets/{diagram-2AECGRRQ-CDoHfkxY.js → diagram-2AECGRRQ-DQfEScya.js} +1 -1
  52. package/dist/client/assets/{diagram-5GNKFQAL-DARILCuD.js → diagram-5GNKFQAL-B5iw3WNT.js} +1 -1
  53. package/dist/client/assets/{diagram-KO2AKTUF-CNP-qi0y.js → diagram-KO2AKTUF-C5mMn4JH.js} +1 -1
  54. package/dist/client/assets/{diagram-LMA3HP47-SCiVmkcf.js → diagram-LMA3HP47-CaMhdmPl.js} +1 -1
  55. package/dist/client/assets/{diagram-OG6HWLK6-iTJLXH61.js → diagram-OG6HWLK6-D2ed8-Fx.js} +1 -1
  56. package/dist/client/assets/{erDiagram-TEJ5UH35-ByMpiPIa.js → erDiagram-TEJ5UH35-CZl07SyK.js} +1 -1
  57. package/dist/client/assets/{flowDiagram-I6XJVG4X-DW3m3ZpM.js → flowDiagram-I6XJVG4X-Dz7RLhaG.js} +1 -1
  58. package/dist/client/assets/{folder-open-G-9vPAdv.js → folder-open-DCNfEqr1.js} +1 -1
  59. package/dist/client/assets/{ganttDiagram-6RSMTGT7-BJeYH7Ol.js → ganttDiagram-6RSMTGT7-C3ny-S6Q.js} +1 -1
  60. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-CK_Chj4m.js → gitGraphDiagram-PVQCEYII-BjHF5C7t.js} +1 -1
  61. package/dist/client/assets/index-CUY6xXXv.js +1292 -0
  62. package/dist/client/assets/index-CXlzJfKU.css +1 -0
  63. package/dist/client/assets/{infoDiagram-5YYISTIA-D8Wg1IgN.js → infoDiagram-5YYISTIA-BTYecWEx.js} +1 -1
  64. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-DWROR2aX.js → ishikawaDiagram-YF4QCWOH-BBNOAxJa.js} +1 -1
  65. package/dist/client/assets/{journeyDiagram-JHISSGLW-Bns9774_.js → journeyDiagram-JHISSGLW-DrjdbyT5.js} +1 -1
  66. package/dist/client/assets/{kanban-definition-UN3LZRKU-QtURfAoI.js → kanban-definition-UN3LZRKU-CgTNTfT7.js} +1 -1
  67. package/dist/client/assets/{mermaid.core-DqgrgWWm.js → mermaid.core-CyFmJxTj.js} +4 -4
  68. package/dist/client/assets/{mindmap-definition-RKZ34NQL-jLaDb5_X.js → mindmap-definition-RKZ34NQL-C95r0KZv.js} +1 -1
  69. package/dist/client/assets/{pieDiagram-4H26LBE5-CjbHuIje.js → pieDiagram-4H26LBE5-CmYuIsZ-.js} +1 -1
  70. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-xgHbylQr.js → quadrantDiagram-W4KKPZXB-BFLFwHMa.js} +1 -1
  71. package/dist/client/assets/{requirementDiagram-4Y6WPE33-CHdD7W41.js → requirementDiagram-4Y6WPE33-G0s0AfQq.js} +1 -1
  72. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-C3me87g9.js → sankeyDiagram-5OEKKPKP-D8OLAFhm.js} +1 -1
  73. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-DSHfs1kU.js → sequenceDiagram-3UESZ5HK-6fDSosvV.js} +1 -1
  74. package/dist/client/assets/{shield-alert-DkGlhVjI.js → shield-alert-CBAzSycj.js} +1 -1
  75. package/dist/client/assets/{stateDiagram-AJRCARHV-C08n7sMP.js → stateDiagram-AJRCARHV-BfNs5lJU.js} +1 -1
  76. package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-BosoAbfO.js → stateDiagram-v2-BHNVJYJU-Bt0-CBqz.js} +1 -1
  77. package/dist/client/assets/{timeline-definition-PNZ67QCA-C21h9Zqh.js → timeline-definition-PNZ67QCA-DmKYLILn.js} +1 -1
  78. package/dist/client/assets/{upload-B9B-tYt9.js → upload--9MWYfcA.js} +1 -1
  79. package/dist/client/assets/{users-C_BA3C7E.js → users-vOsWas_i.js} +1 -1
  80. package/dist/client/assets/{vennDiagram-CIIHVFJN-Bv3G0dwI.js → vennDiagram-CIIHVFJN-D3jx9PAk.js} +1 -1
  81. package/dist/client/assets/{wardley-L42UT6IY-WX0hHKcN.js → wardley-L42UT6IY-BGRnyThw.js} +1 -1
  82. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-CMwIPWm7.js → wardleyDiagram-YWT4CUSO-pwLVIgII.js} +1 -1
  83. package/dist/client/assets/{xychartDiagram-2RQKCTM6-CZvFdt6j.js → xychartDiagram-2RQKCTM6-ltxtDdDp.js} +1 -1
  84. package/dist/client/index.html +2 -2
  85. package/dist/client/version.json +1 -1
  86. package/dist/droid-cli/package.json +1 -1
  87. package/dist/extension.js +16653 -14509
  88. package/dist/pi-claude-cli/package.json +1 -1
  89. package/dist/plugin-sdk/index.d.ts +11 -6
  90. package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
  91. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  92. package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
  93. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  94. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  95. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  96. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  97. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  98. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  99. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  100. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  101. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  102. package/package.json +1 -1
  103. package/dist/client/assets/DevServerView-DgDksVH2.css +0 -1
  104. package/dist/client/assets/DevServerView-_or2KLVw.js +0 -1
  105. package/dist/client/assets/SessionTerminal-DJGtgIls.js +0 -2
  106. package/dist/client/assets/SettingsModal-BESN59Ao.css +0 -1
  107. package/dist/client/assets/SettingsModal-wABa7xmZ.js +0 -21
  108. package/dist/client/assets/SetupWizardModal-DHe2tXzx.js +0 -2
  109. package/dist/client/assets/WorkflowNodeEditor-CeERQHHu.js +0 -8
  110. package/dist/client/assets/WorkflowNodeEditor-f_XPV5Jd.css +0 -1
  111. package/dist/client/assets/channel-Dwf1FoGU.js +0 -1
  112. package/dist/client/assets/classDiagram-4FO5ZUOK-WqSUwcK_.js +0 -1
  113. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-WqSUwcK_.js +0 -1
  114. package/dist/client/assets/index-BZBQ_KsL.css +0 -1
  115. package/dist/client/assets/index-ccFe_1av.js +0 -1459
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion/pi-claude-cli",
3
- "version": "0.46.0",
3
+ "version": "0.47.0",
4
4
  "description": "Fusion vendored fork: pi coding-agent extension that routes LLM calls through the Claude Code CLI. Forked from rchern/pi-claude-cli (MIT). See UPSTREAM.md.",
5
5
  "license": "MIT",
6
6
  "private": true,
@@ -402,7 +402,7 @@ type AuthMaterialSnapshot = SharedSnapshotEnvelope<{
402
402
  providerAuth?: Record<string, ProviderAuthEntry>;
403
403
  }>;
404
404
 
405
- type WorkflowIrNodeKind = "start" | "prompt" | "script" | "gate" | "end" | "hold" | "split" | "join" | "foreach" | "loop" | "step-review" | "parse-steps" | "code" | "notify" | "merge-gate" | "merge-attempt" | "manual-merge-hold" | "retry-backoff" | "recovery-router" | "branch-group-member-integration" | "branch-group-promotion" | "pr-create" | "pr-respond" | "pr-merge";
405
+ type WorkflowIrNodeKind = "start" | "prompt" | "script" | "gate" | "end" | "hold" | "split" | "join" | "foreach" | "loop" | "optional-group" | "step-review" | "parse-steps" | "code" | "notify" | "merge-gate" | "merge-attempt" | "manual-merge-hold" | "retry-backoff" | "recovery-router" | "branch-group-member-integration" | "branch-group-promotion" | "pr-create" | "pr-respond" | "pr-merge";
406
406
  interface WorkflowIrNode {
407
407
  id: string;
408
408
  kind: WorkflowIrNodeKind;
@@ -511,10 +511,6 @@ interface WorkflowIrV1 {
511
511
  nodes: WorkflowIrNode[];
512
512
  edges: WorkflowIrEdge[];
513
513
  }
514
- interface WorkflowOptionalStep {
515
- templateId: string;
516
- defaultOn?: boolean;
517
- }
518
514
  interface WorkflowIrV2 {
519
515
  version: "v2";
520
516
  name: string;
@@ -524,7 +520,6 @@ interface WorkflowIrV2 {
524
520
  artifacts?: WorkflowIrArtifact[];
525
521
  fields?: WorkflowFieldDefinition[];
526
522
  settings?: WorkflowSettingDefinition[];
527
- optionalSteps?: WorkflowOptionalStep[];
528
523
  }
529
524
  type WorkflowIr = WorkflowIrV1 | WorkflowIrV2;
530
525
 
@@ -2863,6 +2858,7 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
2863
2858
  private getLegacyWorkflowStepSnapshot;
2864
2859
  private applyLegacyWorkflowStepOverrides;
2865
2860
  private ensureWorkflowStepForTemplate;
2861
+ private optionalGroupIdSet;
2866
2862
  private resolveEnabledWorkflowSteps;
2867
2863
  private buildActiveTaskDependencyLookup;
2868
2864
  private recordDependencyCycleRejectedAudit;
@@ -3030,6 +3026,7 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
3030
3026
  priority?: TaskPriority | null;
3031
3027
  prompt?: string;
3032
3028
  worktree?: string | null;
3029
+ workspaceWorktrees?: Task["workspaceWorktrees"];
3033
3030
  status?: string | null;
3034
3031
  dependencies?: string[];
3035
3032
  steps?: TaskStep[];
@@ -4793,6 +4790,7 @@ interface MergeDetails {
4793
4790
  reason: string;
4794
4791
  };
4795
4792
  transientRecoveryCount?: number;
4793
+ workspaceLandedShas?: Record<string, string>;
4796
4794
  }
4797
4795
  interface CheckoutClaimPrecondition {
4798
4796
  expectedCheckedOutBy?: string | null;
@@ -5035,6 +5033,12 @@ interface Task {
5035
5033
  breakIntoSubtasks?: boolean;
5036
5034
  noCommitsExpected?: boolean;
5037
5035
  worktree?: string;
5036
+ workspaceWorktrees?: Record<string, {
5037
+ worktreePath: string;
5038
+ branch: string;
5039
+ baseCommitSha?: string;
5040
+ landedSha?: string;
5041
+ }>;
5038
5042
  steps: TaskStep[];
5039
5043
  currentStep: number;
5040
5044
  customFields?: Record<string, unknown>;
@@ -5741,6 +5745,7 @@ interface ProjectSettings {
5741
5745
  chatRoomRecentVerbatimMessages?: number;
5742
5746
  chatRoomCompactionFetchLimit?: number;
5743
5747
  chatRoomSummaryMaxChars?: number;
5748
+ workspaceMode?: boolean;
5744
5749
  }
5745
5750
  interface Settings extends GlobalSettings, ProjectSettings {
5746
5751
  prAuthAvailable?: boolean;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/acp-runtime",
3
- "version": "0.1.9",
3
+ "version": "0.1.10",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/cli-printing-press",
3
- "version": "0.1.26",
3
+ "version": "0.1.27",
4
4
  "type": "module",
5
5
  "description": "CLI Printing Press plugin package for Fusion",
6
6
  "private": true,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/compound-engineering",
3
- "version": "0.1.9",
3
+ "version": "0.1.10",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/cursor-runtime",
3
- "version": "0.1.28",
3
+ "version": "0.1.29",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/dependency-graph",
3
- "version": "0.1.40",
3
+ "version": "0.1.41",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/droid-runtime",
3
- "version": "0.1.35",
3
+ "version": "0.1.36",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/hermes-runtime",
3
- "version": "0.2.59",
3
+ "version": "0.2.60",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/openclaw-runtime",
3
- "version": "0.2.59",
3
+ "version": "0.2.60",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/paperclip-runtime",
3
- "version": "0.2.59",
3
+ "version": "0.2.60",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/reports",
3
- "version": "0.1.28",
3
+ "version": "0.1.29",
4
4
  "type": "module",
5
5
  "description": "Reports plugin for Fusion",
6
6
  "private": true,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/roadmap",
3
- "version": "0.1.28",
3
+ "version": "0.1.29",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/whatsapp-chat",
3
- "version": "0.1.28",
3
+ "version": "0.1.29",
4
4
  "type": "module",
5
5
  "description": "WhatsApp Web (Baileys) chat bridge for Fusion agents",
6
6
  "keywords": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runfusion/fusion",
3
- "version": "0.46.0",
3
+ "version": "0.47.0",
4
4
  "license": "MIT",
5
5
  "description": "Fusion CLI: HTTP API server, daemon, dashboard launcher, and task tooling for the Fusion AI coding agent.",
6
6
  "homepage": "https://github.com/Runfusion/Fusion#readme",
@@ -1 +0,0 @@
1
- .dev-server-view{display:flex;flex-direction:column;gap:var(--space-md);padding:0 var(--space-lg) var(--space-lg);min-height:0;height:100%;overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain}.right-dock__body .dev-server-view>.view-header,.right-dock-expand-modal__body .dev-server-view>.view-header{display:none}@media(max-width:768px){.right-dock__body .dev-server-view>.view-header,.right-dock-expand-modal__body .dev-server-view>.view-header{display:flex}}.dev-server-header-title{display:flex;align-items:center;gap:var(--space-sm)}.dev-server-header-actions{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-sm)}.dev-server-status-badge{display:inline-flex;align-items:center;justify-content:center;border:1px solid transparent;border-radius:var(--radius-pill);padding:var(--space-xs) var(--space-sm);font-family:var(--font-mono)}.dev-server-status-badge--stopped{color:var(--color-muted);background:color-mix(in srgb,var(--color-muted) 16%,transparent);border-color:color-mix(in srgb,var(--color-muted) 40%,transparent)}.dev-server-status-badge--starting{color:var(--color-warning);background:color-mix(in srgb,var(--color-warning) 16%,transparent);border-color:color-mix(in srgb,var(--color-warning) 40%,transparent)}.dev-server-status-badge--running{color:var(--color-success);background:color-mix(in srgb,var(--color-success) 16%,transparent);border-color:color-mix(in srgb,var(--color-success) 40%,transparent)}.dev-server-status-badge--failed{color:var(--color-error);background:color-mix(in srgb,var(--color-error) 16%,transparent);border-color:color-mix(in srgb,var(--color-error) 40%,transparent)}.dev-server-panel{display:flex;flex-direction:column;gap:var(--space-md);min-height:0;padding:var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card);cursor:default;user-select:text;touch-action:auto}.dev-server-config{flex:0 0 auto;min-height:0;max-height:min(52vh,calc(var(--space-2xl) * 16));overflow-y:auto;overscroll-behavior:contain}.dev-server-section-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.dev-server-section-header h3{margin:0}.dev-server-muted{color:var(--text-muted);font-family:var(--font-mono)}.dev-server-field-group{display:flex;flex-direction:column;gap:var(--space-xs)}.dev-server-label{color:var(--text-muted)}.dev-server-empty-state{margin:0;color:var(--text-muted)}.dev-server-empty-state code{font-family:var(--font-mono)}.dev-server-task-picker{width:100%;min-width:0}.dev-server-task-descriptor{display:flex;flex-direction:column;gap:var(--space-sm);min-width:0;padding:var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--surface) 84%,var(--text))}.dev-server-task-descriptor-header{display:flex;min-width:0}.dev-server-task-description{margin:0;max-height:calc(var(--space-2xl) * 4);overflow-y:auto;color:var(--text);line-height:1.5;white-space:pre-wrap}.dev-server-task-worktree{display:flex;flex-direction:column;gap:var(--space-xs);min-width:0}.dev-server-task-worktree code{color:var(--text-muted);font-family:var(--font-mono);overflow-wrap:anywhere}.dev-server-section{display:flex;flex-direction:column;gap:var(--space-md);min-height:0;padding:var(--space-xl);max-width:calc(var(--space-2xl) * 25);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.dev-server-section h3{margin:0}.dev-server-candidates{display:flex;flex-direction:column;gap:var(--space-sm);min-height:0;max-height:min(36vh,calc(var(--space-2xl) * 9));overflow-y:auto;overscroll-behavior:contain}.dev-server-candidate{display:flex;align-items:center;gap:var(--space-md);width:100%;padding:var(--space-lg);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card);color:var(--text);text-align:left;cursor:pointer;transition:background var(--transition-fast),border-color var(--transition-fast),box-shadow var(--transition-fast)}.dev-server-candidate:hover{background:var(--card-hover)}.dev-server-candidate:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.dev-server-candidate--selected{border-left:calc(var(--btn-border-width) * 3) solid var(--todo);background:var(--status-todo-bg)}.dev-server-candidate-name{font-family:var(--font-mono);font-size:.8125rem;font-weight:600}.dev-server-candidate-command{color:var(--text-muted);font-family:var(--font-mono);font-size:.75rem;max-width:calc(var(--space-2xl) * 9 + var(--space-md));overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dev-server-candidate-source{margin-left:auto;color:var(--text-dim);font-size:.6875rem}.dev-server-selected{display:flex;align-items:center;gap:var(--space-md);padding:var(--space-lg);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.dev-server-selected .btn{margin-left:0}.dev-server-preview-override{display:flex;align-items:center;gap:var(--space-sm);margin-top:var(--space-xl)}.dev-server-preview-override .input{flex:1}.dev-server-preview-hint{margin:0;color:var(--text-muted)}.dev-server-loading-state{display:flex;align-items:center;gap:var(--space-sm);color:var(--text-muted)}.dev-server-error-box{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);padding:var(--space-sm);border:1px solid color-mix(in srgb,var(--color-error) 40%,transparent);border-radius:var(--radius-sm);background:color-mix(in srgb,var(--color-error) 10%,transparent);color:var(--color-error)}.dev-server-error-box p{margin:0}.dev-server-current-command{display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface)}.dev-server-current-command code{font-family:var(--font-mono);white-space:pre-wrap;word-break:break-word}.dev-server-error{margin:0;padding:var(--space-sm);border-radius:var(--radius-sm);border:1px solid color-mix(in srgb,var(--color-error) 40%,transparent);color:var(--color-error);background:color-mix(in srgb,var(--color-error) 10%,transparent)}.dev-server-content{flex:1;min-height:0;display:flex;flex-direction:column}.dev-server-logs-panel,.dev-server-preview{min-height:0}.dev-server-logs-viewer{flex:1;min-height:0}.dev-server-logs{flex:1;min-height:clamp(calc(var(--space-2xl) * 3 + var(--space-xs)),28vh,calc(var(--space-2xl) * 5));max-height:clamp(calc(var(--space-2xl) * 8),55vh,calc(var(--space-2xl) * 14));padding:var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg);overflow-y:auto;font-family:var(--font-mono)}.dev-server-log-line{margin:0;white-space:pre-wrap;word-break:break-word}.devserver-preview-panel{display:flex;flex-direction:column;border:1px solid var(--border);border-radius:var(--radius-lg);overflow:hidden;background:var(--surface)}.devserver-preview-header{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border-bottom:1px solid var(--border)}.devserver-preview-title{display:flex;align-items:center;gap:var(--space-xs);font-size:.8125rem;font-weight:600;color:var(--text)}.devserver-preview-url-badge{flex:1 1 auto;min-width:0;max-width:calc(var(--space-2xl) * 9);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-pill);font-family:var(--font-mono);font-size:.6875rem}.devserver-preview-url-badge--manual{color:var(--color-info);background:color-mix(in srgb,var(--color-info) 14%,transparent)}.devserver-preview-url-badge--auto{color:var(--text-muted);background:color-mix(in srgb,var(--surface) 70%,var(--text))}.devserver-preview-actions{display:flex;gap:var(--space-xs);margin-left:auto}.devserver-preview-container{position:relative;flex:1;min-height:clamp(calc(var(--space-2xl) * 4),42vh,calc(var(--space-2xl) * 9 + var(--space-sm)));max-height:clamp(calc(var(--space-2xl) * 10),72vh,calc(var(--space-2xl) * 18 + var(--space-lg)));overflow:hidden}.devserver-preview-iframe-shell{position:relative;width:100%;height:100%}.devserver-preview-iframe{width:100%;height:100%;border:none;background:var(--surface)}.devserver-preview-overlay{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-md);background:color-mix(in srgb,var(--bg) 85%,transparent);color:var(--text-muted)}.devserver-preview-blocked-panel,.devserver-preview-error-panel{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:100%;gap:var(--space-md);padding:var(--space-xl);text-align:center;border-radius:var(--radius-lg)}.devserver-preview-blocked-panel{background:color-mix(in srgb,var(--color-warning) 8%,transparent);border:1px solid color-mix(in srgb,var(--color-warning) 20%,transparent)}.devserver-preview-error-panel{background:color-mix(in srgb,var(--color-error) 8%,transparent);border:1px solid color-mix(in srgb,var(--color-error) 20%,transparent)}.devserver-preview-blocked-icon{width:calc(var(--space-2xl) + var(--space-lg));height:calc(var(--space-2xl) + var(--space-lg));color:var(--color-warning)}.devserver-preview-error-panel .devserver-preview-blocked-icon{color:var(--color-error)}.devserver-preview-blocked-title{margin:0 0 var(--space-xs);font-size:1rem;font-weight:600;color:var(--text)}.devserver-preview-blocked-context{margin:0;font-size:.75rem;color:var(--text-muted);font-family:var(--font-mono);background:color-mix(in srgb,var(--bg) 80%,transparent);padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-sm)}.devserver-preview-blocked-description{margin:0;color:var(--text-muted);font-size:.8125rem}.devserver-preview-blocked-actions{display:flex;gap:var(--space-sm);flex-wrap:wrap;justify-content:center}.devserver-preview-empty{margin:0;padding:var(--space-2xl);text-align:center;color:var(--text-dim);font-size:.8125rem}.devserver-preview-external-only{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-md);min-height:100%;padding:var(--space-lg);text-align:center;color:var(--text-muted);background:color-mix(in srgb,var(--surface) 80%,var(--text))}.devserver-preview-external-only p{margin:0}.dev-server-preview-fallback{border:1px solid color-mix(in srgb,var(--color-warning) 40%,transparent);background:color-mix(in srgb,var(--color-warning) 10%,transparent)}.dev-server-preview-external-only{border:1px solid var(--border);background:var(--surface)}.dev-server-spin{animation:dev-server-spin 1s linear infinite}@media(min-width:769px){.dev-server-view{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);grid-template-rows:auto auto 1fr}.dev-server-view>.view-header{grid-column:1 / -1}.dev-server-config{grid-column:1;grid-row:2;max-height:none}.dev-server-content{grid-column:1;grid-row:3}.devserver-preview-panel{grid-column:2;grid-row:2 / 4}.devserver-preview-container{min-height:0;max-height:none}}@media(max-width:768px){.dev-server-view{display:flex;flex-direction:column;padding:0 var(--space-md) var(--space-md)}.dev-server-header-title{flex-wrap:wrap}.dev-server-header-actions{width:100%}.dev-server-content{display:flex;flex-direction:column}.dev-server-section{padding:var(--space-md);max-width:none}.devserver-preview-header{flex-wrap:wrap}.devserver-preview-url-badge{order:2;flex:1 1 100%;min-width:0;max-width:100%}.devserver-preview-actions{order:3;width:100%;margin-left:0;justify-content:flex-end}.dev-server-preview-override{flex-direction:column;align-items:stretch}.dev-server-candidate,.dev-server-selected{flex-wrap:wrap}.dev-server-candidate-command{flex:1 1 100%;max-width:100%;white-space:normal;word-break:break-word}.dev-server-task-picker,.dev-server-task-descriptor{width:100%}.dev-server-task-description{max-height:calc(var(--space-2xl) * 3)}.dev-server-config{max-height:min(48vh,calc(var(--space-2xl) * 13))}.dev-server-candidates{max-height:min(32vh,calc(var(--space-2xl) * 7))}.dev-server-candidate-source{margin-left:0}.dev-server-header-actions .btn,.devserver-preview-actions .btn,.dev-server-preview-override .btn,.devserver-preview-external-only .btn,.devserver-preview-blocked-panel .btn,.devserver-preview-error-panel .btn,.devserver-log-viewer__load-more .btn{min-height:calc(var(--space-lg) + var(--space-lg) + var(--space-xs))}.devserver-preview-actions .btn-icon{min-width:calc(var(--space-lg) + var(--space-lg) + var(--space-xs));min-height:calc(var(--space-lg) + var(--space-lg) + var(--space-xs))}.devserver-log-viewer__toolbar{flex-wrap:wrap;padding:var(--space-xs) var(--space-sm)}.devserver-log-viewer__toolbar-actions{width:100%;justify-content:space-between}.devserver-log-viewer__search{flex:1}.devserver-log-viewer__search-input{min-width:0;width:100%}.devserver-log-viewer__content{padding:var(--space-xs);font-size:.6875rem}.devserver-log-viewer__new-logs-button{bottom:var(--space-lg);min-height:calc(var(--space-lg) + var(--space-lg) + var(--space-xs))}.dev-server-logs,.devserver-preview-container,.devserver-preview-iframe{min-height:calc(var(--space-2xl) * 4 + var(--space-md))}.devserver-preview-blocked-panel,.devserver-preview-error-panel,.devserver-preview-external-only{word-break:break-word}.devserver-preview-blocked-panel,.devserver-preview-error-panel{padding:var(--space-md)}.devserver-preview-blocked-actions .btn{min-height:calc(var(--space-lg) + var(--space-md) + var(--space-sm))}.chat-tool-calls-header,.chat-tool-call summary,.chat-tool-call-content,.chat-tool-call-preview,.chat-tool-call-value{font-size:.6875rem}.chat-tool-call summary{padding:var(--space-xs)}.chat-tool-call-content{margin:var(--space-xs);padding:var(--space-xs)}.chat-tool-call-status-text{font-size:.625rem}}@container right-dock-body (max-width: 768px){.dev-server-view{display:flex;flex:1;flex-direction:column;min-height:0;overflow-y:auto;padding:0 var(--space-md) var(--space-md)}.dev-server-view>.view-header{grid-column:auto}.dev-server-header-title{flex-wrap:wrap}.dev-server-header-actions{width:100%}.dev-server-config{grid-column:auto;grid-row:auto;max-height:min(48vh,calc(var(--space-2xl) * 13))}.dev-server-content{grid-column:auto;grid-row:auto;display:flex;flex-direction:column}.devserver-preview-panel{grid-column:auto;grid-row:auto}.dev-server-section{padding:var(--space-md);max-width:none}.devserver-preview-header{flex-wrap:wrap}.devserver-preview-url-badge{order:2;flex:1 1 100%;min-width:0;max-width:100%}.devserver-preview-actions{order:3;width:100%;margin-left:0;justify-content:flex-end}.dev-server-preview-override{flex-direction:column;align-items:stretch}.dev-server-candidate,.dev-server-selected{flex-wrap:wrap}.dev-server-candidate-command{flex:1 1 100%;max-width:100%;white-space:normal;word-break:break-word}.dev-server-candidate-source{margin-left:0}.dev-server-candidates{max-height:min(32vh,calc(var(--space-2xl) * 7))}.dev-server-task-picker,.dev-server-task-descriptor{width:100%}.dev-server-task-description{max-height:calc(var(--space-2xl) * 3)}.dev-server-logs,.devserver-preview-container,.devserver-preview-iframe{min-height:calc(var(--space-2xl) * 4 + var(--space-md));max-height:none}.devserver-preview-blocked-panel,.devserver-preview-error-panel,.devserver-preview-external-only{word-break:break-word}}.devserver-log-viewer{display:flex;flex-direction:column;height:100%;min-height:0;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface);overflow:hidden}.devserver-log-viewer--fullscreen{position:fixed;inset:0;z-index:120;border-radius:0}.devserver-log-viewer__toolbar{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border-bottom:1px solid var(--border);background:var(--card)}.devserver-log-viewer__toolbar-meta{display:flex;align-items:baseline;gap:var(--space-sm)}.devserver-log-viewer__title{color:var(--text);font-weight:600}.devserver-log-viewer__count{color:var(--text-muted);font-family:var(--font-mono);font-size:.75rem}.devserver-log-viewer__toolbar-actions{display:flex;align-items:center;gap:var(--space-sm)}.devserver-log-viewer__severity,.devserver-log-viewer__search{display:inline-flex;align-items:center;gap:var(--space-xs);color:var(--text-muted)}.devserver-log-viewer__severity-select{min-height:calc(var(--space-lg) + var(--space-md));min-width:calc(var(--space-2xl) * 3);font-size:.75rem}.devserver-log-viewer__search-input{min-height:calc(var(--space-lg) + var(--space-md));min-width:calc(var(--space-2xl) * 4);font-size:.75rem}.devserver-log-viewer__matches{color:var(--text-muted);font-family:var(--font-mono);font-size:.6875rem}.devserver-log-viewer__body{position:relative;display:flex;flex:1;flex-direction:column;min-height:0}.devserver-log-viewer__load-more{display:flex;justify-content:center;padding:var(--space-sm);border-bottom:1px solid var(--border);background:color-mix(in srgb,var(--surface) 95%,var(--text))}.devserver-log-viewer__content{flex:1;min-height:0;overflow-y:auto;padding:var(--space-sm);font-family:var(--font-mono);font-size:.75rem;line-height:1.5;background:var(--surface)}.devserver-log-viewer__loading,.devserver-log-viewer__empty{display:flex;align-items:center;justify-content:center;gap:var(--space-sm);min-height:calc(var(--space-2xl) * 4);margin:0;color:var(--text-muted)}.devserver-log-viewer__spinner{animation:dev-server-spin 1s linear infinite}.devserver-log-line{padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-sm);white-space:pre-wrap;word-break:break-all}.devserver-log-line:nth-child(2n){background:color-mix(in srgb,var(--surface) 95%,var(--text))}.devserver-log-timestamp{margin-right:var(--space-sm);color:var(--text-dim);font-size:.6875rem}.devserver-log-stream-badge{margin-right:var(--space-sm);padding:0 var(--space-xs);border-radius:var(--radius-pill);background:color-mix(in srgb,var(--color-error) 15%,transparent);color:var(--color-error);font-size:.625rem;font-weight:600}.devserver-log-text{color:var(--text)}.devserver-log-text mark{border-radius:var(--radius-sm);background:color-mix(in srgb,var(--todo) 40%,transparent);color:var(--text)}.devserver-log-viewer__new-logs-button{position:absolute;left:50%;bottom:var(--space-xl);transform:translate(-50%);z-index:10;border-color:var(--border);background:var(--card);box-shadow:var(--shadow-md)}.devserver-log-viewer__new-logs-button:active{transform:translate(-50%) scale(.97)}@keyframes dev-server-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@media(max-width:480px){.devserver-preview-blocked-actions{width:100%;flex-direction:column}.devserver-preview-blocked-actions .btn{width:100%;min-height:calc(var(--space-lg) + var(--space-lg) + var(--space-xs))}}
@@ -1 +0,0 @@
1
- import{r as t,j as r}from"./vendor-react-SZ_qB27O.js";import{c$ as ze,d0 as be,d1 as cr,d2 as we,ah as Oe,d3 as Ee,d4 as Le,d5 as Re,d6 as De,d7 as dr,d8 as ue,d9 as vr,da as ur,db as mr,dc as pr,dd as fr,bT as Z,de as me,L as ie,aJ as hr,df as gr,dg as br,dh as wr,n as xr,b6 as Be,V as yr,c1 as Sr,ck as Nr,cm as kr,di as jr,D as Cr,ai as Er,R as Lr}from"./index-ccFe_1av.js";import{u as le}from"./vendor-i18n-GF3RlKbq.js";import{S as He}from"./shield-alert-DkGlhVjI.js";import"./vendor-reactflow-Bg-Qjzh8.js";import"./vendor-xterm-BNq00GSj.js";import"./vendor-codemirror-jBKmHyH0.js";const xe=500,Rr=3e3;function q(e){return e instanceof Error?e.message:String(e)}function Ve(e){return e.length<=xe?e:e.slice(-xe)}function pe(e,o){return Ve([...e,o])}function Q(e){try{return JSON.parse(e)}catch{return null}}function se(e){const o=e.text??"";return e.stream==="stderr"?`[stderr] ${o}`:o}function Dr(e){return e?.previewUrl??null}async function _e(e){return vr(e)}async function Te(e,o){return ur(e,o)}async function _r(e){return mr(e)}async function Tr(e){return pr(e)}async function Ue(e){return fr(e)}function I(e){try{return e()}catch{return null}}function fe(){return typeof I(()=>be)=="function"&&typeof I(()=>ze)=="function"}function Y(e){return{config:{id:e.id??"default",name:e.name??"Dev Server",command:e.command??"",cwd:e.cwd??"."},status:e.status,runtime:e.pid?{pid:e.pid,startedAt:e.startedAt??new Date().toISOString(),exitCode:e.exitCode??void 0,previewUrl:e.previewUrl}:void 0,previewUrl:e.previewUrl??e.detectedUrl??e.manualUrl??void 0,logHistory:(e.logs??[]).map(o=>({timestamp:new Date().toISOString(),stream:o.startsWith("[stderr]")?"stderr":"stdout",text:o.replace(/^\[stderr\]\s*/,"")}))}}function Ur(e){const{t:o}=le("app"),[f,s]=t.useState(null),[w,m]=t.useState([]),[S,v]=t.useState([]),[j,C]=t.useState([]),[$,E]=t.useState(!0),[k,u]=t.useState(null),l=t.useRef(0),[d,M]=t.useState(null),U=t.useCallback(a=>{if(s(a),a?.logHistory){const n=a.logHistory.slice(-xe).map(se);v(n)}},[]),_=t.useCallback(async()=>{const a=l.current;try{if(fe())if(d){const n=await ze(d,e);if(l.current!==a)return;U(n)}else{const n=await be(e);if(l.current!==a)return;m(n),n.length>0&&(M(n[0].config.id),U(n[0]))}else{const n=await _e(e);if(l.current!==a)return;const p=Y(n);m([p]),U(p)}u(null)}catch(n){if(l.current!==a)return;u(q(n))}},[U,e,d]);t.useEffect(()=>{l.current+=1;const a=l.current;s(null),m([]),v([]),C([]),E(!0),u(null),M(null),(async()=>{try{const[p,c]=await Promise.allSettled([fe()?be(e):_e(e).then(x=>[Y(x)]),typeof I(()=>ue)=="function"?ue(e):Ue(e).then(x=>x.map(L=>({name:L.name,command:L.command,cwd:L.cwd,scriptName:L.scriptName,packagePath:L.packagePath})))]);if(l.current!==a)return;let b=null;if(p.status==="fulfilled"){const x=p.value;if(m(x),x.length>0){const L=x[0];fe()&&M(L.config.id),U(L)}}else b=q(p.reason);c.status==="fulfilled"&&C(c.value),b&&u(b)}catch(p){if(l.current!==a)return;u(q(p))}finally{l.current===a&&E(!1)}})()},[U,e]),t.useEffect(()=>{const a=d?cr(d,e):typeof I(()=>we)=="function"?we(e):null;if(!a)return;const n=l.current,p=Oe(a,{events:{history:c=>{if(l.current!==n)return;const b=Q(c.data);if(b?.lines){const x=b.lines.map(se);v(Ve(x))}},log:c=>{if(l.current!==n)return;const b=Q(c.data);if(b){const x=typeof b.line=="string"?b.line:se(b);v(L=>pe(L,x))}},"dev-server:log":c=>{if(l.current!==n)return;const b=Q(c.data);if(b){const x=typeof b.line=="string"?b.line:se(b);v(L=>pe(L,x))}},"dev-server:output":c=>{if(l.current!==n)return;const b=Q(c.data);b?.line&&v(x=>pe(x,b.line))},status:c=>{if(l.current!==n)return;const b=Q(c.data),x=b?.status;x&&s(L=>L&&{...L,status:x,runtime:b.pid?{...L.runtime??{startedAt:new Date().toISOString()},pid:b.pid}:L.runtime})},"dev-server:status":c=>{if(l.current!==n)return;const b=Q(c.data);if(b?.status){const x=Y(b);s(x),m([x])}},stopped:()=>{l.current},failed:()=>{l.current}},onReconnect:()=>{l.current===n&&_()},onError:()=>{l.current===n&&u(c=>c??o("devserver.lostConnection","Lost log stream connection."))}});return()=>{p()}},[e,_,d]),t.useEffect(()=>{if(f?.status!=="running"&&f?.status!=="starting")return;const a=setInterval(()=>{_()},Rr);return()=>{clearInterval(a)}},[_,f?.status]);const T=t.useCallback(async(a,n)=>{l.current+=1;const p=l.current;try{let c;const b=typeof n=="string"&&n.length>0,x=f?.config?.cwd??".";if(!(b&&n!==x)&&d&&typeof I(()=>Ee)=="function")c=await Ee(d,e);else{const W=await Te({command:a,cwd:n},e);c=Y(W)}if(l.current!==p)return;s(c),u(null)}catch(c){if(l.current!==p)return;throw u(q(c)),c}},[e,f?.config?.cwd,d]),R=t.useCallback(async()=>{l.current+=1;const a=l.current;try{let n;if(d&&typeof I(()=>Le)=="function")n=await Le(d,e);else{const p=await _r(e);n=Y(p)}if(l.current!==a)return;s(n),u(null)}catch(n){if(l.current!==a)return;throw u(q(n)),n}},[e,d]),z=t.useCallback(async()=>{l.current+=1;const a=l.current;try{let n;if(d&&typeof I(()=>Re)=="function")n=await Re(d,e);else{const p=await Tr(e);n=Y(p)}if(l.current!==a)return;s(n),u(null)}catch(n){if(l.current!==a)return;throw u(q(n)),n}},[e,d]),A=t.useCallback(async a=>{l.current+=1;const n=l.current;try{let p;if(d&&typeof I(()=>De)=="function")p=await De(d,a,e);else{const c=await dr({url:a},e);p={url:c.manualUrl??c.previewUrl??c.detectedUrl??null,source:c.manualUrl?"manual":"auto"}}if(l.current!==n)return;s(c=>c?{...c,previewUrl:p.url??void 0}:null),u(null)}catch(p){if(l.current!==n)return;throw u(q(p)),p}},[e,d]),O=t.useCallback(async()=>{l.current+=1;const a=l.current;try{let n;try{n=await ue(e)}catch{n=(await Ue(e)).map(c=>({name:c.name,command:c.command,cwd:c.cwd,scriptName:c.scriptName,packagePath:c.packagePath}))}if(l.current!==a)return;C(n),u(null)}catch(n){if(l.current!==a)return;throw u(q(n)),n}},[e]),h=t.useCallback(async(a,n)=>{if(typeof a!="string"&&!d)try{const b=a,x=await Te({command:b.command,cwd:b.cwd,scriptName:b.scriptName,packagePath:b.packagePath??b.cwd},e),L=Y(x);s(L),m([L]),u(null);return}catch(b){throw u(q(b)),b}const p=typeof a=="string"?a:a.command,c=typeof a=="string"?n:a.cwd;await T(p,c)},[e,T,d]),g=t.useCallback(async()=>{await R()},[R]),D=t.useCallback(async()=>{await z()},[z]),B=t.useCallback(async a=>{await A(a)},[A]),P=t.useCallback(async()=>{await O()},[O]),V=t.useCallback(async()=>{await _()},[_]),N=Dr(f),y=f?{...f,pid:f.runtime?.pid}:null;return{session:f,sessions:w,logs:S,detectedCommands:j,previewUrl:N,isLoading:$,error:k,startServer:T,stopServer:R,restartServer:z,setPreviewUrl:A,detectCommands:O,refresh:_,candidates:j,serverState:y,loading:$,start:h,stop:g,restart:D,setManualUrl:B,detect:P,refreshStatus:V}}const Me=500,Ae=100;function We(e){return e.length>Me?e.slice(-Me):e}function qe(e){return e==="stderr"?"stderr":"stdout"}function ne(e){try{return JSON.parse(e.data)}catch{return null}}function ae(e,o){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:o,text:typeof e.text=="string"?e.text:"",stream:qe(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function Mr(e,o){return{id:o,text:e,stream:"stdout",timestamp:""}}function he(e,o){if(o.length===0)return e;const f=[...e],s=new Set(e.map(w=>w.id));for(const w of o)s.has(w.id)||(s.add(w.id),f.push(w));return f.sort((w,m)=>w.id-m.id),We(f)}function Ar(e,o){const[f,s]=t.useState([]),[w,m]=t.useState(!1),[S,v]=t.useState(!1),[j,C]=t.useState(!1),[$,E]=t.useState(null),k=t.useRef(null),u=t.useRef(!1),l=t.useRef(0),d=t.useRef(0),M=t.useRef(e),U=t.useRef(o),_=t.useRef(0),T=t.useRef(1);(M.current!==e||U.current!==o)&&(M.current=e,U.current=o,l.current++,Z({view:"useDevServerLogs",trigger:"project-context-change",projectId:e,replayAttempted:!1,reason:"context-version-bumped"}),u.current=!0,_.current=0,T.current=1,s([]),m(!1),v(!1),C(!1),E(null),k.current&&(k.current(),k.current=null)),t.useEffect(()=>{if(!o){k.current&&(k.current(),k.current=null);return}const h=l.current,g=++d.current;u.current=!1,m(!0);const D=(N,y)=>{const a=We(N);s(a),E(y),C(y!==null?y>a.length:!1);const n=a.length>0?a[a.length-1].id:0;_.current=n,T.current=n+1},B=N=>{if(u.current||l.current!==h||!N||typeof N!="object")return;const y=N.lines;if(!Array.isArray(y))return;if(y.length>0&&typeof y[0]=="string"){const n=y.filter(p=>typeof p=="string").map((p,c)=>Mr(p,c+1));D(n,n.length);return}const a=y.filter(n=>!!n&&typeof n=="object").map((n,p)=>ae(n,p+1));D(a,a.length)},P=N=>{if(u.current||l.current!==h)return;const y=typeof N.text=="string"?N.text:typeof N.line=="string"?N.line:null;if(!y)return;const a=T.current,n=typeof N.id=="number"&&Number.isFinite(N.id)?N.id:a,p={id:n,text:y,stream:qe(N.stream),timestamp:typeof N.timestamp=="string"?N.timestamp:""};_.current=Math.max(_.current,n),T.current=Math.max(T.current,n+1),s(c=>he(c,[p])),E(c=>c===null?c:Math.max(c+1,p.id))};async function V(){try{const y=await me({maxLines:Ae},e);if(u.current||l.current!==h||d.current!==g)return;const a=y.lines.map((n,p)=>ae(n,p+1));D(a,y.totalLines)}catch{if(u.current||l.current!==h||d.current!==g)return;D([],null)}finally{!u.current&&l.current===h&&d.current===g&&m(!1)}const N=we(e);k.current=Oe(N,{events:{"dev-server:log":y=>{const a=ne(y);a&&P(a)},log:y=>{const a=ne(y);a&&P(a)},history:y=>{const a=ne(y);B(a)},"dev-server:history":y=>{const a=ne(y);B(a)}},onReconnect:()=>{Z({view:"useDevServerLogs",trigger:"sse-reconnect",projectId:e,replayAttempted:!0,replayFromEventId:_.current??null,sseChannel:N,reason:"history-replay"}),!(u.current||l.current!==h)&&me({lastEventId:_.current,maxLines:50},e).then(y=>{if(u.current||l.current!==h)return;const a=y.lines.map((n,p)=>ae(n,T.current+p));if(a.length>0){const n=a[a.length-1].id;_.current=Math.max(_.current,n),T.current=Math.max(T.current,n+1)}s(n=>he(n,a)),E(y.totalLines)}).catch(()=>{})}}),Z({view:"useDevServerLogs",trigger:"sse-open",projectId:e,replayAttempted:!1,sseChannel:N})}return V(),()=>{u.current=!0,k.current&&(k.current(),k.current=null)}},[o,e]);const z=t.useCallback(async()=>{if(!o||S)return;const h=l.current,g=f.length;v(!0);try{const D=await me({maxLines:Ae,offset:g},e);if(u.current||l.current!==h)return;const B=D.lines.map((P,V)=>ae(P,V+1));s(P=>he(B,P)),C(D.totalLines>g+B.length),E(D.totalLines)}catch{}finally{v(!1)}},[o,f.length,S,e]),A=t.useCallback(()=>{s([])},[]),O=k.current!==null&&!w&&!u.current;return{entries:f,loading:w,loadingMore:S,hasMore:j,total:$,loadMore:z,clear:A,logs:f,isStreaming:O,clearLogs:A}}const Pr="This preview appears to block iframe embedding. Open it in a new tab instead.",Fr="The preview URL could not be loaded. Verify the server is running and the URL is correct.",$r="Preview is taking longer than expected and may block iframe embedding.";function zr(e){return e==="blocked"?Pr:e==="error"?Fr:null}function Or(e,o={}){const{loadTimeoutMs:f=1e4,detectionMethod:s=null}=o,w=t.useRef(null),m=t.useRef(null),[S,v]=t.useState("unknown"),[j,C]=t.useState(null),[$]=t.useState(s),E=t.useCallback(()=>{m.current!==null&&(window.clearTimeout(m.current),m.current=null)},[]),k=t.useCallback(R=>{v(R),C(zr(R))},[]),u=t.useCallback(()=>{v("blocked"),C($r)},[]);t.useEffect(()=>{if(E(),!e){v("unknown"),C(null);return}v("unknown"),C(null);let R=!1;return queueMicrotask(()=>{R||(v("loading"),C(null))}),()=>{R=!0,E()}},[E,e]),t.useEffect(()=>{if(S!=="loading"){E();return}const R=setTimeout(()=>{m.current=null,u()},f);return m.current=R,()=>{clearTimeout(R),m.current===R&&(m.current=null)}},[E,S,f,u]);const l=t.useCallback(()=>{const R=w.current;if(!R){k("embedded");return}try{if(R.contentWindow?.location?.href==="about:blank"&&R.src!=="about:blank"){k("blocked");return}}catch{}k("embedded")},[k]),d=t.useCallback(()=>{k("error")},[k]);t.useEffect(()=>{if(E(),!e){v("unknown"),C(null);return}v("unknown"),C(null)},[E]);const M=t.useCallback(()=>{E(),v("unknown"),C(null)},[E]),U=M,_=t.useMemo(()=>S==="embedded",[S]),T=t.useMemo(()=>S==="blocked"||S==="error",[S]);return{embedStatus:S,isEmbedded:_,isBlocked:T,blockReason:j,detectionMethod:$,iframeRef:w,resetEmbedStatus:M,setEmbedStatus:k,retry:U,embedContext:j,handleIframeLoad:l,handleIframeError:d}}const Br=/\x1b\[[0-9;]*m/g;function ye(e){return e.replace(Br,"")}function Hr(e){if(!e)return"";const o=new Date(e);return Number.isNaN(o.getTime())?"":o.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function Vr(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Wr(e){if(e.stream==="stderr")return"error";const o=ye(e.text).toLowerCase();return/\b(warn|warning)\b/.test(o)?"warn":/\b(error|fatal)\b/.test(o)?"error":"info"}function qr(e,o){if(!o)return e;const f=new RegExp(`(${Vr(o)})`,"ig"),s=e.split(f),w=o.toLowerCase();return r.jsx(r.Fragment,{children:s.map((m,S)=>m.toLowerCase()===w?r.jsx("mark",{children:m},`${m}-${S}`):r.jsx("span",{children:m},`${m}-${S}`))})}function Xr({entries:e,loading:o,loadingMore:f,hasMore:s,total:w,onLoadMore:m,isRunning:S}){const{t:v}=le("app"),j=t.useRef(null),C=t.useRef(e.length),$=t.useRef(S),[E,k]=t.useState(!1),[u,l]=t.useState(!1),[d,M]=t.useState(""),[U,_]=t.useState("all"),T=t.useMemo(()=>U==="all"?e:e.filter(h=>Wr(h)===U),[e,U]),R=t.useMemo(()=>{const h=d.trim().toLowerCase();return h?T.filter(g=>ye(g.text).toLowerCase().includes(h)):T},[T,d]),z=R.length,A=t.useCallback(()=>{const h=j.current;h&&(h.scrollTop=h.scrollHeight,l(!1))},[]);t.useEffect(()=>{const h=$.current,g=C.current,D=e.length>g;S&&(!h||!u&&D)&&A(),$.current=S,C.current=e.length},[e.length,S,u,A]);const O=t.useCallback(()=>{const h=j.current;if(!h)return;const D=h.scrollTop+h.clientHeight>=h.scrollHeight-50;l(!D)},[]);return t.useEffect(()=>{o||e.length===0||!u&&S&&A()},[e,S,u,o,A]),o&&e.length===0?r.jsx("section",{className:"devserver-log-viewer","data-testid":"devserver-log-viewer",children:r.jsxs("div",{className:"devserver-log-viewer__loading","data-testid":"devserver-log-loading",children:[r.jsx(ie,{size:16,className:"devserver-log-viewer__spinner"}),r.jsx("span",{children:v("devserver.loadingLogs","Loading logs…")})]})}):r.jsxs("section",{className:`devserver-log-viewer${E?" devserver-log-viewer--fullscreen":""}`,"data-testid":"devserver-log-viewer",children:[r.jsxs("header",{className:"devserver-log-viewer__toolbar",children:[r.jsxs("div",{className:"devserver-log-viewer__toolbar-meta",children:[r.jsx("span",{className:"devserver-log-viewer__title",children:v("devserver.logs","Logs")}),r.jsxs("span",{className:"devserver-log-viewer__count","data-testid":"devserver-log-count",children:[w!==null?`${e.length}/${w}`:`${e.length}`," ",v("devserver.lines","lines")]})]}),r.jsxs("div",{className:"devserver-log-viewer__toolbar-actions",children:[r.jsxs("label",{className:"devserver-log-viewer__severity",htmlFor:"devserver-log-severity-filter",children:[r.jsx("span",{className:"visually-hidden",children:v("devserver.filterBySeverity","Filter logs by severity")}),r.jsxs("select",{id:"devserver-log-severity-filter",className:"select devserver-log-viewer__severity-select",value:U,onChange:h=>_(h.target.value),"data-testid":"devserver-log-severity-filter","aria-label":v("devserver.filterBySeverity","Filter logs by severity"),children:[r.jsx("option",{value:"all",children:v("devserver.allSeverities","All severities")}),r.jsx("option",{value:"info",children:v("devserver.info","Info")}),r.jsx("option",{value:"warn",children:v("devserver.warn","Warn")}),r.jsx("option",{value:"error",children:v("devserver.error","Error")})]})]}),r.jsxs("label",{className:"devserver-log-viewer__search",htmlFor:"devserver-log-search",children:[r.jsx("span",{className:"visually-hidden",children:v("devserver.searchLogs","Search logs")}),r.jsx(hr,{size:14}),r.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:d,onChange:h=>M(h.target.value),placeholder:v("devserver.searchLogs","Search logs"),"data-testid":"devserver-log-search-input","aria-label":v("devserver.searchLogs","Search logs")})]}),d.trim().length>0&&r.jsx("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:v("devserver.matchCount",{count:z,defaultValue_one:"{{count}} match",defaultValue_other:"{{count}} matches"})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>k(h=>!h),"data-testid":"devserver-log-fullscreen-toggle","aria-label":E?v("devserver.exitFullscreen","Exit fullscreen logs"):v("devserver.enterFullscreen","Enter fullscreen logs"),children:E?r.jsx(gr,{size:14}):r.jsx(br,{size:14})})]})]}),r.jsxs("div",{className:"devserver-log-viewer__body",children:[s&&r.jsx("div",{className:"devserver-log-viewer__load-more","data-testid":"devserver-log-load-more",children:r.jsx("button",{type:"button",className:"btn btn-sm touch-target",onClick:m,disabled:f,"data-testid":"devserver-log-load-more-button",children:f?r.jsxs(r.Fragment,{children:[r.jsx(ie,{size:14,className:"devserver-log-viewer__spinner"}),v("devserver.loadingOlderLogs","Loading older logs…")]}):v("devserver.loadOlderLogs","Load older logs")})}),r.jsxs("div",{ref:j,className:"devserver-log-viewer__content",onScroll:O,"data-testid":"devserver-log-content",children:[!o&&R.length===0&&r.jsx("p",{className:"devserver-log-viewer__empty","data-testid":"devserver-log-empty",children:e.length===0?v("devserver.noLogsYet","No logs yet. Start the dev server to see output."):T.length===0?v("devserver.noMatchesSeverity","No log lines match the selected severity."):v("devserver.noMatchesSearch","No log lines match your search.")}),R.map(h=>{const g=ye(h.text),D=Hr(h.timestamp);return r.jsxs("div",{className:"devserver-log-line",children:[D&&r.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:D}),h.stream==="stderr"&&r.jsx("span",{className:"devserver-log-stream-badge","data-testid":"devserver-log-stderr-badge",children:v("devserver.errBadge","ERR")}),r.jsx("span",{className:"devserver-log-text",children:wr(qr(g,d.trim()))})]},h.id)})]}),u&&S&&r.jsxs("button",{type:"button",className:"btn btn-sm devserver-log-viewer__new-logs-button",onClick:A,"data-testid":"devserver-log-jump-button",children:[r.jsx(xr,{size:14}),v("devserver.newLogs","New logs")]})]})]})}const Ir="devserver-preview-iframe";function Jr({url:e,embedStatus:o,onEmbedStatusChange:f,iframeRef:s,blockReason:w,onRetry:m,className:S=Ir,embedContext:v}){const{t:j}=le("app"),C=w??v??null,[$,E]=t.useState(0);t.useEffect(()=>{!e||o!=="unknown"||(E(d=>d+1),f("loading"))},[o,f,e]);const k=t.useCallback(()=>{const d=s.current;if(!d){f("embedded");return}try{if(d.contentWindow?.location?.href==="about:blank"&&d.src!=="about:blank"){f("blocked");return}}catch{}f("embedded")},[s,f]),u=t.useCallback(d=>{d.stopPropagation(),f("error")},[f]),l=t.useCallback(()=>{e&&window.open(e,"_blank","noopener,noreferrer")},[e]);return e?r.jsxs("div",{className:"devserver-preview-iframe-shell",children:[r.jsx("iframe",{src:e,ref:s,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:S,title:"Dev server preview",onLoad:k,onError:u,onErrorCapture:u,"data-testid":"devserver-preview-iframe"},`${e}-${$}`),o==="loading"&&r.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[r.jsx(ie,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:j("preview.loading","Loading preview...")})]}),o==="blocked"&&r.jsxs("div",{className:"devserver-preview-blocked-panel",role:"alert","data-testid":"devserver-preview-blocked-panel",children:[r.jsx(He,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:j("preview.blockedTitle","Preview cannot be embedded")}),C&&r.jsx("p",{className:"devserver-preview-blocked-context",children:C})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:j("preview.blockedDescription","You can view the preview in a separate browser tab.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:l,children:j("preview.openInNewTab","Open in new tab")}),m&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:m,children:j("actions.retry","Retry")})]})]}),o==="error"&&r.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[r.jsx(Be,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:j("preview.errorTitle","Unable to load preview")}),C&&r.jsx("p",{className:"devserver-preview-blocked-context",children:C})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:j("preview.blockedDescription","You can view the preview in a separate browser tab.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:l,children:j("preview.openInNewTab","Open in new tab")}),m&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:m,children:j("actions.retry","Retry")})]})]})]}):null}function Yr(e){return{stopped:{className:"dev-server-status-badge--stopped",label:e("devserver.status.stopped","Stopped")},starting:{className:"dev-server-status-badge--starting",label:e("devserver.status.starting","Starting...")},running:{className:"dev-server-status-badge--running",label:e("devserver.status.running","Running")},stopping:{className:"dev-server-status-badge--starting",label:e("devserver.status.stopping","Stopping...")},failed:{className:"dev-server-status-badge--failed",label:e("devserver.status.failed","Failed")}}}let ge=!1;function Pe(e){return e instanceof Error?e.message:String(e)}function Xe(e){return e==="."?"root":e}function Fe(e){return e?e==="root"?".":e:null}function $e(e,o,f){return!o||e.scriptName!==o?!1:f?Xe(e.cwd)===f:!0}function Gr(e){return e.cwd==="."?"root":e.cwd}function Qr(e){return e.length<=60?e:`${e.slice(0,60)}…`}function at({addToast:e,projectId:o,tasks:f}){const{t:s}=le("app");t.useEffect(()=>(Z({view:"DevServerView",trigger:ge?"route-active":"remount",projectId:o,replayAttempted:!1}),ge=!1,()=>{ge=!0,Z({view:"DevServerView",trigger:"route-inactive",projectId:o,replayAttempted:!1})}),[o]);const{session:w,detectedCommands:m,previewUrl:S,isLoading:v,error:j,startServer:C,stopServer:$,restartServer:E,setPreviewUrl:k,detectCommands:u,refresh:l}=Ur(o),d=w?.status??"stopped",M=d==="running"||d==="starting",U=Yr(s),_=U[d]??U.stopped,{entries:T,loading:R,loadingMore:z,hasMore:A,total:O,loadMore:h}=Ar(o,!!o),g=S,D=w?.config?.cwd??null,[B,P]=t.useState(!0),[V,N]=t.useState(""),[y,a]=t.useState(""),[n,p]=t.useState(null),[c,b]=t.useState(null),[x,L]=t.useState(null),W=t.useMemo(()=>(f??[]).filter(i=>i.column==="in-progress"&&typeof i.worktree=="string"&&i.worktree.length>0),[f]),X=t.useMemo(()=>W.find(i=>i.id===c)??null,[W,c]);t.useEffect(()=>{c&&!W.some(i=>i.id===c)&&b(null)},[W,c]);const[K,Ie]=t.useState("embedded"),Je=K==="embedded"?g:null,{embedStatus:H,setEmbedStatus:Ye,resetEmbedStatus:ee,iframeRef:G,isEmbedded:Ge,isBlocked:oe,blockReason:ce,retry:Se}=Or(Je),[Ne,J]=t.useState(!1),ke=t.useRef(H);t.useEffect(()=>{const i=ke.current!==H;oe&&i&&J(!0),H==="embedded"&&J(!1),ke.current=H},[H,oe]),t.useEffect(()=>{J(!1)},[g]);const re=t.useMemo(()=>{if(!n)return null;const i=Fe(D);return m.find(F=>!(F.scriptName!==n||i&&F.cwd!==i||w?.config?.command&&F.command!==w.config.command))??m.find(F=>$e(F,n,D))??null},[m,w?.config?.command,n,D]);t.useEffect(()=>{typeof u=="function"&&u().catch(i=>{e(Pe(i),"error")})},[e,u]),t.useEffect(()=>{if(n){P(!1);return}P(!0)},[n]),t.useEffect(()=>{if(w?.status==="running"||w?.status==="starting"){w.config?.command?.trim().length>0&&N(w.config.command);return}if(re){N(re.command);return}m.length>0&&N(i=>i.trim().length>0?i:m[0]?.command??"")},[m,re,w?.config?.command,w?.status]),t.useEffect(()=>{a(g??"")},[g]);const de=t.useCallback(()=>{g&&window.open(g,"_blank","noopener,noreferrer")},[g]),je=t.useCallback(()=>{J(!1),Se()},[Se]),Qe=t.useCallback(()=>{try{const i=G.current;if(i?.contentWindow){i.contentWindow.location.reload(),J(!1),ee();return}}catch{}if(!(!g||!G.current))try{const i=new URL(g);i.searchParams.set("_t",Date.now().toString()),G.current.src=i.toString(),J(!1),ee()}catch{G.current.src=g,J(!1),ee()}},[g,G,ee]),te=t.useCallback(async(i,F,Ce)=>{L(i);try{await F(),e(Ce,"success")}catch(ve){e(Pe(ve),"error")}finally{L(null)}},[e]),Ke=t.useCallback(i=>{p(i.scriptName),P(!1),N(i.command),e(s("devserver.toast.selectedScript","Selected {{name}} script.",{name:i.scriptName}),"success")},[e]),Ze=t.useCallback(()=>{p(null),P(!0),e(s("devserver.toast.clearedScript","Cleared selected dev server script."),"success")},[e]),er=t.useCallback(i=>{M&&i&&i!==c&&e(s("devserver.restartToApplyTask","Restart the dev server to apply the selected task's worktree."),"info"),b(i)},[e,M,c,s]),rr=()=>{const i=V.trim();if(i.length===0){e(s("devserver.toast.enterCommand","Enter a command before starting the dev server."),"warning");return}const F=Fe(D)??".",ve=X?.worktree??null??re?.cwd??F;te("start",()=>C(i,ve),s("devserver.toast.started","Dev server started."))},tr=()=>{te("stop",$,s("devserver.toast.stopped","Dev server stopped."))},sr=()=>{te("restart",E,s("devserver.toast.restarted","Dev server restarted."))},nr=()=>{const i=y.trim(),F=i.length>0?i:null;te("preview",()=>k(F),F?s("devserver.toast.previewUpdated","Preview URL updated."):s("devserver.toast.previewCleared","Preview URL override cleared."))},ar=t.useCallback(()=>{j&&l()},[j,l]),ir=d==="starting"||d==="running"||x!==null,lr=d==="stopped"||x!==null,or=d==="stopped"||d==="starting"||x!==null;return r.jsxs("div",{className:"dev-server-view","data-testid":"dev-server-view",children:[r.jsx(yr,{icon:Sr,title:s("devserver.title","Dev Server"),actions:r.jsxs(r.Fragment,{children:[r.jsx("span",{className:"dev-server-header-title",children:r.jsx("span",{className:`dev-server-status-badge ${_.className}`,"data-testid":"dev-server-status-badge",children:_.label})}),r.jsxs("div",{className:"dev-server-header-actions",children:[r.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:rr,disabled:ir,"data-testid":"dev-server-start-button",children:[r.jsx(Nr,{size:14}),r.jsx("span",{children:x==="start"?s("devserver.starting","Starting..."):s("devserver.start","Start")})]}),r.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:tr,disabled:lr,"data-testid":"dev-server-stop-button",children:[r.jsx(kr,{size:14}),r.jsx("span",{children:x==="stop"?s("devserver.stopping","Stopping..."):s("devserver.stop","Stop")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm",onClick:sr,disabled:or,"data-testid":"dev-server-restart-button",children:[r.jsx(jr,{size:14}),r.jsx("span",{children:x==="restart"?s("devserver.restarting","Restarting..."):s("devserver.restart","Restart")})]})]})]})}),r.jsxs("section",{className:"dev-server-panel dev-server-config","aria-label":s("devserver.configurationLabel","Dev server configuration"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:s("devserver.configuration","Configuration")}),v&&r.jsx("span",{className:"dev-server-muted",children:s("devserver.loading","Loading...")})]}),v&&!w&&m.length===0&&r.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[r.jsx(ie,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:s("devserver.loadingConfig","Loading dev server configuration...")})]}),j&&r.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[r.jsx("p",{children:j}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:ar,children:s("devserver.retry","Retry")})]}),r.jsxs("div",{className:"dev-server-section",children:[r.jsx("h3",{children:s("devserver.scriptSelection","Script Selection")}),n&&r.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[r.jsx("span",{className:"dev-server-candidate-name",children:n}),r.jsx("span",{className:"dev-server-candidate-source",children:D??"root"}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>P(!0),"data-testid":"dev-server-change-selection",children:s("devserver.change","Change")}),r.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Ze,"data-testid":"dev-server-clear-selection",children:s("devserver.clear","Clear")})]}),B&&m.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-empty-candidates",children:s("devserver.noScriptsDetected","No dev server scripts detected. Check that your project has a package.json with a dev, start, or similar script.")}),B&&m.length>0&&r.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:m.map(i=>{const F=$e(i,n,D);return r.jsxs("button",{type:"button",className:`dev-server-candidate ${F?"dev-server-candidate--selected":""}`,onClick:()=>Ke(i),"data-testid":`dev-server-candidate-${i.scriptName}-${Xe(i.cwd)}`,children:[r.jsx("span",{className:"dev-server-candidate-name",children:i.scriptName}),r.jsx("span",{className:"dev-server-candidate-command",children:Qr(i.command)}),r.jsx("span",{className:"dev-server-candidate-source",children:Gr(i)})]},`${i.cwd}::${i.scriptName}::${i.command}`)})})]}),r.jsxs("div",{className:"dev-server-section dev-server-executing-task-section",children:[r.jsx("h3",{children:s("devserver.executingTask","Executing Task")}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-task-picker",className:"dev-server-label",children:s("devserver.executingTask","Executing Task")}),r.jsxs("select",{id:"dev-server-task-picker",className:"input dev-server-task-picker",value:c??"",onChange:i=>er(i.target.value.length>0?i.target.value:null),disabled:W.length===0,"aria-label":s("devserver.executingTask","Executing Task"),"data-testid":"dev-server-task-picker",children:[r.jsx("option",{value:"",children:s("devserver.projectRootNoTask","Project root (no task)")}),W.map(i=>r.jsx("option",{value:i.id,children:i.title?`${i.id} — ${i.title}`:i.id},i.id))]}),W.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-no-executing-tasks",children:s("devserver.noExecutingTasks","No executing tasks with a worktree available. Start a task to target its worktree.")}),X&&r.jsxs("div",{className:"dev-server-task-descriptor","data-testid":"dev-server-task-descriptor",children:[r.jsx("div",{className:"dev-server-task-descriptor-header",children:r.jsx("span",{className:"dev-server-candidate-name",children:X.title?`${X.id} — ${X.title}`:X.id})}),r.jsx("p",{className:"dev-server-task-description",children:X.description}),r.jsxs("div",{className:"dev-server-task-worktree",children:[r.jsx("span",{className:"dev-server-label",children:s("devserver.targetWorktree","Target worktree")}),r.jsx("code",{children:X.worktree})]})]})]})]}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-command",className:"dev-server-label",children:s("devserver.command","Command")}),r.jsx("input",{id:"dev-server-command",className:"input",value:V,onChange:i=>N(i.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:d==="running"||d==="starting"})]}),(d==="running"||d==="starting")&&w&&r.jsxs("div",{className:"dev-server-current-command","data-testid":"dev-server-current-command",children:[r.jsx("span",{className:"dev-server-label",children:s("devserver.runningCommand","Running command")}),r.jsx("code",{children:w.config?.command??V})]}),r.jsxs("div",{className:"dev-server-preview-override",children:[r.jsx("label",{htmlFor:"dev-server-preview-input",className:"dev-server-label",children:s("devserver.previewUrlOverride","Preview URL Override")}),r.jsx("input",{id:"dev-server-preview-input",className:"input",type:"url",value:y,onChange:i=>a(i.target.value),placeholder:"http://localhost:3000","data-testid":"dev-server-preview-input"}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:nr,disabled:x==="preview","data-testid":"dev-server-set-preview",children:s("devserver.save","Save")})]}),g&&r.jsx("p",{className:"dev-server-preview-hint",children:s("devserver.autoDetected","Auto-detected: {{url}}",{url:g})})]}),r.jsx("div",{className:"dev-server-content",children:r.jsxs("section",{className:"dev-server-panel dev-server-logs-panel","data-testid":"dev-server-logs-panel","aria-label":s("devserver.logsLabel","Dev server logs"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:s("devserver.logs","Logs")}),r.jsx("span",{className:"dev-server-muted",children:s("devserver.lines","{{count}} lines",{count:O??T.length})})]}),r.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:r.jsx(Xr,{entries:T,loading:R,loadingMore:z,hasMore:A,total:O,onLoadMore:h,isRunning:M})})]})}),r.jsxs("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":s("devserver.previewLabel","Dev server preview"),children:[r.jsxs("div",{className:"devserver-preview-header",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(Cr,{size:14}),r.jsx("span",{children:s("devserver.preview","Preview")})]}),r.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:g??s("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:[s("devserver.auto","Auto"),g?` · ${g}`:s("devserver.notAvailable"," · Not available")]}),r.jsxs("div",{className:"devserver-preview-actions",children:[r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>Ie(i=>i==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:K==="embedded"?s("devserver.externalOnly","External only"):s("devserver.embedded","Embedded")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:s("devserver.openInNewTab","Open in new tab"),onClick:de,disabled:!g,"data-testid":"devserver-preview-open-tab",children:r.jsx(Er,{})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:s("devserver.refreshPreview","Refresh preview"),onClick:Qe,disabled:!g,"data-testid":"devserver-preview-refresh",children:r.jsx(Lr,{})})]})]}),r.jsxs("div",{className:"devserver-preview-container","data-embed-status":H,"data-embedded":Ge?"true":"false",children:[!g&&!M&&r.jsx("p",{className:"devserver-preview-empty",children:s("devserver.startDevServer","Start a dev server to see a live preview here.")}),!g&&M&&r.jsx("p",{className:"devserver-preview-empty",children:s("devserver.noPreviewDetected","No preview URL detected. Start the dev server or set a manual URL to preview your app.")}),g&&K==="external"&&r.jsxs("div",{className:"devserver-preview-external-only","data-testid":"devserver-preview-external-only",children:[r.jsx("p",{children:s("devserver.embeddedPreviewDisabled","Embedded preview is disabled. Open your app in a separate browser tab.")}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm touch-target",onClick:de,"data-testid":"devserver-preview-external-open-tab",children:s("devserver.openInNewTab","Open in new tab")})]}),g&&K==="embedded"&&Ne&&oe&&r.jsxs("div",{className:H==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[H==="error"?r.jsx(Be,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):r.jsx(He,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:H==="error"?s("devserver.previewFailed","Preview failed"):s("devserver.previewBlocked","Preview blocked")}),ce&&r.jsx("p",{className:"devserver-preview-blocked-context",children:ce})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:s("devserver.openPreviewOrRetry","Open the preview in a new tab, or retry embedded mode after checking your server settings.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:de,"data-testid":"devserver-preview-fallback-open-tab",children:s("devserver.openPreviewInNewTab","Open preview in new tab")}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:je,"data-testid":"devserver-preview-fallback-retry",children:s("devserver.retryEmbeddedPreview","Retry embedded preview")})]})]}),g&&K==="embedded"&&!Ne&&r.jsx(Jr,{url:g,embedStatus:H,onEmbedStatusChange:Ye,iframeRef:G,blockReason:ce,onRetry:je})]})]})]})}export{at as DevServerView};
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-xterm-BNq00GSj.js","assets/vendor-react-SZ_qB27O.js","assets/vendor-xterm-LZoznX6r.css","assets/addon-fit-C1WQXRvu.js","assets/addon-unicode11-BVmNDUBM.js","assets/addon-webgl-uLc0RKcC.js"])))=>i.map(i=>d[i]);
2
- import{U as fe,W as K,Y as te,$ as U,a0 as ye,a1 as be,D as he,a2 as $,a3 as we,a4 as _e,a5 as Se,_ as A,a6 as ke,a7 as ve}from"./index-ccFe_1av.js";import{r as n,j as e}from"./vendor-react-SZ_qB27O.js";import"./vendor-xterm-BNq00GSj.js";import{u as Ee}from"./vendor-i18n-GF3RlKbq.js";import{S as Te}from"./shield-alert-DkGlhVjI.js";import"./vendor-reactflow-Bg-Qjzh8.js";import"./vendor-codemirror-jBKmHyH0.js";const Ce=32*1024,xe=100,ge="\x1B",Ne=" ",Re="",je="\x1B[A",De="\x1B[B",Pe="\x1B[C",Me="\x1B[D",L={ctrl:"Ctrl",escape:"Esc",tab:"Tab",ctrlC:"^C"};function ne(d){if(d.length!==1)return null;const i=d.toUpperCase().charCodeAt(0);return i>=64&&i<=95?String.fromCharCode(i&31):null}function Ae(){const[d,r]=n.useState(()=>$());return n.useEffect(()=>{if(typeof window>"u"||typeof window.matchMedia!="function")return;const i=window.matchMedia(we),s=()=>r($());return s(),typeof i.addEventListener=="function"?(i.addEventListener("change",s),()=>i.removeEventListener("change",s)):(i.addListener(s),()=>i.removeListener(s))},[]),d}function Le(d,r){if(typeof window>"u")return"";const s=`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}/api/cli-sessions/ws?sessionId=${encodeURIComponent(d)}&ticket=${encodeURIComponent(r)}`;return ve(s)}function Be(d){if(typeof window<"u"&&typeof window.atob=="function"){const r=window.atob(d),i=new Uint8Array(r.length);for(let s=0;s<r.length;s++)i[s]=r.charCodeAt(s);return new TextDecoder("utf-8").decode(i)}return Buffer.from(d,"base64").toString("utf8")}function Ve({sessionId:d,readOnly:r=!1,posture:i,mode:s="live",projectId:B,onConfirmAdvance:S,showConfirmAdvance:F=!1,onOpenAdapterSettings:Q}){const{t:a}=Ee("app"),k=n.useRef(null),x=n.useRef(null),g=n.useRef(null),_=n.useRef(null),[V,Y]=n.useState(!1),[ie,O]=n.useState(!1),[J,G]=n.useState(!1),v=Ae(),{keyboardOpen:N,keyboardOverlap:se}=fe({enabled:v}),oe=n.useRef(null),[b,H]=n.useState(""),[E,R]=n.useState(!1),f=n.useCallback(t=>{if(!t)return;const o=_.current;o?.readyState===WebSocket.OPEN&&o.send(JSON.stringify({type:"input",data:t}))},[]),T=n.useCallback(t=>{if(E){const o=ne(t);if(R(!1),o){f(o);return}}f(t)},[E,f]),c=n.useCallback(t=>{t.preventDefault()},[]),Z=n.useCallback(t=>{t?.preventDefault?.(),b&&f(b),f("\r"),H("")},[b,f]),ae=n.useCallback(t=>{if(E&&t.length>b.length){const o=t.slice(b.length,b.length+1),h=ne(o);if(R(!1),h){f(h);return}}H(t)},[E,b,f]);n.useEffect(()=>{F&&O(!1)},[F,d]);const q=n.useCallback(()=>{const t=x.current;if(!t)return;const o=K();t.options.fontFamily=te(o.fontFamily),k.current?.style.setProperty("--terminal-glyph-font-family",U(o.fontFamily)),t.options.fontSize=o.fontSize,t.options.cursorStyle=o.cursorStyle,t.options.cursorBlink=o.cursorBlink&&!r&&s==="live";try{g.current?.fit?.()}catch{}},[s,r]);n.useEffect(()=>{if(typeof window>"u")return;const t=o=>{o.key===_e&&q()};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)},[q]),n.useEffect(()=>{if(!d||typeof window>"u")return;let t=!1,o=null,h=null,D=0;const z=(u,y)=>{const P=_.current;P?.readyState===WebSocket.OPEN&&P.send(JSON.stringify({type:"resize",cols:u,rows:y}))},de=u=>{if(D+=u,D<Ce)return;const y=_.current;y?.readyState===WebSocket.OPEN&&y.send(JSON.stringify({type:"ack",bytes:D})),D=0};return(async()=>{let u;try{u=await Se(`/cli-sessions/${encodeURIComponent(d)}/attach-ticket`,{method:"POST",body:JSON.stringify(B?{projectId:B}:{})})}catch{return}if(t)return;const[{Terminal:y},{FitAddon:P},{Unicode11Addon:ue}]=await Promise.all([A(()=>import("./vendor-xterm-BNq00GSj.js").then(m=>m.x),__vite__mapDeps([0,1,2])),A(()=>import("./addon-fit-C1WQXRvu.js").then(m=>m.a),__vite__mapDeps([3,1])),A(()=>import("./addon-unicode11-BVmNDUBM.js").then(m=>m.a),__vite__mapDeps([4,1]))]);if(t||!k.current)return;const w=K(),I=te(w.fontFamily);k.current.style.setProperty("--terminal-glyph-font-family",U(w.fontFamily));const l=new y({convertEol:!1,cursorBlink:w.cursorBlink&&!r&&s==="live",cursorStyle:w.cursorStyle,disableStdin:r,scrollback:1e4,fontFamily:I,fontSize:w.fontSize}),C=new P;l.loadAddon(C);const me=new ue;if(l.loadAddon(me),l.unicode.activeVersion="11",l.open(k.current),x.current=l,g.current=C,w.renderer==="auto"&&!$())try{const{WebglAddon:m}=await A(async()=>{const{WebglAddon:p}=await import("./addon-webgl-uLc0RKcC.js").then(M=>M.a);return{WebglAddon:p}},__vite__mapDeps([5,1]));if(!t){const p=new m;p.onContextLoss(()=>{try{p.dispose()}catch{}}),l.loadAddon(p)}}catch{}try{C.fit()}catch{}(async()=>{if(!(!await ke(w.fontSize,I)||t||x.current!==l||g.current!==C))try{l.options.fontFamily=I,l.options.fontSize=w.fontSize,C.fit(),z(l.cols,l.rows),l.refresh(0,Math.max(0,l.rows-1))}catch{}})(),r||l.onData(m=>{const p=_.current;p?.readyState===WebSocket.OPEN&&p.send(JSON.stringify({type:"input",data:m}))}),o=new ResizeObserver(()=>{h&&clearTimeout(h),h=setTimeout(()=>{try{C.fit(),z(l.cols,l.rows)}catch{}},xe)}),o.observe(k.current);const W=new WebSocket(Le(d,u.ticket));_.current=W,W.onopen=()=>{z(l.cols,l.rows)},W.onmessage=m=>{let p;try{p=JSON.parse(typeof m.data=="string"?m.data:"")}catch{return}switch(p.type){case"scrollback":case"data":{if(typeof p.data!="string")return;const M=Be(p.data),pe=M.length;l.write(M,()=>de(pe));break}}}})(),()=>{t=!0,h&&clearTimeout(h),o&&o.disconnect();const u=_.current;if(u){u.onopen=null,u.onmessage=null,u.onclose=null,u.onerror=null;try{u.close()}catch{}_.current=null}const y=x.current;if(y){try{y.dispose()}catch{}x.current=null}g.current=null}},[d,r,s,B]);const X=n.useMemo(()=>s==="idle"?a("cliTerminal.replayIdle","Session idle"):s==="ended"?a("cliTerminal.replayEnded","Session ended"):null,[s,a]),le=n.useCallback(async()=>{if(S){G(!0);try{await S("advance"),O(!0)}finally{G(!1)}}},[S]),re=n.useCallback(async()=>{S&&await S("not-yet"),O(!0)},[S]),j=!!i?.elevated,ee=i?.elevatedFlags?.join(", "),ce={"--terminal-glyph-font-family":U(K().fontFamily)};return e.jsxs("div",{className:`cli-session-terminal${v?" cli-session-terminal--mobile":""}${v&&N?" cli-session-terminal--keyboard-open":""}`,"data-mode":s,"data-read-only":r,"data-mobile":v,"data-keyboard-open":v&&N,children:[e.jsxs("header",{className:"cli-session-terminal__header",children:[i&&e.jsxs("div",{className:"cli-session-terminal__posture-wrap",children:[e.jsxs("button",{type:"button",className:`cli-posture-chip${j?" cli-posture-chip--elevated":""}`,"data-elevated":j,"aria-expanded":V,onClick:()=>Y(t=>!t),children:[j?e.jsx(Te,{size:13,"aria-hidden":"true"}):e.jsx(ye,{size:13,"aria-hidden":"true"}),e.jsx("span",{className:"cli-posture-chip__name",children:i.adapterName}),i.mode&&e.jsx("span",{className:"cli-posture-chip__mode",children:i.mode}),j&&ee&&e.jsx("span",{className:"cli-posture-chip__flag",children:ee})]}),V&&e.jsxs("div",{className:"cli-posture-tooltip",role:"tooltip",children:[e.jsx("p",{className:"cli-posture-tooltip__title",children:a("cliTerminal.postureResolved","Resolved posture")}),e.jsxs("ul",{className:"cli-posture-tooltip__list",children:[(i.resolved??[]).map((t,o)=>e.jsx("li",{children:t},o)),(i.resolved??[]).length===0&&e.jsx("li",{children:i.mode??a("cliTerminal.postureBaseline","Baseline")})]}),Q&&e.jsxs("button",{type:"button",className:"cli-posture-tooltip__settings",onClick:()=>{Y(!1),Q()},children:[e.jsx(be,{size:12,"aria-hidden":"true"}),a("cliTerminal.adapterSettings","Adapter settings")]})]})]}),r&&e.jsxs("span",{className:"cli-session-terminal__readonly-badge",children:[e.jsx(he,{size:12,"aria-hidden":"true"}),a("cliTerminal.readOnly","Read-only")]}),X&&e.jsx("span",{className:"cli-session-terminal__replay-badge","data-replay-mode":s,children:X})]}),e.jsx("div",{className:"cli-session-terminal__viewport",ref:k,"data-testid":"cli-terminal-viewport",style:ce}),F&&!ie&&e.jsxs("div",{className:"cli-session-terminal__advance-strip",role:"region",children:[e.jsx("span",{className:"cli-session-terminal__advance-copy",children:a("cliTerminal.advancePrompt","This session looks idle — advance to review?")}),e.jsxs("div",{className:"cli-session-terminal__advance-actions",children:[e.jsx("button",{type:"button",className:"cli-session-terminal__advance-btn",disabled:J,onClick:le,children:a("cliTerminal.advance","Advance")}),e.jsx("button",{type:"button",className:"cli-session-terminal__advance-btn cli-session-terminal__advance-btn--secondary",disabled:J,onClick:re,children:a("cliTerminal.notYet","Not yet")})]})]}),v&&!r&&e.jsxs("div",{className:`cli-session-terminal__mobile-bar${N?" cli-session-terminal__mobile-bar--keyboard-open":""}`,"data-testid":"cli-terminal-mobile-bar",style:N?{bottom:`${se}px`}:void 0,children:[e.jsxs("div",{className:"cli-session-terminal__key-row","data-testid":"cli-terminal-key-bar",children:[e.jsx("button",{type:"button",className:`cli-terminal-key cli-terminal-key--ctrl${E?" cli-terminal-key--active":""}`,"data-testid":"cli-key-ctrl","aria-label":a("cliTerminal.mobileKeyCtrl","Sticky Ctrl modifier"),"aria-pressed":E,onPointerDown:c,onMouseDown:c,onClick:()=>R(t=>!t),children:L.ctrl}),e.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-esc","aria-label":a("cliTerminal.mobileKeyEsc","Send Escape"),onPointerDown:c,onMouseDown:c,onClick:()=>T(ge),children:L.escape}),e.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-tab","aria-label":a("cliTerminal.mobileKeyTab","Send Tab"),onPointerDown:c,onMouseDown:c,onClick:()=>T(Ne),children:L.tab}),e.jsx("button",{type:"button",className:"cli-terminal-key cli-terminal-key--ctrlc","data-testid":"cli-key-ctrl-c","aria-label":a("cliTerminal.mobileKeyCtrlC","Send Ctrl-C"),onPointerDown:c,onMouseDown:c,onClick:()=>{R(!1),f(Re)},children:L.ctrlC}),e.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-arrow-up","aria-label":a("cliTerminal.mobileKeyArrowUp","Cursor up"),onPointerDown:c,onMouseDown:c,onClick:()=>T(je),children:"↑"}),e.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-arrow-down","aria-label":a("cliTerminal.mobileKeyArrowDown","Cursor down"),onPointerDown:c,onMouseDown:c,onClick:()=>T(De),children:"↓"}),e.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-arrow-left","aria-label":a("cliTerminal.mobileKeyArrowLeft","Cursor left"),onPointerDown:c,onMouseDown:c,onClick:()=>T(Me),children:"←"}),e.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-arrow-right","aria-label":a("cliTerminal.mobileKeyArrowRight","Cursor right"),onPointerDown:c,onMouseDown:c,onClick:()=>T(Pe),children:"→"})]}),e.jsxs("form",{className:"cli-session-terminal__input-row",onSubmit:Z,children:[e.jsx("input",{ref:oe,type:"text",className:"cli-session-terminal__mobile-input","data-testid":"cli-terminal-mobile-input",value:b,placeholder:a("cliTerminal.mobileInputPlaceholder","Type to send to the session…"),autoCapitalize:"off",autoCorrect:"off",autoComplete:"off",spellCheck:!1,onChange:t=>ae(t.target.value)}),e.jsx("button",{type:"submit",className:"cli-session-terminal__mobile-send","data-testid":"cli-terminal-mobile-send","aria-label":a("cliTerminal.mobileSend","Send"),onPointerDown:c,onMouseDown:c,onClick:()=>Z(),children:a("cliTerminal.mobileSend","Send")})]})]})]})}export{Ve as SessionTerminal};
@@ -1 +0,0 @@
1
- .settings-header-actions{--settings-header-action-height: calc(var(--space-md) * 2 + var(--space-xs) / 2);display:flex;align-items:stretch;gap:var(--space-xs);margin-left:auto;margin-right:var(--space-sm)}.settings-header-actions>.settings-github-star-btn,.settings-header-actions>.settings-header-discord-btn{height:var(--settings-header-action-height);box-sizing:border-box}.settings-header-discord-btn,.settings-footer-help-btn{display:inline-flex;align-items:center}@media(max-width:768px){.settings-modal .modal-header{flex-wrap:nowrap;align-items:center;column-gap:var(--space-sm)}.settings-modal-heading{flex:1 1 0;min-width:0}.settings-header-actions{margin-left:auto;margin-right:var(--space-sm)}}.settings-github-star-btn{display:inline-flex;align-items:stretch;border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-pill);background:var(--card);color:var(--text);font-size:12px;font-weight:500;text-decoration:none;overflow:hidden;transition:border-color var(--transition-fast),background var(--transition-fast)}.settings-github-star-btn:hover{border-color:var(--text-muted);background:var(--card-hover)}.settings-github-star-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-color:var(--todo)}.settings-github-star-btn__action{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) calc(var(--space-sm) + var(--space-xs) / 2)}.settings-github-star-btn__count{display:inline-flex;align-items:center;padding:var(--space-xs) calc(var(--space-sm) + var(--space-xs) / 4);border-left:var(--btn-border-width) solid var(--border);background:color-mix(in srgb,var(--surface) 60%,var(--card));color:var(--text-muted);font-variant-numeric:tabular-nums}.settings-modal{width:min(95vw,1100px);max-width:95vw;min-width:520px;height:80vh;min-height:480px;max-height:calc(100dvh - var(--overlay-padding-top, 10vh) - 16px);overflow:hidden;resize:both}.settings-embedded.right-dock-embedded-view{display:flex;flex:1;width:100%;height:100%;min-height:0;padding:0;overflow:hidden}.settings-embedded .settings-modal--embedded{flex:1;width:100%;max-width:none;min-width:0;height:100%;min-height:0;max-height:none;resize:none;box-shadow:none;border:none;border-radius:0;background:transparent;position:static}.settings-modal--embedded .modal-header--embedded{box-sizing:border-box;display:flex;align-items:center;gap:var(--space-sm);min-height:var(--view-header-min-height);padding:var(--space-lg) var(--space-xl);background:var(--surface);border-bottom:none;flex-shrink:0}.settings-modal--embedded .modal-header--embedded .settings-header-actions{margin-left:auto}.settings-modal--embedded .modal-header--embedded .settings-modal-heading h3{display:flex;align-items:center;gap:var(--space-sm);font-size:1.125rem;font-weight:600;color:var(--text);letter-spacing:normal}.settings-modal--embedded .modal-header--embedded .settings-modal-heading svg{color:var(--todo);flex-shrink:0}.settings-modal--embedded .modal-actions{background:transparent;flex-shrink:0;padding-bottom:var(--space-sm)}@media(max-width:768px){.modal-overlay.settings-modal-overlay,.modal-overlay:has(.settings-modal:not(.settings-modal--embedded)){padding:0;inset:0;align-items:stretch;justify-content:stretch}.modal.settings-modal:not(.settings-modal--embedded){width:100vw;min-width:0;max-width:100vw;height:100dvh;min-height:100dvh;max-height:100dvh;margin:0;border:none;border-radius:0;resize:none;flex:1 1 auto}.modal.settings-modal:not(.settings-modal--embedded)[style*=--keyboard-overlap]{height:var(--vv-height, 100dvh);min-height:var(--vv-height, 100dvh);max-height:var(--vv-height, 100dvh);transform:translateY(var(--vv-offset-top, 0px));will-change:transform}.settings-embedded.right-dock-embedded-view{padding:var(--space-sm)}.settings-embedded .settings-modal--embedded{width:100%;height:100%}}.settings-modal-heading{display:flex;flex-direction:column;gap:var(--space-xs)}.settings-modal-heading h3{margin:0}.settings-modal-version{margin:0;font-size:.85rem;color:var(--text-muted);font-weight:500}.settings-modal-footer-version{display:flex;align-items:center;gap:var(--space-xs);margin-right:var(--space-sm);min-width:0}.settings-update-check{display:flex;align-items:center;gap:var(--space-sm);min-width:0}@media(max-width:768px){.settings-modal-footer-version{flex:1 1 100%;margin-right:0}.settings-update-check{flex-wrap:wrap;row-gap:var(--space-xs)}.settings-update-result{flex:1 1 100%}.settings-footer-help-btn{flex-shrink:0}}.settings-version-check-btn{--settings-inline-touch-target: calc(var(--space-lg) + var(--space-lg) + var(--space-xs));display:inline-flex;align-items:center;gap:var(--space-xs);margin:0;min-height:var(--settings-inline-touch-target);padding:var(--space-xs) var(--space-sm);border:none;background:transparent;color:var(--text-muted);cursor:pointer;transition:opacity var(--transition-fast),box-shadow var(--transition-fast)}.settings-version-check-btn:hover:not(:disabled){opacity:.85}.settings-version-check-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-radius:var(--radius-sm)}.settings-version-check-btn:disabled{cursor:default;opacity:.7}.settings-version-check-btn svg{color:var(--text-muted)}.settings-version-check-btn svg.spinning{animation:settings-update-spin 1s linear infinite}.settings-update-result{display:inline-flex;align-items:center;flex-wrap:wrap;gap:var(--space-xs);font-size:.85rem;font-weight:500}.settings-update-result--up-to-date{color:var(--color-success)}.settings-update-result--available{color:var(--color-info)}.settings-update-result--error{color:var(--color-error)}.settings-update-result-link{color:var(--color-info);text-decoration:underline;transition:color var(--transition-fast),box-shadow var(--transition-fast)}.settings-update-result-link:hover{color:color-mix(in srgb,var(--color-info) 80%,var(--text))}.settings-update-result-link:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-radius:var(--radius-sm)}.settings-update-now-btn{display:inline-flex;align-items:center;gap:var(--space-xs);min-height:calc(var(--space-lg) + var(--space-sm));color:var(--text)}.settings-update-now-btn:disabled{color:var(--color-warning)}.settings-update-now-btn svg.spinning{animation:settings-update-spin 1s linear infinite}.settings-update-install-status{color:var(--text-muted)}.settings-update-install-status--success{color:var(--color-success)}.settings-update-install-status--error{color:var(--color-error)}@keyframes settings-update-spin{to{transform:rotate(360deg)}}.backup-stats{display:flex;align-items:center;gap:var(--space-lg);padding:var(--space-sm) var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--surface) 85%,transparent)}.backup-stat{display:flex;flex:1 1 0;flex-direction:column;align-items:center;gap:var(--space-xs);min-width:0}.backup-stat-value{color:var(--text);font-size:1rem;font-weight:600;font-variant-numeric:tabular-nums}.backup-stat-label{color:var(--text-muted);font-size:.75rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase}.backup-list{margin-top:var(--space-sm)}.backup-list summary{padding:var(--space-sm) 0;color:var(--text-muted);cursor:pointer;transition:color var(--transition-fast)}.backup-list summary:hover{color:var(--text)}.backup-list summary:focus-visible{outline:none;border-radius:var(--radius-sm);box-shadow:var(--focus-ring-strong)}.backup-list ul{display:flex;flex-direction:column;gap:var(--space-xs);margin:0;margin-top:var(--space-sm);padding:0;list-style:none}.backup-list li{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);padding:var(--space-sm) 0;border-top:var(--btn-border-width) solid color-mix(in srgb,var(--border) 80%,transparent)}.backup-list li code{min-width:0;color:var(--text);font-family:var(--font-mono);font-size:.75rem;white-space:nowrap;overflow-x:auto}.backup-size{color:var(--text-muted);font-family:var(--font-mono);font-size:.75rem;text-align:right;white-space:nowrap}@media(max-width:768px){.backup-stats{flex-direction:column;align-items:stretch;gap:var(--space-sm)}.backup-stat{align-items:flex-start}.backup-list ul{max-height:calc(var(--space-xl) * 9 + var(--space-md));overflow-y:auto;-webkit-overflow-scrolling:touch}.backup-list li code{white-space:normal;overflow-wrap:anywhere;word-break:normal}}.settings-layout{display:flex;flex:1;flex-direction:row;min-height:0;overflow:hidden}.settings-mobile-section-picker{display:none}.settings-sidebar{width:170px;min-width:170px;border-right:1px solid var(--border);display:flex;flex-direction:column;overflow-y:auto;padding:var(--space-sm) var(--space-sm);gap:calc(var(--space-xs) / 2);background:color-mix(in srgb,var(--text) 10%,transparent);scrollbar-color:var(--border) transparent;scrollbar-width:thin}.settings-sidebar::-webkit-scrollbar{width:6px}.settings-sidebar::-webkit-scrollbar-track{background:transparent}.settings-sidebar::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-sm)}.settings-sidebar::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.settings-research-source-locked{cursor:default;color:var(--text-muted)!important}.settings-research-source-locked input[type=checkbox]{cursor:not-allowed}.settings-research-source-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-sm);min-width:0}.settings-research-source-grid>*{min-width:0}.settings-research-limits-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-sm);min-width:0}.settings-research-limits-grid>*{min-width:0}.settings-research-limit-field{display:flex;flex-direction:column;gap:var(--space-xs);min-width:0}.settings-research-limits-error{grid-column:1 / -1}@media(max-width:768px){.settings-research-source-grid,.settings-research-limits-grid{grid-template-columns:1fr}}.settings-nav-item{display:block;width:100%;padding:var(--space-sm) var(--space-md);font-size:13px;font-weight:500;color:var(--text-muted);background:none;border:none;border-left:3px solid transparent;border-radius:0 var(--radius-md) var(--radius-md) 0;cursor:pointer;text-align:left;transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast)}.settings-nav-item:hover{background:var(--bg);color:var(--text);border-left-color:var(--border)}.settings-nav-item:focus-visible{box-shadow:var(--focus-ring-strong);outline:none}.settings-nav-item.active{background:var(--bg);color:var(--todo);font-weight:600;border-left-color:var(--todo)}.settings-group-header{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);padding:var(--space-md) var(--space-md) var(--space-xs);margin-top:var(--space-sm);user-select:none}.settings-group-header:first-child{margin-top:0}.settings-content{flex:1;overflow-x:hidden;overflow-y:auto;padding:var(--space-md) var(--space-xl) var(--space-lg);scrollbar-color:var(--border) transparent;scrollbar-width:thin}.settings-content::-webkit-scrollbar{width:6px}.settings-content::-webkit-scrollbar-track{background:transparent}.settings-content::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-sm)}.settings-content::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.settings-content>*{animation:settingsFadeIn var(--duration-normal) ease}@keyframes settingsFadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.settings-section-heading{font-size:14px;font-weight:600;padding:var(--space-lg) 0 var(--space-md);margin:0 0 var(--space-md);color:var(--text);border-bottom:1px solid var(--border)}.settings-content>.settings-section-heading:first-child,.settings-modal-section>.settings-section-heading:first-child{padding-top:var(--space-md)}.settings-section-heading--spaced{margin-top:var(--space-lg)}.settings-section-description{margin:0;margin-bottom:var(--space-sm);color:var(--text-muted);font-size:13px;line-height:1.5}.settings-plugins-subsection-toggle{display:inline-flex;gap:var(--space-xs);margin:var(--space-md) 0}.settings-plugins-subsection-btn{display:inline-flex;align-items:center;justify-content:center;border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-pill);background:var(--surface);color:var(--text-muted);font-size:.85rem;font-weight:600;padding:var(--space-xs) var(--space-md);cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast),box-shadow var(--transition-fast)}.settings-plugins-subsection-btn:hover{background:var(--surface-hover, color-mix(in srgb, var(--text) 6%, transparent));color:var(--text)}.settings-plugins-subsection-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.settings-plugins-subsection-btn.active{background:color-mix(in srgb,var(--todo) 14%,transparent);border-color:color-mix(in srgb,var(--todo) 45%,var(--border));color:var(--todo)}.settings-plugins-subsection-panel{padding-bottom:var(--space-md)}.settings-scope-icon{margin-right:6px;display:inline-flex;vertical-align:middle;color:var(--text-muted)}.settings-scope-banner{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-xl);margin:0 var(--space-xl) var(--space-xs);font-size:12px;border-radius:var(--radius-md);color:var(--text-muted)}.settings-scope-global{background:color-mix(in srgb,var(--color-info) 8%,transparent);border-left:3px solid color-mix(in srgb,var(--color-info) 40%,transparent)}.settings-scope-project{background:color-mix(in srgb,var(--color-success) 8%,transparent);border-left:3px solid color-mix(in srgb,var(--color-success) 40%,transparent)}.settings-scope-mixed{background:color-mix(in srgb,var(--triage) 8%,transparent);border-left:3px solid color-mix(in srgb,var(--triage) 40%,transparent)}.settings-note{display:block;padding:0 var(--space-xl);margin-top:var(--space-xs);font-size:12px;color:var(--text-muted)}.form-inline-group{display:flex;align-items:center;gap:var(--space-sm)}.form-inline-group .input{flex:1;min-width:0}.btn-link{background:none;border:none;padding:0;font-size:12px;color:var(--accent, #4a90e2);cursor:pointer;text-decoration:underline;white-space:nowrap}.btn-link:hover{text-decoration:none}.settings-overlap-ignore-group code{font-family:var(--font-mono);font-size:.9em}.settings-button-row{display:flex;flex-wrap:wrap;gap:var(--space-sm);margin-top:var(--space-sm)}.settings-raw-output{margin:var(--space-sm) 0 0;padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text-muted);max-height:calc(var(--space-2xl) * 7);overflow:auto;font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs))}.settings-url-output{display:block;margin-top:var(--space-xs);padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text-muted);font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs));overflow-wrap:anywhere;word-break:break-word;overflow-x:auto;max-width:100%}.settings-qr-preview{margin-top:var(--space-sm);display:flex;flex-direction:column;gap:var(--space-sm)}.settings-qr-preview-label{margin:0;font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted)}.settings-qr-preview-image-wrap{width:fit-content;max-width:100%;padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--card)}.settings-qr-preview-image{display:block;width:min(calc(var(--space-2xl) * 6),100%);height:auto;aspect-ratio:1 / 1}.remote-provider-selector{display:flex;gap:var(--space-xs);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);padding:var(--space-xs);background:var(--surface)}.remote-provider-option{position:relative;flex:1;cursor:pointer}.remote-provider-option input{position:absolute;opacity:0;width:0;height:0}.remote-provider-option span{display:block;padding:var(--space-sm) var(--space-md);text-align:center;border-radius:var(--radius-sm);border:var(--btn-border-width) solid transparent;color:var(--text-muted);transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast)}.remote-provider-option-content{display:inline-flex;align-items:center;gap:var(--space-xs)}.remote-provider-option input:checked+span{background:var(--card);color:var(--text);border-color:var(--border)}.remote-provider-option input:focus-visible+span{box-shadow:var(--focus-ring-strong)}.remote-status-bar{--status-color: var(--text-muted);display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-md);margin:0 var(--space-xl) var(--space-md);background:color-mix(in srgb,var(--status-color) 10%,transparent)}.remote-status-bar--running{--status-color: var(--color-success)}.remote-status-bar--starting{--status-color: var(--color-warning)}.remote-status-bar--error{--status-color: var(--color-error)}.remote-status-bar--stopped{--status-color: var(--text-muted)}.remote-share-block{display:flex;flex-direction:column;gap:var(--space-sm);margin:0 var(--space-xl) var(--space-md);padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--text-muted) 5%,transparent)}.remote-share-row{display:flex;flex-direction:column;gap:var(--space-xs)}.remote-share-row .settings-qr-preview-image{margin-top:var(--space-xs)}.remote-status-dot{width:var(--space-sm);height:var(--space-sm);border-radius:50%;display:inline-block;flex-shrink:0}.remote-status-dot--running{background:var(--color-success)}.remote-status-dot--starting{background:var(--color-warning)}.remote-status-dot--error{background:var(--color-error)}.remote-status-dot--stopped{background:var(--text-muted)}.remote-status-url{margin-left:auto;font-family:var(--font-mono);overflow-wrap:anywhere;word-break:break-word;user-select:all}.remote-provider-settings{display:flex;flex-direction:column;gap:var(--space-sm)}.remote-cli-detection{display:flex;align-items:flex-start;gap:var(--space-sm);margin:0 var(--space-xl) var(--space-md);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-sm)}.remote-cli-detection--available{background:color-mix(in srgb,var(--color-success) 10%,transparent);color:var(--color-success)}.remote-cli-detection--missing{background:color-mix(in srgb,var(--color-warning) 10%,transparent);color:var(--color-warning)}.remote-cli-detection-content{display:flex;flex-direction:column;gap:var(--space-xs);color:var(--text)}.remote-cli-detection .btn{align-self:flex-start}.remote-cli-install-error{color:var(--color-error)}.remote-cli-manual{color:var(--text-dim)}.remote-external-tunnel-panel{display:flex;flex-direction:column;gap:var(--space-sm);margin:0 var(--space-xl) var(--space-md);padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--color-info) 10%,transparent)}.remote-external-tunnel-header{display:flex;align-items:center;gap:var(--space-sm);color:var(--color-info)}.remote-external-tunnel-qr{display:flex;flex-direction:column;gap:var(--space-xs)}.remote-external-tunnel-actions{display:flex;flex-direction:column;gap:var(--space-sm)}.remote-advanced-details{margin:var(--space-lg) var(--space-xl) 0;border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);padding:var(--space-md);background:var(--surface)}.remote-advanced-details>summary{cursor:pointer;color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));list-style:none}.remote-advanced-details>summary::-webkit-details-marker{display:none}.remote-advanced-details>summary:before{content:"▸";margin-right:var(--space-xs)}.remote-advanced-details[open]>summary:before{content:"▾"}.settings-option-details{margin-top:var(--space-xs)}.settings-research-provider-group{display:flex;flex-direction:column;gap:var(--space-sm);min-width:0}.settings-research-provider-advanced-details{min-width:0;padding-inline-start:var(--space-md)}.settings-research-provider-advanced-body{display:flex;flex-direction:column;gap:var(--space-sm);min-width:0;padding-top:var(--space-sm)}.settings-research-provider-advanced-body>.form-group{margin-top:0;padding:0;min-width:0}.settings-research-provider-advanced-body .input{width:100%;min-width:0}.settings-research-empty-state{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm);min-width:0}@media(max-width:768px){.settings-research-provider-advanced-details{padding-inline-start:0}}.settings-option-details>summary{cursor:pointer;color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));list-style:none}.settings-option-details>summary::-webkit-details-marker{display:none}.settings-option-details>summary:before{content:"▸";margin-right:var(--space-xs)}.settings-option-details[open]>summary:before{content:"▾"}.remote-cf-advanced-details{margin-top:var(--space-xs)}.remote-cf-advanced-details>summary{cursor:pointer;color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));list-style:none}.remote-cf-advanced-details>summary::-webkit-details-marker{display:none}.remote-cf-advanced-details>summary:before{content:"▸";margin-right:var(--space-xs)}.remote-cf-advanced-details[open]>summary:before{content:"▾"}.remote-cf-advanced-fields{display:flex;flex-direction:column;gap:var(--space-sm);margin-top:var(--space-sm)}.remote-tunnel-actions{margin-top:var(--space-md)}.remote-tunnel-actions .btn{width:100%}.settings-overlap-ignore-list{display:flex;flex-direction:column;gap:var(--space-sm);margin:var(--space-sm) 0}.settings-overlap-ignore-row,.settings-overlap-ignore-path-controls{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--space-sm);align-items:center}.settings-overlap-path-picker-modal{max-width:min(960px,calc(100vw - var(--space-2xl)))}.settings-overlap-path-picker-body{display:flex;flex-direction:column;gap:var(--space-sm);max-height:min(70vh,720px)}.settings-overlap-path-picker-note{margin:0;font-size:12px;color:var(--text-muted)}.settings-section-divider{border-top:1px solid var(--border);margin:var(--space-lg) var(--space-xl)}@media(max-width:768px){.settings-note{padding:0 var(--space-lg)}.settings-overlap-ignore-row,.settings-overlap-ignore-path-controls{grid-template-columns:minmax(0,1fr)}.settings-overlap-ignore-row>.btn{justify-self:start}.settings-overlap-path-picker-modal{max-width:calc(100vw - var(--space-md))}.remote-provider-selector{flex-direction:column}.remote-status-bar{flex-wrap:wrap;margin:0 var(--space-lg) var(--space-md)}.remote-share-block{margin:0 var(--space-lg) var(--space-md)}.remote-status-url{width:100%;margin-left:0;font-size:.8em}.remote-provider-option,.remote-tunnel-actions .btn{min-height:36px}.remote-cli-detection,.remote-external-tunnel-panel{margin:0 var(--space-lg) var(--space-md)}}.ntfy-advanced-disclosure{margin-top:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.ntfy-advanced-disclosure>summary{cursor:pointer;list-style:none;padding:var(--space-sm) var(--space-md);font-size:12px;font-weight:600;color:var(--text)}.ntfy-advanced-disclosure>summary::-webkit-details-marker{display:none}.ntfy-advanced-content{padding:0 var(--space-md) var(--space-md);display:flex;flex-direction:column;gap:var(--space-sm)}.settings-inline-link{color:var(--todo);text-decoration:none;transition:text-decoration var(--transition-fast)}.settings-inline-link:hover{text-decoration:underline}.settings-inline-link:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-radius:var(--radius-sm)}.notification-provider-card{border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-lg);background:var(--surface);margin:0 var(--space-xl) var(--space-lg);overflow:hidden}.notification-provider-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md) var(--space-lg);border-bottom:var(--btn-border-width) solid var(--border)}.notification-provider-body{padding:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-lg)}.notification-provider-actions{display:flex;flex-wrap:wrap;gap:var(--space-sm);padding-top:var(--space-md);border-top:var(--btn-border-width) solid var(--border);margin-top:var(--space-md)}.notification-test-feedback{display:flex;flex-direction:column;gap:var(--space-xs);margin-top:var(--space-sm)}.notification-test-feedback-item{border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-sm);padding:var(--space-xs) var(--space-sm)}.notification-test-feedback-item--success{border-color:color-mix(in srgb,var(--color-success) 45%,var(--border));background:color-mix(in srgb,var(--color-success) 8%,transparent);color:var(--color-success)}.notification-test-feedback-item--error{border-color:color-mix(in srgb,var(--color-error) 45%,var(--border));background:color-mix(in srgb,var(--color-error) 8%,transparent);color:var(--color-error)}@media(max-width:768px){.notification-provider-actions{flex-direction:column}.notification-provider-actions .btn{width:100%}}.memory-status-message{display:flex;gap:var(--space-md);align-items:center;justify-content:space-between;margin-bottom:var(--space-md)}.memory-status-message span{min-width:0}.memory-retrieval-test{margin-top:var(--space-lg)}.memory-test-result{margin:0 var(--space-xl) var(--space-lg);padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--card)}.memory-test-result strong,.memory-test-result span{color:var(--text);font-size:12px}.memory-test-result small{display:block;margin-top:var(--space-xs);color:var(--text-muted);font-size:12px}.memory-test-result ul{margin:var(--space-md) 0 0;padding:0;list-style:none}.memory-test-result li{padding-top:var(--space-sm);border-top:var(--btn-border-width) solid var(--border)}.memory-test-result li+li{margin-top:var(--space-sm)}.memory-test-result p{margin:var(--space-xs) 0 0;color:var(--text-muted);font-size:12px;line-height:1.5;overflow-wrap:anywhere}.memory-editor-section{margin-top:var(--space-lg);display:flex;flex:1 1 auto;flex-direction:column;min-height:0}.memory-editor-form-group{display:flex;flex:1 1 auto;flex-direction:column;min-height:0}.memory-file-summary{display:grid;grid-template-columns:auto minmax(0,1fr);gap:var(--space-xs) var(--space-md);align-items:center;margin:0 var(--space-xl) var(--space-md);padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--card)}.memory-file-summary span{display:inline-flex;align-items:center;justify-content:center;padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-pill);color:var(--color-info);background:color-mix(in srgb,var(--color-info) 12%,transparent);font-size:11px;font-weight:600}.memory-file-summary strong{min-width:0;overflow-wrap:anywhere;color:var(--text);font-family:var(--font-mono);font-size:12px}.memory-file-summary small{grid-column:2;color:var(--text-muted);font-size:12px}.memory-editor-frame{min-height:50vh;border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);overflow:hidden;display:flex;flex:1 1 auto;flex-direction:column;min-width:0}.auth-panel-body{padding-inline:var(--space-md)}.auth-section-hint{padding:var(--space-md) var(--space-lg);margin-bottom:var(--space-md);background:var(--bg-tertiary);border-radius:var(--radius-md);font-size:13px;color:var(--text-muted);border-left:3px solid var(--text-muted)}.auth-provider-group{margin-bottom:calc(var(--space-sm) + var(--space-xs) / 2)}.auth-group-label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--text-muted);margin-bottom:var(--space-xs);padding:0 4px}.auth-provider-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);margin-bottom:var(--space-xs);overflow:hidden;transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.auth-provider-card:hover{border-color:var(--text-dim)}.auth-provider-card--authenticated{border-color:color-mix(in srgb,var(--color-success) 40%,var(--border));background:color-mix(in srgb,var(--color-success) 5%,var(--surface))}.auth-provider-card--authenticated:hover{border-color:color-mix(in srgb,var(--color-success) 60%,var(--border))}.auth-provider-header{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--space-sm) var(--space-md);gap:12px}.auth-provider-info{display:flex;align-items:center;gap:10px;flex-wrap:wrap;flex:1;min-width:0}.auth-provider-info strong{font-weight:500;color:var(--text)}.auth-provider-icon-slot{display:inline-flex;align-items:center;justify-content:center;inline-size:calc(var(--space-md) + var(--space-xs) * 2);block-size:calc(var(--space-md) + var(--space-xs) * 2);flex-shrink:0}.auth-provider-icon-slot .provider-icon{display:inline-flex}.auth-hint{display:block;padding:12px 4px 0;font-size:12px;color:var(--text-muted);border-top:1px solid var(--border);margin-top:8px}.auth-apikey-section{display:flex;flex-direction:column;gap:var(--space-xs);align-items:flex-end;flex-shrink:0}.auth-apikey-input-row{display:flex;gap:6px;align-items:center}.auth-apikey-input{background:var(--surface-1);border:1px solid var(--border);border-radius:6px;color:var(--text);padding:6px 10px;font-size:13px;width:180px;font-family:monospace}.auth-apikey-input:focus{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring)}.auth-apikey-input:disabled{opacity:.6}.auth-apikey-progress{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);padding-right:4px}.auth-apikey-error{font-size:11px;color:var(--color-error);padding-right:4px}.auth-provider-actions-row{display:flex;width:100%;align-items:center;gap:var(--space-sm)}.auth-device-code-panel{width:100%;margin-top:var(--space-sm);padding:var(--space-sm);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--surface) 85%,transparent);display:flex;flex-direction:column;gap:var(--space-sm)}.auth-device-code-pill{font-family:var(--font-mono);font-size:calc(var(--space-md) + var(--space-xs) * .5);letter-spacing:var(--space-xs);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-pill);border:var(--btn-border-width) solid var(--border);background:var(--card);color:var(--text);display:flex;align-self:stretch}.auth-key-hint{font-family:var(--font-mono);font-size:12px;color:var(--text-muted);display:inline-block;margin-top:var(--space-xs);user-select:none}.settings-lane-badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:10px;font-size:11px;font-weight:500;white-space:nowrap}.settings-lane-badge--override{background-color:color-mix(in srgb,var(--todo) 20%,transparent);color:var(--todo)}.settings-lane-badge--inherited{background-color:color-mix(in srgb,var(--text-muted) 15%,transparent);color:var(--text-muted)}.settings-description{font-size:13px;color:var(--text-dim);padding-inline:var(--space-xl);margin-block:0 var(--space-md);line-height:1.5}.settings-token-cap-row{display:flex;align-items:center;gap:var(--space-sm)}.settings-model-lane-label-row{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-xs)}.settings-model-lane-control-row{display:flex;align-items:center;gap:var(--space-sm)}.settings-model-lane-control-main{flex:1}.settings-model-lane-actions{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm);padding:var(--space-md) var(--space-xl) var(--space-lg);margin-block:var(--space-sm) var(--space-lg);border-bottom:var(--btn-border-width) solid var(--border)}.settings-error{color:var(--color-error)}.settings-summarization-actions{justify-content:flex-start}.settings-model-presets{display:flex;flex-direction:column;gap:var(--space-md)}.settings-preset-list{display:flex;flex-direction:column;gap:var(--space-sm)}.settings-preset-item{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-md);padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--card)}.settings-preset-item-meta{display:flex;flex-direction:column;gap:var(--space-xs);min-width:0}.settings-preset-item-meta strong{color:var(--text);overflow-wrap:anywhere}.settings-preset-summary{font-size:12px;overflow-wrap:anywhere}.settings-preset-item-actions{display:flex;gap:var(--space-xs);flex-wrap:wrap;justify-content:flex-end}.settings-preset-actions{display:flex;justify-content:flex-start}.settings-preset-editor{display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--surface) 85%,var(--card))}.settings-preset-editor-fields{display:flex;flex-direction:column;gap:var(--space-sm)}.settings-preset-editor .form-group{padding:0}.settings-preset-editor-actions{justify-content:flex-start;margin-top:0;padding:0}.settings-preset-auto-select{margin-top:var(--space-sm)}.settings-preset-size-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--space-sm)}.settings-preset-size-row{padding:0}@media(max-width:768px){.settings-layout{flex-direction:column;min-height:0}.settings-mobile-section-picker{display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-md) var(--space-lg);border-bottom:var(--btn-border-width) solid var(--border);background:var(--surface)}.settings-mobile-section-picker label{color:var(--text-muted);font-weight:600;text-transform:uppercase}.settings-mobile-section-picker select{width:100%}.settings-mobile-section-picker select:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.settings-sidebar{display:none}.settings-nav-item{display:flex;align-items:center;justify-content:center;gap:var(--space-xs);border-left:none;border-bottom:2px solid transparent;border-radius:var(--radius-md) var(--radius-md) 0 0;padding:calc(var(--space-xs) + var(--space-xs) / 2) var(--space-md);white-space:nowrap}.settings-nav-item:hover{border-left-color:transparent;border-bottom-color:var(--border)}.settings-nav-item.active{border-left-color:transparent;border-bottom-color:var(--todo)}.settings-group-header{display:none}.notification-provider-card{margin:0 var(--space-lg) var(--space-md)}.notification-provider-header{padding:var(--space-sm) var(--space-md)}.notification-provider-body{padding:var(--space-md)}.settings-scope-icon{margin-right:0}.settings-content{flex:1;min-height:0;overflow-x:hidden;overflow-y:auto}.settings-content .form-group small{overflow-wrap:break-word;word-break:normal}.settings-content input,.settings-content select,.settings-content textarea{font-size:16px}.settings-section-heading{padding:var(--space-lg) var(--space-lg) var(--space-md);margin:0 0 var(--space-md)}.settings-plugins-subsection-toggle{display:flex;width:100%;padding:0 var(--space-lg)}.settings-plugins-subsection-btn{flex:1;min-height:36px}.settings-plugins-subsection-panel{padding-left:var(--space-lg);padding-right:var(--space-lg)}.form-group{padding:0 calc(var(--space-md) + var(--space-xs) / 2)}.settings-scope-banner{padding:var(--space-sm) var(--space-lg)}.memory-editor-frame{min-height:65vh}.memory-file-summary{grid-template-columns:1fr;margin:0 var(--space-lg) var(--space-md)}.memory-status-message{align-items:stretch;flex-direction:column}.memory-file-summary span{justify-content:flex-start}.memory-file-summary small{grid-column:auto}.settings-description{padding:0 var(--space-lg)}.settings-model-lane-actions{align-items:stretch;flex-direction:column;padding-inline:calc(var(--space-md) + var(--space-xs) / 2)}.settings-content .btn,.settings-preset-item-actions .btn{min-height:36px}.auth-provider-row{flex-wrap:wrap;padding:var(--space-md) calc(var(--space-md) + var(--space-xs) / 2);gap:var(--space-sm)}.auth-section-hint{margin:0 calc(var(--space-md) + var(--space-xs) / 2) var(--space-md);padding:calc(var(--space-sm) + var(--space-xs) / 2) calc(var(--space-md) + var(--space-xs) / 2)}.auth-provider-group{margin-bottom:var(--space-md)}.auth-group-label{padding:0 calc(var(--space-md) + var(--space-xs) / 2)}.auth-provider-card{margin:0 calc(var(--space-md) + var(--space-xs) / 2) var(--space-sm)}.auth-provider-header{flex-wrap:wrap;padding:calc(var(--space-sm) + var(--space-xs) / 2) calc(var(--space-md) + var(--space-xs) / 2);gap:10px}.auth-provider-header>div:not(.auth-provider-info):not(.auth-apikey-section){margin-left:auto}.auth-provider-actions-row{width:100%;justify-content:flex-end}.auth-device-code-panel{width:100%}.auth-device-code-pill{max-width:100%;overflow-wrap:anywhere}.auth-provider-info{width:100%;flex-basis:100%}.auth-apikey-section{width:100%;flex-basis:100%;align-items:flex-end}.auth-apikey-input-row{width:100%;flex-wrap:wrap;justify-content:flex-end}.auth-apikey-input{flex:1;min-width:120px;width:auto}.auth-apikey-input-row .btn{flex-shrink:0;margin-left:auto}.auth-hint{padding:var(--space-md) calc(var(--space-md) + var(--space-xs) / 2) 0}.settings-model-presets{gap:var(--space-sm)}.settings-preset-item{flex-direction:column;align-items:stretch;padding:var(--space-sm) var(--space-md)}.settings-preset-item-actions{justify-content:flex-start}.settings-preset-editor{padding:var(--space-sm) var(--space-md)}.settings-preset-editor-actions{flex-wrap:wrap}.settings-preset-size-grid{grid-template-columns:1fr;gap:var(--space-xs)}.settings-node-routing-note{padding:var(--space-sm) var(--space-md);font-size:12px}}.settings-node-routing-note{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md) var(--space-lg);margin-top:var(--space-sm);color:var(--text-muted);font-size:13px;line-height:1.5}.settings-node-status{display:inline-flex;align-items:center;gap:var(--space-xs);margin-top:var(--space-sm);font-size:12px;color:var(--text-muted)}.auth-advanced-disclosure{margin-top:var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.auth-advanced-disclosure>summary{cursor:pointer;padding:var(--space-sm) var(--space-md)}.auth-advanced-content{display:flex;flex-direction:column;gap:var(--space-sm);padding:0 var(--space-md) var(--space-md)}.auth-custom-provider-item{display:flex;justify-content:space-between;align-items:center;gap:var(--space-sm)}.auth-custom-provider-actions{display:flex;gap:var(--space-sm)}.settings-warning-banner{margin-top:var(--space-sm);padding:var(--space-sm) var(--space-md);border:1px solid var(--color-warning);border-radius:var(--radius-md);background:color-mix(in srgb,var(--color-warning) 12%,transparent);color:var(--text);font-size:.875rem;line-height:1.4}.settings-warning-banner strong{color:var(--color-warning);margin-right:var(--space-xs)}.settings-sync-workflow-note{margin-top:var(--space-md);font-size:.875rem;color:var(--text-muted)}@media(max-width:768px){.auth-custom-provider-item{flex-direction:column;align-items:flex-start}.settings-warning-banner{padding:var(--space-sm)}}