@runfusion/fusion 0.24.0 → 0.26.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 (167) hide show
  1. package/README.md +6 -0
  2. package/dist/bin.js +18646 -15669
  3. package/dist/client/assets/AgentDetailView-Cv-vgOj3.js +18 -0
  4. package/dist/client/assets/{AgentsView-BkB9FiMT.js → AgentsView-D6Zi5zfP.js} +4 -4
  5. package/dist/client/assets/ChatView-CAHjY9uO.js +1 -0
  6. package/dist/client/assets/{DevServerView-BkvtjZBa.js → DevServerView--_WBvIDQ.js} +1 -1
  7. package/dist/client/assets/{DirectoryPicker-BK-KbnhP.js → DirectoryPicker-xedtR-Rd.js} +1 -1
  8. package/dist/client/assets/{DocumentsView-BEg1CQAk.js → DocumentsView-Bg2oaZks.js} +1 -1
  9. package/dist/client/assets/{EvalsView-Berf9bQm.js → EvalsView-B3uOCXfr.js} +1 -1
  10. package/dist/client/assets/{ExperimentalAgentOnboardingModal-jcInE50G.js → ExperimentalAgentOnboardingModal-Bx6yXVS5.js} +1 -1
  11. package/dist/client/assets/{InsightsView-BX5bSF1J.js → InsightsView-Q1zvtF4F.js} +1 -1
  12. package/dist/client/assets/MemoryView-xcN_eouf.js +2 -0
  13. package/dist/client/assets/MemoryView-zaXewZzi.css +1 -0
  14. package/dist/client/assets/{NodesView-DLUOBLf6.js → NodesView-RxXg58_Q.js} +1 -1
  15. package/dist/client/assets/{PiExtensionsManager-COlJf0Kx.js → PiExtensionsManager-Cc8aAZXg.js} +2 -2
  16. package/dist/client/assets/PluginManager-BEkyBajl.js +1 -0
  17. package/dist/client/assets/{ResearchView-BzCcDAS4.css → ResearchView-BEI4ZSGs.css} +1 -1
  18. package/dist/client/assets/ResearchView-CERNf7sJ.js +1 -0
  19. package/dist/client/assets/{SettingsModal-yRqM4DV8.js → SettingsModal-B1r0yASu.js} +1 -1
  20. package/dist/client/assets/SettingsModal-BLsac7CJ.js +31 -0
  21. package/dist/client/assets/SettingsModal-Cis-4Lot.css +1 -0
  22. package/dist/client/assets/{SetupWizardModal-uUZk3TKT.js → SetupWizardModal-D1q548_L.js} +1 -1
  23. package/dist/client/assets/{SkillsView-CP8JX0P_.js → SkillsView-ClLM6u6p.js} +1 -1
  24. package/dist/client/assets/StashRecoveryView-B_8WIQEo.css +1 -0
  25. package/dist/client/assets/StashRecoveryView-ze0pEZ5U.js +1 -0
  26. package/dist/client/assets/{TodoView-DCRIkDZ-.js → TodoView-CTmIfy2M.js} +1 -1
  27. package/dist/client/assets/{dashboard-view-lR7YYmSC.js → dashboard-view-4xAN3yO5.js} +2 -2
  28. package/dist/client/assets/{folder-open-DHjELt8-.js → folder-open-BZuKESeq.js} +1 -1
  29. package/dist/client/assets/index-Bdw6llW6.js +692 -0
  30. package/dist/client/assets/index-CZGlyJuS.css +1 -0
  31. package/dist/client/assets/{star-DYesq1AV.js → star-D75YKEq-.js} +1 -1
  32. package/dist/client/assets/{upload-DTWF3Db5.js → upload-BYYTgWFj.js} +1 -1
  33. package/dist/client/assets/{users--syrel4l.js → users-RS90Aii3.js} +1 -1
  34. package/dist/client/index.html +2 -2
  35. package/dist/client/version.json +1 -1
  36. package/dist/droid-cli/package.json +1 -1
  37. package/dist/extension.js +5640 -3618
  38. package/dist/pi-claude-cli/package.json +1 -1
  39. package/dist/plugins/fusion-plugin-cli-printing-press/manifest.json +6 -0
  40. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +26 -0
  41. package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/manifest.test.ts +20 -0
  42. package/dist/plugins/fusion-plugin-cli-printing-press/src/index.ts +14 -0
  43. package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +9 -11
  44. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  45. package/dist/plugins/fusion-plugin-dependency-graph/bundled.js +30 -0
  46. package/dist/plugins/fusion-plugin-dependency-graph/package.json +3 -28
  47. package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +899 -895
  48. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  49. package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +68 -71
  50. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  51. package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +47 -50
  52. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  53. package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +155 -109
  54. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  55. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  56. package/dist/plugins/fusion-plugin-reports/src/index.ts +49 -3
  57. package/dist/plugins/fusion-plugin-reports/src/report-schema.ts +38 -0
  58. package/dist/plugins/fusion-plugin-reports/src/store/__tests__/report-schema.test.ts +66 -0
  59. package/dist/plugins/fusion-plugin-reports/src/store/__tests__/report-store.test.ts +177 -0
  60. package/dist/plugins/fusion-plugin-reports/src/store/report-store.ts +341 -0
  61. package/dist/plugins/fusion-plugin-reports/src/store/report-types.ts +77 -0
  62. package/dist/plugins/fusion-plugin-roadmap/{src/dashboard/RoadmapsView.css → bundled.css} +13 -219
  63. package/dist/plugins/fusion-plugin-roadmap/bundled.js +29535 -0
  64. package/dist/plugins/fusion-plugin-roadmap/package.json +4 -41
  65. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  66. package/package.json +2 -3
  67. package/dist/client/assets/AgentDetailView-gy_5SUj2.js +0 -18
  68. package/dist/client/assets/ChatView-B_-B8fqu.js +0 -1
  69. package/dist/client/assets/MemoryView-CKElJY_3.js +0 -2
  70. package/dist/client/assets/MemoryView-DiajLXby.css +0 -1
  71. package/dist/client/assets/PluginManager-CfW55BF4.js +0 -1
  72. package/dist/client/assets/ResearchView-B256Lr8I.js +0 -1
  73. package/dist/client/assets/SettingsModal-BeA_nQtW.js +0 -31
  74. package/dist/client/assets/SettingsModal-DzsLquBu.css +0 -1
  75. package/dist/client/assets/index-CQyVRLOb.js +0 -692
  76. package/dist/client/assets/index-CxA2Nn0_.css +0 -1
  77. package/dist/plugins/fusion-plugin-dependency-graph/src/DependencyGraph.css +0 -58
  78. package/dist/plugins/fusion-plugin-dependency-graph/src/DependencyGraph.tsx +0 -301
  79. package/dist/plugins/fusion-plugin-dependency-graph/src/GraphHighlight.css +0 -27
  80. package/dist/plugins/fusion-plugin-dependency-graph/src/GraphTaskNode.css +0 -157
  81. package/dist/plugins/fusion-plugin-dependency-graph/src/GraphTaskNode.tsx +0 -126
  82. package/dist/plugins/fusion-plugin-dependency-graph/src/GraphToolbar.css +0 -35
  83. package/dist/plugins/fusion-plugin-dependency-graph/src/GraphToolbar.tsx +0 -36
  84. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/DependencyGraph.highlighting.test.tsx +0 -112
  85. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/DependencyGraph.persistence.test.tsx +0 -115
  86. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/DependencyGraph.test.tsx +0 -128
  87. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/GraphTaskNode.drag.test.tsx +0 -82
  88. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/GraphTaskNode.test.tsx +0 -307
  89. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/GraphToolbar.test.tsx +0 -60
  90. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/edges.test.tsx +0 -75
  91. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/filtering.test.tsx +0 -62
  92. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/filters.test.ts +0 -78
  93. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/graphPositionStorage.test.ts +0 -95
  94. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/host-integration.test.ts +0 -74
  95. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/index.test.ts +0 -58
  96. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/interactions.test.tsx +0 -121
  97. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/layout.test.ts +0 -70
  98. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/persistence.test.tsx +0 -89
  99. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/useGraphData.test.ts +0 -86
  100. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/useGraphInteraction.test.ts +0 -167
  101. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/useGraphPositions.test.ts +0 -66
  102. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/useNodeDrag.test.ts +0 -81
  103. package/dist/plugins/fusion-plugin-dependency-graph/src/dashboard-interop.d.ts +0 -35
  104. package/dist/plugins/fusion-plugin-dependency-graph/src/dashboard-view.tsx +0 -19
  105. package/dist/plugins/fusion-plugin-dependency-graph/src/edges.tsx +0 -70
  106. package/dist/plugins/fusion-plugin-dependency-graph/src/filters.ts +0 -8
  107. package/dist/plugins/fusion-plugin-dependency-graph/src/hooks/__tests__/useDependencyChain.test.ts +0 -53
  108. package/dist/plugins/fusion-plugin-dependency-graph/src/hooks/useDependencyChain.ts +0 -60
  109. package/dist/plugins/fusion-plugin-dependency-graph/src/hooks/useGraphPositions.ts +0 -45
  110. package/dist/plugins/fusion-plugin-dependency-graph/src/hooks/useNodeDrag.ts +0 -114
  111. package/dist/plugins/fusion-plugin-dependency-graph/src/index.ts +0 -24
  112. package/dist/plugins/fusion-plugin-dependency-graph/src/layout.ts +0 -91
  113. package/dist/plugins/fusion-plugin-dependency-graph/src/styles/drag.css +0 -15
  114. package/dist/plugins/fusion-plugin-dependency-graph/src/types.ts +0 -21
  115. package/dist/plugins/fusion-plugin-dependency-graph/src/useGraphData.ts +0 -17
  116. package/dist/plugins/fusion-plugin-dependency-graph/src/useGraphInteraction.ts +0 -292
  117. package/dist/plugins/fusion-plugin-dependency-graph/src/utils/graphPositionStorage.ts +0 -65
  118. package/dist/plugins/fusion-plugin-roadmap/src/__tests__/api-client.test.ts +0 -101
  119. package/dist/plugins/fusion-plugin-roadmap/src/__tests__/index.test.ts +0 -92
  120. package/dist/plugins/fusion-plugin-roadmap/src/__tests__/roadmap-routes.test.ts +0 -48
  121. package/dist/plugins/fusion-plugin-roadmap/src/__tests__/roadmap-suggestions.test.ts +0 -31
  122. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/RoadmapsView.tsx +0 -2559
  123. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/__tests__/RoadmapsView.test.tsx +0 -1144
  124. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/__tests__/useRoadmaps.test.ts +0 -1756
  125. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/api.ts +0 -70
  126. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/test-setup.ts +0 -7
  127. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/types.ts +0 -1
  128. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/useConfirm.ts +0 -8
  129. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/useRoadmaps.ts +0 -1188
  130. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/useViewportMode.ts +0 -20
  131. package/dist/plugins/fusion-plugin-roadmap/src/dashboard-view.tsx +0 -6
  132. package/dist/plugins/fusion-plugin-roadmap/src/index.ts +0 -74
  133. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-routes.ts +0 -1
  134. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-schema.ts +0 -41
  135. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-suggestions.d.ts +0 -15
  136. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-suggestions.ts +0 -15
  137. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-types.d.ts +0 -283
  138. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-types.d.ts.map +0 -1
  139. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-types.js +0 -21
  140. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-types.js.map +0 -1
  141. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-types.ts +0 -310
  142. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-routes.d.ts +0 -5
  143. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-routes.d.ts.map +0 -1
  144. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-routes.js +0 -361
  145. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-routes.js.map +0 -1
  146. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-routes.ts +0 -408
  147. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-suggestions.d.ts +0 -68
  148. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-suggestions.d.ts.map +0 -1
  149. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-suggestions.js +0 -300
  150. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-suggestions.js.map +0 -1
  151. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-suggestions.ts +0 -381
  152. package/dist/plugins/fusion-plugin-roadmap/src/server/index.d.ts +0 -3
  153. package/dist/plugins/fusion-plugin-roadmap/src/server/index.ts +0 -1
  154. package/dist/plugins/fusion-plugin-roadmap/src/store/__tests__/roadmap-handoff.test.ts +0 -445
  155. package/dist/plugins/fusion-plugin-roadmap/src/store/__tests__/roadmap-ordering.test.ts +0 -334
  156. package/dist/plugins/fusion-plugin-roadmap/src/store/__tests__/roadmap-store.test.ts +0 -1318
  157. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-handoff.ts +0 -163
  158. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-ordering.d.ts +0 -37
  159. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-ordering.d.ts.map +0 -1
  160. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-ordering.js +0 -188
  161. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-ordering.js.map +0 -1
  162. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-ordering.ts +0 -311
  163. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-store.d.ts +0 -299
  164. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-store.d.ts.map +0 -1
  165. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-store.js +0 -765
  166. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-store.js.map +0 -1
  167. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-store.ts +0 -1001
@@ -0,0 +1 @@
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-help-btn{height:var(--settings-header-action-height);box-sizing:border-box}.settings-header-help-btn{display:inline-flex;align-items:center}@media(max-width:768px){.settings-header-actions{--settings-header-action-height: calc(var(--space-md) * 3)}.settings-header-actions>.btn-icon,.settings-header-actions>.settings-github-star-btn,.settings-header-actions>.settings-header-help-btn{min-height:var(--settings-header-action-height)}.settings-header-actions>.btn-icon{min-width:calc(var(--space-md) * 3)}.settings-github-star-btn__action,.settings-github-star-btn__count{min-height:var(--settings-header-action-height)}}.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}@media(max-width:768px){.modal-overlay.settings-modal-overlay,.modal-overlay:has(.settings-modal){padding:0;inset:0;align-items:stretch;justify-content:stretch}.modal.settings-modal{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[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-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-update-check{display:flex;align-items:center;gap:var(--space-sm)}.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{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(--text-muted)}.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)}@keyframes settings-update-spin{to{transform:rotate(360deg)}}.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-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-sm)}@media(max-width:768px){.settings-research-source-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:4px 0 12px;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(--transition-normal)}@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) var(--space-xl) 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;padding:0 var(--space-xl);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);padding:0 var(--space-xl);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)}.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-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)}.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-direction:column}.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;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(--bg-input);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:inline-flex;align-items:center;gap:var(--space-sm)}.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(--color-accent) 20%,transparent);color:var(--color-accent)}.settings-lane-badge--inherited{background-color:color-mix(in srgb,var(--color-text-muted) 15%,transparent);color:var(--text-muted)}.settings-description{font-size:13px;color:var(--text-secondary);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-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:break-all}.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:45vh}.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-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-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)}@media(max-width:768px){.auth-custom-provider-item{flex-direction:column;align-items:flex-start}}
@@ -1 +1 @@
1
- import{r as o,j as e}from"./vendor-react-K0fH_qHe.js";import{ci as w,a$ as L,cj as O,ck as _,cl as $,X as W,b as Y,C as k,L as G}from"./index-CQyVRLOb.js";import{D as q}from"./DirectoryPicker-BK-KbnhP.js";import{s as f}from"./projectDetection-G3XuxD2X.js";import"./vendor-xterm-DzcZoU0P.js";import"./folder-open-DHjELt8-.js";function V({onProjectRegistered:m,onClose:p}){const C="https://github.com/runfusion/fusion/discussions",[z,y]=o.useState(!0),[s,n]=o.useState(()=>({step:w()?"manual":"auth",manualMode:"existing",manualPath:"",manualCloneUrl:"",manualName:"",manualIsolationMode:"in-process",manualNodeId:"",isRegistering:!1,error:null})),[j,M]=o.useState(!1),[i,c]=o.useState(""),[u,x]=o.useState(()=>w()),{nodes:g,loading:I}=L(),S=g.find(a=>a.type==="local")?.id,N=o.useCallback(()=>{y(!1),p?.()},[p]),P=o.useCallback(a=>{n(t=>{const d={manualPath:a};return a&&(!t.manualName||t.manualName===f(t.manualPath))&&(d.manualName=f(a)),{...t,...d}})},[]),R=o.useCallback(async()=>{const a=s.manualPath.trim(),t=s.manualName.trim(),d=s.manualCloneUrl.trim();if(!(!a||!t)&&!(s.manualMode==="clone"&&!d)){n(r=>({...r,isRegistering:!0,error:null}));try{const r={name:t,path:a,isolationMode:s.manualIsolationMode,nodeId:s.manualNodeId||void 0,cloneUrl:s.manualMode==="clone"?d:void 0},h=await O(r);m(h),n(B=>({...B,step:"complete",isRegistering:!1}))}catch(r){n(h=>({...h,isRegistering:!1,error:r instanceof Error?r.message:"Failed to register project"}))}}},[s.manualPath,s.manualName,s.manualCloneUrl,s.manualMode,s.manualIsolationMode,s.manualNodeId,m]),v=o.useCallback(()=>{const a=i.trim();a&&(_(a),x(a),c(""),n(t=>t.step==="auth"?{...t,step:"manual"}:t))},[i]),A=o.useCallback(()=>{$(),x(void 0),c("")},[]),F=o.useCallback(()=>{n(a=>({...a,step:"manual"}))},[]);if(!z)return null;const b=s.manualMode==="existing",l=s.manualMode==="clone",T=s.manualPath.trim().length>0,U=s.manualName.trim().length>0,D=s.manualCloneUrl.trim().length>0,E=s.isRegistering||!T||!U||l&&!D;return e.jsx("div",{className:"modal-overlay open setup-wizard-overlay",role:"dialog","aria-modal":"true","aria-labelledby":"wizard-title",children:e.jsxs("div",{className:"modal setup-wizard-modal",children:[e.jsxs("div",{className:"setup-wizard-header",children:[e.jsxs("div",{className:"setup-wizard-heading",children:[e.jsxs("div",{className:"setup-wizard-brand","aria-label":"Fusion",children:[e.jsxs("svg",{className:"setup-wizard-brand-logo",width:28,height:28,viewBox:"0 0 128 128",fill:"none","aria-label":"Fusion logo",role:"img",children:[e.jsx("circle",{cx:"64",cy:"64",r:"52",stroke:"currentColor",strokeWidth:"8"}),e.jsx("path",{d:"M26 101C44 82 62 64 82 45C90 37 98 30 104 24C96 35 89 47 81 60C70 79 57 95 43 108C38 112 32 108 26 101Z",fill:"currentColor"})]}),e.jsx("span",{className:"setup-wizard-brand-name",children:"Fusion"})]}),e.jsxs("h2",{id:"wizard-title",className:"setup-wizard-title",children:[s.step==="auth"&&"Set Auth Token",s.step==="manual"&&"Welcome to Fusion",s.step==="complete"&&"Setup Complete!"]})]}),s.step!=="complete"&&e.jsx("button",{className:"modal-close",onClick:N,"aria-label":"Close wizard",children:e.jsx(W,{size:20})})]}),e.jsxs("div",{className:"setup-wizard-content",children:[s.step==="auth"&&e.jsxs("div",{className:"setup-wizard-auth-step",children:[e.jsx("p",{className:"setup-wizard-auth-step-description",children:"This dashboard requires an auth token to communicate with the Fusion daemon. Paste the token below to continue."}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"setup-auth-token",children:"Auth Token"}),e.jsx("input",{id:"setup-auth-token",type:"password",value:i,onChange:a=>c(a.target.value),placeholder:"Paste the daemon auth token",autoComplete:"off",spellCheck:!1,autoFocus:!0}),e.jsxs("p",{className:"form-hint",children:["The token was set via the ",e.jsx("code",{children:"FUSION_DAEMON_TOKEN"})," environment variable when starting the dashboard."]})]}),s.error&&e.jsx("div",{className:"wizard-error",role:"alert",children:s.error})]}),s.step==="manual"&&e.jsxs("div",{className:"setup-wizard-manual",children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"project-name",children:"Project Name"}),e.jsx("input",{id:"project-name",type:"text",value:s.manualName,onChange:a=>n(t=>({...t,manualName:a.target.value})),placeholder:"my-project"}),e.jsx("p",{className:"form-hint",children:l?"By default this follows the destination folder name unless you edit it.":"By default this follows the selected directory name unless you edit it."})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"project-path",children:l?"Destination Directory":"Project Directory"}),e.jsx(q,{value:s.manualPath,onChange:P,nodeId:s.manualNodeId||void 0,localNodeId:S,placeholder:l?"/path/for/new-clone":"/path/to/your/project"}),e.jsx("p",{className:"form-hint",children:l?"Select or type an absolute destination path. Fusion will clone into this directory.":"Select or type the absolute path to your project"})]}),e.jsxs("div",{className:"setup-wizard-advanced",children:[e.jsxs("button",{type:"button",className:"setup-wizard-advanced-toggle","aria-expanded":j,onClick:()=>M(a=>!a),children:[e.jsx(Y,{size:16,className:"setup-wizard-advanced-chevron"}),e.jsx("span",{children:"Advanced settings"})]}),j&&e.jsxs("div",{className:"setup-wizard-advanced-panel",children:[e.jsxs("fieldset",{className:"setup-wizard-mode-switch","aria-label":"Project setup mode",children:[e.jsx("legend",{children:"Setup Mode"}),e.jsxs("label",{className:`setup-wizard-mode-option${b?" selected":""}`,children:[e.jsx("input",{type:"radio",name:"setup-mode",value:"existing",checked:b,onChange:()=>n(a=>({...a,manualMode:"existing",error:null}))}),e.jsx("span",{children:"Use Existing Directory"})]}),e.jsxs("label",{className:`setup-wizard-mode-option${l?" selected":""}`,children:[e.jsx("input",{type:"radio",name:"setup-mode",value:"clone",checked:l,onChange:()=>n(a=>({...a,manualMode:"clone",error:null}))}),e.jsx("span",{children:"Clone Git Repository"})]})]}),l&&e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"project-clone-url",children:"Repository URL"}),e.jsx("input",{id:"project-clone-url",type:"text",value:s.manualCloneUrl,onChange:a=>n(t=>({...t,manualCloneUrl:a.target.value})),placeholder:"https://github.com/owner/repo.git"}),e.jsx("p",{className:"form-hint",children:"Fusion will run git clone into the destination directory, then register that cloned folder."})]}),e.jsx("div",{className:"form-group",children:e.jsxs("div",{className:"project-node-selector",children:[e.jsx("span",{className:"project-node-selector__label",children:"Runtime Node"}),e.jsxs("select",{value:s.manualNodeId,onChange:a=>n(t=>({...t,manualNodeId:a.target.value})),disabled:I||s.isRegistering,children:[e.jsx("option",{value:"",children:"Local node"}),g.map(a=>e.jsxs("option",{value:a.id,children:[a.name," (",a.type,")"]},a.id))]})]})}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:"Isolation Mode"}),e.jsxs("div",{className:"setup-wizard-isolation-options",children:[e.jsxs("label",{className:`setup-wizard-isolation-option${s.manualIsolationMode==="in-process"?" selected":""}`,children:[e.jsx("input",{type:"radio",name:"isolation-mode",value:"in-process",checked:s.manualIsolationMode==="in-process",onChange:()=>n(a=>({...a,manualIsolationMode:"in-process"}))}),e.jsxs("div",{className:"setup-wizard-isolation-option-content",children:[e.jsx("strong",{children:"In-Process"}),e.jsx("span",{children:"Lower overhead, shared memory. Best for most projects."}),e.jsx("span",{className:"wizard-option-recommended",children:"Recommended"})]})]}),e.jsxs("label",{className:`setup-wizard-isolation-option${s.manualIsolationMode==="child-process"?" selected":""}`,children:[e.jsx("input",{type:"radio",name:"isolation-mode",value:"child-process",checked:s.manualIsolationMode==="child-process",onChange:()=>n(a=>({...a,manualIsolationMode:"child-process"}))}),e.jsxs("div",{className:"setup-wizard-isolation-option-content",children:[e.jsx("strong",{children:"Child-Process"}),e.jsx("span",{children:"Isolated execution with crash containment."})]})]})]})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"advanced-auth-token",children:"Browser Auth Token"}),e.jsxs("div",{className:"setup-wizard-auth-token",children:[e.jsx("input",{id:"advanced-auth-token",type:"password",value:i,onChange:a=>c(a.target.value),placeholder:u?"Enter a new token to replace the stored one":"Paste the auth token for this browser",autoComplete:"off",spellCheck:!1}),e.jsxs("div",{className:"setup-wizard-auth-token-actions",children:[e.jsx("button",{type:"button",className:"btn",onClick:v,disabled:i.trim().length===0,children:u?"Update token":"Set token"}),u&&e.jsx("button",{type:"button",className:"btn",onClick:A,children:"Reset token"})]})]}),e.jsx("p",{className:"form-hint",children:u?"A token is already stored in this browser. You can update or reset it below.":"No token is stored. Use the auth prompt at the top of the wizard, or set one here."})]})]})]}),s.error&&e.jsx("div",{className:"wizard-error",role:"alert",children:s.error})]}),s.step==="complete"&&e.jsxs("div",{className:"setup-wizard-complete",children:[e.jsxs("div",{className:"setup-wizard-success-streak","aria-hidden":"true",children:[e.jsx("div",{className:"setup-wizard-success-streak-core"}),e.jsx("div",{className:"setup-wizard-success-streak-glow"})]}),e.jsx(k,{size:64,className:"success-icon"}),e.jsx("h3",{children:"All Set!"}),e.jsx("p",{children:"Your project has been registered successfully."}),e.jsx("p",{children:"You can add more projects anytime from the project overview."})]})]}),e.jsxs("div",{className:"setup-wizard-footer",children:[e.jsx("a",{className:"btn setup-wizard-help-link",href:C,target:"_blank",rel:"noreferrer",children:"Need help?"}),s.step==="auth"&&e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn",onClick:F,children:"Skip"}),e.jsx("button",{className:"btn btn-primary",onClick:v,disabled:i.trim().length===0,children:e.jsx("span",{children:"Set Token & Continue"})})]}),s.step==="manual"&&e.jsx("button",{className:"btn btn-primary",onClick:R,disabled:E,children:s.isRegistering?e.jsxs(e.Fragment,{children:[e.jsx(G,{size:16,className:"animate-spin"}),e.jsx("span",{children:"Registering..."})]}):e.jsx("span",{children:"Register Project"})}),s.step==="complete"&&e.jsxs("button",{className:"btn btn-primary",onClick:N,children:[e.jsx(k,{size:16}),e.jsx("span",{children:"Get Started"})]})]})]})})}export{V as SetupWizardModal};
1
+ import{r as o,j as e}from"./vendor-react-K0fH_qHe.js";import{cj as w,a$ as L,ck as O,cl as _,cm as $,X as W,b as Y,C as k,L as G}from"./index-Bdw6llW6.js";import{D as q}from"./DirectoryPicker-xedtR-Rd.js";import{s as f}from"./projectDetection-G3XuxD2X.js";import"./vendor-xterm-DzcZoU0P.js";import"./folder-open-BZuKESeq.js";function V({onProjectRegistered:m,onClose:p}){const C="https://github.com/runfusion/fusion/discussions",[z,y]=o.useState(!0),[s,n]=o.useState(()=>({step:w()?"manual":"auth",manualMode:"existing",manualPath:"",manualCloneUrl:"",manualName:"",manualIsolationMode:"in-process",manualNodeId:"",isRegistering:!1,error:null})),[j,M]=o.useState(!1),[i,c]=o.useState(""),[u,x]=o.useState(()=>w()),{nodes:g,loading:I}=L(),S=g.find(a=>a.type==="local")?.id,N=o.useCallback(()=>{y(!1),p?.()},[p]),P=o.useCallback(a=>{n(t=>{const d={manualPath:a};return a&&(!t.manualName||t.manualName===f(t.manualPath))&&(d.manualName=f(a)),{...t,...d}})},[]),R=o.useCallback(async()=>{const a=s.manualPath.trim(),t=s.manualName.trim(),d=s.manualCloneUrl.trim();if(!(!a||!t)&&!(s.manualMode==="clone"&&!d)){n(r=>({...r,isRegistering:!0,error:null}));try{const r={name:t,path:a,isolationMode:s.manualIsolationMode,nodeId:s.manualNodeId||void 0,cloneUrl:s.manualMode==="clone"?d:void 0},h=await O(r);m(h),n(B=>({...B,step:"complete",isRegistering:!1}))}catch(r){n(h=>({...h,isRegistering:!1,error:r instanceof Error?r.message:"Failed to register project"}))}}},[s.manualPath,s.manualName,s.manualCloneUrl,s.manualMode,s.manualIsolationMode,s.manualNodeId,m]),v=o.useCallback(()=>{const a=i.trim();a&&(_(a),x(a),c(""),n(t=>t.step==="auth"?{...t,step:"manual"}:t))},[i]),A=o.useCallback(()=>{$(),x(void 0),c("")},[]),F=o.useCallback(()=>{n(a=>({...a,step:"manual"}))},[]);if(!z)return null;const b=s.manualMode==="existing",l=s.manualMode==="clone",T=s.manualPath.trim().length>0,U=s.manualName.trim().length>0,D=s.manualCloneUrl.trim().length>0,E=s.isRegistering||!T||!U||l&&!D;return e.jsx("div",{className:"modal-overlay open setup-wizard-overlay",role:"dialog","aria-modal":"true","aria-labelledby":"wizard-title",children:e.jsxs("div",{className:"modal setup-wizard-modal",children:[e.jsxs("div",{className:"setup-wizard-header",children:[e.jsxs("div",{className:"setup-wizard-heading",children:[e.jsxs("div",{className:"setup-wizard-brand","aria-label":"Fusion",children:[e.jsxs("svg",{className:"setup-wizard-brand-logo",width:28,height:28,viewBox:"0 0 128 128",fill:"none","aria-label":"Fusion logo",role:"img",children:[e.jsx("circle",{cx:"64",cy:"64",r:"52",stroke:"currentColor",strokeWidth:"8"}),e.jsx("path",{d:"M26 101C44 82 62 64 82 45C90 37 98 30 104 24C96 35 89 47 81 60C70 79 57 95 43 108C38 112 32 108 26 101Z",fill:"currentColor"})]}),e.jsx("span",{className:"setup-wizard-brand-name",children:"Fusion"})]}),e.jsxs("h2",{id:"wizard-title",className:"setup-wizard-title",children:[s.step==="auth"&&"Set Auth Token",s.step==="manual"&&"Welcome to Fusion",s.step==="complete"&&"Setup Complete!"]})]}),s.step!=="complete"&&e.jsx("button",{className:"modal-close",onClick:N,"aria-label":"Close wizard",children:e.jsx(W,{size:20})})]}),e.jsxs("div",{className:"setup-wizard-content",children:[s.step==="auth"&&e.jsxs("div",{className:"setup-wizard-auth-step",children:[e.jsx("p",{className:"setup-wizard-auth-step-description",children:"This dashboard requires an auth token to communicate with the Fusion daemon. Paste the token below to continue."}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"setup-auth-token",children:"Auth Token"}),e.jsx("input",{id:"setup-auth-token",type:"password",value:i,onChange:a=>c(a.target.value),placeholder:"Paste the daemon auth token",autoComplete:"off",spellCheck:!1,autoFocus:!0}),e.jsxs("p",{className:"form-hint",children:["The token was set via the ",e.jsx("code",{children:"FUSION_DAEMON_TOKEN"})," environment variable when starting the dashboard."]})]}),s.error&&e.jsx("div",{className:"wizard-error",role:"alert",children:s.error})]}),s.step==="manual"&&e.jsxs("div",{className:"setup-wizard-manual",children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"project-name",children:"Project Name"}),e.jsx("input",{id:"project-name",type:"text",value:s.manualName,onChange:a=>n(t=>({...t,manualName:a.target.value})),placeholder:"my-project"}),e.jsx("p",{className:"form-hint",children:l?"By default this follows the destination folder name unless you edit it.":"By default this follows the selected directory name unless you edit it."})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"project-path",children:l?"Destination Directory":"Project Directory"}),e.jsx(q,{value:s.manualPath,onChange:P,nodeId:s.manualNodeId||void 0,localNodeId:S,placeholder:l?"/path/for/new-clone":"/path/to/your/project"}),e.jsx("p",{className:"form-hint",children:l?"Select or type an absolute destination path. Fusion will clone into this directory.":"Select or type the absolute path to your project"})]}),e.jsxs("div",{className:"setup-wizard-advanced",children:[e.jsxs("button",{type:"button",className:"setup-wizard-advanced-toggle","aria-expanded":j,onClick:()=>M(a=>!a),children:[e.jsx(Y,{size:16,className:"setup-wizard-advanced-chevron"}),e.jsx("span",{children:"Advanced settings"})]}),j&&e.jsxs("div",{className:"setup-wizard-advanced-panel",children:[e.jsxs("fieldset",{className:"setup-wizard-mode-switch","aria-label":"Project setup mode",children:[e.jsx("legend",{children:"Setup Mode"}),e.jsxs("label",{className:`setup-wizard-mode-option${b?" selected":""}`,children:[e.jsx("input",{type:"radio",name:"setup-mode",value:"existing",checked:b,onChange:()=>n(a=>({...a,manualMode:"existing",error:null}))}),e.jsx("span",{children:"Use Existing Directory"})]}),e.jsxs("label",{className:`setup-wizard-mode-option${l?" selected":""}`,children:[e.jsx("input",{type:"radio",name:"setup-mode",value:"clone",checked:l,onChange:()=>n(a=>({...a,manualMode:"clone",error:null}))}),e.jsx("span",{children:"Clone Git Repository"})]})]}),l&&e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"project-clone-url",children:"Repository URL"}),e.jsx("input",{id:"project-clone-url",type:"text",value:s.manualCloneUrl,onChange:a=>n(t=>({...t,manualCloneUrl:a.target.value})),placeholder:"https://github.com/owner/repo.git"}),e.jsx("p",{className:"form-hint",children:"Fusion will run git clone into the destination directory, then register that cloned folder."})]}),e.jsx("div",{className:"form-group",children:e.jsxs("div",{className:"project-node-selector",children:[e.jsx("span",{className:"project-node-selector__label",children:"Runtime Node"}),e.jsxs("select",{value:s.manualNodeId,onChange:a=>n(t=>({...t,manualNodeId:a.target.value})),disabled:I||s.isRegistering,children:[e.jsx("option",{value:"",children:"Local node"}),g.map(a=>e.jsxs("option",{value:a.id,children:[a.name," (",a.type,")"]},a.id))]})]})}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:"Isolation Mode"}),e.jsxs("div",{className:"setup-wizard-isolation-options",children:[e.jsxs("label",{className:`setup-wizard-isolation-option${s.manualIsolationMode==="in-process"?" selected":""}`,children:[e.jsx("input",{type:"radio",name:"isolation-mode",value:"in-process",checked:s.manualIsolationMode==="in-process",onChange:()=>n(a=>({...a,manualIsolationMode:"in-process"}))}),e.jsxs("div",{className:"setup-wizard-isolation-option-content",children:[e.jsx("strong",{children:"In-Process"}),e.jsx("span",{children:"Lower overhead, shared memory. Best for most projects."}),e.jsx("span",{className:"wizard-option-recommended",children:"Recommended"})]})]}),e.jsxs("label",{className:`setup-wizard-isolation-option${s.manualIsolationMode==="child-process"?" selected":""}`,children:[e.jsx("input",{type:"radio",name:"isolation-mode",value:"child-process",checked:s.manualIsolationMode==="child-process",onChange:()=>n(a=>({...a,manualIsolationMode:"child-process"}))}),e.jsxs("div",{className:"setup-wizard-isolation-option-content",children:[e.jsx("strong",{children:"Child-Process"}),e.jsx("span",{children:"Isolated execution with crash containment."})]})]})]})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"advanced-auth-token",children:"Browser Auth Token"}),e.jsxs("div",{className:"setup-wizard-auth-token",children:[e.jsx("input",{id:"advanced-auth-token",type:"password",value:i,onChange:a=>c(a.target.value),placeholder:u?"Enter a new token to replace the stored one":"Paste the auth token for this browser",autoComplete:"off",spellCheck:!1}),e.jsxs("div",{className:"setup-wizard-auth-token-actions",children:[e.jsx("button",{type:"button",className:"btn",onClick:v,disabled:i.trim().length===0,children:u?"Update token":"Set token"}),u&&e.jsx("button",{type:"button",className:"btn",onClick:A,children:"Reset token"})]})]}),e.jsx("p",{className:"form-hint",children:u?"A token is already stored in this browser. You can update or reset it below.":"No token is stored. Use the auth prompt at the top of the wizard, or set one here."})]})]})]}),s.error&&e.jsx("div",{className:"wizard-error",role:"alert",children:s.error})]}),s.step==="complete"&&e.jsxs("div",{className:"setup-wizard-complete",children:[e.jsxs("div",{className:"setup-wizard-success-streak","aria-hidden":"true",children:[e.jsx("div",{className:"setup-wizard-success-streak-core"}),e.jsx("div",{className:"setup-wizard-success-streak-glow"})]}),e.jsx(k,{size:64,className:"success-icon"}),e.jsx("h3",{children:"All Set!"}),e.jsx("p",{children:"Your project has been registered successfully."}),e.jsx("p",{children:"You can add more projects anytime from the project overview."})]})]}),e.jsxs("div",{className:"setup-wizard-footer",children:[e.jsx("a",{className:"btn setup-wizard-help-link",href:C,target:"_blank",rel:"noreferrer",children:"Need help?"}),s.step==="auth"&&e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn",onClick:F,children:"Skip"}),e.jsx("button",{className:"btn btn-primary",onClick:v,disabled:i.trim().length===0,children:e.jsx("span",{children:"Set Token & Continue"})})]}),s.step==="manual"&&e.jsx("button",{className:"btn btn-primary",onClick:R,disabled:E,children:s.isRegistering?e.jsxs(e.Fragment,{children:[e.jsx(G,{size:16,className:"animate-spin"}),e.jsx("span",{children:"Registering..."})]}):e.jsx("span",{children:"Register Project"})}),s.step==="complete"&&e.jsxs("button",{className:"btn btn-primary",onClick:N,children:[e.jsx(k,{size:16}),e.jsx("span",{children:"Get Started"})]})]})]})})}export{V as SetupWizardModal};
@@ -1 +1 @@
1
- import{r as i,j as e}from"./vendor-react-K0fH_qHe.js";import{bm as _,bx as q,by as B,bz as G,bv as H,X as P,R as J,a as O,b as Y,L as Z,ao as I}from"./index-CQyVRLOb.js";import"./vendor-xterm-DzcZoU0P.js";function ie({projectId:c,addToast:o,onClose:Q}){const[d,v]=i.useState([]),[f,y]=i.useState(!0),[A,E]=i.useState(!1),[L,p]=i.useState(null),[D,K]=i.useState([]),[m,V]=i.useState(""),[h,g]=i.useState(null),[k,x]=i.useState(null),[W,z]=i.useState(!1),[R,b]=i.useState(null),r=i.useRef(null),[N,M]=i.useState(""),F=m.trim()?d.filter(s=>s.name.toLowerCase().includes(m.toLowerCase())||s.relativePath.toLowerCase().includes(m.toLowerCase())):d,C=i.useCallback(async()=>{y(!0);try{const s=await _(c);v(s)}catch(s){const a=s instanceof Error?s.message:"Failed to load discovered skills";o(a,"error")}finally{y(!1)}},[c,o]),u=i.useCallback(async s=>{const a=l=>{if(!l||typeof l!="object")return!1;const t=l;if(typeof t.status=="number"&&t.status>=500)return!0;if(t.details&&typeof t.details=="object"){const w=t.details;if(typeof w.code=="string"&&w.code.startsWith("upstream_"))return!0}const n=l;return typeof n.error=="string"&&typeof n.code=="string"};E(!0),p(null);try{const l=await q(s,20,c);K(l.entries)}catch(l){if(a(l))p("Catalog is temporarily unavailable. Please try again later.");else{const t=l instanceof Error?l.message:"Failed to load catalog";p(t)}}finally{E(!1)}},[c]);i.useEffect(()=>{C(),u("")},[C,u]);const T=i.useCallback(s=>{V(s),r.current&&clearTimeout(r.current),r.current=setTimeout(()=>{M(s),r.current=null},300)},[]);i.useEffect(()=>()=>{r.current&&(clearTimeout(r.current),r.current=null)},[]),i.useEffect(()=>{u(N)},[N,u]);const U=i.useCallback(async(s,a)=>{const l=!a;v(t=>t.map(n=>n.id===s?{...n,toggling:!0}:n));try{await B(s,l,c),v(t=>t.map(n=>n.id===s?{...n,enabled:l,toggling:!1}:n)),o(`Skill ${l?"enabled":"disabled"}`,"success")}catch(t){v(w=>w.map(S=>S.id===s?{...S,toggling:!1}:S));const n=t instanceof Error?t.message:"Failed to toggle skill";o(`Failed to toggle skill: ${n}`,"error")}},[c,o]),j=i.useCallback(async s=>{z(!0),b(null),x(null);try{const a=await G(s,c);x(a)}catch(a){const l=a instanceof Error?a.message:"Failed to load skill content";b(l)}finally{z(!1)}},[c]),$=i.useCallback((s,a)=>{if(!(a&&a.target.closest(".skills-view-item-toggle"))){if(h===s){g(null),x(null),b(null);return}g(s),j(s)}},[h,j]),X=i.useCallback(s=>{h!==s&&g(s),j(s)},[j,h]);return e.jsxs("div",{className:"skills-view","data-testid":"skills-view",children:[e.jsxs("div",{className:"skills-view-header",children:[e.jsxs("div",{className:"skills-view-title",children:[e.jsxs("h2",{children:[e.jsx(H,{size:20}),"Skills"]}),e.jsxs("span",{className:"skills-view-count","aria-label":`${d.length} discovered skills`,children:[d.length," discovered"]})]}),e.jsxs("div",{className:"skills-view-actions",children:[e.jsx("button",{className:"btn-icon skills-view-close touch-target",onClick:Q,"aria-label":"Close skills view",children:e.jsx(P,{size:16})}),e.jsxs("button",{className:"btn btn-sm touch-target",onClick:()=>void C(),disabled:f,children:[e.jsx(J,{size:14,className:f?"spin":""}),"Refresh"]})]})]}),e.jsxs("div",{className:"skills-view-content",children:[e.jsx("div",{className:"skills-view-search",children:e.jsx("input",{type:"text",className:"form-input",placeholder:"Search skills...",value:m,onChange:s=>T(s.target.value),"aria-label":"Search skills"})}),e.jsxs("section",{className:"skills-view-section","aria-labelledby":"discovered-skills-title",children:[e.jsx("h3",{id:"discovered-skills-title",className:"skills-view-section-title",children:"Discovered Skills"}),f?e.jsxs("div",{className:"skills-view-loading",children:[e.jsx("span",{className:"spinner"}),"Loading discovered skills..."]}):d.length===0?e.jsx("div",{className:"skills-view-empty",children:e.jsx("p",{children:"No skills discovered in this project."})}):F.length===0?e.jsx("div",{className:"skills-view-empty",children:e.jsx("p",{children:"No discovered skills match your search."})}):e.jsx("div",{className:"skills-view-list",children:F.map(s=>{const a=h===s.id;return e.jsxs("div",{children:[e.jsxs("div",{className:`skills-view-item${a?" skills-view-item--selected":""}`,onClick:l=>$(s.id,l),role:"button",tabIndex:0,onKeyDown:l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),$(s.id))},"aria-expanded":a,"aria-label":`View details for ${s.name}`,children:[e.jsxs("div",{className:"skills-view-item-info",children:[e.jsxs("span",{className:"skills-view-item-name",children:[a?e.jsx(O,{size:14}):e.jsx(Y,{size:14}),s.name]}),e.jsx("span",{className:"skills-view-item-path",children:s.relativePath}),e.jsx("span",{className:"skills-view-item-source",children:s.metadata.source})]}),e.jsxs("label",{className:"skills-view-item-toggle",onClick:l=>l.stopPropagation(),children:[e.jsx("input",{type:"checkbox",checked:s.enabled,disabled:s.toggling,onChange:()=>void U(s.id,s.enabled),"aria-label":`${s.enabled?"Disable":"Enable"} ${s.name}`}),e.jsx("span",{className:"skills-view-toggle-slider"})]})]}),a&&e.jsxs("div",{className:"skills-view-detail","data-testid":"skill-detail",children:[e.jsxs("div",{className:"skills-view-detail-header",children:[e.jsx("span",{className:"skills-view-detail-title",children:s.name}),e.jsxs("button",{className:"btn btn-sm skills-view-detail-close",onClick:()=>{g(null),x(null),b(null)},"aria-label":"Close skill detail",children:[e.jsx(P,{size:14}),"Close"]})]}),W?e.jsxs("div",{className:"skills-view-detail-loading",children:[e.jsx(Z,{size:16,className:"spin"}),"Loading skill content..."]}):R?e.jsxs("div",{className:"skills-view-detail-error",children:[e.jsx(I,{size:14}),e.jsx("span",{children:R}),e.jsx("button",{className:"btn btn-sm",onClick:()=>X(s.id),children:"Retry"})]}):k?e.jsxs(e.Fragment,{children:[e.jsx("pre",{className:"skills-view-detail-content",children:k.skillMd||"(No SKILL.md found)"}),k.files.length>0&&e.jsxs("div",{className:"skills-view-detail-files",children:[e.jsx("span",{className:"skills-view-detail-files-label",children:"Files:"}),k.files.map(l=>e.jsxs("span",{className:"badge badge--sm",children:[l.name,l.type==="directory"&&"/"]},l.relativePath))]})]}):null]})]},s.id)})})]}),e.jsxs("section",{className:"skills-view-section","aria-labelledby":"catalog-title",children:[e.jsx("h3",{id:"catalog-title",className:"skills-view-section-title",children:"Skills Catalog"}),L?e.jsxs("div",{className:"skills-view-error",children:[e.jsx("p",{children:L}),e.jsx("button",{className:"btn btn-sm",onClick:()=>void u(N),children:"Try Again"})]}):A?e.jsxs("div",{className:"skills-view-loading",children:[e.jsx("span",{className:"spinner"}),"Loading catalog..."]}):D.length===0?e.jsx("div",{className:"skills-view-empty",children:m?e.jsx("p",{children:"No skills match your search."}):e.jsx("p",{children:"No skills available in the catalog."})}):e.jsx("div",{className:"skills-view-grid",children:D.map(s=>e.jsxs("div",{className:"skills-view-card",children:[e.jsx("h4",{className:"skills-view-card-title",children:s.name}),s.description&&e.jsx("p",{className:"skills-view-card-description",children:s.description}),s.tags&&s.tags.length>0&&e.jsx("div",{className:"skills-view-card-tags",children:s.tags.map(a=>e.jsx("span",{className:"badge badge--sm",children:a},a))}),s.installs!==void 0&&e.jsxs("span",{className:"skills-view-card-installs",children:[s.installs.toLocaleString()," installs"]})]},s.id))})]})]})]})}export{ie as SkillsView};
1
+ import{r as i,j as e}from"./vendor-react-K0fH_qHe.js";import{bm as _,bx as q,by as B,bz as G,bv as H,X as P,R as J,a as O,b as Y,L as Z,ao as I}from"./index-Bdw6llW6.js";import"./vendor-xterm-DzcZoU0P.js";function ie({projectId:c,addToast:o,onClose:Q}){const[d,v]=i.useState([]),[f,y]=i.useState(!0),[A,E]=i.useState(!1),[L,p]=i.useState(null),[D,K]=i.useState([]),[m,V]=i.useState(""),[h,g]=i.useState(null),[k,x]=i.useState(null),[W,z]=i.useState(!1),[R,b]=i.useState(null),r=i.useRef(null),[N,M]=i.useState(""),F=m.trim()?d.filter(s=>s.name.toLowerCase().includes(m.toLowerCase())||s.relativePath.toLowerCase().includes(m.toLowerCase())):d,C=i.useCallback(async()=>{y(!0);try{const s=await _(c);v(s)}catch(s){const a=s instanceof Error?s.message:"Failed to load discovered skills";o(a,"error")}finally{y(!1)}},[c,o]),u=i.useCallback(async s=>{const a=l=>{if(!l||typeof l!="object")return!1;const t=l;if(typeof t.status=="number"&&t.status>=500)return!0;if(t.details&&typeof t.details=="object"){const w=t.details;if(typeof w.code=="string"&&w.code.startsWith("upstream_"))return!0}const n=l;return typeof n.error=="string"&&typeof n.code=="string"};E(!0),p(null);try{const l=await q(s,20,c);K(l.entries)}catch(l){if(a(l))p("Catalog is temporarily unavailable. Please try again later.");else{const t=l instanceof Error?l.message:"Failed to load catalog";p(t)}}finally{E(!1)}},[c]);i.useEffect(()=>{C(),u("")},[C,u]);const T=i.useCallback(s=>{V(s),r.current&&clearTimeout(r.current),r.current=setTimeout(()=>{M(s),r.current=null},300)},[]);i.useEffect(()=>()=>{r.current&&(clearTimeout(r.current),r.current=null)},[]),i.useEffect(()=>{u(N)},[N,u]);const U=i.useCallback(async(s,a)=>{const l=!a;v(t=>t.map(n=>n.id===s?{...n,toggling:!0}:n));try{await B(s,l,c),v(t=>t.map(n=>n.id===s?{...n,enabled:l,toggling:!1}:n)),o(`Skill ${l?"enabled":"disabled"}`,"success")}catch(t){v(w=>w.map(S=>S.id===s?{...S,toggling:!1}:S));const n=t instanceof Error?t.message:"Failed to toggle skill";o(`Failed to toggle skill: ${n}`,"error")}},[c,o]),j=i.useCallback(async s=>{z(!0),b(null),x(null);try{const a=await G(s,c);x(a)}catch(a){const l=a instanceof Error?a.message:"Failed to load skill content";b(l)}finally{z(!1)}},[c]),$=i.useCallback((s,a)=>{if(!(a&&a.target.closest(".skills-view-item-toggle"))){if(h===s){g(null),x(null),b(null);return}g(s),j(s)}},[h,j]),X=i.useCallback(s=>{h!==s&&g(s),j(s)},[j,h]);return e.jsxs("div",{className:"skills-view","data-testid":"skills-view",children:[e.jsxs("div",{className:"skills-view-header",children:[e.jsxs("div",{className:"skills-view-title",children:[e.jsxs("h2",{children:[e.jsx(H,{size:20}),"Skills"]}),e.jsxs("span",{className:"skills-view-count","aria-label":`${d.length} discovered skills`,children:[d.length," discovered"]})]}),e.jsxs("div",{className:"skills-view-actions",children:[e.jsx("button",{className:"btn-icon skills-view-close touch-target",onClick:Q,"aria-label":"Close skills view",children:e.jsx(P,{size:16})}),e.jsxs("button",{className:"btn btn-sm touch-target",onClick:()=>void C(),disabled:f,children:[e.jsx(J,{size:14,className:f?"spin":""}),"Refresh"]})]})]}),e.jsxs("div",{className:"skills-view-content",children:[e.jsx("div",{className:"skills-view-search",children:e.jsx("input",{type:"text",className:"form-input",placeholder:"Search skills...",value:m,onChange:s=>T(s.target.value),"aria-label":"Search skills"})}),e.jsxs("section",{className:"skills-view-section","aria-labelledby":"discovered-skills-title",children:[e.jsx("h3",{id:"discovered-skills-title",className:"skills-view-section-title",children:"Discovered Skills"}),f?e.jsxs("div",{className:"skills-view-loading",children:[e.jsx("span",{className:"spinner"}),"Loading discovered skills..."]}):d.length===0?e.jsx("div",{className:"skills-view-empty",children:e.jsx("p",{children:"No skills discovered in this project."})}):F.length===0?e.jsx("div",{className:"skills-view-empty",children:e.jsx("p",{children:"No discovered skills match your search."})}):e.jsx("div",{className:"skills-view-list",children:F.map(s=>{const a=h===s.id;return e.jsxs("div",{children:[e.jsxs("div",{className:`skills-view-item${a?" skills-view-item--selected":""}`,onClick:l=>$(s.id,l),role:"button",tabIndex:0,onKeyDown:l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),$(s.id))},"aria-expanded":a,"aria-label":`View details for ${s.name}`,children:[e.jsxs("div",{className:"skills-view-item-info",children:[e.jsxs("span",{className:"skills-view-item-name",children:[a?e.jsx(O,{size:14}):e.jsx(Y,{size:14}),s.name]}),e.jsx("span",{className:"skills-view-item-path",children:s.relativePath}),e.jsx("span",{className:"skills-view-item-source",children:s.metadata.source})]}),e.jsxs("label",{className:"skills-view-item-toggle",onClick:l=>l.stopPropagation(),children:[e.jsx("input",{type:"checkbox",checked:s.enabled,disabled:s.toggling,onChange:()=>void U(s.id,s.enabled),"aria-label":`${s.enabled?"Disable":"Enable"} ${s.name}`}),e.jsx("span",{className:"skills-view-toggle-slider"})]})]}),a&&e.jsxs("div",{className:"skills-view-detail","data-testid":"skill-detail",children:[e.jsxs("div",{className:"skills-view-detail-header",children:[e.jsx("span",{className:"skills-view-detail-title",children:s.name}),e.jsxs("button",{className:"btn btn-sm skills-view-detail-close",onClick:()=>{g(null),x(null),b(null)},"aria-label":"Close skill detail",children:[e.jsx(P,{size:14}),"Close"]})]}),W?e.jsxs("div",{className:"skills-view-detail-loading",children:[e.jsx(Z,{size:16,className:"spin"}),"Loading skill content..."]}):R?e.jsxs("div",{className:"skills-view-detail-error",children:[e.jsx(I,{size:14}),e.jsx("span",{children:R}),e.jsx("button",{className:"btn btn-sm",onClick:()=>X(s.id),children:"Retry"})]}):k?e.jsxs(e.Fragment,{children:[e.jsx("pre",{className:"skills-view-detail-content",children:k.skillMd||"(No SKILL.md found)"}),k.files.length>0&&e.jsxs("div",{className:"skills-view-detail-files",children:[e.jsx("span",{className:"skills-view-detail-files-label",children:"Files:"}),k.files.map(l=>e.jsxs("span",{className:"badge badge--sm",children:[l.name,l.type==="directory"&&"/"]},l.relativePath))]})]}):null]})]},s.id)})})]}),e.jsxs("section",{className:"skills-view-section","aria-labelledby":"catalog-title",children:[e.jsx("h3",{id:"catalog-title",className:"skills-view-section-title",children:"Skills Catalog"}),L?e.jsxs("div",{className:"skills-view-error",children:[e.jsx("p",{children:L}),e.jsx("button",{className:"btn btn-sm",onClick:()=>void u(N),children:"Try Again"})]}):A?e.jsxs("div",{className:"skills-view-loading",children:[e.jsx("span",{className:"spinner"}),"Loading catalog..."]}):D.length===0?e.jsx("div",{className:"skills-view-empty",children:m?e.jsx("p",{children:"No skills match your search."}):e.jsx("p",{children:"No skills available in the catalog."})}):e.jsx("div",{className:"skills-view-grid",children:D.map(s=>e.jsxs("div",{className:"skills-view-card",children:[e.jsx("h4",{className:"skills-view-card-title",children:s.name}),s.description&&e.jsx("p",{className:"skills-view-card-description",children:s.description}),s.tags&&s.tags.length>0&&e.jsx("div",{className:"skills-view-card-tags",children:s.tags.map(a=>e.jsx("span",{className:"badge badge--sm",children:a},a))}),s.installs!==void 0&&e.jsxs("span",{className:"skills-view-card-installs",children:[s.installs.toLocaleString()," installs"]})]},s.id))})]})]})]})}export{ie as SkillsView};
@@ -0,0 +1 @@
1
+ .stash-recovery-view{padding:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-md)}.stash-recovery-header{display:flex;align-items:center;gap:var(--space-md)}.stash-row{display:grid;grid-template-columns:1fr 1fr 1fr auto auto;gap:var(--space-sm);align-items:center;padding:var(--space-sm) 0;border-bottom:var(--btn-border-width) solid var(--border)}.stash-field{display:flex;flex-direction:column;gap:var(--space-xs)}.stash-field-label{display:none;color:var(--text-muted);font-size:.75rem;text-transform:uppercase}.stash-row-actions,.stash-row-actions-danger{display:flex;gap:var(--space-sm);justify-content:flex-end}.stash-action-btn{white-space:nowrap}.stash-status{color:var(--text-muted);grid-column:1 / -1}.stash-recovery-diff-modal{max-width:80vw}.stash-recovery-diff-pre{margin:0;padding:var(--space-md);max-height:50vh;overflow:auto;background:var(--surface);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:.75rem;line-height:1.5;white-space:pre-wrap;word-break:break-word}@media(max-width:768px){.stash-row{display:flex;flex-direction:column;align-items:stretch;gap:var(--space-md)}.stash-field-label{display:inline}.stash-row-actions,.stash-row-actions-danger{justify-content:stretch}.stash-action-btn{flex:1;min-height:var(--mobile-nav-height)}.stash-row-actions-danger .stash-action-btn{width:100%}.stash-recovery-diff-modal{width:100%;max-width:100%}}
@@ -0,0 +1 @@
1
+ import{r as t,j as s}from"./vendor-react-K0fH_qHe.js";import{v as y,cg as i}from"./index-Bdw6llW6.js";import"./vendor-xterm-DzcZoU0P.js";function w(){const{confirm:h}=y(),[c,u]=t.useState([]),[d,f]=t.useState(null),[p,x]=t.useState({}),[n,l]=t.useState(null),o=t.useCallback(async()=>{try{f(null);const a=await i("/stash-recovery/orphans");u(a.records??[])}catch(a){f(a instanceof Error?a.message:"Failed to load orphans")}},[]);t.useEffect(()=>{o()},[o]);const j=t.useMemo(()=>{const a=new Map;for(const e of c){const r=e.sourceTaskId??"Unknown source",m=a.get(r)??[];m.push(e),a.set(r,m)}return Array.from(a.entries())},[c]),v=t.useCallback(async a=>{const e=await i(`/stash-recovery/orphans/${a}/apply`,{method:"POST"});x(r=>({...r,[a]:e.ok?"Applied":e.stderr??e.reason??"Apply failed"}))},[]),b=t.useCallback(async a=>{await h({title:"Drop orphaned stash?",message:"This removes the stash entry permanently.",confirmLabel:"Drop",danger:!0})&&(await i(`/stash-recovery/orphans/${a}/drop`,{method:"POST",body:JSON.stringify({confirm:!0})}),await o())},[h,o]),N=t.useCallback(async a=>{l({sha:a,diff:"",truncated:!1,loading:!0,error:null});try{const e=await i(`/stash-recovery/orphans/${a}/diff`);l({sha:a,diff:e.diff??"",truncated:!!e.truncated,loading:!1,error:null})}catch(e){l({sha:a,diff:"",truncated:!1,loading:!1,error:e instanceof Error?e.message:"Failed to load diff"})}},[]);return c.length===0&&!d?s.jsxs("div",{className:"card stash-recovery-view",children:[s.jsx("p",{children:"No orphaned merger autostashes found."}),s.jsx("button",{className:"btn btn-sm",onClick:()=>void o(),children:"Refresh"})]}):s.jsxs("div",{className:"card stash-recovery-view",children:[s.jsxs("div",{className:"stash-recovery-header",children:[s.jsx("h2",{children:"Stash Recovery"}),s.jsxs("span",{children:[c.length," orphans"]}),s.jsx("button",{className:"btn btn-sm",onClick:()=>void o(),children:"Refresh"})]}),d&&s.jsx("div",{className:"form-error",children:d}),j.map(([a,e])=>s.jsxs("section",{children:[s.jsx("h3",{children:a}),e.map(r=>s.jsxs("div",{className:"stash-row",children:[s.jsxs("div",{className:"stash-field",children:[s.jsx("span",{className:"stash-field-label",children:"SHA"}),s.jsx("span",{children:r.sha.slice(0,7)})]}),s.jsxs("div",{className:"stash-field",children:[s.jsx("span",{className:"stash-field-label",children:"Classification"}),s.jsx("span",{children:r.classification})]}),s.jsxs("div",{className:"stash-field",children:[s.jsx("span",{className:"stash-field-label",children:"Changed paths"}),s.jsxs("span",{children:[r.changedPaths.length," files"]})]}),s.jsxs("div",{className:"stash-row-actions",children:[s.jsx("button",{className:"btn btn-sm stash-action-btn",onClick:()=>void N(r.sha),children:"Inspect diff"}),s.jsx("button",{className:"btn btn-sm stash-action-btn",onClick:()=>void v(r.sha),children:"Apply"})]}),s.jsx("div",{className:"stash-row-actions-danger",children:s.jsx("button",{className:"btn btn-sm btn-danger stash-action-btn",onClick:()=>void b(r.sha),children:"Drop"})}),p[r.sha]&&s.jsx("div",{className:"stash-status",children:p[r.sha]})]},r.sha))]},a)),n&&s.jsx("div",{className:"modal-overlay open",onClick:()=>l(null),children:s.jsxs("div",{className:"modal stash-recovery-diff-modal",role:"dialog","aria-modal":"true","aria-label":`Diff for ${n.sha}`,onClick:a=>a.stopPropagation(),children:[s.jsxs("div",{className:"modal-header",children:[s.jsxs("h3",{children:["Diff for ",n.sha.slice(0,7)]}),s.jsx("button",{className:"modal-close",onClick:()=>l(null),"aria-label":"Close diff dialog",children:"×"})]}),n.loading&&s.jsx("p",{children:"Loading diff…"}),n.error&&s.jsx("div",{className:"form-error",children:n.error}),!n.loading&&!n.error&&s.jsxs(s.Fragment,{children:[s.jsx("pre",{className:"stash-recovery-diff-pre",children:n.diff||"No diff output available."}),n.truncated&&s.jsx("p",{className:"stash-status",children:"Diff output truncated."})]}),s.jsx("div",{className:"modal-actions",children:s.jsx("button",{className:"btn",onClick:()=>l(null),children:"Close"})})]})})]})}export{w as StashRecoveryView};
@@ -1,4 +1,4 @@
1
- import{r as d,j as e}from"./vendor-react-K0fH_qHe.js";import{c as wt,c6 as Ct,c7 as St,c8 as At,c9 as $t,ca as Et,cb as Dt,cc as Ft,cd as Tt,v as Mt,i as Ot,z as H,ce as lt,L as Rt,I as Pt,bn as J,X as Q,cf as ut,aU as mt,W as bt,ad as Ut,a as _t,aq as Kt,B as pt}from"./index-CQyVRLOb.js";import"./vendor-xterm-DzcZoU0P.js";/**
1
+ import{r as d,j as e}from"./vendor-react-K0fH_qHe.js";import{c as wt,c6 as Ct,c7 as St,c8 as At,c9 as $t,ca as Et,cb as Dt,cc as Ft,cd as Tt,v as Mt,i as Ot,z as H,ce as lt,L as Rt,I as Pt,bn as J,X as Q,cf as ut,aU as mt,W as bt,ad as Ut,a as _t,aq as Kt,B as pt}from"./index-Bdw6llW6.js";import"./vendor-xterm-DzcZoU0P.js";/**
2
2
  * @license lucide-react v1.7.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{r as o,j as M}from"./vendor-react-K0fH_qHe.js";import{cg as Mt,ch as Pt,t as wt,w as Ct,b5 as St}from"./index-CQyVRLOb.js";import{c as nt}from"./createLucideIcon-BazL2hk5.js";import"./vendor-xterm-DzcZoU0P.js";const ft=4;function Dt({taskId:t,position:r,scale:c,onPositionChange:l,onDragStateChange:a,onDragEnd:i}){const[d,k]=o.useState(!1),y=o.useRef(null),C=o.useRef(r),m=o.useRef(!1);C.current=r;const b=o.useCallback(s=>{y.current=null,k(!1),s&&(a?.(!1),i?.(),m.current=!0)},[i,a]),n=o.useCallback(s=>{if(!s.isPrimary)return;s.stopPropagation();const w=s.currentTarget;typeof w.setPointerCapture=="function"&&w.setPointerCapture(s.pointerId),y.current={pointerId:s.pointerId,startPointer:{x:s.clientX,y:s.clientY},startPosition:C.current}},[]),g=o.useCallback(s=>{const w=y.current;if(!w||w.pointerId!==s.pointerId)return;s.stopPropagation();const E=s.clientX-w.startPointer.x,N=s.clientY-w.startPointer.y,$=Math.hypot(E,N);if(!d&&$>=ft&&(k(!0),a?.(!0)),$<ft)return;const v=c>0?c:1;l(t,{x:w.startPosition.x+E/v,y:w.startPosition.y+N/v})},[d,a,l,c,t]),h=o.useCallback(s=>{const w=y.current;!w||w.pointerId!==s.pointerId||(s.stopPropagation(),typeof s.currentTarget.hasPointerCapture=="function"&&s.currentTarget.hasPointerCapture(s.pointerId)&&typeof s.currentTarget.releasePointerCapture=="function"&&s.currentTarget.releasePointerCapture(s.pointerId),b(d))},[b,d]),P=o.useCallback(s=>{const w=y.current;!w||w.pointerId!==s.pointerId||(s.stopPropagation(),typeof s.currentTarget.hasPointerCapture=="function"&&s.currentTarget.hasPointerCapture(s.pointerId)&&typeof s.currentTarget.releasePointerCapture=="function"&&s.currentTarget.releasePointerCapture(s.pointerId),b(d))},[b,d]),j=o.useCallback(s=>{m.current&&(m.current=!1,s.preventDefault(),s.stopPropagation())},[]);return o.useMemo(()=>({isDragging:d,onPointerDown:n,onPointerMove:g,onPointerUp:h,onPointerCancel:P,onClickCapture:j}),[d,j,P,n,g,h])}const Tt=new Set(["planning","researching","executing","finalizing","merging","merging-fix"]);function Nt(t){return t?t.charAt(0).toUpperCase()+t.slice(1):"Executing"}function It({style:t,position:r,scale:c,isHighlighted:l=!1,isDimmed:a=!1,onMouseEnter:i,onMouseLeave:d,onClick:k,onNodePositionChange:y,onNodeDragStateChange:C,onNodeDragEnd:m,...b}){const{task:n,globalPaused:g,taskStuckTimeoutMs:h,lastFetchTimeMs:P,onOpenDetail:j}=b,s=n.status==="failed",w=n.paused===!0,E=Mt(n,h,P),N=n.column==="triage"&&n.status==="awaiting-approval",$=!g&&!s&&!w&&!E&&!N&&(n.column==="in-progress"||Tt.has(n.status)),v=typeof n.currentStep=="number"&&n.currentStep>=0&&Array.isArray(n.steps)&&n.currentStep<n.steps.length,q=n.column==="in-review",G=Dt({taskId:n.id,position:r,scale:c,onPositionChange:y,onDragStateChange:C,onDragEnd:m});return M.jsxs("div",{className:`graph-task-node graph-node--draggable${G.isDragging?" graph-node--dragging":""}${l?" graph-task-node--highlighted graph-node--highlighted":""}${a?" graph-task-node--dimmed graph-node--dimmed":""}${$?" graph-task-node--active":""}${q?" graph-task-node--in-review":""}`,style:t,draggable:!1,"data-testid":`graph-task-node-${n.id}`,"data-current-step":$&&v?String(n.currentStep):void 0,onMouseEnter:i,onMouseLeave:d,onClick:H=>{k?.(H),!H.defaultPrevented&&j(n)},onClickCapture:G.onClickCapture,onPointerDown:G.onPointerDown,onPointerMove:G.onPointerMove,onPointerUp:G.onPointerUp,onPointerCancel:G.onPointerCancel,children:[$?M.jsx("div",{className:"graph-task-active-indicator",children:M.jsx("span",{className:"graph-task-active-indicator-text",children:Nt(n.status)})}):null,M.jsx(Pt,{...b,onOpenDetail:()=>{},disableDrag:!0})]})}/**
1
+ import{r as o,j as M}from"./vendor-react-K0fH_qHe.js";import{ch as Mt,ci as Pt,t as wt,w as Ct,b5 as St}from"./index-Bdw6llW6.js";import{c as nt}from"./createLucideIcon-BazL2hk5.js";import"./vendor-xterm-DzcZoU0P.js";const ft=4;function Dt({taskId:t,position:r,scale:c,onPositionChange:l,onDragStateChange:a,onDragEnd:i}){const[d,k]=o.useState(!1),y=o.useRef(null),C=o.useRef(r),m=o.useRef(!1);C.current=r;const b=o.useCallback(s=>{y.current=null,k(!1),s&&(a?.(!1),i?.(),m.current=!0)},[i,a]),n=o.useCallback(s=>{if(!s.isPrimary)return;s.stopPropagation();const w=s.currentTarget;typeof w.setPointerCapture=="function"&&w.setPointerCapture(s.pointerId),y.current={pointerId:s.pointerId,startPointer:{x:s.clientX,y:s.clientY},startPosition:C.current}},[]),g=o.useCallback(s=>{const w=y.current;if(!w||w.pointerId!==s.pointerId)return;s.stopPropagation();const E=s.clientX-w.startPointer.x,N=s.clientY-w.startPointer.y,$=Math.hypot(E,N);if(!d&&$>=ft&&(k(!0),a?.(!0)),$<ft)return;const v=c>0?c:1;l(t,{x:w.startPosition.x+E/v,y:w.startPosition.y+N/v})},[d,a,l,c,t]),h=o.useCallback(s=>{const w=y.current;!w||w.pointerId!==s.pointerId||(s.stopPropagation(),typeof s.currentTarget.hasPointerCapture=="function"&&s.currentTarget.hasPointerCapture(s.pointerId)&&typeof s.currentTarget.releasePointerCapture=="function"&&s.currentTarget.releasePointerCapture(s.pointerId),b(d))},[b,d]),P=o.useCallback(s=>{const w=y.current;!w||w.pointerId!==s.pointerId||(s.stopPropagation(),typeof s.currentTarget.hasPointerCapture=="function"&&s.currentTarget.hasPointerCapture(s.pointerId)&&typeof s.currentTarget.releasePointerCapture=="function"&&s.currentTarget.releasePointerCapture(s.pointerId),b(d))},[b,d]),j=o.useCallback(s=>{m.current&&(m.current=!1,s.preventDefault(),s.stopPropagation())},[]);return o.useMemo(()=>({isDragging:d,onPointerDown:n,onPointerMove:g,onPointerUp:h,onPointerCancel:P,onClickCapture:j}),[d,j,P,n,g,h])}const Tt=new Set(["planning","researching","executing","finalizing","merging","merging-fix"]);function Nt(t){return t?t.charAt(0).toUpperCase()+t.slice(1):"Executing"}function It({style:t,position:r,scale:c,isHighlighted:l=!1,isDimmed:a=!1,onMouseEnter:i,onMouseLeave:d,onClick:k,onNodePositionChange:y,onNodeDragStateChange:C,onNodeDragEnd:m,...b}){const{task:n,globalPaused:g,taskStuckTimeoutMs:h,lastFetchTimeMs:P,onOpenDetail:j}=b,s=n.status==="failed",w=n.paused===!0,E=Mt(n,h,P),N=n.column==="triage"&&n.status==="awaiting-approval",$=!g&&!s&&!w&&!E&&!N&&(n.column==="in-progress"||Tt.has(n.status)),v=typeof n.currentStep=="number"&&n.currentStep>=0&&Array.isArray(n.steps)&&n.currentStep<n.steps.length,q=n.column==="in-review",G=Dt({taskId:n.id,position:r,scale:c,onPositionChange:y,onDragStateChange:C,onDragEnd:m});return M.jsxs("div",{className:`graph-task-node graph-node--draggable${G.isDragging?" graph-node--dragging":""}${l?" graph-task-node--highlighted graph-node--highlighted":""}${a?" graph-task-node--dimmed graph-node--dimmed":""}${$?" graph-task-node--active":""}${q?" graph-task-node--in-review":""}`,style:t,draggable:!1,"data-testid":`graph-task-node-${n.id}`,"data-current-step":$&&v?String(n.currentStep):void 0,onMouseEnter:i,onMouseLeave:d,onClick:H=>{k?.(H),!H.defaultPrevented&&j(n)},onClickCapture:G.onClickCapture,onPointerDown:G.onPointerDown,onPointerMove:G.onPointerMove,onPointerUp:G.onPointerUp,onPointerCancel:G.onPointerCancel,children:[$?M.jsx("div",{className:"graph-task-active-indicator",children:M.jsx("span",{className:"graph-task-active-indicator-text",children:Nt(n.status)})}):null,M.jsx(Pt,{...b,onOpenDetail:()=>{},disableDrag:!0})]})}/**
2
2
  * @license lucide-react v0.542.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -18,4 +18,4 @@ import{r as o,j as M}from"./vendor-react-K0fH_qHe.js";import{cg as Mt,ch as Pt,t
18
18
  *
19
19
  * This source code is licensed under the ISC license.
20
20
  * See the LICENSE file in the root directory of this source tree.
21
- */const $t=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]],Ht=nt("zoom-out",$t);function Gt({zoom:t,onZoomIn:r,onZoomOut:c,onFitToGraph:l,onResetView:a}){return M.jsxs("div",{className:"graph-toolbar","data-testid":"graph-toolbar",children:[M.jsx("button",{className:"btn btn-icon",title:"Zoom in (Ctrl+=)","aria-label":"Zoom in",onClick:r,children:M.jsx(_t,{size:16})}),M.jsx("button",{className:"btn btn-icon",title:"Zoom out (Ctrl+-)","aria-label":"Zoom out",onClick:c,children:M.jsx(Ht,{size:16})}),M.jsxs("div",{className:"graph-toolbar__zoom-label","aria-live":"polite",children:[Math.round(t*100),"%"]}),M.jsx("button",{className:"btn btn-icon",title:"Fit to graph (Ctrl+Shift+F)","aria-label":"Fit to graph",onClick:l,children:M.jsx(zt,{size:16})}),M.jsx("button",{className:"btn btn-icon",title:"Reset view (Ctrl+0)","aria-label":"Reset view",onClick:a,children:M.jsx(Et,{size:16})})]})}const At=280,Lt=100;function Wt({edges:t,positions:r,nodeWidth:c=At,nodeHeight:l=Lt,highlightedEdgeIds:a}){const i=!!(a&&a.size>0);return M.jsxs("svg",{className:"dependency-graph-edges","aria-hidden":"true",children:[M.jsx("defs",{children:M.jsx("marker",{id:"dependency-graph-arrowhead",markerWidth:"10",markerHeight:"7",refX:"10",refY:"3.5",orient:"auto",markerUnits:"strokeWidth",children:M.jsx("path",{d:"M 0 0 L 10 3.5 L 0 7 z",fill:"var(--border)"})})}),t.map(d=>{const k=r.get(d.source),y=r.get(d.target);if(!k||!y)return null;const C=`${d.source}->${d.target}`,m=i&&(a?.has(C)??!1),b=k.x+c/2,n=k.y+l,g=y.x+c/2,h=y.y,P=n+(h-n)/2;return M.jsx("path",{"data-testid":"dependency-edge","data-edge-id":C,className:`dependency-graph-edge${m?" graph-edge--highlighted":""}${i&&!m?" graph-edge--dimmed":""}`,d:`M ${b} ${n} C ${b} ${P}, ${g} ${P}, ${g} ${h}`,fill:"none",stroke:m?"var(--todo)":"var(--border)",strokeWidth:m?"var(--space-xs)":"var(--btn-border-width)",opacity:i&&!m?.15:1,markerEnd:"url(#dependency-graph-arrowhead)",style:{transition:"opacity var(--transition-fast), stroke var(--transition-fast), stroke-width var(--transition-fast)"}},C)})]})}const vt=new Set(["triage","todo","in-progress","in-review"]);function Yt(t){return t.filter(r=>vt.has(r.column))}const Xt={nodeWidth:280,nodeHeight:100,horizontalGap:40,verticalGap:80};function it(t,r){const c={...Xt,...r},l=t.nodes.map(n=>n.task.id);if(l.length===0)return new Map;const a=new Map,i=new Map;for(const n of l)i.set(n,0),a.set(n,[]);for(const n of t.edges)!i.has(n.source)||!i.has(n.target)||(a.get(n.target)?.push(n.source),i.set(n.source,(i.get(n.source)??0)+1));const d=l.filter(n=>(i.get(n)??0)===0),k=[];for(;d.length>0;){const n=d.shift();k.push(n);for(const g of a.get(n)??[]){const h=(i.get(g)??0)-1;i.set(g,h),h===0&&d.push(g)}}for(const n of l)k.includes(n)||k.push(n);const y=new Map;for(const n of k){const g=t.edges.filter(P=>P.source===n).map(P=>P.target);let h=0;for(const P of g)h=Math.max(h,(y.get(P)??0)+1);y.set(n,h)}const C=new Map;for(const n of l){const g=y.get(n)??0,h=C.get(g)??[];h.push(n),C.set(g,h)}const m=new Map,b=Array.from(C.keys()).sort((n,g)=>n-g);for(const n of b){const g=C.get(n)??[];g.sort();const P=-(g.length*c.nodeWidth+Math.max(0,g.length-1)*c.horizontalGap)/2;g.forEach((j,s)=>{const w=P+s*(c.nodeWidth+c.horizontalGap),E=n*(c.nodeHeight+c.verticalGap);m.set(j,{x:w,y:E})})}return m}function Zt(t){return o.useMemo(()=>{const r=t.map(a=>({task:a})),c=new Set(t.map(a=>a.id)),l=t.flatMap(a=>(a.dependencies??[]).filter(i=>c.has(i)).map(i=>({source:a.id,target:i})));return{nodes:r,edges:l}},[t])}const Q=.1,tt=3,ht=40,Ut=200;function K(t,r,c){return Math.min(c,Math.max(r,t))}function Ft(t){if(!(t instanceof HTMLElement))return!1;const r=t.tagName.toLowerCase();return t.isContentEditable||r==="input"||r==="textarea"||r==="select"}function Vt(){const[t,r]=o.useState({x:0,y:0}),[c,l]=o.useState(1),[a,i]=o.useState(!1),d=o.useRef(t),k=o.useRef(c),y=o.useRef(null),C=o.useRef(null),m=o.useRef(new Map),b=o.useRef(null);o.useEffect(()=>{d.current=t},[t]),o.useEffect(()=>{k.current=c},[c]),o.useEffect(()=>()=>{y.current!==null&&window.clearTimeout(y.current)},[]);const n=o.useMemo(()=>`translate(${t.x}px, ${t.y}px) scale(${c})`,[t.x,t.y,c]),g=o.useMemo(()=>Math.round(c*100),[c]),h=o.useCallback(u=>{if(!u){y.current!==null&&(window.clearTimeout(y.current),y.current=null),i(!1);return}i(!0),y.current!==null&&window.clearTimeout(y.current),y.current=window.setTimeout(()=>{i(!1),y.current=null},Ut)},[]),P=o.useCallback((u,p,f)=>({x:K(u.x,-p,p),y:K(u.y,-f,f)}),[]),j=o.useCallback((u,p,f,S)=>{const D=k.current,I=d.current,R=K(u,Q,tt),O=R/D,z=P({x:p.x-(p.x-I.x)*O,y:p.y-(p.y-I.y)*O},f,S);l(R),r(z)},[P]),s=o.useCallback((u,p,f,S)=>{h(!1);const D=S??{x:p/2,y:f/2};j(k.current*u,D,p,f)},[h,j]),w=o.useCallback((u,p)=>{if(u&&p){s(1.2,u,p);return}l(f=>K(f+.1,Q,tt))},[s]),E=o.useCallback((u,p)=>{if(u&&p){s(1/1.2,u,p);return}l(f=>K(f-.1,Q,tt))},[s]),N=o.useCallback(()=>{h(!0),r({x:0,y:0}),l(1)},[h]),$=o.useCallback((u,p,f,S)=>{if(h(!0),u.size===0){r({x:0,y:0}),l(1);return}const D=S?.nodeWidth??280,I=S?.nodeHeight??100,R=Array.from(u.values()),O=Math.min(...R.map(A=>A.x)),z=Math.min(...R.map(A=>A.y)),Z=Math.max(...R.map(A=>A.x+D)),W=Math.max(...R.map(A=>A.y+I)),U=Math.max(1,Z-O),F=Math.max(1,W-z),B=Math.max(1,p-ht*2),ot=Math.max(1,f-ht*2),V=K(Math.min(B/U,ot/F),Q,tt),rt=(p-U*V)/2-O*V,st=(f-F*V)/2-z*V;l(V),r(P({x:rt,y:st},p,f))},[P,h]),v=o.useCallback((u,p)=>{if(m.current.set(u,p),m.current.size===2){const[f,S]=Array.from(m.current.values());b.current={distance:Math.hypot(f.x-S.x,f.y-S.y),zoom:k.current,pan:d.current,midpoint:{x:(f.x+S.x)/2,y:(f.y+S.y)/2}},C.current=null;return}C.current={start:p,panStart:d.current}},[]),q=o.useCallback((u,p,f,S)=>{if(m.current.has(u)&&m.current.set(u,p),m.current.size>=2&&b.current){h(!1);const[R,O]=Array.from(m.current.values()),Z=Math.hypot(R.x-O.x,R.y-O.y)/Math.max(1,b.current.distance),W={x:(R.x+O.x)/2,y:(R.y+O.y)/2},U=K(b.current.zoom*Z,Q,tt),F=U/b.current.zoom,B=P({x:W.x-(b.current.midpoint.x-b.current.pan.x)*F,y:W.y-(b.current.midpoint.y-b.current.pan.y)*F},f,S);l(U),r(B);return}const D=C.current;if(!D)return;h(!1);const I={x:D.panStart.x+(p.x-D.start.x),y:D.panStart.y+(p.y-D.start.y)};r(P(I,f,S))},[P,h]),G=o.useCallback(u=>{m.current.delete(u),m.current.size<2&&(b.current=null),m.current.size===0&&(C.current=null)},[]),H=o.useCallback((u,p,f,S)=>{const D=u<0?1.1:.9;h(!1),j(k.current*D,p,f,S)},[h,j]),L=o.useCallback((u,p,f,S,D)=>{if(Ft(u.target))return;const I=u.metaKey||u.ctrlKey;if(u.key==="Escape"){u.preventDefault(),N();return}if(I){if(u.key==="="||u.key==="+"){u.preventDefault(),s(1.2,p,f);return}if(u.key==="-"){u.preventDefault(),s(1/1.2,p,f);return}if(u.key==="0"){u.preventDefault(),N();return}(u.key==="f"||u.key==="F")&&u.shiftKey&&(u.preventDefault(),$(S,p,f,D))}},[$,N,s]);return{pan:t,zoom:c,zoomPercent:g,transform:n,transitioning:a,zoomIn:w,zoomOut:E,resetView:N,fitToGraph:$,setAnimate:h,onPointerDown:v,onPointerMove:q,onPointerUp:G,onWheelZoom:H,handleKeyDown:L}}function Kt(t){const{upstreamMap:r,downstreamMap:c}=o.useMemo(()=>{const a=new Map,i=new Map;for(const d of t)a.set(d.id,new Set(d.dependencies??[])),i.has(d.id)||i.set(d.id,new Set);for(const d of t)for(const k of d.dependencies??[])i.has(k)||i.set(k,new Set),i.get(k)?.add(d.id);return{upstreamMap:a,downstreamMap:i}},[t]);return{getChain:o.useCallback(a=>{if(!r.has(a)&&!c.has(a))return new Set;const i=new Set([a]),d=(k,y)=>{const C=[k],m=new Set([k]);for(;C.length>0;){const b=C.shift();if(!b)continue;const n=y.get(b);if(n)for(const g of n)m.has(g)||(m.add(g),i.add(g),C.push(g))}};return d(a,r),d(a,c),i},[c,r])}}const ct="fusion-plugin-dependency-graph:positions";function et(t){if(!t||typeof t!="object")return!1;const r=t;return typeof r.x=="number"&&Number.isFinite(r.x)&&typeof r.y=="number"&&Number.isFinite(r.y)}function Bt(t){const r=wt(ct,t);if(!r)return{};try{const c=JSON.parse(r);if(!c||typeof c!="object")return{};const l={};for(const[a,i]of Object.entries(c))et(i)&&(l[a]=i);return l}catch{return{}}}function qt(t,r,c){const l={};for(const[a,i]of Object.entries(t))r.has(a)&&et(i)&&(l[a]=i);Ct(ct,JSON.stringify(l),c)}function Jt(t){St(ct,t)}function Qt(t,r,c){const l={};for(const[a,i]of Object.entries(t))c.has(a)&&et(i)&&(l[a]=i);for(const[a,i]of Object.entries(r))c.has(a)&&et(i)&&(l[a]=i);return l}function te(t,r){const c={};for(const[l,a]of Object.entries(t))r.has(l)&&(c[l]=a);return c}function ee({projectId:t,visibleTaskIds:r}){const[c,l]=o.useState(null);o.useEffect(()=>{l(Bt(t))},[t]);const a=o.useCallback(d=>{qt(d,r,t),l(te(d,r))},[t,r]),i=o.useCallback(()=>{Jt(t),l(null)},[t]);return{savedPositions:c,persistPositions:a,clearSavedPositions:i}}const X=280,Y=100,gt=4;function ne({tasks:t,projectId:r,onOpenTaskDetail:c,onOpenDetail:l,addToast:a,globalPaused:i,onUpdateTask:d,onArchiveTask:k,onUnarchiveTask:y,onDeleteTask:C,onRetryTask:m,onOpenDetailWithTab:b,taskStuckTimeoutMs:n,onOpenMission:g,onMoveTask:h,lastFetchTimeMs:P,workflowStepNameLookup:j}){const s=o.useRef(null),w=o.useRef(!1),E=o.useRef(null),N=o.useRef(!1),[$,v]=o.useState(null),[q,G]=o.useState(null),H=o.useMemo(()=>Yt(t),[t]),L=Zt(H),{getChain:u}=Kt(H),p=$??q,f=o.useMemo(()=>p?u(p):new Set,[p,u]),S=o.useMemo(()=>it(L,{nodeWidth:X,nodeHeight:Y,horizontalGap:40,verticalGap:80}),[L]),D=o.useMemo(()=>new Set(H.map(e=>e.id)),[H]),{savedPositions:I,persistPositions:R,clearSavedPositions:O}=ee({projectId:r,visibleTaskIds:D}),[z,Z]=o.useState(S),[W,U]=o.useState(!1);o.useEffect(()=>{const e={};for(const[T,_]of S.entries())e[T]=_;const x=I?Qt(e,I,D):e;Z(new Map(Object.entries(x)))},[S,I,D]);const{transform:F,zoom:B,transitioning:ot,zoomIn:V,zoomOut:rt,resetView:st,fitToGraph:A,onPointerDown:mt,onPointerMove:yt,onPointerUp:ut,onWheelZoom:xt,handleKeyDown:kt}=Vt();o.useEffect(()=>{if(w.current||H.length===0)return;if(!!(I&&Object.keys(I).length>0)){w.current=!0;return}const x=s.current;x&&(A(z,x.clientWidth,x.clientHeight,{nodeWidth:X,nodeHeight:Y}),w.current=!0)},[H.length,A,z,I]);const lt=o.useMemo(()=>{const e=Array.from(z.values());if(e.length===0)return{width:0,height:0};const x=Math.max(...e.map(_=>_.x+X)),T=Math.max(...e.map(_=>_.y+Y));return{width:x,height:T}},[z]),dt=o.useCallback(()=>{O();const e=it(L,{nodeWidth:X,nodeHeight:Y,horizontalGap:40,verticalGap:80});Z(e)},[O,L]),bt=o.useCallback(()=>{const e={};for(const[x,T]of z.entries())e[x]=T;R(e)},[R,z]);return M.jsxs("section",{className:"dependency-graph","data-testid":"dependency-graph",children:[M.jsx("div",{ref:s,className:"dependency-graph__viewport",onPointerDown:e=>{W||(E.current={x:e.clientX,y:e.clientY},N.current=!1,mt(e.pointerId,{x:e.clientX,y:e.clientY}))},onPointerMove:e=>{if(W)return;const x=s.current;if(!x)return;const T=E.current;if(T){const _=Math.abs(e.clientX-T.x),J=Math.abs(e.clientY-T.y);(_>gt||J>gt)&&(N.current=!0)}yt(e.pointerId,{x:e.clientX,y:e.clientY},x.clientWidth,x.clientHeight)},onPointerUp:e=>{W||ut(e.pointerId),E.current=null},onPointerCancel:e=>{W||ut(e.pointerId),E.current=null,N.current=!1},onWheel:e=>{e.preventDefault();const x=s.current;if(!x)return;const T=x.getBoundingClientRect();xt(e.deltaY,{x:e.clientX-T.left,y:e.clientY-T.top},x.clientWidth,x.clientHeight)},onKeyDown:e=>{const x=s.current;x&&kt(e,x.clientWidth,x.clientHeight,z,{nodeWidth:X,nodeHeight:Y})},tabIndex:0,style:{outline:"none"},onClick:()=>{N.current||W||G(null)},children:H.length===0?M.jsx("div",{className:"dependency-graph__empty",children:"No active tasks to display in graph view."}):M.jsxs("div",{className:`graph-canvas-transform${ot?" graph-canvas-transform--animate":""}`,style:{transform:F,width:`${lt.width}px`,height:`${lt.height}px`},children:[M.jsx(Wt,{edges:L.edges,positions:z,nodeWidth:X,nodeHeight:Y,highlightedEdgeIds:f.size>0?new Set(L.edges.filter(e=>f.has(e.source)&&f.has(e.target)).map(e=>`${e.source}->${e.target}`)):void 0}),M.jsx("div",{className:"dependency-graph__nodes-layer",children:L.nodes.map(e=>{const x=z.get(e.task.id);return x?M.jsx(It,{task:e.task,projectId:r,style:{minHeight:`${Y}px`,left:`${x.x}px`,top:`${x.y}px`},position:x,scale:B,onNodePositionChange:(T,_)=>{Z(J=>{const at=J.get(T);if(at&&at.x===_.x&&at.y===_.y)return J;const pt=new Map(J);return pt.set(T,_),pt})},onNodeDragStateChange:U,onNodeDragEnd:bt,isHighlighted:f.size>0&&f.has(e.task.id),isDimmed:f.size>0&&!f.has(e.task.id),onOpenDetail:l??(T=>c?.(T.id)),addToast:a??(()=>{}),globalPaused:i,onUpdateTask:d,onArchiveTask:k,onUnarchiveTask:y,onDeleteTask:C,onRetryTask:m,onOpenDetailWithTab:b,taskStuckTimeoutMs:n,onOpenMission:g,onMoveTask:h,lastFetchTimeMs:P,workflowStepNameLookup:j,onMouseEnter:()=>v(e.task.id),onMouseLeave:()=>v(null),onClick:T=>{T.stopPropagation(),N.current=!1,G(_=>_===e.task.id?null:e.task.id)}},e.task.id):null})})]})}),M.jsx(Gt,{zoom:B,onZoomIn:()=>{const e=s.current;e&&V(e.clientWidth,e.clientHeight)},onZoomOut:()=>{const e=s.current;e&&rt(e.clientWidth,e.clientHeight)},onFitToGraph:()=>{dt();const e=s.current;if(!e)return;const x=it(L,{nodeWidth:X,nodeHeight:Y,horizontalGap:40,verticalGap:80});A(x,e.clientWidth,e.clientHeight,{nodeWidth:X,nodeHeight:Y})},onResetView:()=>{dt(),st()}})]})}function oe(t){return new Map((t??[]).map(r=>[r.id,r.name]))}function ce({context:t}){return o.createElement(ne,{tasks:t?.tasks??[],projectId:t?.projectId,workflowStepNameLookup:oe(t?.workflowSteps),onOpenDetail:t?.openTaskDetail})}export{ne as DependencyGraph,ce as DependencyGraphDashboardView};
21
+ */const $t=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]],Ht=nt("zoom-out",$t);function Gt({zoom:t,onZoomIn:r,onZoomOut:c,onFitToGraph:l,onResetView:a}){return M.jsxs("div",{className:"graph-toolbar","data-testid":"graph-toolbar",children:[M.jsx("button",{className:"btn btn-icon",title:"Zoom in (Ctrl+=)","aria-label":"Zoom in",onClick:r,children:M.jsx(_t,{size:16})}),M.jsx("button",{className:"btn btn-icon",title:"Zoom out (Ctrl+-)","aria-label":"Zoom out",onClick:c,children:M.jsx(Ht,{size:16})}),M.jsxs("div",{className:"graph-toolbar__zoom-label","aria-live":"polite",children:[Math.round(t*100),"%"]}),M.jsx("button",{className:"btn btn-icon",title:"Fit to graph (Ctrl+Shift+F)","aria-label":"Fit to graph",onClick:l,children:M.jsx(zt,{size:16})}),M.jsx("button",{className:"btn btn-icon",title:"Reset view (Ctrl+0)","aria-label":"Reset view",onClick:a,children:M.jsx(Et,{size:16})})]})}const At=280,Lt=100;function Wt({edges:t,positions:r,nodeWidth:c=At,nodeHeight:l=Lt,highlightedEdgeIds:a}){const i=!!(a&&a.size>0);return M.jsxs("svg",{className:"dependency-graph-edges","aria-hidden":"true",children:[M.jsx("defs",{children:M.jsx("marker",{id:"dependency-graph-arrowhead",markerWidth:"10",markerHeight:"7",refX:"10",refY:"3.5",orient:"auto",markerUnits:"strokeWidth",children:M.jsx("path",{d:"M 0 0 L 10 3.5 L 0 7 z",fill:"var(--border)"})})}),t.map(d=>{const k=r.get(d.source),y=r.get(d.target);if(!k||!y)return null;const C=`${d.source}->${d.target}`,m=i&&(a?.has(C)??!1),b=k.x+c/2,n=k.y+l,g=y.x+c/2,h=y.y,P=n+(h-n)/2;return M.jsx("path",{"data-testid":"dependency-edge","data-edge-id":C,className:`dependency-graph-edge${m?" graph-edge--highlighted":""}${i&&!m?" graph-edge--dimmed":""}`,d:`M ${b} ${n} C ${b} ${P}, ${g} ${P}, ${g} ${h}`,fill:"none",stroke:m?"var(--todo)":"var(--border)",strokeWidth:m?"var(--space-xs)":"var(--btn-border-width)",opacity:i&&!m?.15:1,markerEnd:"url(#dependency-graph-arrowhead)",style:{transition:"opacity var(--transition-fast), stroke var(--transition-fast), stroke-width var(--transition-fast)"}},C)})]})}const vt=new Set(["triage","todo","in-progress","in-review"]);function Yt(t){return t.filter(r=>vt.has(r.column))}const Xt={nodeWidth:280,nodeHeight:100,horizontalGap:40,verticalGap:80};function it(t,r){const c={...Xt,...r},l=t.nodes.map(n=>n.task.id);if(l.length===0)return new Map;const a=new Map,i=new Map;for(const n of l)i.set(n,0),a.set(n,[]);for(const n of t.edges)!i.has(n.source)||!i.has(n.target)||(a.get(n.target)?.push(n.source),i.set(n.source,(i.get(n.source)??0)+1));const d=l.filter(n=>(i.get(n)??0)===0),k=[];for(;d.length>0;){const n=d.shift();k.push(n);for(const g of a.get(n)??[]){const h=(i.get(g)??0)-1;i.set(g,h),h===0&&d.push(g)}}for(const n of l)k.includes(n)||k.push(n);const y=new Map;for(const n of k){const g=t.edges.filter(P=>P.source===n).map(P=>P.target);let h=0;for(const P of g)h=Math.max(h,(y.get(P)??0)+1);y.set(n,h)}const C=new Map;for(const n of l){const g=y.get(n)??0,h=C.get(g)??[];h.push(n),C.set(g,h)}const m=new Map,b=Array.from(C.keys()).sort((n,g)=>n-g);for(const n of b){const g=C.get(n)??[];g.sort();const P=-(g.length*c.nodeWidth+Math.max(0,g.length-1)*c.horizontalGap)/2;g.forEach((j,s)=>{const w=P+s*(c.nodeWidth+c.horizontalGap),E=n*(c.nodeHeight+c.verticalGap);m.set(j,{x:w,y:E})})}return m}function Zt(t){return o.useMemo(()=>{const r=t.map(a=>({task:a})),c=new Set(t.map(a=>a.id)),l=t.flatMap(a=>(a.dependencies??[]).filter(i=>c.has(i)).map(i=>({source:a.id,target:i})));return{nodes:r,edges:l}},[t])}const Q=.1,tt=3,ht=40,Ut=200;function K(t,r,c){return Math.min(c,Math.max(r,t))}function Ft(t){if(!(t instanceof HTMLElement))return!1;const r=t.tagName.toLowerCase();return t.isContentEditable||r==="input"||r==="textarea"||r==="select"}function Vt(){const[t,r]=o.useState({x:0,y:0}),[c,l]=o.useState(1),[a,i]=o.useState(!1),d=o.useRef(t),k=o.useRef(c),y=o.useRef(null),C=o.useRef(null),m=o.useRef(new Map),b=o.useRef(null);o.useEffect(()=>{d.current=t},[t]),o.useEffect(()=>{k.current=c},[c]),o.useEffect(()=>()=>{y.current!==null&&window.clearTimeout(y.current)},[]);const n=o.useMemo(()=>`translate(${t.x}px, ${t.y}px) scale(${c})`,[t.x,t.y,c]),g=o.useMemo(()=>Math.round(c*100),[c]),h=o.useCallback(u=>{if(!u){y.current!==null&&(window.clearTimeout(y.current),y.current=null),i(!1);return}i(!0),y.current!==null&&window.clearTimeout(y.current),y.current=window.setTimeout(()=>{i(!1),y.current=null},Ut)},[]),P=o.useCallback((u,p,f)=>({x:K(u.x,-p,p),y:K(u.y,-f,f)}),[]),j=o.useCallback((u,p,f,S)=>{const D=k.current,I=d.current,R=K(u,Q,tt),O=R/D,z=P({x:p.x-(p.x-I.x)*O,y:p.y-(p.y-I.y)*O},f,S);l(R),r(z)},[P]),s=o.useCallback((u,p,f,S)=>{h(!1);const D=S??{x:p/2,y:f/2};j(k.current*u,D,p,f)},[h,j]),w=o.useCallback((u,p)=>{if(u&&p){s(1.2,u,p);return}l(f=>K(f+.1,Q,tt))},[s]),E=o.useCallback((u,p)=>{if(u&&p){s(1/1.2,u,p);return}l(f=>K(f-.1,Q,tt))},[s]),N=o.useCallback(()=>{h(!0),r({x:0,y:0}),l(1)},[h]),$=o.useCallback((u,p,f,S)=>{if(h(!0),u.size===0){r({x:0,y:0}),l(1);return}const D=S?.nodeWidth??280,I=S?.nodeHeight??100,R=Array.from(u.values()),O=Math.min(...R.map(A=>A.x)),z=Math.min(...R.map(A=>A.y)),Z=Math.max(...R.map(A=>A.x+D)),W=Math.max(...R.map(A=>A.y+I)),U=Math.max(1,Z-O),F=Math.max(1,W-z),B=Math.max(1,p-ht*2),ot=Math.max(1,f-ht*2),V=K(Math.min(B/U,ot/F),Q,tt),rt=(p-U*V)/2-O*V,st=(f-F*V)/2-z*V;l(V),r(P({x:rt,y:st},p,f))},[P,h]),v=o.useCallback((u,p)=>{if(m.current.set(u,p),m.current.size===2){const[f,S]=Array.from(m.current.values());b.current={distance:Math.hypot(f.x-S.x,f.y-S.y),zoom:k.current,pan:d.current,midpoint:{x:(f.x+S.x)/2,y:(f.y+S.y)/2}},C.current=null;return}C.current={start:p,panStart:d.current}},[]),q=o.useCallback((u,p,f,S)=>{if(m.current.has(u)&&m.current.set(u,p),m.current.size>=2&&b.current){h(!1);const[R,O]=Array.from(m.current.values()),Z=Math.hypot(R.x-O.x,R.y-O.y)/Math.max(1,b.current.distance),W={x:(R.x+O.x)/2,y:(R.y+O.y)/2},U=K(b.current.zoom*Z,Q,tt),F=U/b.current.zoom,B=P({x:W.x-(b.current.midpoint.x-b.current.pan.x)*F,y:W.y-(b.current.midpoint.y-b.current.pan.y)*F},f,S);l(U),r(B);return}const D=C.current;if(!D)return;h(!1);const I={x:D.panStart.x+(p.x-D.start.x),y:D.panStart.y+(p.y-D.start.y)};r(P(I,f,S))},[P,h]),G=o.useCallback(u=>{m.current.delete(u),m.current.size<2&&(b.current=null),m.current.size===0&&(C.current=null)},[]),H=o.useCallback((u,p,f,S)=>{const D=u<0?1.1:.9;h(!1),j(k.current*D,p,f,S)},[h,j]),L=o.useCallback((u,p,f,S,D)=>{if(Ft(u.target))return;const I=u.metaKey||u.ctrlKey;if(u.key==="Escape"){u.preventDefault(),N();return}if(I){if(u.key==="="||u.key==="+"){u.preventDefault(),s(1.2,p,f);return}if(u.key==="-"){u.preventDefault(),s(1/1.2,p,f);return}if(u.key==="0"){u.preventDefault(),N();return}(u.key==="f"||u.key==="F")&&u.shiftKey&&(u.preventDefault(),$(S,p,f,D))}},[$,N,s]);return{pan:t,zoom:c,zoomPercent:g,transform:n,transitioning:a,zoomIn:w,zoomOut:E,resetView:N,fitToGraph:$,setAnimate:h,onPointerDown:v,onPointerMove:q,onPointerUp:G,onWheelZoom:H,handleKeyDown:L}}function Kt(t){const{upstreamMap:r,downstreamMap:c}=o.useMemo(()=>{const a=new Map,i=new Map;for(const d of t)a.set(d.id,new Set(d.dependencies??[])),i.has(d.id)||i.set(d.id,new Set);for(const d of t)for(const k of d.dependencies??[])i.has(k)||i.set(k,new Set),i.get(k)?.add(d.id);return{upstreamMap:a,downstreamMap:i}},[t]);return{getChain:o.useCallback(a=>{if(!r.has(a)&&!c.has(a))return new Set;const i=new Set([a]),d=(k,y)=>{const C=[k],m=new Set([k]);for(;C.length>0;){const b=C.shift();if(!b)continue;const n=y.get(b);if(n)for(const g of n)m.has(g)||(m.add(g),i.add(g),C.push(g))}};return d(a,r),d(a,c),i},[c,r])}}const ct="fusion-plugin-dependency-graph:positions";function et(t){if(!t||typeof t!="object")return!1;const r=t;return typeof r.x=="number"&&Number.isFinite(r.x)&&typeof r.y=="number"&&Number.isFinite(r.y)}function Bt(t){const r=wt(ct,t);if(!r)return{};try{const c=JSON.parse(r);if(!c||typeof c!="object")return{};const l={};for(const[a,i]of Object.entries(c))et(i)&&(l[a]=i);return l}catch{return{}}}function qt(t,r,c){const l={};for(const[a,i]of Object.entries(t))r.has(a)&&et(i)&&(l[a]=i);Ct(ct,JSON.stringify(l),c)}function Jt(t){St(ct,t)}function Qt(t,r,c){const l={};for(const[a,i]of Object.entries(t))c.has(a)&&et(i)&&(l[a]=i);for(const[a,i]of Object.entries(r))c.has(a)&&et(i)&&(l[a]=i);return l}function te(t,r){const c={};for(const[l,a]of Object.entries(t))r.has(l)&&(c[l]=a);return c}function ee({projectId:t,visibleTaskIds:r}){const[c,l]=o.useState(null);o.useEffect(()=>{l(Bt(t))},[t]);const a=o.useCallback(d=>{qt(d,r,t),l(te(d,r))},[t,r]),i=o.useCallback(()=>{Jt(t),l(null)},[t]);return{savedPositions:c,persistPositions:a,clearSavedPositions:i}}const X=280,Y=100,gt=4;function ne({tasks:t,projectId:r,onOpenTaskDetail:c,onOpenDetail:l,addToast:a,globalPaused:i,onUpdateTask:d,onArchiveTask:k,onUnarchiveTask:y,onDeleteTask:C,onRetryTask:m,onOpenDetailWithTab:b,taskStuckTimeoutMs:n,onOpenMission:g,onMoveTask:h,lastFetchTimeMs:P,workflowStepNameLookup:j}){const s=o.useRef(null),w=o.useRef(!1),E=o.useRef(null),N=o.useRef(!1),[$,v]=o.useState(null),[q,G]=o.useState(null),H=o.useMemo(()=>Yt(t),[t]),L=Zt(H),{getChain:u}=Kt(H),p=$??q,f=o.useMemo(()=>p?u(p):new Set,[p,u]),S=o.useMemo(()=>it(L,{nodeWidth:X,nodeHeight:Y,horizontalGap:40,verticalGap:80}),[L]),D=o.useMemo(()=>new Set(H.map(e=>e.id)),[H]),{savedPositions:I,persistPositions:R,clearSavedPositions:O}=ee({projectId:r,visibleTaskIds:D}),[z,Z]=o.useState(S),[W,U]=o.useState(!1);o.useEffect(()=>{const e={};for(const[T,_]of S.entries())e[T]=_;const x=I?Qt(e,I,D):e;Z(new Map(Object.entries(x)))},[S,I,D]);const{transform:F,zoom:B,transitioning:ot,zoomIn:V,zoomOut:rt,resetView:st,fitToGraph:A,onPointerDown:mt,onPointerMove:yt,onPointerUp:ut,onWheelZoom:xt,handleKeyDown:kt}=Vt();o.useEffect(()=>{if(w.current||H.length===0)return;if(!!(I&&Object.keys(I).length>0)){w.current=!0;return}const x=s.current;x&&(A(z,x.clientWidth,x.clientHeight,{nodeWidth:X,nodeHeight:Y}),w.current=!0)},[H.length,A,z,I]);const lt=o.useMemo(()=>{const e=Array.from(z.values());if(e.length===0)return{width:0,height:0};const x=Math.max(...e.map(_=>_.x+X)),T=Math.max(...e.map(_=>_.y+Y));return{width:x,height:T}},[z]),dt=o.useCallback(()=>{O();const e=it(L,{nodeWidth:X,nodeHeight:Y,horizontalGap:40,verticalGap:80});Z(e)},[O,L]),bt=o.useCallback(()=>{const e={};for(const[x,T]of z.entries())e[x]=T;R(e)},[R,z]);return M.jsxs("section",{className:"dependency-graph","data-testid":"dependency-graph",children:[M.jsx("div",{ref:s,className:"dependency-graph__viewport",onPointerDown:e=>{W||(E.current={x:e.clientX,y:e.clientY},N.current=!1,mt(e.pointerId,{x:e.clientX,y:e.clientY}))},onPointerMove:e=>{if(W)return;const x=s.current;if(!x)return;const T=E.current;if(T){const _=Math.abs(e.clientX-T.x),J=Math.abs(e.clientY-T.y);(_>gt||J>gt)&&(N.current=!0)}yt(e.pointerId,{x:e.clientX,y:e.clientY},x.clientWidth,x.clientHeight)},onPointerUp:e=>{W||ut(e.pointerId),E.current=null},onPointerCancel:e=>{W||ut(e.pointerId),E.current=null,N.current=!1},onWheel:e=>{e.preventDefault();const x=s.current;if(!x)return;const T=x.getBoundingClientRect();xt(e.deltaY,{x:e.clientX-T.left,y:e.clientY-T.top},x.clientWidth,x.clientHeight)},onKeyDown:e=>{const x=s.current;x&&kt(e,x.clientWidth,x.clientHeight,z,{nodeWidth:X,nodeHeight:Y})},tabIndex:0,style:{outline:"none"},onClick:()=>{N.current||W||G(null)},children:H.length===0?M.jsx("div",{className:"dependency-graph__empty",children:"No active tasks to display in graph view."}):M.jsxs("div",{className:`graph-canvas-transform${ot?" graph-canvas-transform--animate":""}`,style:{transform:F,width:`${lt.width}px`,height:`${lt.height}px`},children:[M.jsx(Wt,{edges:L.edges,positions:z,nodeWidth:X,nodeHeight:Y,highlightedEdgeIds:f.size>0?new Set(L.edges.filter(e=>f.has(e.source)&&f.has(e.target)).map(e=>`${e.source}->${e.target}`)):void 0}),M.jsx("div",{className:"dependency-graph__nodes-layer",children:L.nodes.map(e=>{const x=z.get(e.task.id);return x?M.jsx(It,{task:e.task,projectId:r,style:{minHeight:`${Y}px`,left:`${x.x}px`,top:`${x.y}px`},position:x,scale:B,onNodePositionChange:(T,_)=>{Z(J=>{const at=J.get(T);if(at&&at.x===_.x&&at.y===_.y)return J;const pt=new Map(J);return pt.set(T,_),pt})},onNodeDragStateChange:U,onNodeDragEnd:bt,isHighlighted:f.size>0&&f.has(e.task.id),isDimmed:f.size>0&&!f.has(e.task.id),onOpenDetail:l??(T=>c?.(T.id)),addToast:a??(()=>{}),globalPaused:i,onUpdateTask:d,onArchiveTask:k,onUnarchiveTask:y,onDeleteTask:C,onRetryTask:m,onOpenDetailWithTab:b,taskStuckTimeoutMs:n,onOpenMission:g,onMoveTask:h,lastFetchTimeMs:P,workflowStepNameLookup:j,onMouseEnter:()=>v(e.task.id),onMouseLeave:()=>v(null),onClick:T=>{T.stopPropagation(),N.current=!1,G(_=>_===e.task.id?null:e.task.id)}},e.task.id):null})})]})}),M.jsx(Gt,{zoom:B,onZoomIn:()=>{const e=s.current;e&&V(e.clientWidth,e.clientHeight)},onZoomOut:()=>{const e=s.current;e&&rt(e.clientWidth,e.clientHeight)},onFitToGraph:()=>{dt();const e=s.current;if(!e)return;const x=it(L,{nodeWidth:X,nodeHeight:Y,horizontalGap:40,verticalGap:80});A(x,e.clientWidth,e.clientHeight,{nodeWidth:X,nodeHeight:Y})},onResetView:()=>{dt(),st()}})]})}function oe(t){return new Map((t??[]).map(r=>[r.id,r.name]))}function ce({context:t}){return o.createElement(ne,{tasks:t?.tasks??[],projectId:t?.projectId,workflowStepNameLookup:oe(t?.workflowSteps),onOpenDetail:t?.openTaskDetail})}export{ne as DependencyGraph,ce as DependencyGraphDashboardView,ce as default};
@@ -1,4 +1,4 @@
1
- import{c as a}from"./index-CQyVRLOb.js";/**
1
+ import{c as a}from"./index-Bdw6llW6.js";/**
2
2
  * @license lucide-react v1.7.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.