@ashlr/hub 3.11.2 → 3.11.3

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 (262) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/build-identity.json +2 -2
  3. package/dist/core/web/public/next/assets/{ActionMenu-_DhtX2gO.js → ActionMenu-FxXeRbPx.js} +2 -2
  4. package/dist/core/web/public/next/assets/{ActionMenu-_DhtX2gO.js.map → ActionMenu-FxXeRbPx.js.map} +1 -1
  5. package/dist/core/web/public/next/assets/{Advanced-CAAfaBke.js → Advanced-D_eS4472.js} +2 -2
  6. package/dist/core/web/public/next/assets/{Advanced-CAAfaBke.js.map → Advanced-D_eS4472.js.map} +1 -1
  7. package/dist/core/web/public/next/assets/{App-BAywyjE8.js → App-Cj4zKbG3.js} +2 -2
  8. package/dist/core/web/public/next/assets/{App-BAywyjE8.js.map → App-Cj4zKbG3.js.map} +1 -1
  9. package/dist/core/web/public/next/assets/{AppsSection-CUypKeog.js → AppsSection-Ddu_RCQE.js} +2 -2
  10. package/dist/core/web/public/next/assets/{AppsSection-CUypKeog.js.map → AppsSection-Ddu_RCQE.js.map} +1 -1
  11. package/dist/core/web/public/next/assets/{AreaTrend-CblDqC8Q.js → AreaTrend-CDxrQU4b.js} +2 -2
  12. package/dist/core/web/public/next/assets/{AreaTrend-CblDqC8Q.js.map → AreaTrend-CDxrQU4b.js.map} +1 -1
  13. package/dist/core/web/public/next/assets/AutonomySection-DuQkHGD_.js +2 -0
  14. package/dist/core/web/public/next/assets/{AutonomySection-D3d8lYO3.js.map → AutonomySection-DuQkHGD_.js.map} +1 -1
  15. package/dist/core/web/public/next/assets/{BranchBar-DU0jAV1E.js → BranchBar-CLsvOcyK.js} +2 -2
  16. package/dist/core/web/public/next/assets/{BranchBar-DU0jAV1E.js.map → BranchBar-CLsvOcyK.js.map} +1 -1
  17. package/dist/core/web/public/next/assets/{BudgetControl-Mm1ZL4u6.js → BudgetControl-TL3FeZ1D.js} +2 -2
  18. package/dist/core/web/public/next/assets/{BudgetControl-Mm1ZL4u6.js.map → BudgetControl-TL3FeZ1D.js.map} +1 -1
  19. package/dist/core/web/public/next/assets/{BurnDown-C1fgcFqo.js → BurnDown-sFXkUGdB.js} +2 -2
  20. package/dist/core/web/public/next/assets/{BurnDown-C1fgcFqo.js.map → BurnDown-sFXkUGdB.js.map} +1 -1
  21. package/dist/core/web/public/next/assets/{Button-DqgLUZvd.js → Button-HHXgoXGr.js} +2 -2
  22. package/dist/core/web/public/next/assets/{Button-DqgLUZvd.js.map → Button-HHXgoXGr.js.map} +1 -1
  23. package/dist/core/web/public/next/assets/{CapacityStrip-nWFHvqFB.js → CapacityStrip-qReu0RaF.js} +2 -2
  24. package/dist/core/web/public/next/assets/{CapacityStrip-nWFHvqFB.js.map → CapacityStrip-qReu0RaF.js.map} +1 -1
  25. package/dist/core/web/public/next/assets/{ChatSection-DUZNpiVr.js → ChatSection-DZuZfTaC.js} +3 -3
  26. package/dist/core/web/public/next/assets/{ChatSection-DUZNpiVr.js.map → ChatSection-DZuZfTaC.js.map} +1 -1
  27. package/dist/core/web/public/next/assets/{CloudBudgetForm-2OW38o_C.js → CloudBudgetForm-DJbiT1wi.js} +2 -2
  28. package/dist/core/web/public/next/assets/{CloudBudgetForm-2OW38o_C.js.map → CloudBudgetForm-DJbiT1wi.js.map} +1 -1
  29. package/dist/core/web/public/next/assets/{CommandPalette-C5w2o1-r.js → CommandPalette-zYLFZRnj.js} +2 -2
  30. package/dist/core/web/public/next/assets/{CommandPalette-C5w2o1-r.js.map → CommandPalette-zYLFZRnj.js.map} +1 -1
  31. package/dist/core/web/public/next/assets/{CommandSection-Bx2knNqY.js → CommandSection-rIeMK5Ch.js} +2 -2
  32. package/dist/core/web/public/next/assets/{CommandSection-Bx2knNqY.js.map → CommandSection-rIeMK5Ch.js.map} +1 -1
  33. package/dist/core/web/public/next/assets/{ConfirmDialog-B7ZwCQOX.js → ConfirmDialog-DLrLKM0c.js} +2 -2
  34. package/dist/core/web/public/next/assets/{ConfirmDialog-B7ZwCQOX.js.map → ConfirmDialog-DLrLKM0c.js.map} +1 -1
  35. package/dist/core/web/public/next/assets/{Dialog-BpgcEW6b.js → Dialog-BS9Dxi3G.js} +2 -2
  36. package/dist/core/web/public/next/assets/{Dialog-BpgcEW6b.js.map → Dialog-BS9Dxi3G.js.map} +1 -1
  37. package/dist/core/web/public/next/assets/{DiffPane-DpqRUtCx.js → DiffPane-TOmUf3b2.js} +2 -2
  38. package/dist/core/web/public/next/assets/{DiffPane-DpqRUtCx.js.map → DiffPane-TOmUf3b2.js.map} +1 -1
  39. package/dist/core/web/public/next/assets/{DiffViewer-CoV5-nUf.js → DiffViewer-BpH56302.js} +2 -2
  40. package/dist/core/web/public/next/assets/{DiffViewer-CoV5-nUf.js.map → DiffViewer-BpH56302.js.map} +1 -1
  41. package/dist/core/web/public/next/assets/{DockHost-C0Pq7Jak.js → DockHost-DzkzR-HD.js} +2 -2
  42. package/dist/core/web/public/next/assets/{DockHost-C0Pq7Jak.js.map → DockHost-DzkzR-HD.js.map} +1 -1
  43. package/dist/core/web/public/next/assets/{EmptyState-DYW29ncw.js → EmptyState-BqR5YAmf.js} +2 -2
  44. package/dist/core/web/public/next/assets/{EmptyState-DYW29ncw.js.map → EmptyState-BqR5YAmf.js.map} +1 -1
  45. package/dist/core/web/public/next/assets/{Epistemic-DVx6oHzp.js → Epistemic-dhvDTwAZ.js} +2 -2
  46. package/dist/core/web/public/next/assets/{Epistemic-DVx6oHzp.js.map → Epistemic-dhvDTwAZ.js.map} +1 -1
  47. package/dist/core/web/public/next/assets/{FleetSection-DSETviPK.js → FleetSection-ViAb549H.js} +3 -3
  48. package/dist/core/web/public/next/assets/{FleetSection-DSETviPK.js.map → FleetSection-ViAb549H.js.map} +1 -1
  49. package/dist/core/web/public/next/assets/{Funnel-DxiGqJrt.js → Funnel-D2u7Wlzc.js} +2 -2
  50. package/dist/core/web/public/next/assets/{Funnel-DxiGqJrt.js.map → Funnel-D2u7Wlzc.js.map} +1 -1
  51. package/dist/core/web/public/next/assets/{GearTray-C3I89sIt.js → GearTray-Cb2npoxM.js} +2 -2
  52. package/dist/core/web/public/next/assets/{GearTray-C3I89sIt.js.map → GearTray-Cb2npoxM.js.map} +1 -1
  53. package/dist/core/web/public/next/assets/{GrowthSection-C3m2bPEz.js → GrowthSection-C5aDPs8B.js} +2 -2
  54. package/dist/core/web/public/next/assets/{GrowthSection-C3m2bPEz.js.map → GrowthSection-C5aDPs8B.js.map} +1 -1
  55. package/dist/core/web/public/next/assets/{HandoffDialog-Bjb96a0N.js → HandoffDialog-BF3AYg-X.js} +2 -2
  56. package/dist/core/web/public/next/assets/{HandoffDialog-Bjb96a0N.js.map → HandoffDialog-BF3AYg-X.js.map} +1 -1
  57. package/dist/core/web/public/next/assets/{Input-ekTehVaH.js → Input-B5dmGLZx.js} +2 -2
  58. package/dist/core/web/public/next/assets/{Input-ekTehVaH.js.map → Input-B5dmGLZx.js.map} +1 -1
  59. package/dist/core/web/public/next/assets/{LeaderCard-85VBbbaZ.js → LeaderCard-DZrmjDbI.js} +2 -2
  60. package/dist/core/web/public/next/assets/{LeaderCard-85VBbbaZ.js.map → LeaderCard-DZrmjDbI.js.map} +1 -1
  61. package/dist/core/web/public/next/assets/{MatrixHeatmap-Bo8j0QPC.js → MatrixHeatmap-BgEUs2Eu.js} +2 -2
  62. package/dist/core/web/public/next/assets/{MatrixHeatmap-Bo8j0QPC.js.map → MatrixHeatmap-BgEUs2Eu.js.map} +1 -1
  63. package/dist/core/web/public/next/assets/McpSection-DZkiOuoq.js +2 -0
  64. package/dist/core/web/public/next/assets/{McpSection-DvHFaVyp.js.map → McpSection-DZkiOuoq.js.map} +1 -1
  65. package/dist/core/web/public/next/assets/{MessageMarkdown-fsY_ltVa.js → MessageMarkdown-BauY8ZTY.js} +3 -3
  66. package/dist/core/web/public/next/assets/{MessageMarkdown-fsY_ltVa.js.map → MessageMarkdown-BauY8ZTY.js.map} +1 -1
  67. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DDdtu82l.js → MessageMarkdownRenderer-DLBNLfsn.js} +2 -2
  68. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DDdtu82l.js.map → MessageMarkdownRenderer-DLBNLfsn.js.map} +1 -1
  69. package/dist/core/web/public/next/assets/{Meter-CeGDXdDM.js → Meter-DNeocJnD.js} +2 -2
  70. package/dist/core/web/public/next/assets/{Meter-CeGDXdDM.js.map → Meter-DNeocJnD.js.map} +1 -1
  71. package/dist/core/web/public/next/assets/{MindSection-CDVhHvXl.js → MindSection-BvJXFjyX.js} +2 -2
  72. package/dist/core/web/public/next/assets/{MindSection-CDVhHvXl.js.map → MindSection-BvJXFjyX.js.map} +1 -1
  73. package/dist/core/web/public/next/assets/{MutationTokenDialog-DTQzEOHR.js → MutationTokenDialog-mxrw0Yvy.js} +2 -2
  74. package/dist/core/web/public/next/assets/{MutationTokenDialog-DTQzEOHR.js.map → MutationTokenDialog-mxrw0Yvy.js.map} +1 -1
  75. package/dist/core/web/public/next/assets/{NeedsYouDrawer-6AuN0BF3.js → NeedsYouDrawer-CO-Balfp.js} +2 -2
  76. package/dist/core/web/public/next/assets/{NeedsYouDrawer-6AuN0BF3.js.map → NeedsYouDrawer-CO-Balfp.js.map} +1 -1
  77. package/dist/core/web/public/next/assets/{NeedsYouList-ChnRmbSk.js → NeedsYouList-CzDZbzRD.js} +2 -2
  78. package/dist/core/web/public/next/assets/{NeedsYouList-ChnRmbSk.js.map → NeedsYouList-CzDZbzRD.js.map} +1 -1
  79. package/dist/core/web/public/next/assets/{NewChatDialog-B06E7sqg.js → NewChatDialog-B8eJjlFf.js} +2 -2
  80. package/dist/core/web/public/next/assets/{NewChatDialog-B06E7sqg.js.map → NewChatDialog-B8eJjlFf.js.map} +1 -1
  81. package/dist/core/web/public/next/assets/{OnboardingFlow-C2M3zov9.js → OnboardingFlow-Cij6KWat.js} +2 -2
  82. package/dist/core/web/public/next/assets/{OnboardingFlow-C2M3zov9.js.map → OnboardingFlow-Cij6KWat.js.map} +1 -1
  83. package/dist/core/web/public/next/assets/{PreviewPane-Bd6HsX1k.js → PreviewPane-BS-CleCd.js} +2 -2
  84. package/dist/core/web/public/next/assets/{PreviewPane-Bd6HsX1k.js.map → PreviewPane-BS-CleCd.js.map} +1 -1
  85. package/dist/core/web/public/next/assets/{ProviderLogo-Bz7KR5j3.js → ProviderLogo-C5mBg8i0.js} +2 -2
  86. package/dist/core/web/public/next/assets/{ProviderLogo-Bz7KR5j3.js.map → ProviderLogo-C5mBg8i0.js.map} +1 -1
  87. package/dist/core/web/public/next/assets/{RailStatus-CctCuuLy.js → RailStatus-cPRyOmrk.js} +2 -2
  88. package/dist/core/web/public/next/assets/{RailStatus-CctCuuLy.js.map → RailStatus-cPRyOmrk.js.map} +1 -1
  89. package/dist/core/web/public/next/assets/{RefreshIndicator-CKY5BGdD.js → RefreshIndicator-CMwSCiz5.js} +2 -2
  90. package/dist/core/web/public/next/assets/{RefreshIndicator-CKY5BGdD.js.map → RefreshIndicator-CMwSCiz5.js.map} +1 -1
  91. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-CspIsW_G.js → ResourcePoolConsoleApp-BFi1opsC.js} +2 -2
  92. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-CspIsW_G.js.map → ResourcePoolConsoleApp-BFi1opsC.js.map} +1 -1
  93. package/dist/core/web/public/next/assets/{ResourcesChrome-B7fHZ6zX.js → ResourcesChrome-BJCauW_t.js} +3 -3
  94. package/dist/core/web/public/next/assets/{ResourcesChrome-B7fHZ6zX.js.map → ResourcesChrome-BJCauW_t.js.map} +1 -1
  95. package/dist/core/web/public/next/assets/{ResourcesDrawer-B7-N9n7-.js → ResourcesDrawer-BDecg6nO.js} +2 -2
  96. package/dist/core/web/public/next/assets/{ResourcesDrawer-B7-N9n7-.js.map → ResourcesDrawer-BDecg6nO.js.map} +1 -1
  97. package/dist/core/web/public/next/assets/{RouteErrorBoundary-C_B11J0s.js → RouteErrorBoundary-DYtwc2ja.js} +2 -2
  98. package/dist/core/web/public/next/assets/{RouteErrorBoundary-C_B11J0s.js.map → RouteErrorBoundary-DYtwc2ja.js.map} +1 -1
  99. package/dist/core/web/public/next/assets/{RunInCloudAction-_juw4EXd.js → RunInCloudAction-BEGEEM8O.js} +2 -2
  100. package/dist/core/web/public/next/assets/{RunInCloudAction-_juw4EXd.js.map → RunInCloudAction-BEGEEM8O.js.map} +1 -1
  101. package/dist/core/web/public/next/assets/{SeatSelector-D_YXvkPy.js → SeatSelector-CYHRR7Wp.js} +2 -2
  102. package/dist/core/web/public/next/assets/{SeatSelector-D_YXvkPy.js.map → SeatSelector-CYHRR7Wp.js.map} +1 -1
  103. package/dist/core/web/public/next/assets/{Segmented-DnKP6rr7.js → Segmented-BE53BenI.js} +2 -2
  104. package/dist/core/web/public/next/assets/{Segmented-DnKP6rr7.js.map → Segmented-BE53BenI.js.map} +1 -1
  105. package/dist/core/web/public/next/assets/{Select-DlbUupTX.js → Select-BwSGkHCS.js} +2 -2
  106. package/dist/core/web/public/next/assets/{Select-DlbUupTX.js.map → Select-BwSGkHCS.js.map} +1 -1
  107. package/dist/core/web/public/next/assets/{SessionGate-DnuTZACL.js → SessionGate-e0dFJm9d.js} +2 -2
  108. package/dist/core/web/public/next/assets/{SessionGate-DnuTZACL.js.map → SessionGate-e0dFJm9d.js.map} +1 -1
  109. package/dist/core/web/public/next/assets/{SessionInsightChip-C33-k-Q5.js → SessionInsightChip-CxlSyueJ.js} +2 -2
  110. package/dist/core/web/public/next/assets/{SessionInsightChip-C33-k-Q5.js.map → SessionInsightChip-CxlSyueJ.js.map} +1 -1
  111. package/dist/core/web/public/next/assets/{SessionSearch-DhhR9Csg.js → SessionSearch-_yp7S2TP.js} +2 -2
  112. package/dist/core/web/public/next/assets/{SessionSearch-DhhR9Csg.js.map → SessionSearch-_yp7S2TP.js.map} +1 -1
  113. package/dist/core/web/public/next/assets/{SettingsSection-C0xQvCz3.js → SettingsSection-wGnpWeGW.js} +2 -2
  114. package/dist/core/web/public/next/assets/{SettingsSection-C0xQvCz3.js.map → SettingsSection-wGnpWeGW.js.map} +1 -1
  115. package/dist/core/web/public/next/assets/{Sheet-BvNYOYv5.js → Sheet-DVP2Mgy6.js} +2 -2
  116. package/dist/core/web/public/next/assets/{Sheet-BvNYOYv5.js.map → Sheet-DVP2Mgy6.js.map} +1 -1
  117. package/dist/core/web/public/next/assets/{ShortcutsOverlay-1nUBVO-Z.js → ShortcutsOverlay-BcIcoClX.js} +2 -2
  118. package/dist/core/web/public/next/assets/{ShortcutsOverlay-1nUBVO-Z.js.map → ShortcutsOverlay-BcIcoClX.js.map} +1 -1
  119. package/dist/core/web/public/next/assets/{Sidebar-YrVvvBNM.js → Sidebar-DjQOqPbm.js} +3 -3
  120. package/dist/core/web/public/next/assets/{Sidebar-YrVvvBNM.js.map → Sidebar-DjQOqPbm.js.map} +1 -1
  121. package/dist/core/web/public/next/assets/{Slider-B2c-dbQb.js → Slider-BypUWjpH.js} +2 -2
  122. package/dist/core/web/public/next/assets/{Slider-B2c-dbQb.js.map → Slider-BypUWjpH.js.map} +1 -1
  123. package/dist/core/web/public/next/assets/{StatusBadge-Q9YYkijx.js → StatusBadge-HCZp416_.js} +2 -2
  124. package/dist/core/web/public/next/assets/{StatusBadge-Q9YYkijx.js.map → StatusBadge-HCZp416_.js.map} +1 -1
  125. package/dist/core/web/public/next/assets/{StepBand-Ci-C0GUG.js → StepBand-Duz1PUes.js} +2 -2
  126. package/dist/core/web/public/next/assets/{StepBand-Ci-C0GUG.js.map → StepBand-Duz1PUes.js.map} +1 -1
  127. package/dist/core/web/public/next/assets/{Surface-DBovMq4P.js → Surface-B75lVfzm.js} +2 -2
  128. package/dist/core/web/public/next/assets/{Surface-DBovMq4P.js.map → Surface-B75lVfzm.js.map} +1 -1
  129. package/dist/core/web/public/next/assets/{Swimlane-Cdc4TqDe.js → Swimlane-DGcIcnNA.js} +2 -2
  130. package/dist/core/web/public/next/assets/{Swimlane-Cdc4TqDe.js.map → Swimlane-DGcIcnNA.js.map} +1 -1
  131. package/dist/core/web/public/next/assets/{Switch-CUrvzO2k.js → Switch-iveI-8NY.js} +2 -2
  132. package/dist/core/web/public/next/assets/{Switch-CUrvzO2k.js.map → Switch-iveI-8NY.js.map} +1 -1
  133. package/dist/core/web/public/next/assets/{Tag-Bv8u6APt.js → Tag-DH15CUJp.js} +2 -2
  134. package/dist/core/web/public/next/assets/{Tag-Bv8u6APt.js.map → Tag-DH15CUJp.js.map} +1 -1
  135. package/dist/core/web/public/next/assets/{TerminalPane-BE4Xlqi5.js → TerminalPane-MQT-veKZ.js} +2 -2
  136. package/dist/core/web/public/next/assets/{TerminalPane-BE4Xlqi5.js.map → TerminalPane-MQT-veKZ.js.map} +1 -1
  137. package/dist/core/web/public/next/assets/{UniverseConsoleApp-BGwejf0m.js → UniverseConsoleApp-C8yQ0AaR.js} +2 -2
  138. package/dist/core/web/public/next/assets/{UniverseConsoleApp-BGwejf0m.js.map → UniverseConsoleApp-C8yQ0AaR.js.map} +1 -1
  139. package/dist/core/web/public/next/assets/{UniverseView-CgKa-WXC.js → UniverseView-_nPURPqe.js} +2 -2
  140. package/dist/core/web/public/next/assets/{UniverseView-CgKa-WXC.js.map → UniverseView-_nPURPqe.js.map} +1 -1
  141. package/dist/core/web/public/next/assets/{UsageSection-CazsHm1f.js → UsageSection-CqxRGJ40.js} +2 -2
  142. package/dist/core/web/public/next/assets/{UsageSection-CazsHm1f.js.map → UsageSection-CqxRGJ40.js.map} +1 -1
  143. package/dist/core/web/public/next/assets/{VerseConsoleApp-CTF3Shs0.js → VerseConsoleApp-DTjDpGCd.js} +3 -3
  144. package/dist/core/web/public/next/assets/{VerseConsoleApp-CTF3Shs0.js.map → VerseConsoleApp-DTjDpGCd.js.map} +1 -1
  145. package/dist/core/web/public/next/assets/{Workspace-CgdyXiEV.js → Workspace-DfcFGzME.js} +5 -5
  146. package/dist/core/web/public/next/assets/{Workspace-CgdyXiEV.js.map → Workspace-DfcFGzME.js.map} +1 -1
  147. package/dist/core/web/public/next/assets/{actions-MtxBGS5B.js → actions-tWevL9HV.js} +2 -2
  148. package/dist/core/web/public/next/assets/{actions-MtxBGS5B.js.map → actions-tWevL9HV.js.map} +1 -1
  149. package/dist/core/web/public/next/assets/{budget-queries-CP7hgR-p.js → budget-queries-V3wcJVK_.js} +2 -2
  150. package/dist/core/web/public/next/assets/{budget-queries-CP7hgR-p.js.map → budget-queries-V3wcJVK_.js.map} +1 -1
  151. package/dist/core/web/public/next/assets/{capacity-strip-model-fHfu5cph.js → capacity-strip-model-BDbmQ3e3.js} +2 -2
  152. package/dist/core/web/public/next/assets/{capacity-strip-model-fHfu5cph.js.map → capacity-strip-model-BDbmQ3e3.js.map} +1 -1
  153. package/dist/core/web/public/next/assets/{charts-Bis9WSiS.js → charts-CfAjuKMv.js} +2 -2
  154. package/dist/core/web/public/next/assets/{charts-Bis9WSiS.js.map → charts-CfAjuKMv.js.map} +1 -1
  155. package/dist/core/web/public/next/assets/{cloud-queries-BsOepFz6.js → cloud-queries-Br_r0UAz.js} +2 -2
  156. package/dist/core/web/public/next/assets/{cloud-queries-BsOepFz6.js.map → cloud-queries-Br_r0UAz.js.map} +1 -1
  157. package/dist/core/web/public/next/assets/{cloud.module-DoFnr8ZH.js → cloud.module-ascz58c3.js} +2 -2
  158. package/dist/core/web/public/next/assets/{cloud.module-DoFnr8ZH.js.map → cloud.module-ascz58c3.js.map} +1 -1
  159. package/dist/core/web/public/next/assets/{command-bus-CMvbYP5K.js → command-bus-xYZoK9nQ.js} +2 -2
  160. package/dist/core/web/public/next/assets/{command-bus-CMvbYP5K.js.map → command-bus-xYZoK9nQ.js.map} +1 -1
  161. package/dist/core/web/public/next/assets/{context-model-Ci3Ch9t5.js → context-model-BC-HOmPo.js} +2 -2
  162. package/dist/core/web/public/next/assets/{context-model-Ci3Ch9t5.js.map → context-model-BC-HOmPo.js.map} +1 -1
  163. package/dist/core/web/public/next/assets/{context-model-CjiJTnf1.js → context-model-CIBmSugV.js} +2 -2
  164. package/dist/core/web/public/next/assets/{context-model-CjiJTnf1.js.map → context-model-CIBmSugV.js.map} +1 -1
  165. package/dist/core/web/public/next/assets/{context-queries-BDXT6LQ3.js → context-queries-CrPcHWTz.js} +2 -2
  166. package/dist/core/web/public/next/assets/{context-queries-BDXT6LQ3.js.map → context-queries-CrPcHWTz.js.map} +1 -1
  167. package/dist/core/web/public/next/assets/{control-queries-Dv-h1Clu.js → control-queries-CmgBgKV7.js} +2 -2
  168. package/dist/core/web/public/next/assets/{control-queries-Dv-h1Clu.js.map → control-queries-CmgBgKV7.js.map} +1 -1
  169. package/dist/core/web/public/next/assets/{dock-icons-t--Eugrd.js → dock-icons-CUh8dOxJ.js} +2 -2
  170. package/dist/core/web/public/next/assets/{dock-icons-t--Eugrd.js.map → dock-icons-CUh8dOxJ.js.map} +1 -1
  171. package/dist/core/web/public/next/assets/{dock-store-qIu7kSQE.js → dock-store-B2vlxqPu.js} +2 -2
  172. package/dist/core/web/public/next/assets/{dock-store-qIu7kSQE.js.map → dock-store-B2vlxqPu.js.map} +1 -1
  173. package/dist/core/web/public/next/assets/{fleet-model-IRbwfhkR.js → fleet-model-7i-FbzKI.js} +2 -2
  174. package/dist/core/web/public/next/assets/{fleet-model-IRbwfhkR.js.map → fleet-model-7i-FbzKI.js.map} +1 -1
  175. package/dist/core/web/public/next/assets/{fleet-queries-7FVNByX1.js → fleet-queries-DzGoqq8X.js} +2 -2
  176. package/dist/core/web/public/next/assets/{fleet-queries-7FVNByX1.js.map → fleet-queries-DzGoqq8X.js.map} +1 -1
  177. package/dist/core/web/public/next/assets/{focus-trap-QqQxQdvH.js → focus-trap-HtcoXeEq.js} +2 -2
  178. package/dist/core/web/public/next/assets/{focus-trap-QqQxQdvH.js.map → focus-trap-HtcoXeEq.js.map} +1 -1
  179. package/dist/core/web/public/next/assets/{format-CaMmVQCn.js → format-BkWdOQDL.js} +2 -2
  180. package/dist/core/web/public/next/assets/{format-CaMmVQCn.js.map → format-BkWdOQDL.js.map} +1 -1
  181. package/dist/core/web/public/next/assets/{git-model-B4S_GUNA.js → git-model-bk_RXh3y.js} +2 -2
  182. package/dist/core/web/public/next/assets/{git-model-B4S_GUNA.js.map → git-model-bk_RXh3y.js.map} +1 -1
  183. package/dist/core/web/public/next/assets/{global-BkNl4e6E.js → global-oEl9Qj8u.js} +2 -2
  184. package/dist/core/web/public/next/assets/{global-BkNl4e6E.js.map → global-oEl9Qj8u.js.map} +1 -1
  185. package/dist/core/web/public/next/assets/{guarded-action-DHiL8tY5.js → guarded-action-OzqcPjmh.js} +3 -3
  186. package/dist/core/web/public/next/assets/{guarded-action-DHiL8tY5.js.map → guarded-action-OzqcPjmh.js.map} +1 -1
  187. package/dist/core/web/public/next/assets/{guarded-runners-DmGEkM2P.js → guarded-runners-LHLXmXIk.js} +2 -2
  188. package/dist/core/web/public/next/assets/{guarded-runners-DmGEkM2P.js.map → guarded-runners-LHLXmXIk.js.map} +1 -1
  189. package/dist/core/web/public/next/assets/{icon-base-NtFmP2yB.js → icon-base-DvM1eI5V.js} +2 -2
  190. package/dist/core/web/public/next/assets/{icon-base-NtFmP2yB.js.map → icon-base-DvM1eI5V.js.map} +1 -1
  191. package/dist/core/web/public/next/assets/{icons-C5EFt_Ts.js → icons-DEQa2rTx.js} +2 -2
  192. package/dist/core/web/public/next/assets/{icons-C5EFt_Ts.js.map → icons-DEQa2rTx.js.map} +1 -1
  193. package/dist/core/web/public/next/assets/{index-DbDw9UAs.js → index-BVxOlseC.js} +3 -3
  194. package/dist/core/web/public/next/assets/{index-DbDw9UAs.js.map → index-BVxOlseC.js.map} +1 -1
  195. package/dist/core/web/public/next/assets/{live-model-DEwrl7_A.js → live-model-bmsJgnYD.js} +2 -2
  196. package/dist/core/web/public/next/assets/{live-model-DEwrl7_A.js.map → live-model-bmsJgnYD.js.map} +1 -1
  197. package/dist/core/web/public/next/assets/{mind.module-CLhqMQak.js → mind.module-gTGAuJt1.js} +2 -2
  198. package/dist/core/web/public/next/assets/{mind.module-CLhqMQak.js.map → mind.module-gTGAuJt1.js.map} +1 -1
  199. package/dist/core/web/public/next/assets/{mutations-Kvzsg-iK.js → mutations-C5S7okTW.js} +2 -2
  200. package/dist/core/web/public/next/assets/{mutations-Kvzsg-iK.js.map → mutations-C5S7okTW.js.map} +1 -1
  201. package/dist/core/web/public/next/assets/{nav-C0IunEYF.js → nav-NVtnuG7A.js} +2 -2
  202. package/dist/core/web/public/next/assets/{nav-C0IunEYF.js.map → nav-NVtnuG7A.js.map} +1 -1
  203. package/dist/core/web/public/next/assets/{overnight-queries-C_AfcL7q.js → overnight-queries-DGm3qL1b.js} +2 -2
  204. package/dist/core/web/public/next/assets/{overnight-queries-C_AfcL7q.js.map → overnight-queries-DGm3qL1b.js.map} +1 -1
  205. package/dist/core/web/public/next/assets/{preloaded-CctOitLu.js → preloaded-Cwf9rsnZ.js} +2 -2
  206. package/dist/core/web/public/next/assets/{preloaded-CctOitLu.js.map → preloaded-Cwf9rsnZ.js.map} +1 -1
  207. package/dist/core/web/public/next/assets/primitives-DyCKYSBG.js +1 -0
  208. package/dist/core/web/public/next/assets/{queries-THD05gHP.js → queries-CYisSAAB.js} +2 -2
  209. package/dist/core/web/public/next/assets/{queries-THD05gHP.js.map → queries-CYisSAAB.js.map} +1 -1
  210. package/dist/core/web/public/next/assets/{reasoning-pref-BVPu0SME.js → reasoning-pref-BUcFF_5G.js} +2 -2
  211. package/dist/core/web/public/next/assets/{reasoning-pref-BVPu0SME.js.map → reasoning-pref-BUcFF_5G.js.map} +1 -1
  212. package/dist/core/web/public/next/assets/{reveal-anchor-wCT5b4m3.js → reveal-anchor-D-tV8xau.js} +2 -2
  213. package/dist/core/web/public/next/assets/{reveal-anchor-wCT5b4m3.js.map → reveal-anchor-D-tV8xau.js.map} +1 -1
  214. package/dist/core/web/public/next/assets/{seat-subscription-CR_VylsK.js → seat-subscription-B-f9ViU2.js} +2 -2
  215. package/dist/core/web/public/next/assets/{seat-subscription-CR_VylsK.js.map → seat-subscription-B-f9ViU2.js.map} +1 -1
  216. package/dist/core/web/public/next/assets/{section-visibility-B0xXUQJ0.js → section-visibility-Yctxu-if.js} +2 -2
  217. package/dist/core/web/public/next/assets/{section-visibility-B0xXUQJ0.js.map → section-visibility-Yctxu-if.js.map} +1 -1
  218. package/dist/core/web/public/next/assets/{sidebar-model-C5wVXGpb.js → sidebar-model-DQ-FyBHW.js} +2 -2
  219. package/dist/core/web/public/next/assets/{sidebar-model-C5wVXGpb.js.map → sidebar-model-DQ-FyBHW.js.map} +1 -1
  220. package/dist/core/web/public/next/assets/{slots-DDd8cEoh.js → slots-BhP8b8tf.js} +3 -3
  221. package/dist/core/web/public/next/assets/{slots-DDd8cEoh.js.map → slots-BhP8b8tf.js.map} +1 -1
  222. package/dist/core/web/public/next/assets/{surface-data-BFxAlefI.js → surface-data-DTI7LjvH.js} +2 -2
  223. package/dist/core/web/public/next/assets/{surface-data-BFxAlefI.js.map → surface-data-DTI7LjvH.js.map} +1 -1
  224. package/dist/core/web/public/next/assets/surface-prefetch-CdUEBFrl.js +2 -0
  225. package/dist/core/web/public/next/assets/{surface-prefetch-CHusyO9q.js.map → surface-prefetch-CdUEBFrl.js.map} +1 -1
  226. package/dist/core/web/public/next/assets/{tasks-model-DvkWveXs.js → tasks-model-BKDNqmmt.js} +2 -2
  227. package/dist/core/web/public/next/assets/{tasks-model-DvkWveXs.js.map → tasks-model-BKDNqmmt.js.map} +1 -1
  228. package/dist/core/web/public/next/assets/{terminal-icons-Dp6pJgV2.js → terminal-icons-D2xe-aM1.js} +2 -2
  229. package/dist/core/web/public/next/assets/{terminal-icons-Dp6pJgV2.js.map → terminal-icons-D2xe-aM1.js.map} +1 -1
  230. package/dist/core/web/public/next/assets/{usage-queries-CUTmnegA.js → usage-queries-BZuAANlI.js} +2 -2
  231. package/dist/core/web/public/next/assets/{usage-queries-CUTmnegA.js.map → usage-queries-BZuAANlI.js.map} +1 -1
  232. package/dist/core/web/public/next/assets/{use-guarded-action-UCX2u1t1.js → use-guarded-action-Cf4MeNBa.js} +2 -2
  233. package/dist/core/web/public/next/assets/{use-guarded-action-UCX2u1t1.js.map → use-guarded-action-Cf4MeNBa.js.map} +1 -1
  234. package/dist/core/web/public/next/assets/{use-ticker-OXAjob3y.js → use-ticker-D9yi49my.js} +2 -2
  235. package/dist/core/web/public/next/assets/{use-ticker-OXAjob3y.js.map → use-ticker-D9yi49my.js.map} +1 -1
  236. package/dist/core/web/public/next/assets/{use-token-gate-CDDRAoKH.js → use-token-gate-DqrSXdX6.js} +2 -2
  237. package/dist/core/web/public/next/assets/{use-token-gate-CDDRAoKH.js.map → use-token-gate-DqrSXdX6.js.map} +1 -1
  238. package/dist/core/web/public/next/assets/{useChartWidth-D9M7kUw7.js → useChartWidth-owwodNVz.js} +2 -2
  239. package/dist/core/web/public/next/assets/{useChartWidth-D9M7kUw7.js.map → useChartWidth-owwodNVz.js.map} +1 -1
  240. package/dist/core/web/public/next/assets/{useSeatsRefresh-B2dCVcj9.js → useSeatsRefresh-DgFy-Ph4.js} +2 -2
  241. package/dist/core/web/public/next/assets/{useSeatsRefresh-B2dCVcj9.js.map → useSeatsRefresh-DgFy-Ph4.js.map} +1 -1
  242. package/dist/core/web/public/next/assets/{useVerseTranscript-BL3CljSI.js → useVerseTranscript-CDYrrWOO.js} +2 -2
  243. package/dist/core/web/public/next/assets/{useVerseTranscript-BL3CljSI.js.map → useVerseTranscript-CDYrrWOO.js.map} +1 -1
  244. package/dist/core/web/public/next/assets/{verse-icons-DASWdYuE.js → verse-icons-F9VwX07_.js} +2 -2
  245. package/dist/core/web/public/next/assets/{verse-icons-DASWdYuE.js.map → verse-icons-F9VwX07_.js.map} +1 -1
  246. package/dist/core/web/public/next/assets/{verse-model-BQ0Y2CSr.js → verse-model-DyCwZF-M.js} +2 -2
  247. package/dist/core/web/public/next/assets/{verse-model-BQ0Y2CSr.js.map → verse-model-DyCwZF-M.js.map} +1 -1
  248. package/dist/core/web/public/next/assets/{verse-ui-store-D7YXi63q.js → verse-ui-store-62DxpVHS.js} +3 -3
  249. package/dist/core/web/public/next/assets/{verse-ui-store-D7YXi63q.js.map → verse-ui-store-62DxpVHS.js.map} +1 -1
  250. package/dist/core/web/public/next/assets/{viewport-BYGH5EgA.js → viewport-nTubFCwf.js} +2 -2
  251. package/dist/core/web/public/next/assets/{viewport-BYGH5EgA.js.map → viewport-nTubFCwf.js.map} +1 -1
  252. package/dist/core/web/public/next/assets/{warmup-AsqwWCUi.js → warmup-HG5vYbsN.js} +3 -3
  253. package/dist/core/web/public/next/assets/{warmup-AsqwWCUi.js.map → warmup-HG5vYbsN.js.map} +1 -1
  254. package/dist/core/web/public/next/assets/{workspace-model-CXorJr0G.js → workspace-model-CbhdPhei.js} +2 -2
  255. package/dist/core/web/public/next/assets/{workspace-model-CXorJr0G.js.map → workspace-model-CbhdPhei.js.map} +1 -1
  256. package/dist/core/web/public/next/index.html +1 -1
  257. package/dist/release-dependency-inventory.json +1 -1
  258. package/package.json +1 -1
  259. package/dist/core/web/public/next/assets/AutonomySection-D3d8lYO3.js +0 -2
  260. package/dist/core/web/public/next/assets/McpSection-DvHFaVyp.js +0 -2
  261. package/dist/core/web/public/next/assets/primitives-CbAGCNKt.js +0 -1
  262. package/dist/core/web/public/next/assets/surface-prefetch-CHusyO9q.js +0 -2
@@ -1,2 +1,2 @@
1
- import{a as e,n as t,s as n}from"./index-DbDw9UAs.js";import{i as r,n as i,r as a,t as o}from"./highlight-CMCZK9jW.js";var s=n(e(),1),c={viewer:`_viewer_gf84p_1`,malformedNotice:`_malformedNotice_gf84p_9`,empty:`_empty_gf84p_18`,tree:`_tree_gf84p_27`,treeItem:`_treeItem_gf84p_40`,treeItemActive:`_treeItemActive_gf84p_59`,statusDot:`_statusDot_gf84p_64`,status_added:`_status_added_gf84p_70`,status_deleted:`_status_deleted_gf84p_71`,status_modified:`_status_modified_gf84p_72`,status_renamed:`_status_renamed_gf84p_73`,treePath:`_treePath_gf84p_75`,treeStats:`_treeStats_gf84p_83`,add:`_add_gf84p_89`,del:`_del_gf84p_90`,body:`_body_gf84p_92`,fileHeader:`_fileHeader_gf84p_99`,filePath:`_filePath_gf84p_109`,modeToggle:`_modeToggle_gf84p_118`,modeActive:`_modeActive_gf84p_132`,notice:`_notice_gf84p_138`,emptyFile:`_emptyFile_gf84p_149`,hunkTable:`_hunkTable_gf84p_155`,hunkCaption:`_hunkCaption_gf84p_163`,lineNo:`_lineNo_gf84p_173`,lineMarker:`_lineMarker_gf84p_184`,lineText:`_lineText_gf84p_192`,hunkTableSplit:`_hunkTableSplit_gf84p_199`,rowBlank:`_rowBlank_gf84p_203`,row_add:`_row_add_gf84p_207`,row_del:`_row_del_gf84p_210`,row_context:`_row_context_gf84p_213`,code:`_code_gf84p_217`,tok_plain:`_tok_plain_gf84p_221`,tok_comment:`_tok_comment_gf84p_222`,tok_string:`_tok_string_gf84p_223`,tok_number:`_tok_number_gf84p_224`,tok_keyword:`_tok_keyword_gf84p_225`},l=t();function u({diff:e,proposalKind:t}){let n=(0,s.useMemo)(()=>a(e),[e]),[r,i]=(0,s.useState)(n.files[0]?.id??null),[o,u]=(0,s.useState)(`unified`);if((0,s.useEffect)(()=>{i(n.files[0]?.id??null)},[e]),n.files.length===0)return(0,l.jsxs)(`div`,{className:c.empty,children:[`No diff attached to this proposal (kind: `,t,`).`]});let f=n.files.find(e=>e.id===r)??n.files[0];function p(e){let t=n.files.findIndex(e=>e.id===f.id);e.key===`ArrowDown`?(e.preventDefault(),i(n.files[Math.min(t+1,n.files.length-1)].id)):e.key===`ArrowUp`&&(e.preventDefault(),i(n.files[Math.max(t-1,0)].id))}return(0,l.jsxs)(`div`,{className:c.viewer,children:[n.malformed?(0,l.jsx)(`p`,{className:c.malformedNotice,children:`Could not parse this as a unified diff — showing raw content.`}):null,(0,l.jsx)(`div`,{className:c.tree,role:`tree`,"aria-label":`Changed files`,onKeyDown:p,children:n.files.map(e=>(0,l.jsxs)(`button`,{type:`button`,role:`treeitem`,"aria-selected":e.id===f.id,tabIndex:e.id===f.id?0:-1,className:`${c.treeItem} ${e.id===f.id?c.treeItemActive:``}`,onClick:()=>i(e.id),children:[(0,l.jsx)(`span`,{className:`${c.statusDot} ${c[`status_${e.status}`]}`,"aria-hidden":`true`}),(0,l.jsx)(`span`,{className:c.treePath,title:e.displayPath,children:e.displayPath}),(0,l.jsxs)(`span`,{className:c.treeStats,children:[e.additions>0?(0,l.jsxs)(`span`,{className:c.add,children:[`+`,e.additions]}):null,e.deletions>0?(0,l.jsxs)(`span`,{className:c.del,children:[`-`,e.deletions]}):null]})]},e.id))}),(0,l.jsxs)(`div`,{className:c.body,children:[(0,l.jsxs)(`div`,{className:c.fileHeader,children:[(0,l.jsx)(`span`,{className:c.filePath,children:f.displayPath}),(0,l.jsxs)(`div`,{className:c.modeToggle,role:`group`,"aria-label":`Diff view mode`,children:[(0,l.jsx)(`button`,{type:`button`,"aria-pressed":o===`unified`,className:o===`unified`?c.modeActive:``,onClick:()=>u(`unified`),children:`Unified`}),(0,l.jsx)(`button`,{type:`button`,"aria-pressed":o===`split`,className:o===`split`?c.modeActive:``,onClick:()=>u(`split`),children:`Split`})]})]}),f.unparsedNotice?(0,l.jsx)(`pre`,{className:c.notice,children:f.unparsedNotice}):null,f.hunks.length===0&&!f.unparsedNotice?(0,l.jsx)(`p`,{className:c.emptyFile,children:`No line-level changes captured for this file.`}):f.hunks.map((e,t)=>(0,l.jsx)(d,{hunk:e,mode:o,path:f.displayPath},t))]})]})}function d({hunk:e,mode:t,path:n}){let i=o(n);if(t===`split`){let t=r(e.lines);return(0,l.jsxs)(`table`,{className:`${c.hunkTable} ${c.hunkTableSplit}`,children:[(0,l.jsx)(`caption`,{className:c.hunkCaption,children:e.header}),(0,l.jsx)(`tbody`,{children:t.map((e,t)=>(0,l.jsxs)(`tr`,{children:[(0,l.jsx)(`td`,{className:c.lineNo,children:e.left?.oldLineNo??``}),(0,l.jsx)(`td`,{className:`${c.lineText} ${e.left?c[`row_${e.left.kind}`]:c.rowBlank}`,children:e.left?(0,l.jsx)(f,{text:e.left.text,lang:i}):null}),(0,l.jsx)(`td`,{className:c.lineNo,children:e.right?.newLineNo??``}),(0,l.jsx)(`td`,{className:`${c.lineText} ${e.right?c[`row_${e.right.kind}`]:c.rowBlank}`,children:e.right?(0,l.jsx)(f,{text:e.right.text,lang:i}):null})]},t))})]})}return(0,l.jsxs)(`table`,{className:c.hunkTable,children:[(0,l.jsx)(`caption`,{className:c.hunkCaption,children:e.header}),(0,l.jsx)(`tbody`,{children:e.lines.map((e,t)=>(0,l.jsxs)(`tr`,{className:c[`row_${e.kind}`],children:[(0,l.jsx)(`td`,{className:c.lineNo,children:e.oldLineNo??``}),(0,l.jsx)(`td`,{className:c.lineNo,children:e.newLineNo??``}),(0,l.jsx)(`td`,{className:c.lineMarker,"aria-hidden":`true`,children:e.kind===`add`?`+`:e.kind===`del`?`-`:``}),(0,l.jsx)(`td`,{className:c.lineText,children:(0,l.jsx)(f,{text:e.text,lang:i})})]},t))})]})}function f({text:e,lang:t}){let n=i(e,t);return(0,l.jsx)(`code`,{className:c.code,children:n.map((e,t)=>(0,l.jsx)(`span`,{className:c[`tok_${e.kind}`],children:e.text},t))})}export{u as t};
2
- //# sourceMappingURL=DiffViewer-CoV5-nUf.js.map
1
+ import{a as e,n as t,s as n}from"./index-BVxOlseC.js";import{i as r,n as i,r as a,t as o}from"./highlight-CMCZK9jW.js";var s=n(e(),1),c={viewer:`_viewer_gf84p_1`,malformedNotice:`_malformedNotice_gf84p_9`,empty:`_empty_gf84p_18`,tree:`_tree_gf84p_27`,treeItem:`_treeItem_gf84p_40`,treeItemActive:`_treeItemActive_gf84p_59`,statusDot:`_statusDot_gf84p_64`,status_added:`_status_added_gf84p_70`,status_deleted:`_status_deleted_gf84p_71`,status_modified:`_status_modified_gf84p_72`,status_renamed:`_status_renamed_gf84p_73`,treePath:`_treePath_gf84p_75`,treeStats:`_treeStats_gf84p_83`,add:`_add_gf84p_89`,del:`_del_gf84p_90`,body:`_body_gf84p_92`,fileHeader:`_fileHeader_gf84p_99`,filePath:`_filePath_gf84p_109`,modeToggle:`_modeToggle_gf84p_118`,modeActive:`_modeActive_gf84p_132`,notice:`_notice_gf84p_138`,emptyFile:`_emptyFile_gf84p_149`,hunkTable:`_hunkTable_gf84p_155`,hunkCaption:`_hunkCaption_gf84p_163`,lineNo:`_lineNo_gf84p_173`,lineMarker:`_lineMarker_gf84p_184`,lineText:`_lineText_gf84p_192`,hunkTableSplit:`_hunkTableSplit_gf84p_199`,rowBlank:`_rowBlank_gf84p_203`,row_add:`_row_add_gf84p_207`,row_del:`_row_del_gf84p_210`,row_context:`_row_context_gf84p_213`,code:`_code_gf84p_217`,tok_plain:`_tok_plain_gf84p_221`,tok_comment:`_tok_comment_gf84p_222`,tok_string:`_tok_string_gf84p_223`,tok_number:`_tok_number_gf84p_224`,tok_keyword:`_tok_keyword_gf84p_225`},l=t();function u({diff:e,proposalKind:t}){let n=(0,s.useMemo)(()=>a(e),[e]),[r,i]=(0,s.useState)(n.files[0]?.id??null),[o,u]=(0,s.useState)(`unified`);if((0,s.useEffect)(()=>{i(n.files[0]?.id??null)},[e]),n.files.length===0)return(0,l.jsxs)(`div`,{className:c.empty,children:[`No diff attached to this proposal (kind: `,t,`).`]});let f=n.files.find(e=>e.id===r)??n.files[0];function p(e){let t=n.files.findIndex(e=>e.id===f.id);e.key===`ArrowDown`?(e.preventDefault(),i(n.files[Math.min(t+1,n.files.length-1)].id)):e.key===`ArrowUp`&&(e.preventDefault(),i(n.files[Math.max(t-1,0)].id))}return(0,l.jsxs)(`div`,{className:c.viewer,children:[n.malformed?(0,l.jsx)(`p`,{className:c.malformedNotice,children:`Could not parse this as a unified diff — showing raw content.`}):null,(0,l.jsx)(`div`,{className:c.tree,role:`tree`,"aria-label":`Changed files`,onKeyDown:p,children:n.files.map(e=>(0,l.jsxs)(`button`,{type:`button`,role:`treeitem`,"aria-selected":e.id===f.id,tabIndex:e.id===f.id?0:-1,className:`${c.treeItem} ${e.id===f.id?c.treeItemActive:``}`,onClick:()=>i(e.id),children:[(0,l.jsx)(`span`,{className:`${c.statusDot} ${c[`status_${e.status}`]}`,"aria-hidden":`true`}),(0,l.jsx)(`span`,{className:c.treePath,title:e.displayPath,children:e.displayPath}),(0,l.jsxs)(`span`,{className:c.treeStats,children:[e.additions>0?(0,l.jsxs)(`span`,{className:c.add,children:[`+`,e.additions]}):null,e.deletions>0?(0,l.jsxs)(`span`,{className:c.del,children:[`-`,e.deletions]}):null]})]},e.id))}),(0,l.jsxs)(`div`,{className:c.body,children:[(0,l.jsxs)(`div`,{className:c.fileHeader,children:[(0,l.jsx)(`span`,{className:c.filePath,children:f.displayPath}),(0,l.jsxs)(`div`,{className:c.modeToggle,role:`group`,"aria-label":`Diff view mode`,children:[(0,l.jsx)(`button`,{type:`button`,"aria-pressed":o===`unified`,className:o===`unified`?c.modeActive:``,onClick:()=>u(`unified`),children:`Unified`}),(0,l.jsx)(`button`,{type:`button`,"aria-pressed":o===`split`,className:o===`split`?c.modeActive:``,onClick:()=>u(`split`),children:`Split`})]})]}),f.unparsedNotice?(0,l.jsx)(`pre`,{className:c.notice,children:f.unparsedNotice}):null,f.hunks.length===0&&!f.unparsedNotice?(0,l.jsx)(`p`,{className:c.emptyFile,children:`No line-level changes captured for this file.`}):f.hunks.map((e,t)=>(0,l.jsx)(d,{hunk:e,mode:o,path:f.displayPath},t))]})]})}function d({hunk:e,mode:t,path:n}){let i=o(n);if(t===`split`){let t=r(e.lines);return(0,l.jsxs)(`table`,{className:`${c.hunkTable} ${c.hunkTableSplit}`,children:[(0,l.jsx)(`caption`,{className:c.hunkCaption,children:e.header}),(0,l.jsx)(`tbody`,{children:t.map((e,t)=>(0,l.jsxs)(`tr`,{children:[(0,l.jsx)(`td`,{className:c.lineNo,children:e.left?.oldLineNo??``}),(0,l.jsx)(`td`,{className:`${c.lineText} ${e.left?c[`row_${e.left.kind}`]:c.rowBlank}`,children:e.left?(0,l.jsx)(f,{text:e.left.text,lang:i}):null}),(0,l.jsx)(`td`,{className:c.lineNo,children:e.right?.newLineNo??``}),(0,l.jsx)(`td`,{className:`${c.lineText} ${e.right?c[`row_${e.right.kind}`]:c.rowBlank}`,children:e.right?(0,l.jsx)(f,{text:e.right.text,lang:i}):null})]},t))})]})}return(0,l.jsxs)(`table`,{className:c.hunkTable,children:[(0,l.jsx)(`caption`,{className:c.hunkCaption,children:e.header}),(0,l.jsx)(`tbody`,{children:e.lines.map((e,t)=>(0,l.jsxs)(`tr`,{className:c[`row_${e.kind}`],children:[(0,l.jsx)(`td`,{className:c.lineNo,children:e.oldLineNo??``}),(0,l.jsx)(`td`,{className:c.lineNo,children:e.newLineNo??``}),(0,l.jsx)(`td`,{className:c.lineMarker,"aria-hidden":`true`,children:e.kind===`add`?`+`:e.kind===`del`?`-`:``}),(0,l.jsx)(`td`,{className:c.lineText,children:(0,l.jsx)(f,{text:e.text,lang:i})})]},t))})]})}function f({text:e,lang:t}){let n=i(e,t);return(0,l.jsx)(`code`,{className:c.code,children:n.map((e,t)=>(0,l.jsx)(`span`,{className:c[`tok_${e.kind}`],children:e.text},t))})}export{u as t};
2
+ //# sourceMappingURL=DiffViewer-BpH56302.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DiffViewer-CoV5-nUf.js","names":[],"sources":["../../../../../../src/web-ui/routes/inbox/DiffViewer.module.css","../../../../../../src/web-ui/routes/inbox/DiffViewer.tsx"],"sourcesContent":[".viewer {\n display: grid;\n grid-template-columns: minmax(180px, 260px) 1fr;\n gap: var(--space-4);\n align-items: start;\n min-height: 0;\n}\n\n.malformedNotice {\n grid-column: 1 / -1;\n padding: var(--space-2) var(--space-3);\n border-radius: var(--radius-sm);\n background: var(--status-warning-bg);\n color: var(--status-warning-fg);\n font-size: var(--text-xs-size);\n}\n\n.empty {\n padding: var(--space-6);\n text-align: center;\n color: var(--text-tertiary);\n font-size: var(--text-sm-size);\n border: 1px dashed var(--border-default);\n border-radius: var(--radius-md);\n}\n\n.tree {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n padding: var(--space-2);\n max-height: 480px;\n overflow-y: auto;\n position: sticky;\n top: 0;\n}\n\n.treeItem {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n width: 100%;\n padding: var(--space-1) var(--space-2);\n border-radius: var(--radius-sm);\n background: transparent;\n border: none;\n text-align: left;\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n cursor: pointer;\n}\n\n.treeItem:hover {\n background: var(--bg-hover);\n}\n\n.treeItemActive {\n background: var(--bg-selected);\n color: var(--text-primary);\n}\n\n.statusDot {\n flex: 0 0 auto;\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n}\n.status_added { background: var(--status-success-solid); }\n.status_deleted { background: var(--status-danger-solid); }\n.status_modified { background: var(--status-info-solid); }\n.status_renamed { background: var(--status-warning-solid); }\n\n.treePath {\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--font-mono);\n}\n\n.treeStats {\n flex: 0 0 auto;\n display: flex;\n gap: var(--space-1);\n font-variant-numeric: tabular-nums;\n}\n.add { color: var(--status-success-fg); }\n.del { color: var(--status-danger-fg); }\n\n.body {\n min-width: 0;\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n overflow: hidden;\n}\n\n.fileHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n padding: var(--space-2) var(--space-3);\n border-bottom: 1px solid var(--border-subtle);\n background: var(--bg-canvas);\n}\n\n.filePath {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n color: var(--text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.modeToggle {\n flex: 0 0 auto;\n display: flex;\n gap: var(--space-1);\n}\n.modeToggle button {\n padding: var(--space-1) var(--space-2);\n font-size: var(--text-xs-size);\n border-radius: var(--radius-sm);\n border: 1px solid var(--border-default);\n background: var(--bg-surface);\n color: var(--text-secondary);\n cursor: pointer;\n}\n.modeActive {\n background: var(--accent-50);\n border-color: var(--accent-500) !important;\n color: var(--accent-600) !important;\n}\n\n.notice {\n margin: var(--space-3);\n padding: var(--space-2);\n background: var(--bg-code);\n border-radius: var(--radius-sm);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n.emptyFile {\n padding: var(--space-4);\n color: var(--text-tertiary);\n font-size: var(--text-sm-size);\n}\n\n.hunkTable {\n width: 100%;\n border-collapse: collapse;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n table-layout: fixed;\n}\n\n.hunkCaption {\n caption-side: top;\n text-align: left;\n padding: var(--space-1) var(--space-3);\n color: var(--text-tertiary);\n background: var(--bg-canvas);\n border-bottom: 1px solid var(--border-subtle);\n border-top: 1px solid var(--border-subtle);\n}\n\n.lineNo {\n width: 44px;\n min-width: 44px;\n padding: 0 var(--space-2);\n text-align: right;\n color: var(--text-disabled);\n user-select: none;\n vertical-align: top;\n font-variant-numeric: tabular-nums;\n}\n\n.lineMarker {\n width: 16px;\n min-width: 16px;\n text-align: center;\n user-select: none;\n vertical-align: top;\n}\n\n.lineText {\n padding: 0 var(--space-2);\n white-space: pre-wrap;\n word-break: break-word;\n vertical-align: top;\n}\n\n.hunkTableSplit .lineText {\n width: 50%;\n}\n\n.rowBlank {\n background: var(--bg-canvas);\n}\n\n.row_add {\n background: var(--status-success-bg);\n}\n.row_del {\n background: var(--status-danger-bg);\n}\n.row_context {\n background: transparent;\n}\n\n.code {\n font-family: inherit;\n}\n\n.tok_plain { color: var(--text-primary); }\n.tok_comment { color: var(--text-tertiary); font-style: italic; }\n.tok_string { color: var(--status-success-fg); }\n.tok_number { color: var(--status-warning-fg); }\n.tok_keyword { color: var(--accent-600); font-weight: var(--font-weight-medium); }\n","/**\n * routes/inbox/DiffViewer.tsx — the core review interaction (operator-\n * console brief item 2). A multi-file unified diff gets a file tree plus a\n * syntax-highlighted, split/unified-toggleable hunk view instead of one\n * escaped <pre> block (the old UI's approach). No diff/highlighting\n * dependency: diff-parser.ts and highlight.ts are both hand-rolled per the\n * foundation's \"keep new runtime deps minimal\" constraint — checked\n * package.json first; nothing suitable was already a dependency.\n */\nimport { useEffect, useMemo, useState, type ReactNode } from 'react';\nimport { parseUnifiedDiff, toSplitRows, type DiffHunk } from './diff-parser.js';\nimport { languageForPath, tokenizeLine, type LangFamily } from './highlight.js';\nimport styles from './DiffViewer.module.css';\n\ntype ViewMode = 'unified' | 'split';\n\nexport function DiffViewer({ diff, proposalKind }: { diff: string | undefined; proposalKind: string }) {\n const parsed = useMemo(() => parseUnifiedDiff(diff), [diff]);\n const [selectedId, setSelectedId] = useState<string | null>(parsed.files[0]?.id ?? null);\n const [mode, setMode] = useState<ViewMode>('unified');\n\n // Diff identity changed (a different proposal is now shown) — reset the\n // selected file rather than holding on to a stale id from the last one.\n useEffect(() => {\n setSelectedId(parsed.files[0]?.id ?? null);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- reset on diff content change only\n }, [diff]);\n\n if (parsed.files.length === 0) {\n return (\n <div className={styles.empty}>No diff attached to this proposal (kind: {proposalKind}).</div>\n );\n }\n\n const selected = parsed.files.find((f) => f.id === selectedId) ?? parsed.files[0]!;\n\n function onTreeKeyDown(e: React.KeyboardEvent) {\n const idx = parsed.files.findIndex((f) => f.id === selected.id);\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setSelectedId(parsed.files[Math.min(idx + 1, parsed.files.length - 1)]!.id);\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setSelectedId(parsed.files[Math.max(idx - 1, 0)]!.id);\n }\n }\n\n return (\n <div className={styles.viewer}>\n {parsed.malformed ? (\n <p className={styles.malformedNotice}>Could not parse this as a unified diff — showing raw content.</p>\n ) : null}\n <div className={styles.tree} role=\"tree\" aria-label=\"Changed files\" onKeyDown={onTreeKeyDown}>\n {parsed.files.map((f) => (\n <button\n key={f.id}\n type=\"button\"\n role=\"treeitem\"\n aria-selected={f.id === selected.id}\n tabIndex={f.id === selected.id ? 0 : -1}\n className={`${styles.treeItem} ${f.id === selected.id ? styles.treeItemActive : ''}`}\n onClick={() => setSelectedId(f.id)}\n >\n <span className={`${styles.statusDot} ${styles[`status_${f.status}`]}`} aria-hidden=\"true\" />\n <span className={styles.treePath} title={f.displayPath}>\n {f.displayPath}\n </span>\n <span className={styles.treeStats}>\n {f.additions > 0 ? <span className={styles.add}>+{f.additions}</span> : null}\n {f.deletions > 0 ? <span className={styles.del}>-{f.deletions}</span> : null}\n </span>\n </button>\n ))}\n </div>\n\n <div className={styles.body}>\n <div className={styles.fileHeader}>\n <span className={styles.filePath}>{selected.displayPath}</span>\n <div className={styles.modeToggle} role=\"group\" aria-label=\"Diff view mode\">\n <button\n type=\"button\"\n aria-pressed={mode === 'unified'}\n className={mode === 'unified' ? styles.modeActive : ''}\n onClick={() => setMode('unified')}\n >\n Unified\n </button>\n <button\n type=\"button\"\n aria-pressed={mode === 'split'}\n className={mode === 'split' ? styles.modeActive : ''}\n onClick={() => setMode('split')}\n >\n Split\n </button>\n </div>\n </div>\n {selected.unparsedNotice ? <pre className={styles.notice}>{selected.unparsedNotice}</pre> : null}\n {selected.hunks.length === 0 && !selected.unparsedNotice ? (\n <p className={styles.emptyFile}>No line-level changes captured for this file.</p>\n ) : (\n selected.hunks.map((hunk, i) => <Hunk key={i} hunk={hunk} mode={mode} path={selected.displayPath} />)\n )}\n </div>\n </div>\n );\n}\n\nfunction Hunk({ hunk, mode, path }: { hunk: DiffHunk; mode: ViewMode; path: string }) {\n const lang = languageForPath(path);\n if (mode === 'split') {\n const rows = toSplitRows(hunk.lines);\n return (\n <table className={`${styles.hunkTable} ${styles.hunkTableSplit}`}>\n <caption className={styles.hunkCaption}>{hunk.header}</caption>\n <tbody>\n {rows.map((row, i) => (\n <tr key={i}>\n <td className={styles.lineNo}>{row.left?.oldLineNo ?? ''}</td>\n <td className={`${styles.lineText} ${row.left ? styles[`row_${row.left.kind}`] : styles.rowBlank}`}>\n {row.left ? <CodeLine text={row.left.text} lang={lang} /> : null}\n </td>\n <td className={styles.lineNo}>{row.right?.newLineNo ?? ''}</td>\n <td className={`${styles.lineText} ${row.right ? styles[`row_${row.right.kind}`] : styles.rowBlank}`}>\n {row.right ? <CodeLine text={row.right.text} lang={lang} /> : null}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n }\n return (\n <table className={styles.hunkTable}>\n <caption className={styles.hunkCaption}>{hunk.header}</caption>\n <tbody>\n {hunk.lines.map((line, i) => (\n <tr key={i} className={styles[`row_${line.kind}`]}>\n <td className={styles.lineNo}>{line.oldLineNo ?? ''}</td>\n <td className={styles.lineNo}>{line.newLineNo ?? ''}</td>\n <td className={styles.lineMarker} aria-hidden=\"true\">\n {line.kind === 'add' ? '+' : line.kind === 'del' ? '-' : ''}\n </td>\n <td className={styles.lineText}>\n <CodeLine text={line.text} lang={lang} />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n\nfunction CodeLine({ text, lang }: { text: string; lang: LangFamily }): ReactNode {\n const tokens = tokenizeLine(text, lang);\n return (\n <code className={styles.code}>\n {tokens.map((t, i) => (\n <span key={i} className={styles[`tok_${t.kind}`]}>\n {t.text}\n </span>\n ))}\n </code>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DiffViewer-BpH56302.js","names":[],"sources":["../../../../../../src/web-ui/routes/inbox/DiffViewer.module.css","../../../../../../src/web-ui/routes/inbox/DiffViewer.tsx"],"sourcesContent":[".viewer {\n display: grid;\n grid-template-columns: minmax(180px, 260px) 1fr;\n gap: var(--space-4);\n align-items: start;\n min-height: 0;\n}\n\n.malformedNotice {\n grid-column: 1 / -1;\n padding: var(--space-2) var(--space-3);\n border-radius: var(--radius-sm);\n background: var(--status-warning-bg);\n color: var(--status-warning-fg);\n font-size: var(--text-xs-size);\n}\n\n.empty {\n padding: var(--space-6);\n text-align: center;\n color: var(--text-tertiary);\n font-size: var(--text-sm-size);\n border: 1px dashed var(--border-default);\n border-radius: var(--radius-md);\n}\n\n.tree {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n padding: var(--space-2);\n max-height: 480px;\n overflow-y: auto;\n position: sticky;\n top: 0;\n}\n\n.treeItem {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n width: 100%;\n padding: var(--space-1) var(--space-2);\n border-radius: var(--radius-sm);\n background: transparent;\n border: none;\n text-align: left;\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n cursor: pointer;\n}\n\n.treeItem:hover {\n background: var(--bg-hover);\n}\n\n.treeItemActive {\n background: var(--bg-selected);\n color: var(--text-primary);\n}\n\n.statusDot {\n flex: 0 0 auto;\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n}\n.status_added { background: var(--status-success-solid); }\n.status_deleted { background: var(--status-danger-solid); }\n.status_modified { background: var(--status-info-solid); }\n.status_renamed { background: var(--status-warning-solid); }\n\n.treePath {\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--font-mono);\n}\n\n.treeStats {\n flex: 0 0 auto;\n display: flex;\n gap: var(--space-1);\n font-variant-numeric: tabular-nums;\n}\n.add { color: var(--status-success-fg); }\n.del { color: var(--status-danger-fg); }\n\n.body {\n min-width: 0;\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n overflow: hidden;\n}\n\n.fileHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n padding: var(--space-2) var(--space-3);\n border-bottom: 1px solid var(--border-subtle);\n background: var(--bg-canvas);\n}\n\n.filePath {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n color: var(--text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.modeToggle {\n flex: 0 0 auto;\n display: flex;\n gap: var(--space-1);\n}\n.modeToggle button {\n padding: var(--space-1) var(--space-2);\n font-size: var(--text-xs-size);\n border-radius: var(--radius-sm);\n border: 1px solid var(--border-default);\n background: var(--bg-surface);\n color: var(--text-secondary);\n cursor: pointer;\n}\n.modeActive {\n background: var(--accent-50);\n border-color: var(--accent-500) !important;\n color: var(--accent-600) !important;\n}\n\n.notice {\n margin: var(--space-3);\n padding: var(--space-2);\n background: var(--bg-code);\n border-radius: var(--radius-sm);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n.emptyFile {\n padding: var(--space-4);\n color: var(--text-tertiary);\n font-size: var(--text-sm-size);\n}\n\n.hunkTable {\n width: 100%;\n border-collapse: collapse;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n table-layout: fixed;\n}\n\n.hunkCaption {\n caption-side: top;\n text-align: left;\n padding: var(--space-1) var(--space-3);\n color: var(--text-tertiary);\n background: var(--bg-canvas);\n border-bottom: 1px solid var(--border-subtle);\n border-top: 1px solid var(--border-subtle);\n}\n\n.lineNo {\n width: 44px;\n min-width: 44px;\n padding: 0 var(--space-2);\n text-align: right;\n color: var(--text-disabled);\n user-select: none;\n vertical-align: top;\n font-variant-numeric: tabular-nums;\n}\n\n.lineMarker {\n width: 16px;\n min-width: 16px;\n text-align: center;\n user-select: none;\n vertical-align: top;\n}\n\n.lineText {\n padding: 0 var(--space-2);\n white-space: pre-wrap;\n word-break: break-word;\n vertical-align: top;\n}\n\n.hunkTableSplit .lineText {\n width: 50%;\n}\n\n.rowBlank {\n background: var(--bg-canvas);\n}\n\n.row_add {\n background: var(--status-success-bg);\n}\n.row_del {\n background: var(--status-danger-bg);\n}\n.row_context {\n background: transparent;\n}\n\n.code {\n font-family: inherit;\n}\n\n.tok_plain { color: var(--text-primary); }\n.tok_comment { color: var(--text-tertiary); font-style: italic; }\n.tok_string { color: var(--status-success-fg); }\n.tok_number { color: var(--status-warning-fg); }\n.tok_keyword { color: var(--accent-600); font-weight: var(--font-weight-medium); }\n","/**\n * routes/inbox/DiffViewer.tsx — the core review interaction (operator-\n * console brief item 2). A multi-file unified diff gets a file tree plus a\n * syntax-highlighted, split/unified-toggleable hunk view instead of one\n * escaped <pre> block (the old UI's approach). No diff/highlighting\n * dependency: diff-parser.ts and highlight.ts are both hand-rolled per the\n * foundation's \"keep new runtime deps minimal\" constraint — checked\n * package.json first; nothing suitable was already a dependency.\n */\nimport { useEffect, useMemo, useState, type ReactNode } from 'react';\nimport { parseUnifiedDiff, toSplitRows, type DiffHunk } from './diff-parser.js';\nimport { languageForPath, tokenizeLine, type LangFamily } from './highlight.js';\nimport styles from './DiffViewer.module.css';\n\ntype ViewMode = 'unified' | 'split';\n\nexport function DiffViewer({ diff, proposalKind }: { diff: string | undefined; proposalKind: string }) {\n const parsed = useMemo(() => parseUnifiedDiff(diff), [diff]);\n const [selectedId, setSelectedId] = useState<string | null>(parsed.files[0]?.id ?? null);\n const [mode, setMode] = useState<ViewMode>('unified');\n\n // Diff identity changed (a different proposal is now shown) — reset the\n // selected file rather than holding on to a stale id from the last one.\n useEffect(() => {\n setSelectedId(parsed.files[0]?.id ?? null);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- reset on diff content change only\n }, [diff]);\n\n if (parsed.files.length === 0) {\n return (\n <div className={styles.empty}>No diff attached to this proposal (kind: {proposalKind}).</div>\n );\n }\n\n const selected = parsed.files.find((f) => f.id === selectedId) ?? parsed.files[0]!;\n\n function onTreeKeyDown(e: React.KeyboardEvent) {\n const idx = parsed.files.findIndex((f) => f.id === selected.id);\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setSelectedId(parsed.files[Math.min(idx + 1, parsed.files.length - 1)]!.id);\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setSelectedId(parsed.files[Math.max(idx - 1, 0)]!.id);\n }\n }\n\n return (\n <div className={styles.viewer}>\n {parsed.malformed ? (\n <p className={styles.malformedNotice}>Could not parse this as a unified diff — showing raw content.</p>\n ) : null}\n <div className={styles.tree} role=\"tree\" aria-label=\"Changed files\" onKeyDown={onTreeKeyDown}>\n {parsed.files.map((f) => (\n <button\n key={f.id}\n type=\"button\"\n role=\"treeitem\"\n aria-selected={f.id === selected.id}\n tabIndex={f.id === selected.id ? 0 : -1}\n className={`${styles.treeItem} ${f.id === selected.id ? styles.treeItemActive : ''}`}\n onClick={() => setSelectedId(f.id)}\n >\n <span className={`${styles.statusDot} ${styles[`status_${f.status}`]}`} aria-hidden=\"true\" />\n <span className={styles.treePath} title={f.displayPath}>\n {f.displayPath}\n </span>\n <span className={styles.treeStats}>\n {f.additions > 0 ? <span className={styles.add}>+{f.additions}</span> : null}\n {f.deletions > 0 ? <span className={styles.del}>-{f.deletions}</span> : null}\n </span>\n </button>\n ))}\n </div>\n\n <div className={styles.body}>\n <div className={styles.fileHeader}>\n <span className={styles.filePath}>{selected.displayPath}</span>\n <div className={styles.modeToggle} role=\"group\" aria-label=\"Diff view mode\">\n <button\n type=\"button\"\n aria-pressed={mode === 'unified'}\n className={mode === 'unified' ? styles.modeActive : ''}\n onClick={() => setMode('unified')}\n >\n Unified\n </button>\n <button\n type=\"button\"\n aria-pressed={mode === 'split'}\n className={mode === 'split' ? styles.modeActive : ''}\n onClick={() => setMode('split')}\n >\n Split\n </button>\n </div>\n </div>\n {selected.unparsedNotice ? <pre className={styles.notice}>{selected.unparsedNotice}</pre> : null}\n {selected.hunks.length === 0 && !selected.unparsedNotice ? (\n <p className={styles.emptyFile}>No line-level changes captured for this file.</p>\n ) : (\n selected.hunks.map((hunk, i) => <Hunk key={i} hunk={hunk} mode={mode} path={selected.displayPath} />)\n )}\n </div>\n </div>\n );\n}\n\nfunction Hunk({ hunk, mode, path }: { hunk: DiffHunk; mode: ViewMode; path: string }) {\n const lang = languageForPath(path);\n if (mode === 'split') {\n const rows = toSplitRows(hunk.lines);\n return (\n <table className={`${styles.hunkTable} ${styles.hunkTableSplit}`}>\n <caption className={styles.hunkCaption}>{hunk.header}</caption>\n <tbody>\n {rows.map((row, i) => (\n <tr key={i}>\n <td className={styles.lineNo}>{row.left?.oldLineNo ?? ''}</td>\n <td className={`${styles.lineText} ${row.left ? styles[`row_${row.left.kind}`] : styles.rowBlank}`}>\n {row.left ? <CodeLine text={row.left.text} lang={lang} /> : null}\n </td>\n <td className={styles.lineNo}>{row.right?.newLineNo ?? ''}</td>\n <td className={`${styles.lineText} ${row.right ? styles[`row_${row.right.kind}`] : styles.rowBlank}`}>\n {row.right ? <CodeLine text={row.right.text} lang={lang} /> : null}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n }\n return (\n <table className={styles.hunkTable}>\n <caption className={styles.hunkCaption}>{hunk.header}</caption>\n <tbody>\n {hunk.lines.map((line, i) => (\n <tr key={i} className={styles[`row_${line.kind}`]}>\n <td className={styles.lineNo}>{line.oldLineNo ?? ''}</td>\n <td className={styles.lineNo}>{line.newLineNo ?? ''}</td>\n <td className={styles.lineMarker} aria-hidden=\"true\">\n {line.kind === 'add' ? '+' : line.kind === 'del' ? '-' : ''}\n </td>\n <td className={styles.lineText}>\n <CodeLine text={line.text} lang={lang} />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n\nfunction CodeLine({ text, lang }: { text: string; lang: LangFamily }): ReactNode {\n const tokens = tokenizeLine(text, lang);\n return (\n <code className={styles.code}>\n {tokens.map((t, i) => (\n <span key={i} className={styles[`tok_${t.kind}`]}>\n {t.text}\n </span>\n ))}\n </code>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{a as e,n as t,s as n}from"./index-DbDw9UAs.js";import{h as r,i,o as a,p as o}from"./global-BkNl4e6E.js";import{t as s}from"./MutationTokenDialog-DTQzEOHR.js";import{t as c}from"./ProviderLogo-Bz7KR5j3.js";import{c as l,s as u}from"./command-catalog-Bb_PxC5w.js";import{_ as d,a as f,b as p,c as m,d as h,g,h as _,l as v,n as y,r as b,u as x}from"./dock-store-qIu7kSQE.js";import{T as S,g as C,o as w,s as T}from"./verse-model-BQ0Y2CSr.js";import{C as ee,c as E,r as D}from"./verse-store-b_Lek_c5.js";import{f as O}from"./format-CaMmVQCn.js";import{a as te,c as k,d as A,l as ne,u as re}from"./context-queries-BDXT6LQ3.js";import{T as ie,f as j,t as ae,v as M,w as oe}from"./context-model-CjiJTnf1.js";import{_ as se,a as ce,i as le,l as N,m as ue,n as de,r as fe,v as P,w as pe,x as me}from"./context-model-Ci3Ch9t5.js";import{d as F,p as I,u as L}from"./workspace-model-CXorJr0G.js";import{n as R,t as z}from"./ActionMenu-_DhtX2gO.js";import{s as he}from"./tool-semantics-GX8ScuSH.js";import{d as B,h as ge,i as V,l as _e,n as H}from"./dock-icons-t--Eugrd.js";import{currentTurnTasks as U}from"./tasks-model-DvkWveXs.js";import{n as ve,t as W}from"./use-token-gate-CDDRAoKH.js";import{t as ye}from"./EmptyState-DYW29ncw.js";import{a as be,n as xe,r as Se}from"./slots-DDd8cEoh.js";import{i as G,r as K,t as Ce}from"./useVerseTranscript-BL3CljSI.js";import{t as we}from"./Switch-CUrvzO2k.js";import{t as q}from"./context.module-BijAfoJw.js";import{s as Te}from"./ChatSection-DUZNpiVr.js";var J=n(e(),1),Y={usage:`_usage_1xfeo_5`,muted:`_muted_1xfeo_21`,subTitle:`_subTitle_1xfeo_23`,idleWarn:`_idleWarn_1xfeo_35`},X=t();function Ee({session:e,seats:t,events:n,now:r}){let i=e.usage,a=oe(e,t),o=ie(n??[]),s=i.inputTokens+i.cacheReadTokens+i.cacheCreationTokens,c=M(i),l=e.compactionCount??o.compactions,u=j(e,a.tokens,r,E(n??[])),d=a.exact?``:`≤`,f=o.exact?``:`≤`;return(0,X.jsxs)(X.Fragment,{children:[(0,X.jsxs)(`dl`,{className:Y.usage,children:[(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Input`}),(0,X.jsx)(`dd`,{children:D(i.inputTokens)})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Output`}),(0,X.jsx)(`dd`,{children:D(i.outputTokens)})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Cache read`}),(0,X.jsx)(`dd`,{children:D(i.cacheReadTokens)})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Cache write`}),(0,X.jsx)(`dd`,{children:D(i.cacheCreationTokens)})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Turns`}),(0,X.jsx)(`dd`,{children:e.turnCount})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Context`}),(0,X.jsxs)(`dd`,{title:a.exact?void 0:`An upper bound: the CLI reported only the turn total, which sums every call.`,children:[d,D(a.tokens),a.window===null?``:` / ${D(a.window)}`]})]})]}),(0,X.jsx)(`h4`,{className:Y.subTitle,children:`Efficiency`}),(0,X.jsxs)(`dl`,{className:Y.usage,"aria-label":`Context efficiency`,children:[(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Cache hit`}),(0,X.jsx)(`dd`,{title:`Share of prompt tokens served from the provider's cache: cache read ÷ (input + cache read + cache write).`,children:c===null?s>0?`none reported`:`—`:O(c)})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Compactions`}),(0,X.jsx)(`dd`,{children:l})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Avg context / turn`}),(0,X.jsx)(`dd`,{children:o.average===null?`—`:`${f}${D(o.average)}`})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Peak context`}),(0,X.jsx)(`dd`,{children:o.peak===null?`—`:`${f}${D(o.peak)}`})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Mode`}),(0,X.jsx)(`dd`,{children:ae[a.mode]})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Compacts at`}),(0,X.jsx)(`dd`,{children:a.autoCompactAt===null?`—`:`≈${D(a.autoCompactAt)}`})]})]}),(0,X.jsxs)(`p`,{className:Y.muted,children:[a.source===null?a.window===null?`Window unknown for this chat.`:`Window as stored when this chat was created; how it was known was not recorded.`:`Window ${S(a.source,e.engine)}.`,o.turns>0&&!o.exact?` Figures marked ≤ are upper bounds: the CLI reported only turn totals.`:``]}),(0,X.jsx)(`p`,{className:Y.muted,children:e.memoryEnabled===!0?e.engine===`local`?`Shared project memory was given to this chat’s agent when it started.`:`Shared project memory was given to this chat’s agent when it started: a block of up to ${de/1024} KB in its system prompt, re-sent every turn (cached after the first), plus the agent’s own reads and updates of MEMORY.md — a little of this seat’s usage.`:`This chat started without shared project memory.`}),u===null?null:(0,X.jsx)(`p`,{role:`status`,className:Y.idleWarn,children:u.local?`Idle for ${T(u.idleMs)}: the local model has likely dropped this chat from its cache, so the next turn re-processes ~${D(u.tokens)} tokens before it replies — time, not spend.`:`Idle for ${T(u.idleMs)}, past the ~1 h prompt-cache lifetime: the next turn likely re-reads ~${D(u.tokens)} tokens uncached, at full price.`})]})}function De({projectPath:e,refreshKey:t}){let n=(0,J.useId)();return e?(0,X.jsx)(Me,{projectPath:e,refreshKey:t},e):(0,X.jsxs)(`section`,{className:q.memory,"aria-labelledby":n,children:[(0,X.jsx)(`h3`,{id:n,className:q.memoryHead,children:`Project memory`}),(0,X.jsx)(`p`,{className:q.hint,children:`Open a chat to see the memory its project shares across seats.`})]})}var Oe=`Saving writes MEMORY.md for this project. Every seat on it reads this file.`,ke=`Clearing empties MEMORY.md for every chat on this project.`,Ae=`This changes whether new chats on this project are given shared memory.`,je=`This changes whether new chats on ANY project are given shared memory.`;function Me({projectPath:e,refreshKey:t}){let n=(0,J.useId)(),c=(0,J.useId)(),l=(0,J.useId)(),u=(0,J.useMemo)(()=>re(e),[e]),d=o(u),f=r(u),p=o(ne),m=ve(),h=C(e),[g,_]=(0,J.useState)(`view`),[v,y]=(0,J.useState)(``),[b,x]=(0,J.useState)(``),[S,w]=(0,J.useState)(!1),[T,E]=(0,J.useState)(null),[D,O]=(0,J.useState)(null),[ie,j]=(0,J.useState)(null),[ae,M]=(0,J.useState)(null),oe=(0,J.useRef)(null),de=(0,J.useRef)(t);(0,J.useEffect)(()=>{t!==de.current&&(de.current=t,f())},[t,f]),(0,J.useEffect)(()=>{let e=oe.current;g===`edit`&&e&&(e.focus(),e.setSelectionRange(e.value.length,e.value.length))},[g]);let[F,I]=(0,J.useState)(null);(0,J.useEffect)(()=>{F!==null&&d.status===`success`&&I(null)},[F,d.status]);let L=F!==null&&d.status!==`success`?F:d.data,R=d.error instanceof a&&d.error.status===404,z=p.data?!p.data.memory.enabled:!1,he=(0,J.useMemo)(()=>pe(v),[v]),B=he>ee,ge=(0,J.useMemo)(()=>ue({projectPath:e,content:v}),[e,v]),V=!B&&ge>fe,_e=g===`edit`?me(v):null,H=g===`edit`&&S?se(v):0;function U(e,t){y(e),x(e),w(t),E(null),j(null),M(null),_(`edit`)}async function ye(t=!1){if(!D){O(`saving`),j(null);try{let n=await te(e);if(!t&&n.content!==b){E(n);return}let r=await m.run(Oe,()=>A(e,v));if(r===null)return;I(r),E(null),_(`view`),M(r.content.length===0?`Saved — MEMORY.md is now empty.`:`Saved.`)}catch(e){j(W(e))}finally{O(null)}}}async function be(){if(!D){O(`clearing`),j(null);try{let t=await m.run(ke,()=>A(e,``));if(t===null)return;I(t),_(`view`),M(`Cleared. Agents start MEMORY.md afresh on their next write.`)}catch(e){j(W(e))}finally{O(null)}}}async function xe(t){if(!D){O(`toggling`),j(null),M(null);try{await m.run(Ae,()=>k({projectPath:e,memoryEnabled:t}))!==null&&M(t?`New chats on ${h} will get shared memory. Chats already open keep what they started with.`:`New chats on ${h} will start without shared memory. The file is kept.`)}catch(e){j(W(e))}finally{O(null)}}}async function Se(e){if(!D){O(`toggling`),j(null),M(null);try{await m.run(je,()=>k({memoryEnabled:e}))}catch(e){j(W(e))}finally{O(null)}}}let G=L?z?`off everywhere`:L.enabled?`on`:`off`:null;return(0,X.jsxs)(`section`,{className:q.memory,"aria-labelledby":n,"data-project":e,children:[(0,X.jsxs)(`h3`,{id:n,className:q.memoryHead,children:[(0,X.jsx)(`span`,{children:`Project memory`}),G?(0,X.jsx)(`span`,{className:q.memoryState,children:G}):null,R?null:(0,X.jsx)(`button`,{type:`button`,className:q.memoryHeadAction,onClick:f,"aria-label":`Refresh project memory`,children:`Refresh`})]}),(0,X.jsxs)(`p`,{className:q.hint,children:[`One `,(0,X.jsx)(`code`,{children:`MEMORY.md`}),` shared by every chat on `,(0,X.jsx)(`strong`,{title:e,children:h}),`, whichever seat runs it. Agents keep it current — decisions and why, conventions, gotchas, plan status.`]}),R?(0,X.jsxs)(`p`,{className:q.hint,children:[`This server has no project memory yet — update Ashlr and restart `,(0,X.jsx)(`code`,{children:`ashlr verse`}),`.`]}):d.status===`loading`||d.status===`idle`&&!L?(0,X.jsxs)(`div`,{"aria-busy":`true`,children:[(0,X.jsx)(i,{width:`80%`}),(0,X.jsx)(i,{width:`60%`}),(0,X.jsx)(i,{width:`70%`})]}):L?(0,X.jsxs)(X.Fragment,{children:[z?(0,X.jsxs)(`div`,{className:q.field,children:[(0,X.jsx)(`p`,{className:q.hint,children:`Shared memory is off for every project, so new chats start without it.`}),(0,X.jsx)(`div`,{className:q.memoryActions,children:(0,X.jsx)(`button`,{type:`button`,className:`${q.secondary} ${q.small}`,disabled:D!==null,onClick:()=>void Se(!0),children:`Turn memory on`})})]}):(0,X.jsx)(we,{checked:L.enabled,disabled:D!==null||!p.data,onChange:e=>void xe(e),label:`Give new chats on ${h} this memory`}),g===`edit`?(0,X.jsxs)(`div`,{className:q.field,children:[(0,X.jsx)(`label`,{className:q.label,htmlFor:c,children:`Edit MEMORY.md`}),(0,X.jsx)(`textarea`,{id:c,ref:oe,className:q.textarea,value:v,rows:12,spellCheck:!1,"aria-describedby":l,"aria-invalid":B||V?!0:void 0,onChange:e=>y(e.target.value)}),(0,X.jsxs)(`p`,{id:l,className:`${q.hint} ${q.counter} ${B||V?q.counterOver:``}`,children:[N(he),` of `,N(ee),B?` — over the limit; trim it to save.`:``,V?` — ${N(ge)} once line breaks and quotes are encoded for sending, over the ${N(fe)} request limit; trim it to save.`:``]}),_e?(0,X.jsxs)(`p`,{className:q.warn,role:`alert`,children:[`This looks like it contains `,_e,`. MEMORY.md is sent to every seat’s model — remove it before saving.`]}):null,H>0?(0,X.jsxs)(`p`,{className:q.warn,role:`alert`,children:[H===1?`One`:H,` `,(0,X.jsx)(`code`,{children:ce}),` placeholder`,H===1?` stands`:`s stand`,` in for secret-looking text that is still in MEMORY.md. Saving `,H===1?`it`:`them`,` would replace the real value`,H===1?``:`s`,`, so Save stays off until `,H===1?`it is`:`they are`,` gone. Deleting a placeholder drops that value from the file; to keep it, edit MEMORY.md directly under `,(0,X.jsx)(`code`,{children:`~/.ashlr/verse/memory`}),`.`]}):S?(0,X.jsxs)(`p`,{className:q.hint,children:[`This copy was sanitized for the browser, so a home-folder path appears as `,(0,X.jsx)(`code`,{children:`~`}),`. Saving writes the text as shown; `,(0,X.jsx)(`code`,{children:`~`}),` names the same folder for every reader.`]}):null,T?(0,X.jsxs)(`div`,{className:q.warn,role:`alert`,children:[(0,X.jsxs)(`p`,{className:q.hint,children:[`An agent changed MEMORY.md while you were editing`,P(T.updatedAt)?` (${P(T.updatedAt)})`:``,`.`]}),(0,X.jsxs)(`div`,{className:q.memoryActions,children:[(0,X.jsx)(`button`,{type:`button`,className:`${q.secondary} ${q.small}`,disabled:D!==null||H>0,onClick:()=>void ye(!0),children:`Overwrite with mine`}),(0,X.jsx)(`button`,{type:`button`,className:`${q.cancel} ${q.small}`,disabled:D!==null,onClick:()=>U(T.content,T.contentSanitized===!0),children:`Start over from theirs`})]})]}):null,(0,X.jsxs)(`div`,{className:q.memoryActions,children:[(0,X.jsx)(`button`,{type:`button`,className:`${q.primary} ${q.small}`,disabled:D!==null||B||V||v===b||T!==null||H>0,onClick:()=>void ye(!1),children:D===`saving`?`Saving…`:`Save`}),(0,X.jsx)(`button`,{type:`button`,className:`${q.cancel} ${q.small}`,disabled:D===`saving`,onClick:()=>{_(`view`),E(null),j(null)},children:`Cancel`})]})]}):L.content.length===0?(0,X.jsxs)(`div`,{className:q.field,children:[(0,X.jsx)(`p`,{className:q.hint,children:`MEMORY.md is empty. Agents add to it as they work, or write the first entries yourself.`}),(0,X.jsx)(`div`,{className:q.memoryActions,children:(0,X.jsx)(`button`,{type:`button`,className:`${q.secondary} ${q.small}`,onClick:()=>U(``,!1),children:`Write it`})})]}):(0,X.jsxs)(`div`,{className:q.field,children:[(0,X.jsx)(`pre`,{className:q.memoryBody,tabIndex:0,"aria-label":`MEMORY.md for ${h}`,children:L.content}),(0,X.jsxs)(`p`,{className:`${q.hint} ${q.memoryMeta}`,children:[(0,X.jsx)(`span`,{children:N(L.bytes)}),P(L.updatedAt)?(0,X.jsxs)(`span`,{children:[`updated `,P(L.updatedAt)]}):null]}),L.contentSanitized?(0,X.jsxs)(`p`,{className:q.hint,children:[`Shown sanitized for the browser: a home-folder path appears as `,(0,X.jsx)(`code`,{children:`~`}),` and secret-looking text as`,` `,(0,X.jsx)(`code`,{children:ce}),`.`,se(L.content)>0?` The real values are still in the file.`:``]}):null,g===`confirm-clear`?(0,X.jsxs)(`div`,{className:q.warn,role:`alert`,children:[(0,X.jsxs)(`p`,{className:q.hint,children:[`Clear MEMORY.md for `,h,`? Every chat on this project loses what it says. Other files in the folder stay.`]}),(0,X.jsxs)(`div`,{className:q.memoryActions,children:[(0,X.jsx)(`button`,{type:`button`,className:`${q.secondary} ${q.small} ${q.danger}`,disabled:D!==null,onClick:()=>void be(),children:D===`clearing`?`Clearing…`:`Clear it`}),(0,X.jsx)(`button`,{type:`button`,className:`${q.cancel} ${q.small}`,onClick:()=>_(`view`),children:`Keep`})]})]}):(0,X.jsxs)(`div`,{className:q.memoryActions,children:[(0,X.jsx)(`button`,{type:`button`,className:`${q.secondary} ${q.small}`,onClick:()=>U(L.content,L.contentSanitized===!0),children:`Edit`}),(0,X.jsx)(`button`,{type:`button`,className:`${q.cancel} ${q.small}`,onClick:()=>{M(null),_(`confirm-clear`)},children:`Clear…`})]})]}),L.files.length>0?(0,X.jsxs)(`div`,{className:q.field,children:[(0,X.jsx)(`span`,{className:q.label,children:`Also in this folder`}),(0,X.jsx)(`ul`,{className:q.memoryFiles,children:L.files.map(e=>(0,X.jsx)(`li`,{children:(0,X.jsx)(`code`,{children:e})},e))})]}):null,ae?(0,X.jsx)(`p`,{className:q.hint,role:`status`,children:ae}):null,ie?(0,X.jsx)(`p`,{className:q.error,role:`alert`,children:ie}):null,(0,X.jsxs)(`details`,{children:[(0,X.jsx)(`summary`,{className:q.hint,children:`How project memory works`}),(0,X.jsxs)(`div`,{className:q.field,children:[(0,X.jsx)(`p`,{className:q.hint,children:`Claude, Codex and local seats can read and edit the file. Grok’s CLI can reach only its working folder, so a Grok seat is given the text and can only read it.`}),(0,X.jsx)(`p`,{className:q.hint,children:`A chat copies the memory into its instructions when it starts, so every turn re-sends the same prefix and the provider’s prompt cache keeps working. Chats already open see your edits when they next read the file; the switch above applies to new chats.`}),(0,X.jsxs)(`p`,{className:q.hint,children:[`It lives on this machine under `,(0,X.jsx)(`code`,{children:`~/.ashlr/verse/memory`}),`, readable only by you. It is sent to every seat’s model, so never put secrets in it.`]}),(0,X.jsx)(`p`,{className:q.hint,children:le}),z?null:(0,X.jsxs)(`p`,{className:q.hint,children:[`Memory is on for every project unless switched off per project.`,` `,(0,X.jsx)(`button`,{type:`button`,className:q.link,disabled:D!==null,onClick:()=>void Se(!1),children:`Turn it off for every project`})]})]})]})]}):(0,X.jsxs)(`div`,{className:q.searchError,role:`alert`,children:[(0,X.jsxs)(`span`,{children:[`Could not read this project’s memory: `,W(d.error)]}),(0,X.jsx)(`button`,{type:`button`,className:`${q.secondary} ${q.small}`,onClick:f,children:`Retry`})]}),(0,X.jsx)(s,{open:m.dialog.open,reason:m.dialog.reason,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`,onClose:m.dialog.onClose,onUnlocked:m.dialog.onUnlocked})]})}var Z={roots:`_roots_afeac_8`,title:`_title_afeac_10`,count:`_count_afeac_22`,workspace:`_workspace_afeac_30`,list:`_list_afeac_36`,root:`_root_afeac_8`,rootHead:`_rootHead_afeac_57`,name:`_name_afeac_64`,badge:`_badge_afeac_72`,path:`_path_afeac_84`,git:`_git_afeac_97`,remote:`_remote_afeac_98`,caveat:`_caveat_afeac_99`,note:`_note_afeac_116`,error:`_error_afeac_117`};function Ne({session:e,data:t,error:n=null}){return!e||t!==null&&t.roots.length<=1&&t.workspaceId===null?null:(0,X.jsxs)(`section`,{className:Z.roots,"aria-labelledby":`verse-res-roots`,children:[(0,X.jsxs)(`h3`,{id:`verse-res-roots`,className:Z.title,children:[`Folders`,t?(0,X.jsx)(`span`,{className:Z.count,children:t.roots.length}):null]}),t?.workspaceName?(0,X.jsxs)(`p`,{className:Z.workspace,children:[`Workspace `,(0,X.jsx)(`strong`,{children:t.workspaceName})]}):null,n?(0,X.jsx)(`p`,{role:`alert`,className:Z.error,children:n}):null,(0,X.jsx)(`ul`,{className:Z.list,children:(t?.roots??[]).map(e=>{let t=F(e),n=L(e);return(0,X.jsxs)(`li`,{className:Z.root,"data-tone":I(e),children:[(0,X.jsxs)(`div`,{className:Z.rootHead,children:[(0,X.jsx)(`span`,{className:Z.name,children:e.name}),(0,X.jsx)(`span`,{className:Z.badge,children:e.primary?`primary`:`added`})]}),(0,X.jsx)(`p`,{className:Z.path,title:e.path,children:ge(e.path)}),(0,X.jsx)(`p`,{className:Z.git,children:t??`not a git repo`}),e.git?.remote?(0,X.jsx)(`p`,{className:Z.remote,children:e.git.remote}):null,n?(0,X.jsx)(`p`,{className:Z.caveat,children:n}):null]},e.path)})}),(t?.notes??[]).map(e=>(0,X.jsx)(`p`,{className:Z.note,children:e},e))]})}var Q={pane:`_pane_1f7em_6`,section:`_section_1f7em_13`,sectionTitle:`_sectionTitle_1f7em_19`,count:`_count_1f7em_31`,muted:`_muted_1f7em_37`,action:`_action_1f7em_43`,hint:`_hint_1f7em_46`,reserve:`_reserve_1f7em_54`,link:`_link_1f7em_73`,task:`_task_1f7em_74`,taskList:`_taskList_1f7em_88`,taskMark:`_taskMark_1f7em_113`,"pane-pulse":`_pane-pulse_1f7em_1`,taskName:`_taskName_1f7em_125`,taskDetail:`_taskDetail_1f7em_134`,taskTime:`_taskTime_1f7em_142`,engineTick:`_engineTick_1f7em_152`},Pe=3e4;function Fe(e){let[t,n]=(0,J.useState)(()=>Date.now());return(0,J.useEffect)(()=>{if(!e)return;n(Date.now());let t=setInterval(()=>n(Date.now()),Pe);return()=>clearInterval(t)},[e]),t}function Ie({session:e,seats:t,events:n,roots:r,rootsError:i,onHandoff:a,handoffDisabledReason:o=null,onOpenAccounts:s,visible:c}){let l=Fe(c&&e!==null);return(0,X.jsxs)(`div`,{className:Q.pane,"aria-label":`Context`,children:[(0,X.jsxs)(`section`,{className:Q.section,"aria-labelledby":`dock-context-chat`,children:[(0,X.jsx)(`h3`,{id:`dock-context-chat`,className:Q.sectionTitle,children:`This chat`}),e?(0,X.jsx)(Ee,{session:e,seats:t,events:n,now:l}):(0,X.jsx)(`p`,{className:Q.muted,children:`Open a chat to see its usage and context.`})]}),e?(0,X.jsx)(`div`,{className:Q.section,children:(0,X.jsx)(Ne,{session:e,data:r,error:i})}):null,e&&a?(0,X.jsxs)(`section`,{className:Q.section,"aria-labelledby":`dock-context-handoff`,children:[(0,X.jsx)(`h3`,{id:`dock-context-handoff`,className:Q.sectionTitle,children:`Handoff`}),(0,X.jsx)(`p`,{className:Q.muted,children:`Verse drafts a note from this chat's log — free — and opens a fresh chat with it in the message box. Nothing is sent until you press Send.`}),(0,X.jsx)(`button`,{type:`button`,className:Q.action,onClick:a,disabled:o!==null,title:o??void 0,children:`Continue in a fresh chat…`}),(0,X.jsx)(`p`,{className:`${Q.muted} ${Q.reserve}`,children:o??``})]}):null,(0,X.jsx)(`div`,{className:Q.section,children:(0,X.jsx)(De,{projectPath:e?.projectPath??null,refreshKey:e?.turnCount??0})}),(0,X.jsx)(`div`,{className:Q.section,children:(0,X.jsx)(`button`,{type:`button`,className:Q.link,onClick:s,children:`Accounts & capacity →`})})]})}var $={dock:`_dock_10ssf_8`,sheetLayer:`_sheetLayer_10ssf_25`,scrim:`_scrim_10ssf_37`,"dock-fade":`_dock-fade_10ssf_1`,"dock-in-right":`_dock-in-right_10ssf_1`,"dock-in-up":`_dock-in-up_10ssf_1`,grabber:`_grabber_10ssf_64`,head:`_head_10ssf_75`,tabs:`_tabs_10ssf_86`,tabWrap:`_tabWrap_10ssf_97`,tab:`_tab_10ssf_86`,tabClose:`_tabClose_10ssf_135`,headActions:`_headActions_10ssf_156`,iconButton:`_iconButton_10ssf_162`,plus:`_plus_10ssf_179`,body:`_body_10ssf_185`,pane:`_pane_10ssf_191`,splitHandle:`_splitHandle_10ssf_200`,widthHandle:`_widthHandle_10ssf_220`};function Le(e){let t=u(e)?.keys[0];return t?l(t):null}var Re=16,ze=64,Be=.05;function Ve(e){let{presentation:t,windowWidth:n,columnWidth:r}=e,{state:i,requests:a}=_(),o=(0,J.useRef)(null),s=(0,J.useRef)(new Map),c=(0,J.useId)(),[l,u]=(0,J.useState)(null),[m,v]=(0,J.useState)(()=>new Set(i.open&&i.active?[i.active]:[])),x=i.tabs.filter(G),S=i.active!==null&&x.includes(i.active)?i.active:x[0]??null,C=i.splitWith!==null&&x.includes(i.splitWith)&&i.splitWith!==S?i.splitWith:null,w=i.open&&S!==null,T=t!==`column`;(0,J.useEffect)(()=>{w&&v(e=>{let t=[S,C].filter(e=>e!==null),n=new Set([...e].filter(e=>x.includes(e)));for(let e of t)n.add(e);return n.size===e.size&&[...n].every(t=>e.has(t))?e:n})},[w,S,C,x.join(`|`)]),(0,J.useEffect)(()=>{if(!w||!T)return;let e=document.activeElement;return o.current?.focus({preventScroll:!0}),()=>{e&&document.contains(e)&&e.focus({preventScroll:!0})}},[w,T]);let ee=(0,J.useCallback)(e=>{if(!T)return;let t=e.target instanceof Element&&e.target.closest(`[data-dock-pane="terminal"]`)!==null;if(e.key===`Escape`&&!t&&!e.defaultPrevented){e.preventDefault(),y();return}if(e.key!==`Tab`||t)return;let n=o.current;if(!n)return;let r=Array.from(n.querySelectorAll(`button:not([disabled]), [href], input:not([disabled]), select, textarea, [tabindex]:not([tabindex="-1"])`)).filter(e=>!e.closest(`[hidden]`));if(r.length===0)return;let i=r[0],a=r[r.length-1];e.shiftKey&&document.activeElement===i?(e.preventDefault(),a.focus()):!e.shiftKey&&document.activeElement===a&&(e.preventDefault(),i.focus())},[T]);if(!w)return null;function E(e,t){let n=x.indexOf(t),r;if(e.key===`ArrowRight`)r=x[(n+1)%x.length];else if(e.key===`ArrowLeft`)r=x[(n-1+x.length)%x.length];else if(e.key===`Home`)r=x[0];else if(e.key===`End`)r=x[x.length-1];else if((e.key===`Delete`||e.key===`Backspace`)&&x.length>0){e.preventDefault(),b(t);return}r&&(e.preventDefault(),f(r),s.current.get(r)?.focus())}let D=d.map(e=>e.id).filter(e=>G(e)&&!x.includes(e)),O=D.map(e=>({id:e,label:K[e],icon:V[e]({}),onSelect:()=>f(e)})),te=[...d.map(e=>e.id).filter(e=>G(e)&&e!==S).map(e=>({id:e,label:`${K[e]} below`,icon:V[e]({}),onSelect:()=>h(e)})),...C?[{id:`unsplit`,label:`One pane`,separated:!0,onSelect:()=>h(null)}]:[]],k=Le(`dock.toggle`),A=t===`column`?r:p(i.width,n),ne=`Dock: ${K[S]}${C?` over ${K[C]}`:``}`,re=(0,X.jsxs)(`aside`,{ref:o,className:$.dock,"data-presentation":t,"data-split":C?`true`:void 0,"aria-label":ne,role:T?`dialog`:`complementary`,"aria-modal":T?!0:void 0,tabIndex:-1,style:t===`bottom-sheet`?{height:`${g.bottomSheetHeightVh}vh`}:{width:A},onKeyDown:ee,children:[t===`column`?(0,X.jsx)(Ue,{width:A,windowWidth:n}):null,t===`bottom-sheet`?(0,X.jsx)(`span`,{className:$.grabber,"aria-hidden":`true`}):null,(0,X.jsxs)(`div`,{className:$.head,children:[(0,X.jsx)(`div`,{className:$.tabs,role:`tablist`,"aria-label":`Dock panes`,children:x.map(e=>{let t=V[e],n=e===S,r=e===C;return(0,X.jsxs)(`div`,{className:$.tabWrap,"data-selected":n||void 0,"data-below":r||void 0,children:[(0,X.jsxs)(`button`,{ref:t=>{t?s.current.set(e,t):s.current.delete(e)},type:`button`,role:`tab`,id:`${c}-tab-${e}`,"aria-selected":n,"aria-controls":`${c}-pane-${e}`,tabIndex:n?0:-1,className:$.tab,onClick:()=>f(e),onKeyDown:t=>E(t,e),title:r?`${K[e]} (lower pane)`:void 0,children:[(0,X.jsx)(t,{size:14}),(0,X.jsx)(`span`,{className:$.tabLabel,children:K[e]})]}),(0,X.jsx)(`button`,{type:`button`,className:$.tabClose,"aria-label":`Close ${K[e]}`,title:`Close ${K[e]}`,tabIndex:-1,onClick:()=>b(e),children:(0,X.jsx)(H,{size:12})})]},e)})}),(0,X.jsxs)(`div`,{className:$.headActions,children:[(0,X.jsx)(`button`,{type:`button`,className:$.iconButton,"aria-label":`Add a pane`,title:D.length>0?`Add a pane`:`Every pane is already open`,"aria-haspopup":`menu`,"aria-expanded":l?.kind===`add`,disabled:D.length===0,onClick:e=>u({kind:`add`,anchor:R(e.currentTarget),from:e.currentTarget}),children:(0,X.jsx)(`span`,{className:$.plus,"aria-hidden":`true`,children:`+`})}),t!==`bottom-sheet`&&te.length>0?(0,X.jsx)(`button`,{type:`button`,className:$.iconButton,"aria-label":C?`Split: change or undo`:`Split the dock`,title:C?`Change the split`:`Split: show a second pane below`,"aria-haspopup":`menu`,"aria-expanded":l?.kind===`split`,"aria-pressed":C!==null,onClick:e=>u({kind:`split`,anchor:R(e.currentTarget),from:e.currentTarget}),children:(0,X.jsx)(_e,{size:14})}):null,(0,X.jsx)(`button`,{type:`button`,className:$.iconButton,"aria-label":`Close the dock`,title:`Close the dock${k?` (${k})`:``}`,onClick:y,children:(0,X.jsx)(H,{size:14})})]})]}),(0,X.jsxs)(`div`,{className:$.body,children:[x.filter(e=>m.has(e)||e===S||e===C).map(n=>{let r=n===S||n===C&&t!==`bottom-sheet`,o=n===S?`top`:n===C?`bottom`:`hidden`;return(0,X.jsx)(`div`,{id:`${c}-pane-${n}`,role:`tabpanel`,"aria-labelledby":`${c}-tab-${n}`,className:$.pane,"data-dock-pane":n,"data-position":r?o:`hidden`,hidden:!r,inert:!r,style:r&&C&&t!==`bottom-sheet`?{flexBasis:`${(o===`top`?i.splitRatio:1-i.splitRatio)*100}%`,order:o===`top`?0:2}:void 0,children:(0,X.jsx)(He,{pane:n,visible:r,...e,requests:a})},n)}),C&&t!==`bottom-sheet`?(0,X.jsx)(We,{ratio:i.splitRatio,lower:K[C]}):null]}),l?(0,X.jsx)(z,{label:l.kind===`add`?`Add a pane`:`Split the dock`,items:l.kind===`add`?O:te,anchor:l.anchor,returnFocus:l.from,onClose:()=>u(null)}):null]});return T?(0,X.jsxs)(`div`,{className:$.sheetLayer,"data-presentation":t,children:[(0,X.jsx)(`button`,{type:`button`,className:$.scrim,"aria-label":`Close the dock`,tabIndex:-1,onClick:y}),re]}):re}function He({pane:e,visible:t,sessionId:n,roots:r,turnFiles:i,onSendToChat:a,onAddToMessage:o,renderTasks:s,renderContext:c,requests:l}){if(e===`tasks`)return(0,X.jsx)(X.Fragment,{children:s(t)});if(e===`context`)return(0,X.jsx)(X.Fragment,{children:c(t)});if(n===null){let t=Le(`chat.new`);return(0,X.jsx)(ye,{compact:!0,title:`Open a chat to use ${K[e]}`,body:`Pick a chat in the sidebar${t?` or start one with ${t}`:``}. ${K[e]} works in that chat's folders.`})}switch(e){case`terminal`:return(0,X.jsx)(be,{sessionId:n,roots:r,request:l.terminal,onSendToChat:a,visible:t});case`preview`:return(0,X.jsx)(Se,{sessionId:n,roots:r,request:l.preview,visible:t,onOpenTerminal:m});case`diff`:return(0,X.jsx)(xe,{sessionId:n,roots:r,request:l.diff,turnFiles:i,onAddToMessage:o,visible:t});default:return null}}function Ue({width:e,windowWidth:t}){let n=Math.max(g.minWidth,Math.floor(t*g.maxWidthFraction)),r=(0,J.useRef)(null),[i,a]=(0,J.useState)(!1);function o(t){t.button===0&&(t.preventDefault(),r.current={startX:t.clientX,startWidth:e},t.currentTarget.setPointerCapture?.(t.pointerId),a(!0),document.body.setAttribute(`data-verse-resizing`,`true`))}function s(e){let n=r.current;n&&x(p(n.startWidth+(n.startX-e.clientX),t))}function c(){r.current=null,a(!1),document.body.removeAttribute(`data-verse-resizing`)}(0,J.useEffect)(()=>()=>document.body.removeAttribute(`data-verse-resizing`),[]);function l(r){let i=r.shiftKey?ze:Re,a=null;r.key===`ArrowLeft`?a=e+i:r.key===`ArrowRight`?a=e-i:r.key===`Home`?a=g.minWidth:r.key===`End`&&(a=n),a!==null&&(r.preventDefault(),x(p(a,t)))}return(0,X.jsx)(`div`,{className:$.widthHandle,role:`separator`,"aria-orientation":`vertical`,"aria-label":`Resize the dock`,"aria-valuemin":g.minWidth,"aria-valuemax":n,"aria-valuenow":Math.round(e),tabIndex:0,"data-dragging":i||void 0,onPointerDown:o,onPointerMove:s,onPointerUp:c,onPointerCancel:c,onLostPointerCapture:c,onDoubleClick:()=>x(g.defaultWidth),onKeyDown:l})}function We({ratio:e,lower:t}){let n=(0,J.useRef)(null),r=(0,J.useRef)(null);function i(e){if(e.button!==0)return;let t=n.current?.parentElement;if(!t)return;e.preventDefault();let i=t.getBoundingClientRect();r.current={top:i.top,height:i.height},e.currentTarget.setPointerCapture?.(e.pointerId)}function a(e){let t=r.current;!t||t.height<=0||v((e.clientY-t.top)/t.height)}function o(t){t.key===`ArrowUp`?(t.preventDefault(),v(e-Be)):t.key===`ArrowDown`&&(t.preventDefault(),v(e+Be))}return(0,X.jsx)(`div`,{ref:n,className:$.splitHandle,role:`separator`,"aria-orientation":`horizontal`,"aria-label":`Resize: ${t} below`,"aria-valuemin":Math.round(g.splitRatio.min*100),"aria-valuemax":Math.round(g.splitRatio.max*100),"aria-valuenow":Math.round(e*100),tabIndex:0,style:{order:1},onPointerDown:i,onPointerMove:a,onPointerUp:()=>{r.current=null},onPointerCancel:()=>{r.current=null},onDoubleClick:()=>v(g.splitRatio.default),onKeyDown:o})}var Ge=20,Ke={running:`running`,done:`done`,failed:`failed`};function qe({turnTasks:e,otherChats:t,hasSession:n,onOpenSession:r}){let i=u(`chat.new`)?.keys[0],a=i?l(i):null,o=e.filter(e=>e.status===`running`),s=e.filter(e=>e.status!==`running`).slice(0,Ge);return(0,X.jsxs)(`div`,{className:Q.pane,"aria-label":`Tasks`,children:[(0,X.jsxs)(`section`,{className:Q.section,"aria-labelledby":`dock-tasks-turn`,children:[(0,X.jsxs)(`h3`,{id:`dock-tasks-turn`,className:Q.sectionTitle,children:[`This chat `,(0,X.jsx)(`span`,{className:Q.count,children:o.length>0?`${o.length} running`:``})]}),n?e.length===0?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(`p`,{className:Q.muted,children:`No tool calls in the latest turn.`}),(0,X.jsx)(`p`,{className:Q.hint,children:`Send a message: each tool the agent runs shows up here, and a click jumps to it in the chat.`})]}):(0,X.jsx)(`ul`,{className:Q.taskList,children:[...o,...s].map(e=>(0,X.jsx)(`li`,{children:(0,X.jsxs)(`button`,{type:`button`,className:Q.task,"data-status":e.status,onClick:()=>{Te(he(e.toolUseId))},"aria-label":`${e.kind===`subagent`?`Subagent`:e.name}: ${e.detail}, ${Ke[e.status]}. Jump to it in the chat.`,children:[(0,X.jsx)(`span`,{className:Q.taskMark,"data-status":e.status,"aria-hidden":`true`}),(0,X.jsx)(`span`,{className:Q.taskName,title:e.kind===`subagent`?`Subagent`:e.name,children:e.kind===`subagent`?`Subagent`:e.name}),(0,X.jsx)(`span`,{className:Q.taskDetail,title:e.detail,children:e.detail}),(0,X.jsx)(`span`,{className:Q.taskTime,children:e.status===`running`?(0,X.jsx)(B,{since:e.startedAt}):e.status===`failed`?`failed`:e.durationMs!==null&&e.durationMs>0?w(e.durationMs):`done`})]})},e.toolUseId))}):(0,X.jsx)(`p`,{className:Q.muted,children:`Open a chat to see its tool calls here.`})]}),(0,X.jsxs)(`section`,{className:Q.section,"aria-labelledby":`dock-tasks-chats`,children:[(0,X.jsxs)(`h3`,{id:`dock-tasks-chats`,className:Q.sectionTitle,children:[`Other chats `,(0,X.jsx)(`span`,{className:Q.count,children:t.length>0?`${t.length} running`:``})]}),t.length===0?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(`p`,{className:Q.muted,children:`No other chat is running.`}),(0,X.jsxs)(`p`,{className:Q.hint,children:[a?`Start another with ${a}`:`Start another chat`,` and it shows here while it works, one click away.`]})]}):(0,X.jsx)(`ul`,{className:Q.taskList,children:t.map(e=>(0,X.jsx)(`li`,{children:(0,X.jsxs)(`button`,{type:`button`,className:Q.task,"data-status":`running`,onClick:()=>r(e.sessionId),"aria-label":`${e.title||`Untitled chat`}, running${e.live?`: ${e.live}`:``}. Open this chat.`,children:[(0,X.jsx)(Je,{engine:e.engine}),(0,X.jsx)(`span`,{className:Q.taskName,title:e.title||`Untitled chat`,children:e.title||`Untitled chat`}),(0,X.jsx)(`span`,{className:Q.taskDetail,title:e.live??void 0,children:e.live??``}),(0,X.jsx)(`span`,{className:Q.taskTime,children:e.startedAt?(0,X.jsx)(B,{since:e.startedAt}):`running`})]})},e.sessionId))})]})]})}function Je({engine:e}){return(0,X.jsx)(`span`,{className:Q.engineTick,"data-engine":e,"aria-hidden":`true`,children:(0,X.jsx)(c,{engine:e,size:12})})}function Ye(e){let{session:t,seats:n,events:r,rootsData:i,rootsError:a,otherRunning:o,dispatchEnabled:s,onOpenSession:c,onHandoff:l,onOpenAccounts:u}=e,d=s?t?.status===`running`?`Available when the current turn finishes.`:null:`Sending is disabled on this server.`;return(0,X.jsx)(Ve,{presentation:e.presentation,windowWidth:e.windowWidth,columnWidth:e.columnWidth,sessionId:t?.id??null,roots:e.roots,turnFiles:e.turnFiles,onSendToChat:e.onSendToChat,onAddToMessage:e.onAddToMessage,renderTasks:()=>(0,X.jsx)(Xe,{sessionId:t?.id??null,otherChats:o,onOpenSession:c}),renderContext:e=>(0,X.jsx)(Ie,{session:t,seats:n,events:r,roots:i,rootsError:a,visible:e,onHandoff:t?()=>l(t.id):void 0,handoffDisabledReason:d,onOpenAccounts:u})})}function Xe({sessionId:e,otherChats:t,onOpenSession:n}){let r=Ce(e),i=(0,J.useMemo)(()=>U(r.items),[r.items]);return(0,X.jsx)(qe,{turnTasks:i,otherChats:t,hasSession:e!==null,onOpenSession:n})}export{Ye as DockHost};
2
- //# sourceMappingURL=DockHost-C0Pq7Jak.js.map
1
+ import{a as e,n as t,s as n}from"./index-BVxOlseC.js";import{h as r,i,o as a,p as o}from"./global-oEl9Qj8u.js";import{t as s}from"./MutationTokenDialog-mxrw0Yvy.js";import{t as c}from"./ProviderLogo-C5mBg8i0.js";import{c as l,s as u}from"./command-catalog-Bb_PxC5w.js";import{_ as d,a as f,b as p,c as m,d as h,g,h as _,l as v,n as y,r as b,u as x}from"./dock-store-B2vlxqPu.js";import{T as S,g as C,o as w,s as T}from"./verse-model-DyCwZF-M.js";import{C as ee,c as E,r as D}from"./verse-store-b_Lek_c5.js";import{f as O}from"./format-BkWdOQDL.js";import{a as te,c as k,d as A,l as ne,u as re}from"./context-queries-CrPcHWTz.js";import{T as ie,f as j,t as ae,v as M,w as oe}from"./context-model-CIBmSugV.js";import{_ as se,a as ce,i as le,l as N,m as ue,n as de,r as fe,v as P,w as pe,x as me}from"./context-model-BC-HOmPo.js";import{d as F,p as I,u as L}from"./workspace-model-CbhdPhei.js";import{n as R,t as z}from"./ActionMenu-FxXeRbPx.js";import{s as he}from"./tool-semantics-GX8ScuSH.js";import{d as B,h as ge,i as V,l as _e,n as H}from"./dock-icons-CUh8dOxJ.js";import{currentTurnTasks as U}from"./tasks-model-BKDNqmmt.js";import{n as ve,t as W}from"./use-token-gate-DqrSXdX6.js";import{t as ye}from"./EmptyState-BqR5YAmf.js";import{a as be,n as xe,r as Se}from"./slots-BhP8b8tf.js";import{i as G,r as K,t as Ce}from"./useVerseTranscript-CDYrrWOO.js";import{t as we}from"./Switch-iveI-8NY.js";import{t as q}from"./context.module-BijAfoJw.js";import{s as Te}from"./ChatSection-DZuZfTaC.js";var J=n(e(),1),Y={usage:`_usage_1xfeo_5`,muted:`_muted_1xfeo_21`,subTitle:`_subTitle_1xfeo_23`,idleWarn:`_idleWarn_1xfeo_35`},X=t();function Ee({session:e,seats:t,events:n,now:r}){let i=e.usage,a=oe(e,t),o=ie(n??[]),s=i.inputTokens+i.cacheReadTokens+i.cacheCreationTokens,c=M(i),l=e.compactionCount??o.compactions,u=j(e,a.tokens,r,E(n??[])),d=a.exact?``:`≤`,f=o.exact?``:`≤`;return(0,X.jsxs)(X.Fragment,{children:[(0,X.jsxs)(`dl`,{className:Y.usage,children:[(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Input`}),(0,X.jsx)(`dd`,{children:D(i.inputTokens)})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Output`}),(0,X.jsx)(`dd`,{children:D(i.outputTokens)})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Cache read`}),(0,X.jsx)(`dd`,{children:D(i.cacheReadTokens)})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Cache write`}),(0,X.jsx)(`dd`,{children:D(i.cacheCreationTokens)})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Turns`}),(0,X.jsx)(`dd`,{children:e.turnCount})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Context`}),(0,X.jsxs)(`dd`,{title:a.exact?void 0:`An upper bound: the CLI reported only the turn total, which sums every call.`,children:[d,D(a.tokens),a.window===null?``:` / ${D(a.window)}`]})]})]}),(0,X.jsx)(`h4`,{className:Y.subTitle,children:`Efficiency`}),(0,X.jsxs)(`dl`,{className:Y.usage,"aria-label":`Context efficiency`,children:[(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Cache hit`}),(0,X.jsx)(`dd`,{title:`Share of prompt tokens served from the provider's cache: cache read ÷ (input + cache read + cache write).`,children:c===null?s>0?`none reported`:`—`:O(c)})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Compactions`}),(0,X.jsx)(`dd`,{children:l})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Avg context / turn`}),(0,X.jsx)(`dd`,{children:o.average===null?`—`:`${f}${D(o.average)}`})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Peak context`}),(0,X.jsx)(`dd`,{children:o.peak===null?`—`:`${f}${D(o.peak)}`})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Mode`}),(0,X.jsx)(`dd`,{children:ae[a.mode]})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Compacts at`}),(0,X.jsx)(`dd`,{children:a.autoCompactAt===null?`—`:`≈${D(a.autoCompactAt)}`})]})]}),(0,X.jsxs)(`p`,{className:Y.muted,children:[a.source===null?a.window===null?`Window unknown for this chat.`:`Window as stored when this chat was created; how it was known was not recorded.`:`Window ${S(a.source,e.engine)}.`,o.turns>0&&!o.exact?` Figures marked ≤ are upper bounds: the CLI reported only turn totals.`:``]}),(0,X.jsx)(`p`,{className:Y.muted,children:e.memoryEnabled===!0?e.engine===`local`?`Shared project memory was given to this chat’s agent when it started.`:`Shared project memory was given to this chat’s agent when it started: a block of up to ${de/1024} KB in its system prompt, re-sent every turn (cached after the first), plus the agent’s own reads and updates of MEMORY.md — a little of this seat’s usage.`:`This chat started without shared project memory.`}),u===null?null:(0,X.jsx)(`p`,{role:`status`,className:Y.idleWarn,children:u.local?`Idle for ${T(u.idleMs)}: the local model has likely dropped this chat from its cache, so the next turn re-processes ~${D(u.tokens)} tokens before it replies — time, not spend.`:`Idle for ${T(u.idleMs)}, past the ~1 h prompt-cache lifetime: the next turn likely re-reads ~${D(u.tokens)} tokens uncached, at full price.`})]})}function De({projectPath:e,refreshKey:t}){let n=(0,J.useId)();return e?(0,X.jsx)(Me,{projectPath:e,refreshKey:t},e):(0,X.jsxs)(`section`,{className:q.memory,"aria-labelledby":n,children:[(0,X.jsx)(`h3`,{id:n,className:q.memoryHead,children:`Project memory`}),(0,X.jsx)(`p`,{className:q.hint,children:`Open a chat to see the memory its project shares across seats.`})]})}var Oe=`Saving writes MEMORY.md for this project. Every seat on it reads this file.`,ke=`Clearing empties MEMORY.md for every chat on this project.`,Ae=`This changes whether new chats on this project are given shared memory.`,je=`This changes whether new chats on ANY project are given shared memory.`;function Me({projectPath:e,refreshKey:t}){let n=(0,J.useId)(),c=(0,J.useId)(),l=(0,J.useId)(),u=(0,J.useMemo)(()=>re(e),[e]),d=o(u),f=r(u),p=o(ne),m=ve(),h=C(e),[g,_]=(0,J.useState)(`view`),[v,y]=(0,J.useState)(``),[b,x]=(0,J.useState)(``),[S,w]=(0,J.useState)(!1),[T,E]=(0,J.useState)(null),[D,O]=(0,J.useState)(null),[ie,j]=(0,J.useState)(null),[ae,M]=(0,J.useState)(null),oe=(0,J.useRef)(null),de=(0,J.useRef)(t);(0,J.useEffect)(()=>{t!==de.current&&(de.current=t,f())},[t,f]),(0,J.useEffect)(()=>{let e=oe.current;g===`edit`&&e&&(e.focus(),e.setSelectionRange(e.value.length,e.value.length))},[g]);let[F,I]=(0,J.useState)(null);(0,J.useEffect)(()=>{F!==null&&d.status===`success`&&I(null)},[F,d.status]);let L=F!==null&&d.status!==`success`?F:d.data,R=d.error instanceof a&&d.error.status===404,z=p.data?!p.data.memory.enabled:!1,he=(0,J.useMemo)(()=>pe(v),[v]),B=he>ee,ge=(0,J.useMemo)(()=>ue({projectPath:e,content:v}),[e,v]),V=!B&&ge>fe,_e=g===`edit`?me(v):null,H=g===`edit`&&S?se(v):0;function U(e,t){y(e),x(e),w(t),E(null),j(null),M(null),_(`edit`)}async function ye(t=!1){if(!D){O(`saving`),j(null);try{let n=await te(e);if(!t&&n.content!==b){E(n);return}let r=await m.run(Oe,()=>A(e,v));if(r===null)return;I(r),E(null),_(`view`),M(r.content.length===0?`Saved — MEMORY.md is now empty.`:`Saved.`)}catch(e){j(W(e))}finally{O(null)}}}async function be(){if(!D){O(`clearing`),j(null);try{let t=await m.run(ke,()=>A(e,``));if(t===null)return;I(t),_(`view`),M(`Cleared. Agents start MEMORY.md afresh on their next write.`)}catch(e){j(W(e))}finally{O(null)}}}async function xe(t){if(!D){O(`toggling`),j(null),M(null);try{await m.run(Ae,()=>k({projectPath:e,memoryEnabled:t}))!==null&&M(t?`New chats on ${h} will get shared memory. Chats already open keep what they started with.`:`New chats on ${h} will start without shared memory. The file is kept.`)}catch(e){j(W(e))}finally{O(null)}}}async function Se(e){if(!D){O(`toggling`),j(null),M(null);try{await m.run(je,()=>k({memoryEnabled:e}))}catch(e){j(W(e))}finally{O(null)}}}let G=L?z?`off everywhere`:L.enabled?`on`:`off`:null;return(0,X.jsxs)(`section`,{className:q.memory,"aria-labelledby":n,"data-project":e,children:[(0,X.jsxs)(`h3`,{id:n,className:q.memoryHead,children:[(0,X.jsx)(`span`,{children:`Project memory`}),G?(0,X.jsx)(`span`,{className:q.memoryState,children:G}):null,R?null:(0,X.jsx)(`button`,{type:`button`,className:q.memoryHeadAction,onClick:f,"aria-label":`Refresh project memory`,children:`Refresh`})]}),(0,X.jsxs)(`p`,{className:q.hint,children:[`One `,(0,X.jsx)(`code`,{children:`MEMORY.md`}),` shared by every chat on `,(0,X.jsx)(`strong`,{title:e,children:h}),`, whichever seat runs it. Agents keep it current — decisions and why, conventions, gotchas, plan status.`]}),R?(0,X.jsxs)(`p`,{className:q.hint,children:[`This server has no project memory yet — update Ashlr and restart `,(0,X.jsx)(`code`,{children:`ashlr verse`}),`.`]}):d.status===`loading`||d.status===`idle`&&!L?(0,X.jsxs)(`div`,{"aria-busy":`true`,children:[(0,X.jsx)(i,{width:`80%`}),(0,X.jsx)(i,{width:`60%`}),(0,X.jsx)(i,{width:`70%`})]}):L?(0,X.jsxs)(X.Fragment,{children:[z?(0,X.jsxs)(`div`,{className:q.field,children:[(0,X.jsx)(`p`,{className:q.hint,children:`Shared memory is off for every project, so new chats start without it.`}),(0,X.jsx)(`div`,{className:q.memoryActions,children:(0,X.jsx)(`button`,{type:`button`,className:`${q.secondary} ${q.small}`,disabled:D!==null,onClick:()=>void Se(!0),children:`Turn memory on`})})]}):(0,X.jsx)(we,{checked:L.enabled,disabled:D!==null||!p.data,onChange:e=>void xe(e),label:`Give new chats on ${h} this memory`}),g===`edit`?(0,X.jsxs)(`div`,{className:q.field,children:[(0,X.jsx)(`label`,{className:q.label,htmlFor:c,children:`Edit MEMORY.md`}),(0,X.jsx)(`textarea`,{id:c,ref:oe,className:q.textarea,value:v,rows:12,spellCheck:!1,"aria-describedby":l,"aria-invalid":B||V?!0:void 0,onChange:e=>y(e.target.value)}),(0,X.jsxs)(`p`,{id:l,className:`${q.hint} ${q.counter} ${B||V?q.counterOver:``}`,children:[N(he),` of `,N(ee),B?` — over the limit; trim it to save.`:``,V?` — ${N(ge)} once line breaks and quotes are encoded for sending, over the ${N(fe)} request limit; trim it to save.`:``]}),_e?(0,X.jsxs)(`p`,{className:q.warn,role:`alert`,children:[`This looks like it contains `,_e,`. MEMORY.md is sent to every seat’s model — remove it before saving.`]}):null,H>0?(0,X.jsxs)(`p`,{className:q.warn,role:`alert`,children:[H===1?`One`:H,` `,(0,X.jsx)(`code`,{children:ce}),` placeholder`,H===1?` stands`:`s stand`,` in for secret-looking text that is still in MEMORY.md. Saving `,H===1?`it`:`them`,` would replace the real value`,H===1?``:`s`,`, so Save stays off until `,H===1?`it is`:`they are`,` gone. Deleting a placeholder drops that value from the file; to keep it, edit MEMORY.md directly under `,(0,X.jsx)(`code`,{children:`~/.ashlr/verse/memory`}),`.`]}):S?(0,X.jsxs)(`p`,{className:q.hint,children:[`This copy was sanitized for the browser, so a home-folder path appears as `,(0,X.jsx)(`code`,{children:`~`}),`. Saving writes the text as shown; `,(0,X.jsx)(`code`,{children:`~`}),` names the same folder for every reader.`]}):null,T?(0,X.jsxs)(`div`,{className:q.warn,role:`alert`,children:[(0,X.jsxs)(`p`,{className:q.hint,children:[`An agent changed MEMORY.md while you were editing`,P(T.updatedAt)?` (${P(T.updatedAt)})`:``,`.`]}),(0,X.jsxs)(`div`,{className:q.memoryActions,children:[(0,X.jsx)(`button`,{type:`button`,className:`${q.secondary} ${q.small}`,disabled:D!==null||H>0,onClick:()=>void ye(!0),children:`Overwrite with mine`}),(0,X.jsx)(`button`,{type:`button`,className:`${q.cancel} ${q.small}`,disabled:D!==null,onClick:()=>U(T.content,T.contentSanitized===!0),children:`Start over from theirs`})]})]}):null,(0,X.jsxs)(`div`,{className:q.memoryActions,children:[(0,X.jsx)(`button`,{type:`button`,className:`${q.primary} ${q.small}`,disabled:D!==null||B||V||v===b||T!==null||H>0,onClick:()=>void ye(!1),children:D===`saving`?`Saving…`:`Save`}),(0,X.jsx)(`button`,{type:`button`,className:`${q.cancel} ${q.small}`,disabled:D===`saving`,onClick:()=>{_(`view`),E(null),j(null)},children:`Cancel`})]})]}):L.content.length===0?(0,X.jsxs)(`div`,{className:q.field,children:[(0,X.jsx)(`p`,{className:q.hint,children:`MEMORY.md is empty. Agents add to it as they work, or write the first entries yourself.`}),(0,X.jsx)(`div`,{className:q.memoryActions,children:(0,X.jsx)(`button`,{type:`button`,className:`${q.secondary} ${q.small}`,onClick:()=>U(``,!1),children:`Write it`})})]}):(0,X.jsxs)(`div`,{className:q.field,children:[(0,X.jsx)(`pre`,{className:q.memoryBody,tabIndex:0,"aria-label":`MEMORY.md for ${h}`,children:L.content}),(0,X.jsxs)(`p`,{className:`${q.hint} ${q.memoryMeta}`,children:[(0,X.jsx)(`span`,{children:N(L.bytes)}),P(L.updatedAt)?(0,X.jsxs)(`span`,{children:[`updated `,P(L.updatedAt)]}):null]}),L.contentSanitized?(0,X.jsxs)(`p`,{className:q.hint,children:[`Shown sanitized for the browser: a home-folder path appears as `,(0,X.jsx)(`code`,{children:`~`}),` and secret-looking text as`,` `,(0,X.jsx)(`code`,{children:ce}),`.`,se(L.content)>0?` The real values are still in the file.`:``]}):null,g===`confirm-clear`?(0,X.jsxs)(`div`,{className:q.warn,role:`alert`,children:[(0,X.jsxs)(`p`,{className:q.hint,children:[`Clear MEMORY.md for `,h,`? Every chat on this project loses what it says. Other files in the folder stay.`]}),(0,X.jsxs)(`div`,{className:q.memoryActions,children:[(0,X.jsx)(`button`,{type:`button`,className:`${q.secondary} ${q.small} ${q.danger}`,disabled:D!==null,onClick:()=>void be(),children:D===`clearing`?`Clearing…`:`Clear it`}),(0,X.jsx)(`button`,{type:`button`,className:`${q.cancel} ${q.small}`,onClick:()=>_(`view`),children:`Keep`})]})]}):(0,X.jsxs)(`div`,{className:q.memoryActions,children:[(0,X.jsx)(`button`,{type:`button`,className:`${q.secondary} ${q.small}`,onClick:()=>U(L.content,L.contentSanitized===!0),children:`Edit`}),(0,X.jsx)(`button`,{type:`button`,className:`${q.cancel} ${q.small}`,onClick:()=>{M(null),_(`confirm-clear`)},children:`Clear…`})]})]}),L.files.length>0?(0,X.jsxs)(`div`,{className:q.field,children:[(0,X.jsx)(`span`,{className:q.label,children:`Also in this folder`}),(0,X.jsx)(`ul`,{className:q.memoryFiles,children:L.files.map(e=>(0,X.jsx)(`li`,{children:(0,X.jsx)(`code`,{children:e})},e))})]}):null,ae?(0,X.jsx)(`p`,{className:q.hint,role:`status`,children:ae}):null,ie?(0,X.jsx)(`p`,{className:q.error,role:`alert`,children:ie}):null,(0,X.jsxs)(`details`,{children:[(0,X.jsx)(`summary`,{className:q.hint,children:`How project memory works`}),(0,X.jsxs)(`div`,{className:q.field,children:[(0,X.jsx)(`p`,{className:q.hint,children:`Claude, Codex and local seats can read and edit the file. Grok’s CLI can reach only its working folder, so a Grok seat is given the text and can only read it.`}),(0,X.jsx)(`p`,{className:q.hint,children:`A chat copies the memory into its instructions when it starts, so every turn re-sends the same prefix and the provider’s prompt cache keeps working. Chats already open see your edits when they next read the file; the switch above applies to new chats.`}),(0,X.jsxs)(`p`,{className:q.hint,children:[`It lives on this machine under `,(0,X.jsx)(`code`,{children:`~/.ashlr/verse/memory`}),`, readable only by you. It is sent to every seat’s model, so never put secrets in it.`]}),(0,X.jsx)(`p`,{className:q.hint,children:le}),z?null:(0,X.jsxs)(`p`,{className:q.hint,children:[`Memory is on for every project unless switched off per project.`,` `,(0,X.jsx)(`button`,{type:`button`,className:q.link,disabled:D!==null,onClick:()=>void Se(!1),children:`Turn it off for every project`})]})]})]})]}):(0,X.jsxs)(`div`,{className:q.searchError,role:`alert`,children:[(0,X.jsxs)(`span`,{children:[`Could not read this project’s memory: `,W(d.error)]}),(0,X.jsx)(`button`,{type:`button`,className:`${q.secondary} ${q.small}`,onClick:f,children:`Retry`})]}),(0,X.jsx)(s,{open:m.dialog.open,reason:m.dialog.reason,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`,onClose:m.dialog.onClose,onUnlocked:m.dialog.onUnlocked})]})}var Z={roots:`_roots_afeac_8`,title:`_title_afeac_10`,count:`_count_afeac_22`,workspace:`_workspace_afeac_30`,list:`_list_afeac_36`,root:`_root_afeac_8`,rootHead:`_rootHead_afeac_57`,name:`_name_afeac_64`,badge:`_badge_afeac_72`,path:`_path_afeac_84`,git:`_git_afeac_97`,remote:`_remote_afeac_98`,caveat:`_caveat_afeac_99`,note:`_note_afeac_116`,error:`_error_afeac_117`};function Ne({session:e,data:t,error:n=null}){return!e||t!==null&&t.roots.length<=1&&t.workspaceId===null?null:(0,X.jsxs)(`section`,{className:Z.roots,"aria-labelledby":`verse-res-roots`,children:[(0,X.jsxs)(`h3`,{id:`verse-res-roots`,className:Z.title,children:[`Folders`,t?(0,X.jsx)(`span`,{className:Z.count,children:t.roots.length}):null]}),t?.workspaceName?(0,X.jsxs)(`p`,{className:Z.workspace,children:[`Workspace `,(0,X.jsx)(`strong`,{children:t.workspaceName})]}):null,n?(0,X.jsx)(`p`,{role:`alert`,className:Z.error,children:n}):null,(0,X.jsx)(`ul`,{className:Z.list,children:(t?.roots??[]).map(e=>{let t=F(e),n=L(e);return(0,X.jsxs)(`li`,{className:Z.root,"data-tone":I(e),children:[(0,X.jsxs)(`div`,{className:Z.rootHead,children:[(0,X.jsx)(`span`,{className:Z.name,children:e.name}),(0,X.jsx)(`span`,{className:Z.badge,children:e.primary?`primary`:`added`})]}),(0,X.jsx)(`p`,{className:Z.path,title:e.path,children:ge(e.path)}),(0,X.jsx)(`p`,{className:Z.git,children:t??`not a git repo`}),e.git?.remote?(0,X.jsx)(`p`,{className:Z.remote,children:e.git.remote}):null,n?(0,X.jsx)(`p`,{className:Z.caveat,children:n}):null]},e.path)})}),(t?.notes??[]).map(e=>(0,X.jsx)(`p`,{className:Z.note,children:e},e))]})}var Q={pane:`_pane_1f7em_6`,section:`_section_1f7em_13`,sectionTitle:`_sectionTitle_1f7em_19`,count:`_count_1f7em_31`,muted:`_muted_1f7em_37`,action:`_action_1f7em_43`,hint:`_hint_1f7em_46`,reserve:`_reserve_1f7em_54`,link:`_link_1f7em_73`,task:`_task_1f7em_74`,taskList:`_taskList_1f7em_88`,taskMark:`_taskMark_1f7em_113`,"pane-pulse":`_pane-pulse_1f7em_1`,taskName:`_taskName_1f7em_125`,taskDetail:`_taskDetail_1f7em_134`,taskTime:`_taskTime_1f7em_142`,engineTick:`_engineTick_1f7em_152`},Pe=3e4;function Fe(e){let[t,n]=(0,J.useState)(()=>Date.now());return(0,J.useEffect)(()=>{if(!e)return;n(Date.now());let t=setInterval(()=>n(Date.now()),Pe);return()=>clearInterval(t)},[e]),t}function Ie({session:e,seats:t,events:n,roots:r,rootsError:i,onHandoff:a,handoffDisabledReason:o=null,onOpenAccounts:s,visible:c}){let l=Fe(c&&e!==null);return(0,X.jsxs)(`div`,{className:Q.pane,"aria-label":`Context`,children:[(0,X.jsxs)(`section`,{className:Q.section,"aria-labelledby":`dock-context-chat`,children:[(0,X.jsx)(`h3`,{id:`dock-context-chat`,className:Q.sectionTitle,children:`This chat`}),e?(0,X.jsx)(Ee,{session:e,seats:t,events:n,now:l}):(0,X.jsx)(`p`,{className:Q.muted,children:`Open a chat to see its usage and context.`})]}),e?(0,X.jsx)(`div`,{className:Q.section,children:(0,X.jsx)(Ne,{session:e,data:r,error:i})}):null,e&&a?(0,X.jsxs)(`section`,{className:Q.section,"aria-labelledby":`dock-context-handoff`,children:[(0,X.jsx)(`h3`,{id:`dock-context-handoff`,className:Q.sectionTitle,children:`Handoff`}),(0,X.jsx)(`p`,{className:Q.muted,children:`Verse drafts a note from this chat's log — free — and opens a fresh chat with it in the message box. Nothing is sent until you press Send.`}),(0,X.jsx)(`button`,{type:`button`,className:Q.action,onClick:a,disabled:o!==null,title:o??void 0,children:`Continue in a fresh chat…`}),(0,X.jsx)(`p`,{className:`${Q.muted} ${Q.reserve}`,children:o??``})]}):null,(0,X.jsx)(`div`,{className:Q.section,children:(0,X.jsx)(De,{projectPath:e?.projectPath??null,refreshKey:e?.turnCount??0})}),(0,X.jsx)(`div`,{className:Q.section,children:(0,X.jsx)(`button`,{type:`button`,className:Q.link,onClick:s,children:`Accounts & capacity →`})})]})}var $={dock:`_dock_10ssf_8`,sheetLayer:`_sheetLayer_10ssf_25`,scrim:`_scrim_10ssf_37`,"dock-fade":`_dock-fade_10ssf_1`,"dock-in-right":`_dock-in-right_10ssf_1`,"dock-in-up":`_dock-in-up_10ssf_1`,grabber:`_grabber_10ssf_64`,head:`_head_10ssf_75`,tabs:`_tabs_10ssf_86`,tabWrap:`_tabWrap_10ssf_97`,tab:`_tab_10ssf_86`,tabClose:`_tabClose_10ssf_135`,headActions:`_headActions_10ssf_156`,iconButton:`_iconButton_10ssf_162`,plus:`_plus_10ssf_179`,body:`_body_10ssf_185`,pane:`_pane_10ssf_191`,splitHandle:`_splitHandle_10ssf_200`,widthHandle:`_widthHandle_10ssf_220`};function Le(e){let t=u(e)?.keys[0];return t?l(t):null}var Re=16,ze=64,Be=.05;function Ve(e){let{presentation:t,windowWidth:n,columnWidth:r}=e,{state:i,requests:a}=_(),o=(0,J.useRef)(null),s=(0,J.useRef)(new Map),c=(0,J.useId)(),[l,u]=(0,J.useState)(null),[m,v]=(0,J.useState)(()=>new Set(i.open&&i.active?[i.active]:[])),x=i.tabs.filter(G),S=i.active!==null&&x.includes(i.active)?i.active:x[0]??null,C=i.splitWith!==null&&x.includes(i.splitWith)&&i.splitWith!==S?i.splitWith:null,w=i.open&&S!==null,T=t!==`column`;(0,J.useEffect)(()=>{w&&v(e=>{let t=[S,C].filter(e=>e!==null),n=new Set([...e].filter(e=>x.includes(e)));for(let e of t)n.add(e);return n.size===e.size&&[...n].every(t=>e.has(t))?e:n})},[w,S,C,x.join(`|`)]),(0,J.useEffect)(()=>{if(!w||!T)return;let e=document.activeElement;return o.current?.focus({preventScroll:!0}),()=>{e&&document.contains(e)&&e.focus({preventScroll:!0})}},[w,T]);let ee=(0,J.useCallback)(e=>{if(!T)return;let t=e.target instanceof Element&&e.target.closest(`[data-dock-pane="terminal"]`)!==null;if(e.key===`Escape`&&!t&&!e.defaultPrevented){e.preventDefault(),y();return}if(e.key!==`Tab`||t)return;let n=o.current;if(!n)return;let r=Array.from(n.querySelectorAll(`button:not([disabled]), [href], input:not([disabled]), select, textarea, [tabindex]:not([tabindex="-1"])`)).filter(e=>!e.closest(`[hidden]`));if(r.length===0)return;let i=r[0],a=r[r.length-1];e.shiftKey&&document.activeElement===i?(e.preventDefault(),a.focus()):!e.shiftKey&&document.activeElement===a&&(e.preventDefault(),i.focus())},[T]);if(!w)return null;function E(e,t){let n=x.indexOf(t),r;if(e.key===`ArrowRight`)r=x[(n+1)%x.length];else if(e.key===`ArrowLeft`)r=x[(n-1+x.length)%x.length];else if(e.key===`Home`)r=x[0];else if(e.key===`End`)r=x[x.length-1];else if((e.key===`Delete`||e.key===`Backspace`)&&x.length>0){e.preventDefault(),b(t);return}r&&(e.preventDefault(),f(r),s.current.get(r)?.focus())}let D=d.map(e=>e.id).filter(e=>G(e)&&!x.includes(e)),O=D.map(e=>({id:e,label:K[e],icon:V[e]({}),onSelect:()=>f(e)})),te=[...d.map(e=>e.id).filter(e=>G(e)&&e!==S).map(e=>({id:e,label:`${K[e]} below`,icon:V[e]({}),onSelect:()=>h(e)})),...C?[{id:`unsplit`,label:`One pane`,separated:!0,onSelect:()=>h(null)}]:[]],k=Le(`dock.toggle`),A=t===`column`?r:p(i.width,n),ne=`Dock: ${K[S]}${C?` over ${K[C]}`:``}`,re=(0,X.jsxs)(`aside`,{ref:o,className:$.dock,"data-presentation":t,"data-split":C?`true`:void 0,"aria-label":ne,role:T?`dialog`:`complementary`,"aria-modal":T?!0:void 0,tabIndex:-1,style:t===`bottom-sheet`?{height:`${g.bottomSheetHeightVh}vh`}:{width:A},onKeyDown:ee,children:[t===`column`?(0,X.jsx)(Ue,{width:A,windowWidth:n}):null,t===`bottom-sheet`?(0,X.jsx)(`span`,{className:$.grabber,"aria-hidden":`true`}):null,(0,X.jsxs)(`div`,{className:$.head,children:[(0,X.jsx)(`div`,{className:$.tabs,role:`tablist`,"aria-label":`Dock panes`,children:x.map(e=>{let t=V[e],n=e===S,r=e===C;return(0,X.jsxs)(`div`,{className:$.tabWrap,"data-selected":n||void 0,"data-below":r||void 0,children:[(0,X.jsxs)(`button`,{ref:t=>{t?s.current.set(e,t):s.current.delete(e)},type:`button`,role:`tab`,id:`${c}-tab-${e}`,"aria-selected":n,"aria-controls":`${c}-pane-${e}`,tabIndex:n?0:-1,className:$.tab,onClick:()=>f(e),onKeyDown:t=>E(t,e),title:r?`${K[e]} (lower pane)`:void 0,children:[(0,X.jsx)(t,{size:14}),(0,X.jsx)(`span`,{className:$.tabLabel,children:K[e]})]}),(0,X.jsx)(`button`,{type:`button`,className:$.tabClose,"aria-label":`Close ${K[e]}`,title:`Close ${K[e]}`,tabIndex:-1,onClick:()=>b(e),children:(0,X.jsx)(H,{size:12})})]},e)})}),(0,X.jsxs)(`div`,{className:$.headActions,children:[(0,X.jsx)(`button`,{type:`button`,className:$.iconButton,"aria-label":`Add a pane`,title:D.length>0?`Add a pane`:`Every pane is already open`,"aria-haspopup":`menu`,"aria-expanded":l?.kind===`add`,disabled:D.length===0,onClick:e=>u({kind:`add`,anchor:R(e.currentTarget),from:e.currentTarget}),children:(0,X.jsx)(`span`,{className:$.plus,"aria-hidden":`true`,children:`+`})}),t!==`bottom-sheet`&&te.length>0?(0,X.jsx)(`button`,{type:`button`,className:$.iconButton,"aria-label":C?`Split: change or undo`:`Split the dock`,title:C?`Change the split`:`Split: show a second pane below`,"aria-haspopup":`menu`,"aria-expanded":l?.kind===`split`,"aria-pressed":C!==null,onClick:e=>u({kind:`split`,anchor:R(e.currentTarget),from:e.currentTarget}),children:(0,X.jsx)(_e,{size:14})}):null,(0,X.jsx)(`button`,{type:`button`,className:$.iconButton,"aria-label":`Close the dock`,title:`Close the dock${k?` (${k})`:``}`,onClick:y,children:(0,X.jsx)(H,{size:14})})]})]}),(0,X.jsxs)(`div`,{className:$.body,children:[x.filter(e=>m.has(e)||e===S||e===C).map(n=>{let r=n===S||n===C&&t!==`bottom-sheet`,o=n===S?`top`:n===C?`bottom`:`hidden`;return(0,X.jsx)(`div`,{id:`${c}-pane-${n}`,role:`tabpanel`,"aria-labelledby":`${c}-tab-${n}`,className:$.pane,"data-dock-pane":n,"data-position":r?o:`hidden`,hidden:!r,inert:!r,style:r&&C&&t!==`bottom-sheet`?{flexBasis:`${(o===`top`?i.splitRatio:1-i.splitRatio)*100}%`,order:o===`top`?0:2}:void 0,children:(0,X.jsx)(He,{pane:n,visible:r,...e,requests:a})},n)}),C&&t!==`bottom-sheet`?(0,X.jsx)(We,{ratio:i.splitRatio,lower:K[C]}):null]}),l?(0,X.jsx)(z,{label:l.kind===`add`?`Add a pane`:`Split the dock`,items:l.kind===`add`?O:te,anchor:l.anchor,returnFocus:l.from,onClose:()=>u(null)}):null]});return T?(0,X.jsxs)(`div`,{className:$.sheetLayer,"data-presentation":t,children:[(0,X.jsx)(`button`,{type:`button`,className:$.scrim,"aria-label":`Close the dock`,tabIndex:-1,onClick:y}),re]}):re}function He({pane:e,visible:t,sessionId:n,roots:r,turnFiles:i,onSendToChat:a,onAddToMessage:o,renderTasks:s,renderContext:c,requests:l}){if(e===`tasks`)return(0,X.jsx)(X.Fragment,{children:s(t)});if(e===`context`)return(0,X.jsx)(X.Fragment,{children:c(t)});if(n===null){let t=Le(`chat.new`);return(0,X.jsx)(ye,{compact:!0,title:`Open a chat to use ${K[e]}`,body:`Pick a chat in the sidebar${t?` or start one with ${t}`:``}. ${K[e]} works in that chat's folders.`})}switch(e){case`terminal`:return(0,X.jsx)(be,{sessionId:n,roots:r,request:l.terminal,onSendToChat:a,visible:t});case`preview`:return(0,X.jsx)(Se,{sessionId:n,roots:r,request:l.preview,visible:t,onOpenTerminal:m});case`diff`:return(0,X.jsx)(xe,{sessionId:n,roots:r,request:l.diff,turnFiles:i,onAddToMessage:o,visible:t});default:return null}}function Ue({width:e,windowWidth:t}){let n=Math.max(g.minWidth,Math.floor(t*g.maxWidthFraction)),r=(0,J.useRef)(null),[i,a]=(0,J.useState)(!1);function o(t){t.button===0&&(t.preventDefault(),r.current={startX:t.clientX,startWidth:e},t.currentTarget.setPointerCapture?.(t.pointerId),a(!0),document.body.setAttribute(`data-verse-resizing`,`true`))}function s(e){let n=r.current;n&&x(p(n.startWidth+(n.startX-e.clientX),t))}function c(){r.current=null,a(!1),document.body.removeAttribute(`data-verse-resizing`)}(0,J.useEffect)(()=>()=>document.body.removeAttribute(`data-verse-resizing`),[]);function l(r){let i=r.shiftKey?ze:Re,a=null;r.key===`ArrowLeft`?a=e+i:r.key===`ArrowRight`?a=e-i:r.key===`Home`?a=g.minWidth:r.key===`End`&&(a=n),a!==null&&(r.preventDefault(),x(p(a,t)))}return(0,X.jsx)(`div`,{className:$.widthHandle,role:`separator`,"aria-orientation":`vertical`,"aria-label":`Resize the dock`,"aria-valuemin":g.minWidth,"aria-valuemax":n,"aria-valuenow":Math.round(e),tabIndex:0,"data-dragging":i||void 0,onPointerDown:o,onPointerMove:s,onPointerUp:c,onPointerCancel:c,onLostPointerCapture:c,onDoubleClick:()=>x(g.defaultWidth),onKeyDown:l})}function We({ratio:e,lower:t}){let n=(0,J.useRef)(null),r=(0,J.useRef)(null);function i(e){if(e.button!==0)return;let t=n.current?.parentElement;if(!t)return;e.preventDefault();let i=t.getBoundingClientRect();r.current={top:i.top,height:i.height},e.currentTarget.setPointerCapture?.(e.pointerId)}function a(e){let t=r.current;!t||t.height<=0||v((e.clientY-t.top)/t.height)}function o(t){t.key===`ArrowUp`?(t.preventDefault(),v(e-Be)):t.key===`ArrowDown`&&(t.preventDefault(),v(e+Be))}return(0,X.jsx)(`div`,{ref:n,className:$.splitHandle,role:`separator`,"aria-orientation":`horizontal`,"aria-label":`Resize: ${t} below`,"aria-valuemin":Math.round(g.splitRatio.min*100),"aria-valuemax":Math.round(g.splitRatio.max*100),"aria-valuenow":Math.round(e*100),tabIndex:0,style:{order:1},onPointerDown:i,onPointerMove:a,onPointerUp:()=>{r.current=null},onPointerCancel:()=>{r.current=null},onDoubleClick:()=>v(g.splitRatio.default),onKeyDown:o})}var Ge=20,Ke={running:`running`,done:`done`,failed:`failed`};function qe({turnTasks:e,otherChats:t,hasSession:n,onOpenSession:r}){let i=u(`chat.new`)?.keys[0],a=i?l(i):null,o=e.filter(e=>e.status===`running`),s=e.filter(e=>e.status!==`running`).slice(0,Ge);return(0,X.jsxs)(`div`,{className:Q.pane,"aria-label":`Tasks`,children:[(0,X.jsxs)(`section`,{className:Q.section,"aria-labelledby":`dock-tasks-turn`,children:[(0,X.jsxs)(`h3`,{id:`dock-tasks-turn`,className:Q.sectionTitle,children:[`This chat `,(0,X.jsx)(`span`,{className:Q.count,children:o.length>0?`${o.length} running`:``})]}),n?e.length===0?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(`p`,{className:Q.muted,children:`No tool calls in the latest turn.`}),(0,X.jsx)(`p`,{className:Q.hint,children:`Send a message: each tool the agent runs shows up here, and a click jumps to it in the chat.`})]}):(0,X.jsx)(`ul`,{className:Q.taskList,children:[...o,...s].map(e=>(0,X.jsx)(`li`,{children:(0,X.jsxs)(`button`,{type:`button`,className:Q.task,"data-status":e.status,onClick:()=>{Te(he(e.toolUseId))},"aria-label":`${e.kind===`subagent`?`Subagent`:e.name}: ${e.detail}, ${Ke[e.status]}. Jump to it in the chat.`,children:[(0,X.jsx)(`span`,{className:Q.taskMark,"data-status":e.status,"aria-hidden":`true`}),(0,X.jsx)(`span`,{className:Q.taskName,title:e.kind===`subagent`?`Subagent`:e.name,children:e.kind===`subagent`?`Subagent`:e.name}),(0,X.jsx)(`span`,{className:Q.taskDetail,title:e.detail,children:e.detail}),(0,X.jsx)(`span`,{className:Q.taskTime,children:e.status===`running`?(0,X.jsx)(B,{since:e.startedAt}):e.status===`failed`?`failed`:e.durationMs!==null&&e.durationMs>0?w(e.durationMs):`done`})]})},e.toolUseId))}):(0,X.jsx)(`p`,{className:Q.muted,children:`Open a chat to see its tool calls here.`})]}),(0,X.jsxs)(`section`,{className:Q.section,"aria-labelledby":`dock-tasks-chats`,children:[(0,X.jsxs)(`h3`,{id:`dock-tasks-chats`,className:Q.sectionTitle,children:[`Other chats `,(0,X.jsx)(`span`,{className:Q.count,children:t.length>0?`${t.length} running`:``})]}),t.length===0?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(`p`,{className:Q.muted,children:`No other chat is running.`}),(0,X.jsxs)(`p`,{className:Q.hint,children:[a?`Start another with ${a}`:`Start another chat`,` and it shows here while it works, one click away.`]})]}):(0,X.jsx)(`ul`,{className:Q.taskList,children:t.map(e=>(0,X.jsx)(`li`,{children:(0,X.jsxs)(`button`,{type:`button`,className:Q.task,"data-status":`running`,onClick:()=>r(e.sessionId),"aria-label":`${e.title||`Untitled chat`}, running${e.live?`: ${e.live}`:``}. Open this chat.`,children:[(0,X.jsx)(Je,{engine:e.engine}),(0,X.jsx)(`span`,{className:Q.taskName,title:e.title||`Untitled chat`,children:e.title||`Untitled chat`}),(0,X.jsx)(`span`,{className:Q.taskDetail,title:e.live??void 0,children:e.live??``}),(0,X.jsx)(`span`,{className:Q.taskTime,children:e.startedAt?(0,X.jsx)(B,{since:e.startedAt}):`running`})]})},e.sessionId))})]})]})}function Je({engine:e}){return(0,X.jsx)(`span`,{className:Q.engineTick,"data-engine":e,"aria-hidden":`true`,children:(0,X.jsx)(c,{engine:e,size:12})})}function Ye(e){let{session:t,seats:n,events:r,rootsData:i,rootsError:a,otherRunning:o,dispatchEnabled:s,onOpenSession:c,onHandoff:l,onOpenAccounts:u}=e,d=s?t?.status===`running`?`Available when the current turn finishes.`:null:`Sending is disabled on this server.`;return(0,X.jsx)(Ve,{presentation:e.presentation,windowWidth:e.windowWidth,columnWidth:e.columnWidth,sessionId:t?.id??null,roots:e.roots,turnFiles:e.turnFiles,onSendToChat:e.onSendToChat,onAddToMessage:e.onAddToMessage,renderTasks:()=>(0,X.jsx)(Xe,{sessionId:t?.id??null,otherChats:o,onOpenSession:c}),renderContext:e=>(0,X.jsx)(Ie,{session:t,seats:n,events:r,roots:i,rootsError:a,visible:e,onHandoff:t?()=>l(t.id):void 0,handoffDisabledReason:d,onOpenAccounts:u})})}function Xe({sessionId:e,otherChats:t,onOpenSession:n}){let r=Ce(e),i=(0,J.useMemo)(()=>U(r.items),[r.items]);return(0,X.jsx)(qe,{turnTasks:i,otherChats:t,hasSession:e!==null,onOpenSession:n})}export{Ye as DockHost};
2
+ //# sourceMappingURL=DockHost-DzkzR-HD.js.map