@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 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/skeleton/skeleton.tsx"],"names":[],"mappings":";;;;;AAuBA,IAAM,QAAA,GAAW,UAAA;AAAA,EACf,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AAIhC,IAAA,MAAM,eAAe,eAAA,EAAgB;AACrC,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAM,eAAe,MAAA,GAAY,QAAA;AAAA,QACjC,WAAA,EAAW,eAAe,MAAA,GAAY,QAAA;AAAA,QACtC,YAAA,EAAY,eAAe,MAAA,GAAY,SAAA;AAAA,QACvC,SAAA,EAAW,EAAA,CAAG,mCAAA,EAAqC,SAAS,CAAA;AAAA,QAC3D,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,QAAA,CAAS,WAAA,GAAc,UAAA","file":"chunk-AHTVYOPQ.js","sourcesContent":["import { forwardRef } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { useInLiveRegion } from \"../../../lib/live-region-context.js\";\n\n/**\n * Skeleton — placeholder block shown while content is loading.\n *\n * Uses --muted as base + a subtle shimmer that respects the violet theme.\n * Compose multiple Skeletons to mirror your component layout while loading.\n *\n * Accessibility (LOW-004): the default `role=\"status\"` + `aria-live=\"polite\"`\n * announces \"Loading\" to screen readers. In loops or grids where many\n * Skeletons mount simultaneously, this can be noisy. Override per-instance\n * with `aria-live=\"off\"` and/or `aria-hidden` when only one container-level\n * loading announcement is desired:\n *\n * <div role=\"status\" aria-live=\"polite\" aria-label=\"Loading deployments\">\n * {placeholders.map(id => (\n * <Skeleton key={id} aria-live=\"off\" aria-hidden=\"true\" className=\"h-8\" />\n * ))}\n * </div>\n */\nconst Skeleton = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => {\n // T4.1 (MF-4): when nested inside a container live region (BuildLogStream,\n // ChatThread, etc.), omit role/aria-live so AT doesn't announce every\n // placeholder mount as a separate \"loading\" event.\n const inLiveRegion = useInLiveRegion();\n return (\n <div\n ref={ref}\n role={inLiveRegion ? undefined : \"status\"}\n aria-live={inLiveRegion ? undefined : \"polite\"}\n aria-label={inLiveRegion ? undefined : \"Loading\"}\n className={cn(\"animate-pulse rounded-md bg-muted\", className)}\n {...props}\n />\n );\n },\n);\nSkeleton.displayName = \"Skeleton\";\n\nexport { Skeleton };\n"]}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
2
|
+
import { Users, User, BookOpen, Sparkles } from 'lucide-react';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var SOURCE_CONFIG = {
|
|
7
|
+
builtin: { label: "Built-in", icon: Sparkles, tone: "text-primary" },
|
|
8
|
+
project: { label: "Project", icon: BookOpen, tone: "text-accent" },
|
|
9
|
+
user: { label: "User", icon: User, tone: "text-info" },
|
|
10
|
+
plugin: { label: "Plugin", icon: Users, tone: "text-muted-foreground" }
|
|
11
|
+
};
|
|
12
|
+
var SkillCard = forwardRef(
|
|
13
|
+
({ className, skill, onToggle, ...props }, ref) => {
|
|
14
|
+
const config = SOURCE_CONFIG[skill.source];
|
|
15
|
+
const Icon = config.icon;
|
|
16
|
+
const state = skill.state ?? "enabled";
|
|
17
|
+
const enabled = state === "enabled";
|
|
18
|
+
return /* @__PURE__ */ jsxs(
|
|
19
|
+
"article",
|
|
20
|
+
{
|
|
21
|
+
ref,
|
|
22
|
+
className: cn(
|
|
23
|
+
"grid gap-3 rounded-xl border bg-card p-4",
|
|
24
|
+
!enabled && "opacity-60",
|
|
25
|
+
className
|
|
26
|
+
),
|
|
27
|
+
...props,
|
|
28
|
+
children: [
|
|
29
|
+
/* @__PURE__ */ jsxs("header", { className: "flex items-start justify-between gap-3", children: [
|
|
30
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
31
|
+
/* @__PURE__ */ jsx("span", { className: cn("grid size-8 place-items-center rounded-md bg-muted", config.tone), children: /* @__PURE__ */ jsx(Icon, { className: "size-4", "aria-hidden": "true" }) }),
|
|
32
|
+
/* @__PURE__ */ jsxs("div", { className: "grid", children: [
|
|
33
|
+
/* @__PURE__ */ jsx("h4", { className: "font-medium font-mono text-body-sm text-foreground", children: skill.name }),
|
|
34
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono text-label-caps text-muted-foreground uppercase tracking-wider", children: config.label })
|
|
35
|
+
] })
|
|
36
|
+
] }),
|
|
37
|
+
onToggle ? /* @__PURE__ */ jsx(
|
|
38
|
+
"button",
|
|
39
|
+
{
|
|
40
|
+
type: "button",
|
|
41
|
+
onClick: () => onToggle(skill.id, enabled ? "disabled" : "enabled"),
|
|
42
|
+
"aria-pressed": enabled,
|
|
43
|
+
className: cn(
|
|
44
|
+
"inline-flex items-center rounded-full border px-2.5 py-0.5",
|
|
45
|
+
"font-mono text-label uppercase tracking-wider transition-colors",
|
|
46
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
47
|
+
enabled ? "border-success/40 bg-success/15 text-success" : "border-border/40 bg-muted text-muted-foreground"
|
|
48
|
+
),
|
|
49
|
+
children: enabled ? "Enabled" : "Disabled"
|
|
50
|
+
}
|
|
51
|
+
) : null
|
|
52
|
+
] }),
|
|
53
|
+
skill.description ? /* @__PURE__ */ jsx("p", { className: "text-body-sm text-muted-foreground", children: skill.description }) : null,
|
|
54
|
+
skill.allowedTools && skill.allowedTools.length > 0 ? /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-1.5", children: [
|
|
55
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono text-label text-muted-foreground uppercase tracking-wider", children: "tools:" }),
|
|
56
|
+
skill.allowedTools.map((tool) => /* @__PURE__ */ jsx(
|
|
57
|
+
"span",
|
|
58
|
+
{
|
|
59
|
+
className: "inline-flex items-center rounded-md bg-muted px-2 py-0.5 font-mono text-foreground text-label",
|
|
60
|
+
children: tool
|
|
61
|
+
},
|
|
62
|
+
tool
|
|
63
|
+
))
|
|
64
|
+
] }) : null,
|
|
65
|
+
skill.triggers && skill.triggers.length > 0 ? /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-1.5", children: [
|
|
66
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono text-label text-muted-foreground uppercase tracking-wider", children: "triggers:" }),
|
|
67
|
+
skill.triggers.map((trigger) => /* @__PURE__ */ jsx(
|
|
68
|
+
"span",
|
|
69
|
+
{
|
|
70
|
+
className: "inline-flex items-center rounded-md bg-primary/10 px-2 py-0.5 font-mono text-label text-primary",
|
|
71
|
+
children: trigger
|
|
72
|
+
},
|
|
73
|
+
trigger
|
|
74
|
+
))
|
|
75
|
+
] }) : null
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
);
|
|
81
|
+
SkillCard.displayName = "SkillCard";
|
|
82
|
+
|
|
83
|
+
export { SkillCard };
|
|
84
|
+
//# sourceMappingURL=chunk-AJTJNHKK.js.map
|
|
85
|
+
//# sourceMappingURL=chunk-AJTJNHKK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/skill-card/skill-card.tsx"],"names":[],"mappings":"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","file":"chunk-AJTJNHKK.js","sourcesContent":["import { BookOpen, Sparkles, User, Users } 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\";\nimport type { Mode } from \"../../../types/mode.js\";\n\nexport type SkillSource = \"builtin\" | \"project\" | \"user\" | \"plugin\";\nexport type SkillState = \"enabled\" | \"disabled\";\n\nconst SOURCE_CONFIG: Record<SkillSource, { label: string; icon: IconComponent; tone: string }> = {\n builtin: { label: \"Built-in\", icon: Sparkles, tone: \"text-primary\" },\n project: { label: \"Project\", icon: BookOpen, tone: \"text-accent\" },\n user: { label: \"User\", icon: User, tone: \"text-info\" },\n plugin: { label: \"Plugin\", icon: Users, tone: \"text-muted-foreground\" },\n};\n\nexport interface Skill {\n id: string;\n name: string;\n description?: ReactNode;\n /** Where the skill comes from. */\n source: SkillSource;\n /** Optional tools the skill is allowed to use (informational). */\n allowedTools?: string[];\n /** Optional trigger keywords / patterns for discovery. */\n triggers?: string[];\n state?: SkillState;\n /** Modes this skill is visible in. Omit / empty = global (all modes). */\n modes?: Mode[];\n}\n\ninterface SkillCardProps extends Omit<HTMLAttributes<HTMLDivElement>, \"onToggle\"> {\n skill: Skill;\n onToggle?: (id: string, next: SkillState) => void;\n}\n\n/**\n * SkillCard — single skill entry showing what it does, where it came from,\n * and which tools it needs. Toggle to enable/disable for the current session.\n */\nconst SkillCard = forwardRef<HTMLDivElement, SkillCardProps>(\n ({ className, skill, onToggle, ...props }, ref) => {\n const config = SOURCE_CONFIG[skill.source];\n const Icon = config.icon;\n const state = skill.state ?? \"enabled\";\n const enabled = state === \"enabled\";\n return (\n <article\n ref={ref}\n className={cn(\n \"grid gap-3 rounded-xl border bg-card p-4\",\n !enabled && \"opacity-60\",\n className,\n )}\n {...props}\n >\n <header className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-center gap-2\">\n <span className={cn(\"grid size-8 place-items-center rounded-md bg-muted\", config.tone)}>\n <Icon className=\"size-4\" aria-hidden=\"true\" />\n </span>\n <div className=\"grid\">\n <h4 className=\"font-medium font-mono text-body-sm text-foreground\">{skill.name}</h4>\n <span className=\"font-mono text-label-caps text-muted-foreground uppercase tracking-wider\">\n {config.label}\n </span>\n </div>\n </div>\n {onToggle ? (\n <button\n type=\"button\"\n onClick={() => onToggle(skill.id, enabled ? \"disabled\" : \"enabled\")}\n aria-pressed={enabled}\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 transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n enabled\n ? \"border-success/40 bg-success/15 text-success\"\n : \"border-border/40 bg-muted text-muted-foreground\",\n )}\n >\n {enabled ? \"Enabled\" : \"Disabled\"}\n </button>\n ) : null}\n </header>\n {skill.description ? (\n <p className=\"text-body-sm text-muted-foreground\">{skill.description}</p>\n ) : null}\n {skill.allowedTools && skill.allowedTools.length > 0 ? (\n <div className=\"flex flex-wrap gap-1.5\">\n <span className=\"font-mono text-label text-muted-foreground uppercase tracking-wider\">\n tools:\n </span>\n {skill.allowedTools.map((tool) => (\n <span\n key={tool}\n className=\"inline-flex items-center rounded-md bg-muted px-2 py-0.5 font-mono text-foreground text-label\"\n >\n {tool}\n </span>\n ))}\n </div>\n ) : null}\n {skill.triggers && skill.triggers.length > 0 ? (\n <div className=\"flex flex-wrap gap-1.5\">\n <span className=\"font-mono text-label text-muted-foreground uppercase tracking-wider\">\n triggers:\n </span>\n {skill.triggers.map((trigger) => (\n <span\n key={trigger}\n className=\"inline-flex items-center rounded-md bg-primary/10 px-2 py-0.5 font-mono text-label text-primary\"\n >\n {trigger}\n </span>\n ))}\n </div>\n ) : null}\n </article>\n );\n },\n);\nSkillCard.displayName = \"SkillCard\";\n\nexport { SkillCard };\n"]}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
2
|
+
import { Plus, Trash2, Lock, ShieldQuestion, Check } from 'lucide-react';
|
|
3
|
+
import { forwardRef, useState } from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var DECISION_CLASS = {
|
|
7
|
+
allow: "bg-success/15 text-success border-success/40",
|
|
8
|
+
ask: "bg-warning/15 text-warning border-warning/40",
|
|
9
|
+
deny: "bg-destructive/15 text-destructive border-destructive/40"
|
|
10
|
+
};
|
|
11
|
+
var DECISION_ICON = {
|
|
12
|
+
allow: /* @__PURE__ */ jsx(Check, { className: "size-3", "aria-hidden": "true" }),
|
|
13
|
+
ask: /* @__PURE__ */ jsx(ShieldQuestion, { className: "size-3", "aria-hidden": "true" }),
|
|
14
|
+
deny: /* @__PURE__ */ jsx(Lock, { className: "size-3", "aria-hidden": "true" })
|
|
15
|
+
};
|
|
16
|
+
var cycle = (cur) => cur === "allow" ? "ask" : cur === "ask" ? "deny" : "allow";
|
|
17
|
+
var PermissionMatrix = forwardRef(
|
|
18
|
+
({
|
|
19
|
+
className,
|
|
20
|
+
rules,
|
|
21
|
+
title = "Permissions",
|
|
22
|
+
toolOptions,
|
|
23
|
+
onAdd,
|
|
24
|
+
onRemove,
|
|
25
|
+
onDecisionChange,
|
|
26
|
+
...props
|
|
27
|
+
}, ref) => {
|
|
28
|
+
const [newTool, setNewTool] = useState(toolOptions?.[0] ?? "*");
|
|
29
|
+
const [newPath, setNewPath] = useState("");
|
|
30
|
+
const [newDecision, setNewDecision] = useState("ask");
|
|
31
|
+
const submit = () => {
|
|
32
|
+
if (!newPath.trim()) return;
|
|
33
|
+
onAdd?.({ tool: newTool, path: newPath.trim(), decision: newDecision });
|
|
34
|
+
setNewPath("");
|
|
35
|
+
};
|
|
36
|
+
return /* @__PURE__ */ jsxs("section", { ref, className: cn("rounded-xl border bg-card", className), ...props, children: [
|
|
37
|
+
title ? /* @__PURE__ */ jsxs("header", { className: "flex items-baseline justify-between border-border/40 border-b px-4 py-3", children: [
|
|
38
|
+
/* @__PURE__ */ jsx("h3", { className: "font-display text-title-md tracking-tight", children: title }),
|
|
39
|
+
/* @__PURE__ */ jsxs("span", { className: "font-mono text-label text-muted-foreground", children: [
|
|
40
|
+
rules.length,
|
|
41
|
+
" ",
|
|
42
|
+
rules.length === 1 ? "rule" : "rules"
|
|
43
|
+
] })
|
|
44
|
+
] }) : null,
|
|
45
|
+
onAdd && toolOptions && toolOptions.length > 0 ? /* @__PURE__ */ jsxs(
|
|
46
|
+
"form",
|
|
47
|
+
{
|
|
48
|
+
className: "grid grid-cols-[1fr_2fr_auto_auto] gap-2 border-border/40 border-b p-3",
|
|
49
|
+
onSubmit: (e) => {
|
|
50
|
+
e.preventDefault();
|
|
51
|
+
submit();
|
|
52
|
+
},
|
|
53
|
+
children: [
|
|
54
|
+
/* @__PURE__ */ jsxs(
|
|
55
|
+
"select",
|
|
56
|
+
{
|
|
57
|
+
value: newTool,
|
|
58
|
+
onChange: (e) => setNewTool(e.target.value),
|
|
59
|
+
"aria-label": "Tool",
|
|
60
|
+
className: "h-9 rounded-md border border-input bg-card px-2 font-mono text-code-sm",
|
|
61
|
+
children: [
|
|
62
|
+
/* @__PURE__ */ jsx("option", { value: "*", children: "* (any tool)" }),
|
|
63
|
+
toolOptions.map((t) => /* @__PURE__ */ jsx("option", { value: t, children: t }, t))
|
|
64
|
+
]
|
|
65
|
+
}
|
|
66
|
+
),
|
|
67
|
+
/* @__PURE__ */ jsx(
|
|
68
|
+
"input",
|
|
69
|
+
{
|
|
70
|
+
type: "text",
|
|
71
|
+
value: newPath,
|
|
72
|
+
onChange: (e) => setNewPath(e.target.value),
|
|
73
|
+
placeholder: "path glob (e.g. src/**/*.ts)",
|
|
74
|
+
"aria-label": "Path",
|
|
75
|
+
className: "h-9 rounded-md border border-input bg-card px-2 font-mono text-code-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
76
|
+
}
|
|
77
|
+
),
|
|
78
|
+
/* @__PURE__ */ jsxs(
|
|
79
|
+
"select",
|
|
80
|
+
{
|
|
81
|
+
value: newDecision,
|
|
82
|
+
onChange: (e) => setNewDecision(e.target.value),
|
|
83
|
+
"aria-label": "Decision",
|
|
84
|
+
className: "h-9 rounded-md border border-input bg-card px-2 font-mono text-code-sm uppercase",
|
|
85
|
+
children: [
|
|
86
|
+
/* @__PURE__ */ jsx("option", { value: "allow", children: "allow" }),
|
|
87
|
+
/* @__PURE__ */ jsx("option", { value: "ask", children: "ask" }),
|
|
88
|
+
/* @__PURE__ */ jsx("option", { value: "deny", children: "deny" })
|
|
89
|
+
]
|
|
90
|
+
}
|
|
91
|
+
),
|
|
92
|
+
/* @__PURE__ */ jsxs(
|
|
93
|
+
"button",
|
|
94
|
+
{
|
|
95
|
+
type: "submit",
|
|
96
|
+
className: "inline-flex h-9 items-center gap-1 rounded-md bg-primary px-3 font-sans text-label text-primary-foreground hover:shadow-glow focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
97
|
+
children: [
|
|
98
|
+
/* @__PURE__ */ jsx(Plus, { className: "size-3.5" }),
|
|
99
|
+
" Add"
|
|
100
|
+
]
|
|
101
|
+
}
|
|
102
|
+
)
|
|
103
|
+
]
|
|
104
|
+
}
|
|
105
|
+
) : null,
|
|
106
|
+
/* @__PURE__ */ jsxs("ul", { className: "divide-y divide-border/30", children: [
|
|
107
|
+
rules.map((rule) => /* @__PURE__ */ jsxs(
|
|
108
|
+
"li",
|
|
109
|
+
{
|
|
110
|
+
className: "grid grid-cols-[1fr_2fr_auto_auto] items-center gap-3 px-4 py-2.5",
|
|
111
|
+
children: [
|
|
112
|
+
/* @__PURE__ */ jsx("span", { className: "truncate font-mono text-code-sm text-foreground", children: rule.tool }),
|
|
113
|
+
/* @__PURE__ */ jsx("span", { className: "truncate font-mono text-code-sm text-muted-foreground", children: rule.path }),
|
|
114
|
+
/* @__PURE__ */ jsxs(
|
|
115
|
+
"button",
|
|
116
|
+
{
|
|
117
|
+
type: "button",
|
|
118
|
+
onClick: () => onDecisionChange?.(rule.id, cycle(rule.decision)),
|
|
119
|
+
className: cn(
|
|
120
|
+
"inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1",
|
|
121
|
+
"font-mono text-label uppercase tracking-wider transition-colors",
|
|
122
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
123
|
+
DECISION_CLASS[rule.decision],
|
|
124
|
+
!onDecisionChange && "pointer-events-none"
|
|
125
|
+
),
|
|
126
|
+
children: [
|
|
127
|
+
DECISION_ICON[rule.decision],
|
|
128
|
+
rule.decision
|
|
129
|
+
]
|
|
130
|
+
}
|
|
131
|
+
),
|
|
132
|
+
onRemove ? /* @__PURE__ */ jsx(
|
|
133
|
+
"button",
|
|
134
|
+
{
|
|
135
|
+
type: "button",
|
|
136
|
+
onClick: () => onRemove(rule.id),
|
|
137
|
+
"aria-label": `Remove rule ${rule.tool} ${rule.path}`,
|
|
138
|
+
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",
|
|
139
|
+
children: /* @__PURE__ */ jsx(Trash2, { className: "size-3.5" })
|
|
140
|
+
}
|
|
141
|
+
) : null
|
|
142
|
+
]
|
|
143
|
+
},
|
|
144
|
+
rule.id
|
|
145
|
+
)),
|
|
146
|
+
rules.length === 0 ? /* @__PURE__ */ jsx("li", { className: "px-4 py-8 text-center font-sans text-body-sm text-muted-foreground", children: "No permission rules configured. The agent will fall back to default policy." }) : null
|
|
147
|
+
] })
|
|
148
|
+
] });
|
|
149
|
+
}
|
|
150
|
+
);
|
|
151
|
+
PermissionMatrix.displayName = "PermissionMatrix";
|
|
152
|
+
|
|
153
|
+
export { PermissionMatrix };
|
|
154
|
+
//# sourceMappingURL=chunk-AMT3CPMC.js.map
|
|
155
|
+
//# sourceMappingURL=chunk-AMT3CPMC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/permission-matrix/permission-matrix.tsx"],"names":[],"mappings":"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","file":"chunk-AMT3CPMC.js","sourcesContent":["import { Check, Lock, Plus, ShieldQuestion, Trash2 } from \"lucide-react\";\nimport { forwardRef, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\nexport type PermissionDecisionKind = \"allow\" | \"ask\" | \"deny\";\n\nexport interface PermissionRule {\n id: string;\n /** Tool the rule applies to. Use \"*\" for any. */\n tool: string;\n /** Glob path it applies to. Use \"*\" for any. */\n path: string;\n decision: PermissionDecisionKind;\n /** Optional rationale shown as helper text. */\n note?: string;\n}\n\ninterface PermissionMatrixProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n rules: PermissionRule[];\n title?: ReactNode;\n /**\n * Available tools shown in the add form. Pass `undefined` (or omit) — or an\n * empty array — to hide the add form entirely. The form only renders when\n * `onAdd` is provided AND `toolOptions` has at least one entry.\n */\n toolOptions?: string[];\n onAdd?: (rule: Omit<PermissionRule, \"id\">) => void;\n onRemove?: (id: string) => void;\n onDecisionChange?: (id: string, decision: PermissionDecisionKind) => void;\n}\n\nconst DECISION_CLASS: Record<PermissionDecisionKind, string> = {\n allow: \"bg-success/15 text-success border-success/40\",\n ask: \"bg-warning/15 text-warning border-warning/40\",\n deny: \"bg-destructive/15 text-destructive border-destructive/40\",\n};\n\nconst DECISION_ICON: Record<PermissionDecisionKind, ReactNode> = {\n allow: <Check className=\"size-3\" aria-hidden=\"true\" />,\n ask: <ShieldQuestion className=\"size-3\" aria-hidden=\"true\" />,\n deny: <Lock className=\"size-3\" aria-hidden=\"true\" />,\n};\n\nconst cycle = (cur: PermissionDecisionKind): PermissionDecisionKind =>\n cur === \"allow\" ? \"ask\" : cur === \"ask\" ? \"deny\" : \"allow\";\n\n/**\n * PermissionMatrix — tool × path × decision grid for fine-grained access\n * control. Used as the \"permissions\" tab in the agent settings.\n *\n * One PermissionRule per row. Click the decision pill to cycle Allow → Ask → Deny.\n *\n * Design decision (2026-05-14): PermissionMatrix stays in `primitives/`\n * — not `composites/` — even though it renders inputs and a select. The native\n * `<input>` / `<select>` elements use Theo design tokens directly (border-input,\n * ring, font-mono) so visual parity with `Input` / `Select` primitives is\n * preserved. Reason for keeping it primitive: a consumer installing\n * `permission-matrix` from the registry gets a single self-contained file with\n * no transitive Theo dependencies — opposite trade-off from `EnvVarEditor`\n * which is intentionally a composite. Both shapes are valid; we ship one of\n * each so consumers can pick the dependency profile that fits their app.\n */\nconst PermissionMatrix = forwardRef<HTMLDivElement, PermissionMatrixProps>(\n (\n {\n className,\n rules,\n title = \"Permissions\",\n toolOptions,\n onAdd,\n onRemove,\n onDecisionChange,\n ...props\n },\n ref,\n ) => {\n const [newTool, setNewTool] = useState(toolOptions?.[0] ?? \"*\");\n const [newPath, setNewPath] = useState(\"\");\n const [newDecision, setNewDecision] = useState<PermissionDecisionKind>(\"ask\");\n\n const submit = () => {\n if (!newPath.trim()) return;\n onAdd?.({ tool: newTool, path: newPath.trim(), decision: newDecision });\n setNewPath(\"\");\n };\n\n return (\n <section ref={ref} className={cn(\"rounded-xl border bg-card\", className)} {...props}>\n {title ? (\n <header className=\"flex items-baseline justify-between border-border/40 border-b px-4 py-3\">\n <h3 className=\"font-display text-title-md tracking-tight\">{title}</h3>\n <span className=\"font-mono text-label text-muted-foreground\">\n {rules.length} {rules.length === 1 ? \"rule\" : \"rules\"}\n </span>\n </header>\n ) : null}\n\n {onAdd && toolOptions && toolOptions.length > 0 ? (\n <form\n className=\"grid grid-cols-[1fr_2fr_auto_auto] gap-2 border-border/40 border-b p-3\"\n onSubmit={(e) => {\n e.preventDefault();\n submit();\n }}\n >\n <select\n value={newTool}\n onChange={(e) => setNewTool(e.target.value)}\n aria-label=\"Tool\"\n className=\"h-9 rounded-md border border-input bg-card px-2 font-mono text-code-sm\"\n >\n <option value=\"*\">* (any tool)</option>\n {toolOptions.map((t) => (\n <option key={t} value={t}>\n {t}\n </option>\n ))}\n </select>\n <input\n type=\"text\"\n value={newPath}\n onChange={(e) => setNewPath(e.target.value)}\n placeholder=\"path glob (e.g. src/**/*.ts)\"\n aria-label=\"Path\"\n className=\"h-9 rounded-md border border-input bg-card px-2 font-mono text-code-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n <select\n value={newDecision}\n onChange={(e) => setNewDecision(e.target.value as PermissionDecisionKind)}\n aria-label=\"Decision\"\n className=\"h-9 rounded-md border border-input bg-card px-2 font-mono text-code-sm uppercase\"\n >\n <option value=\"allow\">allow</option>\n <option value=\"ask\">ask</option>\n <option value=\"deny\">deny</option>\n </select>\n <button\n type=\"submit\"\n className=\"inline-flex h-9 items-center gap-1 rounded-md bg-primary px-3 font-sans text-label text-primary-foreground hover:shadow-glow focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Plus className=\"size-3.5\" /> Add\n </button>\n </form>\n ) : null}\n\n <ul className=\"divide-y divide-border/30\">\n {rules.map((rule) => (\n <li\n key={rule.id}\n className=\"grid grid-cols-[1fr_2fr_auto_auto] items-center gap-3 px-4 py-2.5\"\n >\n <span className=\"truncate font-mono text-code-sm text-foreground\">{rule.tool}</span>\n <span className=\"truncate font-mono text-code-sm text-muted-foreground\">\n {rule.path}\n </span>\n <button\n type=\"button\"\n onClick={() => onDecisionChange?.(rule.id, cycle(rule.decision))}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1\",\n \"font-mono text-label uppercase tracking-wider transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n DECISION_CLASS[rule.decision],\n !onDecisionChange && \"pointer-events-none\",\n )}\n >\n {DECISION_ICON[rule.decision]}\n {rule.decision}\n </button>\n {onRemove ? (\n <button\n type=\"button\"\n onClick={() => onRemove(rule.id)}\n aria-label={`Remove rule ${rule.tool} ${rule.path}`}\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 </li>\n ))}\n {rules.length === 0 ? (\n <li className=\"px-4 py-8 text-center font-sans text-body-sm text-muted-foreground\">\n No permission rules configured. The agent will fall back to default policy.\n </li>\n ) : null}\n </ul>\n </section>\n );\n },\n);\nPermissionMatrix.displayName = \"PermissionMatrix\";\n\nexport { PermissionMatrix };\n"]}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
2
|
+
import { CircleDashed, Check, Loader2 } from 'lucide-react';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var statusIcon = {
|
|
7
|
+
pending: CircleDashed,
|
|
8
|
+
running: Loader2,
|
|
9
|
+
done: Check,
|
|
10
|
+
skipped: CircleDashed
|
|
11
|
+
};
|
|
12
|
+
var statusToneText = {
|
|
13
|
+
pending: "text-muted-foreground",
|
|
14
|
+
running: "text-primary",
|
|
15
|
+
done: "text-success line-through",
|
|
16
|
+
skipped: "text-muted-foreground line-through"
|
|
17
|
+
};
|
|
18
|
+
var statusBg = {
|
|
19
|
+
pending: "bg-muted text-muted-foreground",
|
|
20
|
+
running: "bg-primary text-primary-foreground",
|
|
21
|
+
done: "bg-success text-success-foreground",
|
|
22
|
+
skipped: "bg-muted text-muted-foreground"
|
|
23
|
+
};
|
|
24
|
+
var ProgressChecklist = forwardRef(
|
|
25
|
+
({ className, title, steps, showProgressBars = true, ...props }, ref) => /* @__PURE__ */ jsxs("section", { ref, className: cn("rounded-xl border bg-card p-4", className), ...props, children: [
|
|
26
|
+
title ? /* @__PURE__ */ jsx("header", { className: "mb-3 flex items-center justify-between", children: /* @__PURE__ */ jsx("h3", { className: "font-display text-title-md tracking-tight", children: title }) }) : null,
|
|
27
|
+
/* @__PURE__ */ jsx("ol", { className: "grid gap-3", children: steps.map((step) => {
|
|
28
|
+
const Icon = statusIcon[step.status];
|
|
29
|
+
return /* @__PURE__ */ jsxs("li", { className: "grid grid-cols-[auto_1fr] items-start gap-3", children: [
|
|
30
|
+
/* @__PURE__ */ jsx(
|
|
31
|
+
"span",
|
|
32
|
+
{
|
|
33
|
+
className: cn(
|
|
34
|
+
"mt-0.5 grid size-5 place-items-center rounded-full",
|
|
35
|
+
statusBg[step.status]
|
|
36
|
+
),
|
|
37
|
+
"aria-hidden": "true",
|
|
38
|
+
children: /* @__PURE__ */ jsx(Icon, { className: cn("size-3", step.status === "running" && "animate-spin") })
|
|
39
|
+
}
|
|
40
|
+
),
|
|
41
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
42
|
+
/* @__PURE__ */ jsx("p", { className: cn("text-body-sm", statusToneText[step.status]), children: step.label }),
|
|
43
|
+
showProgressBars && step.status === "running" && step.progress !== void 0 ? /* @__PURE__ */ jsx("div", { className: "mt-1.5 h-1 w-full overflow-hidden rounded-full bg-muted", children: /* @__PURE__ */ jsx(
|
|
44
|
+
"div",
|
|
45
|
+
{
|
|
46
|
+
className: "h-full bg-primary transition-[width] duration-base ease-out-soft",
|
|
47
|
+
style: { width: `${Math.round(step.progress * 100)}%` }
|
|
48
|
+
}
|
|
49
|
+
) }) : null
|
|
50
|
+
] })
|
|
51
|
+
] }, step.id);
|
|
52
|
+
}) })
|
|
53
|
+
] })
|
|
54
|
+
);
|
|
55
|
+
ProgressChecklist.displayName = "ProgressChecklist";
|
|
56
|
+
|
|
57
|
+
export { ProgressChecklist };
|
|
58
|
+
//# sourceMappingURL=chunk-AX5EH73R.js.map
|
|
59
|
+
//# sourceMappingURL=chunk-AX5EH73R.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/progress-checklist/progress-checklist.tsx"],"names":[],"mappings":";;;;;AAMA,IAAM,UAAA,GAAa;AAAA,EACjB,OAAA,EAAS,YAAA;AAAA,EACT,OAAA,EAAS,OAAA;AAAA,EACT,IAAA,EAAM,KAAA;AAAA,EACN,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,cAAA,GAAiD;AAAA,EACrD,OAAA,EAAS,uBAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,IAAA,EAAM,2BAAA;AAAA,EACN,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,QAAA,GAA2C;AAAA,EAC/C,OAAA,EAAS,gCAAA;AAAA,EACT,OAAA,EAAS,oCAAA;AAAA,EACT,IAAA,EAAM,oCAAA;AAAA,EACN,OAAA,EAAS;AACX,CAAA;AAiBA,IAAM,iBAAA,GAAoB,UAAA;AAAA,EACxB,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,OAAO,gBAAA,GAAmB,IAAA,EAAM,GAAG,KAAA,EAAM,EAAG,wBAC/D,IAAA,CAAC,SAAA,EAAA,EAAQ,KAAU,SAAA,EAAW,EAAA,CAAG,iCAAiC,SAAS,CAAA,EAAI,GAAG,KAAA,EAC/E,QAAA,EAAA;AAAA,IAAA,KAAA,mBACC,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,wCAAA,EAChB,QAAA,kBAAA,GAAA,CAAC,QAAG,SAAA,EAAU,2CAAA,EAA6C,QAAA,EAAA,KAAA,EAAM,CAAA,EACnE,CAAA,GACE,IAAA;AAAA,wBACH,IAAA,EAAA,EAAG,SAAA,EAAU,cACX,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACnB,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AACnC,MAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAiB,SAAA,EAAU,6CAAA,EAC1B,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,oDAAA;AAAA,cACA,QAAA,CAAS,KAAK,MAAM;AAAA,aACtB;AAAA,YACA,aAAA,EAAY,MAAA;AAAA,YAEZ,QAAA,kBAAA,GAAA,CAAC,QAAK,SAAA,EAAW,EAAA,CAAG,UAAU,IAAA,CAAK,MAAA,KAAW,SAAA,IAAa,cAAc,CAAA,EAAG;AAAA;AAAA,SAC9E;AAAA,wBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,EAAA,CAAG,cAAA,EAAgB,cAAA,CAAe,KAAK,MAAM,CAAC,CAAA,EAAI,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,UAC1E,gBAAA,IAAoB,IAAA,CAAK,MAAA,KAAW,SAAA,IAAa,IAAA,CAAK,aAAa,MAAA,mBAClE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDAAA,EACb,QAAA,kBAAA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,kEAAA;AAAA,cACV,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,IAAA,CAAK,MAAM,IAAA,CAAK,QAAA,GAAW,GAAG,CAAC,CAAA,CAAA,CAAA;AAAI;AAAA,aAE1D,CAAA,GACE;AAAA,SAAA,EACN;AAAA,OAAA,EAAA,EApBO,KAAK,EAqBd,CAAA;AAAA,IAEJ,CAAC,CAAA,EACH;AAAA,GAAA,EACF;AAEJ;AACA,iBAAA,CAAkB,WAAA,GAAc,mBAAA","file":"chunk-AX5EH73R.js","sourcesContent":["import { Check, CircleDashed, Loader2 } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { TaskStep, TaskStepStatus } from \"../../../types/task.js\";\n\nconst statusIcon = {\n pending: CircleDashed,\n running: Loader2,\n done: Check,\n skipped: CircleDashed,\n} as const;\n\nconst statusToneText: Record<TaskStepStatus, string> = {\n pending: \"text-muted-foreground\",\n running: \"text-primary\",\n done: \"text-success line-through\",\n skipped: \"text-muted-foreground line-through\",\n};\n\nconst statusBg: Record<TaskStepStatus, string> = {\n pending: \"bg-muted text-muted-foreground\",\n running: \"bg-primary text-primary-foreground\",\n done: \"bg-success text-success-foreground\",\n skipped: \"bg-muted text-muted-foreground\",\n};\n\ninterface ProgressChecklistProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n title?: ReactNode;\n steps: TaskStep[];\n /**\n * If true, shows percentage bar for running steps with `progress`.\n */\n showProgressBars?: boolean;\n}\n\n/**\n * ProgressChecklist — right-inspector checklist.\n *\n * Visual: vertical list of steps with status dot, label, optional progress bar.\n * Matches WIREMOCKS §3 / §4 (\"Progresso\") with checkmarks and pulse on running.\n */\nconst ProgressChecklist = forwardRef<HTMLDivElement, ProgressChecklistProps>(\n ({ className, title, steps, showProgressBars = true, ...props }, ref) => (\n <section ref={ref} className={cn(\"rounded-xl border bg-card p-4\", className)} {...props}>\n {title ? (\n <header className=\"mb-3 flex items-center justify-between\">\n <h3 className=\"font-display text-title-md tracking-tight\">{title}</h3>\n </header>\n ) : null}\n <ol className=\"grid gap-3\">\n {steps.map((step) => {\n const Icon = statusIcon[step.status];\n return (\n <li key={step.id} className=\"grid grid-cols-[auto_1fr] items-start gap-3\">\n <span\n className={cn(\n \"mt-0.5 grid size-5 place-items-center rounded-full\",\n statusBg[step.status],\n )}\n aria-hidden=\"true\"\n >\n <Icon className={cn(\"size-3\", step.status === \"running\" && \"animate-spin\")} />\n </span>\n <div className=\"min-w-0\">\n <p className={cn(\"text-body-sm\", statusToneText[step.status])}>{step.label}</p>\n {showProgressBars && step.status === \"running\" && step.progress !== undefined ? (\n <div className=\"mt-1.5 h-1 w-full overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-full bg-primary transition-[width] duration-base ease-out-soft\"\n style={{ width: `${Math.round(step.progress * 100)}%` }}\n />\n </div>\n ) : null}\n </div>\n </li>\n );\n })}\n </ol>\n </section>\n ),\n);\nProgressChecklist.displayName = \"ProgressChecklist\";\n\nexport { ProgressChecklist };\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
2
|
+
import { cva } from 'class-variance-authority';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var inputVariants = cva(
|
|
7
|
+
[
|
|
8
|
+
"flex w-full rounded-md border border-input bg-card",
|
|
9
|
+
"text-foreground placeholder:text-muted-foreground",
|
|
10
|
+
"transition-[box-shadow,border-color] duration-base ease-out-soft",
|
|
11
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
|
|
12
|
+
"focus-visible:border-primary",
|
|
13
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
14
|
+
"file:border-0 file:bg-transparent file:font-medium file:text-body-sm"
|
|
15
|
+
],
|
|
16
|
+
{
|
|
17
|
+
variants: {
|
|
18
|
+
size: {
|
|
19
|
+
sm: "h-8 px-2.5 py-1 text-body-sm",
|
|
20
|
+
// md: density-tunable via CSS var. Comfortable (default) = 36px.
|
|
21
|
+
md: "h-[var(--theo-control-h,2.25rem)] px-[var(--theo-control-px,0.875rem)] py-1.5 text-body-sm",
|
|
22
|
+
lg: "h-11 px-4 py-2.5 text-body-md"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
defaultVariants: { size: "md" }
|
|
26
|
+
}
|
|
27
|
+
);
|
|
28
|
+
var Input = forwardRef(
|
|
29
|
+
({ className, type = "text", size, ...props }, ref) => /* @__PURE__ */ jsx("input", { ref, type, className: cn(inputVariants({ size }), className), ...props })
|
|
30
|
+
);
|
|
31
|
+
Input.displayName = "Input";
|
|
32
|
+
|
|
33
|
+
export { Input };
|
|
34
|
+
//# sourceMappingURL=chunk-B3VAJSZ2.js.map
|
|
35
|
+
//# sourceMappingURL=chunk-B3VAJSZ2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/input/input.tsx"],"names":[],"mappings":";;;;;AAKA,IAAM,aAAA,GAAgB,GAAA;AAAA,EACpB;AAAA,IACE,oDAAA;AAAA,IACA,mDAAA;AAAA,IACA,kEAAA;AAAA,IACA,0IAAA;AAAA,IACA,8BAAA;AAAA,IACA,iDAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,8BAAA;AAAA;AAAA,QAEJ,EAAA,EAAI,4FAAA;AAAA,QACJ,EAAA,EAAI;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB,EAAE,IAAA,EAAM,IAAA;AAAK;AAElC,CAAA;AAqBA,IAAM,KAAA,GAAQ,UAAA;AAAA,EACZ,CAAC,EAAE,SAAA,EAAW,IAAA,GAAO,MAAA,EAAQ,MAAM,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC7C,GAAA,CAAC,OAAA,EAAA,EAAM,KAAU,IAAA,EAAY,SAAA,EAAW,EAAA,CAAG,aAAA,CAAc,EAAE,IAAA,EAAM,CAAA,EAAG,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO;AAE/F;AACA,KAAA,CAAM,WAAA,GAAc,OAAA","file":"chunk-B3VAJSZ2.js","sourcesContent":["import { type VariantProps, cva } from \"class-variance-authority\";\nimport { forwardRef } from \"react\";\nimport type { InputHTMLAttributes } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\nconst inputVariants = cva(\n [\n \"flex w-full rounded-md border border-input bg-card\",\n \"text-foreground placeholder:text-muted-foreground\",\n \"transition-[box-shadow,border-color] duration-base ease-out-soft\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n \"focus-visible:border-primary\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"file:border-0 file:bg-transparent file:font-medium file:text-body-sm\",\n ],\n {\n variants: {\n size: {\n sm: \"h-8 px-2.5 py-1 text-body-sm\",\n // md: density-tunable via CSS var. Comfortable (default) = 36px.\n md: \"h-[var(--theo-control-h,2.25rem)] px-[var(--theo-control-px,0.875rem)] py-1.5 text-body-sm\",\n lg: \"h-11 px-4 py-2.5 text-body-md\",\n },\n },\n defaultVariants: { size: \"md\" },\n },\n);\n\n/**\n * Input — text input primitive.\n *\n * Violet Forge specifics:\n * - height 40px (h-10) matching default Button md.\n * - rounded-md (6px) — slightly less than buttons to differentiate.\n * - focus uses violet ring (--ring).\n * - placeholder uses --muted-foreground.\n *\n * The `size` prop accepts `\"sm\" | \"md\" | \"lg\"`. Default `md` preserves the\n * 40px tall input from before this prop existed. EC-1 (edge-case review):\n * this overrides the native HTML `size` attribute (text-input columns) —\n * use `{...{ size: 20 } as any}` if you genuinely need the HTML attribute,\n * which is exceedingly rare.\n */\nexport interface InputProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\">,\n VariantProps<typeof inputVariants> {}\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n ({ className, type = \"text\", size, ...props }, ref) => (\n <input ref={ref} type={type} className={cn(inputVariants({ size }), className)} {...props} />\n ),\n);\nInput.displayName = \"Input\";\n\nexport { Input, inputVariants };\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { AgentEvent } from './chunk-E4IRSSHO.js';
|
|
2
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var AgentTimeline = forwardRef(
|
|
7
|
+
({ className, events, collapsible = true, showLine = true, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
8
|
+
"ol",
|
|
9
|
+
{
|
|
10
|
+
ref,
|
|
11
|
+
className: cn(
|
|
12
|
+
"grid gap-1",
|
|
13
|
+
showLine && "relative pl-4 before:absolute before:top-1 before:bottom-1 before:left-[11px] before:w-px before:bg-border/60",
|
|
14
|
+
className
|
|
15
|
+
),
|
|
16
|
+
...props,
|
|
17
|
+
children: events.map((event) => /* @__PURE__ */ jsx("li", { className: "animate-fade-in-up", children: /* @__PURE__ */ jsx(AgentEvent, { event, collapsible }) }, event.id))
|
|
18
|
+
}
|
|
19
|
+
)
|
|
20
|
+
);
|
|
21
|
+
AgentTimeline.displayName = "AgentTimeline";
|
|
22
|
+
|
|
23
|
+
export { AgentTimeline };
|
|
24
|
+
//# sourceMappingURL=chunk-B4CQMQ64.js.map
|
|
25
|
+
//# sourceMappingURL=chunk-B4CQMQ64.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/composites/agent-timeline/agent-timeline.tsx"],"names":[],"mappings":";;;;;AAyBA,IAAM,aAAA,GAAgB,UAAA;AAAA,EACpB,CAAC,EAAE,SAAA,EAAW,MAAA,EAAQ,WAAA,GAAc,IAAA,EAAM,QAAA,GAAW,IAAA,EAAM,GAAG,KAAA,EAAM,EAAG,GAAA,qBACrE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,YAAA;AAAA,QACA,QAAA,IACE,+GAAA;AAAA,QACF;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,yBACV,IAAA,EAAA,EAAkB,SAAA,EAAU,oBAAA,EAC3B,QAAA,kBAAA,GAAA,CAAC,cAAW,KAAA,EAAc,WAAA,EAA0B,CAAA,EAAA,EAD7C,KAAA,CAAM,EAEf,CACD;AAAA;AAAA;AAGP;AACA,aAAA,CAAc,WAAA,GAAc,eAAA","file":"chunk-B4CQMQ64.js","sourcesContent":["import { forwardRef } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { AgentEvent as AgentEventModel } from \"../../../types/agent.js\";\nimport { AgentEvent } from \"../../primitives/agent-event/index.js\";\n\ninterface AgentTimelineProps extends HTMLAttributes<HTMLOListElement> {\n events: AgentEventModel[];\n /**\n * If true, events with `detail` are collapsible.\n */\n collapsible?: boolean;\n /**\n * Renders a vertical line connecting events. Default true.\n */\n showLine?: boolean;\n}\n\n/**\n * AgentTimeline — vertical list of agent events.\n *\n * Visual: optional thin border-left running through the column, with each\n * AgentEvent slightly indented from the line. Events animate in via fade-in-up\n * when first mounted.\n */\nconst AgentTimeline = forwardRef<HTMLOListElement, AgentTimelineProps>(\n ({ className, events, collapsible = true, showLine = true, ...props }, ref) => (\n <ol\n ref={ref}\n className={cn(\n \"grid gap-1\",\n showLine &&\n \"relative pl-4 before:absolute before:top-1 before:bottom-1 before:left-[11px] before:w-px before:bg-border/60\",\n className,\n )}\n {...props}\n >\n {events.map((event) => (\n <li key={event.id} className=\"animate-fade-in-up\">\n <AgentEvent event={event} collapsible={collapsible} />\n </li>\n ))}\n </ol>\n ),\n);\nAgentTimeline.displayName = \"AgentTimeline\";\n\nexport { AgentTimeline };\n"]}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { ChatComposer } from './chunk-F5P5P2SC.js';
|
|
2
|
+
import { MentionMenu } from './chunk-REILH4XF.js';
|
|
3
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
4
|
+
import { useState, useMemo } from 'react';
|
|
5
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var TRIGGER_CHARS = ["/", "@", "#"];
|
|
8
|
+
var TRIGGER_RE = /(^|\s)([/@#])([^\s]*)$/;
|
|
9
|
+
function detectTrigger(value) {
|
|
10
|
+
const match = value.match(TRIGGER_RE);
|
|
11
|
+
if (!match) return null;
|
|
12
|
+
const leading = match[1] ?? "";
|
|
13
|
+
const triggerChar = match[2];
|
|
14
|
+
const query = match[3] ?? "";
|
|
15
|
+
if (!TRIGGER_CHARS.includes(triggerChar)) return null;
|
|
16
|
+
const start = (match.index ?? 0) + leading.length;
|
|
17
|
+
return { trigger: triggerChar, query, start };
|
|
18
|
+
}
|
|
19
|
+
function resolveItems(source, query) {
|
|
20
|
+
if (!source) return [];
|
|
21
|
+
if (typeof source === "function") return source(query);
|
|
22
|
+
if (!query) return source;
|
|
23
|
+
const q = query.toLowerCase();
|
|
24
|
+
return source.filter((item) => {
|
|
25
|
+
const haystack = `${typeof item.label === "string" ? item.label : ""} ${typeof item.description === "string" ? item.description : ""}`.toLowerCase();
|
|
26
|
+
return haystack.includes(q);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function defaultInsertText(item, trigger) {
|
|
30
|
+
const label = typeof item.label === "string" ? item.label : "";
|
|
31
|
+
if (label.startsWith(trigger)) return label;
|
|
32
|
+
return `${trigger}${label}`;
|
|
33
|
+
}
|
|
34
|
+
function AgentComposer({
|
|
35
|
+
value,
|
|
36
|
+
onValueChange,
|
|
37
|
+
commands,
|
|
38
|
+
files,
|
|
39
|
+
memories,
|
|
40
|
+
resolveInsertText = defaultInsertText,
|
|
41
|
+
emptyLabels,
|
|
42
|
+
containerClassName,
|
|
43
|
+
className,
|
|
44
|
+
textareaProps,
|
|
45
|
+
...chatComposerProps
|
|
46
|
+
}) {
|
|
47
|
+
const [dismissedAt, setDismissedAt] = useState(null);
|
|
48
|
+
const detected = useMemo(() => detectTrigger(value), [value]);
|
|
49
|
+
const isDismissed = detected !== null && dismissedAt === detected.start;
|
|
50
|
+
const activeTrigger = isDismissed ? null : detected?.trigger ?? null;
|
|
51
|
+
const query = isDismissed ? "" : detected?.query ?? "";
|
|
52
|
+
const items = useMemo(() => {
|
|
53
|
+
if (!activeTrigger || !detected) return [];
|
|
54
|
+
if (activeTrigger === "/") return resolveItems(commands, query);
|
|
55
|
+
if (activeTrigger === "@") return resolveItems(files, query);
|
|
56
|
+
if (activeTrigger === "#") return resolveItems(memories, query);
|
|
57
|
+
return [];
|
|
58
|
+
}, [activeTrigger, detected, commands, files, memories, query]);
|
|
59
|
+
const handleSelect = (item) => {
|
|
60
|
+
if (!detected) return;
|
|
61
|
+
const before = value.slice(0, detected.start);
|
|
62
|
+
const insert = resolveInsertText(item, detected.trigger);
|
|
63
|
+
onValueChange(`${before}${insert} `);
|
|
64
|
+
setDismissedAt(null);
|
|
65
|
+
};
|
|
66
|
+
const handleClose = () => {
|
|
67
|
+
if (detected) setDismissedAt(detected.start);
|
|
68
|
+
};
|
|
69
|
+
const interceptKeyDown = (e) => {
|
|
70
|
+
if (activeTrigger) {
|
|
71
|
+
if (["ArrowDown", "ArrowUp", "Enter", "Escape"].includes(e.key)) {
|
|
72
|
+
if (e.key === "Enter") e.preventDefault();
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (e.key === "Enter" && !e.shiftKey) {
|
|
77
|
+
e.preventDefault();
|
|
78
|
+
e.currentTarget.form?.requestSubmit();
|
|
79
|
+
}
|
|
80
|
+
textareaProps?.onKeyDown?.(e);
|
|
81
|
+
};
|
|
82
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("relative", containerClassName), children: [
|
|
83
|
+
/* @__PURE__ */ jsx(
|
|
84
|
+
MentionMenu,
|
|
85
|
+
{
|
|
86
|
+
open: !!activeTrigger && items !== null,
|
|
87
|
+
trigger: activeTrigger ?? "/",
|
|
88
|
+
items,
|
|
89
|
+
onSelect: handleSelect,
|
|
90
|
+
onClose: handleClose,
|
|
91
|
+
emptyLabel: activeTrigger ? emptyLabels?.[activeTrigger] : void 0
|
|
92
|
+
}
|
|
93
|
+
),
|
|
94
|
+
/* @__PURE__ */ jsx(
|
|
95
|
+
ChatComposer,
|
|
96
|
+
{
|
|
97
|
+
value,
|
|
98
|
+
onValueChange: (next) => {
|
|
99
|
+
if (!detectTrigger(next)) setDismissedAt(null);
|
|
100
|
+
onValueChange(next);
|
|
101
|
+
},
|
|
102
|
+
className,
|
|
103
|
+
textareaProps: {
|
|
104
|
+
...textareaProps,
|
|
105
|
+
onKeyDown: interceptKeyDown
|
|
106
|
+
},
|
|
107
|
+
...chatComposerProps
|
|
108
|
+
}
|
|
109
|
+
)
|
|
110
|
+
] });
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export { AgentComposer };
|
|
114
|
+
//# sourceMappingURL=chunk-BMRZXT5T.js.map
|
|
115
|
+
//# sourceMappingURL=chunk-BMRZXT5T.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/composites/agent-composer/agent-composer.tsx"],"names":[],"mappings":"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","file":"chunk-BMRZXT5T.js","sourcesContent":["import { useMemo, useState } from \"react\";\nimport type { ComponentProps, KeyboardEvent, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport {\n type MentionItem,\n MentionMenu,\n type MentionTrigger,\n} from \"../../primitives/mention-menu/index.js\";\nimport { ChatComposer } from \"../chat-composer/chat-composer.js\";\n\n/**\n * AgentComposer — ChatComposer + slash-command / @file / #memory triggers.\n *\n * Wraps ChatComposer and watches the value for three trigger characters:\n * `/` → slash commands (`/clear`, `/help`, …)\n * `@` → file references (`@src/components/Foo.tsx`)\n * `#` → memory entries (`#alignment-grid`)\n *\n * Detection is string-based — no textarea ref required. A trigger is active\n * iff the value ends with a token of the form `[\\s|^]([/@#])[^\\s]*` (i.e. a\n * trigger char preceded by start-of-string or whitespace, with no space\n * after).\n *\n * The consumer provides the candidate items per trigger. On selection the\n * trailing token is replaced with the chosen value plus a trailing space.\n */\n\ntype ItemsProvider = (query: string) => MentionItem[];\n\ninterface AgentComposerProps extends ComponentProps<typeof ChatComposer> {\n /** Items shown when `/` is the active trigger. */\n commands?: MentionItem[] | ItemsProvider;\n /** Items shown when `@` is the active trigger. */\n files?: MentionItem[] | ItemsProvider;\n /** Items shown when `#` is the active trigger. */\n memories?: MentionItem[] | ItemsProvider;\n /**\n * What text gets inserted when an item is picked. Defaults to\n * `${trigger}${item.label}` (assumes `label` is a string). Override to\n * insert a token different from the visible label (e.g. include path,\n * id, …).\n */\n resolveInsertText?: (item: MentionItem, trigger: MentionTrigger) => string;\n /** Optional slot for the empty-state copy per trigger. */\n emptyLabels?: Partial<Record<MentionTrigger, ReactNode>>;\n /** Outer wrapper className (the relative positioning anchor for the menu). */\n containerClassName?: string;\n}\n\nconst TRIGGER_CHARS: ReadonlyArray<MentionTrigger> = [\"/\", \"@\", \"#\"];\n\nconst TRIGGER_RE = /(^|\\s)([/@#])([^\\s]*)$/;\n\ninterface DetectedTrigger {\n trigger: MentionTrigger;\n query: string;\n /** Index in the value where the trigger char starts. */\n start: number;\n}\n\nfunction detectTrigger(value: string): DetectedTrigger | null {\n const match = value.match(TRIGGER_RE);\n if (!match) return null;\n const leading = match[1] ?? \"\";\n const triggerChar = match[2] as MentionTrigger;\n const query = match[3] ?? \"\";\n if (!TRIGGER_CHARS.includes(triggerChar)) return null;\n // start = position of the trigger char itself\n const start = (match.index ?? 0) + leading.length;\n return { trigger: triggerChar, query, start };\n}\n\nfunction resolveItems(\n source: MentionItem[] | ItemsProvider | undefined,\n query: string,\n): MentionItem[] {\n if (!source) return [];\n if (typeof source === \"function\") return source(query);\n if (!query) return source;\n const q = query.toLowerCase();\n return source.filter((item) => {\n const haystack = `${typeof item.label === \"string\" ? item.label : \"\"} ${\n typeof item.description === \"string\" ? item.description : \"\"\n }`.toLowerCase();\n return haystack.includes(q);\n });\n}\n\nfunction defaultInsertText(item: MentionItem, trigger: MentionTrigger): string {\n const label = typeof item.label === \"string\" ? item.label : \"\";\n // If the visible label already starts with the trigger char (e.g. \"/clear\"),\n // use it as-is so we don't end up with \"//clear\".\n if (label.startsWith(trigger)) return label;\n return `${trigger}${label}`;\n}\n\nexport function AgentComposer({\n value,\n onValueChange,\n commands,\n files,\n memories,\n resolveInsertText = defaultInsertText,\n emptyLabels,\n containerClassName,\n className,\n textareaProps,\n ...chatComposerProps\n}: AgentComposerProps) {\n // Trigger detection + manual dismiss state.\n // We honour `dismissed` so the user can Esc the menu and keep typing after\n // a trigger char without the menu re-appearing.\n const [dismissedAt, setDismissedAt] = useState<number | null>(null);\n\n const detected = useMemo(() => detectTrigger(value), [value]);\n const isDismissed = detected !== null && dismissedAt === detected.start;\n const activeTrigger = isDismissed ? null : (detected?.trigger ?? null);\n const query = isDismissed ? \"\" : (detected?.query ?? \"\");\n\n const items = useMemo(() => {\n if (!activeTrigger || !detected) return [];\n if (activeTrigger === \"/\") return resolveItems(commands, query);\n if (activeTrigger === \"@\") return resolveItems(files, query);\n if (activeTrigger === \"#\") return resolveItems(memories, query);\n return [];\n }, [activeTrigger, detected, commands, files, memories, query]);\n\n const handleSelect = (item: MentionItem) => {\n if (!detected) return;\n const before = value.slice(0, detected.start);\n const insert = resolveInsertText(item, detected.trigger);\n onValueChange(`${before}${insert} `);\n setDismissedAt(null);\n };\n\n const handleClose = () => {\n if (detected) setDismissedAt(detected.start);\n };\n\n const interceptKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (activeTrigger) {\n // Let MentionMenu's global key handler take Arrow/Enter/Esc.\n if ([\"ArrowDown\", \"ArrowUp\", \"Enter\", \"Escape\"].includes(e.key)) {\n if (e.key === \"Enter\") e.preventDefault(); // also prevent form submit\n return;\n }\n }\n // Mirror ChatComposer's default Enter-to-submit when menu is closed.\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n (e.currentTarget.form as HTMLFormElement | null)?.requestSubmit();\n }\n textareaProps?.onKeyDown?.(e);\n };\n\n return (\n <div className={cn(\"relative\", containerClassName)}>\n <MentionMenu\n open={!!activeTrigger && items !== null}\n trigger={(activeTrigger ?? \"/\") as MentionTrigger}\n items={items}\n onSelect={handleSelect}\n onClose={handleClose}\n emptyLabel={activeTrigger ? emptyLabels?.[activeTrigger] : undefined}\n />\n <ChatComposer\n value={value}\n onValueChange={(next) => {\n // If user clears the trigger token, drop the dismissed marker too.\n if (!detectTrigger(next)) setDismissedAt(null);\n onValueChange(next);\n }}\n className={className}\n textareaProps={{\n ...textareaProps,\n onKeyDown: interceptKeyDown,\n }}\n {...chatComposerProps}\n />\n </div>\n );\n}\n"]}
|