@usetheo/ui 0.9.0-next.0 → 0.11.0-next.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 +215 -0
- package/README.md +22 -21
- package/dist/chunk-2UJROWAG.js +106 -0
- package/dist/chunk-2UJROWAG.js.map +1 -0
- package/dist/chunk-2XPWOUEH.js +68 -0
- package/dist/chunk-2XPWOUEH.js.map +1 -0
- package/dist/chunk-3GHLNCM3.js +42 -0
- package/dist/chunk-3GHLNCM3.js.map +1 -0
- package/dist/chunk-3HOXC25T.js +48 -0
- package/dist/chunk-3HOXC25T.js.map +1 -0
- package/dist/chunk-3QGO5SB3.js +46 -0
- package/dist/chunk-3QGO5SB3.js.map +1 -0
- package/dist/chunk-47QJVWW2.js +85 -0
- package/dist/chunk-47QJVWW2.js.map +1 -0
- package/dist/chunk-4L63UW3I.js +35 -0
- package/dist/chunk-4L63UW3I.js.map +1 -0
- package/dist/chunk-4UUSJJFZ.js +25 -0
- package/dist/chunk-4UUSJJFZ.js.map +1 -0
- package/dist/chunk-4ZBZBRG5.js +127 -0
- package/dist/chunk-4ZBZBRG5.js.map +1 -0
- package/dist/chunk-57NXT3OX.js +92 -0
- package/dist/chunk-57NXT3OX.js.map +1 -0
- package/dist/chunk-5FF5EUZP.js +44 -0
- package/dist/chunk-5FF5EUZP.js.map +1 -0
- package/dist/chunk-5UGQXB2P.js +714 -0
- package/dist/chunk-5UGQXB2P.js.map +1 -0
- package/dist/chunk-62FT22CI.js +85 -0
- package/dist/chunk-62FT22CI.js.map +1 -0
- package/dist/chunk-673R3GSK.js +19 -0
- package/dist/chunk-673R3GSK.js.map +1 -0
- package/dist/chunk-6VINZJBV.js +128 -0
- package/dist/chunk-6VINZJBV.js.map +1 -0
- package/dist/chunk-74NZ5U3E.js +145 -0
- package/dist/chunk-74NZ5U3E.js.map +1 -0
- package/dist/chunk-755NWSNW.js +36 -0
- package/dist/chunk-755NWSNW.js.map +1 -0
- package/dist/chunk-7GLBWWMW.js +70 -0
- package/dist/chunk-7GLBWWMW.js.map +1 -0
- package/dist/chunk-7RXYW5VM.js +88 -0
- package/dist/chunk-7RXYW5VM.js.map +1 -0
- package/dist/chunk-AC4MGCXI.js +92 -0
- package/dist/chunk-AC4MGCXI.js.map +1 -0
- package/dist/chunk-AEVSVDT6.js +67 -0
- package/dist/chunk-AEVSVDT6.js.map +1 -0
- package/dist/chunk-AODIMN2N.js +68 -0
- package/dist/chunk-AODIMN2N.js.map +1 -0
- package/dist/chunk-ATHOPBCA.js +61 -0
- package/dist/chunk-ATHOPBCA.js.map +1 -0
- package/dist/chunk-AXKBNRZW.js +173 -0
- package/dist/chunk-AXKBNRZW.js.map +1 -0
- package/dist/chunk-B75MEYNR.js +106 -0
- package/dist/chunk-B75MEYNR.js.map +1 -0
- package/dist/chunk-BGKA6DI6.js +34 -0
- package/dist/chunk-BGKA6DI6.js.map +1 -0
- package/dist/chunk-BNQAJGEN.js +88 -0
- package/dist/chunk-BNQAJGEN.js.map +1 -0
- package/dist/chunk-BP2SETUC.js +101 -0
- package/dist/chunk-BP2SETUC.js.map +1 -0
- package/dist/chunk-BPUQWMBD.js +79 -0
- package/dist/chunk-BPUQWMBD.js.map +1 -0
- package/dist/chunk-BVDASR3Y.js +74 -0
- package/dist/chunk-BVDASR3Y.js.map +1 -0
- package/dist/chunk-BX7A5GUV.js +78 -0
- package/dist/chunk-BX7A5GUV.js.map +1 -0
- package/dist/chunk-CDA6RYOX.js +115 -0
- package/dist/chunk-CDA6RYOX.js.map +1 -0
- package/dist/chunk-CG7O3A42.js +80 -0
- package/dist/chunk-CG7O3A42.js.map +1 -0
- package/dist/chunk-CIYGNPKT.js +76 -0
- package/dist/chunk-CIYGNPKT.js.map +1 -0
- package/dist/chunk-CKXY4FTV.js +59 -0
- package/dist/chunk-CKXY4FTV.js.map +1 -0
- package/dist/chunk-CVOKZITR.js +82 -0
- package/dist/chunk-CVOKZITR.js.map +1 -0
- package/dist/chunk-CWFMFKDI.js +82 -0
- package/dist/chunk-CWFMFKDI.js.map +1 -0
- package/dist/chunk-CWVKSV7S.js +124 -0
- package/dist/chunk-CWVKSV7S.js.map +1 -0
- package/dist/chunk-CYOLRWOX.js +63 -0
- package/dist/chunk-CYOLRWOX.js.map +1 -0
- package/dist/chunk-D23LRJT6.js +116 -0
- package/dist/chunk-D23LRJT6.js.map +1 -0
- package/dist/chunk-DFADMEJK.js +127 -0
- package/dist/chunk-DFADMEJK.js.map +1 -0
- package/dist/chunk-DKQAHZG2.js +83 -0
- package/dist/chunk-DKQAHZG2.js.map +1 -0
- package/dist/chunk-E5A7HN6H.js +32 -0
- package/dist/chunk-E5A7HN6H.js.map +1 -0
- package/dist/chunk-EI63GTN7.js +57 -0
- package/dist/chunk-EI63GTN7.js.map +1 -0
- package/dist/chunk-EP25QJ4N.js +146 -0
- package/dist/chunk-EP25QJ4N.js.map +1 -0
- package/dist/chunk-ET44426Q.js +80 -0
- package/dist/chunk-ET44426Q.js.map +1 -0
- package/dist/chunk-ETEIDY34.js +67 -0
- package/dist/chunk-ETEIDY34.js.map +1 -0
- package/dist/chunk-EU55O4P7.js +76 -0
- package/dist/chunk-EU55O4P7.js.map +1 -0
- package/dist/chunk-F436537E.js +104 -0
- package/dist/chunk-F436537E.js.map +1 -0
- package/dist/chunk-FLBTGNQI.js +86 -0
- package/dist/chunk-FLBTGNQI.js.map +1 -0
- package/dist/chunk-FUT45NFW.js +46 -0
- package/dist/chunk-FUT45NFW.js.map +1 -0
- package/dist/chunk-G3LWNTVZ.js +51 -0
- package/dist/chunk-G3LWNTVZ.js.map +1 -0
- package/dist/chunk-GBJB5WLT.js +58 -0
- package/dist/chunk-GBJB5WLT.js.map +1 -0
- package/dist/chunk-GIEPEFRX.js +110 -0
- package/dist/chunk-GIEPEFRX.js.map +1 -0
- package/dist/chunk-GSO7MISR.js +58 -0
- package/dist/chunk-GSO7MISR.js.map +1 -0
- package/dist/chunk-GUQFYUIC.js +61 -0
- package/dist/chunk-GUQFYUIC.js.map +1 -0
- package/dist/chunk-H3VJMFJQ.js +35 -0
- package/dist/chunk-H3VJMFJQ.js.map +1 -0
- package/dist/chunk-HG4WEERE.js +26 -0
- package/dist/chunk-HG4WEERE.js.map +1 -0
- package/dist/chunk-HGPBGLNP.js +51 -0
- package/dist/chunk-HGPBGLNP.js.map +1 -0
- package/dist/chunk-HQFTW7SF.js +141 -0
- package/dist/chunk-HQFTW7SF.js.map +1 -0
- package/dist/chunk-I7WYM63C.js +170 -0
- package/dist/chunk-I7WYM63C.js.map +1 -0
- package/dist/chunk-IPEYGWA7.js +186 -0
- package/dist/chunk-IPEYGWA7.js.map +1 -0
- package/dist/chunk-IWSLOBYG.js +199 -0
- package/dist/chunk-IWSLOBYG.js.map +1 -0
- package/dist/chunk-JQXLPVWP.js +74 -0
- package/dist/chunk-JQXLPVWP.js.map +1 -0
- package/dist/chunk-K5ARID4S.js +26 -0
- package/dist/chunk-K5ARID4S.js.map +1 -0
- package/dist/chunk-K6RTLPIJ.js +41 -0
- package/dist/chunk-K6RTLPIJ.js.map +1 -0
- package/dist/chunk-KQNKKV2C.js +56 -0
- package/dist/chunk-KQNKKV2C.js.map +1 -0
- package/dist/chunk-KRN4NE4U.js +155 -0
- package/dist/chunk-KRN4NE4U.js.map +1 -0
- package/dist/chunk-L2BI762I.js +82 -0
- package/dist/chunk-L2BI762I.js.map +1 -0
- package/dist/chunk-LEEH63B2.js +56 -0
- package/dist/chunk-LEEH63B2.js.map +1 -0
- package/dist/chunk-LHRWVM3G.js +42 -0
- package/dist/chunk-LHRWVM3G.js.map +1 -0
- package/dist/chunk-LIGWMGXM.js +117 -0
- package/dist/chunk-LIGWMGXM.js.map +1 -0
- package/dist/chunk-LKYSX3QF.js +104 -0
- package/dist/chunk-LKYSX3QF.js.map +1 -0
- package/dist/chunk-MCIFB6VS.js +54 -0
- package/dist/chunk-MCIFB6VS.js.map +1 -0
- package/dist/chunk-MI5CXMZU.js +171 -0
- package/dist/chunk-MI5CXMZU.js.map +1 -0
- package/dist/chunk-NQZYY4LR.js +84 -0
- package/dist/chunk-NQZYY4LR.js.map +1 -0
- package/dist/chunk-O23LKHUR.js +66 -0
- package/dist/chunk-O23LKHUR.js.map +1 -0
- package/dist/chunk-PASI2U2R.js +23 -0
- package/dist/chunk-PASI2U2R.js.map +1 -0
- package/dist/chunk-PPH5NTHV.js +34 -0
- package/dist/chunk-PPH5NTHV.js.map +1 -0
- package/dist/chunk-PR6OZF6D.js +28 -0
- package/dist/chunk-PR6OZF6D.js.map +1 -0
- package/dist/chunk-PWXOXPFT.js +142 -0
- package/dist/chunk-PWXOXPFT.js.map +1 -0
- package/dist/chunk-QB6BNHO3.js +112 -0
- package/dist/chunk-QB6BNHO3.js.map +1 -0
- package/dist/chunk-QJGGTIUN.js +110 -0
- package/dist/chunk-QJGGTIUN.js.map +1 -0
- package/dist/chunk-QSOIJ6J3.js +91 -0
- package/dist/chunk-QSOIJ6J3.js.map +1 -0
- package/dist/chunk-R2PAGRDP.js +152 -0
- package/dist/chunk-R2PAGRDP.js.map +1 -0
- package/dist/chunk-R63ZKLQM.js +45 -0
- package/dist/chunk-R63ZKLQM.js.map +1 -0
- package/dist/chunk-RTYYJPPE.js +77 -0
- package/dist/chunk-RTYYJPPE.js.map +1 -0
- package/dist/chunk-RVOBP7PO.js +116 -0
- package/dist/chunk-RVOBP7PO.js.map +1 -0
- package/dist/chunk-SF6R5VMQ.js +97 -0
- package/dist/chunk-SF6R5VMQ.js.map +1 -0
- package/dist/chunk-SP4CP5HY.js +57 -0
- package/dist/chunk-SP4CP5HY.js.map +1 -0
- package/dist/chunk-SWJ4EUOI.js +30 -0
- package/dist/chunk-SWJ4EUOI.js.map +1 -0
- package/dist/chunk-TK24HQJJ.js +128 -0
- package/dist/chunk-TK24HQJJ.js.map +1 -0
- package/dist/chunk-TNBJ36XJ.js +156 -0
- package/dist/chunk-TNBJ36XJ.js.map +1 -0
- package/dist/chunk-TO3UAT6O.js +221 -0
- package/dist/chunk-TO3UAT6O.js.map +1 -0
- package/dist/chunk-UAYOOTRR.js +77 -0
- package/dist/chunk-UAYOOTRR.js.map +1 -0
- package/dist/chunk-UDTAMHXW.js +55 -0
- package/dist/chunk-UDTAMHXW.js.map +1 -0
- package/dist/chunk-UGKI466V.js +12 -0
- package/dist/chunk-UGKI466V.js.map +1 -0
- package/dist/chunk-UOXU7NDY.js +120 -0
- package/dist/chunk-UOXU7NDY.js.map +1 -0
- package/dist/chunk-V7OOTVK3.js +106 -0
- package/dist/chunk-V7OOTVK3.js.map +1 -0
- package/dist/chunk-VI5M7KJ2.js +1022 -0
- package/dist/chunk-VI5M7KJ2.js.map +1 -0
- package/dist/chunk-VM4RMQQN.js +11 -0
- package/dist/chunk-VM4RMQQN.js.map +1 -0
- package/dist/chunk-VMMATOPE.js +64 -0
- package/dist/chunk-VMMATOPE.js.map +1 -0
- package/dist/chunk-W2PVSIW3.js +89 -0
- package/dist/chunk-W2PVSIW3.js.map +1 -0
- package/dist/chunk-W3DUDZDU.js +88 -0
- package/dist/chunk-W3DUDZDU.js.map +1 -0
- package/dist/chunk-WKEUU2FU.js +114 -0
- package/dist/chunk-WKEUU2FU.js.map +1 -0
- package/dist/chunk-WKLW7RC6.js +28 -0
- package/dist/chunk-WKLW7RC6.js.map +1 -0
- package/dist/chunk-WSJGZNUH.js +111 -0
- package/dist/chunk-WSJGZNUH.js.map +1 -0
- package/dist/chunk-WVPDQMC2.js +144 -0
- package/dist/chunk-WVPDQMC2.js.map +1 -0
- package/dist/chunk-WWNH5ENT.js +43 -0
- package/dist/chunk-WWNH5ENT.js.map +1 -0
- package/dist/chunk-X5L62PXY.js +112 -0
- package/dist/chunk-X5L62PXY.js.map +1 -0
- package/dist/chunk-XGCV5E6W.js +133 -0
- package/dist/chunk-XGCV5E6W.js.map +1 -0
- package/dist/chunk-XRKIEL5M.js +72 -0
- package/dist/chunk-XRKIEL5M.js.map +1 -0
- package/dist/chunk-XUJYEADU.js +80 -0
- package/dist/chunk-XUJYEADU.js.map +1 -0
- package/dist/chunk-XVYNSIQC.js +116 -0
- package/dist/chunk-XVYNSIQC.js.map +1 -0
- package/dist/chunk-XWTISHXO.js +54 -0
- package/dist/chunk-XWTISHXO.js.map +1 -0
- package/dist/chunk-YOGHS4UU.js +202 -0
- package/dist/chunk-YOGHS4UU.js.map +1 -0
- package/dist/chunk-YRSKXEOD.js +135 -0
- package/dist/chunk-YRSKXEOD.js.map +1 -0
- package/dist/chunk-ZALLCR7X.js +108 -0
- package/dist/chunk-ZALLCR7X.js.map +1 -0
- package/dist/chunk-ZDAOHMCW.js +46 -0
- package/dist/chunk-ZDAOHMCW.js.map +1 -0
- package/dist/chunk-ZESICCKK.js +37 -0
- package/dist/chunk-ZESICCKK.js.map +1 -0
- package/dist/chunk-ZIKFOD6N.js +87 -0
- package/dist/chunk-ZIKFOD6N.js.map +1 -0
- package/dist/chunk-ZJRWCQEN.js +76 -0
- package/dist/chunk-ZJRWCQEN.js.map +1 -0
- package/dist/chunk-ZSRJCIWF.js +24 -0
- package/dist/chunk-ZSRJCIWF.js.map +1 -0
- package/dist/chunk-ZXPDS6DH.js +3 -0
- package/dist/chunk-ZXPDS6DH.js.map +1 -0
- package/dist/components.css +1 -1
- 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/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/index.d.ts +281 -12
- package/dist/index.js +129 -9487
- package/dist/index.js.map +1 -1
- 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/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/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/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/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/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/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/slide/index.js +1 -712
- package/dist/slide/index.js.map +1 -1
- package/dist/slide-deck/index.js +2 -688
- package/dist/slide-deck/index.js.map +1 -1
- package/llms.txt +8 -6
- package/package.json +177 -157
- package/registry/index.json +30 -0
- package/registry/r/action-bar.json +22 -0
- package/registry/r/data-table.json +27 -0
- package/registry/r/dropdown-menu.json +23 -0
- package/registry/r/page-shell.json +25 -0
- package/registry/r/pin-input.json +20 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { Input } from './chunk-H3VJMFJQ.js';
|
|
2
|
+
import { Dialog } from './chunk-2UJROWAG.js';
|
|
3
|
+
import { Button } from './chunk-57NXT3OX.js';
|
|
4
|
+
import { Loader2 } from 'lucide-react';
|
|
5
|
+
import { forwardRef, useState, useRef, useEffect } from 'react';
|
|
6
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
var ConfirmDialog = forwardRef(
|
|
9
|
+
({
|
|
10
|
+
open,
|
|
11
|
+
onOpenChange,
|
|
12
|
+
title,
|
|
13
|
+
description,
|
|
14
|
+
confirmLabel = "Confirm",
|
|
15
|
+
cancelLabel = "Cancel",
|
|
16
|
+
intent = "default",
|
|
17
|
+
confirmationPhrase,
|
|
18
|
+
onConfirm,
|
|
19
|
+
loading: externalLoading
|
|
20
|
+
}, ref) => {
|
|
21
|
+
const [phraseInput, setPhraseInput] = useState("");
|
|
22
|
+
const [internalLoading, setInternalLoading] = useState(false);
|
|
23
|
+
const cancelRef = useRef(null);
|
|
24
|
+
const phraseRequired = !!confirmationPhrase;
|
|
25
|
+
const phraseMatched = phraseRequired ? phraseInput === confirmationPhrase : true;
|
|
26
|
+
const showLoading = externalLoading === true || internalLoading;
|
|
27
|
+
const canConfirm = phraseMatched && !showLoading;
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
if (!open) setPhraseInput("");
|
|
30
|
+
}, [open]);
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
if (open) {
|
|
33
|
+
const id = window.setTimeout(() => cancelRef.current?.focus(), 0);
|
|
34
|
+
return () => window.clearTimeout(id);
|
|
35
|
+
}
|
|
36
|
+
}, [open]);
|
|
37
|
+
async function handleConfirm() {
|
|
38
|
+
if (!canConfirm) return;
|
|
39
|
+
setInternalLoading(true);
|
|
40
|
+
try {
|
|
41
|
+
await onConfirm();
|
|
42
|
+
onOpenChange(false);
|
|
43
|
+
} catch {
|
|
44
|
+
} finally {
|
|
45
|
+
setInternalLoading(false);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function handleInputKeyDown(e) {
|
|
49
|
+
if (e.key === "Enter" && canConfirm) {
|
|
50
|
+
e.preventDefault();
|
|
51
|
+
void handleConfirm();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return /* @__PURE__ */ jsx(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs(Dialog.Content, { ref, children: [
|
|
55
|
+
/* @__PURE__ */ jsxs(Dialog.Header, { children: [
|
|
56
|
+
/* @__PURE__ */ jsx(Dialog.Title, { children: title }),
|
|
57
|
+
/* @__PURE__ */ jsx(Dialog.Description, { children: description })
|
|
58
|
+
] }),
|
|
59
|
+
phraseRequired ? /* @__PURE__ */ jsxs(Dialog.Body, { children: [
|
|
60
|
+
/* @__PURE__ */ jsxs("p", { className: "mb-2 text-body-sm text-muted-foreground", children: [
|
|
61
|
+
"Type",
|
|
62
|
+
" ",
|
|
63
|
+
/* @__PURE__ */ jsx("code", { className: "rounded bg-muted px-1 py-0.5 font-mono text-foreground", children: confirmationPhrase }),
|
|
64
|
+
" ",
|
|
65
|
+
"to confirm"
|
|
66
|
+
] }),
|
|
67
|
+
/* @__PURE__ */ jsx(
|
|
68
|
+
Input,
|
|
69
|
+
{
|
|
70
|
+
value: phraseInput,
|
|
71
|
+
onChange: (e) => setPhraseInput(e.target.value),
|
|
72
|
+
onKeyDown: handleInputKeyDown,
|
|
73
|
+
autoComplete: "off",
|
|
74
|
+
"aria-label": "Confirmation phrase"
|
|
75
|
+
}
|
|
76
|
+
)
|
|
77
|
+
] }) : null,
|
|
78
|
+
/* @__PURE__ */ jsxs(Dialog.Footer, { children: [
|
|
79
|
+
/* @__PURE__ */ jsx(
|
|
80
|
+
Button,
|
|
81
|
+
{
|
|
82
|
+
ref: cancelRef,
|
|
83
|
+
variant: "secondary",
|
|
84
|
+
onClick: () => onOpenChange(false),
|
|
85
|
+
disabled: showLoading,
|
|
86
|
+
children: cancelLabel
|
|
87
|
+
}
|
|
88
|
+
),
|
|
89
|
+
/* @__PURE__ */ jsxs(
|
|
90
|
+
Button,
|
|
91
|
+
{
|
|
92
|
+
variant: intent === "destructive" ? "destructive" : "primary",
|
|
93
|
+
onClick: () => void handleConfirm(),
|
|
94
|
+
disabled: !canConfirm,
|
|
95
|
+
"data-confirm": true,
|
|
96
|
+
children: [
|
|
97
|
+
showLoading ? /* @__PURE__ */ jsx(Loader2, { "aria-hidden": "true", className: "size-4 animate-spin" }) : null,
|
|
98
|
+
confirmLabel
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
)
|
|
102
|
+
] })
|
|
103
|
+
] }) });
|
|
104
|
+
}
|
|
105
|
+
);
|
|
106
|
+
ConfirmDialog.displayName = "ConfirmDialog";
|
|
107
|
+
|
|
108
|
+
export { ConfirmDialog };
|
|
109
|
+
//# sourceMappingURL=chunk-GIEPEFRX.js.map
|
|
110
|
+
//# sourceMappingURL=chunk-GIEPEFRX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/composites/confirm-dialog/confirm-dialog.tsx"],"names":[],"mappings":"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","file":"chunk-GIEPEFRX.js","sourcesContent":["import { Loader2 } from \"lucide-react\";\nimport { forwardRef, useEffect, useRef, useState } from \"react\";\nimport type { KeyboardEvent, ReactNode } from \"react\";\nimport { Button } from \"../../primitives/button/index.js\";\nimport { Dialog } from \"../../primitives/dialog/index.js\";\nimport { Input } from \"../../primitives/input/index.js\";\n\n/**\n * ConfirmDialog — controlled confirmation modal built on `Dialog`.\n *\n * Focuses Cancel on open (deliberate — NOT the destructive button).\n * `intent=\"destructive\"` styles the confirm button with the destructive\n * variant. `confirmationPhrase` enables typed-confirmation guard:\n * the confirm button is disabled until the input value matches the\n * phrase exactly (case-sensitive). An empty string phrase is treated\n * as \"no phrase required\" (`!!confirmationPhrase`). Pressing Enter in\n * the input triggers confirm when `canConfirm` is true.\n *\n * `onConfirm` can be async. While the returned promise is pending,\n * both buttons are disabled and a `Loader2` spinner appears. On\n * resolve, the dialog closes via `onOpenChange(false)`. On reject,\n * the dialog stays open so the consumer can show their own error.\n *\n * @example\n * <ConfirmDialog\n * open={open} onOpenChange={setOpen}\n * title=\"Delete project\"\n * description=\"This cannot be undone.\"\n * intent=\"destructive\"\n * confirmationPhrase=\"my-project\"\n * onConfirm={async () => api.deleteProject(id)}\n * />\n */\nexport interface ConfirmDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: ReactNode;\n description: ReactNode;\n confirmLabel?: ReactNode;\n cancelLabel?: ReactNode;\n intent?: \"default\" | \"destructive\";\n confirmationPhrase?: string;\n onConfirm: () => void | Promise<void>;\n loading?: boolean;\n}\n\nconst ConfirmDialog = forwardRef<HTMLDivElement, ConfirmDialogProps>(\n (\n {\n open,\n onOpenChange,\n title,\n description,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n intent = \"default\",\n confirmationPhrase,\n onConfirm,\n loading: externalLoading,\n },\n ref,\n ) => {\n const [phraseInput, setPhraseInput] = useState(\"\");\n const [internalLoading, setInternalLoading] = useState(false);\n const cancelRef = useRef<HTMLButtonElement | null>(null);\n\n const phraseRequired = !!confirmationPhrase;\n const phraseMatched = phraseRequired ? phraseInput === confirmationPhrase : true;\n const showLoading = externalLoading === true || internalLoading;\n const canConfirm = phraseMatched && !showLoading;\n\n // Reset phrase input whenever the dialog closes.\n useEffect(() => {\n if (!open) setPhraseInput(\"\");\n }, [open]);\n\n // Auto-focus Cancel on open (NOT confirm — destructive safety).\n useEffect(() => {\n if (open) {\n const id = window.setTimeout(() => cancelRef.current?.focus(), 0);\n return () => window.clearTimeout(id);\n }\n }, [open]);\n\n async function handleConfirm() {\n if (!canConfirm) return;\n setInternalLoading(true);\n try {\n await onConfirm();\n onOpenChange(false);\n } catch {\n // Stay open; consumer surfaces error.\n } finally {\n setInternalLoading(false);\n }\n }\n\n function handleInputKeyDown(e: KeyboardEvent<HTMLInputElement>) {\n if (e.key === \"Enter\" && canConfirm) {\n e.preventDefault();\n void handleConfirm();\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <Dialog.Content ref={ref}>\n <Dialog.Header>\n <Dialog.Title>{title}</Dialog.Title>\n <Dialog.Description>{description}</Dialog.Description>\n </Dialog.Header>\n {phraseRequired ? (\n <Dialog.Body>\n <p className=\"mb-2 text-body-sm text-muted-foreground\">\n Type{\" \"}\n <code className=\"rounded bg-muted px-1 py-0.5 font-mono text-foreground\">\n {confirmationPhrase}\n </code>{\" \"}\n to confirm\n </p>\n <Input\n value={phraseInput}\n onChange={(e) => setPhraseInput(e.target.value)}\n onKeyDown={handleInputKeyDown}\n autoComplete=\"off\"\n aria-label=\"Confirmation phrase\"\n />\n </Dialog.Body>\n ) : null}\n <Dialog.Footer>\n <Button\n ref={cancelRef}\n variant=\"secondary\"\n onClick={() => onOpenChange(false)}\n disabled={showLoading}\n >\n {cancelLabel}\n </Button>\n <Button\n variant={intent === \"destructive\" ? \"destructive\" : \"primary\"}\n onClick={() => void handleConfirm()}\n disabled={!canConfirm}\n data-confirm\n >\n {showLoading ? <Loader2 aria-hidden=\"true\" className=\"size-4 animate-spin\" /> : null}\n {confirmLabel}\n </Button>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog>\n );\n },\n);\nConfirmDialog.displayName = \"ConfirmDialog\";\n\nexport { ConfirmDialog };\n"]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { cn } from './chunk-ZSRJCIWF.js';
|
|
2
|
+
import { ArrowRight } from 'lucide-react';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var TONE_CLASS = {
|
|
7
|
+
primary: "bg-primary text-primary-foreground",
|
|
8
|
+
accent: "bg-accent text-accent-foreground",
|
|
9
|
+
success: "bg-success text-success-foreground",
|
|
10
|
+
warning: "bg-warning text-warning-foreground",
|
|
11
|
+
info: "bg-info text-info-foreground",
|
|
12
|
+
muted: "bg-muted text-foreground"
|
|
13
|
+
};
|
|
14
|
+
function Avatar({ party }) {
|
|
15
|
+
const inits = party.initials ?? party.name.slice(0, 2).toUpperCase();
|
|
16
|
+
return /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-2", children: [
|
|
17
|
+
/* @__PURE__ */ jsx(
|
|
18
|
+
"span",
|
|
19
|
+
{
|
|
20
|
+
className: cn(
|
|
21
|
+
"grid size-7 place-items-center rounded-full font-bold font-mono text-label",
|
|
22
|
+
TONE_CLASS[party.tone ?? "primary"]
|
|
23
|
+
),
|
|
24
|
+
"aria-hidden": "true",
|
|
25
|
+
children: inits
|
|
26
|
+
}
|
|
27
|
+
),
|
|
28
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium font-mono text-code-sm text-foreground", children: party.name })
|
|
29
|
+
] });
|
|
30
|
+
}
|
|
31
|
+
var AgentHandoff = forwardRef(
|
|
32
|
+
({ className, from, to, reason, footer, ...props }, ref) => /* @__PURE__ */ jsxs(
|
|
33
|
+
"article",
|
|
34
|
+
{
|
|
35
|
+
ref,
|
|
36
|
+
className: cn(
|
|
37
|
+
"grid gap-2 rounded-lg border border-primary/30 border-dashed bg-primary/5 px-4 py-3",
|
|
38
|
+
className
|
|
39
|
+
),
|
|
40
|
+
...props,
|
|
41
|
+
children: [
|
|
42
|
+
/* @__PURE__ */ jsxs("header", { className: "flex items-center gap-2", children: [
|
|
43
|
+
/* @__PURE__ */ jsx(Avatar, { party: from }),
|
|
44
|
+
/* @__PURE__ */ jsx(ArrowRight, { className: "size-4 text-primary", "aria-hidden": "true" }),
|
|
45
|
+
/* @__PURE__ */ jsx(Avatar, { party: to }),
|
|
46
|
+
/* @__PURE__ */ jsx("span", { className: "ml-auto font-mono text-label-caps text-muted-foreground uppercase tracking-wider", children: "handoff" })
|
|
47
|
+
] }),
|
|
48
|
+
/* @__PURE__ */ jsx("p", { className: "text-body-sm text-foreground", children: reason }),
|
|
49
|
+
footer ? /* @__PURE__ */ jsx("p", { className: "font-mono text-label text-muted-foreground", children: footer }) : null
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
)
|
|
53
|
+
);
|
|
54
|
+
AgentHandoff.displayName = "AgentHandoff";
|
|
55
|
+
|
|
56
|
+
export { AgentHandoff };
|
|
57
|
+
//# sourceMappingURL=chunk-GSO7MISR.js.map
|
|
58
|
+
//# sourceMappingURL=chunk-GSO7MISR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/agent-handoff/agent-handoff.tsx"],"names":[],"mappings":";;;;;AAuBA,IAAM,UAAA,GAAgE;AAAA,EACpE,OAAA,EAAS,oCAAA;AAAA,EACT,MAAA,EAAQ,kCAAA;AAAA,EACR,OAAA,EAAS,oCAAA;AAAA,EACT,OAAA,EAAS,oCAAA;AAAA,EACT,IAAA,EAAM,8BAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAEA,SAAS,MAAA,CAAO,EAAE,KAAA,EAAM,EAA4B;AAClD,EAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,IAAY,KAAA,CAAM,KAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,WAAA,EAAY;AACnE,EAAA,uBACE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAAA,EACd,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA;AAAA,UACT,4EAAA;AAAA,UACA,UAAA,CAAW,KAAA,CAAM,IAAA,IAAQ,SAAS;AAAA,SACpC;AAAA,QACA,aAAA,EAAY,MAAA;AAAA,QAEX,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,oBACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oDAAA,EAAsD,gBAAM,IAAA,EAAK;AAAA,GAAA,EACnF,CAAA;AAEJ;AAOA,IAAM,YAAA,GAAe,UAAA;AAAA,EACnB,CAAC,EAAE,SAAA,EAAW,IAAA,EAAM,EAAA,EAAI,QAAQ,MAAA,EAAQ,GAAG,KAAA,EAAM,EAAG,GAAA,qBAClD,IAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,qFAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,QAAA,EAAA,EAAO,WAAU,yBAAA,EAChB,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,MAAA,EAAA,EAAO,OAAO,IAAA,EAAM,CAAA;AAAA,0BACrB,GAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,qBAAA,EAAsB,eAAY,MAAA,EAAO,CAAA;AAAA,0BAC/D,GAAA,CAAC,MAAA,EAAA,EAAO,KAAA,EAAO,EAAA,EAAI,CAAA;AAAA,0BACnB,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kFAAA,EAAmF,QAAA,EAAA,SAAA,EAEnG;AAAA,SAAA,EACF,CAAA;AAAA,wBACA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAAA,EAAgC,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,QACnD,yBAAS,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4CAAA,EAA8C,kBAAO,CAAA,GAAO;AAAA;AAAA;AAAA;AAGzF;AACA,YAAA,CAAa,WAAA,GAAc,cAAA","file":"chunk-GSO7MISR.js","sourcesContent":["import { ArrowRight } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\nexport interface HandoffParty {\n /** Display name, e.g. \"planner\". */\n name: string;\n /** Optional avatar initials (max 2 chars). */\n initials?: string;\n /** Identity tone matching AgentProfile. */\n tone?: \"primary\" | \"accent\" | \"success\" | \"warning\" | \"info\" | \"muted\";\n}\n\ninterface AgentHandoffProps extends HTMLAttributes<HTMLElement> {\n from: HandoffParty;\n to: HandoffParty;\n /** What is being handed off — short reason / payload preview. */\n reason: ReactNode;\n /** Optional metadata footer (e.g. timestamp, token budget). */\n footer?: ReactNode;\n}\n\nconst TONE_CLASS: Record<NonNullable<HandoffParty[\"tone\"]>, string> = {\n primary: \"bg-primary text-primary-foreground\",\n accent: \"bg-accent text-accent-foreground\",\n success: \"bg-success text-success-foreground\",\n warning: \"bg-warning text-warning-foreground\",\n info: \"bg-info text-info-foreground\",\n muted: \"bg-muted text-foreground\",\n};\n\nfunction Avatar({ party }: { party: HandoffParty }) {\n const inits = party.initials ?? party.name.slice(0, 2).toUpperCase();\n return (\n <span className=\"inline-flex items-center gap-2\">\n <span\n className={cn(\n \"grid size-7 place-items-center rounded-full font-bold font-mono text-label\",\n TONE_CLASS[party.tone ?? \"primary\"],\n )}\n aria-hidden=\"true\"\n >\n {inits}\n </span>\n <span className=\"font-medium font-mono text-code-sm text-foreground\">{party.name}</span>\n </span>\n );\n}\n\n/**\n * AgentHandoff — visual marker of one agent delegating to another. Pairs\n * with AgentProfile for the identity tones; place it in the timeline so the\n * user sees the baton being passed.\n */\nconst AgentHandoff = forwardRef<HTMLElement, AgentHandoffProps>(\n ({ className, from, to, reason, footer, ...props }, ref) => (\n <article\n ref={ref}\n className={cn(\n \"grid gap-2 rounded-lg border border-primary/30 border-dashed bg-primary/5 px-4 py-3\",\n className,\n )}\n {...props}\n >\n <header className=\"flex items-center gap-2\">\n <Avatar party={from} />\n <ArrowRight className=\"size-4 text-primary\" aria-hidden=\"true\" />\n <Avatar party={to} />\n <span className=\"ml-auto font-mono text-label-caps text-muted-foreground uppercase tracking-wider\">\n handoff\n </span>\n </header>\n <p className=\"text-body-sm text-foreground\">{reason}</p>\n {footer ? <p className=\"font-mono text-label text-muted-foreground\">{footer}</p> : null}\n </article>\n ),\n);\nAgentHandoff.displayName = \"AgentHandoff\";\n\nexport { AgentHandoff };\n"]}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { cn } from './chunk-ZSRJCIWF.js';
|
|
2
|
+
import { Bot, Terminal, Loader2, CheckCircle2 } from 'lucide-react';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var sourceIcon = {
|
|
7
|
+
agent: Bot,
|
|
8
|
+
bash: Terminal,
|
|
9
|
+
tool: Bot
|
|
10
|
+
};
|
|
11
|
+
var sourceLabel = {
|
|
12
|
+
agent: "Agent",
|
|
13
|
+
bash: "Bash",
|
|
14
|
+
tool: "Tool"
|
|
15
|
+
};
|
|
16
|
+
var RunningTasksPanel = forwardRef(
|
|
17
|
+
({ className, tasks, ...props }, ref) => {
|
|
18
|
+
const running = tasks.filter((t) => t.status === "running");
|
|
19
|
+
const completed = tasks.filter((t) => t.status !== "running");
|
|
20
|
+
return /* @__PURE__ */ jsxs("section", { ref, className: cn("rounded-xl border bg-card p-4", className), ...props, children: [
|
|
21
|
+
/* @__PURE__ */ jsx(Group, { title: "Running", empty: "Nothing running", items: running }),
|
|
22
|
+
completed.length > 0 ? /* @__PURE__ */ jsx("div", { className: "mt-4", children: /* @__PURE__ */ jsx(Group, { title: "Completed", empty: "\u2014", items: completed }) }) : null
|
|
23
|
+
] });
|
|
24
|
+
}
|
|
25
|
+
);
|
|
26
|
+
RunningTasksPanel.displayName = "RunningTasksPanel";
|
|
27
|
+
function Group({
|
|
28
|
+
title,
|
|
29
|
+
empty,
|
|
30
|
+
items
|
|
31
|
+
}) {
|
|
32
|
+
return /* @__PURE__ */ jsxs("div", { children: [
|
|
33
|
+
/* @__PURE__ */ jsx("h4", { className: "mb-2 font-sans text-label-caps text-muted-foreground uppercase tracking-wider", children: title }),
|
|
34
|
+
items.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-body-sm text-muted-foreground", children: empty }) : /* @__PURE__ */ jsx("ul", { className: "grid gap-1", children: items.map((task) => {
|
|
35
|
+
const SourceIcon = sourceIcon[task.source];
|
|
36
|
+
return /* @__PURE__ */ jsxs(
|
|
37
|
+
"li",
|
|
38
|
+
{
|
|
39
|
+
className: "flex items-center gap-2 rounded-md px-2 py-1.5 text-body-sm",
|
|
40
|
+
children: [
|
|
41
|
+
task.status === "running" ? /* @__PURE__ */ jsx(Loader2, { className: "size-3.5 animate-spin text-primary", "aria-label": "running" }) : task.status === "completed" ? /* @__PURE__ */ jsx(CheckCircle2, { className: "size-3.5 text-success", "aria-label": "completed" }) : /* @__PURE__ */ jsx("span", { className: "size-2 rounded-full bg-destructive", "aria-label": "failed" }),
|
|
42
|
+
/* @__PURE__ */ jsx(
|
|
43
|
+
SourceIcon,
|
|
44
|
+
{
|
|
45
|
+
className: "size-3.5 shrink-0 text-muted-foreground",
|
|
46
|
+
"aria-hidden": "true"
|
|
47
|
+
}
|
|
48
|
+
),
|
|
49
|
+
/* @__PURE__ */ jsx("span", { className: "flex-1 truncate", children: task.label }),
|
|
50
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono text-label text-muted-foreground uppercase", children: sourceLabel[task.source] })
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
task.id
|
|
54
|
+
);
|
|
55
|
+
}) })
|
|
56
|
+
] });
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export { RunningTasksPanel };
|
|
60
|
+
//# sourceMappingURL=chunk-GUQFYUIC.js.map
|
|
61
|
+
//# sourceMappingURL=chunk-GUQFYUIC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/running-tasks-panel/running-tasks-panel.tsx"],"names":[],"mappings":"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","file":"chunk-GUQFYUIC.js","sourcesContent":["import { Bot, CheckCircle2, Loader2, Terminal } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\nexport type TaskSource = \"agent\" | \"bash\" | \"tool\";\nexport type RunningTaskStatus = \"running\" | \"completed\" | \"failed\";\n\nexport interface RunningTaskItem {\n id: string;\n label: ReactNode;\n source: TaskSource;\n status: RunningTaskStatus;\n}\n\ninterface RunningTasksPanelProps extends HTMLAttributes<HTMLElement> {\n tasks: RunningTaskItem[];\n}\n\nconst sourceIcon = {\n agent: Bot,\n bash: Terminal,\n tool: Bot,\n} as const;\nconst sourceLabel: Record<TaskSource, string> = {\n agent: \"Agent\",\n bash: \"Bash\",\n tool: \"Tool\",\n};\n\n/**\n * RunningTasksPanel — split list of Running vs Completed tasks.\n *\n * Used in the Code workspace right rail to give operational visibility into\n * what the agent is executing (foreground/background) vs what already finished.\n */\nconst RunningTasksPanel = forwardRef<HTMLElement, RunningTasksPanelProps>(\n ({ className, tasks, ...props }, ref) => {\n const running = tasks.filter((t) => t.status === \"running\");\n const completed = tasks.filter((t) => t.status !== \"running\");\n return (\n <section ref={ref} className={cn(\"rounded-xl border bg-card p-4\", className)} {...props}>\n <Group title=\"Running\" empty=\"Nothing running\" items={running} />\n {completed.length > 0 ? (\n <div className=\"mt-4\">\n <Group title=\"Completed\" empty=\"—\" items={completed} />\n </div>\n ) : null}\n </section>\n );\n },\n);\nRunningTasksPanel.displayName = \"RunningTasksPanel\";\n\nfunction Group({\n title,\n empty,\n items,\n}: {\n title: string;\n empty: ReactNode;\n items: RunningTaskItem[];\n}) {\n return (\n <div>\n <h4 className=\"mb-2 font-sans text-label-caps text-muted-foreground uppercase tracking-wider\">\n {title}\n </h4>\n {items.length === 0 ? (\n <p className=\"text-body-sm text-muted-foreground\">{empty}</p>\n ) : (\n <ul className=\"grid gap-1\">\n {items.map((task) => {\n const SourceIcon = sourceIcon[task.source];\n return (\n <li\n key={task.id}\n className=\"flex items-center gap-2 rounded-md px-2 py-1.5 text-body-sm\"\n >\n {task.status === \"running\" ? (\n <Loader2 className=\"size-3.5 animate-spin text-primary\" aria-label=\"running\" />\n ) : task.status === \"completed\" ? (\n <CheckCircle2 className=\"size-3.5 text-success\" aria-label=\"completed\" />\n ) : (\n <span className=\"size-2 rounded-full bg-destructive\" aria-label=\"failed\" />\n )}\n <SourceIcon\n className=\"size-3.5 shrink-0 text-muted-foreground\"\n aria-hidden=\"true\"\n />\n <span className=\"flex-1 truncate\">{task.label}</span>\n <span className=\"font-mono text-label text-muted-foreground uppercase\">\n {sourceLabel[task.source]}\n </span>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n}\n\nexport { RunningTasksPanel };\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { cn } from './chunk-ZSRJCIWF.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-H3VJMFJQ.js.map
|
|
35
|
+
//# sourceMappingURL=chunk-H3VJMFJQ.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-H3VJMFJQ.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,26 @@
|
|
|
1
|
+
import { cn } from './chunk-ZSRJCIWF.js';
|
|
2
|
+
import { forwardRef } from 'react';
|
|
3
|
+
import { jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
var ToolResult = forwardRef(
|
|
6
|
+
({ className, variant = "text", children, ...props }, ref) => {
|
|
7
|
+
if (variant === "text") {
|
|
8
|
+
return /* @__PURE__ */ jsx("div", { ref, className: cn("text-body-sm text-muted-foreground", className), ...props, children });
|
|
9
|
+
}
|
|
10
|
+
return /* @__PURE__ */ jsx("div", { ref, className, ...props, children: /* @__PURE__ */ jsx(
|
|
11
|
+
"pre",
|
|
12
|
+
{
|
|
13
|
+
className: cn(
|
|
14
|
+
"overflow-x-auto whitespace-pre-wrap font-mono text-code-sm",
|
|
15
|
+
variant === "json" ? "text-primary-glow" : "text-foreground"
|
|
16
|
+
),
|
|
17
|
+
children
|
|
18
|
+
}
|
|
19
|
+
) });
|
|
20
|
+
}
|
|
21
|
+
);
|
|
22
|
+
ToolResult.displayName = "ToolResult";
|
|
23
|
+
|
|
24
|
+
export { ToolResult };
|
|
25
|
+
//# sourceMappingURL=chunk-HG4WEERE.js.map
|
|
26
|
+
//# sourceMappingURL=chunk-HG4WEERE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/tool-result/tool-result.tsx"],"names":[],"mappings":";;;;AAsBA,IAAM,UAAA,GAAa,UAAA;AAAA,EACjB,CAAC,EAAE,SAAA,EAAW,OAAA,GAAU,QAAQ,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC5D,IAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,MAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAW,EAAA,CAAG,sCAAsC,SAAS,CAAA,EAAI,GAAG,KAAA,EAChF,QAAA,EACH,CAAA;AAAA,IAEJ;AACA,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAuB,GAAG,KAAA,EACvC,QAAA,kBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA;AAAA,UACT,4DAAA;AAAA,UACA,OAAA,KAAY,SAAS,mBAAA,GAAsB;AAAA,SAC7C;AAAA,QAEC;AAAA;AAAA,KACH,EACF,CAAA;AAAA,EAEJ;AACF;AACA,UAAA,CAAW,WAAA,GAAc,YAAA","file":"chunk-HG4WEERE.js","sourcesContent":["import { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\ntype Variant = \"text\" | \"code\" | \"json\";\n\ninterface ToolResultProps extends HTMLAttributes<HTMLDivElement> {\n variant?: Variant;\n /**\n * Pre-formatted content. For `code`/`json`, the component uses mono font\n * and preserves whitespace. For `text`, normal body font.\n */\n children: ReactNode;\n}\n\n/**\n * ToolResult — formatted output of a tool invocation.\n *\n * Three quick variants: plain text, code (monospace), json (monospace, tinted).\n * Always rendered as a `<div>` for predictable prop typing; code/json variants\n * wrap children in `<pre>` internally.\n */\nconst ToolResult = forwardRef<HTMLDivElement, ToolResultProps>(\n ({ className, variant = \"text\", children, ...props }, ref) => {\n if (variant === \"text\") {\n return (\n <div ref={ref} className={cn(\"text-body-sm text-muted-foreground\", className)} {...props}>\n {children}\n </div>\n );\n }\n return (\n <div ref={ref} className={className} {...props}>\n <pre\n className={cn(\n \"overflow-x-auto whitespace-pre-wrap font-mono text-code-sm\",\n variant === \"json\" ? \"text-primary-glow\" : \"text-foreground\",\n )}\n >\n {children}\n </pre>\n </div>\n );\n },\n);\nToolResult.displayName = \"ToolResult\";\n\nexport { ToolResult };\n"]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { useInLiveRegion } from './chunk-UGKI466V.js';
|
|
2
|
+
import { cn } from './chunk-ZSRJCIWF.js';
|
|
3
|
+
import { AlertOctagon, Network, KeyRound, ShieldOff, Database } from 'lucide-react';
|
|
4
|
+
import { forwardRef } from 'react';
|
|
5
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var ICON_FOR_KIND = {
|
|
8
|
+
"rate-limit": Database,
|
|
9
|
+
"context-overflow": ShieldOff,
|
|
10
|
+
auth: KeyRound,
|
|
11
|
+
"tool-failure": AlertOctagon,
|
|
12
|
+
network: Network,
|
|
13
|
+
generic: AlertOctagon
|
|
14
|
+
};
|
|
15
|
+
var AgentErrorCard = forwardRef(
|
|
16
|
+
({ className, kind = "generic", title, detail, actions, timestamp, ...props }, ref) => {
|
|
17
|
+
const Icon = ICON_FOR_KIND[kind];
|
|
18
|
+
const inLiveRegion = useInLiveRegion();
|
|
19
|
+
return /* @__PURE__ */ jsxs(
|
|
20
|
+
"section",
|
|
21
|
+
{
|
|
22
|
+
ref,
|
|
23
|
+
role: "alert",
|
|
24
|
+
"aria-live": inLiveRegion ? void 0 : "assertive",
|
|
25
|
+
className: cn(
|
|
26
|
+
"grid w-full gap-3 rounded-xl border border-destructive/40 bg-destructive/5 p-4",
|
|
27
|
+
className
|
|
28
|
+
),
|
|
29
|
+
...props,
|
|
30
|
+
children: [
|
|
31
|
+
/* @__PURE__ */ jsxs("header", { className: "flex items-start gap-3", children: [
|
|
32
|
+
/* @__PURE__ */ jsx("span", { className: "mt-0.5 inline-flex shrink-0 text-destructive", "aria-hidden": "true", children: /* @__PURE__ */ jsx(Icon, { className: "size-4" }) }),
|
|
33
|
+
/* @__PURE__ */ jsxs("div", { className: "grid min-w-0 flex-1 gap-1", children: [
|
|
34
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-baseline justify-between gap-2", children: [
|
|
35
|
+
/* @__PURE__ */ jsx("h4", { className: "font-display text-foreground text-title-md tracking-tight", children: title }),
|
|
36
|
+
timestamp ? /* @__PURE__ */ jsx("span", { className: "shrink-0 font-mono text-label text-muted-foreground tabular-nums", children: timestamp }) : null
|
|
37
|
+
] }),
|
|
38
|
+
detail ? /* @__PURE__ */ jsx("p", { className: "break-words font-mono text-code-sm text-muted-foreground", children: detail }) : null
|
|
39
|
+
] })
|
|
40
|
+
] }),
|
|
41
|
+
actions ? /* @__PURE__ */ jsx("footer", { className: "flex flex-wrap items-center justify-end gap-2", children: actions }) : null
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
);
|
|
47
|
+
AgentErrorCard.displayName = "AgentErrorCard";
|
|
48
|
+
|
|
49
|
+
export { AgentErrorCard };
|
|
50
|
+
//# sourceMappingURL=chunk-HGPBGLNP.js.map
|
|
51
|
+
//# sourceMappingURL=chunk-HGPBGLNP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/agent-error-card/agent-error-card.tsx"],"names":[],"mappings":";;;;;;AA8BA,IAAM,aAAA,GAAoD;AAAA,EACxD,YAAA,EAAc,QAAA;AAAA,EACd,kBAAA,EAAoB,SAAA;AAAA,EACpB,IAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAgB,YAAA;AAAA,EAChB,OAAA,EAAS,OAAA;AAAA,EACT,OAAA,EAAS;AACX,CAAA;AAWA,IAAM,cAAA,GAAiB,UAAA;AAAA,EACrB,CAAC,EAAE,SAAA,EAAW,IAAA,GAAO,SAAA,EAAW,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,SAAA,EAAW,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACrF,IAAA,MAAM,IAAA,GAAO,cAAc,IAAI,CAAA;AAK/B,IAAA,MAAM,eAAe,eAAA,EAAgB;AACrC,IAAA,uBACE,IAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,OAAA;AAAA,QACL,WAAA,EAAW,eAAe,MAAA,GAAY,WAAA;AAAA,QACtC,SAAA,EAAW,EAAA;AAAA,UACT,gFAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,QAAA,EAAA,EAAO,WAAU,wBAAA,EAChB,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,8CAAA,EAA+C,aAAA,EAAY,QACzE,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA,EAC3B,CAAA;AAAA,4BACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,8BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2CAAA,EACb,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2DAAA,EAA6D,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,gBAChF,4BACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kEAAA,EACb,qBACH,CAAA,GACE;AAAA,eAAA,EACN,CAAA;AAAA,cACC,yBACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0DAAA,EAA4D,kBAAO,CAAA,GAC9E;AAAA,aAAA,EACN;AAAA,WAAA,EACF,CAAA;AAAA,UACC,0BACC,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,+CAAA,EAAiD,mBAAQ,CAAA,GACzE;AAAA;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,cAAA,CAAe,WAAA,GAAc,gBAAA","file":"chunk-HGPBGLNP.js","sourcesContent":["import {\n AlertOctagon,\n Database,\n KeyRound,\n type LucideIcon,\n Network,\n ShieldOff,\n} 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\n/**\n * AgentErrorCard — inline error / blocked-state card for an agent stream.\n *\n * Renders when the agent run hits a wall it can't recover from on its own:\n * rate limit, context overflow, auth lost, tool failure, network error.\n * Severity is always destructive; the `kind` drives the icon and helps the\n * consumer wire recovery actions in the footer slot.\n */\n\nexport type AgentErrorKind =\n | \"rate-limit\"\n | \"context-overflow\"\n | \"auth\"\n | \"tool-failure\"\n | \"network\"\n | \"generic\";\n\nconst ICON_FOR_KIND: Record<AgentErrorKind, LucideIcon> = {\n \"rate-limit\": Database,\n \"context-overflow\": ShieldOff,\n auth: KeyRound,\n \"tool-failure\": AlertOctagon,\n network: Network,\n generic: AlertOctagon,\n};\n\ninterface AgentErrorCardProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n kind?: AgentErrorKind;\n title: ReactNode;\n detail?: ReactNode;\n /** Recovery action slot (Retry, Reset, Re-auth, etc.). */\n actions?: ReactNode;\n timestamp?: ReactNode;\n}\n\nconst AgentErrorCard = forwardRef<HTMLElement, AgentErrorCardProps>(\n ({ className, kind = \"generic\", title, detail, actions, timestamp, ...props }, ref) => {\n const Icon = ICON_FOR_KIND[kind];\n // T4.1 (MF-4): omit own aria-live when nested in a container live region.\n // role=\"alert\" stays — alerts should announce even via outer region —\n // but we drop the explicit aria-live=\"assertive\" attribute so AT doesn't\n // see two competing live region declarations.\n const inLiveRegion = useInLiveRegion();\n return (\n <section\n ref={ref}\n role=\"alert\"\n aria-live={inLiveRegion ? undefined : \"assertive\"}\n className={cn(\n \"grid w-full gap-3 rounded-xl border border-destructive/40 bg-destructive/5 p-4\",\n className,\n )}\n {...props}\n >\n <header className=\"flex items-start gap-3\">\n <span className=\"mt-0.5 inline-flex shrink-0 text-destructive\" aria-hidden=\"true\">\n <Icon className=\"size-4\" />\n </span>\n <div className=\"grid min-w-0 flex-1 gap-1\">\n <div className=\"flex items-baseline justify-between gap-2\">\n <h4 className=\"font-display text-foreground text-title-md tracking-tight\">{title}</h4>\n {timestamp ? (\n <span className=\"shrink-0 font-mono text-label text-muted-foreground tabular-nums\">\n {timestamp}\n </span>\n ) : null}\n </div>\n {detail ? (\n <p className=\"break-words font-mono text-code-sm text-muted-foreground\">{detail}</p>\n ) : null}\n </div>\n </header>\n {actions ? (\n <footer className=\"flex flex-wrap items-center justify-end gap-2\">{actions}</footer>\n ) : null}\n </section>\n );\n },\n);\nAgentErrorCard.displayName = \"AgentErrorCard\";\n\nexport { AgentErrorCard };\n"]}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { Button } from './chunk-57NXT3OX.js';
|
|
2
|
+
import { cn } from './chunk-ZSRJCIWF.js';
|
|
3
|
+
import { Paperclip, Mic, Square, Send } from 'lucide-react';
|
|
4
|
+
import { forwardRef } from 'react';
|
|
5
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var defaultPlaceholder = {
|
|
8
|
+
chat: "How can I help you today?",
|
|
9
|
+
code: "Type / for commands",
|
|
10
|
+
infra: "Ask about deploys, metrics, env, or rollback\u2026"
|
|
11
|
+
};
|
|
12
|
+
var defaultTextareaLabel = {
|
|
13
|
+
chat: "Chat message",
|
|
14
|
+
code: "Code prompt",
|
|
15
|
+
infra: "Infra command"
|
|
16
|
+
};
|
|
17
|
+
var ChatComposer = forwardRef(
|
|
18
|
+
({
|
|
19
|
+
className,
|
|
20
|
+
mode = "chat",
|
|
21
|
+
value,
|
|
22
|
+
onValueChange,
|
|
23
|
+
onSubmit,
|
|
24
|
+
running = false,
|
|
25
|
+
onStop,
|
|
26
|
+
contextSlot,
|
|
27
|
+
attachmentsSlot,
|
|
28
|
+
leadingActions,
|
|
29
|
+
trailingActions,
|
|
30
|
+
onAttach,
|
|
31
|
+
onVoiceInput,
|
|
32
|
+
textareaLabel,
|
|
33
|
+
placeholder,
|
|
34
|
+
textareaProps,
|
|
35
|
+
...props
|
|
36
|
+
}, ref) => {
|
|
37
|
+
const handleSubmit = (e) => {
|
|
38
|
+
e.preventDefault();
|
|
39
|
+
if (running) return;
|
|
40
|
+
if (!value.trim()) return;
|
|
41
|
+
onSubmit?.(value);
|
|
42
|
+
};
|
|
43
|
+
const onKeyDown = (e) => {
|
|
44
|
+
if (e.key === "Enter" && !e.shiftKey) {
|
|
45
|
+
e.preventDefault();
|
|
46
|
+
if (running) return;
|
|
47
|
+
if (!value.trim()) return;
|
|
48
|
+
onSubmit?.(value);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
const isCode = mode === "code";
|
|
52
|
+
return /* @__PURE__ */ jsxs(
|
|
53
|
+
"form",
|
|
54
|
+
{
|
|
55
|
+
ref,
|
|
56
|
+
onSubmit: handleSubmit,
|
|
57
|
+
className: cn(
|
|
58
|
+
"rounded-2xl border bg-card text-card-foreground transition-shadow",
|
|
59
|
+
"focus-within:border-primary/60 focus-within:shadow-glow",
|
|
60
|
+
isCode && "rounded-xl shadow-sm",
|
|
61
|
+
className
|
|
62
|
+
),
|
|
63
|
+
...props,
|
|
64
|
+
children: [
|
|
65
|
+
contextSlot ? /* @__PURE__ */ jsx("div", { className: "border-border/40 border-b px-3 pt-3", children: contextSlot }) : null,
|
|
66
|
+
attachmentsSlot ? /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2 px-4 pt-3", children: attachmentsSlot }) : null,
|
|
67
|
+
/* @__PURE__ */ jsx(
|
|
68
|
+
"textarea",
|
|
69
|
+
{
|
|
70
|
+
value,
|
|
71
|
+
onChange: (e) => onValueChange(e.target.value),
|
|
72
|
+
onKeyDown,
|
|
73
|
+
placeholder: placeholder ?? defaultPlaceholder[mode],
|
|
74
|
+
"aria-label": textareaLabel ?? defaultTextareaLabel[mode],
|
|
75
|
+
rows: isCode ? 1 : 2,
|
|
76
|
+
...textareaProps,
|
|
77
|
+
className: cn(
|
|
78
|
+
"w-full resize-none bg-transparent px-4 py-3",
|
|
79
|
+
"placeholder:text-muted-foreground",
|
|
80
|
+
"focus:outline-none",
|
|
81
|
+
isCode ? "font-mono text-code-md" : "min-h-[3.5rem] font-sans text-body-md",
|
|
82
|
+
textareaProps?.className
|
|
83
|
+
)
|
|
84
|
+
}
|
|
85
|
+
),
|
|
86
|
+
/* @__PURE__ */ jsxs(
|
|
87
|
+
"div",
|
|
88
|
+
{
|
|
89
|
+
className: cn(
|
|
90
|
+
"flex items-center justify-between gap-2 border-border/40 border-t px-3 py-2"
|
|
91
|
+
),
|
|
92
|
+
children: [
|
|
93
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center gap-1", children: leadingActions !== void 0 ? leadingActions : onAttach ? /* @__PURE__ */ jsx(
|
|
94
|
+
Button,
|
|
95
|
+
{
|
|
96
|
+
size: "icon",
|
|
97
|
+
variant: "ghost",
|
|
98
|
+
type: "button",
|
|
99
|
+
onClick: onAttach,
|
|
100
|
+
"aria-label": "Attach file",
|
|
101
|
+
children: /* @__PURE__ */ jsx(Paperclip, {})
|
|
102
|
+
}
|
|
103
|
+
) : null }),
|
|
104
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
105
|
+
trailingActions,
|
|
106
|
+
onVoiceInput ? /* @__PURE__ */ jsx(
|
|
107
|
+
Button,
|
|
108
|
+
{
|
|
109
|
+
size: "icon",
|
|
110
|
+
variant: "ghost",
|
|
111
|
+
type: "button",
|
|
112
|
+
onClick: onVoiceInput,
|
|
113
|
+
"aria-label": "Voice input",
|
|
114
|
+
children: /* @__PURE__ */ jsx(Mic, {})
|
|
115
|
+
}
|
|
116
|
+
) : null,
|
|
117
|
+
running ? /* @__PURE__ */ jsx(
|
|
118
|
+
Button,
|
|
119
|
+
{
|
|
120
|
+
type: "button",
|
|
121
|
+
onClick: onStop,
|
|
122
|
+
size: "icon",
|
|
123
|
+
variant: "destructive",
|
|
124
|
+
"aria-label": "Stop generation",
|
|
125
|
+
children: /* @__PURE__ */ jsx(Square, {})
|
|
126
|
+
}
|
|
127
|
+
) : /* @__PURE__ */ jsx(Button, { type: "submit", size: "icon", disabled: !value.trim(), "aria-label": "Send message", children: /* @__PURE__ */ jsx(Send, {}) })
|
|
128
|
+
] })
|
|
129
|
+
]
|
|
130
|
+
}
|
|
131
|
+
)
|
|
132
|
+
]
|
|
133
|
+
}
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
);
|
|
137
|
+
ChatComposer.displayName = "ChatComposer";
|
|
138
|
+
|
|
139
|
+
export { ChatComposer };
|
|
140
|
+
//# sourceMappingURL=chunk-HQFTW7SF.js.map
|
|
141
|
+
//# sourceMappingURL=chunk-HQFTW7SF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/composites/chat-composer/chat-composer.tsx"],"names":[],"mappings":"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","file":"chunk-HQFTW7SF.js","sourcesContent":["import { Mic, Paperclip, Send, Square } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type {\n FormEvent,\n HTMLAttributes,\n KeyboardEvent,\n ReactNode,\n TextareaHTMLAttributes,\n} from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { Button } from \"../../primitives/button/index.js\";\n\nexport type ComposerMode = \"chat\" | \"code\" | \"infra\";\n\ninterface ChatComposerProps extends Omit<HTMLAttributes<HTMLFormElement>, \"onSubmit\"> {\n mode?: ComposerMode;\n value: string;\n onValueChange: (next: string) => void;\n onSubmit?: (value: string) => void;\n /**\n * If true, the composer is in \"agent running\" state — Send becomes a Stop button.\n */\n running?: boolean;\n onStop?: () => void;\n /**\n * Slot above the textarea — used for the folder selector in Infra mode.\n */\n contextSlot?: ReactNode;\n /**\n * Slot above the textarea for attachments / chips.\n */\n attachmentsSlot?: ReactNode;\n /**\n * Slot on the bottom-left of the action row (e.g. custom toggles).\n * Overrides the default attach button entirely when provided.\n */\n leadingActions?: ReactNode;\n /**\n * Slot on the bottom-right (e.g. model selector). Send/stop is appended after this.\n */\n trailingActions?: ReactNode;\n /**\n * Optional attach-file callback. If omitted (and `leadingActions` is also\n * omitted), no attach button is rendered. This avoids fake affordances per\n * Quality Gate §7.\n */\n onAttach?: () => void;\n /**\n * Optional voice-input callback. If omitted, no mic button is rendered.\n * Same rationale as `onAttach`.\n */\n onVoiceInput?: () => void;\n /**\n * Accessible label for the textarea. Falls back to a mode-aware default.\n */\n textareaLabel?: string;\n /**\n * Textarea placeholder. Defaults change by mode.\n */\n placeholder?: string;\n /**\n * Extra textarea props (rows, maxLength…).\n */\n textareaProps?: Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, \"value\" | \"onChange\">;\n}\n\nconst defaultPlaceholder: Record<ComposerMode, string> = {\n chat: \"How can I help you today?\",\n code: \"Type / for commands\",\n infra: \"Ask about deploys, metrics, env, or rollback…\",\n};\n\nconst defaultTextareaLabel: Record<ComposerMode, string> = {\n chat: \"Chat message\",\n code: \"Code prompt\",\n infra: \"Infra command\",\n};\n\n/**\n * ChatComposer — message input area, shared by Chat / Code / Infra modes.\n *\n * Visual:\n * - chat / infra → soft card with violet ring on focus, generous padding\n * - code → compact dense form with mono font, slash prefix hint\n *\n * Stateless: caller controls `value` + handles `onSubmit`. Submit fires on Enter\n * (without Shift). Shift+Enter inserts a newline.\n *\n * Optional affordances (mic, attach) are opt-in via `onVoiceInput` / `onAttach`\n * — Quality Gate §7 forbids rendering fake controls without behavior.\n */\nconst ChatComposer = forwardRef<HTMLFormElement, ChatComposerProps>(\n (\n {\n className,\n mode = \"chat\",\n value,\n onValueChange,\n onSubmit,\n running = false,\n onStop,\n contextSlot,\n attachmentsSlot,\n leadingActions,\n trailingActions,\n onAttach,\n onVoiceInput,\n textareaLabel,\n placeholder,\n textareaProps,\n ...props\n },\n ref,\n ) => {\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault();\n if (running) return;\n if (!value.trim()) return;\n onSubmit?.(value);\n };\n\n const onKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n if (running) return;\n if (!value.trim()) return;\n onSubmit?.(value);\n }\n };\n\n const isCode = mode === \"code\";\n\n return (\n <form\n ref={ref}\n onSubmit={handleSubmit}\n className={cn(\n \"rounded-2xl border bg-card text-card-foreground transition-shadow\",\n \"focus-within:border-primary/60 focus-within:shadow-glow\",\n isCode && \"rounded-xl shadow-sm\",\n className,\n )}\n {...props}\n >\n {contextSlot ? (\n <div className=\"border-border/40 border-b px-3 pt-3\">{contextSlot}</div>\n ) : null}\n\n {attachmentsSlot ? (\n <div className=\"flex flex-wrap gap-2 px-4 pt-3\">{attachmentsSlot}</div>\n ) : null}\n\n <textarea\n value={value}\n onChange={(e) => onValueChange(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder={placeholder ?? defaultPlaceholder[mode]}\n aria-label={textareaLabel ?? defaultTextareaLabel[mode]}\n rows={isCode ? 1 : 2}\n {...textareaProps}\n className={cn(\n \"w-full resize-none bg-transparent px-4 py-3\",\n \"placeholder:text-muted-foreground\",\n \"focus:outline-none\",\n isCode ? \"font-mono text-code-md\" : \"min-h-[3.5rem] font-sans text-body-md\",\n textareaProps?.className,\n )}\n />\n\n <div\n className={cn(\n \"flex items-center justify-between gap-2 border-border/40 border-t px-3 py-2\",\n )}\n >\n <div className=\"flex items-center gap-1\">\n {leadingActions !== undefined ? (\n leadingActions\n ) : onAttach ? (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n type=\"button\"\n onClick={onAttach}\n aria-label=\"Attach file\"\n >\n <Paperclip />\n </Button>\n ) : null}\n </div>\n <div className=\"flex items-center gap-2\">\n {trailingActions}\n {onVoiceInput ? (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n type=\"button\"\n onClick={onVoiceInput}\n aria-label=\"Voice input\"\n >\n <Mic />\n </Button>\n ) : null}\n {running ? (\n <Button\n type=\"button\"\n onClick={onStop}\n size=\"icon\"\n variant=\"destructive\"\n aria-label=\"Stop generation\"\n >\n <Square />\n </Button>\n ) : (\n <Button type=\"submit\" size=\"icon\" disabled={!value.trim()} aria-label=\"Send message\">\n <Send />\n </Button>\n )}\n </div>\n </div>\n </form>\n );\n },\n);\nChatComposer.displayName = \"ChatComposer\";\n\nexport { ChatComposer };\n"]}
|