@polderlabs/bizar 10.3.0 → 10.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/bizar-dash/dist/assets/{ActivityFeed-xXiUCZLB.js → ActivityFeed-DtRtg-JN.js} +1 -1
  2. package/bizar-dash/dist/assets/{ActivityFeed-xXiUCZLB.js.map → ActivityFeed-DtRtg-JN.js.map} +1 -1
  3. package/bizar-dash/dist/assets/{ActivityView-nOYhCp3h.js → ActivityView-CoTXDyU_.js} +1 -1
  4. package/bizar-dash/dist/assets/{ActivityView-nOYhCp3h.js.map → ActivityView-CoTXDyU_.js.map} +1 -1
  5. package/bizar-dash/dist/assets/{AdminView-Coi4V3sq.js → AdminView-DNc5Ll7L.js} +1 -1
  6. package/bizar-dash/dist/assets/{AdminView-Coi4V3sq.js.map → AdminView-DNc5Ll7L.js.map} +1 -1
  7. package/bizar-dash/dist/assets/{AgentActivity-nEri4lbx.js → AgentActivity-CrX7LmQ6.js} +1 -1
  8. package/bizar-dash/dist/assets/{AgentActivity-nEri4lbx.js.map → AgentActivity-CrX7LmQ6.js.map} +1 -1
  9. package/bizar-dash/dist/assets/{AgentsView-ByiIJ0ej.js → AgentsView-Du-G_skK.js} +1 -1
  10. package/bizar-dash/dist/assets/{AgentsView-ByiIJ0ej.js.map → AgentsView-Du-G_skK.js.map} +1 -1
  11. package/bizar-dash/dist/assets/{Alert-Dg_Vwxh5.js → Alert-B6DjfRFI.js} +1 -1
  12. package/bizar-dash/dist/assets/{Alert-Dg_Vwxh5.js.map → Alert-B6DjfRFI.js.map} +1 -1
  13. package/bizar-dash/dist/assets/{ArtifactsView-CGclRNnz.js → ArtifactsView-znhN8GTR.js} +1 -1
  14. package/bizar-dash/dist/assets/{ArtifactsView-CGclRNnz.js.map → ArtifactsView-znhN8GTR.js.map} +1 -1
  15. package/bizar-dash/dist/assets/{AuthView-utVm6M3D.js → AuthView-Rk8eKUPr.js} +1 -1
  16. package/bizar-dash/dist/assets/{AuthView-utVm6M3D.js.map → AuthView-Rk8eKUPr.js.map} +1 -1
  17. package/bizar-dash/dist/assets/{Avatar-CXDZdKy4.js → Avatar-B41upSD1.js} +1 -1
  18. package/bizar-dash/dist/assets/{Avatar-CXDZdKy4.js.map → Avatar-B41upSD1.js.map} +1 -1
  19. package/bizar-dash/dist/assets/{BackgroundJobsView-j603pz6o.js → BackgroundJobsView-BLWuN9qz.js} +1 -1
  20. package/bizar-dash/dist/assets/{BackgroundJobsView-j603pz6o.js.map → BackgroundJobsView-BLWuN9qz.js.map} +1 -1
  21. package/bizar-dash/dist/assets/{BackupView-DgvnntTE.js → BackupView-CqbtcnuQ.js} +1 -1
  22. package/bizar-dash/dist/assets/{BackupView-DgvnntTE.js.map → BackupView-CqbtcnuQ.js.map} +1 -1
  23. package/bizar-dash/dist/assets/{Card-D9019JOD.js → Card-rF59wHiO.js} +1 -1
  24. package/bizar-dash/dist/assets/{Card-D9019JOD.js.map → Card-rF59wHiO.js.map} +1 -1
  25. package/bizar-dash/dist/assets/{ChatView-C0cTgj5d.js → ChatView-CUriVEgU.js} +1 -1
  26. package/bizar-dash/dist/assets/{ChatView-C0cTgj5d.js.map → ChatView-CUriVEgU.js.map} +1 -1
  27. package/bizar-dash/dist/assets/{Chip-DQtalZ4y.js → Chip-Dc2KmeWl.js} +1 -1
  28. package/bizar-dash/dist/assets/{Chip-DQtalZ4y.js.map → Chip-Dc2KmeWl.js.map} +1 -1
  29. package/bizar-dash/dist/assets/{ClaudeSessionsView-H3Bqjo6b.js → ClaudeSessionsView-CiaHQdDZ.js} +1 -1
  30. package/bizar-dash/dist/assets/{ClaudeSessionsView-H3Bqjo6b.js.map → ClaudeSessionsView-CiaHQdDZ.js.map} +1 -1
  31. package/bizar-dash/dist/assets/{ClipboardView-BAguaKbx.js → ClipboardView-DdP6aVso.js} +1 -1
  32. package/bizar-dash/dist/assets/{ClipboardView-BAguaKbx.js.map → ClipboardView-DdP6aVso.js.map} +1 -1
  33. package/bizar-dash/dist/assets/{ConfigView-DWHJgoe8.js → ConfigView-B2ysnTZU.js} +1 -1
  34. package/bizar-dash/dist/assets/{ConfigView-DWHJgoe8.js.map → ConfigView-B2ysnTZU.js.map} +1 -1
  35. package/bizar-dash/dist/assets/{DiagnosticsView-oCT624hk.js → DiagnosticsView-88OZ5k0f.js} +1 -1
  36. package/bizar-dash/dist/assets/{DiagnosticsView-oCT624hk.js.map → DiagnosticsView-88OZ5k0f.js.map} +1 -1
  37. package/bizar-dash/dist/assets/{DialogsView-CqHNals_.js → DialogsView-BcqDDCZQ.js} +1 -1
  38. package/bizar-dash/dist/assets/{DialogsView-CqHNals_.js.map → DialogsView-BcqDDCZQ.js.map} +1 -1
  39. package/bizar-dash/dist/assets/{DoctorView-6kfQq_Mx.js → DoctorView-BQwqvMAh.js} +1 -1
  40. package/bizar-dash/dist/assets/{DoctorView-6kfQq_Mx.js.map → DoctorView-BQwqvMAh.js.map} +1 -1
  41. package/bizar-dash/dist/assets/{EmptyState-DLmtBX_6.js → EmptyState-D65J5FQN.js} +1 -1
  42. package/bizar-dash/dist/assets/{EmptyState-DLmtBX_6.js.map → EmptyState-D65J5FQN.js.map} +1 -1
  43. package/bizar-dash/dist/assets/{EnvVarsView-DySOXlP1.js → EnvVarsView-DX-3oGH-.js} +1 -1
  44. package/bizar-dash/dist/assets/{EnvVarsView-DySOXlP1.js.map → EnvVarsView-DX-3oGH-.js.map} +1 -1
  45. package/bizar-dash/dist/assets/{ErrorState-Bump8diE.js → ErrorState-DULZnttJ.js} +1 -1
  46. package/bizar-dash/dist/assets/{ErrorState-Bump8diE.js.map → ErrorState-DULZnttJ.js.map} +1 -1
  47. package/bizar-dash/dist/assets/{EvalView-FnZ5d93z.js → EvalView-CpdFu_ID.js} +1 -1
  48. package/bizar-dash/dist/assets/{EvalView-FnZ5d93z.js.map → EvalView-CpdFu_ID.js.map} +1 -1
  49. package/bizar-dash/dist/assets/{GoalsView-C4m1WnVv.js → GoalsView-Br8oPPfb.js} +1 -1
  50. package/bizar-dash/dist/assets/{GoalsView-C4m1WnVv.js.map → GoalsView-Br8oPPfb.js.map} +1 -1
  51. package/bizar-dash/dist/assets/{Grid-dEnoGGws.js → Grid-BSXhsCPC.js} +1 -1
  52. package/bizar-dash/dist/assets/{Grid-dEnoGGws.js.map → Grid-BSXhsCPC.js.map} +1 -1
  53. package/bizar-dash/dist/assets/{HistoryView-xdRybjZ2.js → HistoryView-D0J3aoZF.js} +1 -1
  54. package/bizar-dash/dist/assets/{HistoryView-xdRybjZ2.js.map → HistoryView-D0J3aoZF.js.map} +1 -1
  55. package/bizar-dash/dist/assets/{Input-BSa3lh_-.js → Input-CZmRw5QX.js} +1 -1
  56. package/bizar-dash/dist/assets/{Input-BSa3lh_-.js.map → Input-CZmRw5QX.js.map} +1 -1
  57. package/bizar-dash/dist/assets/{LibrariesView-1zR04Eci.js → LibrariesView-B1YX9wzp.js} +1 -1
  58. package/bizar-dash/dist/assets/{LibrariesView-1zR04Eci.js.map → LibrariesView-B1YX9wzp.js.map} +1 -1
  59. package/bizar-dash/dist/assets/{LightRAGView-PubmA9oL.js → LightRAGView-CykR0t9y.js} +1 -1
  60. package/bizar-dash/dist/assets/{LightRAGView-PubmA9oL.js.map → LightRAGView-CykR0t9y.js.map} +1 -1
  61. package/bizar-dash/dist/assets/{ListHeader-Ak9WJd39.js → ListHeader-Dpun-r36.js} +1 -1
  62. package/bizar-dash/dist/assets/{ListHeader-Ak9WJd39.js.map → ListHeader-Dpun-r36.js.map} +1 -1
  63. package/bizar-dash/dist/assets/{MemoryView-DBGpuETw.js → MemoryView-BbER5ZKt.js} +1 -1
  64. package/bizar-dash/dist/assets/{MemoryView-DBGpuETw.js.map → MemoryView-BbER5ZKt.js.map} +1 -1
  65. package/bizar-dash/dist/assets/{MiscView-DufqBHkX.js → MiscView-DLNEGdML.js} +1 -1
  66. package/bizar-dash/dist/assets/{MiscView-DufqBHkX.js.map → MiscView-DLNEGdML.js.map} +1 -1
  67. package/bizar-dash/dist/assets/{ModsView-DcX6eVU2.js → ModsView-P7gDeNHM.js} +1 -1
  68. package/bizar-dash/dist/assets/{ModsView-DcX6eVU2.js.map → ModsView-P7gDeNHM.js.map} +1 -1
  69. package/bizar-dash/dist/assets/{NotificationsView-B8IhHRQC.js → NotificationsView-DAm2O0yf.js} +1 -1
  70. package/bizar-dash/dist/assets/{NotificationsView-B8IhHRQC.js.map → NotificationsView-DAm2O0yf.js.map} +1 -1
  71. package/bizar-dash/dist/assets/{ObsidianView-DEuk65zS.js → ObsidianView-Ci80gnwS.js} +1 -1
  72. package/bizar-dash/dist/assets/{ObsidianView-DEuk65zS.js.map → ObsidianView-Ci80gnwS.js.map} +1 -1
  73. package/bizar-dash/dist/assets/{OverviewView-CTI2spTd.js → OverviewView-rriw1GjA.js} +1 -1
  74. package/bizar-dash/dist/assets/{OverviewView-CTI2spTd.js.map → OverviewView-rriw1GjA.js.map} +1 -1
  75. package/bizar-dash/dist/assets/{ProgressBar-D3lkz42E.js → ProgressBar-BahmeJhP.js} +1 -1
  76. package/bizar-dash/dist/assets/{ProgressBar-D3lkz42E.js.map → ProgressBar-BahmeJhP.js.map} +1 -1
  77. package/bizar-dash/dist/assets/{ProjectsView-Du0LzE7A.js → ProjectsView-ChzM12bs.js} +1 -1
  78. package/bizar-dash/dist/assets/{ProjectsView-Du0LzE7A.js.map → ProjectsView-ChzM12bs.js.map} +1 -1
  79. package/bizar-dash/dist/assets/{ProvidersView-5bCgXwBo.js → ProvidersView-BftGn8Cr.js} +1 -1
  80. package/bizar-dash/dist/assets/{ProvidersView-5bCgXwBo.js.map → ProvidersView-BftGn8Cr.js.map} +1 -1
  81. package/bizar-dash/dist/assets/{SchedulesView-DFHdIz5P.js → SchedulesView-CtNxtzN6.js} +1 -1
  82. package/bizar-dash/dist/assets/{SchedulesView-DFHdIz5P.js.map → SchedulesView-CtNxtzN6.js.map} +1 -1
  83. package/bizar-dash/dist/assets/{Select-C8EJj4NM.js → Select-0VcfTDeL.js} +1 -1
  84. package/bizar-dash/dist/assets/{Select-C8EJj4NM.js.map → Select-0VcfTDeL.js.map} +1 -1
  85. package/bizar-dash/dist/assets/{SettingsRow-BdOOmYMD.js → SettingsRow-BLic3DQl.js} +1 -1
  86. package/bizar-dash/dist/assets/{SettingsRow-BdOOmYMD.js.map → SettingsRow-BLic3DQl.js.map} +1 -1
  87. package/bizar-dash/dist/assets/{SettingsView-CqwQ6Knv.js → SettingsView-BjS3i4nr.js} +1 -1
  88. package/bizar-dash/dist/assets/{SettingsView-CqwQ6Knv.js.map → SettingsView-BjS3i4nr.js.map} +1 -1
  89. package/bizar-dash/dist/assets/{Sheet-Cztsvgse.js → Sheet-BOProMs2.js} +1 -1
  90. package/bizar-dash/dist/assets/{Sheet-Cztsvgse.js.map → Sheet-BOProMs2.js.map} +1 -1
  91. package/bizar-dash/dist/assets/{Slider-BexNfF6K.js → Slider-B0eLEEUt.js} +1 -1
  92. package/bizar-dash/dist/assets/{Slider-BexNfF6K.js.map → Slider-B0eLEEUt.js.map} +1 -1
  93. package/bizar-dash/dist/assets/{Sparkline-CLZBtvsN.js → Sparkline-SSrdgyW0.js} +1 -1
  94. package/bizar-dash/dist/assets/{Sparkline-CLZBtvsN.js.map → Sparkline-SSrdgyW0.js.map} +1 -1
  95. package/bizar-dash/dist/assets/{Switch-B1tiRwNK.js → Switch-B3EQzb_q.js} +1 -1
  96. package/bizar-dash/dist/assets/{Switch-B1tiRwNK.js.map → Switch-B3EQzb_q.js.map} +1 -1
  97. package/bizar-dash/dist/assets/{TasksView-CT0fPlos.js → TasksView-SWjF_ZUQ.js} +1 -1
  98. package/bizar-dash/dist/assets/{TasksView-CT0fPlos.js.map → TasksView-SWjF_ZUQ.js.map} +1 -1
  99. package/bizar-dash/dist/assets/{Textarea-D_TPpVMy.js → Textarea-QuofpMlq.js} +1 -1
  100. package/bizar-dash/dist/assets/{Textarea-D_TPpVMy.js.map → Textarea-QuofpMlq.js.map} +1 -1
  101. package/bizar-dash/dist/assets/{UpdateView-tD2q2OhW.js → UpdateView-CEHW2nd6.js} +1 -1
  102. package/bizar-dash/dist/assets/{UpdateView-tD2q2OhW.js.map → UpdateView-CEHW2nd6.js.map} +1 -1
  103. package/bizar-dash/dist/assets/{UsageView-B4BuAFKA.js → UsageView-BqOw6FBg.js} +1 -1
  104. package/bizar-dash/dist/assets/{UsageView-B4BuAFKA.js.map → UsageView-BqOw6FBg.js.map} +1 -1
  105. package/bizar-dash/dist/assets/{ViewHeader-V_SzbUpw.js → ViewHeader-B6P-C4GD.js} +1 -1
  106. package/bizar-dash/dist/assets/{ViewHeader-V_SzbUpw.js.map → ViewHeader-B6P-C4GD.js.map} +1 -1
  107. package/bizar-dash/dist/assets/{VoiceView-D3vb5OM2.js → VoiceView-CwrPwWgi.js} +1 -1
  108. package/bizar-dash/dist/assets/{VoiceView-D3vb5OM2.js.map → VoiceView-CwrPwWgi.js.map} +1 -1
  109. package/bizar-dash/dist/assets/{brain-BmfWcitQ.js → brain-CwZt9Kta.js} +1 -1
  110. package/bizar-dash/dist/assets/{brain-BmfWcitQ.js.map → brain-CwZt9Kta.js.map} +1 -1
  111. package/bizar-dash/dist/assets/{calendar-VntJUzFB.js → calendar-C5oK0_nM.js} +1 -1
  112. package/bizar-dash/dist/assets/{calendar-VntJUzFB.js.map → calendar-C5oK0_nM.js.map} +1 -1
  113. package/bizar-dash/dist/assets/{circle-KrQQySeK.js → circle-D1Lc_P2a.js} +1 -1
  114. package/bizar-dash/dist/assets/{circle-KrQQySeK.js.map → circle-D1Lc_P2a.js.map} +1 -1
  115. package/bizar-dash/dist/assets/{circle-alert-CQ9MLygI.js → circle-alert-HdHe7m8K.js} +1 -1
  116. package/bizar-dash/dist/assets/{circle-alert-CQ9MLygI.js.map → circle-alert-HdHe7m8K.js.map} +1 -1
  117. package/bizar-dash/dist/assets/{circle-check-COtVgsWw.js → circle-check-Cs-xoV7R.js} +1 -1
  118. package/bizar-dash/dist/assets/{circle-check-COtVgsWw.js.map → circle-check-Cs-xoV7R.js.map} +1 -1
  119. package/bizar-dash/dist/assets/{clock-C0GlM4qp.js → clock-DEIuPV60.js} +1 -1
  120. package/bizar-dash/dist/assets/{clock-C0GlM4qp.js.map → clock-DEIuPV60.js.map} +1 -1
  121. package/bizar-dash/dist/assets/{download-CW4DmtRe.js → download-Clkq90Ct.js} +1 -1
  122. package/bizar-dash/dist/assets/{download-CW4DmtRe.js.map → download-Clkq90Ct.js.map} +1 -1
  123. package/bizar-dash/dist/assets/{external-link-CAOnh_DH.js → external-link-D5tq2o_I.js} +1 -1
  124. package/bizar-dash/dist/assets/{external-link-CAOnh_DH.js.map → external-link-D5tq2o_I.js.map} +1 -1
  125. package/bizar-dash/dist/assets/{file-text-CS1jB_oV.js → file-text-CQ12t7Oc.js} +1 -1
  126. package/bizar-dash/dist/assets/{file-text-CS1jB_oV.js.map → file-text-CQ12t7Oc.js.map} +1 -1
  127. package/bizar-dash/dist/assets/{filter-DyQbml3L.js → filter-BcbE37wP.js} +1 -1
  128. package/bizar-dash/dist/assets/{filter-DyQbml3L.js.map → filter-BcbE37wP.js.map} +1 -1
  129. package/bizar-dash/dist/assets/{git-pull-request-Co6gYfba.js → git-pull-request-D1qNDRia.js} +1 -1
  130. package/bizar-dash/dist/assets/{git-pull-request-Co6gYfba.js.map → git-pull-request-D1qNDRia.js.map} +1 -1
  131. package/bizar-dash/dist/assets/{main-CyAIirBB.js → main-Cxeu4LhG.js} +2 -2
  132. package/bizar-dash/dist/assets/{main-CyAIirBB.js.map → main-Cxeu4LhG.js.map} +1 -1
  133. package/bizar-dash/dist/assets/{network-CDn43Gsj.js → network-DJdvVaHx.js} +1 -1
  134. package/bizar-dash/dist/assets/{network-CDn43Gsj.js.map → network-DJdvVaHx.js.map} +1 -1
  135. package/bizar-dash/dist/assets/{pause-CKYjSTGX.js → pause-DUn9L5PB.js} +1 -1
  136. package/bizar-dash/dist/assets/{pause-CKYjSTGX.js.map → pause-DUn9L5PB.js.map} +1 -1
  137. package/bizar-dash/dist/assets/{pencil-BUJ2DpWs.js → pencil-DVrBlYV3.js} +1 -1
  138. package/bizar-dash/dist/assets/{pencil-BUJ2DpWs.js.map → pencil-DVrBlYV3.js.map} +1 -1
  139. package/bizar-dash/dist/assets/{play-CGxZWqtW.js → play-CZjsr3XM.js} +1 -1
  140. package/bizar-dash/dist/assets/{play-CGxZWqtW.js.map → play-CZjsr3XM.js.map} +1 -1
  141. package/bizar-dash/dist/assets/{plug-CQYGgGSy.js → plug-BKuyIe5W.js} +1 -1
  142. package/bizar-dash/dist/assets/{plug-CQYGgGSy.js.map → plug-BKuyIe5W.js.map} +1 -1
  143. package/bizar-dash/dist/assets/{plus-fFxt-8z5.js → plus-77h62zZm.js} +1 -1
  144. package/bizar-dash/dist/assets/{plus-fFxt-8z5.js.map → plus-77h62zZm.js.map} +1 -1
  145. package/bizar-dash/dist/assets/{power-Cjgy2KsI.js → power-DLmx-gCP.js} +1 -1
  146. package/bizar-dash/dist/assets/{power-Cjgy2KsI.js.map → power-DLmx-gCP.js.map} +1 -1
  147. package/bizar-dash/dist/assets/{power-off-B81hLRah.js → power-off-BFKzHXic.js} +1 -1
  148. package/bizar-dash/dist/assets/{power-off-B81hLRah.js.map → power-off-BFKzHXic.js.map} +1 -1
  149. package/bizar-dash/dist/assets/{refresh-ccw-BCXx86xp.js → refresh-ccw-DenGBOcq.js} +1 -1
  150. package/bizar-dash/dist/assets/{refresh-ccw-BCXx86xp.js.map → refresh-ccw-DenGBOcq.js.map} +1 -1
  151. package/bizar-dash/dist/assets/{refresh-cw-COTg1nZo.js → refresh-cw-ENBVR8hW.js} +1 -1
  152. package/bizar-dash/dist/assets/{refresh-cw-COTg1nZo.js.map → refresh-cw-ENBVR8hW.js.map} +1 -1
  153. package/bizar-dash/dist/assets/{rotate-ccw-BZrEVc0Z.js → rotate-ccw-MxryaY7q.js} +1 -1
  154. package/bizar-dash/dist/assets/{rotate-ccw-BZrEVc0Z.js.map → rotate-ccw-MxryaY7q.js.map} +1 -1
  155. package/bizar-dash/dist/assets/{rotate-cw-CsTtaLV2.js → rotate-cw-CDOlRtUR.js} +1 -1
  156. package/bizar-dash/dist/assets/{rotate-cw-CsTtaLV2.js.map → rotate-cw-CDOlRtUR.js.map} +1 -1
  157. package/bizar-dash/dist/assets/{save-DtMTge1F.js → save-Db1b-1Uq.js} +1 -1
  158. package/bizar-dash/dist/assets/{save-DtMTge1F.js.map → save-Db1b-1Uq.js.map} +1 -1
  159. package/bizar-dash/dist/assets/{send-DyBhyk8t.js → send-yz6HFZM5.js} +1 -1
  160. package/bizar-dash/dist/assets/{send-DyBhyk8t.js.map → send-yz6HFZM5.js.map} +1 -1
  161. package/bizar-dash/dist/assets/{shield-alert-BPGJlRF8.js → shield-alert-DY6RAaC8.js} +1 -1
  162. package/bizar-dash/dist/assets/{shield-alert-BPGJlRF8.js.map → shield-alert-DY6RAaC8.js.map} +1 -1
  163. package/bizar-dash/dist/assets/{trash-2-2NsyTU8c.js → trash-2-Cv7U38jw.js} +1 -1
  164. package/bizar-dash/dist/assets/{trash-2-2NsyTU8c.js.map → trash-2-Cv7U38jw.js.map} +1 -1
  165. package/bizar-dash/dist/assets/{trending-up-BXwP23VK.js → trending-up-CRPNagyX.js} +1 -1
  166. package/bizar-dash/dist/assets/{trending-up-BXwP23VK.js.map → trending-up-CRPNagyX.js.map} +1 -1
  167. package/bizar-dash/dist/assets/{triangle-alert-DFmQ_RXN.js → triangle-alert-tUTXbcEP.js} +1 -1
  168. package/bizar-dash/dist/assets/{triangle-alert-DFmQ_RXN.js.map → triangle-alert-tUTXbcEP.js.map} +1 -1
  169. package/bizar-dash/dist/assets/{upload-Cj-HYRYV.js → upload-Cq7uTsrT.js} +1 -1
  170. package/bizar-dash/dist/assets/{upload-Cj-HYRYV.js.map → upload-Cq7uTsrT.js.map} +1 -1
  171. package/bizar-dash/dist/assets/{zap-BaOiybcl.js → zap-5lAQBAPX.js} +1 -1
  172. package/bizar-dash/dist/assets/{zap-BaOiybcl.js.map → zap-5lAQBAPX.js.map} +1 -1
  173. package/bizar-dash/dist/index.html +1 -1
  174. package/bizar-dash/src/server/api.mjs +5 -1
  175. package/bizar-dash/src/web/v8/shell/Sidebar.tsx +3 -3
  176. package/cli/doctor.mjs +1 -1
  177. package/package.json +1 -1
  178. package/packages/sdk/dist/mcp/server.js +41 -409
  179. package/packages/sdk/dist/router/q-learning-router.d.ts +3 -5
  180. package/packages/sdk/dist/router/q-learning-router.js +9 -5
  181. package/packages/sdk/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Alert-Dg_Vwxh5.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/info.js","../../src/web/v8/ui/feedback/Alert.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Info = createLucideIcon(\"Info\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 16v-4\", key: \"1dtifu\" }],\n [\"path\", { d: \"M12 8h.01\", key: \"e9boi3\" }]\n]);\n\nexport { Info as default };\n//# sourceMappingURL=info.js.map\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport React from 'react';\nimport { AlertCircle, AlertTriangle, CheckCircle2, Info } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Alert — inline contextual message.\n *\n * Tones: info | success | warning | danger.\n *\n * Use cases: empty states, inline help text, error banners inside forms.\n * For status pulses (topbar live indicator) use a small dot, not an Alert.\n */\n\nexport type AlertTone = 'info' | 'success' | 'warning' | 'danger';\n\nconst ICON = {\n info: Info,\n success: CheckCircle2,\n warning: AlertTriangle,\n danger: AlertCircle,\n} as const;\n\nconst TONE_BG = {\n info: 'color-mix(in oklch, var(--info) 12%, var(--surface-1))',\n success: 'color-mix(in oklch, var(--success) 12%, var(--surface-1))',\n warning: 'color-mix(in oklch, var(--warning) 12%, var(--surface-1))',\n danger: 'color-mix(in oklch, var(--danger) 12%, var(--surface-1))',\n} as const;\n\nconst TONE_FG = {\n info: 'var(--info)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n danger: 'var(--danger)',\n} as const;\n\nconst TONE_BORDER = {\n info: 'color-mix(in oklch, var(--info) 30%, var(--border))',\n success: 'color-mix(in oklch, var(--success) 30%, var(--border))',\n warning: 'color-mix(in oklch, var(--warning) 30%, var(--border))',\n danger: 'color-mix(in oklch, var(--danger) 30%, var(--border))',\n} as const;\n\nexport interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'title'> {\n tone?: AlertTone;\n title?: ReactNode;\n children?: ReactNode;\n /** Optional right-aligned action (button). */\n action?: ReactNode;\n /** Override the leading icon. Pass `false` to hide. */\n icon?: ReactNode | false;\n}\n\nexport const Alert = forwardRef<HTMLDivElement, AlertProps>(function Alert(props, ref) {\n const { tone = 'info', title, children, action, icon, className, ...rest } = props;\n const showIcon = icon !== false;\n const IconNode = icon === false ? null : (icon ?? React.createElement(ICON[tone], { size: 16, 'aria-hidden': true }));\n return (\n <div\n ref={ref}\n role={tone === 'danger' || tone === 'warning' ? 'alert' : 'status'}\n className={cx('v8-alert', `v8-alert--${tone}`, className)}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: 'var(--space-3)',\n padding: 'var(--space-3) var(--space-4)',\n background: TONE_BG[tone],\n border: '1px solid',\n borderColor: TONE_BORDER[tone],\n borderRadius: 'var(--radius)',\n color: 'var(--fg)',\n }}\n {...rest}\n >\n {showIcon && IconNode !== null && (\n <span style={{ color: TONE_FG[tone], flexShrink: 0, marginTop: 1, display: 'inline-flex' }}>\n {IconNode}\n </span>\n )}\n <div style={{ flex: 1, minWidth: 0, display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n {title !== undefined && (\n <div style={{ fontSize: 'var(--fs-13)', fontWeight: 600 }}>{title}</div>\n )}\n {children !== undefined && (\n <div style={{ fontSize: 'var(--fs-13)', color: 'var(--fg-muted)' }}>{children}</div>\n )}\n </div>\n {action !== undefined && (\n <div style={{ flexShrink: 0, display: 'flex', alignItems: 'center' }}>{action}</div>\n )}\n </div>\n );\n});"],"names":["Info","createLucideIcon","ICON","CheckCircle2","AlertTriangle","AlertCircle","TONE_BG","TONE_FG","TONE_BORDER","Alert","forwardRef","props","ref","tone","title","children","action","icon","className","rest","showIcon","IconNode","React","jsxs","cx","jsx"],"mappings":"kPAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAOC,EAAiB,OAAQ,CACpC,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,SAAU,EACzD,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,EAC1C,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,CAC5C,CAAC,ECGKC,EAAO,CACX,KAAMF,EACN,QAASG,EACT,QAASC,EACT,OAAQC,CACV,EAEMC,EAAU,CACd,KAAM,yDACN,QAAS,4DACT,QAAS,4DACT,OAAQ,0DACV,EAEMC,EAAU,CACd,KAAM,cACN,QAAS,iBACT,QAAS,iBACT,OAAQ,eACV,EAEMC,EAAc,CAClB,KAAM,sDACN,QAAS,yDACT,QAAS,yDACT,OAAQ,uDACV,EAYaC,EAAQC,EAAAA,WAAuC,SAAeC,EAAOC,EAAK,CACrF,KAAM,CAAE,KAAAC,EAAO,OAAQ,MAAAC,EAAO,SAAAC,EAAU,OAAAC,EAAQ,KAAAC,EAAM,UAAAC,EAAW,GAAGC,CAAA,EAASR,EACvES,EAAWH,IAAS,GACpBI,EAAWJ,IAAS,GAAQ,KAAQA,GAAQK,EAAM,cAAcpB,EAAKW,CAAI,EAAG,CAAE,KAAM,GAAI,cAAe,GAAM,EACnH,OACEU,EAAAA,KAAC,MAAA,CACC,IAAAX,EACA,KAAMC,IAAS,UAAYA,IAAS,UAAY,QAAU,SAC1D,UAAWW,EAAG,WAAY,aAAaX,CAAI,GAAIK,CAAS,EACxD,MAAO,CACL,QAAS,OACT,WAAY,aACZ,IAAK,iBACL,QAAS,gCACT,WAAYZ,EAAQO,CAAI,EACxB,OAAQ,YACR,YAAaL,EAAYK,CAAI,EAC7B,aAAc,gBACd,MAAO,WAAA,EAER,GAAGM,EAEH,SAAA,CAAAC,GAAYC,IAAa,MACxBI,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,MAAOlB,EAAQM,CAAI,EAAG,WAAY,EAAG,UAAW,EAAG,QAAS,aAAA,EACxE,SAAAQ,EACH,EAEFE,EAAAA,KAAC,MAAA,CAAI,MAAO,CAAE,KAAM,EAAG,SAAU,EAAG,QAAS,OAAQ,cAAe,SAAU,IAAK,kBAChF,SAAA,CAAAT,IAAU,QACTW,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,WAAY,GAAA,EAAQ,SAAAX,CAAA,CAAM,EAEnEC,IAAa,QACZU,MAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAsB,SAAAV,CAAA,CAAS,CAAA,EAElF,EACCC,IAAW,QACVS,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,WAAY,EAAG,QAAS,OAAQ,WAAY,QAAA,EAAa,SAAAT,CAAA,CAAO,CAAA,CAAA,CAAA,CAItF,CAAC","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"Alert-B6DjfRFI.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/info.js","../../src/web/v8/ui/feedback/Alert.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Info = createLucideIcon(\"Info\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 16v-4\", key: \"1dtifu\" }],\n [\"path\", { d: \"M12 8h.01\", key: \"e9boi3\" }]\n]);\n\nexport { Info as default };\n//# sourceMappingURL=info.js.map\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport React from 'react';\nimport { AlertCircle, AlertTriangle, CheckCircle2, Info } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Alert — inline contextual message.\n *\n * Tones: info | success | warning | danger.\n *\n * Use cases: empty states, inline help text, error banners inside forms.\n * For status pulses (topbar live indicator) use a small dot, not an Alert.\n */\n\nexport type AlertTone = 'info' | 'success' | 'warning' | 'danger';\n\nconst ICON = {\n info: Info,\n success: CheckCircle2,\n warning: AlertTriangle,\n danger: AlertCircle,\n} as const;\n\nconst TONE_BG = {\n info: 'color-mix(in oklch, var(--info) 12%, var(--surface-1))',\n success: 'color-mix(in oklch, var(--success) 12%, var(--surface-1))',\n warning: 'color-mix(in oklch, var(--warning) 12%, var(--surface-1))',\n danger: 'color-mix(in oklch, var(--danger) 12%, var(--surface-1))',\n} as const;\n\nconst TONE_FG = {\n info: 'var(--info)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n danger: 'var(--danger)',\n} as const;\n\nconst TONE_BORDER = {\n info: 'color-mix(in oklch, var(--info) 30%, var(--border))',\n success: 'color-mix(in oklch, var(--success) 30%, var(--border))',\n warning: 'color-mix(in oklch, var(--warning) 30%, var(--border))',\n danger: 'color-mix(in oklch, var(--danger) 30%, var(--border))',\n} as const;\n\nexport interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'title'> {\n tone?: AlertTone;\n title?: ReactNode;\n children?: ReactNode;\n /** Optional right-aligned action (button). */\n action?: ReactNode;\n /** Override the leading icon. Pass `false` to hide. */\n icon?: ReactNode | false;\n}\n\nexport const Alert = forwardRef<HTMLDivElement, AlertProps>(function Alert(props, ref) {\n const { tone = 'info', title, children, action, icon, className, ...rest } = props;\n const showIcon = icon !== false;\n const IconNode = icon === false ? null : (icon ?? React.createElement(ICON[tone], { size: 16, 'aria-hidden': true }));\n return (\n <div\n ref={ref}\n role={tone === 'danger' || tone === 'warning' ? 'alert' : 'status'}\n className={cx('v8-alert', `v8-alert--${tone}`, className)}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: 'var(--space-3)',\n padding: 'var(--space-3) var(--space-4)',\n background: TONE_BG[tone],\n border: '1px solid',\n borderColor: TONE_BORDER[tone],\n borderRadius: 'var(--radius)',\n color: 'var(--fg)',\n }}\n {...rest}\n >\n {showIcon && IconNode !== null && (\n <span style={{ color: TONE_FG[tone], flexShrink: 0, marginTop: 1, display: 'inline-flex' }}>\n {IconNode}\n </span>\n )}\n <div style={{ flex: 1, minWidth: 0, display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n {title !== undefined && (\n <div style={{ fontSize: 'var(--fs-13)', fontWeight: 600 }}>{title}</div>\n )}\n {children !== undefined && (\n <div style={{ fontSize: 'var(--fs-13)', color: 'var(--fg-muted)' }}>{children}</div>\n )}\n </div>\n {action !== undefined && (\n <div style={{ flexShrink: 0, display: 'flex', alignItems: 'center' }}>{action}</div>\n )}\n </div>\n );\n});"],"names":["Info","createLucideIcon","ICON","CheckCircle2","AlertTriangle","AlertCircle","TONE_BG","TONE_FG","TONE_BORDER","Alert","forwardRef","props","ref","tone","title","children","action","icon","className","rest","showIcon","IconNode","React","jsxs","cx","jsx"],"mappings":"kPAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAOC,EAAiB,OAAQ,CACpC,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,SAAU,EACzD,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,EAC1C,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,CAC5C,CAAC,ECGKC,EAAO,CACX,KAAMF,EACN,QAASG,EACT,QAASC,EACT,OAAQC,CACV,EAEMC,EAAU,CACd,KAAM,yDACN,QAAS,4DACT,QAAS,4DACT,OAAQ,0DACV,EAEMC,EAAU,CACd,KAAM,cACN,QAAS,iBACT,QAAS,iBACT,OAAQ,eACV,EAEMC,EAAc,CAClB,KAAM,sDACN,QAAS,yDACT,QAAS,yDACT,OAAQ,uDACV,EAYaC,EAAQC,EAAAA,WAAuC,SAAeC,EAAOC,EAAK,CACrF,KAAM,CAAE,KAAAC,EAAO,OAAQ,MAAAC,EAAO,SAAAC,EAAU,OAAAC,EAAQ,KAAAC,EAAM,UAAAC,EAAW,GAAGC,CAAA,EAASR,EACvES,EAAWH,IAAS,GACpBI,EAAWJ,IAAS,GAAQ,KAAQA,GAAQK,EAAM,cAAcpB,EAAKW,CAAI,EAAG,CAAE,KAAM,GAAI,cAAe,GAAM,EACnH,OACEU,EAAAA,KAAC,MAAA,CACC,IAAAX,EACA,KAAMC,IAAS,UAAYA,IAAS,UAAY,QAAU,SAC1D,UAAWW,EAAG,WAAY,aAAaX,CAAI,GAAIK,CAAS,EACxD,MAAO,CACL,QAAS,OACT,WAAY,aACZ,IAAK,iBACL,QAAS,gCACT,WAAYZ,EAAQO,CAAI,EACxB,OAAQ,YACR,YAAaL,EAAYK,CAAI,EAC7B,aAAc,gBACd,MAAO,WAAA,EAER,GAAGM,EAEH,SAAA,CAAAC,GAAYC,IAAa,MACxBI,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,MAAOlB,EAAQM,CAAI,EAAG,WAAY,EAAG,UAAW,EAAG,QAAS,aAAA,EACxE,SAAAQ,EACH,EAEFE,EAAAA,KAAC,MAAA,CAAI,MAAO,CAAE,KAAM,EAAG,SAAU,EAAG,QAAS,OAAQ,cAAe,SAAU,IAAK,kBAChF,SAAA,CAAAT,IAAU,QACTW,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,WAAY,GAAA,EAAQ,SAAAX,CAAA,CAAM,EAEnEC,IAAa,QACZU,MAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAsB,SAAAV,CAAA,CAAS,CAAA,EAElF,EACCC,IAAW,QACVS,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,WAAY,EAAG,QAAS,OAAQ,WAAY,QAAA,EAAa,SAAAT,CAAA,CAAO,CAAA,CAAA,CAAA,CAItF,CAAC","x_google_ignoreList":[0]}
@@ -1,4 +1,4 @@
1
- import{r as l,j as e}from"./cmdk-DVxytz9i.js";import{c as F,I as f,G as H,S as m,d as x,u as w,h as k,L as O,i as z,F as M}from"./main-CyAIirBB.js";import{V as P}from"./ViewHeader-V_SzbUpw.js";import{C as $,b as D}from"./Card-D9019JOD.js";import{I as C}from"./Input-BSa3lh_-.js";import{T as R}from"./Textarea-D_TPpVMy.js";import{S as E,a as A}from"./Sheet-Cztsvgse.js";import{E as V}from"./EmptyState-DLmtBX_6.js";import{T as X}from"./triangle-alert-DFmQ_RXN.js";import{E as L}from"./external-link-CAOnh_DH.js";import{R as I}from"./refresh-ccw-BCXx86xp.js";import{P as K}from"./plus-fFxt-8z5.js";import{T as N}from"./trash-2-2NsyTU8c.js";/**
1
+ import{r as l,j as e}from"./cmdk-DVxytz9i.js";import{c as F,I as f,G as H,S as m,d as x,u as w,h as k,L as O,i as z,F as M}from"./main-Cxeu4LhG.js";import{V as P}from"./ViewHeader-B6P-C4GD.js";import{C as $,b as D}from"./Card-rF59wHiO.js";import{I as C}from"./Input-CZmRw5QX.js";import{T as R}from"./Textarea-QuofpMlq.js";import{S as E,a as A}from"./Sheet-BOProMs2.js";import{E as V}from"./EmptyState-D65J5FQN.js";import{T as X}from"./triangle-alert-tUTXbcEP.js";import{E as L}from"./external-link-D5tq2o_I.js";import{R as I}from"./refresh-ccw-DenGBOcq.js";import{P as K}from"./plus-77h62zZm.js";import{T as N}from"./trash-2-Cv7U38jw.js";/**
2
2
  * @license lucide-react v0.460.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- {"version":3,"file":"ArtifactsView-CGclRNnz.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/file-code.js","../../src/web/v8/views/Artifacts/ClaudeArtifactView.tsx","../../src/web/v8/views/Artifacts/ArtifactsView.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst FileCode = createLucideIcon(\"FileCode\", [\n [\"path\", { d: \"M10 12.5 8 15l2 2.5\", key: \"1tg20x\" }],\n [\"path\", { d: \"m14 12.5 2 2.5-2 2.5\", key: \"yinavb\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }],\n [\"path\", { d: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z\", key: \"1mlx9k\" }]\n]);\n\nexport { FileCode as default };\n//# sourceMappingURL=file-code.js.map\n","/**\n * v8/views/Artifacts/ClaudeArtifactView.tsx — v10.1.0.\n *\n * Renders Claude-* kind artifacts (HTML / SVG / React) inside a\n * sandboxed iframe. The server hands us a fully-compiled HTML envelope\n * (returned from GET /api/artifacts/:slug/render) and we drop it into\n * `srcdoc`. The iframe has `sandbox` set so even if a malicious escape\n * slips past server-side filtering, the runtime is still constrained.\n *\n * Two render modes:\n * 1. <iframe srcdoc> — for full-envelope artifacts (default).\n * 2. Plain `<div>` for an `mdx` kind fallback (handled by caller).\n */\n\nimport { useState } from 'react';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { AlertTriangle, ShieldCheck, ExternalLink } from 'lucide-react';\nimport { Button } from '../../ui/controls/Button.js';\n\nexport interface ClaudeRenderPayload {\n slug: string;\n kind: 'claude-html' | 'claude-svg' | 'claude-react' | 'mdx';\n html?: string;\n blocks?: unknown[];\n frontmatter?: Record<string, unknown>;\n warnings?: Array<{ message?: string; pattern?: string }>;\n safeMode?: boolean;\n compiledAt?: string;\n}\n\nexport function ClaudeArtifactView({\n payload,\n slug,\n}: {\n payload: ClaudeRenderPayload;\n slug: string;\n}): JSX.Element {\n const [showSource, setShowSource] = useState(false);\n\n if (payload.kind === 'mdx') {\n // Legacy fallback — the server returns no `html` for mdx; just show\n // the compiled block count.\n return (\n <Card variant=\"default\" data-testid={`claude-view-${slug}`}>\n <CardBody>\n <Inline align=\"center\" gap={2}>\n <ShieldCheck size={14} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Legacy MDX — {Array.isArray(payload.blocks) ? `${payload.blocks.length} blocks` : 'no blocks'}\n </span>\n </Inline>\n </CardBody>\n </Card>\n );\n }\n\n if (!payload.html) {\n return (\n <Card variant=\"default\" data-testid={`claude-view-${slug}`}>\n <CardBody>\n <span role=\"alert\" style={{ color: 'var(--danger)' }}>\n No HTML returned by the compiler.\n </span>\n </CardBody>\n </Card>\n );\n }\n\n return (\n <Stack gap={2} data-testid={`claude-view-${slug}`}>\n {payload.safeMode && (\n <Inline\n align=\"center\"\n gap={2}\n style={{\n padding: 'var(--space-2)',\n background: 'var(--callout-warning-bg, #fdf6e3)',\n border: '1px solid var(--callout-warning-border, #e0c97d)',\n borderRadius: 'var(--radius-sm)',\n fontSize: 'var(--fs-12)',\n }}\n role=\"status\"\n data-testid={`claude-safe-${slug}`}\n >\n <AlertTriangle size={14} aria-hidden style={{ color: '#b58900' }} />\n <span>\n Safe mode — the compiler stripped potentially dangerous\n patterns in this artifact.\n </span>\n </Inline>\n )}\n {payload.warnings && payload.warnings.length > 0 && (\n <details\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n padding: 'var(--space-2)',\n background: 'var(--surface-1)',\n borderRadius: 'var(--radius-sm)',\n }}\n >\n <summary>{payload.warnings.length} warning(s)</summary>\n <ul style={{ marginTop: 'var(--space-1)' }}>\n {payload.warnings.map((w, i) => (\n <li key={i}>\n <code style={{ fontFamily: 'var(--font-mono)' }}>\n {w.pattern}\n </code>{' '}\n — {w.message}\n </li>\n ))}\n </ul>\n </details>\n )}\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)' }}>\n {payload.kind} · compiled {payload.compiledAt ? new Date(payload.compiledAt).toLocaleTimeString() : 'now'}\n </span>\n <Inline gap={1}>\n <Button variant=\"ghost\" onClick={() => setShowSource((v) => !v)} data-testid={`claude-source-${slug}`}>\n {showSource ? 'Hide source' : 'Show source'}\n </Button>\n <a\n href={`/api/artifacts/${slug}/view`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-testid={`claude-blank-${slug}`}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--space-1)',\n fontSize: 'var(--fs-12)',\n padding: 'var(--space-1) var(--space-2)',\n color: 'var(--fg)',\n textDecoration: 'none',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n background: 'var(--surface-0)',\n }}\n >\n <ExternalLink size={12} aria-hidden /> Open in new tab\n </a>\n </Inline>\n </Inline>\n <iframe\n title={`claude-artifact-${slug}`}\n data-testid={`claude-iframe-${slug}`}\n sandbox=\"allow-scripts allow-same-origin\"\n srcDoc={payload.html}\n style={{\n width: '100%',\n height: 480,\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n background: 'white',\n }}\n />\n {showSource && (\n <pre\n data-testid={`claude-source-text-${slug}`}\n style={{\n padding: 'var(--space-2)',\n background: 'var(--surface-1)',\n borderRadius: 'var(--radius-sm)',\n fontSize: 'var(--fs-11)',\n maxHeight: 320,\n overflow: 'auto',\n fontFamily: 'var(--font-mono)',\n whiteSpace: 'pre-wrap',\n }}\n >\n {payload.html}\n </pre>\n )}\n </Stack>\n );\n}","/**\n * v8/views/Artifacts/ArtifactsView.tsx — Sprint S43, v9.3.0 → v10.1.0\n * (Claude Artifacts swap).\n *\n * Artifacts list (GET /api/artifacts) with per-row open-to-detail\n * (right-hand Sheet using GET /api/artifacts/:slug + /render) and\n * inline-confirm Delete (DELETE /api/artifacts/:slug). Add Sheet\n * posts a new artifact (POST /api/artifacts {slug, kind, source, ...}).\n *\n * v10.1.0 — Detail panel dispatches by `kind`:\n * - claude-html / claude-svg / claude-react → sandboxed iframe\n * via <ClaudeArtifactView>\n * - mdx → legacy block-renderer fallback\n *\n * The AddForm gains a `kind` dropdown + a textarea bound to `source`;\n * the textarea defaults to the kind-specific starting template.\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Layers, Plus, Trash2, RefreshCcw, FileCode, ExternalLink } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Textarea } from '../../ui/controls/Textarea.js';\nimport { Sheet, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport { ClaudeArtifactView, type ClaudeRenderPayload } from './ClaudeArtifactView.js';\n\ninterface Artifact {\n slug: string;\n title?: string;\n kind?: 'mdx' | 'claude-html' | 'claude-svg' | 'claude-react';\n description?: string;\n createdAt?: string | number;\n updatedAt?: string | number;\n planMdx?: string;\n source?: string;\n frontmatter?: Record<string, unknown>;\n}\n\nexport function ArtifactsView(): JSX.Element {\n const payload = useFetch<{ artifacts: Artifact[] }>('/api/artifacts');\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [adding, setAdding] = useState<boolean>(false);\n const [activeSlug, setActiveSlug] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const artifacts = useMemo<Artifact[]>(() => payload.data?.artifacts ?? [], [payload.data]);\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n\n const drop = async (slug: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/artifacts/${slug}`, { method: 'DELETE' });\n setConfirmDelete(null);\n if (activeSlug === slug) setActiveSlug(null);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n return (\n <Stack gap={4} data-testid=\"artifacts-view\">\n <ViewHeader\n title=\"Artifacts\"\n description=\"Generated artifacts (plans, diagrams, canvases).\"\n actions={\n <Inline align=\"center\" gap={2}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"artifacts-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"artifacts-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"primary\" onClick={() => setAdding(true)} data-testid=\"artifacts-add\">\n <Plus size={14} aria-hidden /> Add\n </Button>\n </Inline>\n }\n />\n\n <Card variant=\"default\">\n <CardBody>\n {payload.loading && artifacts.length === 0 ? (\n <Stack gap={1}>\n <Skeleton style={{ height: 48 }} />\n <Skeleton style={{ height: 48 }} />\n </Stack>\n ) : artifacts.length === 0 ? (\n <EmptyState icon={<Layers size={28} aria-hidden />} title=\"No artifacts\" description=\"Create one to get started.\" />\n ) : (\n <Stack gap={1}>\n {artifacts.map((a) => {\n const isConfirming = confirmDelete === a.slug;\n return (\n <div\n key={a.slug}\n data-testid={`artifact-row-${a.slug}`}\n style={{ padding: 'var(--space-2)', border: '1px solid var(--border)', borderRadius: 'var(--radius-sm)' }}\n >\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Stack gap={0} style={{ minWidth: 0, flex: 1 }}>\n <Inline align=\"center\" gap={2}>\n <FileCode size={12} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <strong style={{ fontSize: 'var(--fs-13)' }}>{a.title || a.slug}</strong>\n <code style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{a.slug}</code>\n {a.kind && <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)' }}>· {a.kind}</span>}\n </Inline>\n {a.description && <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{a.description}</span>}\n </Stack>\n <Inline gap={1}>\n <Button variant=\"ghost\" onClick={() => setActiveSlug((cur) => (cur === a.slug ? null : a.slug))} data-testid={`artifact-open-${a.slug}`} aria-label={`Open ${a.slug}`}>\n <ExternalLink size={14} aria-hidden /> Open\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete((cur) => (cur === a.slug ? null : a.slug))} data-testid={`artifact-delete-${a.slug}`} aria-label={`Delete ${a.slug}`}>\n <Trash2 size={14} aria-hidden />\n </Button>\n </Inline>\n </Inline>\n {isConfirming && (\n <Inline gap={1} style={{ marginTop: 'var(--space-1)' }}>\n <Button variant=\"danger\" onClick={() => void drop(a.slug)} data-testid={`artifact-confirm-delete-${a.slug}`}>\n Confirm delete\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete(null)}>Cancel</Button>\n </Inline>\n )}\n </div>\n );\n })}\n </Stack>\n )}\n </CardBody>\n </Card>\n\n <Sheet open={adding} onOpenChange={setAdding}>\n <SheetContent side=\"right\" title=\"Add artifact\" description=\"Slug + kind + initial source.\">\n <AddForm\n onSubmit={async (body) => {\n await fetchJson('/api/artifacts', { method: 'POST', body });\n setAdding(false);\n refresh();\n }}\n onCancel={() => setAdding(false)}\n />\n </SheetContent>\n </Sheet>\n\n <Sheet open={activeSlug !== null} onOpenChange={(open) => { if (!open) setActiveSlug(null); }}>\n <SheetContent side=\"right\" title={activeSlug ?? ''} description=\"Artifact detail\">\n {activeSlug !== null && <ArtifactDetail slug={activeSlug} refresh={refresh} />}\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}\n\nfunction AddForm({\n onSubmit,\n onCancel,\n}: {\n onSubmit: (body: { slug: string; title?: string; description?: string; kind?: string; source?: string; planMdx?: string }) => Promise<void>;\n onCancel: () => void;\n}): JSX.Element {\n const [slug, setSlug] = useState<string>('');\n const [title, setTitle] = useState<string>('');\n const [description, setDescription] = useState<string>('');\n const [kind, setKind] = useState<'mdx' | 'claude-html' | 'claude-svg' | 'claude-react'>('claude-html');\n const [source, setSource] = useState<string>(KIND_TEMPLATES['claude-html']);\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n // When the user changes kind, swap the textarea content to a starter\n // template for that kind. They can still edit further.\n const onKindChange = (next: 'mdx' | 'claude-html' | 'claude-svg' | 'claude-react'): void => {\n setKind(next);\n setSource(KIND_TEMPLATES[next]);\n };\n\n return (\n <Stack gap={3} style={{ padding: 'var(--space-4)' }}>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Slug</span>\n <Input value={slug} onChange={(e) => setSlug((e.target as HTMLInputElement).value)} data-testid=\"artifact-form-slug\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Title</span>\n <Input value={title} onChange={(e) => setTitle((e.target as HTMLInputElement).value)} data-testid=\"artifact-form-title\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Description</span>\n <Input value={description} onChange={(e) => setDescription((e.target as HTMLInputElement).value)} data-testid=\"artifact-form-description\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Kind</span>\n <select\n value={kind}\n onChange={(e) => onKindChange(e.target.value as typeof kind)}\n data-testid=\"artifact-form-kind\"\n style={{\n fontFamily: 'inherit',\n fontSize: 'var(--fs-12)',\n padding: 'var(--space-2)',\n background: 'var(--surface-0)',\n color: 'var(--fg)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n }}\n >\n <option value=\"claude-html\">Claude HTML</option>\n <option value=\"claude-svg\">Claude SVG</option>\n <option value=\"claude-react\">Claude React (JSX)</option>\n <option value=\"mdx\">Legacy MDX (glyphs)</option>\n </select>\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {kind === 'mdx' ? 'Plan MDX' : 'Source'}\n </span>\n <Textarea\n value={source}\n rows={kind === 'claude-react' ? 10 : 6}\n onChange={(e) => setSource((e.target as HTMLTextAreaElement).value)}\n data-testid={kind === 'mdx' ? 'artifact-form-mdx' : 'artifact-form-source'}\n />\n </label>\n {error !== null && <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>}\n <Inline justify=\"end\" gap={2}>\n <Button variant=\"ghost\" onClick={onCancel}>Cancel</Button>\n <Button\n variant=\"primary\"\n disabled={busy || !slug.trim()}\n data-testid=\"artifact-form-submit\"\n onClick={async () => {\n setBusy(true);\n setError(null);\n try {\n const body: { slug: string; title?: string; description?: string; kind: typeof kind; source?: string; planMdx?: string } = {\n slug: slug.trim(),\n title: title.trim() || undefined,\n description: description.trim() || undefined,\n kind,\n };\n if (source) {\n if (kind === 'mdx') body.planMdx = source; else body.source = source;\n }\n await onSubmit(body);\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n setBusy(false);\n }\n }}\n >\n {busy ? 'Creating…' : 'Create'}\n </Button>\n </Inline>\n </Stack>\n );\n}\n\nconst KIND_TEMPLATES: Record<'mdx' | 'claude-html' | 'claude-svg' | 'claude-react', string> = {\n mdx: '# Hello\\n\\nAdd some MDX here.',\n 'claude-html': '<!doctype html>\\n<h1 style=\"font-family:system-ui\">Hello artifact</h1>\\n<p>Edit me — click <em>Open</em> to preview.</p>',\n 'claude-svg': '<svg viewBox=\"0 0 100 100\" width=\"200\" height=\"200\">\\n <circle cx=\"50\" cy=\"50\" r=\"40\" fill=\"#0b66c3\"/>\\n <text x=\"50\" y=\"55\" text-anchor=\"middle\" fill=\"white\" font-size=\"14\">SVG</text>\\n</svg>',\n 'claude-react': 'export default function App() {\\n const [n, setN] = React.useState(0);\\n return (\\n <div style={{ fontFamily: \"system-ui\", padding: 16 }}>\\n <h1>Hello</h1>\\n <button onClick={() => setN(n + 1)}>clicked {n}</button>\\n </div>\\n );\\n}',\n};\n\nfunction ArtifactDetail({ slug, refresh }: { slug: string; refresh: () => void }): JSX.Element {\n const payload = useFetch<Artifact>(`/api/artifacts/${slug}`);\n const renderPayload = useFetch<ClaudeRenderPayload>(`/api/artifacts/${slug}/render`);\n const kind = payload.data?.kind || 'mdx';\n const isClaude = kind === 'claude-html' || kind === 'claude-svg' || kind === 'claude-react';\n\n return (\n <Stack gap={2} style={{ padding: 'var(--space-4)' }}>\n {payload.loading && !payload.data ? (\n <Skeleton style={{ height: 80 }} />\n ) : payload.data ? (\n <Stack gap={2}>\n <Inline align=\"center\" gap={2}>\n <strong>{payload.data.title || payload.data.slug}</strong>\n <code style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{payload.data.slug}</code>\n <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)' }}>· {kind}</span>\n </Inline>\n {payload.data.description && <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{payload.data.description}</span>}\n\n {/* Claude-* kinds render in a sandboxed iframe via the new\n <ClaudeArtifactView>. The server compiles the source on\n demand and returns iframe-ready HTML (srcdoc). */}\n {isClaude && (\n renderPayload.data ? (\n <ClaudeArtifactView payload={renderPayload.data} slug={slug} />\n ) : (\n <Skeleton style={{ height: 200 }} />\n )\n )}\n\n {/* Legacy MDX path keeps the original block-count summary. */}\n {!isClaude && renderPayload.data && (\n <span data-testid={`artifact-render-${slug}`} style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Render: {Array.isArray(renderPayload.data.blocks) ? `${renderPayload.data.blocks.length} blocks` : 'no blocks'}\n </span>\n )}\n\n {/* Inline editor — kind switch + textarea + save. */}\n <Editor payload={payload.data} slug={slug} onSaved={() => { void payload.refetch(); void renderPayload.refetch(); refresh(); }} />\n </Stack>\n ) : (\n <span role=\"alert\" style={{ color: 'var(--danger)' }}>Not found</span>\n )}\n </Stack>\n );\n}\n\n/**\n * Inline editor: lets the user change the kind, edit the body, and\n * save via PUT /api/artifacts/:slug. After save we re-fetch both the\n * artifact + the compiled render so the iframe updates with the new\n * source on the next paint.\n */\nfunction Editor({\n payload,\n slug,\n onSaved,\n}: {\n payload: Artifact;\n slug: string;\n onSaved: () => void;\n}): JSX.Element {\n const initial = payload.source ?? payload.planMdx ?? '';\n const [editKind, setEditKind] = useState<typeof payload.kind>(payload.kind || 'mdx');\n const [editSource, setEditSource] = useState<string>(initial);\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const [open, setOpen] = useState<boolean>(false);\n\n // Sync the textarea when the underlying artifact changes (e.g. when\n // the user opens a different slug in the same Sheet).\n useEffect(() => {\n setEditKind(payload.kind || 'mdx');\n setEditSource(payload.source ?? payload.planMdx ?? '');\n }, [payload.slug, payload.source, payload.planMdx, payload.kind]);\n\n const dirty =\n editKind !== (payload.kind || 'mdx') || editSource !== (payload.source ?? payload.planMdx ?? '');\n\n const save = async (): Promise<void> => {\n setBusy(true);\n setError(null);\n try {\n await fetchJson(`/api/artifacts/${slug}`, {\n method: 'PUT',\n body: {\n kind: editKind,\n source: editKind === 'mdx' ? undefined : editSource,\n planMdx: editKind === 'mdx' ? editSource : undefined,\n },\n });\n onSaved();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Stack gap={1} data-testid={`artifact-editor-${slug}`}>\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Button variant=\"ghost\" onClick={() => setOpen((v) => !v)} data-testid={`artifact-edit-toggle-${slug}`}>\n {open ? 'Close editor' : 'Edit'}\n </Button>\n {dirty && (\n <span style={{ fontSize: 'var(--fs-11)', color: 'var(--callout-warning-fg, #b58900)' }}>\n Unsaved changes\n </span>\n )}\n </Inline>\n {open && (\n <Stack gap={2}>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Kind</span>\n <select\n value={editKind}\n onChange={(e) => setEditKind(e.target.value as typeof editKind)}\n data-testid={`artifact-edit-kind-${slug}`}\n style={{\n fontFamily: 'inherit',\n fontSize: 'var(--fs-12)',\n padding: 'var(--space-2)',\n background: 'var(--surface-0)',\n color: 'var(--fg)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n }}\n >\n <option value=\"claude-html\">Claude HTML</option>\n <option value=\"claude-svg\">Claude SVG</option>\n <option value=\"claude-react\">Claude React (JSX)</option>\n <option value=\"mdx\">Legacy MDX</option>\n </select>\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {editKind === 'mdx' ? 'Plan MDX' : 'Source'}\n </span>\n <Textarea\n value={editSource}\n rows={editKind === 'claude-react' ? 12 : 8}\n onChange={(e) => setEditSource((e.target as HTMLTextAreaElement).value)}\n data-testid={`artifact-edit-source-${slug}`}\n />\n </label>\n {error !== null && (\n <span role=\"alert\" data-testid={`artifact-edit-error-${slug}`} style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n <Inline gap={1}>\n <Button\n variant=\"primary\"\n disabled={busy || !dirty}\n onClick={() => void save()}\n data-testid={`artifact-edit-save-${slug}`}\n >\n {busy ? 'Saving…' : 'Save'}\n </Button>\n <Button\n variant=\"ghost\"\n disabled={busy || !dirty}\n onClick={() => {\n setEditKind(payload.kind || 'mdx');\n setEditSource(payload.source ?? payload.planMdx ?? '');\n setError(null);\n }}\n data-testid={`artifact-edit-revert-${slug}`}\n >\n Revert\n </Button>\n </Inline>\n </Stack>\n )}\n </Stack>\n );\n}"],"names":["FileCode","createLucideIcon","ClaudeArtifactView","payload","slug","showSource","setShowSource","useState","jsx","Card","CardBody","jsxs","Inline","ShieldCheck","Stack","AlertTriangle","w","i","Button","v","ExternalLink","ArtifactsView","useFetch","confirmDelete","setConfirmDelete","adding","setAdding","activeSlug","setActiveSlug","error","setError","artifacts","useMemo","_a","refresh","useCallback","drop","fetchJson","err","FetchError","ViewHeader","RefreshCcw","Plus","Skeleton","EmptyState","Layers","isConfirming","cur","Trash2","Sheet","SheetContent","AddForm","body","open","ArtifactDetail","onSubmit","onCancel","setSlug","title","setTitle","description","setDescription","kind","setKind","source","setSource","KIND_TEMPLATES","busy","setBusy","onKindChange","next","Input","e","Textarea","renderPayload","isClaude","Editor","onSaved","initial","editKind","setEditKind","editSource","setEditSource","setOpen","useEffect","dirty","save"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"ArtifactsView-znhN8GTR.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/file-code.js","../../src/web/v8/views/Artifacts/ClaudeArtifactView.tsx","../../src/web/v8/views/Artifacts/ArtifactsView.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst FileCode = createLucideIcon(\"FileCode\", [\n [\"path\", { d: \"M10 12.5 8 15l2 2.5\", key: \"1tg20x\" }],\n [\"path\", { d: \"m14 12.5 2 2.5-2 2.5\", key: \"yinavb\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }],\n [\"path\", { d: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z\", key: \"1mlx9k\" }]\n]);\n\nexport { FileCode as default };\n//# sourceMappingURL=file-code.js.map\n","/**\n * v8/views/Artifacts/ClaudeArtifactView.tsx — v10.1.0.\n *\n * Renders Claude-* kind artifacts (HTML / SVG / React) inside a\n * sandboxed iframe. The server hands us a fully-compiled HTML envelope\n * (returned from GET /api/artifacts/:slug/render) and we drop it into\n * `srcdoc`. The iframe has `sandbox` set so even if a malicious escape\n * slips past server-side filtering, the runtime is still constrained.\n *\n * Two render modes:\n * 1. <iframe srcdoc> — for full-envelope artifacts (default).\n * 2. Plain `<div>` for an `mdx` kind fallback (handled by caller).\n */\n\nimport { useState } from 'react';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { AlertTriangle, ShieldCheck, ExternalLink } from 'lucide-react';\nimport { Button } from '../../ui/controls/Button.js';\n\nexport interface ClaudeRenderPayload {\n slug: string;\n kind: 'claude-html' | 'claude-svg' | 'claude-react' | 'mdx';\n html?: string;\n blocks?: unknown[];\n frontmatter?: Record<string, unknown>;\n warnings?: Array<{ message?: string; pattern?: string }>;\n safeMode?: boolean;\n compiledAt?: string;\n}\n\nexport function ClaudeArtifactView({\n payload,\n slug,\n}: {\n payload: ClaudeRenderPayload;\n slug: string;\n}): JSX.Element {\n const [showSource, setShowSource] = useState(false);\n\n if (payload.kind === 'mdx') {\n // Legacy fallback — the server returns no `html` for mdx; just show\n // the compiled block count.\n return (\n <Card variant=\"default\" data-testid={`claude-view-${slug}`}>\n <CardBody>\n <Inline align=\"center\" gap={2}>\n <ShieldCheck size={14} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Legacy MDX — {Array.isArray(payload.blocks) ? `${payload.blocks.length} blocks` : 'no blocks'}\n </span>\n </Inline>\n </CardBody>\n </Card>\n );\n }\n\n if (!payload.html) {\n return (\n <Card variant=\"default\" data-testid={`claude-view-${slug}`}>\n <CardBody>\n <span role=\"alert\" style={{ color: 'var(--danger)' }}>\n No HTML returned by the compiler.\n </span>\n </CardBody>\n </Card>\n );\n }\n\n return (\n <Stack gap={2} data-testid={`claude-view-${slug}`}>\n {payload.safeMode && (\n <Inline\n align=\"center\"\n gap={2}\n style={{\n padding: 'var(--space-2)',\n background: 'var(--callout-warning-bg, #fdf6e3)',\n border: '1px solid var(--callout-warning-border, #e0c97d)',\n borderRadius: 'var(--radius-sm)',\n fontSize: 'var(--fs-12)',\n }}\n role=\"status\"\n data-testid={`claude-safe-${slug}`}\n >\n <AlertTriangle size={14} aria-hidden style={{ color: '#b58900' }} />\n <span>\n Safe mode — the compiler stripped potentially dangerous\n patterns in this artifact.\n </span>\n </Inline>\n )}\n {payload.warnings && payload.warnings.length > 0 && (\n <details\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n padding: 'var(--space-2)',\n background: 'var(--surface-1)',\n borderRadius: 'var(--radius-sm)',\n }}\n >\n <summary>{payload.warnings.length} warning(s)</summary>\n <ul style={{ marginTop: 'var(--space-1)' }}>\n {payload.warnings.map((w, i) => (\n <li key={i}>\n <code style={{ fontFamily: 'var(--font-mono)' }}>\n {w.pattern}\n </code>{' '}\n — {w.message}\n </li>\n ))}\n </ul>\n </details>\n )}\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)' }}>\n {payload.kind} · compiled {payload.compiledAt ? new Date(payload.compiledAt).toLocaleTimeString() : 'now'}\n </span>\n <Inline gap={1}>\n <Button variant=\"ghost\" onClick={() => setShowSource((v) => !v)} data-testid={`claude-source-${slug}`}>\n {showSource ? 'Hide source' : 'Show source'}\n </Button>\n <a\n href={`/api/artifacts/${slug}/view`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-testid={`claude-blank-${slug}`}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--space-1)',\n fontSize: 'var(--fs-12)',\n padding: 'var(--space-1) var(--space-2)',\n color: 'var(--fg)',\n textDecoration: 'none',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n background: 'var(--surface-0)',\n }}\n >\n <ExternalLink size={12} aria-hidden /> Open in new tab\n </a>\n </Inline>\n </Inline>\n <iframe\n title={`claude-artifact-${slug}`}\n data-testid={`claude-iframe-${slug}`}\n sandbox=\"allow-scripts allow-same-origin\"\n srcDoc={payload.html}\n style={{\n width: '100%',\n height: 480,\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n background: 'white',\n }}\n />\n {showSource && (\n <pre\n data-testid={`claude-source-text-${slug}`}\n style={{\n padding: 'var(--space-2)',\n background: 'var(--surface-1)',\n borderRadius: 'var(--radius-sm)',\n fontSize: 'var(--fs-11)',\n maxHeight: 320,\n overflow: 'auto',\n fontFamily: 'var(--font-mono)',\n whiteSpace: 'pre-wrap',\n }}\n >\n {payload.html}\n </pre>\n )}\n </Stack>\n );\n}","/**\n * v8/views/Artifacts/ArtifactsView.tsx — Sprint S43, v9.3.0 → v10.1.0\n * (Claude Artifacts swap).\n *\n * Artifacts list (GET /api/artifacts) with per-row open-to-detail\n * (right-hand Sheet using GET /api/artifacts/:slug + /render) and\n * inline-confirm Delete (DELETE /api/artifacts/:slug). Add Sheet\n * posts a new artifact (POST /api/artifacts {slug, kind, source, ...}).\n *\n * v10.1.0 — Detail panel dispatches by `kind`:\n * - claude-html / claude-svg / claude-react → sandboxed iframe\n * via <ClaudeArtifactView>\n * - mdx → legacy block-renderer fallback\n *\n * The AddForm gains a `kind` dropdown + a textarea bound to `source`;\n * the textarea defaults to the kind-specific starting template.\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Layers, Plus, Trash2, RefreshCcw, FileCode, ExternalLink } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Textarea } from '../../ui/controls/Textarea.js';\nimport { Sheet, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport { ClaudeArtifactView, type ClaudeRenderPayload } from './ClaudeArtifactView.js';\n\ninterface Artifact {\n slug: string;\n title?: string;\n kind?: 'mdx' | 'claude-html' | 'claude-svg' | 'claude-react';\n description?: string;\n createdAt?: string | number;\n updatedAt?: string | number;\n planMdx?: string;\n source?: string;\n frontmatter?: Record<string, unknown>;\n}\n\nexport function ArtifactsView(): JSX.Element {\n const payload = useFetch<{ artifacts: Artifact[] }>('/api/artifacts');\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [adding, setAdding] = useState<boolean>(false);\n const [activeSlug, setActiveSlug] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const artifacts = useMemo<Artifact[]>(() => payload.data?.artifacts ?? [], [payload.data]);\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n\n const drop = async (slug: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/artifacts/${slug}`, { method: 'DELETE' });\n setConfirmDelete(null);\n if (activeSlug === slug) setActiveSlug(null);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n return (\n <Stack gap={4} data-testid=\"artifacts-view\">\n <ViewHeader\n title=\"Artifacts\"\n description=\"Generated artifacts (plans, diagrams, canvases).\"\n actions={\n <Inline align=\"center\" gap={2}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"artifacts-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"artifacts-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"primary\" onClick={() => setAdding(true)} data-testid=\"artifacts-add\">\n <Plus size={14} aria-hidden /> Add\n </Button>\n </Inline>\n }\n />\n\n <Card variant=\"default\">\n <CardBody>\n {payload.loading && artifacts.length === 0 ? (\n <Stack gap={1}>\n <Skeleton style={{ height: 48 }} />\n <Skeleton style={{ height: 48 }} />\n </Stack>\n ) : artifacts.length === 0 ? (\n <EmptyState icon={<Layers size={28} aria-hidden />} title=\"No artifacts\" description=\"Create one to get started.\" />\n ) : (\n <Stack gap={1}>\n {artifacts.map((a) => {\n const isConfirming = confirmDelete === a.slug;\n return (\n <div\n key={a.slug}\n data-testid={`artifact-row-${a.slug}`}\n style={{ padding: 'var(--space-2)', border: '1px solid var(--border)', borderRadius: 'var(--radius-sm)' }}\n >\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Stack gap={0} style={{ minWidth: 0, flex: 1 }}>\n <Inline align=\"center\" gap={2}>\n <FileCode size={12} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <strong style={{ fontSize: 'var(--fs-13)' }}>{a.title || a.slug}</strong>\n <code style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{a.slug}</code>\n {a.kind && <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)' }}>· {a.kind}</span>}\n </Inline>\n {a.description && <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{a.description}</span>}\n </Stack>\n <Inline gap={1}>\n <Button variant=\"ghost\" onClick={() => setActiveSlug((cur) => (cur === a.slug ? null : a.slug))} data-testid={`artifact-open-${a.slug}`} aria-label={`Open ${a.slug}`}>\n <ExternalLink size={14} aria-hidden /> Open\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete((cur) => (cur === a.slug ? null : a.slug))} data-testid={`artifact-delete-${a.slug}`} aria-label={`Delete ${a.slug}`}>\n <Trash2 size={14} aria-hidden />\n </Button>\n </Inline>\n </Inline>\n {isConfirming && (\n <Inline gap={1} style={{ marginTop: 'var(--space-1)' }}>\n <Button variant=\"danger\" onClick={() => void drop(a.slug)} data-testid={`artifact-confirm-delete-${a.slug}`}>\n Confirm delete\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete(null)}>Cancel</Button>\n </Inline>\n )}\n </div>\n );\n })}\n </Stack>\n )}\n </CardBody>\n </Card>\n\n <Sheet open={adding} onOpenChange={setAdding}>\n <SheetContent side=\"right\" title=\"Add artifact\" description=\"Slug + kind + initial source.\">\n <AddForm\n onSubmit={async (body) => {\n await fetchJson('/api/artifacts', { method: 'POST', body });\n setAdding(false);\n refresh();\n }}\n onCancel={() => setAdding(false)}\n />\n </SheetContent>\n </Sheet>\n\n <Sheet open={activeSlug !== null} onOpenChange={(open) => { if (!open) setActiveSlug(null); }}>\n <SheetContent side=\"right\" title={activeSlug ?? ''} description=\"Artifact detail\">\n {activeSlug !== null && <ArtifactDetail slug={activeSlug} refresh={refresh} />}\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}\n\nfunction AddForm({\n onSubmit,\n onCancel,\n}: {\n onSubmit: (body: { slug: string; title?: string; description?: string; kind?: string; source?: string; planMdx?: string }) => Promise<void>;\n onCancel: () => void;\n}): JSX.Element {\n const [slug, setSlug] = useState<string>('');\n const [title, setTitle] = useState<string>('');\n const [description, setDescription] = useState<string>('');\n const [kind, setKind] = useState<'mdx' | 'claude-html' | 'claude-svg' | 'claude-react'>('claude-html');\n const [source, setSource] = useState<string>(KIND_TEMPLATES['claude-html']);\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n // When the user changes kind, swap the textarea content to a starter\n // template for that kind. They can still edit further.\n const onKindChange = (next: 'mdx' | 'claude-html' | 'claude-svg' | 'claude-react'): void => {\n setKind(next);\n setSource(KIND_TEMPLATES[next]);\n };\n\n return (\n <Stack gap={3} style={{ padding: 'var(--space-4)' }}>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Slug</span>\n <Input value={slug} onChange={(e) => setSlug((e.target as HTMLInputElement).value)} data-testid=\"artifact-form-slug\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Title</span>\n <Input value={title} onChange={(e) => setTitle((e.target as HTMLInputElement).value)} data-testid=\"artifact-form-title\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Description</span>\n <Input value={description} onChange={(e) => setDescription((e.target as HTMLInputElement).value)} data-testid=\"artifact-form-description\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Kind</span>\n <select\n value={kind}\n onChange={(e) => onKindChange(e.target.value as typeof kind)}\n data-testid=\"artifact-form-kind\"\n style={{\n fontFamily: 'inherit',\n fontSize: 'var(--fs-12)',\n padding: 'var(--space-2)',\n background: 'var(--surface-0)',\n color: 'var(--fg)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n }}\n >\n <option value=\"claude-html\">Claude HTML</option>\n <option value=\"claude-svg\">Claude SVG</option>\n <option value=\"claude-react\">Claude React (JSX)</option>\n <option value=\"mdx\">Legacy MDX (glyphs)</option>\n </select>\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {kind === 'mdx' ? 'Plan MDX' : 'Source'}\n </span>\n <Textarea\n value={source}\n rows={kind === 'claude-react' ? 10 : 6}\n onChange={(e) => setSource((e.target as HTMLTextAreaElement).value)}\n data-testid={kind === 'mdx' ? 'artifact-form-mdx' : 'artifact-form-source'}\n />\n </label>\n {error !== null && <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>}\n <Inline justify=\"end\" gap={2}>\n <Button variant=\"ghost\" onClick={onCancel}>Cancel</Button>\n <Button\n variant=\"primary\"\n disabled={busy || !slug.trim()}\n data-testid=\"artifact-form-submit\"\n onClick={async () => {\n setBusy(true);\n setError(null);\n try {\n const body: { slug: string; title?: string; description?: string; kind: typeof kind; source?: string; planMdx?: string } = {\n slug: slug.trim(),\n title: title.trim() || undefined,\n description: description.trim() || undefined,\n kind,\n };\n if (source) {\n if (kind === 'mdx') body.planMdx = source; else body.source = source;\n }\n await onSubmit(body);\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n setBusy(false);\n }\n }}\n >\n {busy ? 'Creating…' : 'Create'}\n </Button>\n </Inline>\n </Stack>\n );\n}\n\nconst KIND_TEMPLATES: Record<'mdx' | 'claude-html' | 'claude-svg' | 'claude-react', string> = {\n mdx: '# Hello\\n\\nAdd some MDX here.',\n 'claude-html': '<!doctype html>\\n<h1 style=\"font-family:system-ui\">Hello artifact</h1>\\n<p>Edit me — click <em>Open</em> to preview.</p>',\n 'claude-svg': '<svg viewBox=\"0 0 100 100\" width=\"200\" height=\"200\">\\n <circle cx=\"50\" cy=\"50\" r=\"40\" fill=\"#0b66c3\"/>\\n <text x=\"50\" y=\"55\" text-anchor=\"middle\" fill=\"white\" font-size=\"14\">SVG</text>\\n</svg>',\n 'claude-react': 'export default function App() {\\n const [n, setN] = React.useState(0);\\n return (\\n <div style={{ fontFamily: \"system-ui\", padding: 16 }}>\\n <h1>Hello</h1>\\n <button onClick={() => setN(n + 1)}>clicked {n}</button>\\n </div>\\n );\\n}',\n};\n\nfunction ArtifactDetail({ slug, refresh }: { slug: string; refresh: () => void }): JSX.Element {\n const payload = useFetch<Artifact>(`/api/artifacts/${slug}`);\n const renderPayload = useFetch<ClaudeRenderPayload>(`/api/artifacts/${slug}/render`);\n const kind = payload.data?.kind || 'mdx';\n const isClaude = kind === 'claude-html' || kind === 'claude-svg' || kind === 'claude-react';\n\n return (\n <Stack gap={2} style={{ padding: 'var(--space-4)' }}>\n {payload.loading && !payload.data ? (\n <Skeleton style={{ height: 80 }} />\n ) : payload.data ? (\n <Stack gap={2}>\n <Inline align=\"center\" gap={2}>\n <strong>{payload.data.title || payload.data.slug}</strong>\n <code style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{payload.data.slug}</code>\n <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)' }}>· {kind}</span>\n </Inline>\n {payload.data.description && <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{payload.data.description}</span>}\n\n {/* Claude-* kinds render in a sandboxed iframe via the new\n <ClaudeArtifactView>. The server compiles the source on\n demand and returns iframe-ready HTML (srcdoc). */}\n {isClaude && (\n renderPayload.data ? (\n <ClaudeArtifactView payload={renderPayload.data} slug={slug} />\n ) : (\n <Skeleton style={{ height: 200 }} />\n )\n )}\n\n {/* Legacy MDX path keeps the original block-count summary. */}\n {!isClaude && renderPayload.data && (\n <span data-testid={`artifact-render-${slug}`} style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Render: {Array.isArray(renderPayload.data.blocks) ? `${renderPayload.data.blocks.length} blocks` : 'no blocks'}\n </span>\n )}\n\n {/* Inline editor — kind switch + textarea + save. */}\n <Editor payload={payload.data} slug={slug} onSaved={() => { void payload.refetch(); void renderPayload.refetch(); refresh(); }} />\n </Stack>\n ) : (\n <span role=\"alert\" style={{ color: 'var(--danger)' }}>Not found</span>\n )}\n </Stack>\n );\n}\n\n/**\n * Inline editor: lets the user change the kind, edit the body, and\n * save via PUT /api/artifacts/:slug. After save we re-fetch both the\n * artifact + the compiled render so the iframe updates with the new\n * source on the next paint.\n */\nfunction Editor({\n payload,\n slug,\n onSaved,\n}: {\n payload: Artifact;\n slug: string;\n onSaved: () => void;\n}): JSX.Element {\n const initial = payload.source ?? payload.planMdx ?? '';\n const [editKind, setEditKind] = useState<typeof payload.kind>(payload.kind || 'mdx');\n const [editSource, setEditSource] = useState<string>(initial);\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const [open, setOpen] = useState<boolean>(false);\n\n // Sync the textarea when the underlying artifact changes (e.g. when\n // the user opens a different slug in the same Sheet).\n useEffect(() => {\n setEditKind(payload.kind || 'mdx');\n setEditSource(payload.source ?? payload.planMdx ?? '');\n }, [payload.slug, payload.source, payload.planMdx, payload.kind]);\n\n const dirty =\n editKind !== (payload.kind || 'mdx') || editSource !== (payload.source ?? payload.planMdx ?? '');\n\n const save = async (): Promise<void> => {\n setBusy(true);\n setError(null);\n try {\n await fetchJson(`/api/artifacts/${slug}`, {\n method: 'PUT',\n body: {\n kind: editKind,\n source: editKind === 'mdx' ? undefined : editSource,\n planMdx: editKind === 'mdx' ? editSource : undefined,\n },\n });\n onSaved();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Stack gap={1} data-testid={`artifact-editor-${slug}`}>\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Button variant=\"ghost\" onClick={() => setOpen((v) => !v)} data-testid={`artifact-edit-toggle-${slug}`}>\n {open ? 'Close editor' : 'Edit'}\n </Button>\n {dirty && (\n <span style={{ fontSize: 'var(--fs-11)', color: 'var(--callout-warning-fg, #b58900)' }}>\n Unsaved changes\n </span>\n )}\n </Inline>\n {open && (\n <Stack gap={2}>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Kind</span>\n <select\n value={editKind}\n onChange={(e) => setEditKind(e.target.value as typeof editKind)}\n data-testid={`artifact-edit-kind-${slug}`}\n style={{\n fontFamily: 'inherit',\n fontSize: 'var(--fs-12)',\n padding: 'var(--space-2)',\n background: 'var(--surface-0)',\n color: 'var(--fg)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n }}\n >\n <option value=\"claude-html\">Claude HTML</option>\n <option value=\"claude-svg\">Claude SVG</option>\n <option value=\"claude-react\">Claude React (JSX)</option>\n <option value=\"mdx\">Legacy MDX</option>\n </select>\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {editKind === 'mdx' ? 'Plan MDX' : 'Source'}\n </span>\n <Textarea\n value={editSource}\n rows={editKind === 'claude-react' ? 12 : 8}\n onChange={(e) => setEditSource((e.target as HTMLTextAreaElement).value)}\n data-testid={`artifact-edit-source-${slug}`}\n />\n </label>\n {error !== null && (\n <span role=\"alert\" data-testid={`artifact-edit-error-${slug}`} style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n <Inline gap={1}>\n <Button\n variant=\"primary\"\n disabled={busy || !dirty}\n onClick={() => void save()}\n data-testid={`artifact-edit-save-${slug}`}\n >\n {busy ? 'Saving…' : 'Save'}\n </Button>\n <Button\n variant=\"ghost\"\n disabled={busy || !dirty}\n onClick={() => {\n setEditKind(payload.kind || 'mdx');\n setEditSource(payload.source ?? payload.planMdx ?? '');\n setError(null);\n }}\n data-testid={`artifact-edit-revert-${slug}`}\n >\n Revert\n </Button>\n </Inline>\n </Stack>\n )}\n </Stack>\n );\n}"],"names":["FileCode","createLucideIcon","ClaudeArtifactView","payload","slug","showSource","setShowSource","useState","jsx","Card","CardBody","jsxs","Inline","ShieldCheck","Stack","AlertTriangle","w","i","Button","v","ExternalLink","ArtifactsView","useFetch","confirmDelete","setConfirmDelete","adding","setAdding","activeSlug","setActiveSlug","error","setError","artifacts","useMemo","_a","refresh","useCallback","drop","fetchJson","err","FetchError","ViewHeader","RefreshCcw","Plus","Skeleton","EmptyState","Layers","isConfirming","cur","Trash2","Sheet","SheetContent","AddForm","body","open","ArtifactDetail","onSubmit","onCancel","setSlug","title","setTitle","description","setDescription","kind","setKind","source","setSource","KIND_TEMPLATES","busy","setBusy","onKindChange","next","Input","e","Textarea","renderPayload","isClaude","Editor","onSaved","initial","editKind","setEditKind","editSource","setEditSource","setOpen","useEffect","dirty","save"],"mappings":"8nBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAWC,EAAiB,WAAY,CAC5C,CAAC,OAAQ,CAAE,EAAG,sBAAuB,IAAK,QAAQ,CAAE,EACpD,CAAC,OAAQ,CAAE,EAAG,uBAAwB,IAAK,QAAQ,CAAE,EACrD,CAAC,OAAQ,CAAE,EAAG,0BAA2B,IAAK,QAAQ,CAAE,EACxD,CAAC,OAAQ,CAAE,EAAG,6DAA8D,IAAK,QAAQ,CAAE,CAC7F,CAAC,ECkBM,SAASC,EAAmB,CACjC,QAAAC,EACA,KAAAC,CACF,EAGgB,CACd,KAAM,CAACC,EAAYC,CAAa,EAAIC,EAAAA,SAAS,EAAK,EAElD,OAAIJ,EAAQ,OAAS,MAIjBK,EAAAA,IAACC,EAAA,CAAK,QAAQ,UAAU,cAAa,eAAeL,CAAI,GACtD,SAAAI,EAAAA,IAACE,GACC,SAAAC,EAAAA,KAACC,EAAA,CAAO,MAAM,SAAS,IAAK,EAC1B,SAAA,CAAAJ,EAAAA,IAACK,EAAA,CAAY,KAAM,GAAI,cAAW,GAAC,MAAO,CAAE,MAAO,iBAAA,CAAkB,CAAG,EACxEF,OAAC,QAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,mBAAqB,SAAA,CAAA,gBACrD,MAAM,QAAQR,EAAQ,MAAM,EAAI,GAAGA,EAAQ,OAAO,MAAM,UAAY,WAAA,CAAA,CACpF,CAAA,CAAA,CACF,EACF,EACF,EAICA,EAAQ,YAaVW,EAAA,CAAM,IAAK,EAAG,cAAa,eAAeV,CAAI,GAC5C,SAAA,CAAAD,EAAQ,UACPQ,EAAAA,KAACC,EAAA,CACC,MAAM,SACN,IAAK,EACL,MAAO,CACL,QAAS,iBACT,WAAY,qCACZ,OAAQ,mDACR,aAAc,mBACd,SAAU,cAAA,EAEZ,KAAK,SACL,cAAa,eAAeR,CAAI,GAEhC,SAAA,CAAAI,EAAAA,IAACO,EAAA,CAAc,KAAM,GAAI,cAAW,GAAC,MAAO,CAAE,MAAO,SAAA,CAAU,CAAG,EAClEP,EAAAA,IAAC,QAAK,SAAA,oFAAA,CAGN,CAAA,CAAA,CAAA,EAGHL,EAAQ,UAAYA,EAAQ,SAAS,OAAS,GAC7CQ,EAAAA,KAAC,UAAA,CACC,MAAO,CACL,SAAU,eACV,MAAO,kBACP,QAAS,iBACT,WAAY,mBACZ,aAAc,kBAAA,EAGhB,SAAA,CAAAA,OAAC,UAAA,CAAS,SAAA,CAAAR,EAAQ,SAAS,OAAO,aAAA,EAAW,EAC7CK,EAAAA,IAAC,KAAA,CAAG,MAAO,CAAE,UAAW,gBAAA,EACrB,SAAAL,EAAQ,SAAS,IAAI,CAACa,EAAGC,WACvB,KAAA,CACC,SAAA,CAAAT,MAAC,QAAK,MAAO,CAAE,WAAY,kBAAA,EACxB,WAAE,QACL,EAAQ,IAAI,KACTQ,EAAE,OAAA,CAAA,EAJEC,CAKT,CACD,CAAA,CACH,CAAA,CAAA,CAAA,SAGHL,EAAA,CAAO,MAAM,SAAS,QAAQ,UAAU,IAAK,EAC5C,SAAA,CAAAD,OAAC,QAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,mBAC7C,SAAA,CAAAR,EAAQ,KAAK,eAAaA,EAAQ,WAAa,IAAI,KAAKA,EAAQ,UAAU,EAAE,qBAAuB,KAAA,EACtG,EACAQ,EAAAA,KAACC,EAAA,CAAO,IAAK,EACX,SAAA,CAAAJ,MAACU,GAAO,QAAQ,QAAQ,QAAS,IAAMZ,EAAea,GAAM,CAACA,CAAC,EAAG,cAAa,iBAAiBf,CAAI,GAChG,SAAAC,EAAa,cAAgB,cAChC,EACAM,EAAAA,KAAC,IAAA,CACC,KAAM,kBAAkBP,CAAI,QAC5B,OAAO,SACP,IAAI,sBACJ,cAAa,gBAAgBA,CAAI,GACjC,MAAO,CACL,QAAS,cACT,WAAY,SACZ,IAAK,iBACL,SAAU,eACV,QAAS,gCACT,MAAO,YACP,eAAgB,OAChB,OAAQ,0BACR,aAAc,mBACd,WAAY,kBAAA,EAGd,SAAA,CAAAI,EAAAA,IAACY,EAAA,CAAa,KAAM,GAAI,cAAW,GAAC,EAAE,kBAAA,CAAA,CAAA,CACxC,CAAA,CACF,CAAA,EACF,EACAZ,EAAAA,IAAC,SAAA,CACC,MAAO,mBAAmBJ,CAAI,GAC9B,cAAa,iBAAiBA,CAAI,GAClC,QAAQ,kCACR,OAAQD,EAAQ,KAChB,MAAO,CACL,MAAO,OACP,OAAQ,IACR,OAAQ,0BACR,aAAc,mBACd,WAAY,OAAA,CACd,CAAA,EAEDE,GACCG,EAAAA,IAAC,MAAA,CACC,cAAa,sBAAsBJ,CAAI,GACvC,MAAO,CACL,QAAS,iBACT,WAAY,mBACZ,aAAc,mBACd,SAAU,eACV,UAAW,IACX,SAAU,OACV,WAAY,mBACZ,WAAY,UAAA,EAGb,SAAAD,EAAQ,IAAA,CAAA,CACX,EAEJ,EApHEK,EAAAA,IAACC,GAAK,QAAQ,UAAU,cAAa,eAAeL,CAAI,GACtD,SAAAI,EAAAA,IAACE,EAAA,CACC,eAAC,OAAA,CAAK,KAAK,QAAQ,MAAO,CAAE,MAAO,eAAA,EAAmB,SAAA,mCAAA,CAEtD,CAAA,CACF,CAAA,CACF,CAgHN,CCpIO,SAASW,IAA6B,CAC3C,MAAMlB,EAAUmB,EAAoC,gBAAgB,EAC9D,CAACC,EAAeC,CAAgB,EAAIjB,EAAAA,SAAwB,IAAI,EAChE,CAACkB,EAAQC,CAAS,EAAInB,EAAAA,SAAkB,EAAK,EAC7C,CAACoB,EAAYC,CAAa,EAAIrB,EAAAA,SAAwB,IAAI,EAC1D,CAACsB,EAAOC,CAAQ,EAAIvB,EAAAA,SAAwB,IAAI,EAEhDwB,EAAYC,UAAoB,IAAA,OAAM,QAAAC,EAAA9B,EAAQ,OAAR,YAAA8B,EAAc,YAAa,IAAI,CAAC9B,EAAQ,IAAI,CAAC,EACnF+B,EAAUC,EAAAA,YAAY,IAAM,CAAOhC,EAAQ,QAAA,CAAW,EAAG,CAACA,CAAO,CAAC,EAElEiC,EAAO,MAAOhC,GAAgC,CAClD0B,EAAS,IAAI,EACb,GAAI,CACF,MAAMO,EAAU,kBAAkBjC,CAAI,GAAI,CAAE,OAAQ,SAAU,EAC9DoB,EAAiB,IAAI,EACjBG,IAAevB,GAAMwB,EAAc,IAAI,EAC3CM,EAAA,CACF,OAASI,EAAK,CACZR,GAASQ,aAAeC,EAAaD,EAAI,QAAgC,CAC3E,CACF,EAEA,OACE3B,EAAAA,KAACG,EAAA,CAAM,IAAK,EAAG,cAAY,iBACzB,SAAA,CAAAN,EAAAA,IAACgC,EAAA,CACC,MAAM,YACN,YAAY,mDACZ,QACE7B,EAAAA,KAACC,EAAA,CAAO,MAAM,SAAS,IAAK,EACzB,SAAA,CAAAiB,IAAU,MACTrB,MAAC,OAAA,CAAK,KAAK,QAAQ,cAAY,kBAAkB,MAAO,CAAE,MAAO,gBAAiB,SAAU,gBAAmB,SAAAqB,EAAM,EAEvHlB,EAAAA,KAACO,EAAA,CAAO,QAAQ,QAAQ,QAAS,IAAM,KAAKgB,EAAA,EAAW,cAAY,oBACjE,SAAA,CAAA1B,EAAAA,IAACiC,EAAA,CAAW,KAAM,GAAI,cAAW,GAAC,EAAE,UAAA,EACtC,EACA9B,EAAAA,KAACO,EAAA,CAAO,QAAQ,UAAU,QAAS,IAAMQ,EAAU,EAAI,EAAG,cAAY,gBACpE,SAAA,CAAAlB,EAAAA,IAACkC,EAAA,CAAK,KAAM,GAAI,cAAW,GAAC,EAAE,MAAA,CAAA,CAChC,CAAA,CAAA,CACF,CAAA,CAAA,EAIJlC,MAACC,EAAA,CAAK,QAAQ,UACZ,eAACC,EAAA,CACE,SAAAP,EAAQ,SAAW4B,EAAU,SAAW,EACvCpB,EAAAA,KAACG,EAAA,CAAM,IAAK,EACV,SAAA,CAAAN,EAAAA,IAACmC,EAAA,CAAS,MAAO,CAAE,OAAQ,IAAM,QAChCA,EAAA,CAAS,MAAO,CAAE,OAAQ,GAAG,CAAG,CAAA,CAAA,CACnC,EACEZ,EAAU,SAAW,EACvBvB,EAAAA,IAACoC,EAAA,CAAW,KAAMpC,EAAAA,IAACqC,EAAA,CAAO,KAAM,GAAI,cAAW,EAAA,CAAC,EAAI,MAAM,eAAe,YAAY,4BAAA,CAA6B,EAElHrC,EAAAA,IAACM,EAAA,CAAM,IAAK,EACT,SAAAiB,EAAU,IAAK,GAAM,CACpB,MAAMe,EAAevB,IAAkB,EAAE,KACzC,OACEZ,EAAAA,KAAC,MAAA,CAEC,cAAa,gBAAgB,EAAE,IAAI,GACnC,MAAO,CAAE,QAAS,iBAAkB,OAAQ,0BAA2B,aAAc,kBAAA,EAErF,SAAA,CAAAA,OAACC,GAAO,MAAM,SAAS,QAAQ,UAAU,IAAK,EAC5C,SAAA,CAAAD,EAAAA,KAACG,EAAA,CAAM,IAAK,EAAG,MAAO,CAAE,SAAU,EAAG,KAAM,CAAA,EACzC,SAAA,CAAAH,EAAAA,KAACC,EAAA,CAAO,MAAM,SAAS,IAAK,EAC1B,SAAA,CAAAJ,EAAAA,IAACR,EAAA,CAAS,KAAM,GAAI,cAAW,GAAC,MAAO,CAAE,MAAO,iBAAA,CAAkB,CAAG,EACrEQ,EAAAA,IAAC,SAAA,CAAO,MAAO,CAAE,SAAU,gBAAmB,SAAA,EAAE,OAAS,EAAE,IAAA,CAAK,EAChEA,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,kBAAA,EAAuB,SAAA,EAAE,IAAA,CAAK,EAC7E,EAAE,MAAQG,OAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAqB,SAAA,CAAA,KAAG,EAAE,IAAA,CAAA,CAAK,CAAA,EAC5F,EACC,EAAE,aAAeH,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAsB,SAAA,EAAE,WAAA,CAAY,CAAA,EACxG,EACAG,EAAAA,KAACC,EAAA,CAAO,IAAK,EACX,SAAA,CAAAD,EAAAA,KAACO,EAAA,CAAO,QAAQ,QAAQ,QAAS,IAAMU,EAAemB,GAASA,IAAQ,EAAE,KAAO,KAAO,EAAE,IAAK,EAAG,cAAa,iBAAiB,EAAE,IAAI,GAAI,aAAY,QAAQ,EAAE,IAAI,GACjK,SAAA,CAAAvC,EAAAA,IAACY,EAAA,CAAa,KAAM,GAAI,cAAW,GAAC,EAAE,OAAA,EACxC,EACAZ,EAAAA,IAACU,EAAA,CAAO,QAAQ,QAAQ,QAAS,IAAMM,EAAkBuB,GAASA,IAAQ,EAAE,KAAO,KAAO,EAAE,IAAK,EAAG,cAAa,mBAAmB,EAAE,IAAI,GAAI,aAAY,UAAU,EAAE,IAAI,GACxK,SAAAvC,EAAAA,IAACwC,EAAA,CAAO,KAAM,GAAI,cAAW,GAAC,CAAA,CAChC,CAAA,CAAA,CACF,CAAA,EACF,EACCF,UACElC,EAAA,CAAO,IAAK,EAAG,MAAO,CAAE,UAAW,gBAAA,EAClC,SAAA,CAAAJ,EAAAA,IAACU,EAAA,CAAO,QAAQ,SAAS,QAAS,IAAM,KAAKkB,EAAK,EAAE,IAAI,EAAG,cAAa,2BAA2B,EAAE,IAAI,GAAI,SAAA,iBAE7G,EACA5B,EAAAA,IAACU,GAAO,QAAQ,QAAQ,QAAS,IAAMM,EAAiB,IAAI,EAAG,SAAA,QAAA,CAAM,CAAA,CAAA,CACvE,CAAA,CAAA,EA7BG,EAAE,IAAA,CAiCb,CAAC,CAAA,CACH,CAAA,CAEJ,EACF,EAEAhB,EAAAA,IAACyC,EAAA,CAAM,KAAMxB,EAAQ,aAAcC,EACjC,SAAAlB,EAAAA,IAAC0C,EAAA,CAAa,KAAK,QAAQ,MAAM,eAAe,YAAY,gCAC1D,SAAA1C,EAAAA,IAAC2C,EAAA,CACC,SAAU,MAAOC,GAAS,CACxB,MAAMf,EAAU,iBAAkB,CAAE,OAAQ,OAAQ,KAAAe,EAAM,EAC1D1B,EAAU,EAAK,EACfQ,EAAA,CACF,EACA,SAAU,IAAMR,EAAU,EAAK,CAAA,CAAA,EAEnC,CAAA,CACF,QAECuB,EAAA,CAAM,KAAMtB,IAAe,KAAM,aAAe0B,GAAS,CAAOA,GAAMzB,EAAc,IAAI,CAAG,EAC1F,SAAApB,EAAAA,IAAC0C,EAAA,CAAa,KAAK,QAAQ,MAAOvB,GAAc,GAAI,YAAY,kBAC7D,SAAAA,IAAe,MAAQnB,EAAAA,IAAC8C,EAAA,CAAe,KAAM3B,EAAY,QAAAO,EAAkB,EAC9E,CAAA,CACF,CAAA,EACF,CAEJ,CAEA,SAASiB,EAAQ,CACf,SAAAI,EACA,SAAAC,CACF,EAGgB,CACd,KAAM,CAACpD,EAAMqD,CAAO,EAAIlD,EAAAA,SAAiB,EAAE,EACrC,CAACmD,EAAOC,CAAQ,EAAIpD,EAAAA,SAAiB,EAAE,EACvC,CAACqD,EAAaC,CAAc,EAAItD,EAAAA,SAAiB,EAAE,EACnD,CAACuD,EAAMC,CAAO,EAAIxD,EAAAA,SAAgE,aAAa,EAC/F,CAACyD,EAAQC,CAAS,EAAI1D,EAAAA,SAAiB2D,EAAe,aAAa,CAAC,EACpE,CAACC,EAAMC,CAAO,EAAI7D,EAAAA,SAAkB,EAAK,EACzC,CAACsB,EAAOC,CAAQ,EAAIvB,EAAAA,SAAwB,IAAI,EAIhD8D,EAAgBC,GAAsE,CAC1FP,EAAQO,CAAI,EACZL,EAAUC,EAAeI,CAAI,CAAC,CAChC,EAEA,OACE3D,EAAAA,KAACG,GAAM,IAAK,EAAG,MAAO,CAAE,QAAS,kBAC/B,SAAA,CAAAH,EAAAA,KAAC,QAAA,CAAM,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,gBAAA,EAC7D,SAAA,CAAAH,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAqB,SAAA,MAAA,CAAI,EACzEA,EAAAA,IAAC+D,EAAA,CAAM,MAAOnE,EAAM,SAAWoE,GAAMf,EAASe,EAAE,OAA4B,KAAK,EAAG,cAAY,oBAAA,CAAqB,CAAA,EACvH,EACA7D,EAAAA,KAAC,QAAA,CAAM,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,gBAAA,EAC7D,SAAA,CAAAH,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAqB,SAAA,OAAA,CAAK,EAC1EA,EAAAA,IAAC+D,EAAA,CAAM,MAAOb,EAAO,SAAWc,GAAMb,EAAUa,EAAE,OAA4B,KAAK,EAAG,cAAY,qBAAA,CAAsB,CAAA,EAC1H,EACA7D,EAAAA,KAAC,QAAA,CAAM,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,gBAAA,EAC7D,SAAA,CAAAH,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAqB,SAAA,aAAA,CAAW,EAChFA,EAAAA,IAAC+D,EAAA,CAAM,MAAOX,EAAa,SAAWY,GAAMX,EAAgBW,EAAE,OAA4B,KAAK,EAAG,cAAY,2BAAA,CAA4B,CAAA,EAC5I,EACA7D,EAAAA,KAAC,QAAA,CAAM,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,gBAAA,EAC7D,SAAA,CAAAH,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAqB,SAAA,MAAA,CAAI,EACzEG,EAAAA,KAAC,SAAA,CACC,MAAOmD,EACP,SAAWU,GAAMH,EAAaG,EAAE,OAAO,KAAoB,EAC3D,cAAY,qBACZ,MAAO,CACL,WAAY,UACZ,SAAU,eACV,QAAS,iBACT,WAAY,mBACZ,MAAO,YACP,OAAQ,0BACR,aAAc,kBAAA,EAGhB,SAAA,CAAAhE,EAAAA,IAAC,SAAA,CAAO,MAAM,cAAc,SAAA,cAAW,EACvCA,EAAAA,IAAC,SAAA,CAAO,MAAM,aAAa,SAAA,aAAU,EACrCA,EAAAA,IAAC,SAAA,CAAO,MAAM,eAAe,SAAA,qBAAkB,EAC/CA,EAAAA,IAAC,SAAA,CAAO,MAAM,MAAM,SAAA,qBAAA,CAAmB,CAAA,CAAA,CAAA,CACzC,EACF,EACAG,EAAAA,KAAC,QAAA,CAAM,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,gBAAA,EAC7D,SAAA,CAAAH,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAC7C,SAAAsD,IAAS,MAAQ,WAAa,QAAA,CACjC,EACAtD,EAAAA,IAACiE,EAAA,CACC,MAAOT,EACP,KAAMF,IAAS,eAAiB,GAAK,EACrC,SAAWU,GAAMP,EAAWO,EAAE,OAA+B,KAAK,EAClE,cAAaV,IAAS,MAAQ,oBAAsB,sBAAA,CAAA,CACtD,EACF,EACCjC,IAAU,MAAQrB,EAAAA,IAAC,OAAA,CAAK,KAAK,QAAQ,MAAO,CAAE,MAAO,gBAAiB,SAAU,cAAA,EAAmB,SAAAqB,EAAM,EAC1GlB,EAAAA,KAACC,EAAA,CAAO,QAAQ,MAAM,IAAK,EACzB,SAAA,CAAAJ,MAACU,EAAA,CAAO,QAAQ,QAAQ,QAASsC,EAAU,SAAA,SAAM,EACjDhD,EAAAA,IAACU,EAAA,CACC,QAAQ,UACR,SAAUiD,GAAQ,CAAC/D,EAAK,KAAA,EACxB,cAAY,uBACZ,QAAS,SAAY,CACnBgE,EAAQ,EAAI,EACZtC,EAAS,IAAI,EACb,GAAI,CACF,MAAMsB,EAAqH,CACzH,KAAMhD,EAAK,KAAA,EACX,MAAOsD,EAAM,KAAA,GAAU,OACvB,YAAaE,EAAY,KAAA,GAAU,OACnC,KAAAE,CAAA,EAEEE,IACEF,IAAS,MAAOV,EAAK,QAAUY,IAAkB,OAASA,GAEhE,MAAMT,EAASH,CAAI,CACrB,OAASd,EAAK,CACZR,GAASQ,aAAeC,EAAaD,EAAI,QAAgC,EACzE8B,EAAQ,EAAK,CACf,CACF,EAEC,WAAO,YAAc,QAAA,CAAA,CACxB,CAAA,CACF,CAAA,EACF,CAEJ,CAEA,MAAMF,EAAwF,CAC5F,IAAK;AAAA;AAAA,oBACL,cAAe;AAAA;AAAA,kDACf,aAAc;AAAA;AAAA;AAAA,QACd,eAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAClB,EAEA,SAASZ,EAAe,CAAE,KAAAlD,EAAM,QAAA8B,GAA+D,OAC7F,MAAM/B,EAAUmB,EAAmB,kBAAkBlB,CAAI,EAAE,EACrDsE,EAAgBpD,EAA8B,kBAAkBlB,CAAI,SAAS,EAC7E0D,IAAO7B,EAAA9B,EAAQ,OAAR,YAAA8B,EAAc,OAAQ,MAC7B0C,EAAWb,IAAS,eAAiBA,IAAS,cAAgBA,IAAS,eAE7E,OACEtD,EAAAA,IAACM,EAAA,CAAM,IAAK,EAAG,MAAO,CAAE,QAAS,gBAAA,EAC9B,SAAAX,EAAQ,SAAW,CAACA,EAAQ,KAC3BK,MAACmC,EAAA,CAAS,MAAO,CAAE,OAAQ,EAAA,CAAG,CAAG,EAC/BxC,EAAQ,KACVQ,EAAAA,KAACG,EAAA,CAAM,IAAK,EACV,SAAA,CAAAH,EAAAA,KAACC,EAAA,CAAO,MAAM,SAAS,IAAK,EAC1B,SAAA,CAAAJ,MAAC,UAAQ,SAAAL,EAAQ,KAAK,OAASA,EAAQ,KAAK,KAAK,EACjDK,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,kBAAA,EAAuB,SAAAL,EAAQ,KAAK,IAAA,CAAK,EACzFQ,OAAC,QAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,mBAAqB,SAAA,CAAA,KAAGmD,CAAA,CAAA,CAAK,CAAA,EAC/E,EACC3D,EAAQ,KAAK,aAAeK,EAAAA,IAAC,QAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,mBAAsB,SAAAL,EAAQ,KAAK,YAAY,EAK3HwE,IACCD,EAAc,KACZlE,EAAAA,IAACN,EAAA,CAAmB,QAASwE,EAAc,KAAM,KAAAtE,CAAA,CAAY,QAE5DuC,EAAA,CAAS,MAAO,CAAE,OAAQ,IAAI,CAAG,GAKrC,CAACgC,GAAYD,EAAc,MAC1B/D,EAAAA,KAAC,QAAK,cAAa,mBAAmBP,CAAI,GAAI,MAAO,CAAE,SAAU,eAAgB,MAAO,mBAAqB,SAAA,CAAA,WAClG,MAAM,QAAQsE,EAAc,KAAK,MAAM,EAAI,GAAGA,EAAc,KAAK,OAAO,MAAM,UAAY,WAAA,EACrG,QAIDE,EAAA,CAAO,QAASzE,EAAQ,KAAM,KAAAC,EAAY,QAAS,IAAM,CAAOD,EAAQ,QAAA,EAAgBuE,EAAc,QAAA,EAAWxC,EAAA,CAAW,CAAA,CAAG,CAAA,CAAA,CAClI,EAEA1B,EAAAA,IAAC,OAAA,CAAK,KAAK,QAAQ,MAAO,CAAE,MAAO,eAAA,EAAmB,SAAA,WAAA,CAAS,CAAA,CAEnE,CAEJ,CAQA,SAASoE,EAAO,CACd,QAAAzE,EACA,KAAAC,EACA,QAAAyE,CACF,EAIgB,CACd,MAAMC,EAAU3E,EAAQ,QAAUA,EAAQ,SAAW,GAC/C,CAAC4E,EAAUC,CAAW,EAAIzE,EAAAA,SAA8BJ,EAAQ,MAAQ,KAAK,EAC7E,CAAC8E,EAAYC,CAAa,EAAI3E,EAAAA,SAAiBuE,CAAO,EACtD,CAACX,EAAMC,CAAO,EAAI7D,EAAAA,SAAkB,EAAK,EACzC,CAACsB,EAAOC,CAAQ,EAAIvB,EAAAA,SAAwB,IAAI,EAChD,CAAC8C,EAAM8B,CAAO,EAAI5E,EAAAA,SAAkB,EAAK,EAI/C6E,EAAAA,UAAU,IAAM,CACdJ,EAAY7E,EAAQ,MAAQ,KAAK,EACjC+E,EAAc/E,EAAQ,QAAUA,EAAQ,SAAW,EAAE,CACvD,EAAG,CAACA,EAAQ,KAAMA,EAAQ,OAAQA,EAAQ,QAASA,EAAQ,IAAI,CAAC,EAEhE,MAAMkF,EACJN,KAAc5E,EAAQ,MAAQ,QAAU8E,KAAgB9E,EAAQ,QAAUA,EAAQ,SAAW,IAEzFmF,EAAO,SAA2B,CACtClB,EAAQ,EAAI,EACZtC,EAAS,IAAI,EACb,GAAI,CACF,MAAMO,EAAU,kBAAkBjC,CAAI,GAAI,CACxC,OAAQ,MACR,KAAM,CACJ,KAAM2E,EACN,OAAQA,IAAa,MAAQ,OAAYE,EACzC,QAASF,IAAa,MAAQE,EAAa,MAAA,CAC7C,CACD,EACDJ,EAAA,CACF,OAASvC,EAAK,CACZR,GAASQ,aAAeC,EAAaD,EAAI,QAAgC,CAC3E,QAAA,CACE8B,EAAQ,EAAK,CACf,CACF,EAEA,cACGtD,EAAA,CAAM,IAAK,EAAG,cAAa,mBAAmBV,CAAI,GACjD,SAAA,CAAAO,OAACC,GAAO,MAAM,SAAS,QAAQ,UAAU,IAAK,EAC5C,SAAA,CAAAJ,MAACU,GAAO,QAAQ,QAAQ,QAAS,IAAMiE,EAAShE,GAAM,CAACA,CAAC,EAAG,cAAa,wBAAwBf,CAAI,GACjG,SAAAiD,EAAO,eAAiB,OAC3B,EACCgC,GACC7E,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,sCAAwC,SAAA,iBAAA,CAExF,CAAA,EAEJ,EACC6C,GACC1C,EAAAA,KAACG,EAAA,CAAM,IAAK,EACV,SAAA,CAAAH,EAAAA,KAAC,QAAA,CAAM,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,gBAAA,EAC7D,SAAA,CAAAH,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAqB,SAAA,MAAA,CAAI,EACzEG,EAAAA,KAAC,SAAA,CACC,MAAOoE,EACP,SAAWP,GAAMQ,EAAYR,EAAE,OAAO,KAAwB,EAC9D,cAAa,sBAAsBpE,CAAI,GACvC,MAAO,CACL,WAAY,UACZ,SAAU,eACV,QAAS,iBACT,WAAY,mBACZ,MAAO,YACP,OAAQ,0BACR,aAAc,kBAAA,EAGhB,SAAA,CAAAI,EAAAA,IAAC,SAAA,CAAO,MAAM,cAAc,SAAA,cAAW,EACvCA,EAAAA,IAAC,SAAA,CAAO,MAAM,aAAa,SAAA,aAAU,EACrCA,EAAAA,IAAC,SAAA,CAAO,MAAM,eAAe,SAAA,qBAAkB,EAC/CA,EAAAA,IAAC,SAAA,CAAO,MAAM,MAAM,SAAA,YAAA,CAAU,CAAA,CAAA,CAAA,CAChC,EACF,EACAG,EAAAA,KAAC,QAAA,CAAM,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,gBAAA,EAC7D,SAAA,CAAAH,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAC7C,SAAAuE,IAAa,MAAQ,WAAa,QAAA,CACrC,EACAvE,EAAAA,IAACiE,EAAA,CACC,MAAOQ,EACP,KAAMF,IAAa,eAAiB,GAAK,EACzC,SAAWP,GAAMU,EAAeV,EAAE,OAA+B,KAAK,EACtE,cAAa,wBAAwBpE,CAAI,EAAA,CAAA,CAC3C,EACF,EACCyB,IAAU,MACTrB,EAAAA,IAAC,OAAA,CAAK,KAAK,QAAQ,cAAa,uBAAuBJ,CAAI,GAAI,MAAO,CAAE,MAAO,gBAAiB,SAAU,cAAA,EACvG,SAAAyB,EACH,EAEFlB,EAAAA,KAACC,EAAA,CAAO,IAAK,EACX,SAAA,CAAAJ,EAAAA,IAACU,EAAA,CACC,QAAQ,UACR,SAAUiD,GAAQ,CAACkB,EACnB,QAAS,IAAM,KAAKC,EAAA,EACpB,cAAa,sBAAsBlF,CAAI,GAEtC,WAAO,UAAY,MAAA,CAAA,EAEtBI,EAAAA,IAACU,EAAA,CACC,QAAQ,QACR,SAAUiD,GAAQ,CAACkB,EACnB,QAAS,IAAM,CACbL,EAAY7E,EAAQ,MAAQ,KAAK,EACjC+E,EAAc/E,EAAQ,QAAUA,EAAQ,SAAW,EAAE,EACrD2B,EAAS,IAAI,CACf,EACA,cAAa,wBAAwB1B,CAAI,GAC1C,SAAA,QAAA,CAAA,CAED,CAAA,CACF,CAAA,CAAA,CACF,CAAA,EAEJ,CAEJ","x_google_ignoreList":[0]}
@@ -1,4 +1,4 @@
1
- import{r as s,j as e}from"./cmdk-DVxytz9i.js";import{c as x,i as h,F as u,S as o,h as T,I as l,B as f,G as F,d as r}from"./main-CyAIirBB.js";import{V as O}from"./ViewHeader-V_SzbUpw.js";import{C as b,b as z}from"./Card-D9019JOD.js";import{I as V}from"./Input-BSa3lh_-.js";import{S as A}from"./shield-alert-BPGJlRF8.js";import{R as L}from"./rotate-cw-CsTtaLV2.js";/**
1
+ import{r as s,j as e}from"./cmdk-DVxytz9i.js";import{c as x,i as h,F as u,S as o,h as T,I as l,B as f,G as F,d as r}from"./main-Cxeu4LhG.js";import{V as O}from"./ViewHeader-B6P-C4GD.js";import{C as b,b as z}from"./Card-rF59wHiO.js";import{I as V}from"./Input-CZmRw5QX.js";import{S as A}from"./shield-alert-DY6RAaC8.js";import{R as L}from"./rotate-cw-CDOlRtUR.js";/**
2
2
  * @license lucide-react v0.460.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- {"version":3,"file":"AuthView-utVm6M3D.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/copy.js","../../../node_modules/lucide-react/dist/esm/icons/eye-off.js","../../../node_modules/lucide-react/dist/esm/icons/eye.js","../../src/web/v8/views/Auth/AuthView.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Copy = createLucideIcon(\"Copy\", [\n [\"rect\", { width: \"14\", height: \"14\", x: \"8\", y: \"8\", rx: \"2\", ry: \"2\", key: \"17jyea\" }],\n [\"path\", { d: \"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\", key: \"zix9uf\" }]\n]);\n\nexport { Copy as default };\n//# sourceMappingURL=copy.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst EyeOff = createLucideIcon(\"EyeOff\", [\n [\n \"path\",\n {\n d: \"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\",\n key: \"ct8e1f\"\n }\n ],\n [\"path\", { d: \"M14.084 14.158a3 3 0 0 1-4.242-4.242\", key: \"151rxh\" }],\n [\n \"path\",\n {\n d: \"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\",\n key: \"13bj9a\"\n }\n ],\n [\"path\", { d: \"m2 2 20 20\", key: \"1ooewy\" }]\n]);\n\nexport { EyeOff as default };\n//# sourceMappingURL=eye-off.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Eye = createLucideIcon(\"Eye\", [\n [\n \"path\",\n {\n d: \"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\",\n key: \"1nclc0\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }]\n]);\n\nexport { Eye as default };\n//# sourceMappingURL=eye.js.map\n","/**\n * v8/views/Auth/AuthView.tsx — Sprint S40, v9.3.0.\n *\n * Auth status + token-reveal + regenerate surface. Reads the\n * unauthed /api/auth/status on mount, then on user request hits\n * the authed /api/auth/reveal to show the current token, and\n * /api/auth/regenerate (with inline confirm) to mint a new one.\n */\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { Copy, Eye, EyeOff, RotateCw, ShieldCheck, ShieldAlert } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\ninterface AuthStatus {\n required: boolean;\n loopback: boolean;\n peer?: string;\n}\n\nexport function AuthView(): JSX.Element {\n const [status, setStatus] = useState<AuthStatus | null>(null);\n const [statusError, setStatusError] = useState<string | null>(null);\n const [token, setToken] = useState<string | null>(null);\n const [revealing, setRevealing] = useState<boolean>(false);\n const [showToken, setShowToken] = useState<boolean>(false);\n const [confirmRegen, setConfirmRegen] = useState<boolean>(false);\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const loadStatus = useCallback(async () => {\n setStatusError(null);\n try {\n const res = await fetchJson<AuthStatus>('/api/auth/status');\n setStatus(res);\n } catch (err) {\n setStatusError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n }, []);\n\n useEffect(() => { void loadStatus(); }, [loadStatus]);\n\n const reveal = async (): Promise<void> => {\n setRevealing(true);\n setError(null);\n try {\n const res = await fetchJson<{ token: string }>('/api/auth/reveal');\n setToken(res.token);\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setRevealing(false);\n }\n };\n\n const regenerate = async (): Promise<void> => {\n setBusy(true);\n setError(null);\n try {\n const res = await fetchJson<{ token: string }>('/api/auth/regenerate', { method: 'POST', body: {} });\n setToken(res.token);\n setShowToken(true);\n setConfirmRegen(false);\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n const copy = async (): Promise<void> => {\n if (!token) return;\n try {\n await navigator.clipboard.writeText(token);\n } catch { /* clipboard might be blocked; the token is still on-screen */ }\n };\n\n return (\n <Stack gap={4} data-testid=\"auth-view\">\n <ViewHeader\n title=\"Auth\"\n description=\"Dashboard auth status + bearer token management.\"\n />\n\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={2}>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Status</strong>\n {status === null && statusError === null ? (\n <Skeleton style={{ height: 24, width: 240 }} />\n ) : statusError !== null ? (\n <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{statusError}</span>\n ) : (\n <Inline gap={2} wrap>\n {status?.required ? (\n <Badge tone=\"warning\" data-testid=\"auth-required\">\n <ShieldAlert size={12} aria-hidden /> Required\n </Badge>\n ) : (\n <Badge tone=\"success\" data-testid=\"auth-required\">\n <ShieldCheck size={12} aria-hidden /> Not required\n </Badge>\n )}\n {status?.loopback && <Badge tone=\"info\">Loopback</Badge>}\n {status?.peer && (\n <span style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {status.peer}\n </span>\n )}\n </Inline>\n )}\n </Stack>\n </CardBody>\n </Card>\n\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={3}>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Bearer token</strong>\n {token === null ? (\n <Inline gap={2}>\n <Button variant=\"ghost\" onClick={() => void reveal()} disabled={revealing} data-testid=\"auth-reveal\">\n <Eye size={14} aria-hidden /> {revealing ? 'Loading…' : 'Reveal'}\n </Button>\n </Inline>\n ) : (\n <Stack gap={2}>\n <Inline gap={2}>\n <Input\n readOnly\n value={showToken ? token : '••••••••••••••••••••••'}\n data-testid=\"auth-token-input\"\n onFocus={(e) => (e.target as HTMLInputElement).select()}\n />\n <Button variant=\"ghost\" onClick={() => setShowToken((s) => !s)} data-testid=\"auth-toggle-visibility\">\n {showToken ? <EyeOff size={14} aria-hidden /> : <Eye size={14} aria-hidden />}\n </Button>\n <Button variant=\"ghost\" onClick={() => void copy()} data-testid=\"auth-copy\">\n <Copy size={14} aria-hidden /> Copy\n </Button>\n </Inline>\n {confirmRegen ? (\n <Inline gap={1}>\n <Button variant=\"danger\" onClick={() => void regenerate()} disabled={busy} data-testid=\"auth-confirm-regen\">\n Confirm rotate\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmRegen(false)} disabled={busy} data-testid=\"auth-cancel-regen\">\n Cancel\n </Button>\n </Inline>\n ) : (\n <Button variant=\"danger\" onClick={() => setConfirmRegen(true)} data-testid=\"auth-regen\">\n <RotateCw size={14} aria-hidden /> Rotate token\n </Button>\n )}\n </Stack>\n )}\n {error !== null && (\n <span role=\"alert\" data-testid=\"auth-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n </Stack>\n </CardBody>\n </Card>\n </Stack>\n );\n}"],"names":["Copy","createLucideIcon","EyeOff","Eye","AuthView","status","setStatus","useState","statusError","setStatusError","token","setToken","revealing","setRevealing","showToken","setShowToken","confirmRegen","setConfirmRegen","busy","setBusy","error","setError","loadStatus","useCallback","res","fetchJson","err","FetchError","useEffect","reveal","regenerate","copy","jsxs","Stack","jsx","ViewHeader","Card","CardBody","Skeleton","Inline","Badge","ShieldAlert","ShieldCheck","Button","Input","e","s","RotateCw"],"mappings":"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","x_google_ignoreList":[0,1,2]}
1
+ {"version":3,"file":"AuthView-Rk8eKUPr.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/copy.js","../../../node_modules/lucide-react/dist/esm/icons/eye-off.js","../../../node_modules/lucide-react/dist/esm/icons/eye.js","../../src/web/v8/views/Auth/AuthView.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Copy = createLucideIcon(\"Copy\", [\n [\"rect\", { width: \"14\", height: \"14\", x: \"8\", y: \"8\", rx: \"2\", ry: \"2\", key: \"17jyea\" }],\n [\"path\", { d: \"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\", key: \"zix9uf\" }]\n]);\n\nexport { Copy as default };\n//# sourceMappingURL=copy.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst EyeOff = createLucideIcon(\"EyeOff\", [\n [\n \"path\",\n {\n d: \"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\",\n key: \"ct8e1f\"\n }\n ],\n [\"path\", { d: \"M14.084 14.158a3 3 0 0 1-4.242-4.242\", key: \"151rxh\" }],\n [\n \"path\",\n {\n d: \"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\",\n key: \"13bj9a\"\n }\n ],\n [\"path\", { d: \"m2 2 20 20\", key: \"1ooewy\" }]\n]);\n\nexport { EyeOff as default };\n//# sourceMappingURL=eye-off.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Eye = createLucideIcon(\"Eye\", [\n [\n \"path\",\n {\n d: \"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\",\n key: \"1nclc0\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }]\n]);\n\nexport { Eye as default };\n//# sourceMappingURL=eye.js.map\n","/**\n * v8/views/Auth/AuthView.tsx — Sprint S40, v9.3.0.\n *\n * Auth status + token-reveal + regenerate surface. Reads the\n * unauthed /api/auth/status on mount, then on user request hits\n * the authed /api/auth/reveal to show the current token, and\n * /api/auth/regenerate (with inline confirm) to mint a new one.\n */\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { Copy, Eye, EyeOff, RotateCw, ShieldCheck, ShieldAlert } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\ninterface AuthStatus {\n required: boolean;\n loopback: boolean;\n peer?: string;\n}\n\nexport function AuthView(): JSX.Element {\n const [status, setStatus] = useState<AuthStatus | null>(null);\n const [statusError, setStatusError] = useState<string | null>(null);\n const [token, setToken] = useState<string | null>(null);\n const [revealing, setRevealing] = useState<boolean>(false);\n const [showToken, setShowToken] = useState<boolean>(false);\n const [confirmRegen, setConfirmRegen] = useState<boolean>(false);\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const loadStatus = useCallback(async () => {\n setStatusError(null);\n try {\n const res = await fetchJson<AuthStatus>('/api/auth/status');\n setStatus(res);\n } catch (err) {\n setStatusError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n }, []);\n\n useEffect(() => { void loadStatus(); }, [loadStatus]);\n\n const reveal = async (): Promise<void> => {\n setRevealing(true);\n setError(null);\n try {\n const res = await fetchJson<{ token: string }>('/api/auth/reveal');\n setToken(res.token);\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setRevealing(false);\n }\n };\n\n const regenerate = async (): Promise<void> => {\n setBusy(true);\n setError(null);\n try {\n const res = await fetchJson<{ token: string }>('/api/auth/regenerate', { method: 'POST', body: {} });\n setToken(res.token);\n setShowToken(true);\n setConfirmRegen(false);\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n const copy = async (): Promise<void> => {\n if (!token) return;\n try {\n await navigator.clipboard.writeText(token);\n } catch { /* clipboard might be blocked; the token is still on-screen */ }\n };\n\n return (\n <Stack gap={4} data-testid=\"auth-view\">\n <ViewHeader\n title=\"Auth\"\n description=\"Dashboard auth status + bearer token management.\"\n />\n\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={2}>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Status</strong>\n {status === null && statusError === null ? (\n <Skeleton style={{ height: 24, width: 240 }} />\n ) : statusError !== null ? (\n <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{statusError}</span>\n ) : (\n <Inline gap={2} wrap>\n {status?.required ? (\n <Badge tone=\"warning\" data-testid=\"auth-required\">\n <ShieldAlert size={12} aria-hidden /> Required\n </Badge>\n ) : (\n <Badge tone=\"success\" data-testid=\"auth-required\">\n <ShieldCheck size={12} aria-hidden /> Not required\n </Badge>\n )}\n {status?.loopback && <Badge tone=\"info\">Loopback</Badge>}\n {status?.peer && (\n <span style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {status.peer}\n </span>\n )}\n </Inline>\n )}\n </Stack>\n </CardBody>\n </Card>\n\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={3}>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Bearer token</strong>\n {token === null ? (\n <Inline gap={2}>\n <Button variant=\"ghost\" onClick={() => void reveal()} disabled={revealing} data-testid=\"auth-reveal\">\n <Eye size={14} aria-hidden /> {revealing ? 'Loading…' : 'Reveal'}\n </Button>\n </Inline>\n ) : (\n <Stack gap={2}>\n <Inline gap={2}>\n <Input\n readOnly\n value={showToken ? token : '••••••••••••••••••••••'}\n data-testid=\"auth-token-input\"\n onFocus={(e) => (e.target as HTMLInputElement).select()}\n />\n <Button variant=\"ghost\" onClick={() => setShowToken((s) => !s)} data-testid=\"auth-toggle-visibility\">\n {showToken ? <EyeOff size={14} aria-hidden /> : <Eye size={14} aria-hidden />}\n </Button>\n <Button variant=\"ghost\" onClick={() => void copy()} data-testid=\"auth-copy\">\n <Copy size={14} aria-hidden /> Copy\n </Button>\n </Inline>\n {confirmRegen ? (\n <Inline gap={1}>\n <Button variant=\"danger\" onClick={() => void regenerate()} disabled={busy} data-testid=\"auth-confirm-regen\">\n Confirm rotate\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmRegen(false)} disabled={busy} data-testid=\"auth-cancel-regen\">\n Cancel\n </Button>\n </Inline>\n ) : (\n <Button variant=\"danger\" onClick={() => setConfirmRegen(true)} data-testid=\"auth-regen\">\n <RotateCw size={14} aria-hidden /> Rotate token\n </Button>\n )}\n </Stack>\n )}\n {error !== null && (\n <span role=\"alert\" data-testid=\"auth-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n </Stack>\n </CardBody>\n </Card>\n </Stack>\n );\n}"],"names":["Copy","createLucideIcon","EyeOff","Eye","AuthView","status","setStatus","useState","statusError","setStatusError","token","setToken","revealing","setRevealing","showToken","setShowToken","confirmRegen","setConfirmRegen","busy","setBusy","error","setError","loadStatus","useCallback","res","fetchJson","err","FetchError","useEffect","reveal","regenerate","copy","jsxs","Stack","jsx","ViewHeader","Card","CardBody","Skeleton","Inline","Badge","ShieldAlert","ShieldCheck","Button","Input","e","s","RotateCw"],"mappings":"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","x_google_ignoreList":[0,1,2]}
@@ -1,4 +1,4 @@
1
- import{c as y,g as d}from"./main-CyAIirBB.js";import{r as f,j as t}from"./cmdk-DVxytz9i.js";/**
1
+ import{c as y,g as d}from"./main-Cxeu4LhG.js";import{r as f,j as t}from"./cmdk-DVxytz9i.js";/**
2
2
  * @license lucide-react v0.460.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- {"version":3,"file":"Avatar-CXDZdKy4.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/git-branch.js","../../src/web/v8/ui/feedback/Banner.tsx","../../src/web/v8/ui/data/Avatar.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst GitBranch = createLucideIcon(\"GitBranch\", [\n [\"line\", { x1: \"6\", x2: \"6\", y1: \"3\", y2: \"15\", key: \"17qcm7\" }],\n [\"circle\", { cx: \"18\", cy: \"6\", r: \"3\", key: \"1h7g24\" }],\n [\"circle\", { cx: \"6\", cy: \"18\", r: \"3\", key: \"fqmcym\" }],\n [\"path\", { d: \"M18 9a9 9 0 0 1-9 9\", key: \"n2h4wq\" }]\n]);\n\nexport { GitBranch as default };\n//# sourceMappingURL=git-branch.js.map\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Banner — a top-of-page contextual announcement.\n *\n * Use sparingly. Distinct from StatusBar (which is system-level) and\n * Alert (which is inline). Banner occupies its own row above the page header.\n */\nexport interface BannerProps extends HTMLAttributes<HTMLDivElement> {\n tone?: 'info' | 'warning' | 'success' | 'danger';\n children: ReactNode;\n action?: ReactNode;\n}\n\nexport const Banner = forwardRef<HTMLDivElement, BannerProps>(function Banner(props, ref) {\n const { tone = 'info', children, action, className, ...rest } = props;\n return (\n <div\n ref={ref}\n role={tone === 'danger' ? 'alert' : 'status'}\n className={cx('v8-banner', `v8-banner--${tone}`, className)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--space-3)',\n padding: 'var(--space-3) var(--space-4)',\n background: `color-mix(in oklch, var(--${tone}) 8%, var(--surface-1))`,\n borderBottom: '1px solid var(--border)',\n fontSize: 'var(--fs-13)',\n color: 'var(--fg)',\n }}\n {...rest}\n >\n <div style={{ flex: 1, minWidth: 0 }}>{children}</div>\n {action !== undefined && <div style={{ flexShrink: 0 }}>{action}</div>}\n </div>\n );\n});","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Avatar — user/agent representation. Falls back to initials when no image.\n *\n * Sizes: xs (20) | sm (24) | md (32) | lg (40) | xl (56).\n * Renders a <span> by default; use `asChild` to swap for a button/link.\n */\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport interface AvatarProps extends HTMLAttributes<HTMLSpanElement> {\n name: string;\n src?: string;\n size?: AvatarSize;\n /** Override the generated initials. */\n initials?: string;\n /** Optional status dot (online/offline/busy). */\n status?: 'online' | 'offline' | 'busy' | 'away';\n}\n\nconst SIZE_PX: Record<AvatarSize, number> = { xs: 20, sm: 24, md: 32, lg: 40, xl: 56 };\nconst SIZE_FS: Record<AvatarSize, string> = {\n xs: 'var(--fs-12)',\n sm: 'var(--fs-12)',\n md: 'var(--fs-13)',\n lg: 'var(--fs-14)',\n xl: 'var(--fs-18)',\n};\n\nconst STATUS_FG = {\n online: 'var(--success)',\n offline: 'var(--fg-subtle)',\n busy: 'var(--danger)',\n away: 'var(--warning)',\n} as const;\n\nfunction deriveInitials(name: string): string {\n const parts = name.trim().split(/\\s+/);\n if (parts.length === 0 || parts[0] === undefined) return '?';\n if (parts.length === 1) {\n const first = parts[0] ?? '';\n return first.slice(0, 2).toUpperCase();\n }\n const first = parts[0]?.[0] ?? '';\n const last = parts[parts.length - 1]?.[0] ?? '';\n return `${first}${last}`.toUpperCase();\n}\n\n// Deterministic color from name — used as fallback when no image.\nfunction hashName(name: string): number {\n let h = 0;\n for (let i = 0; i < name.length; i++) h = (h * 31 + name.charCodeAt(i)) | 0;\n return Math.abs(h);\n}\n\nconst FALLBACK_PALETTE = [\n 'oklch(0.65 0.15 240)',\n 'oklch(0.65 0.15 30)',\n 'oklch(0.65 0.15 140)',\n 'oklch(0.65 0.15 320)',\n 'oklch(0.65 0.15 80)',\n 'oklch(0.65 0.15 200)',\n];\n\nexport const Avatar = forwardRef<HTMLSpanElement, AvatarProps>(function Avatar(props, ref) {\n const { name, src, size = 'md', initials, status, className, style, ...rest } = props;\n const px = SIZE_PX[size];\n const init = initials ?? deriveInitials(name);\n const fallbackBg = FALLBACK_PALETTE[hashName(name) % FALLBACK_PALETTE.length];\n\n return (\n <span\n ref={ref}\n className={cx('v8-avatar', `v8-avatar--${size}`, className)}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: px,\n height: px,\n borderRadius: 'var(--radius-pill)',\n overflow: 'hidden',\n background: fallbackBg,\n color: 'white',\n fontSize: SIZE_FS[size],\n fontWeight: 600,\n flexShrink: 0,\n userSelect: 'none',\n ...style,\n }}\n aria-label={name}\n {...rest}\n >\n {src !== undefined ? (\n <img\n src={src}\n alt=\"\"\n style={{ width: '100%', height: '100%', objectFit: 'cover' }}\n />\n ) : (\n init\n )}\n {status !== undefined && (\n <span\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n bottom: 0,\n right: 0,\n width: Math.max(6, Math.floor(px * 0.28)),\n height: Math.max(6, Math.floor(px * 0.28)),\n borderRadius: 'var(--radius-pill)',\n background: STATUS_FG[status],\n border: '2px solid var(--surface-0)',\n }}\n />\n )}\n </span>\n );\n});\n\n/**\n * AvatarStack — overlapping avatars. Use for \"assigned to N people\" lists.\n */\nexport interface AvatarStackProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n size?: AvatarSize;\n max?: number;\n}\n\nexport const AvatarStack = forwardRef<HTMLDivElement, AvatarStackProps>(function AvatarStack(\n props,\n ref,\n) {\n const { children, size = 'sm', className, style, ...rest } = props;\n return (\n <div\n ref={ref}\n className={cx('v8-avatar-stack', className)}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n ...style,\n }}\n {...rest}\n >\n <StackedChildren size={size}>{children}</StackedChildren>\n </div>\n );\n});\n\nfunction StackedChildren({ children, size }: { children: ReactNode; size: AvatarSize }) {\n const px = SIZE_PX[size];\n return (\n <>\n {Array.isArray(children)\n ? children.map((child, i) => (\n <span\n key={i}\n style={{\n marginLeft: i === 0 ? 0 : -Math.floor(px * 0.3),\n border: '2px solid var(--surface-0)',\n borderRadius: 'var(--radius-pill)',\n display: 'inline-flex',\n }}\n >\n {child}\n </span>\n ))\n : <span style={{ border: '2px solid var(--surface-0)', borderRadius: 'var(--radius-pill)' }}>{children}</span>}\n </>\n );\n}"],"names":["GitBranch","createLucideIcon","Banner","forwardRef","props","ref","tone","children","action","className","rest","jsxs","cx","jsx","SIZE_PX","SIZE_FS","STATUS_FG","deriveInitials","name","parts","first","_a","last","_b","hashName","h","i","FALLBACK_PALETTE","Avatar","src","size","initials","status","style","px","init","fallbackBg","StackedChildren","Fragment","child"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"Avatar-B41upSD1.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/git-branch.js","../../src/web/v8/ui/feedback/Banner.tsx","../../src/web/v8/ui/data/Avatar.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst GitBranch = createLucideIcon(\"GitBranch\", [\n [\"line\", { x1: \"6\", x2: \"6\", y1: \"3\", y2: \"15\", key: \"17qcm7\" }],\n [\"circle\", { cx: \"18\", cy: \"6\", r: \"3\", key: \"1h7g24\" }],\n [\"circle\", { cx: \"6\", cy: \"18\", r: \"3\", key: \"fqmcym\" }],\n [\"path\", { d: \"M18 9a9 9 0 0 1-9 9\", key: \"n2h4wq\" }]\n]);\n\nexport { GitBranch as default };\n//# sourceMappingURL=git-branch.js.map\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Banner — a top-of-page contextual announcement.\n *\n * Use sparingly. Distinct from StatusBar (which is system-level) and\n * Alert (which is inline). Banner occupies its own row above the page header.\n */\nexport interface BannerProps extends HTMLAttributes<HTMLDivElement> {\n tone?: 'info' | 'warning' | 'success' | 'danger';\n children: ReactNode;\n action?: ReactNode;\n}\n\nexport const Banner = forwardRef<HTMLDivElement, BannerProps>(function Banner(props, ref) {\n const { tone = 'info', children, action, className, ...rest } = props;\n return (\n <div\n ref={ref}\n role={tone === 'danger' ? 'alert' : 'status'}\n className={cx('v8-banner', `v8-banner--${tone}`, className)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--space-3)',\n padding: 'var(--space-3) var(--space-4)',\n background: `color-mix(in oklch, var(--${tone}) 8%, var(--surface-1))`,\n borderBottom: '1px solid var(--border)',\n fontSize: 'var(--fs-13)',\n color: 'var(--fg)',\n }}\n {...rest}\n >\n <div style={{ flex: 1, minWidth: 0 }}>{children}</div>\n {action !== undefined && <div style={{ flexShrink: 0 }}>{action}</div>}\n </div>\n );\n});","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Avatar — user/agent representation. Falls back to initials when no image.\n *\n * Sizes: xs (20) | sm (24) | md (32) | lg (40) | xl (56).\n * Renders a <span> by default; use `asChild` to swap for a button/link.\n */\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport interface AvatarProps extends HTMLAttributes<HTMLSpanElement> {\n name: string;\n src?: string;\n size?: AvatarSize;\n /** Override the generated initials. */\n initials?: string;\n /** Optional status dot (online/offline/busy). */\n status?: 'online' | 'offline' | 'busy' | 'away';\n}\n\nconst SIZE_PX: Record<AvatarSize, number> = { xs: 20, sm: 24, md: 32, lg: 40, xl: 56 };\nconst SIZE_FS: Record<AvatarSize, string> = {\n xs: 'var(--fs-12)',\n sm: 'var(--fs-12)',\n md: 'var(--fs-13)',\n lg: 'var(--fs-14)',\n xl: 'var(--fs-18)',\n};\n\nconst STATUS_FG = {\n online: 'var(--success)',\n offline: 'var(--fg-subtle)',\n busy: 'var(--danger)',\n away: 'var(--warning)',\n} as const;\n\nfunction deriveInitials(name: string): string {\n const parts = name.trim().split(/\\s+/);\n if (parts.length === 0 || parts[0] === undefined) return '?';\n if (parts.length === 1) {\n const first = parts[0] ?? '';\n return first.slice(0, 2).toUpperCase();\n }\n const first = parts[0]?.[0] ?? '';\n const last = parts[parts.length - 1]?.[0] ?? '';\n return `${first}${last}`.toUpperCase();\n}\n\n// Deterministic color from name — used as fallback when no image.\nfunction hashName(name: string): number {\n let h = 0;\n for (let i = 0; i < name.length; i++) h = (h * 31 + name.charCodeAt(i)) | 0;\n return Math.abs(h);\n}\n\nconst FALLBACK_PALETTE = [\n 'oklch(0.65 0.15 240)',\n 'oklch(0.65 0.15 30)',\n 'oklch(0.65 0.15 140)',\n 'oklch(0.65 0.15 320)',\n 'oklch(0.65 0.15 80)',\n 'oklch(0.65 0.15 200)',\n];\n\nexport const Avatar = forwardRef<HTMLSpanElement, AvatarProps>(function Avatar(props, ref) {\n const { name, src, size = 'md', initials, status, className, style, ...rest } = props;\n const px = SIZE_PX[size];\n const init = initials ?? deriveInitials(name);\n const fallbackBg = FALLBACK_PALETTE[hashName(name) % FALLBACK_PALETTE.length];\n\n return (\n <span\n ref={ref}\n className={cx('v8-avatar', `v8-avatar--${size}`, className)}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: px,\n height: px,\n borderRadius: 'var(--radius-pill)',\n overflow: 'hidden',\n background: fallbackBg,\n color: 'white',\n fontSize: SIZE_FS[size],\n fontWeight: 600,\n flexShrink: 0,\n userSelect: 'none',\n ...style,\n }}\n aria-label={name}\n {...rest}\n >\n {src !== undefined ? (\n <img\n src={src}\n alt=\"\"\n style={{ width: '100%', height: '100%', objectFit: 'cover' }}\n />\n ) : (\n init\n )}\n {status !== undefined && (\n <span\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n bottom: 0,\n right: 0,\n width: Math.max(6, Math.floor(px * 0.28)),\n height: Math.max(6, Math.floor(px * 0.28)),\n borderRadius: 'var(--radius-pill)',\n background: STATUS_FG[status],\n border: '2px solid var(--surface-0)',\n }}\n />\n )}\n </span>\n );\n});\n\n/**\n * AvatarStack — overlapping avatars. Use for \"assigned to N people\" lists.\n */\nexport interface AvatarStackProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n size?: AvatarSize;\n max?: number;\n}\n\nexport const AvatarStack = forwardRef<HTMLDivElement, AvatarStackProps>(function AvatarStack(\n props,\n ref,\n) {\n const { children, size = 'sm', className, style, ...rest } = props;\n return (\n <div\n ref={ref}\n className={cx('v8-avatar-stack', className)}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n ...style,\n }}\n {...rest}\n >\n <StackedChildren size={size}>{children}</StackedChildren>\n </div>\n );\n});\n\nfunction StackedChildren({ children, size }: { children: ReactNode; size: AvatarSize }) {\n const px = SIZE_PX[size];\n return (\n <>\n {Array.isArray(children)\n ? children.map((child, i) => (\n <span\n key={i}\n style={{\n marginLeft: i === 0 ? 0 : -Math.floor(px * 0.3),\n border: '2px solid var(--surface-0)',\n borderRadius: 'var(--radius-pill)',\n display: 'inline-flex',\n }}\n >\n {child}\n </span>\n ))\n : <span style={{ border: '2px solid var(--surface-0)', borderRadius: 'var(--radius-pill)' }}>{children}</span>}\n </>\n );\n}"],"names":["GitBranch","createLucideIcon","Banner","forwardRef","props","ref","tone","children","action","className","rest","jsxs","cx","jsx","SIZE_PX","SIZE_FS","STATUS_FG","deriveInitials","name","parts","first","_a","last","_b","hashName","h","i","FALLBACK_PALETTE","Avatar","src","size","initials","status","style","px","init","fallbackBg","StackedChildren","Fragment","child"],"mappings":"4FAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAYC,EAAiB,YAAa,CAC9C,CAAC,OAAQ,CAAE,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,KAAM,IAAK,QAAQ,CAAE,EAC/D,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,IAAK,EAAG,IAAK,IAAK,SAAU,EACvD,CAAC,SAAU,CAAE,GAAI,IAAK,GAAI,KAAM,EAAG,IAAK,IAAK,SAAU,EACvD,CAAC,OAAQ,CAAE,EAAG,sBAAuB,IAAK,QAAQ,CAAE,CACtD,CAAC,ECCYC,EAASC,EAAAA,WAAwC,SAAgBC,EAAOC,EAAK,CACxF,KAAM,CAAE,KAAAC,EAAO,OAAQ,SAAAC,EAAU,OAAAC,EAAQ,UAAAC,EAAW,GAAGC,GAASN,EAChE,OACEO,EAAAA,KAAC,MAAA,CACC,IAAAN,EACA,KAAMC,IAAS,SAAW,QAAU,SACpC,UAAWM,EAAG,YAAa,cAAcN,CAAI,GAAIG,CAAS,EAC1D,MAAO,CACL,QAAS,OACT,WAAY,SACZ,IAAK,iBACL,QAAS,gCACT,WAAY,6BAA6BH,CAAI,0BAC7C,aAAc,0BACd,SAAU,eACV,MAAO,WAAA,EAER,GAAGI,EAEJ,SAAA,CAAAG,MAAC,MAAA,CAAI,MAAO,CAAE,KAAM,EAAG,SAAU,GAAM,SAAAN,EAAS,EAC/CC,IAAW,QAAaK,MAAC,MAAA,CAAI,MAAO,CAAE,WAAY,CAAA,EAAM,SAAAL,CAAA,CAAO,CAAA,CAAA,CAAA,CAGtE,CAAC,ECjBKM,EAAsC,CAAE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EAC5EC,EAAsC,CAC1C,GAAI,eACJ,GAAI,eACJ,GAAI,eACJ,GAAI,eACJ,GAAI,cACN,EAEMC,EAAY,CAChB,OAAQ,iBACR,QAAS,mBACT,KAAM,gBACN,KAAM,gBACR,EAEA,SAASC,EAAeC,EAAsB,SAC5C,MAAMC,EAAQD,EAAK,KAAA,EAAO,MAAM,KAAK,EACrC,GAAIC,EAAM,SAAW,GAAKA,EAAM,CAAC,IAAM,OAAW,MAAO,IACzD,GAAIA,EAAM,SAAW,EAEnB,OADcA,EAAM,CAAC,GAAK,IACb,MAAM,EAAG,CAAC,EAAE,YAAA,EAE3B,MAAMC,IAAQC,EAAAF,EAAM,CAAC,IAAP,YAAAE,EAAW,KAAM,GACzBC,IAAOC,EAAAJ,EAAMA,EAAM,OAAS,CAAC,IAAtB,YAAAI,EAA0B,KAAM,GAC7C,MAAO,GAAGH,CAAK,GAAGE,CAAI,GAAG,YAAA,CAC3B,CAGA,SAASE,EAASN,EAAsB,CACtC,IAAIO,EAAI,EACR,QAASC,EAAI,EAAGA,EAAIR,EAAK,OAAQQ,IAAKD,EAAKA,EAAI,GAAKP,EAAK,WAAWQ,CAAC,EAAK,EAC1E,OAAO,KAAK,IAAID,CAAC,CACnB,CAEA,MAAME,EAAmB,CACvB,uBACA,sBACA,uBACA,uBACA,sBACA,sBACF,EAEaC,EAASzB,EAAAA,WAAyC,SAAgBC,EAAOC,EAAK,CACzF,KAAM,CAAE,KAAAa,EAAM,IAAAW,EAAK,KAAAC,EAAO,KAAM,SAAAC,EAAU,OAAAC,EAAQ,UAAAvB,EAAW,MAAAwB,EAAO,GAAGvB,CAAA,EAASN,EAC1E8B,EAAKpB,EAAQgB,CAAI,EACjBK,EAAOJ,GAAYd,EAAeC,CAAI,EACtCkB,EAAaT,EAAiBH,EAASN,CAAI,EAAIS,EAAiB,MAAM,EAE5E,OACEhB,EAAAA,KAAC,OAAA,CACC,IAAAN,EACA,UAAWO,EAAG,YAAa,cAAckB,CAAI,GAAIrB,CAAS,EAC1D,MAAO,CACL,SAAU,WACV,QAAS,cACT,WAAY,SACZ,eAAgB,SAChB,MAAOyB,EACP,OAAQA,EACR,aAAc,qBACd,SAAU,SACV,WAAYE,EACZ,MAAO,QACP,SAAUrB,EAAQe,CAAI,EACtB,WAAY,IACZ,WAAY,EACZ,WAAY,OACZ,GAAGG,CAAA,EAEL,aAAYf,EACX,GAAGR,EAEH,SAAA,CAAAmB,IAAQ,OACPhB,EAAAA,IAAC,MAAA,CACC,IAAAgB,EACA,IAAI,GACJ,MAAO,CAAE,MAAO,OAAQ,OAAQ,OAAQ,UAAW,OAAA,CAAQ,CAAA,EAG7DM,EAEDH,IAAW,QACVnB,EAAAA,IAAC,OAAA,CACC,cAAY,OACZ,MAAO,CACL,SAAU,WACV,OAAQ,EACR,MAAO,EACP,MAAO,KAAK,IAAI,EAAG,KAAK,MAAMqB,EAAK,GAAI,CAAC,EACxC,OAAQ,KAAK,IAAI,EAAG,KAAK,MAAMA,EAAK,GAAI,CAAC,EACzC,aAAc,qBACd,WAAYlB,EAAUgB,CAAM,EAC5B,OAAQ,4BAAA,CACV,CAAA,CACF,CAAA,CAAA,CAIR,CAAC,EAW0B7B,EAAAA,WAA6C,SACtEC,EACAC,EACA,CACA,KAAM,CAAE,SAAAE,EAAU,KAAAuB,EAAO,KAAM,UAAArB,EAAW,MAAAwB,EAAO,GAAGvB,GAASN,EAC7D,OACES,EAAAA,IAAC,MAAA,CACC,IAAAR,EACA,UAAWO,EAAG,kBAAmBH,CAAS,EAC1C,MAAO,CACL,QAAS,cACT,WAAY,SACZ,GAAGwB,CAAA,EAEJ,GAAGvB,EAEJ,SAAAG,EAAAA,IAACwB,EAAA,CAAgB,KAAAP,EAAa,SAAAvB,CAAA,CAAS,CAAA,CAAA,CAG7C,CAAC,EAED,SAAS8B,EAAgB,CAAE,SAAA9B,EAAU,KAAAuB,GAAmD,CACtF,MAAMI,EAAKpB,EAAQgB,CAAI,EACvB,OACEjB,EAAAA,IAAAyB,EAAAA,SAAA,CACG,eAAM,QAAQ/B,CAAQ,EACnBA,EAAS,IAAI,CAACgC,EAAOb,IACnBb,EAAAA,IAAC,OAAA,CAEC,MAAO,CACL,WAAYa,IAAM,EAAI,EAAI,CAAC,KAAK,MAAMQ,EAAK,EAAG,EAC9C,OAAQ,6BACR,aAAc,qBACd,QAAS,aAAA,EAGV,SAAAK,CAAA,EARIb,CAAA,CAUR,EACDb,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,OAAQ,6BAA8B,aAAc,oBAAA,EAAyB,SAAAN,CAAA,CAAS,CAAA,CAC3G,CAEJ","x_google_ignoreList":[0]}
@@ -1 +1 @@
1
- import{r as t,j as e}from"./cmdk-DVxytz9i.js";import{u as X,a as Z,i as f,S as g,I as a,B as S,h as M,j as A,d as l,x as _,F as v}from"./main-CyAIirBB.js";import{V as ee}from"./ViewHeader-V_SzbUpw.js";import{C as y,b as k}from"./Card-D9019JOD.js";import{P as F}from"./pause-CKYjSTGX.js";import{P as K}from"./play-CGxZWqtW.js";import{R as O}from"./rotate-cw-CsTtaLV2.js";import{T as W}from"./trash-2-2NsyTU8c.js";import{T as H}from"./triangle-alert-DFmQ_RXN.js";import{C as ne}from"./circle-check-COtVgsWw.js";function L(s){switch(s){case"running":return K;case"paused":return F;case"done":return ne;case"error":return H;case"killed":return W;default:return A}}function h(s){switch(s){case"running":return"info";case"paused":return"warning";case"done":return"success";case"error":return"danger";case"killed":return"neutral";default:return"neutral"}}function re(s){if(!s)return"—";const c=Math.floor((Date.now()-s)/1e3);if(c<60)return`${c}s`;const p=Math.floor(c/60);return p<60?`${p}m ${c%60}s`:`${Math.floor(p/60)}h ${p%60}m`}function he(){const s=X("/api/background"),[c,p]=t.useState([]),[i,w]=t.useState(null),[C,z]=t.useState([]),[J,$]=t.useState(!1),[R,T]=t.useState(!1),[B,o]=t.useState(null),[P,b]=t.useState(null);Z("background:change",t.useCallback(n=>{const r=n;s.refetch(),r.id&&r.id===i&&I(r.id)},[s,i]));const d=t.useMemo(()=>{var n;return[...c,...((n=s.data)==null?void 0:n.instances)||[]]},[c,s.data]),x=t.useMemo(()=>i?d.find(n=>n.instanceId===i)??null:null,[i,d]),I=async n=>{$(!0);try{const r=await f(`/api/background/${encodeURIComponent(n)}/output?lines=100`);z(r.lines??[])}catch{z([])}finally{$(!1)}},V=async n=>{w(n.instanceId),await I(n.instanceId)},m=()=>{s.refetch()},D=async n=>{o(null);try{await f(`/api/background/${encodeURIComponent(n)}/pause`,{method:"POST"}),m()}catch(r){o(r instanceof v?r.message:String(r))}},N=async n=>{o(null);try{await f(`/api/background/${encodeURIComponent(n)}/resume`,{method:"POST"}),m()}catch(r){o(r instanceof v?r.message:String(r))}},G=async n=>{o(null);try{await f(`/api/background/${encodeURIComponent(n)}/retry`,{method:"POST"}),m()}catch(r){o(r instanceof v?r.message:String(r))}},Y=async n=>{o(null),T(!0);try{await f(`/api/background/${encodeURIComponent(n)}`,{method:"DELETE"}),b(null),i===n&&w(null),m()}catch(r){o(r instanceof v?r.message:String(r))}finally{T(!1)}},q=t.useMemo(()=>{const n={pending:0,running:0,paused:0,done:0,error:0,killed:0,unknown:0};for(const r of d){const u=r.status||"unknown";n[u]=(n[u]??0)+1}return n},[d]);return e.jsxs(g,{gap:5,"data-testid":"background-view",children:[e.jsx(ee,{title:"Background Jobs",description:"Live background agent sessions. Pause, resume, retry, or kill."}),B!==null&&e.jsx("div",{role:"alert",style:{padding:"var(--space-2) var(--space-3)",background:"color-mix(in oklch, var(--danger) 12%, var(--surface-0))",border:"1px solid var(--danger)",borderRadius:"var(--radius-md)",fontSize:"var(--fs-12)",color:"var(--danger)"},children:B}),d.length>0&&e.jsx(a,{gap:3,wrap:!0,children:["running","paused","pending","done","error"].map(n=>{const r=q[n];if(r===0)return null;const u=L(n);return e.jsxs(a,{align:"center",gap:2,style:{padding:"4px 10px",background:"var(--surface-1)",borderRadius:"var(--radius-pill)",border:"1px solid var(--border)"},children:[e.jsx(u,{size:12,"aria-hidden":!0,style:{color:`var(--${h(n)==="neutral"?"fg-muted":h(n)})`}}),e.jsx("span",{style:{fontSize:"var(--fs-12)"},children:n}),e.jsx(S,{tone:h(n),children:r})]},n)})}),s.loading&&d.length===0?e.jsx(M,{style:{height:240}}):d.length===0?e.jsx(y,{children:e.jsx(k,{children:e.jsxs(g,{gap:1,align:"center",children:[e.jsx(A,{size:32,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsx("strong",{children:"No background jobs"}),e.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-13)"},children:"Background agents appear here when spawned."})]})})}):e.jsxs(U,{style:{display:"grid",gridTemplateColumns:x?"1fr 380px":"1fr",gap:"var(--space-4)"},children:[e.jsx(g,{gap:2,children:d.map(n=>{var E;const r=n.status||"unknown",u=L(r),Q=n.instanceId===i;return e.jsx(y,{"data-testid":`bg-instance-${n.instanceId}`,style:{cursor:"pointer",outline:Q?"2px solid var(--accent)":void 0,outlineOffset:-2},onClick:()=>{V(n)},children:e.jsx(k,{children:e.jsxs(a,{align:"center",gap:3,children:[e.jsx(u,{size:16,"aria-hidden":!0,style:{color:`var(--${h(r)==="neutral"?"fg-muted":h(r)})`}}),e.jsxs(g,{gap:1,style:{flex:1,minWidth:0},children:[e.jsxs(a,{align:"center",gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-14)"},children:n.agent??n.instanceId.slice(0,8)}),e.jsx(S,{tone:h(r),children:r}),(E=n.tags)==null?void 0:E.map(j=>e.jsx(S,{tone:"neutral",children:j},j))]}),e.jsxs(a,{gap:3,children:[n.worktree&&e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:n.worktree}),e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:re(n.startedAt??n.createdAt)}),n.pid&&e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["pid ",n.pid]})]})]}),e.jsxs(a,{gap:1,align:"center",onClick:j=>j.stopPropagation(),children:[r==="running"&&e.jsx(l,{variant:"secondary",size:"sm",onClick:()=>{D(n.instanceId)},"data-testid":`bg-pause-${n.instanceId}`,title:"Pause",children:e.jsx(F,{size:12,"aria-hidden":!0})}),r==="paused"&&e.jsx(l,{variant:"secondary",size:"sm",onClick:()=>{N(n.instanceId)},"data-testid":`bg-resume-${n.instanceId}`,title:"Resume",children:e.jsx(K,{size:12,"aria-hidden":!0})}),(r==="error"||r==="killed")&&e.jsx(l,{variant:"secondary",size:"sm",onClick:()=>{G(n.instanceId)},"data-testid":`bg-retry-${n.instanceId}`,title:"Retry",children:e.jsx(O,{size:12,"aria-hidden":!0})}),e.jsx(l,{variant:"danger",size:"sm",onClick:()=>b(n.instanceId),"data-testid":`bg-kill-${n.instanceId}`,title:"Kill",children:e.jsx(W,{size:12,"aria-hidden":!0})})]})]})})},n.instanceId)})}),x&&e.jsx(y,{children:e.jsx(k,{children:e.jsxs(g,{gap:3,children:[e.jsxs(a,{align:"center",justify:"between",children:[e.jsxs(a,{align:"center",gap:2,children:[e.jsx(_,{size:12,"aria-hidden":!0}),e.jsx("span",{style:{fontSize:"var(--fs-13)",fontWeight:600},children:"Output"})]}),e.jsx(l,{variant:"ghost",size:"sm",onClick:()=>{x&&I(x.instanceId)},children:e.jsx(O,{size:12,"aria-hidden":!0})})]}),J?e.jsx(M,{style:{height:160}}):C.length===0?e.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-12)"},children:"No output captured yet."}):e.jsx(U,{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",padding:"var(--space-3)",maxHeight:320,overflowY:"auto",whiteSpace:"pre-wrap",wordBreak:"break-word",lineHeight:1.6},children:C.map((n,r)=>e.jsx("div",{children:n},r))})]})})})]}),P&&e.jsx("div",{role:"dialog","aria-modal":!0,style:{position:"fixed",inset:0,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.4)",zIndex:100},"data-testid":"bg-kill-confirm",children:e.jsx(y,{style:{maxWidth:400},children:e.jsx(k,{children:e.jsxs(g,{gap:4,children:[e.jsxs(a,{align:"center",gap:2,children:[e.jsx(H,{size:16,"aria-hidden":!0,style:{color:"var(--danger)"}}),e.jsx("strong",{children:"Kill this background job?"})]}),e.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-13)"},children:"This sends SIGTERM to the process. The instance will transition to “killed” status."}),e.jsxs(a,{gap:2,children:[e.jsx(l,{variant:"danger",onClick:()=>{Y(P)},disabled:R,children:"Kill"}),e.jsx(l,{variant:"ghost",onClick:()=>b(null),disabled:R,children:"Cancel"})]})]})})})})]})}function U(s){return e.jsx("div",{style:s.style,children:s.children})}export{he as BackgroundJobsView};
1
+ import{r as t,j as e}from"./cmdk-DVxytz9i.js";import{u as X,a as Z,i as f,S as g,I as a,B as S,h as M,j as A,d as l,x as _,F as v}from"./main-Cxeu4LhG.js";import{V as ee}from"./ViewHeader-B6P-C4GD.js";import{C as y,b as k}from"./Card-rF59wHiO.js";import{P as F}from"./pause-DUn9L5PB.js";import{P as K}from"./play-CZjsr3XM.js";import{R as O}from"./rotate-cw-CDOlRtUR.js";import{T as W}from"./trash-2-Cv7U38jw.js";import{T as H}from"./triangle-alert-tUTXbcEP.js";import{C as ne}from"./circle-check-Cs-xoV7R.js";function L(s){switch(s){case"running":return K;case"paused":return F;case"done":return ne;case"error":return H;case"killed":return W;default:return A}}function h(s){switch(s){case"running":return"info";case"paused":return"warning";case"done":return"success";case"error":return"danger";case"killed":return"neutral";default:return"neutral"}}function re(s){if(!s)return"—";const c=Math.floor((Date.now()-s)/1e3);if(c<60)return`${c}s`;const p=Math.floor(c/60);return p<60?`${p}m ${c%60}s`:`${Math.floor(p/60)}h ${p%60}m`}function he(){const s=X("/api/background"),[c,p]=t.useState([]),[i,w]=t.useState(null),[C,z]=t.useState([]),[J,$]=t.useState(!1),[R,T]=t.useState(!1),[B,o]=t.useState(null),[P,b]=t.useState(null);Z("background:change",t.useCallback(n=>{const r=n;s.refetch(),r.id&&r.id===i&&I(r.id)},[s,i]));const d=t.useMemo(()=>{var n;return[...c,...((n=s.data)==null?void 0:n.instances)||[]]},[c,s.data]),x=t.useMemo(()=>i?d.find(n=>n.instanceId===i)??null:null,[i,d]),I=async n=>{$(!0);try{const r=await f(`/api/background/${encodeURIComponent(n)}/output?lines=100`);z(r.lines??[])}catch{z([])}finally{$(!1)}},V=async n=>{w(n.instanceId),await I(n.instanceId)},m=()=>{s.refetch()},D=async n=>{o(null);try{await f(`/api/background/${encodeURIComponent(n)}/pause`,{method:"POST"}),m()}catch(r){o(r instanceof v?r.message:String(r))}},N=async n=>{o(null);try{await f(`/api/background/${encodeURIComponent(n)}/resume`,{method:"POST"}),m()}catch(r){o(r instanceof v?r.message:String(r))}},G=async n=>{o(null);try{await f(`/api/background/${encodeURIComponent(n)}/retry`,{method:"POST"}),m()}catch(r){o(r instanceof v?r.message:String(r))}},Y=async n=>{o(null),T(!0);try{await f(`/api/background/${encodeURIComponent(n)}`,{method:"DELETE"}),b(null),i===n&&w(null),m()}catch(r){o(r instanceof v?r.message:String(r))}finally{T(!1)}},q=t.useMemo(()=>{const n={pending:0,running:0,paused:0,done:0,error:0,killed:0,unknown:0};for(const r of d){const u=r.status||"unknown";n[u]=(n[u]??0)+1}return n},[d]);return e.jsxs(g,{gap:5,"data-testid":"background-view",children:[e.jsx(ee,{title:"Background Jobs",description:"Live background agent sessions. Pause, resume, retry, or kill."}),B!==null&&e.jsx("div",{role:"alert",style:{padding:"var(--space-2) var(--space-3)",background:"color-mix(in oklch, var(--danger) 12%, var(--surface-0))",border:"1px solid var(--danger)",borderRadius:"var(--radius-md)",fontSize:"var(--fs-12)",color:"var(--danger)"},children:B}),d.length>0&&e.jsx(a,{gap:3,wrap:!0,children:["running","paused","pending","done","error"].map(n=>{const r=q[n];if(r===0)return null;const u=L(n);return e.jsxs(a,{align:"center",gap:2,style:{padding:"4px 10px",background:"var(--surface-1)",borderRadius:"var(--radius-pill)",border:"1px solid var(--border)"},children:[e.jsx(u,{size:12,"aria-hidden":!0,style:{color:`var(--${h(n)==="neutral"?"fg-muted":h(n)})`}}),e.jsx("span",{style:{fontSize:"var(--fs-12)"},children:n}),e.jsx(S,{tone:h(n),children:r})]},n)})}),s.loading&&d.length===0?e.jsx(M,{style:{height:240}}):d.length===0?e.jsx(y,{children:e.jsx(k,{children:e.jsxs(g,{gap:1,align:"center",children:[e.jsx(A,{size:32,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsx("strong",{children:"No background jobs"}),e.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-13)"},children:"Background agents appear here when spawned."})]})})}):e.jsxs(U,{style:{display:"grid",gridTemplateColumns:x?"1fr 380px":"1fr",gap:"var(--space-4)"},children:[e.jsx(g,{gap:2,children:d.map(n=>{var E;const r=n.status||"unknown",u=L(r),Q=n.instanceId===i;return e.jsx(y,{"data-testid":`bg-instance-${n.instanceId}`,style:{cursor:"pointer",outline:Q?"2px solid var(--accent)":void 0,outlineOffset:-2},onClick:()=>{V(n)},children:e.jsx(k,{children:e.jsxs(a,{align:"center",gap:3,children:[e.jsx(u,{size:16,"aria-hidden":!0,style:{color:`var(--${h(r)==="neutral"?"fg-muted":h(r)})`}}),e.jsxs(g,{gap:1,style:{flex:1,minWidth:0},children:[e.jsxs(a,{align:"center",gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-14)"},children:n.agent??n.instanceId.slice(0,8)}),e.jsx(S,{tone:h(r),children:r}),(E=n.tags)==null?void 0:E.map(j=>e.jsx(S,{tone:"neutral",children:j},j))]}),e.jsxs(a,{gap:3,children:[n.worktree&&e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:n.worktree}),e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:re(n.startedAt??n.createdAt)}),n.pid&&e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["pid ",n.pid]})]})]}),e.jsxs(a,{gap:1,align:"center",onClick:j=>j.stopPropagation(),children:[r==="running"&&e.jsx(l,{variant:"secondary",size:"sm",onClick:()=>{D(n.instanceId)},"data-testid":`bg-pause-${n.instanceId}`,title:"Pause",children:e.jsx(F,{size:12,"aria-hidden":!0})}),r==="paused"&&e.jsx(l,{variant:"secondary",size:"sm",onClick:()=>{N(n.instanceId)},"data-testid":`bg-resume-${n.instanceId}`,title:"Resume",children:e.jsx(K,{size:12,"aria-hidden":!0})}),(r==="error"||r==="killed")&&e.jsx(l,{variant:"secondary",size:"sm",onClick:()=>{G(n.instanceId)},"data-testid":`bg-retry-${n.instanceId}`,title:"Retry",children:e.jsx(O,{size:12,"aria-hidden":!0})}),e.jsx(l,{variant:"danger",size:"sm",onClick:()=>b(n.instanceId),"data-testid":`bg-kill-${n.instanceId}`,title:"Kill",children:e.jsx(W,{size:12,"aria-hidden":!0})})]})]})})},n.instanceId)})}),x&&e.jsx(y,{children:e.jsx(k,{children:e.jsxs(g,{gap:3,children:[e.jsxs(a,{align:"center",justify:"between",children:[e.jsxs(a,{align:"center",gap:2,children:[e.jsx(_,{size:12,"aria-hidden":!0}),e.jsx("span",{style:{fontSize:"var(--fs-13)",fontWeight:600},children:"Output"})]}),e.jsx(l,{variant:"ghost",size:"sm",onClick:()=>{x&&I(x.instanceId)},children:e.jsx(O,{size:12,"aria-hidden":!0})})]}),J?e.jsx(M,{style:{height:160}}):C.length===0?e.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-12)"},children:"No output captured yet."}):e.jsx(U,{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",padding:"var(--space-3)",maxHeight:320,overflowY:"auto",whiteSpace:"pre-wrap",wordBreak:"break-word",lineHeight:1.6},children:C.map((n,r)=>e.jsx("div",{children:n},r))})]})})})]}),P&&e.jsx("div",{role:"dialog","aria-modal":!0,style:{position:"fixed",inset:0,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.4)",zIndex:100},"data-testid":"bg-kill-confirm",children:e.jsx(y,{style:{maxWidth:400},children:e.jsx(k,{children:e.jsxs(g,{gap:4,children:[e.jsxs(a,{align:"center",gap:2,children:[e.jsx(H,{size:16,"aria-hidden":!0,style:{color:"var(--danger)"}}),e.jsx("strong",{children:"Kill this background job?"})]}),e.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-13)"},children:"This sends SIGTERM to the process. The instance will transition to “killed” status."}),e.jsxs(a,{gap:2,children:[e.jsx(l,{variant:"danger",onClick:()=>{Y(P)},disabled:R,children:"Kill"}),e.jsx(l,{variant:"ghost",onClick:()=>b(null),disabled:R,children:"Cancel"})]})]})})})})]})}function U(s){return e.jsx("div",{style:s.style,children:s.children})}export{he as BackgroundJobsView};