@theokit/ui 0.13.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.
- package/CHANGELOG.md +1325 -0
- package/DESIGN.md +456 -0
- package/LICENSE +201 -0
- package/NOTICE +38 -0
- package/README.md +467 -0
- package/dist/chunk-27ENTTY7.js +146 -0
- package/dist/chunk-27ENTTY7.js.map +1 -0
- package/dist/chunk-2H6TQELG.js +33 -0
- package/dist/chunk-2H6TQELG.js.map +1 -0
- package/dist/chunk-2L6MRJD4.js +120 -0
- package/dist/chunk-2L6MRJD4.js.map +1 -0
- package/dist/chunk-2Y5V2PAL.js +80 -0
- package/dist/chunk-2Y5V2PAL.js.map +1 -0
- package/dist/chunk-34NAFDVL.js +46 -0
- package/dist/chunk-34NAFDVL.js.map +1 -0
- package/dist/chunk-36KJGXEK.js +112 -0
- package/dist/chunk-36KJGXEK.js.map +1 -0
- package/dist/chunk-3BMYYNN6.js +124 -0
- package/dist/chunk-3BMYYNN6.js.map +1 -0
- package/dist/chunk-3OHV7EEI.js +34 -0
- package/dist/chunk-3OHV7EEI.js.map +1 -0
- package/dist/chunk-3QKTS6F5.js +88 -0
- package/dist/chunk-3QKTS6F5.js.map +1 -0
- package/dist/chunk-3TBXLYNM.js +42 -0
- package/dist/chunk-3TBXLYNM.js.map +1 -0
- package/dist/chunk-4AM2HSXU.js +67 -0
- package/dist/chunk-4AM2HSXU.js.map +1 -0
- package/dist/chunk-4BCGKM65.js +44 -0
- package/dist/chunk-4BCGKM65.js.map +1 -0
- package/dist/chunk-4D3JILQX.js +145 -0
- package/dist/chunk-4D3JILQX.js.map +1 -0
- package/dist/chunk-4EJU2GBG.js +48 -0
- package/dist/chunk-4EJU2GBG.js.map +1 -0
- package/dist/chunk-4WKO3G5C.js +110 -0
- package/dist/chunk-4WKO3G5C.js.map +1 -0
- package/dist/chunk-53XPKI7Q.js +97 -0
- package/dist/chunk-53XPKI7Q.js.map +1 -0
- package/dist/chunk-55TDVDPG.js +58 -0
- package/dist/chunk-55TDVDPG.js.map +1 -0
- package/dist/chunk-56BJLFW7.js +26 -0
- package/dist/chunk-56BJLFW7.js.map +1 -0
- package/dist/chunk-5HOQLE6Y.js +35 -0
- package/dist/chunk-5HOQLE6Y.js.map +1 -0
- package/dist/chunk-5TY3NYF5.js +144 -0
- package/dist/chunk-5TY3NYF5.js.map +1 -0
- package/dist/chunk-5VOSCJKQ.js +92 -0
- package/dist/chunk-5VOSCJKQ.js.map +1 -0
- package/dist/chunk-65NVO6TK.js +171 -0
- package/dist/chunk-65NVO6TK.js.map +1 -0
- package/dist/chunk-6A5TPCKP.js +64 -0
- package/dist/chunk-6A5TPCKP.js.map +1 -0
- package/dist/chunk-6CO4LEXZ.js +41 -0
- package/dist/chunk-6CO4LEXZ.js.map +1 -0
- package/dist/chunk-6FVUPNPG.js +56 -0
- package/dist/chunk-6FVUPNPG.js.map +1 -0
- package/dist/chunk-76YWTIWK.js +106 -0
- package/dist/chunk-76YWTIWK.js.map +1 -0
- package/dist/chunk-7EI7424P.js +78 -0
- package/dist/chunk-7EI7424P.js.map +1 -0
- package/dist/chunk-AHTVYOPQ.js +26 -0
- package/dist/chunk-AHTVYOPQ.js.map +1 -0
- package/dist/chunk-AJTJNHKK.js +85 -0
- package/dist/chunk-AJTJNHKK.js.map +1 -0
- package/dist/chunk-AMT3CPMC.js +155 -0
- package/dist/chunk-AMT3CPMC.js.map +1 -0
- package/dist/chunk-AX5EH73R.js +59 -0
- package/dist/chunk-AX5EH73R.js.map +1 -0
- package/dist/chunk-B3VAJSZ2.js +35 -0
- package/dist/chunk-B3VAJSZ2.js.map +1 -0
- package/dist/chunk-B4CQMQ64.js +25 -0
- package/dist/chunk-B4CQMQ64.js.map +1 -0
- package/dist/chunk-BMRZXT5T.js +115 -0
- package/dist/chunk-BMRZXT5T.js.map +1 -0
- package/dist/chunk-BYZ6OFH4.js +73 -0
- package/dist/chunk-BYZ6OFH4.js.map +1 -0
- package/dist/chunk-C55VUQ7N.js +156 -0
- package/dist/chunk-C55VUQ7N.js.map +1 -0
- package/dist/chunk-D4GEAV4C.js +91 -0
- package/dist/chunk-D4GEAV4C.js.map +1 -0
- package/dist/chunk-DC43CHAM.js +152 -0
- package/dist/chunk-DC43CHAM.js.map +1 -0
- package/dist/chunk-DKCRLN35.js +92 -0
- package/dist/chunk-DKCRLN35.js.map +1 -0
- package/dist/chunk-DN5BUDBI.js +86 -0
- package/dist/chunk-DN5BUDBI.js.map +1 -0
- package/dist/chunk-DOLKDYMS.js +88 -0
- package/dist/chunk-DOLKDYMS.js.map +1 -0
- package/dist/chunk-DW34WXCG.js +28 -0
- package/dist/chunk-DW34WXCG.js.map +1 -0
- package/dist/chunk-DZAAKHGZ.js +135 -0
- package/dist/chunk-DZAAKHGZ.js.map +1 -0
- package/dist/chunk-E4IRSSHO.js +116 -0
- package/dist/chunk-E4IRSSHO.js.map +1 -0
- package/dist/chunk-E67WQXBV.js +104 -0
- package/dist/chunk-E67WQXBV.js.map +1 -0
- package/dist/chunk-EG6IHP3H.js +128 -0
- package/dist/chunk-EG6IHP3H.js.map +1 -0
- package/dist/chunk-EO7LOXG2.js +82 -0
- package/dist/chunk-EO7LOXG2.js.map +1 -0
- package/dist/chunk-EWDN56AS.js +24 -0
- package/dist/chunk-EWDN56AS.js.map +1 -0
- package/dist/chunk-F5P5P2SC.js +141 -0
- package/dist/chunk-F5P5P2SC.js.map +1 -0
- package/dist/chunk-FAWPRZTM.js +79 -0
- package/dist/chunk-FAWPRZTM.js.map +1 -0
- package/dist/chunk-FGYJ2WPX.js +36 -0
- package/dist/chunk-FGYJ2WPX.js.map +1 -0
- package/dist/chunk-GBG3I5I5.js +46 -0
- package/dist/chunk-GBG3I5I5.js.map +1 -0
- package/dist/chunk-GDMCDW66.js +19 -0
- package/dist/chunk-GDMCDW66.js.map +1 -0
- package/dist/chunk-H6HSQCOW.js +80 -0
- package/dist/chunk-H6HSQCOW.js.map +1 -0
- package/dist/chunk-HDM4RCIF.js +111 -0
- package/dist/chunk-HDM4RCIF.js.map +1 -0
- package/dist/chunk-HNTOGGVD.js +77 -0
- package/dist/chunk-HNTOGGVD.js.map +1 -0
- package/dist/chunk-HQW2ABO4.js +28 -0
- package/dist/chunk-HQW2ABO4.js.map +1 -0
- package/dist/chunk-HRDRGZ2Y.js +76 -0
- package/dist/chunk-HRDRGZ2Y.js.map +1 -0
- package/dist/chunk-HUOVA7SF.js +83 -0
- package/dist/chunk-HUOVA7SF.js.map +1 -0
- package/dist/chunk-ITA3SNOR.js +133 -0
- package/dist/chunk-ITA3SNOR.js.map +1 -0
- package/dist/chunk-IYNUPG2G.js +61 -0
- package/dist/chunk-IYNUPG2G.js.map +1 -0
- package/dist/chunk-JJ65ZI4P.js +199 -0
- package/dist/chunk-JJ65ZI4P.js.map +1 -0
- package/dist/chunk-JRBGZ6NI.js +106 -0
- package/dist/chunk-JRBGZ6NI.js.map +1 -0
- package/dist/chunk-K45OO62F.js +108 -0
- package/dist/chunk-K45OO62F.js.map +1 -0
- package/dist/chunk-KDTKA667.js +67 -0
- package/dist/chunk-KDTKA667.js.map +1 -0
- package/dist/chunk-KI7KZBSN.js +142 -0
- package/dist/chunk-KI7KZBSN.js.map +1 -0
- package/dist/chunk-KOJ7XOPZ.js +87 -0
- package/dist/chunk-KOJ7XOPZ.js.map +1 -0
- package/dist/chunk-KQTHJ22B.js +82 -0
- package/dist/chunk-KQTHJ22B.js.map +1 -0
- package/dist/chunk-KRC43RZR.js +77 -0
- package/dist/chunk-KRC43RZR.js.map +1 -0
- package/dist/chunk-LJQOEGQ2.js +116 -0
- package/dist/chunk-LJQOEGQ2.js.map +1 -0
- package/dist/chunk-LKRNUSKZ.js +149 -0
- package/dist/chunk-LKRNUSKZ.js.map +1 -0
- package/dist/chunk-LLL7QQ52.js +76 -0
- package/dist/chunk-LLL7QQ52.js.map +1 -0
- package/dist/chunk-LQ4B5X4Y.js +56 -0
- package/dist/chunk-LQ4B5X4Y.js.map +1 -0
- package/dist/chunk-M3FSLEHQ.js +76 -0
- package/dist/chunk-M3FSLEHQ.js.map +1 -0
- package/dist/chunk-M5G3O6H6.js +57 -0
- package/dist/chunk-M5G3O6H6.js.map +1 -0
- package/dist/chunk-M6JIC5PU.js +81 -0
- package/dist/chunk-M6JIC5PU.js.map +1 -0
- package/dist/chunk-N2HJ3SLS.js +186 -0
- package/dist/chunk-N2HJ3SLS.js.map +1 -0
- package/dist/chunk-NGZWBFTP.js +45 -0
- package/dist/chunk-NGZWBFTP.js.map +1 -0
- package/dist/chunk-OAKCXT35.js +34 -0
- package/dist/chunk-OAKCXT35.js.map +1 -0
- package/dist/chunk-OSD3U3HT.js +54 -0
- package/dist/chunk-OSD3U3HT.js.map +1 -0
- package/dist/chunk-OUXESQ2R.js +42 -0
- package/dist/chunk-OUXESQ2R.js.map +1 -0
- package/dist/chunk-OY2LJHMJ.js +43 -0
- package/dist/chunk-OY2LJHMJ.js.map +1 -0
- package/dist/chunk-OYEZR4CN.js +221 -0
- package/dist/chunk-OYEZR4CN.js.map +1 -0
- package/dist/chunk-P57HUMAE.js +66 -0
- package/dist/chunk-P57HUMAE.js.map +1 -0
- package/dist/chunk-P6Y2PI6L.js +82 -0
- package/dist/chunk-P6Y2PI6L.js.map +1 -0
- package/dist/chunk-PA7TDXUQ.js +51 -0
- package/dist/chunk-PA7TDXUQ.js.map +1 -0
- package/dist/chunk-PPBGGNPV.js +112 -0
- package/dist/chunk-PPBGGNPV.js.map +1 -0
- package/dist/chunk-PRH4HKND.js +48 -0
- package/dist/chunk-PRH4HKND.js.map +1 -0
- package/dist/chunk-PSPAZJUQ.js +32 -0
- package/dist/chunk-PSPAZJUQ.js.map +1 -0
- package/dist/chunk-Q5G5CGZ2.js +170 -0
- package/dist/chunk-Q5G5CGZ2.js.map +1 -0
- package/dist/chunk-QDAF3LP7.js +89 -0
- package/dist/chunk-QDAF3LP7.js.map +1 -0
- package/dist/chunk-QGVIGNJ3.js +37 -0
- package/dist/chunk-QGVIGNJ3.js.map +1 -0
- package/dist/chunk-QNUITYSY.js +68 -0
- package/dist/chunk-QNUITYSY.js.map +1 -0
- package/dist/chunk-QSWVN3RT.js +116 -0
- package/dist/chunk-QSWVN3RT.js.map +1 -0
- package/dist/chunk-QTLQZ7OJ.js +110 -0
- package/dist/chunk-QTLQZ7OJ.js.map +1 -0
- package/dist/chunk-QYAMLIG2.js +84 -0
- package/dist/chunk-QYAMLIG2.js.map +1 -0
- package/dist/chunk-REILH4XF.js +128 -0
- package/dist/chunk-REILH4XF.js.map +1 -0
- package/dist/chunk-S6SSK6QX.js +80 -0
- package/dist/chunk-S6SSK6QX.js.map +1 -0
- package/dist/chunk-SA7ED3PN.js +68 -0
- package/dist/chunk-SA7ED3PN.js.map +1 -0
- package/dist/chunk-SIJOEM4N.js +55 -0
- package/dist/chunk-SIJOEM4N.js.map +1 -0
- package/dist/chunk-SLOKAAH2.js +70 -0
- package/dist/chunk-SLOKAAH2.js.map +1 -0
- package/dist/chunk-TR6NPSMX.js +85 -0
- package/dist/chunk-TR6NPSMX.js.map +1 -0
- package/dist/chunk-TSZ5DEAT.js +106 -0
- package/dist/chunk-TSZ5DEAT.js.map +1 -0
- package/dist/chunk-TUNVF45W.js +127 -0
- package/dist/chunk-TUNVF45W.js.map +1 -0
- package/dist/chunk-TXOBNSQ5.js +63 -0
- package/dist/chunk-TXOBNSQ5.js.map +1 -0
- package/dist/chunk-U44DRLMM.js +88 -0
- package/dist/chunk-U44DRLMM.js.map +1 -0
- package/dist/chunk-U4THNRV5.js +114 -0
- package/dist/chunk-U4THNRV5.js.map +1 -0
- package/dist/chunk-UAZOFC4W.js +72 -0
- package/dist/chunk-UAZOFC4W.js.map +1 -0
- package/dist/chunk-UGKI466V.js +12 -0
- package/dist/chunk-UGKI466V.js.map +1 -0
- package/dist/chunk-VM4RMQQN.js +11 -0
- package/dist/chunk-VM4RMQQN.js.map +1 -0
- package/dist/chunk-VQ37VLAS.js +54 -0
- package/dist/chunk-VQ37VLAS.js.map +1 -0
- package/dist/chunk-VT7VSYH5.js +73 -0
- package/dist/chunk-VT7VSYH5.js.map +1 -0
- package/dist/chunk-VTIRUCLZ.js +57 -0
- package/dist/chunk-VTIRUCLZ.js.map +1 -0
- package/dist/chunk-VVBAEYKI.js +202 -0
- package/dist/chunk-VVBAEYKI.js.map +1 -0
- package/dist/chunk-WHFIQUCC.js +120 -0
- package/dist/chunk-WHFIQUCC.js.map +1 -0
- package/dist/chunk-WPSESV5Z.js +74 -0
- package/dist/chunk-WPSESV5Z.js.map +1 -0
- package/dist/chunk-WXEXCHEN.js +51 -0
- package/dist/chunk-WXEXCHEN.js.map +1 -0
- package/dist/chunk-X2DDPD3D.js +113 -0
- package/dist/chunk-X2DDPD3D.js.map +1 -0
- package/dist/chunk-X7VIMKLD.js +127 -0
- package/dist/chunk-X7VIMKLD.js.map +1 -0
- package/dist/chunk-XJ3EG6XY.js +30 -0
- package/dist/chunk-XJ3EG6XY.js.map +1 -0
- package/dist/chunk-XOT5HWSF.js +23 -0
- package/dist/chunk-XOT5HWSF.js.map +1 -0
- package/dist/chunk-Y72IP43U.js +117 -0
- package/dist/chunk-Y72IP43U.js.map +1 -0
- package/dist/chunk-YD6FLXBV.js +61 -0
- package/dist/chunk-YD6FLXBV.js.map +1 -0
- package/dist/chunk-YEQQGYYO.js +1022 -0
- package/dist/chunk-YEQQGYYO.js.map +1 -0
- package/dist/chunk-YYW6AEIT.js +46 -0
- package/dist/chunk-YYW6AEIT.js.map +1 -0
- package/dist/chunk-ZEVGXKRU.js +104 -0
- package/dist/chunk-ZEVGXKRU.js.map +1 -0
- package/dist/chunk-ZKSMMLDP.js +74 -0
- package/dist/chunk-ZKSMMLDP.js.map +1 -0
- package/dist/chunk-ZU6IM6PK.js +101 -0
- package/dist/chunk-ZU6IM6PK.js.map +1 -0
- package/dist/chunk-ZUS5KZGO.js +714 -0
- package/dist/chunk-ZUS5KZGO.js.map +1 -0
- package/dist/chunk-ZVS2GOT2.js +58 -0
- package/dist/chunk-ZVS2GOT2.js.map +1 -0
- package/dist/chunk-ZXPDS6DH.js +3 -0
- package/dist/chunk-ZXPDS6DH.js.map +1 -0
- package/dist/chunk-ZZQQJX5Z.js +173 -0
- package/dist/chunk-ZZQQJX5Z.js.map +1 -0
- package/dist/components.css +2 -0
- package/dist/composites/account-menu/index.js +6 -0
- package/dist/composites/account-menu/index.js.map +1 -0
- package/dist/composites/agent-composer/index.js +7 -0
- package/dist/composites/agent-composer/index.js.map +1 -0
- package/dist/composites/agent-editor/index.js +10 -0
- package/dist/composites/agent-editor/index.js.map +1 -0
- package/dist/composites/agent-stream/index.js +12 -0
- package/dist/composites/agent-stream/index.js.map +1 -0
- package/dist/composites/agent-timeline/index.js +5 -0
- package/dist/composites/agent-timeline/index.js.map +1 -0
- package/dist/composites/approval-card/index.js +5 -0
- package/dist/composites/approval-card/index.js.map +1 -0
- package/dist/composites/chat-composer/index.js +6 -0
- package/dist/composites/chat-composer/index.js.map +1 -0
- package/dist/composites/chat-message/index.js +6 -0
- package/dist/composites/chat-message/index.js.map +1 -0
- package/dist/composites/code-block/index.js +5 -0
- package/dist/composites/code-block/index.js.map +1 -0
- package/dist/composites/command-palette/index.js +5 -0
- package/dist/composites/command-palette/index.js.map +1 -0
- package/dist/composites/confirm-dialog/index.js +7 -0
- package/dist/composites/confirm-dialog/index.js.map +1 -0
- package/dist/composites/cron-jobs-list/index.js +5 -0
- package/dist/composites/cron-jobs-list/index.js.map +1 -0
- package/dist/composites/data-table/index.js +10 -0
- package/dist/composites/data-table/index.js.map +1 -0
- package/dist/composites/deployment-row/index.js +5 -0
- package/dist/composites/deployment-row/index.js.map +1 -0
- package/dist/composites/domain-config/index.js +7 -0
- package/dist/composites/domain-config/index.js.map +1 -0
- package/dist/composites/env-var-editor/index.js +7 -0
- package/dist/composites/env-var-editor/index.js.map +1 -0
- package/dist/composites/mcp-server-list/index.js +5 -0
- package/dist/composites/mcp-server-list/index.js.map +1 -0
- package/dist/composites/page-shell/index.js +7 -0
- package/dist/composites/page-shell/index.js.map +1 -0
- package/dist/composites/permission-modal/index.js +6 -0
- package/dist/composites/permission-modal/index.js.map +1 -0
- package/dist/composites/preview-env-card/index.js +6 -0
- package/dist/composites/preview-env-card/index.js.map +1 -0
- package/dist/composites/preview-panel/index.js +5 -0
- package/dist/composites/preview-panel/index.js.map +1 -0
- package/dist/composites/project-card/index.js +6 -0
- package/dist/composites/project-card/index.js.map +1 -0
- package/dist/composites/rollback-ui/index.js +6 -0
- package/dist/composites/rollback-ui/index.js.map +1 -0
- package/dist/composites/rule-editor/index.js +11 -0
- package/dist/composites/rule-editor/index.js.map +1 -0
- package/dist/composites/skill-editor/index.js +11 -0
- package/dist/composites/skill-editor/index.js.map +1 -0
- package/dist/composites/skills-list/index.js +5 -0
- package/dist/composites/skills-list/index.js.map +1 -0
- package/dist/composites/stability-bundle-viewer/index.js +4 -0
- package/dist/composites/stability-bundle-viewer/index.js.map +1 -0
- package/dist/composites/task-header/index.js +5 -0
- package/dist/composites/task-header/index.js.map +1 -0
- package/dist/composites/usage-meter/index.js +5 -0
- package/dist/composites/usage-meter/index.js.map +1 -0
- package/dist/fonts/LICENSE-GEIST.txt +92 -0
- package/dist/fonts/geist-400.woff2 +0 -0
- package/dist/fonts/geist-500.woff2 +0 -0
- package/dist/fonts/geist-600.woff2 +0 -0
- package/dist/fonts/geist-mono-400.woff2 +0 -0
- package/dist/fonts/geist-mono-500.woff2 +0 -0
- package/dist/fonts/geist-mono-600.woff2 +0 -0
- package/dist/fonts-cdn.css +28 -0
- package/dist/fonts.css +75 -0
- package/dist/index.d.ts +4621 -0
- package/dist/index.js +1338 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin-D5xmXqYb.d.ts +172 -0
- package/dist/preset-v3-legacy.d.ts +35 -0
- package/dist/preset-v3-legacy.js +159 -0
- package/dist/preset-v3-legacy.js.map +1 -0
- package/dist/preset.css +27 -0
- package/dist/primitives/action-bar/index.js +4 -0
- package/dist/primitives/action-bar/index.js.map +1 -0
- package/dist/primitives/agent-error-card/index.js +5 -0
- package/dist/primitives/agent-error-card/index.js.map +1 -0
- package/dist/primitives/agent-event/index.js +4 -0
- package/dist/primitives/agent-event/index.js.map +1 -0
- package/dist/primitives/agent-handoff/index.js +4 -0
- package/dist/primitives/agent-handoff/index.js.map +1 -0
- package/dist/primitives/agent-profile/index.js +4 -0
- package/dist/primitives/agent-profile/index.js.map +1 -0
- package/dist/primitives/agent-starting-state/index.js +5 -0
- package/dist/primitives/agent-starting-state/index.js.map +1 -0
- package/dist/primitives/agent-streaming/index.js +5 -0
- package/dist/primitives/agent-streaming/index.js.map +1 -0
- package/dist/primitives/alert/index.js +4 -0
- package/dist/primitives/alert/index.js.map +1 -0
- package/dist/primitives/artifact-preview/index.js +4 -0
- package/dist/primitives/artifact-preview/index.js.map +1 -0
- package/dist/primitives/attachment-chip/index.js +4 -0
- package/dist/primitives/attachment-chip/index.js.map +1 -0
- package/dist/primitives/audit-log-entry/index.js +4 -0
- package/dist/primitives/audit-log-entry/index.js.map +1 -0
- package/dist/primitives/auto-compact-notice/index.js +5 -0
- package/dist/primitives/auto-compact-notice/index.js.map +1 -0
- package/dist/primitives/avatar/index.js +4 -0
- package/dist/primitives/avatar/index.js.map +1 -0
- package/dist/primitives/badge/index.js +4 -0
- package/dist/primitives/badge/index.js.map +1 -0
- package/dist/primitives/branch-indicator/index.js +4 -0
- package/dist/primitives/branch-indicator/index.js.map +1 -0
- package/dist/primitives/browser-controls/index.js +4 -0
- package/dist/primitives/browser-controls/index.js.map +1 -0
- package/dist/primitives/build-log-stream/index.js +5 -0
- package/dist/primitives/build-log-stream/index.js.map +1 -0
- package/dist/primitives/button/index.js +4 -0
- package/dist/primitives/button/index.js.map +1 -0
- package/dist/primitives/capability-indicator/index.js +4 -0
- package/dist/primitives/capability-indicator/index.js.map +1 -0
- package/dist/primitives/card/index.js +4 -0
- package/dist/primitives/card/index.js.map +1 -0
- package/dist/primitives/channel-card/index.js +4 -0
- package/dist/primitives/channel-card/index.js.map +1 -0
- package/dist/primitives/chat-thread/index.js +5 -0
- package/dist/primitives/chat-thread/index.js.map +1 -0
- package/dist/primitives/checkbox/index.js +4 -0
- package/dist/primitives/checkbox/index.js.map +1 -0
- package/dist/primitives/context-card/index.js +4 -0
- package/dist/primitives/context-card/index.js.map +1 -0
- package/dist/primitives/context-window-bar/index.js +4 -0
- package/dist/primitives/context-window-bar/index.js.map +1 -0
- package/dist/primitives/copy-button/index.js +4 -0
- package/dist/primitives/copy-button/index.js.map +1 -0
- package/dist/primitives/cost-meter/index.js +4 -0
- package/dist/primitives/cost-meter/index.js.map +1 -0
- package/dist/primitives/created-files-card/index.js +4 -0
- package/dist/primitives/created-files-card/index.js.map +1 -0
- package/dist/primitives/cron-job-card/index.js +4 -0
- package/dist/primitives/cron-job-card/index.js.map +1 -0
- package/dist/primitives/danger-zone/index.js +4 -0
- package/dist/primitives/danger-zone/index.js.map +1 -0
- package/dist/primitives/dialog/index.js +4 -0
- package/dist/primitives/dialog/index.js.map +1 -0
- package/dist/primitives/diff-viewer/index.js +4 -0
- package/dist/primitives/diff-viewer/index.js.map +1 -0
- package/dist/primitives/dropdown-menu/index.js +4 -0
- package/dist/primitives/dropdown-menu/index.js.map +1 -0
- package/dist/primitives/empty-state/index.js +4 -0
- package/dist/primitives/empty-state/index.js.map +1 -0
- package/dist/primitives/export-chat-dialog/index.js +4 -0
- package/dist/primitives/export-chat-dialog/index.js.map +1 -0
- package/dist/primitives/folder-context-card/index.js +4 -0
- package/dist/primitives/folder-context-card/index.js.map +1 -0
- package/dist/primitives/folder-selector/index.js +4 -0
- package/dist/primitives/folder-selector/index.js.map +1 -0
- package/dist/primitives/form-field/index.js +4 -0
- package/dist/primitives/form-field/index.js.map +1 -0
- package/dist/primitives/gateway-status-indicator/index.js +4 -0
- package/dist/primitives/gateway-status-indicator/index.js.map +1 -0
- package/dist/primitives/hook-config/index.js +4 -0
- package/dist/primitives/hook-config/index.js.map +1 -0
- package/dist/primitives/hook-event-log/index.js +4 -0
- package/dist/primitives/hook-event-log/index.js.map +1 -0
- package/dist/primitives/input/index.js +4 -0
- package/dist/primitives/input/index.js.map +1 -0
- package/dist/primitives/intent-selector/index.js +4 -0
- package/dist/primitives/intent-selector/index.js.map +1 -0
- package/dist/primitives/label/index.js +4 -0
- package/dist/primitives/label/index.js.map +1 -0
- package/dist/primitives/lane-board/index.js +4 -0
- package/dist/primitives/lane-board/index.js.map +1 -0
- package/dist/primitives/login-split/index.js +4 -0
- package/dist/primitives/login-split/index.js.map +1 -0
- package/dist/primitives/mcp-server-card/index.js +4 -0
- package/dist/primitives/mcp-server-card/index.js.map +1 -0
- package/dist/primitives/memory-editor/index.js +4 -0
- package/dist/primitives/memory-editor/index.js.map +1 -0
- package/dist/primitives/mention-menu/index.js +4 -0
- package/dist/primitives/mention-menu/index.js.map +1 -0
- package/dist/primitives/metrics-panel/index.js +4 -0
- package/dist/primitives/metrics-panel/index.js.map +1 -0
- package/dist/primitives/model-card/index.js +4 -0
- package/dist/primitives/model-card/index.js.map +1 -0
- package/dist/primitives/model-selector/index.js +4 -0
- package/dist/primitives/model-selector/index.js.map +1 -0
- package/dist/primitives/pagination/index.js +4 -0
- package/dist/primitives/pagination/index.js.map +1 -0
- package/dist/primitives/permission-matrix/index.js +4 -0
- package/dist/primitives/permission-matrix/index.js.map +1 -0
- package/dist/primitives/pin-input/index.js +4 -0
- package/dist/primitives/pin-input/index.js.map +1 -0
- package/dist/primitives/plan-badge/index.js +4 -0
- package/dist/primitives/plan-badge/index.js.map +1 -0
- package/dist/primitives/progress/index.js +4 -0
- package/dist/primitives/progress/index.js.map +1 -0
- package/dist/primitives/progress-checklist/index.js +4 -0
- package/dist/primitives/progress-checklist/index.js.map +1 -0
- package/dist/primitives/project-switcher/index.js +4 -0
- package/dist/primitives/project-switcher/index.js.map +1 -0
- package/dist/primitives/quick-action-chips/index.js +4 -0
- package/dist/primitives/quick-action-chips/index.js.map +1 -0
- package/dist/primitives/radio-group/index.js +4 -0
- package/dist/primitives/radio-group/index.js.map +1 -0
- package/dist/primitives/recent-folders-list/index.js +4 -0
- package/dist/primitives/recent-folders-list/index.js.map +1 -0
- package/dist/primitives/rule-card/index.js +4 -0
- package/dist/primitives/rule-card/index.js.map +1 -0
- package/dist/primitives/run-stats/index.js +4 -0
- package/dist/primitives/run-stats/index.js.map +1 -0
- package/dist/primitives/run-status-pill/index.js +4 -0
- package/dist/primitives/run-status-pill/index.js.map +1 -0
- package/dist/primitives/running-tasks-panel/index.js +4 -0
- package/dist/primitives/running-tasks-panel/index.js.map +1 -0
- package/dist/primitives/scroll-area/index.js +4 -0
- package/dist/primitives/scroll-area/index.js.map +1 -0
- package/dist/primitives/select/index.js +4 -0
- package/dist/primitives/select/index.js.map +1 -0
- package/dist/primitives/session-list-item/index.js +4 -0
- package/dist/primitives/session-list-item/index.js.map +1 -0
- package/dist/primitives/session-timeline/index.js +4 -0
- package/dist/primitives/session-timeline/index.js.map +1 -0
- package/dist/primitives/sheet/index.js +4 -0
- package/dist/primitives/sheet/index.js.map +1 -0
- package/dist/primitives/sidebar/index.js +4 -0
- package/dist/primitives/sidebar/index.js.map +1 -0
- package/dist/primitives/skeleton/index.js +5 -0
- package/dist/primitives/skeleton/index.js.map +1 -0
- package/dist/primitives/skill-card/index.js +4 -0
- package/dist/primitives/skill-card/index.js.map +1 -0
- package/dist/primitives/social-auth-row/index.js +4 -0
- package/dist/primitives/social-auth-row/index.js.map +1 -0
- package/dist/primitives/stat-tile/index.js +4 -0
- package/dist/primitives/stat-tile/index.js.map +1 -0
- package/dist/primitives/status-dot/index.js +4 -0
- package/dist/primitives/status-dot/index.js.map +1 -0
- package/dist/primitives/steps-rail/index.js +4 -0
- package/dist/primitives/steps-rail/index.js.map +1 -0
- package/dist/primitives/sub-agent-dispatch/index.js +4 -0
- package/dist/primitives/sub-agent-dispatch/index.js.map +1 -0
- package/dist/primitives/switch/index.js +4 -0
- package/dist/primitives/switch/index.js.map +1 -0
- package/dist/primitives/system-prompt-editor/index.js +4 -0
- package/dist/primitives/system-prompt-editor/index.js.map +1 -0
- package/dist/primitives/table/index.js +4 -0
- package/dist/primitives/table/index.js.map +1 -0
- package/dist/primitives/tabs/index.js +4 -0
- package/dist/primitives/tabs/index.js.map +1 -0
- package/dist/primitives/task-plan/index.js +4 -0
- package/dist/primitives/task-plan/index.js.map +1 -0
- package/dist/primitives/terminal-panel/index.js +5 -0
- package/dist/primitives/terminal-panel/index.js.map +1 -0
- package/dist/primitives/textarea/index.js +4 -0
- package/dist/primitives/textarea/index.js.map +1 -0
- package/dist/primitives/thinking-level-selector/index.js +4 -0
- package/dist/primitives/thinking-level-selector/index.js.map +1 -0
- package/dist/primitives/timestamp/index.js +4 -0
- package/dist/primitives/timestamp/index.js.map +1 -0
- package/dist/primitives/toast/index.js +4 -0
- package/dist/primitives/toast/index.js.map +1 -0
- package/dist/primitives/token-usage-chart/index.js +4 -0
- package/dist/primitives/token-usage-chart/index.js.map +1 -0
- package/dist/primitives/tool-call/index.js +4 -0
- package/dist/primitives/tool-call/index.js.map +1 -0
- package/dist/primitives/tool-call-card/index.js +4 -0
- package/dist/primitives/tool-call-card/index.js.map +1 -0
- package/dist/primitives/tool-result/index.js +4 -0
- package/dist/primitives/tool-result/index.js.map +1 -0
- package/dist/primitives/tools-list/index.js +4 -0
- package/dist/primitives/tools-list/index.js.map +1 -0
- package/dist/primitives/tooltip/index.js +4 -0
- package/dist/primitives/tooltip/index.js.map +1 -0
- package/dist/primitives/topnav/index.js +4 -0
- package/dist/primitives/topnav/index.js.map +1 -0
- package/dist/primitives/update-banner/index.js +4 -0
- package/dist/primitives/update-banner/index.js.map +1 -0
- package/dist/slide/index.d.ts +212 -0
- package/dist/slide/index.js +3 -0
- package/dist/slide/index.js.map +1 -0
- package/dist/slide/plugins/emoji/index.d.ts +29 -0
- package/dist/slide/plugins/emoji/index.js +157 -0
- package/dist/slide/plugins/emoji/index.js.map +1 -0
- package/dist/slide/plugins/math/index.d.ts +13 -0
- package/dist/slide/plugins/math/index.js +145 -0
- package/dist/slide/plugins/math/index.js.map +1 -0
- package/dist/slide/plugins/mermaid/index.d.ts +55 -0
- package/dist/slide/plugins/mermaid/index.js +218 -0
- package/dist/slide/plugins/mermaid/index.js.map +1 -0
- package/dist/slide/plugins/shiki/index.d.ts +18 -0
- package/dist/slide/plugins/shiki/index.js +87 -0
- package/dist/slide/plugins/shiki/index.js.map +1 -0
- package/dist/slide/themes/default.css +256 -0
- package/dist/slide/themes/layouts.css +143 -0
- package/dist/slide/themes/violet-forge.css +256 -0
- package/dist/slide-deck/index.css +52 -0
- package/dist/slide-deck/index.css.map +1 -0
- package/dist/slide-deck/index.d.ts +377 -0
- package/dist/slide-deck/index.js +1111 -0
- package/dist/slide-deck/index.js.map +1 -0
- package/dist/styles-v3-legacy.css +88 -0
- package/dist/styles.css +137 -0
- package/dist/tokens-v4.css +187 -0
- package/dist/tokens.css +230 -0
- package/dist/vite-plugin.d.ts +29 -0
- package/dist/vite-plugin.js +76 -0
- package/dist/vite-plugin.js.map +1 -0
- package/dist/whiteboard/index.d.ts +258 -0
- package/dist/whiteboard/index.js +738 -0
- package/dist/whiteboard/index.js.map +1 -0
- package/llms.txt +273 -0
- package/package.json +800 -0
- package/registry/index.json +856 -0
- package/registry/r/account-menu.json +24 -0
- package/registry/r/action-bar.json +22 -0
- package/registry/r/agent-composer.json +22 -0
- package/registry/r/agent-editor.json +27 -0
- package/registry/r/agent-error-card.json +22 -0
- package/registry/r/agent-event.json +24 -0
- package/registry/r/agent-handoff.json +22 -0
- package/registry/r/agent-profile.json +23 -0
- package/registry/r/agent-starting-state.json +22 -0
- package/registry/r/agent-stream.json +27 -0
- package/registry/r/agent-streaming.json +22 -0
- package/registry/r/agent-timeline.json +22 -0
- package/registry/r/agent-types.json +15 -0
- package/registry/r/alert.json +22 -0
- package/registry/r/approval-card.json +25 -0
- package/registry/r/artifact-preview.json +22 -0
- package/registry/r/attachment-chip.json +24 -0
- package/registry/r/audit-log-entry.json +23 -0
- package/registry/r/auto-compact-notice.json +22 -0
- package/registry/r/avatar.json +23 -0
- package/registry/r/badge.json +22 -0
- package/registry/r/browser-controls.json +22 -0
- package/registry/r/build-log-stream.json +19 -0
- package/registry/r/button.json +23 -0
- package/registry/r/capability-indicator.json +23 -0
- package/registry/r/card.json +22 -0
- package/registry/r/chat-composer.json +23 -0
- package/registry/r/chat-message.json +129 -0
- package/registry/r/chat-thread.json +20 -0
- package/registry/r/chat-types.json +15 -0
- package/registry/r/checkbox.json +24 -0
- package/registry/r/cn.json +19 -0
- package/registry/r/code-block.json +21 -0
- package/registry/r/command-palette.json +25 -0
- package/registry/r/confirm-dialog.json +25 -0
- package/registry/r/context-card.json +23 -0
- package/registry/r/context-window-bar.json +20 -0
- package/registry/r/copy-button.json +22 -0
- package/registry/r/cost-meter.json +22 -0
- package/registry/r/created-files-card.json +23 -0
- package/registry/r/cron-job-card.json +22 -0
- package/registry/r/cron-jobs-list.json +23 -0
- package/registry/r/danger-zone.json +20 -0
- package/registry/r/data-table.json +27 -0
- package/registry/r/deployment-row.json +23 -0
- package/registry/r/dialog.json +23 -0
- package/registry/r/diff-viewer.json +20 -0
- package/registry/r/domain-config.json +25 -0
- package/registry/r/dropdown-menu.json +23 -0
- package/registry/r/empty-state.json +20 -0
- package/registry/r/env-var-editor.json +25 -0
- package/registry/r/folder-context-card.json +23 -0
- package/registry/r/folder-selector.json +22 -0
- package/registry/r/form-field.json +23 -0
- package/registry/r/hook-config.json +22 -0
- package/registry/r/hook-event-log.json +22 -0
- package/registry/r/input.json +22 -0
- package/registry/r/intent-selector.json +24 -0
- package/registry/r/label.json +22 -0
- package/registry/r/lane-board.json +20 -0
- package/registry/r/live-region-context.json +16 -0
- package/registry/r/login-split.json +20 -0
- package/registry/r/mcp-server-card.json +22 -0
- package/registry/r/mcp-server-list.json +23 -0
- package/registry/r/memory-editor.json +23 -0
- package/registry/r/mention-menu.json +23 -0
- package/registry/r/metrics-panel.json +22 -0
- package/registry/r/mode-types.json +15 -0
- package/registry/r/model-card.json +23 -0
- package/registry/r/model-selector.json +23 -0
- package/registry/r/page-shell.json +25 -0
- package/registry/r/pagination.json +22 -0
- package/registry/r/permission-matrix.json +22 -0
- package/registry/r/permission-modal.json +24 -0
- package/registry/r/permission-types.json +15 -0
- package/registry/r/pin-input.json +20 -0
- package/registry/r/plan-badge.json +20 -0
- package/registry/r/preview-env-card.json +25 -0
- package/registry/r/preview-panel.json +21 -0
- package/registry/r/progress-checklist.json +23 -0
- package/registry/r/progress.json +20 -0
- package/registry/r/project-card.json +25 -0
- package/registry/r/project-switcher.json +22 -0
- package/registry/r/quick-action-chips.json +21 -0
- package/registry/r/radio-group.json +23 -0
- package/registry/r/recent-folders-list.json +22 -0
- package/registry/r/rollback-ui.json +24 -0
- package/registry/r/rule-card.json +23 -0
- package/registry/r/rule-editor.json +28 -0
- package/registry/r/rule-types.json +18 -0
- package/registry/r/run-stats.json +22 -0
- package/registry/r/running-tasks-panel.json +22 -0
- package/registry/r/safe-href.json +16 -0
- package/registry/r/scroll-area.json +22 -0
- package/registry/r/select.json +24 -0
- package/registry/r/session-list-item.json +20 -0
- package/registry/r/session-timeline.json +22 -0
- package/registry/r/sheet.json +24 -0
- package/registry/r/sidebar.json +19 -0
- package/registry/r/skeleton.json +19 -0
- package/registry/r/skill-card.json +24 -0
- package/registry/r/skill-editor.json +28 -0
- package/registry/r/skills-list.json +23 -0
- package/registry/r/slide-deck.json +130 -0
- package/registry/r/slide-plugin-emoji.json +28 -0
- package/registry/r/slide-plugin-math.json +24 -0
- package/registry/r/slide-plugin-mermaid.json +23 -0
- package/registry/r/slide-plugin-shiki.json +23 -0
- package/registry/r/slide.json +123 -0
- package/registry/r/social-auth-row.json +21 -0
- package/registry/r/stat-tile.json +22 -0
- package/registry/r/status-dot.json +20 -0
- package/registry/r/steps-rail.json +20 -0
- package/registry/r/sub-agent-dispatch.json +22 -0
- package/registry/r/switch.json +23 -0
- package/registry/r/system-prompt-editor.json +22 -0
- package/registry/r/table.json +22 -0
- package/registry/r/tabs.json +22 -0
- package/registry/r/tailwind-preset.json +19 -0
- package/registry/r/task-header.json +24 -0
- package/registry/r/task-plan.json +22 -0
- package/registry/r/task-types.json +15 -0
- package/registry/r/terminal-panel.json +22 -0
- package/registry/r/textarea.json +22 -0
- package/registry/r/theme-provider.json +59 -0
- package/registry/r/theme-script.json +18 -0
- package/registry/r/theo-ui-provider.json +20 -0
- package/registry/r/timestamp.json +20 -0
- package/registry/r/toast.json +30 -0
- package/registry/r/token-usage-chart.json +20 -0
- package/registry/r/tokens.json +21 -0
- package/registry/r/tool-call-card.json +23 -0
- package/registry/r/tool-call.json +22 -0
- package/registry/r/tool-result.json +20 -0
- package/registry/r/tools-list.json +23 -0
- package/registry/r/tooltip.json +22 -0
- package/registry/r/topnav.json +22 -0
- package/registry/r/types.json +15 -0
- package/registry/r/usage-meter.json +21 -0
- package/registry/r/whiteboard.json +101 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { Button } from './chunk-5VOSCJKQ.js';
|
|
2
|
+
import { BadgeWithDot } from './chunk-P57HUMAE.js';
|
|
3
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
4
|
+
import { Clock, GitCommit, RotateCcw, ArrowDownLeft } from 'lucide-react';
|
|
5
|
+
import { forwardRef, useState } from 'react';
|
|
6
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
var RollbackUI = forwardRef(
|
|
9
|
+
({ className, history, onRollback, ...props }, ref) => {
|
|
10
|
+
const [confirmId, setConfirmId] = useState(null);
|
|
11
|
+
const [pendingId, setPendingId] = useState(null);
|
|
12
|
+
const trigger = async (id) => {
|
|
13
|
+
setPendingId(id);
|
|
14
|
+
try {
|
|
15
|
+
await onRollback?.(id);
|
|
16
|
+
} finally {
|
|
17
|
+
setPendingId(null);
|
|
18
|
+
setConfirmId(null);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
return /* @__PURE__ */ jsxs(
|
|
22
|
+
"div",
|
|
23
|
+
{
|
|
24
|
+
ref,
|
|
25
|
+
className: cn("rounded-xl border bg-card p-5 shadow-sm", className),
|
|
26
|
+
...props,
|
|
27
|
+
children: [
|
|
28
|
+
/* @__PURE__ */ jsx("header", { className: "mb-4 flex items-baseline justify-between gap-3", children: /* @__PURE__ */ jsxs("div", { children: [
|
|
29
|
+
/* @__PURE__ */ jsx("h3", { className: "font-display text-title-md tracking-tight", children: "Rollback" }),
|
|
30
|
+
/* @__PURE__ */ jsx("p", { className: "text-body-sm text-muted-foreground", children: "Instant rollback to a previous version. Verified in under 5 seconds." })
|
|
31
|
+
] }) }),
|
|
32
|
+
/* @__PURE__ */ jsx("ol", { className: "grid gap-2", children: history.map((target, idx) => {
|
|
33
|
+
const isCurrent = target.isCurrent ?? idx === 0;
|
|
34
|
+
const isConfirming = confirmId === target.id;
|
|
35
|
+
const isPending = pendingId === target.id;
|
|
36
|
+
return /* @__PURE__ */ jsxs(
|
|
37
|
+
"li",
|
|
38
|
+
{
|
|
39
|
+
className: cn(
|
|
40
|
+
"grid grid-cols-[auto_1fr_auto] items-center gap-3 rounded-lg border p-3",
|
|
41
|
+
isCurrent ? "border-primary/40 bg-primary/5" : "border-border/40 bg-card"
|
|
42
|
+
),
|
|
43
|
+
children: [
|
|
44
|
+
/* @__PURE__ */ jsx(
|
|
45
|
+
"span",
|
|
46
|
+
{
|
|
47
|
+
className: cn(
|
|
48
|
+
"grid size-8 place-items-center rounded-md",
|
|
49
|
+
isCurrent ? "bg-primary text-primary-foreground" : "bg-muted text-muted-foreground"
|
|
50
|
+
),
|
|
51
|
+
"aria-hidden": "true",
|
|
52
|
+
children: isCurrent ? /* @__PURE__ */ jsx(Clock, { className: "size-4" }) : /* @__PURE__ */ jsx(GitCommit, { className: "size-4" })
|
|
53
|
+
}
|
|
54
|
+
),
|
|
55
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
56
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
57
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono text-code-sm text-foreground", children: target.version }),
|
|
58
|
+
isCurrent ? /* @__PURE__ */ jsx(BadgeWithDot, { variant: "success", children: "Current" }) : null,
|
|
59
|
+
target.duration ? /* @__PURE__ */ jsxs("span", { className: "font-mono text-code-sm text-muted-foreground", children: [
|
|
60
|
+
"\xB7 ",
|
|
61
|
+
target.duration
|
|
62
|
+
] }) : null
|
|
63
|
+
] }),
|
|
64
|
+
/* @__PURE__ */ jsxs("p", { className: "mt-0.5 truncate text-body-sm text-muted-foreground", children: [
|
|
65
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono", children: target.commitSha.slice(0, 7) }),
|
|
66
|
+
" \xB7",
|
|
67
|
+
" ",
|
|
68
|
+
target.commitMessage,
|
|
69
|
+
" \xB7 ",
|
|
70
|
+
target.deployedAt
|
|
71
|
+
] })
|
|
72
|
+
] }),
|
|
73
|
+
/* @__PURE__ */ jsx("div", { children: isCurrent ? null : isConfirming ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
74
|
+
/* @__PURE__ */ jsx(
|
|
75
|
+
Button,
|
|
76
|
+
{
|
|
77
|
+
size: "sm",
|
|
78
|
+
variant: "ghost",
|
|
79
|
+
onClick: () => setConfirmId(null),
|
|
80
|
+
disabled: isPending,
|
|
81
|
+
children: "Cancel"
|
|
82
|
+
}
|
|
83
|
+
),
|
|
84
|
+
/* @__PURE__ */ jsxs(Button, { size: "sm", onClick: () => trigger(target.id), disabled: isPending, children: [
|
|
85
|
+
/* @__PURE__ */ jsx(RotateCcw, {}),
|
|
86
|
+
" Confirm rollback"
|
|
87
|
+
] })
|
|
88
|
+
] }) : /* @__PURE__ */ jsxs(Button, { size: "sm", variant: "secondary", onClick: () => setConfirmId(target.id), children: [
|
|
89
|
+
/* @__PURE__ */ jsx(ArrowDownLeft, {}),
|
|
90
|
+
" Roll back"
|
|
91
|
+
] }) })
|
|
92
|
+
]
|
|
93
|
+
},
|
|
94
|
+
target.id
|
|
95
|
+
);
|
|
96
|
+
}) })
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
);
|
|
102
|
+
RollbackUI.displayName = "RollbackUI";
|
|
103
|
+
|
|
104
|
+
export { RollbackUI };
|
|
105
|
+
//# sourceMappingURL=chunk-TSZ5DEAT.js.map
|
|
106
|
+
//# sourceMappingURL=chunk-TSZ5DEAT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/composites/rollback-ui/rollback-ui.tsx"],"names":[],"mappings":";;;;;;;AAsCA,IAAM,UAAA,GAAa,UAAA;AAAA,EACjB,CAAC,EAAE,SAAA,EAAW,OAAA,EAAS,YAAY,GAAG,KAAA,IAAS,GAAA,KAAQ;AACrD,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAwB,IAAI,CAAA;AAC9D,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAwB,IAAI,CAAA;AAE9D,IAAA,MAAM,OAAA,GAAU,OAAO,EAAA,KAAe;AACpC,MAAA,YAAA,CAAa,EAAE,CAAA;AACf,MAAA,IAAI;AACF,QAAA,MAAM,aAAa,EAAE,CAAA;AAAA,MACvB,CAAA,SAAE;AACA,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,YAAA,CAAa,IAAI,CAAA;AAAA,MACnB;AAAA,IACF,CAAA;AAEA,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA,CAAG,yCAAA,EAA2C,SAAS,CAAA;AAAA,QACjE,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,gDAAA,EAChB,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2CAAA,EAA4C,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,4BAClE,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAA,EAAqC,QAAA,EAAA,sEAAA,EAElD;AAAA,WAAA,EACF,CAAA,EACF,CAAA;AAAA,0BAEA,GAAA,CAAC,QAAG,SAAA,EAAU,YAAA,EACX,kBAAQ,GAAA,CAAI,CAAC,QAAQ,GAAA,KAAQ;AAC5B,YAAA,MAAM,SAAA,GAAY,MAAA,CAAO,SAAA,IAAa,GAAA,KAAQ,CAAA;AAC9C,YAAA,MAAM,YAAA,GAAe,cAAc,MAAA,CAAO,EAAA;AAC1C,YAAA,MAAM,SAAA,GAAY,cAAc,MAAA,CAAO,EAAA;AACvC,YAAA,uBACE,IAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAW,EAAA;AAAA,kBACT,yEAAA;AAAA,kBACA,YAAY,gCAAA,GAAmC;AAAA,iBACjD;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAA,GAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAW,EAAA;AAAA,wBACT,2CAAA;AAAA,wBACA,YACI,oCAAA,GACA;AAAA,uBACN;AAAA,sBACA,aAAA,EAAY,MAAA;AAAA,sBAEX,QAAA,EAAA,SAAA,uBAAa,KAAA,EAAA,EAAM,SAAA,EAAU,UAAS,CAAA,mBAAK,GAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA,mBAC5E;AAAA,kCACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACb,QAAA,EAAA;AAAA,oCAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EACb,QAAA,EAAA;AAAA,sCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAA0C,QAAA,EAAA,MAAA,CAAO,OAAA,EAAQ,CAAA;AAAA,sBACxE,4BAAY,GAAA,CAAC,YAAA,EAAA,EAAM,OAAA,EAAQ,SAAA,EAAU,qBAAO,CAAA,GAAW,IAAA;AAAA,sBACvD,MAAA,CAAO,QAAA,mBACN,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,8CAAA,EAA+C,QAAA,EAAA;AAAA,wBAAA,OAAA;AAAA,wBAC1D,MAAA,CAAO;AAAA,uBAAA,EACZ,CAAA,GACE;AAAA,qBAAA,EACN,CAAA;AAAA,oCACA,IAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oDAAA,EACX,QAAA,EAAA;AAAA,sCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,WAAA,EAAa,QAAA,EAAA,MAAA,CAAO,UAAU,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAE,CAAA;AAAA,sBAAO,OAAA;AAAA,sBAAG,GAAA;AAAA,sBACnE,MAAA,CAAO,aAAA;AAAA,sBAAc,QAAA;AAAA,sBAAI,MAAA,CAAO;AAAA,qBAAA,EACnC;AAAA,mBAAA,EACF,CAAA;AAAA,kCACA,GAAA,CAAC,SACE,QAAA,EAAA,SAAA,GAAY,IAAA,GAAO,+BAClB,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,oCAAA,GAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACC,IAAA,EAAK,IAAA;AAAA,wBACL,OAAA,EAAQ,OAAA;AAAA,wBACR,OAAA,EAAS,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,wBAChC,QAAA,EAAU,SAAA;AAAA,wBACX,QAAA,EAAA;AAAA;AAAA,qBAED;AAAA,oCACA,IAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,IAAA,EAAK,OAAA,EAAS,MAAM,OAAA,CAAQ,MAAA,CAAO,EAAE,CAAA,EAAG,QAAA,EAAU,SAAA,EAC7D,QAAA,EAAA;AAAA,sCAAA,GAAA,CAAC,SAAA,EAAA,EAAU,CAAA;AAAA,sBAAE;AAAA,qBAAA,EACf;AAAA,mBAAA,EACF,CAAA,mBAEA,IAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,OAAA,EAAS,MAAM,YAAA,CAAa,MAAA,CAAO,EAAE,CAAA,EACzE,QAAA,EAAA;AAAA,oCAAA,GAAA,CAAC,aAAA,EAAA,EAAc,CAAA;AAAA,oBAAE;AAAA,mBAAA,EACnB,CAAA,EAEJ;AAAA;AAAA,eAAA;AAAA,cApDK,MAAA,CAAO;AAAA,aAqDd;AAAA,UAEJ,CAAC,CAAA,EACH;AAAA;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AACA,UAAA,CAAW,WAAA,GAAc,YAAA","file":"chunk-TSZ5DEAT.js","sourcesContent":["import { ArrowDownLeft, Clock, GitCommit, RotateCcw } from \"lucide-react\";\nimport { forwardRef, useState } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { Badge } from \"../../primitives/badge/index.js\";\nimport { Button } from \"../../primitives/button/index.js\";\n\nexport interface RollbackTarget {\n id: string;\n version: string;\n commitSha: string;\n commitMessage: string;\n deployedAt: string;\n isCurrent?: boolean;\n /**\n * Optional duration of the deploy (e.g. \"24s\") for context.\n */\n duration?: string;\n}\n\ninterface RollbackUIProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Deployment history, newest first. The current deploy should have `isCurrent: true`.\n */\n history: RollbackTarget[];\n /**\n * Fires when user confirms rollback to a specific target.\n */\n onRollback?: (targetId: string) => void | Promise<void>;\n}\n\n/**\n * RollbackUI — instant rollback selector showing recent versions.\n *\n * The current deploy is marked, every other version offers a \"Roll back\" button.\n * On select, the row enters confirm state (Confirm / Cancel buttons inline) before\n * firing onRollback. This protects against accidental rollbacks while still being one click.\n */\nconst RollbackUI = forwardRef<HTMLDivElement, RollbackUIProps>(\n ({ className, history, onRollback, ...props }, ref) => {\n const [confirmId, setConfirmId] = useState<string | null>(null);\n const [pendingId, setPendingId] = useState<string | null>(null);\n\n const trigger = async (id: string) => {\n setPendingId(id);\n try {\n await onRollback?.(id);\n } finally {\n setPendingId(null);\n setConfirmId(null);\n }\n };\n\n return (\n <div\n ref={ref}\n className={cn(\"rounded-xl border bg-card p-5 shadow-sm\", className)}\n {...props}\n >\n <header className=\"mb-4 flex items-baseline justify-between gap-3\">\n <div>\n <h3 className=\"font-display text-title-md tracking-tight\">Rollback</h3>\n <p className=\"text-body-sm text-muted-foreground\">\n Instant rollback to a previous version. Verified in under 5 seconds.\n </p>\n </div>\n </header>\n\n <ol className=\"grid gap-2\">\n {history.map((target, idx) => {\n const isCurrent = target.isCurrent ?? idx === 0;\n const isConfirming = confirmId === target.id;\n const isPending = pendingId === target.id;\n return (\n <li\n key={target.id}\n className={cn(\n \"grid grid-cols-[auto_1fr_auto] items-center gap-3 rounded-lg border p-3\",\n isCurrent ? \"border-primary/40 bg-primary/5\" : \"border-border/40 bg-card\",\n )}\n >\n <span\n className={cn(\n \"grid size-8 place-items-center rounded-md\",\n isCurrent\n ? \"bg-primary text-primary-foreground\"\n : \"bg-muted text-muted-foreground\",\n )}\n aria-hidden=\"true\"\n >\n {isCurrent ? <Clock className=\"size-4\" /> : <GitCommit className=\"size-4\" />}\n </span>\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"font-mono text-code-sm text-foreground\">{target.version}</span>\n {isCurrent ? <Badge variant=\"success\">Current</Badge> : null}\n {target.duration ? (\n <span className=\"font-mono text-code-sm text-muted-foreground\">\n · {target.duration}\n </span>\n ) : null}\n </div>\n <p className=\"mt-0.5 truncate text-body-sm text-muted-foreground\">\n <span className=\"font-mono\">{target.commitSha.slice(0, 7)}</span> ·{\" \"}\n {target.commitMessage} · {target.deployedAt}\n </p>\n </div>\n <div>\n {isCurrent ? null : isConfirming ? (\n <div className=\"flex items-center gap-1\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => setConfirmId(null)}\n disabled={isPending}\n >\n Cancel\n </Button>\n <Button size=\"sm\" onClick={() => trigger(target.id)} disabled={isPending}>\n <RotateCcw /> Confirm rollback\n </Button>\n </div>\n ) : (\n <Button size=\"sm\" variant=\"secondary\" onClick={() => setConfirmId(target.id)}>\n <ArrowDownLeft /> Roll back\n </Button>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n </div>\n );\n },\n);\nRollbackUI.displayName = \"RollbackUI\";\n\nexport { RollbackUI };\n"]}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
2
|
+
import { forwardRef, useState, useEffect } from 'react';
|
|
3
|
+
import { jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
function toDate(value) {
|
|
6
|
+
const d = value instanceof Date ? value : new Date(value);
|
|
7
|
+
return Number.isNaN(d.getTime()) ? null : d;
|
|
8
|
+
}
|
|
9
|
+
var SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1e3;
|
|
10
|
+
var UNITS = [
|
|
11
|
+
{ unit: "year", ms: 365 * 24 * 60 * 60 * 1e3 },
|
|
12
|
+
{ unit: "month", ms: 30 * 24 * 60 * 60 * 1e3 },
|
|
13
|
+
{ unit: "day", ms: 24 * 60 * 60 * 1e3 },
|
|
14
|
+
{ unit: "hour", ms: 60 * 60 * 1e3 },
|
|
15
|
+
{ unit: "minute", ms: 60 * 1e3 }
|
|
16
|
+
];
|
|
17
|
+
function safeRelativeFormatter(locale) {
|
|
18
|
+
try {
|
|
19
|
+
return new Intl.RelativeTimeFormat(locale, { numeric: "auto" });
|
|
20
|
+
} catch {
|
|
21
|
+
if (process.env.NODE_ENV !== "production") {
|
|
22
|
+
console.warn(`<Timestamp locale="${locale}">: invalid locale tag, falling back to default.`);
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
return new Intl.RelativeTimeFormat(void 0, { numeric: "auto" });
|
|
26
|
+
} catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function safeAbsoluteFormat(date, locale, withYear) {
|
|
32
|
+
try {
|
|
33
|
+
return date.toLocaleDateString(locale, {
|
|
34
|
+
month: "short",
|
|
35
|
+
day: "numeric",
|
|
36
|
+
...withYear ? { year: "numeric" } : {}
|
|
37
|
+
});
|
|
38
|
+
} catch {
|
|
39
|
+
return date.toLocaleDateString(void 0, {
|
|
40
|
+
month: "short",
|
|
41
|
+
day: "numeric",
|
|
42
|
+
...withYear ? { year: "numeric" } : {}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function formatRelative(date, now, locale) {
|
|
47
|
+
const diffMs = date.getTime() - now.getTime();
|
|
48
|
+
const absMs = Math.abs(diffMs);
|
|
49
|
+
if (absMs < 6e4) return "just now";
|
|
50
|
+
if (diffMs < 0 && absMs > SEVEN_DAYS_MS) {
|
|
51
|
+
const sameYear = date.getFullYear() === now.getFullYear();
|
|
52
|
+
return safeAbsoluteFormat(date, locale, !sameYear);
|
|
53
|
+
}
|
|
54
|
+
const rtf = safeRelativeFormatter(locale);
|
|
55
|
+
if (rtf === null) {
|
|
56
|
+
return safeAbsoluteFormat(date, locale, date.getFullYear() !== now.getFullYear());
|
|
57
|
+
}
|
|
58
|
+
for (const { unit, ms } of UNITS) {
|
|
59
|
+
if (absMs >= ms) {
|
|
60
|
+
return rtf.format(Math.round(diffMs / ms), unit);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return "just now";
|
|
64
|
+
}
|
|
65
|
+
function formatAbsolute(date, locale) {
|
|
66
|
+
try {
|
|
67
|
+
return date.toLocaleString(locale, {
|
|
68
|
+
year: "numeric",
|
|
69
|
+
month: "short",
|
|
70
|
+
day: "numeric",
|
|
71
|
+
hour: "2-digit",
|
|
72
|
+
minute: "2-digit"
|
|
73
|
+
});
|
|
74
|
+
} catch {
|
|
75
|
+
return date.toLocaleString(void 0, {
|
|
76
|
+
year: "numeric",
|
|
77
|
+
month: "short",
|
|
78
|
+
day: "numeric",
|
|
79
|
+
hour: "2-digit",
|
|
80
|
+
minute: "2-digit"
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
var Timestamp = forwardRef(
|
|
85
|
+
({
|
|
86
|
+
className,
|
|
87
|
+
value,
|
|
88
|
+
format = "relative",
|
|
89
|
+
refreshInterval = 6e4,
|
|
90
|
+
locale,
|
|
91
|
+
noTooltip,
|
|
92
|
+
...props
|
|
93
|
+
}, ref) => {
|
|
94
|
+
const date = toDate(value);
|
|
95
|
+
const [now, setNow] = useState(() => /* @__PURE__ */ new Date());
|
|
96
|
+
useEffect(() => {
|
|
97
|
+
if (format !== "relative" || refreshInterval === 0 || date === null) return;
|
|
98
|
+
const id = setInterval(() => setNow(/* @__PURE__ */ new Date()), refreshInterval);
|
|
99
|
+
return () => clearInterval(id);
|
|
100
|
+
}, [format, refreshInterval, date]);
|
|
101
|
+
if (date === null) {
|
|
102
|
+
return /* @__PURE__ */ jsx("time", { ref, className: cn(className), suppressHydrationWarning: true, ...props });
|
|
103
|
+
}
|
|
104
|
+
const iso = date.toISOString();
|
|
105
|
+
const absolute = formatAbsolute(date, locale);
|
|
106
|
+
const relative = formatRelative(date, now, locale);
|
|
107
|
+
const visibleText = format === "absolute" ? absolute : format === "both" ? `${absolute} (${relative})` : relative;
|
|
108
|
+
return /* @__PURE__ */ jsx(
|
|
109
|
+
"time",
|
|
110
|
+
{
|
|
111
|
+
ref,
|
|
112
|
+
dateTime: iso,
|
|
113
|
+
title: noTooltip ? void 0 : absolute,
|
|
114
|
+
"aria-label": absolute,
|
|
115
|
+
suppressHydrationWarning: true,
|
|
116
|
+
className: cn(className),
|
|
117
|
+
...props,
|
|
118
|
+
children: visibleText
|
|
119
|
+
}
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
);
|
|
123
|
+
Timestamp.displayName = "Timestamp";
|
|
124
|
+
|
|
125
|
+
export { Timestamp };
|
|
126
|
+
//# sourceMappingURL=chunk-TUNVF45W.js.map
|
|
127
|
+
//# sourceMappingURL=chunk-TUNVF45W.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/timestamp/timestamp.tsx"],"names":[],"mappings":"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","file":"chunk-TUNVF45W.js","sourcesContent":["import { forwardRef, useEffect, useState } from \"react\";\nimport type { TimeHTMLAttributes } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\n/**\n * Timestamp — accessible relative/absolute time primitive.\n *\n * Renders a semantic `<time datetime>` element. Format modes:\n * - `relative` (default) — \"just now\", \"5 minutes ago\", \"2 hours ago\",\n * \"Dec 5\" (>7d), \"Dec 5, 2024\" (different year)\n * - `absolute` — full localized date+time\n * - `both` — \"Dec 5, 2026 (2 hours ago)\"\n *\n * Uses zero-dep `Intl.RelativeTimeFormat`. The tooltip on hover is the\n * HTML `title` attribute (not the `<Tooltip>` component) — keeps this\n * file a true primitive without sibling-primitive imports.\n *\n * Auto-refreshes via `setInterval` (default 60_000ms); pass\n * `refreshInterval={0}` to disable. `aria-label` always carries the\n * absolute time so screen readers read \"May 23, 2026 14:32 — posted\n * 2 hours ago\".\n *\n * @param value Source date — ISO string, Date object, or **Unix ms**\n * (NOT seconds). Passing seconds renders ~1970.\n */\nexport interface TimestampProps extends Omit<TimeHTMLAttributes<HTMLTimeElement>, \"children\"> {\n value: string | Date | number;\n format?: \"relative\" | \"absolute\" | \"both\";\n /** Auto-refresh interval when format=relative. Default 60000. 0 disables. */\n refreshInterval?: number;\n /** Locale for absolute formatting + Intl.RelativeTimeFormat. Default browser locale. */\n locale?: string;\n /** When true, omit the `title` tooltip. */\n noTooltip?: boolean;\n}\n\nfunction toDate(value: string | Date | number): Date | null {\n const d = value instanceof Date ? value : new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n}\n\nconst SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;\nconst UNITS: Array<{ unit: Intl.RelativeTimeFormatUnit; ms: number }> = [\n { unit: \"year\", ms: 365 * 24 * 60 * 60 * 1000 },\n { unit: \"month\", ms: 30 * 24 * 60 * 60 * 1000 },\n { unit: \"day\", ms: 24 * 60 * 60 * 1000 },\n { unit: \"hour\", ms: 60 * 60 * 1000 },\n { unit: \"minute\", ms: 60 * 1000 },\n];\n\nfunction safeRelativeFormatter(locale: string | undefined): Intl.RelativeTimeFormat | null {\n try {\n return new Intl.RelativeTimeFormat(locale, { numeric: \"auto\" });\n } catch {\n // EC-8: invalid locale tag — fall back to default locale.\n if (process.env.NODE_ENV !== \"production\") {\n // biome-ignore lint/suspicious/noConsole: dev-only diagnostic.\n console.warn(`<Timestamp locale=\"${locale}\">: invalid locale tag, falling back to default.`);\n }\n try {\n return new Intl.RelativeTimeFormat(undefined, { numeric: \"auto\" });\n } catch {\n return null;\n }\n }\n}\n\nfunction safeAbsoluteFormat(date: Date, locale: string | undefined, withYear: boolean): string {\n try {\n return date.toLocaleDateString(locale, {\n month: \"short\",\n day: \"numeric\",\n ...(withYear ? { year: \"numeric\" } : {}),\n });\n } catch {\n return date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n ...(withYear ? { year: \"numeric\" } : {}),\n });\n }\n}\n\nfunction formatRelative(date: Date, now: Date, locale: string | undefined): string {\n const diffMs = date.getTime() - now.getTime();\n const absMs = Math.abs(diffMs);\n\n if (absMs < 60_000) return \"just now\";\n\n if (diffMs < 0 && absMs > SEVEN_DAYS_MS) {\n const sameYear = date.getFullYear() === now.getFullYear();\n return safeAbsoluteFormat(date, locale, !sameYear);\n }\n\n const rtf = safeRelativeFormatter(locale);\n if (rtf === null) {\n return safeAbsoluteFormat(date, locale, date.getFullYear() !== now.getFullYear());\n }\n\n for (const { unit, ms } of UNITS) {\n if (absMs >= ms) {\n return rtf.format(Math.round(diffMs / ms), unit);\n }\n }\n return \"just now\";\n}\n\nfunction formatAbsolute(date: Date, locale: string | undefined): string {\n try {\n return date.toLocaleString(locale, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n } catch {\n return date.toLocaleString(undefined, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n }\n}\n\nconst Timestamp = forwardRef<HTMLTimeElement, TimestampProps>(\n (\n {\n className,\n value,\n format = \"relative\",\n refreshInterval = 60_000,\n locale,\n noTooltip,\n ...props\n },\n ref,\n ) => {\n const date = toDate(value);\n const [now, setNow] = useState<Date>(() => new Date());\n\n useEffect(() => {\n if (format !== \"relative\" || refreshInterval === 0 || date === null) return;\n const id = setInterval(() => setNow(new Date()), refreshInterval);\n return () => clearInterval(id);\n }, [format, refreshInterval, date]);\n\n if (date === null) {\n return <time ref={ref} className={cn(className)} suppressHydrationWarning {...props} />;\n }\n\n const iso = date.toISOString();\n const absolute = formatAbsolute(date, locale);\n const relative = formatRelative(date, now, locale);\n const visibleText =\n format === \"absolute\" ? absolute : format === \"both\" ? `${absolute} (${relative})` : relative;\n\n return (\n <time\n ref={ref}\n dateTime={iso}\n title={noTooltip ? undefined : absolute}\n aria-label={absolute}\n suppressHydrationWarning\n className={cn(className)}\n {...props}\n >\n {visibleText}\n </time>\n );\n },\n);\nTimestamp.displayName = \"Timestamp\";\n\nexport { Timestamp };\n"]}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
2
|
+
import { AlertCircle, Sparkles, Rocket, Network, Terminal, Trash2, Pencil, Eye } from 'lucide-react';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var stateClasses = {
|
|
7
|
+
enabled: "border-success/40 bg-success/10 text-success",
|
|
8
|
+
active: "border-primary/50 bg-primary/15 text-primary",
|
|
9
|
+
disabled: "border-border/40 bg-muted text-muted-foreground line-through",
|
|
10
|
+
blocked: "border-destructive/40 bg-destructive/10 text-destructive"
|
|
11
|
+
};
|
|
12
|
+
var CapabilityIndicator = forwardRef(
|
|
13
|
+
({ className, capabilities, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
14
|
+
"ul",
|
|
15
|
+
{
|
|
16
|
+
ref,
|
|
17
|
+
"aria-label": "Agent capabilities",
|
|
18
|
+
className: cn("flex flex-wrap items-center gap-1.5", className),
|
|
19
|
+
...props,
|
|
20
|
+
children: capabilities.map((c) => {
|
|
21
|
+
const Icon = c.icon ?? AlertCircle;
|
|
22
|
+
const state = c.state ?? "enabled";
|
|
23
|
+
return /* @__PURE__ */ jsxs(
|
|
24
|
+
"li",
|
|
25
|
+
{
|
|
26
|
+
title: typeof c.hint === "string" ? c.hint : void 0,
|
|
27
|
+
className: cn(
|
|
28
|
+
"inline-flex items-center gap-1.5 rounded-full border px-2.5 py-0.5",
|
|
29
|
+
"font-sans text-label",
|
|
30
|
+
"transition-colors",
|
|
31
|
+
stateClasses[state]
|
|
32
|
+
),
|
|
33
|
+
children: [
|
|
34
|
+
/* @__PURE__ */ jsx(
|
|
35
|
+
Icon,
|
|
36
|
+
{
|
|
37
|
+
"aria-hidden": "true",
|
|
38
|
+
className: cn("size-3 shrink-0", state === "active" && "animate-pulse")
|
|
39
|
+
}
|
|
40
|
+
),
|
|
41
|
+
c.label
|
|
42
|
+
]
|
|
43
|
+
},
|
|
44
|
+
c.id
|
|
45
|
+
);
|
|
46
|
+
})
|
|
47
|
+
}
|
|
48
|
+
)
|
|
49
|
+
);
|
|
50
|
+
CapabilityIndicator.displayName = "CapabilityIndicator";
|
|
51
|
+
var capabilityPresets = {
|
|
52
|
+
read: { id: "read", label: "Read files", icon: Eye },
|
|
53
|
+
write: { id: "write", label: "Write files", icon: Pencil },
|
|
54
|
+
delete: { id: "delete", label: "Delete files", icon: Trash2 },
|
|
55
|
+
bash: { id: "bash", label: "Run shell", icon: Terminal },
|
|
56
|
+
network: { id: "network", label: "Network", icon: Network },
|
|
57
|
+
deploy: { id: "deploy", label: "Deploy", icon: Rocket },
|
|
58
|
+
llm: { id: "llm", label: "Sub-agents", icon: Sparkles }
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export { CapabilityIndicator, capabilityPresets };
|
|
62
|
+
//# sourceMappingURL=chunk-TXOBNSQ5.js.map
|
|
63
|
+
//# sourceMappingURL=chunk-TXOBNSQ5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/capability-indicator/capability-indicator.tsx"],"names":[],"mappings":";;;;;AAwCA,IAAM,YAAA,GAAgD;AAAA,EACpD,OAAA,EAAS,8CAAA;AAAA,EACT,MAAA,EAAQ,8CAAA;AAAA,EACR,QAAA,EAAU,8DAAA;AAAA,EACV,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,mBAAA,GAAsB,UAAA;AAAA,EAC1B,CAAC,EAAE,SAAA,EAAW,cAAc,GAAG,KAAA,IAAS,GAAA,qBACtC,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,YAAA,EAAW,oBAAA;AAAA,MACX,SAAA,EAAW,EAAA,CAAG,qCAAA,EAAuC,SAAS,CAAA;AAAA,MAC7D,GAAI,KAAA;AAAA,MAEJ,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,KAAM;AACvB,QAAA,MAAM,IAAA,GAAO,EAAE,IAAA,IAAQ,WAAA;AACvB,QAAA,MAAM,KAAA,GAAQ,EAAE,KAAA,IAAS,SAAA;AACzB,QAAA,uBACE,IAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YAEC,OAAO,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,EAAE,IAAA,GAAO,MAAA;AAAA,YAC7C,SAAA,EAAW,EAAA;AAAA,cACT,oEAAA;AAAA,cACA,sBAAA;AAAA,cACA,mBAAA;AAAA,cACA,aAAa,KAAK;AAAA,aACpB;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBACC,aAAA,EAAY,MAAA;AAAA,kBACZ,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,KAAA,KAAU,YAAY,eAAe;AAAA;AAAA,eACxE;AAAA,cACC,CAAA,CAAE;AAAA;AAAA,WAAA;AAAA,UAbE,CAAA,CAAE;AAAA,SAcT;AAAA,MAEJ,CAAC;AAAA;AAAA;AAGP;AACA,mBAAA,CAAoB,WAAA,GAAc,qBAAA;AAG3B,IAAM,iBAAA,GAAoB;AAAA,EAC/B,MAAM,EAAE,EAAA,EAAI,QAAQ,KAAA,EAAO,YAAA,EAAc,MAAM,GAAA,EAAI;AAAA,EACnD,OAAO,EAAE,EAAA,EAAI,SAAS,KAAA,EAAO,aAAA,EAAe,MAAM,MAAA,EAAO;AAAA,EACzD,QAAQ,EAAE,EAAA,EAAI,UAAU,KAAA,EAAO,cAAA,EAAgB,MAAM,MAAA,EAAO;AAAA,EAC5D,MAAM,EAAE,EAAA,EAAI,QAAQ,KAAA,EAAO,WAAA,EAAa,MAAM,QAAA,EAAS;AAAA,EACvD,SAAS,EAAE,EAAA,EAAI,WAAW,KAAA,EAAO,SAAA,EAAW,MAAM,OAAA,EAAQ;AAAA,EAC1D,QAAQ,EAAE,EAAA,EAAI,UAAU,KAAA,EAAO,QAAA,EAAU,MAAM,MAAA,EAAO;AAAA,EACtD,KAAK,EAAE,EAAA,EAAI,OAAO,KAAA,EAAO,YAAA,EAAc,MAAM,QAAA;AAC/C","file":"chunk-TXOBNSQ5.js","sourcesContent":["import {\n AlertCircle,\n Eye,\n Network,\n Pencil,\n Rocket,\n Sparkles,\n Terminal,\n Trash2,\n} from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { IconComponent } from \"../../../lib/types.js\";\n\nexport type CapabilityState = \"enabled\" | \"disabled\" | \"blocked\" | \"active\";\n\nexport interface Capability {\n id: string;\n /** Visible label. */\n label: ReactNode;\n /** Optional icon override. */\n icon?: IconComponent;\n /** Default state. */\n state?: CapabilityState;\n /** Tooltip / longer description. */\n hint?: ReactNode;\n}\n\ninterface CapabilityIndicatorProps extends HTMLAttributes<HTMLDivElement> {\n capabilities: Capability[];\n}\n\n/**\n * CapabilityIndicator — row of chips showing what the agent can currently do.\n *\n * Critical for transparency: the user should always see (e.g. in a top bar)\n * whether the agent has read/write/exec/network access enabled. The \"active\"\n * state pulses when a capability is in use.\n */\nconst stateClasses: Record<CapabilityState, string> = {\n enabled: \"border-success/40 bg-success/10 text-success\",\n active: \"border-primary/50 bg-primary/15 text-primary\",\n disabled: \"border-border/40 bg-muted text-muted-foreground line-through\",\n blocked: \"border-destructive/40 bg-destructive/10 text-destructive\",\n};\n\nconst CapabilityIndicator = forwardRef<HTMLUListElement, CapabilityIndicatorProps>(\n ({ className, capabilities, ...props }, ref) => (\n <ul\n ref={ref}\n aria-label=\"Agent capabilities\"\n className={cn(\"flex flex-wrap items-center gap-1.5\", className)}\n {...(props as HTMLAttributes<HTMLUListElement>)}\n >\n {capabilities.map((c) => {\n const Icon = c.icon ?? AlertCircle;\n const state = c.state ?? \"enabled\";\n return (\n <li\n key={c.id}\n title={typeof c.hint === \"string\" ? c.hint : undefined}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full border px-2.5 py-0.5\",\n \"font-sans text-label\",\n \"transition-colors\",\n stateClasses[state],\n )}\n >\n <Icon\n aria-hidden=\"true\"\n className={cn(\"size-3 shrink-0\", state === \"active\" && \"animate-pulse\")}\n />\n {c.label}\n </li>\n );\n })}\n </ul>\n ),\n);\nCapabilityIndicator.displayName = \"CapabilityIndicator\";\n\n/** Common capability presets — re-use these so apps don't reinvent labels. */\nexport const capabilityPresets = {\n read: { id: \"read\", label: \"Read files\", icon: Eye } as const,\n write: { id: \"write\", label: \"Write files\", icon: Pencil } as const,\n delete: { id: \"delete\", label: \"Delete files\", icon: Trash2 } as const,\n bash: { id: \"bash\", label: \"Run shell\", icon: Terminal } as const,\n network: { id: \"network\", label: \"Network\", icon: Network } as const,\n deploy: { id: \"deploy\", label: \"Deploy\", icon: Rocket } as const,\n llm: { id: \"llm\", label: \"Sub-agents\", icon: Sparkles } as const,\n};\n\nexport { CapabilityIndicator };\n"]}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { useInLiveRegion } from './chunk-UGKI466V.js';
|
|
2
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
3
|
+
import { Sparkles, X } from 'lucide-react';
|
|
4
|
+
import { forwardRef } from 'react';
|
|
5
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var formatTokens = (n) => {
|
|
8
|
+
if (n >= 1e6) return `${(n / 1e6).toFixed(1)}M`;
|
|
9
|
+
if (n >= 1e3) return `${(n / 1e3).toFixed(1)}k`;
|
|
10
|
+
return `${n}`;
|
|
11
|
+
};
|
|
12
|
+
var AutoCompactNotice = forwardRef(
|
|
13
|
+
({
|
|
14
|
+
className,
|
|
15
|
+
title = "Auto-compaction soon",
|
|
16
|
+
turnsRemaining,
|
|
17
|
+
tokensToCompact,
|
|
18
|
+
onCompactNow,
|
|
19
|
+
onDismiss,
|
|
20
|
+
...props
|
|
21
|
+
}, ref) => {
|
|
22
|
+
const inLiveRegion = useInLiveRegion();
|
|
23
|
+
return /* @__PURE__ */ jsxs(
|
|
24
|
+
"aside",
|
|
25
|
+
{
|
|
26
|
+
ref,
|
|
27
|
+
"aria-live": inLiveRegion ? void 0 : "polite",
|
|
28
|
+
className: cn(
|
|
29
|
+
"grid grid-cols-[auto_1fr_auto] items-start gap-3 rounded-lg border border-warning/40 bg-warning/10 px-4 py-3",
|
|
30
|
+
className
|
|
31
|
+
),
|
|
32
|
+
...props,
|
|
33
|
+
children: [
|
|
34
|
+
/* @__PURE__ */ jsx(Sparkles, { className: "mt-0.5 size-4 shrink-0 text-warning", "aria-hidden": "true" }),
|
|
35
|
+
/* @__PURE__ */ jsxs("div", { className: "grid gap-1", children: [
|
|
36
|
+
/* @__PURE__ */ jsxs("p", { className: "flex items-baseline gap-2 font-medium text-body-sm text-foreground", children: [
|
|
37
|
+
title,
|
|
38
|
+
turnsRemaining !== void 0 ? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center rounded-full bg-warning/20 px-2 py-0.5 font-mono text-label text-warning tabular-nums", children: [
|
|
39
|
+
turnsRemaining,
|
|
40
|
+
" ",
|
|
41
|
+
turnsRemaining === 1 ? "turn" : "turns",
|
|
42
|
+
" left"
|
|
43
|
+
] }) : null
|
|
44
|
+
] }),
|
|
45
|
+
/* @__PURE__ */ jsxs("p", { className: "text-body-sm text-muted-foreground", children: [
|
|
46
|
+
"Older context will be summarized to make room.",
|
|
47
|
+
tokensToCompact !== void 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
48
|
+
" ",
|
|
49
|
+
"About",
|
|
50
|
+
" ",
|
|
51
|
+
/* @__PURE__ */ jsxs("span", { className: "font-mono tabular-nums", children: [
|
|
52
|
+
formatTokens(tokensToCompact),
|
|
53
|
+
" tokens"
|
|
54
|
+
] }),
|
|
55
|
+
" ",
|
|
56
|
+
"will be replaced by a recap."
|
|
57
|
+
] }) : null
|
|
58
|
+
] }),
|
|
59
|
+
onCompactNow ? /* @__PURE__ */ jsx(
|
|
60
|
+
"button",
|
|
61
|
+
{
|
|
62
|
+
type: "button",
|
|
63
|
+
onClick: onCompactNow,
|
|
64
|
+
className: "mt-1 inline-flex w-fit items-center rounded-md border border-warning/40 bg-card px-2.5 py-1 font-mono text-label text-warning hover:bg-warning/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
65
|
+
children: "Compact now"
|
|
66
|
+
}
|
|
67
|
+
) : null
|
|
68
|
+
] }),
|
|
69
|
+
onDismiss ? /* @__PURE__ */ jsx(
|
|
70
|
+
"button",
|
|
71
|
+
{
|
|
72
|
+
type: "button",
|
|
73
|
+
onClick: onDismiss,
|
|
74
|
+
"aria-label": "Dismiss",
|
|
75
|
+
className: "rounded-md p-1 text-warning hover:bg-warning/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
76
|
+
children: /* @__PURE__ */ jsx(X, { className: "size-3.5" })
|
|
77
|
+
}
|
|
78
|
+
) : null
|
|
79
|
+
]
|
|
80
|
+
}
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
);
|
|
84
|
+
AutoCompactNotice.displayName = "AutoCompactNotice";
|
|
85
|
+
|
|
86
|
+
export { AutoCompactNotice };
|
|
87
|
+
//# sourceMappingURL=chunk-U44DRLMM.js.map
|
|
88
|
+
//# sourceMappingURL=chunk-U44DRLMM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/auto-compact-notice/auto-compact-notice.tsx"],"names":[],"mappings":"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","file":"chunk-U44DRLMM.js","sourcesContent":["import { Sparkles, X } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { useInLiveRegion } from \"../../../lib/live-region-context.js\";\n\ninterface AutoCompactNoticeProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n /** Optional custom title. */\n title?: ReactNode;\n /**\n * How many turns until the next auto-compaction. Used to render an inline\n * countdown chip.\n */\n turnsRemaining?: number;\n /** Approx tokens that will be removed/summarized. */\n tokensToCompact?: number;\n onCompactNow?: () => void;\n onDismiss?: () => void;\n}\n\nconst formatTokens = (n: number) => {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}k`;\n return `${n}`;\n};\n\n/**\n * AutoCompactNotice — inline banner warning the user that the agent is\n * about to summarize / compact older context. Lets them act early (compact\n * now) or dismiss.\n *\n * Critical for transparency: a user must not be surprised by silent context\n * loss. This component announces it before it happens.\n */\nconst AutoCompactNotice = forwardRef<HTMLElement, AutoCompactNoticeProps>(\n (\n {\n className,\n title = \"Auto-compaction soon\",\n turnsRemaining,\n tokensToCompact,\n onCompactNow,\n onDismiss,\n ...props\n },\n ref,\n ) => {\n // T4.1 (MF-4): omit aria-live when nested inside a container live region.\n const inLiveRegion = useInLiveRegion();\n return (\n <aside\n ref={ref}\n aria-live={inLiveRegion ? undefined : \"polite\"}\n className={cn(\n \"grid grid-cols-[auto_1fr_auto] items-start gap-3 rounded-lg border border-warning/40 bg-warning/10 px-4 py-3\",\n className,\n )}\n {...props}\n >\n <Sparkles className=\"mt-0.5 size-4 shrink-0 text-warning\" aria-hidden=\"true\" />\n <div className=\"grid gap-1\">\n <p className=\"flex items-baseline gap-2 font-medium text-body-sm text-foreground\">\n {title}\n {turnsRemaining !== undefined ? (\n <span className=\"inline-flex items-center rounded-full bg-warning/20 px-2 py-0.5 font-mono text-label text-warning tabular-nums\">\n {turnsRemaining} {turnsRemaining === 1 ? \"turn\" : \"turns\"} left\n </span>\n ) : null}\n </p>\n <p className=\"text-body-sm text-muted-foreground\">\n Older context will be summarized to make room.\n {tokensToCompact !== undefined ? (\n <>\n {\" \"}\n About{\" \"}\n <span className=\"font-mono tabular-nums\">\n {formatTokens(tokensToCompact)} tokens\n </span>{\" \"}\n will be replaced by a recap.\n </>\n ) : null}\n </p>\n {onCompactNow ? (\n <button\n type=\"button\"\n onClick={onCompactNow}\n className=\"mt-1 inline-flex w-fit items-center rounded-md border border-warning/40 bg-card px-2.5 py-1 font-mono text-label text-warning hover:bg-warning/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n Compact now\n </button>\n ) : null}\n </div>\n {onDismiss ? (\n <button\n type=\"button\"\n onClick={onDismiss}\n aria-label=\"Dismiss\"\n className=\"rounded-md p-1 text-warning hover:bg-warning/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <X className=\"size-3.5\" />\n </button>\n ) : null}\n </aside>\n );\n },\n);\nAutoCompactNotice.displayName = \"AutoCompactNotice\";\n\nexport { AutoCompactNotice };\n"]}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
2
|
+
import { Clock, Play, Square, Trash2 } from 'lucide-react';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var STATUS_CONFIG = {
|
|
7
|
+
idle: { label: "Scheduled", class: "border-success/40 bg-success/10 text-success" },
|
|
8
|
+
running: {
|
|
9
|
+
label: "Running",
|
|
10
|
+
class: "border-primary/40 bg-primary/10 text-primary animate-pulse"
|
|
11
|
+
},
|
|
12
|
+
failed: {
|
|
13
|
+
label: "Last run failed",
|
|
14
|
+
class: "border-destructive/40 bg-destructive/10 text-destructive"
|
|
15
|
+
},
|
|
16
|
+
disabled: { label: "Disabled", class: "border-border/40 bg-muted text-muted-foreground" }
|
|
17
|
+
};
|
|
18
|
+
var CronJobCard = forwardRef(
|
|
19
|
+
({ className, job, onRunNow, onToggle, onRemove, ...props }, ref) => {
|
|
20
|
+
const cfg = STATUS_CONFIG[job.status];
|
|
21
|
+
const enabled = job.status !== "disabled";
|
|
22
|
+
return /* @__PURE__ */ jsxs(
|
|
23
|
+
"article",
|
|
24
|
+
{
|
|
25
|
+
ref,
|
|
26
|
+
className: cn(
|
|
27
|
+
"grid gap-3 rounded-xl border bg-card p-4",
|
|
28
|
+
job.status === "disabled" && "opacity-70",
|
|
29
|
+
className
|
|
30
|
+
),
|
|
31
|
+
...props,
|
|
32
|
+
children: [
|
|
33
|
+
/* @__PURE__ */ jsxs("header", { className: "flex items-start justify-between gap-3", children: [
|
|
34
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
35
|
+
/* @__PURE__ */ jsx("h4", { className: "font-display text-title-md tracking-tight", children: job.name }),
|
|
36
|
+
/* @__PURE__ */ jsxs("p", { className: "mt-0.5 inline-flex items-center gap-2 font-mono text-code-sm text-muted-foreground", children: [
|
|
37
|
+
/* @__PURE__ */ jsx(Clock, { className: "size-3", "aria-hidden": "true" }),
|
|
38
|
+
" ",
|
|
39
|
+
job.schedule
|
|
40
|
+
] })
|
|
41
|
+
] }),
|
|
42
|
+
/* @__PURE__ */ jsx(
|
|
43
|
+
"span",
|
|
44
|
+
{
|
|
45
|
+
className: cn(
|
|
46
|
+
"inline-flex items-center rounded-full border px-2.5 py-0.5",
|
|
47
|
+
"font-mono text-label uppercase tracking-wider",
|
|
48
|
+
cfg.class
|
|
49
|
+
),
|
|
50
|
+
children: cfg.label
|
|
51
|
+
}
|
|
52
|
+
)
|
|
53
|
+
] }),
|
|
54
|
+
/* @__PURE__ */ jsx("p", { className: "line-clamp-2 rounded-md bg-muted/60 px-3 py-2 font-mono text-code-sm text-foreground", children: job.prompt }),
|
|
55
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-3 font-mono text-label text-muted-foreground", children: [
|
|
56
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
57
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground/60", children: "last:" }),
|
|
58
|
+
" ",
|
|
59
|
+
job.lastRun ?? "never"
|
|
60
|
+
] }),
|
|
61
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
62
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground/60", children: "next:" }),
|
|
63
|
+
" ",
|
|
64
|
+
job.nextRun ?? "\u2014"
|
|
65
|
+
] })
|
|
66
|
+
] }),
|
|
67
|
+
job.lastResult ? /* @__PURE__ */ jsx("p", { className: "text-body-sm text-muted-foreground", children: job.lastResult }) : null,
|
|
68
|
+
/* @__PURE__ */ jsxs("footer", { className: "flex items-center justify-end gap-1.5", children: [
|
|
69
|
+
onRunNow ? /* @__PURE__ */ jsxs(
|
|
70
|
+
"button",
|
|
71
|
+
{
|
|
72
|
+
type: "button",
|
|
73
|
+
onClick: () => onRunNow(job.id),
|
|
74
|
+
className: "inline-flex items-center gap-1.5 rounded-md border border-border/60 bg-card px-2.5 py-1 font-mono text-label hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
75
|
+
children: [
|
|
76
|
+
/* @__PURE__ */ jsx(Play, { className: "size-3" }),
|
|
77
|
+
" Run now"
|
|
78
|
+
]
|
|
79
|
+
}
|
|
80
|
+
) : null,
|
|
81
|
+
onToggle ? /* @__PURE__ */ jsxs(
|
|
82
|
+
"button",
|
|
83
|
+
{
|
|
84
|
+
type: "button",
|
|
85
|
+
onClick: () => onToggle(job.id, !enabled),
|
|
86
|
+
className: "inline-flex items-center gap-1.5 rounded-md border border-border/60 bg-card px-2.5 py-1 font-mono text-label hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
87
|
+
children: [
|
|
88
|
+
/* @__PURE__ */ jsx(Square, { className: "size-3" }),
|
|
89
|
+
" ",
|
|
90
|
+
enabled ? "Pause" : "Enable"
|
|
91
|
+
]
|
|
92
|
+
}
|
|
93
|
+
) : null,
|
|
94
|
+
onRemove ? /* @__PURE__ */ jsx(
|
|
95
|
+
"button",
|
|
96
|
+
{
|
|
97
|
+
type: "button",
|
|
98
|
+
onClick: () => onRemove(job.id),
|
|
99
|
+
"aria-label": `Remove ${job.name}`,
|
|
100
|
+
className: "rounded-md p-1.5 text-muted-foreground hover:bg-muted hover:text-destructive focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
101
|
+
children: /* @__PURE__ */ jsx(Trash2, { className: "size-3.5" })
|
|
102
|
+
}
|
|
103
|
+
) : null
|
|
104
|
+
] })
|
|
105
|
+
]
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
);
|
|
110
|
+
CronJobCard.displayName = "CronJobCard";
|
|
111
|
+
|
|
112
|
+
export { CronJobCard };
|
|
113
|
+
//# sourceMappingURL=chunk-U4THNRV5.js.map
|
|
114
|
+
//# sourceMappingURL=chunk-U4THNRV5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/cron-job-card/cron-job-card.tsx"],"names":[],"mappings":"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","file":"chunk-U4THNRV5.js","sourcesContent":["import { Clock, Play, Square, Trash2 } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\nexport type CronJobStatus = \"idle\" | \"running\" | \"failed\" | \"disabled\";\n\nexport interface CronJob {\n id: string;\n /** Human-readable job name. */\n name: string;\n /** Cron expression — e.g. every 4 hours. */\n schedule: string;\n /** What gets run (prompt or command). */\n prompt: string;\n status: CronJobStatus;\n /** ISO/string timestamp of last run. */\n lastRun?: string;\n /** ISO/string timestamp of next run. */\n nextRun?: string;\n /** Optional last-run result line. */\n lastResult?: ReactNode;\n}\n\ninterface CronJobCardProps extends Omit<HTMLAttributes<HTMLElement>, \"onToggle\"> {\n job: CronJob;\n onRunNow?: (id: string) => void;\n onToggle?: (id: string, enabled: boolean) => void;\n onRemove?: (id: string) => void;\n}\n\nconst STATUS_CONFIG: Record<CronJobStatus, { label: string; class: string }> = {\n idle: { label: \"Scheduled\", class: \"border-success/40 bg-success/10 text-success\" },\n running: {\n label: \"Running\",\n class: \"border-primary/40 bg-primary/10 text-primary animate-pulse\",\n },\n failed: {\n label: \"Last run failed\",\n class: \"border-destructive/40 bg-destructive/10 text-destructive\",\n },\n disabled: { label: \"Disabled\", class: \"border-border/40 bg-muted text-muted-foreground\" },\n};\n\n/**\n * CronJobCard — one scheduled agent job. Shows cron expression, prompt,\n * status, last/next run. Inline actions: run now, pause, delete.\n */\nconst CronJobCard = forwardRef<HTMLElement, CronJobCardProps>(\n ({ className, job, onRunNow, onToggle, onRemove, ...props }, ref) => {\n const cfg = STATUS_CONFIG[job.status];\n const enabled = job.status !== \"disabled\";\n return (\n <article\n ref={ref}\n className={cn(\n \"grid gap-3 rounded-xl border bg-card p-4\",\n job.status === \"disabled\" && \"opacity-70\",\n className,\n )}\n {...props}\n >\n <header className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <h4 className=\"font-display text-title-md tracking-tight\">{job.name}</h4>\n <p className=\"mt-0.5 inline-flex items-center gap-2 font-mono text-code-sm text-muted-foreground\">\n <Clock className=\"size-3\" aria-hidden=\"true\" /> {job.schedule}\n </p>\n </div>\n <span\n className={cn(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5\",\n \"font-mono text-label uppercase tracking-wider\",\n cfg.class,\n )}\n >\n {cfg.label}\n </span>\n </header>\n\n <p className=\"line-clamp-2 rounded-md bg-muted/60 px-3 py-2 font-mono text-code-sm text-foreground\">\n {job.prompt}\n </p>\n\n <div className=\"grid grid-cols-2 gap-3 font-mono text-label text-muted-foreground\">\n <span>\n <span className=\"text-muted-foreground/60\">last:</span> {job.lastRun ?? \"never\"}\n </span>\n <span>\n <span className=\"text-muted-foreground/60\">next:</span> {job.nextRun ?? \"—\"}\n </span>\n </div>\n\n {job.lastResult ? (\n <p className=\"text-body-sm text-muted-foreground\">{job.lastResult}</p>\n ) : null}\n\n <footer className=\"flex items-center justify-end gap-1.5\">\n {onRunNow ? (\n <button\n type=\"button\"\n onClick={() => onRunNow(job.id)}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border/60 bg-card px-2.5 py-1 font-mono text-label hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Play className=\"size-3\" /> Run now\n </button>\n ) : null}\n {onToggle ? (\n <button\n type=\"button\"\n onClick={() => onToggle(job.id, !enabled)}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border/60 bg-card px-2.5 py-1 font-mono text-label hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Square className=\"size-3\" /> {enabled ? \"Pause\" : \"Enable\"}\n </button>\n ) : null}\n {onRemove ? (\n <button\n type=\"button\"\n onClick={() => onRemove(job.id)}\n aria-label={`Remove ${job.name}`}\n className=\"rounded-md p-1.5 text-muted-foreground hover:bg-muted hover:text-destructive focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Trash2 className=\"size-3.5\" />\n </button>\n ) : null}\n </footer>\n </article>\n );\n },\n);\nCronJobCard.displayName = \"CronJobCard\";\n\nexport { CronJobCard };\n"]}
|