@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,112 @@
|
|
|
1
|
+
import { cn } from './chunk-ZSRJCIWF.js';
|
|
2
|
+
import { Sparkles, Wrench, CalendarDays, Eye, GitBranch, Image } from 'lucide-react';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var formatTokens = (n) => {
|
|
7
|
+
if (n >= 1e6) return `${(n / 1e6).toFixed(0)}M`;
|
|
8
|
+
if (n >= 1e3) return `${(n / 1e3).toFixed(0)}k`;
|
|
9
|
+
return `${n}`;
|
|
10
|
+
};
|
|
11
|
+
var formatUsd = (n) => n >= 100 ? `$${n.toFixed(0)}` : n >= 1 ? `$${n.toFixed(2)}` : `$${n.toFixed(3)}`;
|
|
12
|
+
var ModelCard = forwardRef(
|
|
13
|
+
({ className, model, selected, onSelect, ...props }, ref) => {
|
|
14
|
+
const Tag = onSelect ? "button" : "article";
|
|
15
|
+
return /* @__PURE__ */ jsxs(
|
|
16
|
+
Tag,
|
|
17
|
+
{
|
|
18
|
+
ref,
|
|
19
|
+
type: onSelect ? "button" : void 0,
|
|
20
|
+
onClick: onSelect ? () => onSelect(model.id) : void 0,
|
|
21
|
+
className: cn(
|
|
22
|
+
"grid gap-3 rounded-xl border bg-card p-4 text-left",
|
|
23
|
+
"transition-[border-color,box-shadow] duration-base ease-out-soft",
|
|
24
|
+
selected ? "border-primary shadow-glow" : onSelect ? "hover:border-primary/40 hover:shadow-sm" : "",
|
|
25
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
26
|
+
className
|
|
27
|
+
),
|
|
28
|
+
"aria-pressed": onSelect ? !!selected : void 0,
|
|
29
|
+
...props,
|
|
30
|
+
children: [
|
|
31
|
+
/* @__PURE__ */ jsxs("header", { className: "flex items-start justify-between gap-3", children: [
|
|
32
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
33
|
+
/* @__PURE__ */ jsx("h4", { className: "font-display text-title-md tracking-tight", children: model.name }),
|
|
34
|
+
/* @__PURE__ */ jsx("p", { className: "font-mono text-label-caps text-muted-foreground uppercase tracking-wider", children: model.vendor })
|
|
35
|
+
] }),
|
|
36
|
+
model.tag ? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1 rounded-full bg-accent/15 px-2 py-0.5 font-mono text-accent text-label uppercase", children: [
|
|
37
|
+
typeof model.tag === "string" && model.tag.toLowerCase() === "smart" ? /* @__PURE__ */ jsx(Sparkles, { className: "size-3" }) : null,
|
|
38
|
+
model.tag
|
|
39
|
+
] }) : null
|
|
40
|
+
] }),
|
|
41
|
+
model.description ? /* @__PURE__ */ jsx("p", { className: "text-body-sm text-muted-foreground", children: model.description }) : null,
|
|
42
|
+
/* @__PURE__ */ jsxs("dl", { className: "grid grid-cols-2 gap-3 border-border/30 border-t pt-3 font-mono", children: [
|
|
43
|
+
/* @__PURE__ */ jsxs("div", { className: "grid gap-0.5", children: [
|
|
44
|
+
/* @__PURE__ */ jsx("dt", { className: "text-label-caps text-muted-foreground uppercase tracking-wider", children: "Context" }),
|
|
45
|
+
/* @__PURE__ */ jsxs("dd", { className: "font-medium text-body-sm tabular-nums", children: [
|
|
46
|
+
formatTokens(model.contextWindow),
|
|
47
|
+
" tok"
|
|
48
|
+
] })
|
|
49
|
+
] }),
|
|
50
|
+
/* @__PURE__ */ jsxs("div", { className: "grid gap-0.5", children: [
|
|
51
|
+
/* @__PURE__ */ jsx("dt", { className: "text-label-caps text-muted-foreground uppercase tracking-wider", children: "Max output" }),
|
|
52
|
+
/* @__PURE__ */ jsxs("dd", { className: "font-medium text-body-sm tabular-nums", children: [
|
|
53
|
+
formatTokens(model.maxOutput),
|
|
54
|
+
" tok"
|
|
55
|
+
] })
|
|
56
|
+
] }),
|
|
57
|
+
model.pricePerMInput !== void 0 ? /* @__PURE__ */ jsxs("div", { className: "grid gap-0.5", children: [
|
|
58
|
+
/* @__PURE__ */ jsx("dt", { className: "text-label-caps text-muted-foreground uppercase tracking-wider", children: "Input" }),
|
|
59
|
+
/* @__PURE__ */ jsxs("dd", { className: "font-medium text-body-sm tabular-nums", children: [
|
|
60
|
+
formatUsd(model.pricePerMInput),
|
|
61
|
+
" ",
|
|
62
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "/M" })
|
|
63
|
+
] })
|
|
64
|
+
] }) : null,
|
|
65
|
+
model.pricePerMOutput !== void 0 ? /* @__PURE__ */ jsxs("div", { className: "grid gap-0.5", children: [
|
|
66
|
+
/* @__PURE__ */ jsx("dt", { className: "text-label-caps text-muted-foreground uppercase tracking-wider", children: "Output" }),
|
|
67
|
+
/* @__PURE__ */ jsxs("dd", { className: "font-medium text-body-sm tabular-nums", children: [
|
|
68
|
+
formatUsd(model.pricePerMOutput),
|
|
69
|
+
" ",
|
|
70
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "/M" })
|
|
71
|
+
] })
|
|
72
|
+
] }) : null
|
|
73
|
+
] }),
|
|
74
|
+
model.capabilities && model.capabilities.length > 0 ? /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1.5", children: model.capabilities.map((cap) => {
|
|
75
|
+
const Icon = cap.icon ?? Wrench;
|
|
76
|
+
return /* @__PURE__ */ jsxs(
|
|
77
|
+
"span",
|
|
78
|
+
{
|
|
79
|
+
className: cn(
|
|
80
|
+
"inline-flex items-center gap-1 rounded-md px-2 py-0.5 font-mono text-label",
|
|
81
|
+
cap.enabled ? "bg-success/15 text-success" : "bg-muted text-muted-foreground line-through"
|
|
82
|
+
),
|
|
83
|
+
children: [
|
|
84
|
+
/* @__PURE__ */ jsx(Icon, { className: "size-3", "aria-hidden": "true" }),
|
|
85
|
+
cap.label
|
|
86
|
+
]
|
|
87
|
+
},
|
|
88
|
+
cap.id
|
|
89
|
+
);
|
|
90
|
+
}) }) : null,
|
|
91
|
+
model.cutoff ? /* @__PURE__ */ jsxs("p", { className: "inline-flex items-center gap-1 font-mono text-label text-muted-foreground", children: [
|
|
92
|
+
/* @__PURE__ */ jsx(CalendarDays, { className: "size-3", "aria-hidden": "true" }),
|
|
93
|
+
" Knowledge cutoff \xB7 ",
|
|
94
|
+
model.cutoff
|
|
95
|
+
] }) : null
|
|
96
|
+
]
|
|
97
|
+
}
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
);
|
|
101
|
+
ModelCard.displayName = "ModelCard";
|
|
102
|
+
var modelCapabilityPresets = {
|
|
103
|
+
vision: { id: "vision", label: "Vision", icon: Image },
|
|
104
|
+
tools: { id: "tools", label: "Tool use", icon: Wrench },
|
|
105
|
+
reasoning: { id: "reasoning", label: "Reasoning", icon: Sparkles },
|
|
106
|
+
fineTuning: { id: "ft", label: "Fine-tuning", icon: GitBranch },
|
|
107
|
+
multimodal: { id: "multimodal", label: "Multimodal", icon: Eye }
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
export { ModelCard, modelCapabilityPresets };
|
|
111
|
+
//# sourceMappingURL=chunk-X5L62PXY.js.map
|
|
112
|
+
//# sourceMappingURL=chunk-X5L62PXY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/model-card/model-card.tsx"],"names":[],"mappings":";;;;;AAqCA,IAAM,YAAA,GAAe,CAAC,CAAA,KAAc;AAClC,EAAA,IAAI,CAAA,IAAK,KAAW,OAAO,CAAA,EAAA,CAAI,IAAI,GAAA,EAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AACxD,EAAA,IAAI,CAAA,IAAK,KAAO,OAAO,CAAA,EAAA,CAAI,IAAI,GAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAChD,EAAA,OAAO,GAAG,CAAC,CAAA,CAAA;AACb,CAAA;AAEA,IAAM,SAAA,GAAY,CAAC,CAAA,KACjB,CAAA,IAAK,MAAM,CAAA,CAAA,EAAI,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,GAAK,KAAK,CAAA,GAAI,CAAA,CAAA,EAAI,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAchF,IAAM,SAAA,GAAY,UAAA;AAAA,EAChB,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,UAAU,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC3D,IAAA,MAAM,GAAA,GAAM,WAAW,QAAA,GAAW,SAAA;AAClC,IAAA,uBACE,IAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAM,WAAW,QAAA,GAAW,MAAA;AAAA,QAC5B,SAAS,QAAA,GAAW,MAAM,QAAA,CAAS,KAAA,CAAM,EAAE,CAAA,GAAI,MAAA;AAAA,QAC/C,SAAA,EAAW,EAAA;AAAA,UACT,oDAAA;AAAA,UACA,kEAAA;AAAA,UACA,QAAA,GACI,4BAAA,GACA,QAAA,GACE,yCAAA,GACA,EAAA;AAAA,UACN,yEAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,cAAA,EAAc,QAAA,GAAW,CAAC,CAAC,QAAA,GAAW,MAAA;AAAA,QACrC,GAAI,KAAA;AAAA,QAEL,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,QAAA,EAAA,EAAO,WAAU,wCAAA,EAChB,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,SAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2CAAA,EAA6C,QAAA,EAAA,KAAA,CAAM,IAAA,EAAK,CAAA;AAAA,8BACtE,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0EAAA,EACV,gBAAM,MAAA,EACT;AAAA,aAAA,EACF,CAAA;AAAA,YACC,KAAA,CAAM,GAAA,mBACL,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iHAAA,EACb,QAAA,EAAA;AAAA,cAAA,OAAO,KAAA,CAAM,GAAA,KAAQ,QAAA,IAAY,KAAA,CAAM,GAAA,CAAI,WAAA,EAAY,KAAM,OAAA,mBAC5D,GAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,QAAA,EAAS,CAAA,GAC3B,IAAA;AAAA,cACH,KAAA,CAAM;AAAA,aAAA,EACT,CAAA,GACE;AAAA,WAAA,EACN,CAAA;AAAA,UAEC,KAAA,CAAM,8BACL,GAAA,CAAC,GAAA,EAAA,EAAE,WAAU,oCAAA,EAAsC,QAAA,EAAA,KAAA,CAAM,aAAY,CAAA,GACnE,IAAA;AAAA,0BAEJ,IAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iEAAA,EACZ,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,cAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gEAAA,EAAiE,QAAA,EAAA,SAAA,EAE/E,CAAA;AAAA,8BACA,IAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uCAAA,EACX,QAAA,EAAA;AAAA,gBAAA,YAAA,CAAa,MAAM,aAAa,CAAA;AAAA,gBAAE;AAAA,eAAA,EACrC;AAAA,aAAA,EACF,CAAA;AAAA,4BACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gEAAA,EAAiE,QAAA,EAAA,YAAA,EAE/E,CAAA;AAAA,8BACA,IAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uCAAA,EACX,QAAA,EAAA;AAAA,gBAAA,YAAA,CAAa,MAAM,SAAS,CAAA;AAAA,gBAAE;AAAA,eAAA,EACjC;AAAA,aAAA,EACF,CAAA;AAAA,YACC,MAAM,cAAA,KAAmB,MAAA,mBACxB,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,cAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gEAAA,EAAiE,QAAA,EAAA,OAAA,EAE/E,CAAA;AAAA,8BACA,IAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uCAAA,EACX,QAAA,EAAA;AAAA,gBAAA,SAAA,CAAU,MAAM,cAAc,CAAA;AAAA,gBAAE,GAAA;AAAA,gCAAC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,IAAA,EAAE;AAAA,eAAA,EAC9E;AAAA,aAAA,EACF,CAAA,GACE,IAAA;AAAA,YACH,MAAM,eAAA,KAAoB,MAAA,mBACzB,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,cAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gEAAA,EAAiE,QAAA,EAAA,QAAA,EAE/E,CAAA;AAAA,8BACA,IAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uCAAA,EACX,QAAA,EAAA;AAAA,gBAAA,SAAA,CAAU,MAAM,eAAe,CAAA;AAAA,gBAAE,GAAA;AAAA,gCAAC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,IAAA,EAAE;AAAA,eAAA,EAC/E;AAAA,aAAA,EACF,CAAA,GACE;AAAA,WAAA,EACN,CAAA;AAAA,UAEC,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,YAAA,CAAa,SAAS,CAAA,mBACjD,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA,KAAA,CAAM,YAAA,CAAa,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC/B,YAAA,MAAM,IAAA,GAAO,IAAI,IAAA,IAAQ,MAAA;AACzB,YAAA,uBACE,IAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAW,EAAA;AAAA,kBACT,4EAAA;AAAA,kBACA,GAAA,CAAI,UACA,4BAAA,GACA;AAAA,iBACN;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,aAAA,EAAY,MAAA,EAAO,CAAA;AAAA,kBAC3C,GAAA,CAAI;AAAA;AAAA,eAAA;AAAA,cATA,GAAA,CAAI;AAAA,aAUX;AAAA,UAEJ,CAAC,GACH,CAAA,GACE,IAAA;AAAA,UAEH,KAAA,CAAM,MAAA,mBACL,IAAA,CAAC,GAAA,EAAA,EAAE,WAAU,2EAAA,EACX,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,QAAA,EAAS,aAAA,EAAY,MAAA,EAAO,CAAA;AAAA,YAAE,yBAAA;AAAA,YAAqB,KAAA,CAAM;AAAA,WAAA,EACnF,CAAA,GACE;AAAA;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,SAAA,CAAU,WAAA,GAAc,WAAA;AAGjB,IAAM,sBAAA,GAAyB;AAAA,EACpC,QAAQ,EAAE,EAAA,EAAI,UAAU,KAAA,EAAO,QAAA,EAAU,MAAM,KAAA,EAAuB;AAAA,EACtE,OAAO,EAAE,EAAA,EAAI,SAAS,KAAA,EAAO,UAAA,EAAY,MAAM,MAAA,EAAO;AAAA,EACtD,WAAW,EAAE,EAAA,EAAI,aAAa,KAAA,EAAO,WAAA,EAAa,MAAM,QAAA,EAAS;AAAA,EACjE,YAAY,EAAE,EAAA,EAAI,MAAM,KAAA,EAAO,aAAA,EAAe,MAAM,SAAA,EAAU;AAAA,EAC9D,YAAY,EAAE,EAAA,EAAI,cAAc,KAAA,EAAO,YAAA,EAAc,MAAM,GAAA;AAC7D","file":"chunk-X5L62PXY.js","sourcesContent":["import { CalendarDays, Eye, GitBranch, Image, Sparkles, Wrench } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { IconComponent } from \"../../../lib/types.js\";\n\nexport interface ModelCapabilityFlag {\n id: string;\n label: string;\n icon?: IconComponent;\n enabled: boolean;\n}\n\nexport interface ModelInfo {\n id: string;\n /** Display name (e.g. \"Opus 4.7\"). */\n name: string;\n /** Vendor (Anthropic, OpenAI, …). */\n vendor: string;\n /** Optional tag (default, fast, smart, beta). */\n tag?: ReactNode;\n /** Total context window in tokens. */\n contextWindow: number;\n /** Max output tokens per turn. */\n maxOutput: number;\n /** USD per million input tokens. */\n pricePerMInput?: number;\n /** USD per million output tokens. */\n pricePerMOutput?: number;\n /** Knowledge cutoff date label (e.g. \"Jan 2026\"). */\n cutoff?: string;\n /** Capability flags shown as chips. */\n capabilities?: ModelCapabilityFlag[];\n /** Short description / positioning. */\n description?: ReactNode;\n}\n\nconst formatTokens = (n: number) => {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(0)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(0)}k`;\n return `${n}`;\n};\n\nconst formatUsd = (n: number) =>\n n >= 100 ? `$${n.toFixed(0)}` : n >= 1 ? `$${n.toFixed(2)}` : `$${n.toFixed(3)}`;\n\ninterface ModelCardProps extends Omit<HTMLAttributes<HTMLElement>, \"onSelect\"> {\n model: ModelInfo;\n /** Render as the currently-selected variant (violet ring). */\n selected?: boolean;\n /** Fires when user clicks to select. */\n onSelect?: (id: string) => void;\n}\n\n/**\n * ModelCard — full info on a model: vendor, context, output cap, pricing,\n * capabilities, knowledge cutoff. Used in the \"switch model\" surface.\n */\nconst ModelCard = forwardRef<HTMLElement, ModelCardProps>(\n ({ className, model, selected, onSelect, ...props }, ref) => {\n const Tag = onSelect ? \"button\" : \"article\";\n return (\n <Tag\n ref={ref as never}\n type={onSelect ? \"button\" : undefined}\n onClick={onSelect ? () => onSelect(model.id) : undefined}\n className={cn(\n \"grid gap-3 rounded-xl border bg-card p-4 text-left\",\n \"transition-[border-color,box-shadow] duration-base ease-out-soft\",\n selected\n ? \"border-primary shadow-glow\"\n : onSelect\n ? \"hover:border-primary/40 hover:shadow-sm\"\n : \"\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n className,\n )}\n aria-pressed={onSelect ? !!selected : undefined}\n {...(props as HTMLAttributes<HTMLElement>)}\n >\n <header className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <h4 className=\"font-display text-title-md tracking-tight\">{model.name}</h4>\n <p className=\"font-mono text-label-caps text-muted-foreground uppercase tracking-wider\">\n {model.vendor}\n </p>\n </div>\n {model.tag ? (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-accent/15 px-2 py-0.5 font-mono text-accent text-label uppercase\">\n {typeof model.tag === \"string\" && model.tag.toLowerCase() === \"smart\" ? (\n <Sparkles className=\"size-3\" />\n ) : null}\n {model.tag}\n </span>\n ) : null}\n </header>\n\n {model.description ? (\n <p className=\"text-body-sm text-muted-foreground\">{model.description}</p>\n ) : null}\n\n <dl className=\"grid grid-cols-2 gap-3 border-border/30 border-t pt-3 font-mono\">\n <div className=\"grid gap-0.5\">\n <dt className=\"text-label-caps text-muted-foreground uppercase tracking-wider\">\n Context\n </dt>\n <dd className=\"font-medium text-body-sm tabular-nums\">\n {formatTokens(model.contextWindow)} tok\n </dd>\n </div>\n <div className=\"grid gap-0.5\">\n <dt className=\"text-label-caps text-muted-foreground uppercase tracking-wider\">\n Max output\n </dt>\n <dd className=\"font-medium text-body-sm tabular-nums\">\n {formatTokens(model.maxOutput)} tok\n </dd>\n </div>\n {model.pricePerMInput !== undefined ? (\n <div className=\"grid gap-0.5\">\n <dt className=\"text-label-caps text-muted-foreground uppercase tracking-wider\">\n Input\n </dt>\n <dd className=\"font-medium text-body-sm tabular-nums\">\n {formatUsd(model.pricePerMInput)} <span className=\"text-muted-foreground\">/M</span>\n </dd>\n </div>\n ) : null}\n {model.pricePerMOutput !== undefined ? (\n <div className=\"grid gap-0.5\">\n <dt className=\"text-label-caps text-muted-foreground uppercase tracking-wider\">\n Output\n </dt>\n <dd className=\"font-medium text-body-sm tabular-nums\">\n {formatUsd(model.pricePerMOutput)} <span className=\"text-muted-foreground\">/M</span>\n </dd>\n </div>\n ) : null}\n </dl>\n\n {model.capabilities && model.capabilities.length > 0 ? (\n <div className=\"flex flex-wrap gap-1.5\">\n {model.capabilities.map((cap) => {\n const Icon = cap.icon ?? Wrench;\n return (\n <span\n key={cap.id}\n className={cn(\n \"inline-flex items-center gap-1 rounded-md px-2 py-0.5 font-mono text-label\",\n cap.enabled\n ? \"bg-success/15 text-success\"\n : \"bg-muted text-muted-foreground line-through\",\n )}\n >\n <Icon className=\"size-3\" aria-hidden=\"true\" />\n {cap.label}\n </span>\n );\n })}\n </div>\n ) : null}\n\n {model.cutoff ? (\n <p className=\"inline-flex items-center gap-1 font-mono text-label text-muted-foreground\">\n <CalendarDays className=\"size-3\" aria-hidden=\"true\" /> Knowledge cutoff · {model.cutoff}\n </p>\n ) : null}\n </Tag>\n );\n },\n);\nModelCard.displayName = \"ModelCard\";\n\n/** Pre-canned capability flags. */\nexport const modelCapabilityPresets = {\n vision: { id: \"vision\", label: \"Vision\", icon: Image as IconComponent } as const,\n tools: { id: \"tools\", label: \"Tool use\", icon: Wrench } as const,\n reasoning: { id: \"reasoning\", label: \"Reasoning\", icon: Sparkles } as const,\n fineTuning: { id: \"ft\", label: \"Fine-tuning\", icon: GitBranch } as const,\n multimodal: { id: \"multimodal\", label: \"Multimodal\", icon: Eye } as const,\n};\n\nexport { ModelCard };\n"]}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { useInLiveRegion } from './chunk-UGKI466V.js';
|
|
2
|
+
import { cn } from './chunk-ZSRJCIWF.js';
|
|
3
|
+
import { forwardRef, useState, useRef, useEffect, useMemo } from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var levelClasses = {
|
|
7
|
+
info: "text-foreground",
|
|
8
|
+
warn: "text-warning",
|
|
9
|
+
error: "text-destructive",
|
|
10
|
+
success: "text-success",
|
|
11
|
+
debug: "text-muted-foreground"
|
|
12
|
+
};
|
|
13
|
+
var levelLabels = {
|
|
14
|
+
info: "INFO",
|
|
15
|
+
warn: "WARN",
|
|
16
|
+
error: "ERROR",
|
|
17
|
+
success: " OK ",
|
|
18
|
+
debug: "DBG "
|
|
19
|
+
};
|
|
20
|
+
var ALL_LEVELS = ["info", "warn", "error", "success", "debug"];
|
|
21
|
+
var BuildLogStream = forwardRef(
|
|
22
|
+
({
|
|
23
|
+
className,
|
|
24
|
+
lines,
|
|
25
|
+
filterable = true,
|
|
26
|
+
visibleLevels,
|
|
27
|
+
onVisibleLevelsChange,
|
|
28
|
+
height = "320px",
|
|
29
|
+
maxLines = 2e3,
|
|
30
|
+
live = "off",
|
|
31
|
+
...props
|
|
32
|
+
}, ref) => {
|
|
33
|
+
const inLiveRegion = useInLiveRegion();
|
|
34
|
+
const effectiveLive = inLiveRegion ? "off" : live;
|
|
35
|
+
const [internalLevels, setInternalLevels] = useState(/* @__PURE__ */ new Set());
|
|
36
|
+
const levels = visibleLevels ?? internalLevels;
|
|
37
|
+
const updateLevels = onVisibleLevelsChange ?? setInternalLevels;
|
|
38
|
+
const wasControlled = useRef(null);
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
if (typeof process === "undefined" || process.env.NODE_ENV === "production") return;
|
|
41
|
+
const isControlled = visibleLevels !== void 0;
|
|
42
|
+
if (wasControlled.current === null) {
|
|
43
|
+
wasControlled.current = isControlled;
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (wasControlled.current !== isControlled) {
|
|
47
|
+
console.warn(
|
|
48
|
+
`[@usetheo/ui] BuildLogStream: \`visibleLevels\` prop switched between ${wasControlled.current ? "controlled" : "uncontrolled"} and ${isControlled ? "controlled" : "uncontrolled"} between renders. Pick one mode and keep it consistent.`
|
|
49
|
+
);
|
|
50
|
+
wasControlled.current = isControlled;
|
|
51
|
+
}
|
|
52
|
+
}, [visibleLevels]);
|
|
53
|
+
const filtered = useMemo(() => {
|
|
54
|
+
if (levels.size === 0) return lines;
|
|
55
|
+
return lines.filter((l) => levels.has(l.level));
|
|
56
|
+
}, [lines, levels]);
|
|
57
|
+
const truncated = filtered.length > maxLines;
|
|
58
|
+
const visible = truncated ? filtered.slice(filtered.length - maxLines) : filtered;
|
|
59
|
+
const hiddenCount = truncated ? filtered.length - maxLines : 0;
|
|
60
|
+
const toggle = (level) => {
|
|
61
|
+
const next = new Set(levels);
|
|
62
|
+
if (next.has(level)) next.delete(level);
|
|
63
|
+
else next.add(level);
|
|
64
|
+
updateLevels(next);
|
|
65
|
+
};
|
|
66
|
+
return /* @__PURE__ */ jsxs("div", { ref, className: cn("flex flex-col gap-2", className), ...props, children: [
|
|
67
|
+
filterable ? /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1.5", children: ALL_LEVELS.map((level) => {
|
|
68
|
+
const active = levels.size === 0 || levels.has(level);
|
|
69
|
+
return /* @__PURE__ */ jsx(
|
|
70
|
+
"button",
|
|
71
|
+
{
|
|
72
|
+
type: "button",
|
|
73
|
+
onClick: () => toggle(level),
|
|
74
|
+
"aria-pressed": active,
|
|
75
|
+
className: cn(
|
|
76
|
+
"rounded-md border px-2 py-1 font-mono text-label uppercase tracking-wider",
|
|
77
|
+
"transition-colors duration-base ease-out-soft",
|
|
78
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
|
|
79
|
+
active ? cn("border-border/60 bg-muted", levelClasses[level]) : "border-border/30 text-muted-foreground/50 hover:text-muted-foreground"
|
|
80
|
+
),
|
|
81
|
+
children: level
|
|
82
|
+
},
|
|
83
|
+
level
|
|
84
|
+
);
|
|
85
|
+
}) }) : null,
|
|
86
|
+
/* @__PURE__ */ jsxs(
|
|
87
|
+
"div",
|
|
88
|
+
{
|
|
89
|
+
className: cn("overflow-y-auto rounded-lg border bg-card", "font-mono text-code-sm"),
|
|
90
|
+
style: { height },
|
|
91
|
+
children: [
|
|
92
|
+
truncated ? /* @__PURE__ */ jsxs("output", { className: "block border-border/30 border-b bg-muted/40 px-4 py-1.5 text-label text-muted-foreground", children: [
|
|
93
|
+
"Showing last ",
|
|
94
|
+
maxLines.toLocaleString(),
|
|
95
|
+
" of ",
|
|
96
|
+
filtered.length.toLocaleString(),
|
|
97
|
+
" lines (",
|
|
98
|
+
hiddenCount.toLocaleString(),
|
|
99
|
+
" earlier lines hidden)"
|
|
100
|
+
] }) : null,
|
|
101
|
+
visible.length === 0 ? /* @__PURE__ */ jsx("p", { className: "px-4 py-3 text-muted-foreground", children: "No log lines." }) : /* @__PURE__ */ jsx("ol", { className: "divide-y divide-border/30", "aria-live": effectiveLive, "aria-atomic": "false", children: visible.map((line) => /* @__PURE__ */ jsxs(
|
|
102
|
+
"li",
|
|
103
|
+
{
|
|
104
|
+
className: "grid grid-cols-[auto_auto_1fr] gap-3 px-4 py-1.5 leading-relaxed hover:bg-muted/30",
|
|
105
|
+
children: [
|
|
106
|
+
/* @__PURE__ */ jsx("span", { className: "select-none text-muted-foreground", children: line.timestamp }),
|
|
107
|
+
/* @__PURE__ */ jsxs("span", { className: cn("select-none font-bold", levelClasses[line.level]), children: [
|
|
108
|
+
"[",
|
|
109
|
+
levelLabels[line.level],
|
|
110
|
+
"]"
|
|
111
|
+
] }),
|
|
112
|
+
/* @__PURE__ */ jsxs("span", { className: levelClasses[line.level], children: [
|
|
113
|
+
line.source ? /* @__PURE__ */ jsxs("span", { className: "mr-2 text-muted-foreground", children: [
|
|
114
|
+
line.source,
|
|
115
|
+
":"
|
|
116
|
+
] }) : null,
|
|
117
|
+
line.message
|
|
118
|
+
] })
|
|
119
|
+
]
|
|
120
|
+
},
|
|
121
|
+
line.id
|
|
122
|
+
)) })
|
|
123
|
+
]
|
|
124
|
+
}
|
|
125
|
+
)
|
|
126
|
+
] });
|
|
127
|
+
}
|
|
128
|
+
);
|
|
129
|
+
BuildLogStream.displayName = "BuildLogStream";
|
|
130
|
+
|
|
131
|
+
export { BuildLogStream };
|
|
132
|
+
//# sourceMappingURL=chunk-XGCV5E6W.js.map
|
|
133
|
+
//# sourceMappingURL=chunk-XGCV5E6W.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/build-log-stream/build-log-stream.tsx"],"names":[],"mappings":"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","file":"chunk-XGCV5E6W.js","sourcesContent":["import { forwardRef, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { useInLiveRegion } from \"../../../lib/live-region-context.js\";\n\nexport type LogLevel = \"info\" | \"warn\" | \"error\" | \"success\" | \"debug\";\n\nexport interface LogLine {\n id: string;\n timestamp: string;\n level: LogLevel;\n message: string;\n source?: string;\n}\n\nconst levelClasses: Record<LogLevel, string> = {\n info: \"text-foreground\",\n warn: \"text-warning\",\n error: \"text-destructive\",\n success: \"text-success\",\n debug: \"text-muted-foreground\",\n};\n\nconst levelLabels: Record<LogLevel, string> = {\n info: \"INFO\",\n warn: \"WARN\",\n error: \"ERROR\",\n success: \" OK \",\n debug: \"DBG \",\n};\n\ninterface BuildLogStreamProps extends HTMLAttributes<HTMLDivElement> {\n lines: LogLine[];\n /**\n * If true, shows level filter chips above the stream.\n */\n filterable?: boolean;\n /**\n * Controlled filter — which levels are visible. Empty Set = show all.\n *\n * Pick one mode: either always pass `visibleLevels` + `onVisibleLevelsChange`\n * (controlled), or never (uncontrolled). Mixing the two between renders is\n * not supported and may produce surprising state.\n */\n visibleLevels?: Set<LogLevel>;\n onVisibleLevelsChange?: (levels: Set<LogLevel>) => void;\n /**\n * Height of the scrollable region.\n */\n height?: string | number;\n /**\n * Maximum number of lines rendered. When exceeded, only the tail is shown\n * and a banner indicates truncation. Defaults to 2000 — set higher with\n * caution; React reconciliation cost scales linearly.\n */\n maxLines?: number;\n /**\n * Screen-reader live-region politeness for newly appended lines. Defaults\n * to `\"off\"` because build-log streams can be high-volume; opt into\n * `\"polite\"` only when running the build in the foreground.\n */\n live?: \"off\" | \"polite\";\n}\n\nconst ALL_LEVELS: LogLevel[] = [\"info\", \"warn\", \"error\", \"success\", \"debug\"];\n\n/**\n * BuildLogStream — terminal-like log viewer with timestamps + level coloring.\n *\n * Used in Code workspace and PaaS deployment views. Geist Mono throughout.\n * Lines fade in via animate-fade-in-up on mount; new lines (when prepended/appended)\n * are not animated to avoid feedback noise (consumer's responsibility to render\n * incrementally if needed).\n */\nconst BuildLogStream = forwardRef<HTMLDivElement, BuildLogStreamProps>(\n (\n {\n className,\n lines,\n filterable = true,\n visibleLevels,\n onVisibleLevelsChange,\n height = \"320px\",\n maxLines = 2000,\n live = \"off\",\n ...props\n },\n ref,\n ) => {\n // T4.1 (MF-4): suppress own aria-live when nested in container live region.\n const inLiveRegion = useInLiveRegion();\n const effectiveLive = inLiveRegion ? \"off\" : live;\n const [internalLevels, setInternalLevels] = useState<Set<LogLevel>>(new Set());\n const levels = visibleLevels ?? internalLevels;\n const updateLevels = onVisibleLevelsChange ?? setInternalLevels;\n\n // MEDIUM-002 / T6.5: warn (dev-only) when a consumer flips between\n // controlled and uncontrolled — React's own warning handles `value`/\n // `defaultValue` on form inputs but doesn't see our custom prop pair.\n const wasControlled = useRef<boolean | null>(null);\n useEffect(() => {\n if (typeof process === \"undefined\" || process.env.NODE_ENV === \"production\") return;\n const isControlled = visibleLevels !== undefined;\n if (wasControlled.current === null) {\n wasControlled.current = isControlled;\n return;\n }\n if (wasControlled.current !== isControlled) {\n // biome-ignore lint/suspicious/noConsole: dev-only diagnostic (MEDIUM-002)\n console.warn(\n `[@usetheo/ui] BuildLogStream: \\`visibleLevels\\` prop switched between ${\n wasControlled.current ? \"controlled\" : \"uncontrolled\"\n } and ${isControlled ? \"controlled\" : \"uncontrolled\"} between renders. Pick one mode and keep it consistent.`,\n );\n wasControlled.current = isControlled;\n }\n }, [visibleLevels]);\n\n const filtered = useMemo(() => {\n if (levels.size === 0) return lines;\n return lines.filter((l) => levels.has(l.level));\n }, [lines, levels]);\n\n const truncated = filtered.length > maxLines;\n const visible = truncated ? filtered.slice(filtered.length - maxLines) : filtered;\n const hiddenCount = truncated ? filtered.length - maxLines : 0;\n\n const toggle = (level: LogLevel) => {\n const next = new Set(levels);\n if (next.has(level)) next.delete(level);\n else next.add(level);\n updateLevels(next);\n };\n\n return (\n <div ref={ref} className={cn(\"flex flex-col gap-2\", className)} {...props}>\n {filterable ? (\n <div className=\"flex flex-wrap gap-1.5\">\n {ALL_LEVELS.map((level) => {\n const active = levels.size === 0 || levels.has(level);\n return (\n <button\n key={level}\n type=\"button\"\n onClick={() => toggle(level)}\n aria-pressed={active}\n className={cn(\n \"rounded-md border px-2 py-1 font-mono text-label uppercase tracking-wider\",\n \"transition-colors 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 active\n ? cn(\"border-border/60 bg-muted\", levelClasses[level])\n : \"border-border/30 text-muted-foreground/50 hover:text-muted-foreground\",\n )}\n >\n {level}\n </button>\n );\n })}\n </div>\n ) : null}\n <div\n className={cn(\"overflow-y-auto rounded-lg border bg-card\", \"font-mono text-code-sm\")}\n style={{ height }}\n >\n {truncated ? (\n <output className=\"block border-border/30 border-b bg-muted/40 px-4 py-1.5 text-label text-muted-foreground\">\n Showing last {maxLines.toLocaleString()} of {filtered.length.toLocaleString()} lines (\n {hiddenCount.toLocaleString()} earlier lines hidden)\n </output>\n ) : null}\n {visible.length === 0 ? (\n <p className=\"px-4 py-3 text-muted-foreground\">No log lines.</p>\n ) : (\n <ol className=\"divide-y divide-border/30\" aria-live={effectiveLive} aria-atomic=\"false\">\n {visible.map((line) => (\n <li\n key={line.id}\n className=\"grid grid-cols-[auto_auto_1fr] gap-3 px-4 py-1.5 leading-relaxed hover:bg-muted/30\"\n >\n <span className=\"select-none text-muted-foreground\">{line.timestamp}</span>\n <span className={cn(\"select-none font-bold\", levelClasses[line.level])}>\n [{levelLabels[line.level]}]\n </span>\n <span className={levelClasses[line.level]}>\n {line.source ? (\n <span className=\"mr-2 text-muted-foreground\">{line.source}:</span>\n ) : null}\n {line.message}\n </span>\n </li>\n ))}\n </ol>\n )}\n </div>\n </div>\n );\n },\n);\nBuildLogStream.displayName = \"BuildLogStream\";\n\nexport { BuildLogStream };\n"]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { cn } from './chunk-ZSRJCIWF.js';
|
|
2
|
+
import { Minus, TrendingDown, TrendingUp, ArrowUpRight } from 'lucide-react';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var TREND = {
|
|
7
|
+
up: { icon: TrendingUp, color: "text-success" },
|
|
8
|
+
down: { icon: TrendingDown, color: "text-destructive" },
|
|
9
|
+
flat: { icon: Minus, color: "text-muted-foreground" }
|
|
10
|
+
};
|
|
11
|
+
var StatTile = forwardRef(
|
|
12
|
+
({ className, value, label, icon: Icon, delta, onClick, children: _children, ...props }, ref) => {
|
|
13
|
+
const isInteractive = onClick !== void 0;
|
|
14
|
+
const TrendIcon = delta !== void 0 ? TREND[delta.trend].icon : null;
|
|
15
|
+
const trendColor = delta !== void 0 ? TREND[delta.trend].color : "";
|
|
16
|
+
const inner = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
17
|
+
(Icon !== void 0 || isInteractive) && /* @__PURE__ */ jsxs("div", { className: "mb-3 flex items-center justify-between", children: [
|
|
18
|
+
Icon !== void 0 ? /* @__PURE__ */ jsx("div", { className: "flex size-8 items-center justify-center rounded-lg border border-border/40 bg-muted/40", children: /* @__PURE__ */ jsx(Icon, { "aria-hidden": "true", className: "size-4 text-muted-foreground" }) }) : /* @__PURE__ */ jsx("div", {}),
|
|
19
|
+
isInteractive ? /* @__PURE__ */ jsx(
|
|
20
|
+
ArrowUpRight,
|
|
21
|
+
{
|
|
22
|
+
"aria-hidden": "true",
|
|
23
|
+
className: "size-3.5 text-muted-foreground transition-colors group-hover:text-foreground"
|
|
24
|
+
}
|
|
25
|
+
) : null
|
|
26
|
+
] }),
|
|
27
|
+
/* @__PURE__ */ jsx("div", { className: "whitespace-nowrap font-bold font-display text-display-md text-foreground tabular-nums leading-none tracking-tight", children: value }),
|
|
28
|
+
/* @__PURE__ */ jsx("div", { className: "mt-1 font-sans text-body-sm text-muted-foreground", children: label }),
|
|
29
|
+
delta !== void 0 && TrendIcon !== null ? /* @__PURE__ */ jsxs(
|
|
30
|
+
"div",
|
|
31
|
+
{
|
|
32
|
+
className: cn("mt-2 inline-flex items-center gap-1 font-mono text-label", trendColor),
|
|
33
|
+
children: [
|
|
34
|
+
/* @__PURE__ */ jsx(TrendIcon, { "aria-hidden": "true", className: "size-3" }),
|
|
35
|
+
/* @__PURE__ */ jsx("span", { children: delta.value })
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
) : null
|
|
39
|
+
] });
|
|
40
|
+
if (isInteractive) {
|
|
41
|
+
return /* @__PURE__ */ jsx(
|
|
42
|
+
"button",
|
|
43
|
+
{
|
|
44
|
+
ref,
|
|
45
|
+
type: "button",
|
|
46
|
+
onClick,
|
|
47
|
+
className: cn(
|
|
48
|
+
"group block w-full rounded-xl border border-border/40 bg-card p-5 text-left",
|
|
49
|
+
"cursor-pointer transition-colors hover:border-primary/30",
|
|
50
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
|
|
51
|
+
className
|
|
52
|
+
),
|
|
53
|
+
...props,
|
|
54
|
+
children: inner
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
return /* @__PURE__ */ jsx(
|
|
59
|
+
"div",
|
|
60
|
+
{
|
|
61
|
+
ref,
|
|
62
|
+
className: cn("rounded-xl border border-border/40 bg-card p-5", className),
|
|
63
|
+
children: inner
|
|
64
|
+
}
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
StatTile.displayName = "StatTile";
|
|
69
|
+
|
|
70
|
+
export { StatTile };
|
|
71
|
+
//# sourceMappingURL=chunk-XRKIEL5M.js.map
|
|
72
|
+
//# sourceMappingURL=chunk-XRKIEL5M.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/stat-tile/stat-tile.tsx"],"names":[],"mappings":"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","file":"chunk-XRKIEL5M.js","sourcesContent":["import { ArrowUpRight, Minus, TrendingDown, TrendingUp } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { ButtonHTMLAttributes, ElementType, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\n/**\n * StatTile — big number + label + optional delta + optional icon.\n *\n * Dual mode based on `onClick`:\n * - With onClick → renders as `<button>` with hover state + trailing\n * ArrowUpRight chevron (navigation affordance).\n * - Without onClick → renders as static `<div>`.\n *\n * Delta trend drives icon + color: up=success/TrendingUp, down=destructive/\n * TrendingDown, flat=muted/Minus. Big value uses font-display + tabular-nums.\n *\n * @example\n * <StatTile value=\"42\" label=\"Projects\" />\n * <StatTile value=\"$1,234\" label=\"MRR\" icon={DollarSign}\n * delta={{ value: \"+12%\", trend: \"up\" }} onClick={openBilling} />\n */\nexport interface StatTileProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"type\" | \"value\"> {\n value: ReactNode;\n label: ReactNode;\n icon?: ElementType;\n delta?: { value: ReactNode; trend: \"up\" | \"down\" | \"flat\" };\n}\n\nconst TREND: Record<\"up\" | \"down\" | \"flat\", { icon: ElementType; color: string }> = {\n up: { icon: TrendingUp, color: \"text-success\" },\n down: { icon: TrendingDown, color: \"text-destructive\" },\n flat: { icon: Minus, color: \"text-muted-foreground\" },\n};\n\nconst StatTile = forwardRef<HTMLElement, StatTileProps>(\n ({ className, value, label, icon: Icon, delta, onClick, children: _children, ...props }, ref) => {\n const isInteractive = onClick !== undefined;\n const TrendIcon = delta !== undefined ? TREND[delta.trend].icon : null;\n const trendColor = delta !== undefined ? TREND[delta.trend].color : \"\";\n\n const inner = (\n <>\n {(Icon !== undefined || isInteractive) && (\n <div className=\"mb-3 flex items-center justify-between\">\n {Icon !== undefined ? (\n <div className=\"flex size-8 items-center justify-center rounded-lg border border-border/40 bg-muted/40\">\n <Icon aria-hidden=\"true\" className=\"size-4 text-muted-foreground\" />\n </div>\n ) : (\n <div />\n )}\n {isInteractive ? (\n <ArrowUpRight\n aria-hidden=\"true\"\n className=\"size-3.5 text-muted-foreground transition-colors group-hover:text-foreground\"\n />\n ) : null}\n </div>\n )}\n <div className=\"whitespace-nowrap font-bold font-display text-display-md text-foreground tabular-nums leading-none tracking-tight\">\n {value}\n </div>\n <div className=\"mt-1 font-sans text-body-sm text-muted-foreground\">{label}</div>\n {delta !== undefined && TrendIcon !== null ? (\n <div\n className={cn(\"mt-2 inline-flex items-center gap-1 font-mono text-label\", trendColor)}\n >\n <TrendIcon aria-hidden=\"true\" className=\"size-3\" />\n <span>{delta.value}</span>\n </div>\n ) : null}\n </>\n );\n\n if (isInteractive) {\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n onClick={onClick}\n className={cn(\n \"group block w-full rounded-xl border border-border/40 bg-card p-5 text-left\",\n \"cursor-pointer transition-colors hover:border-primary/30\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n className,\n )}\n {...props}\n >\n {inner}\n </button>\n );\n }\n\n return (\n <div\n ref={ref as React.Ref<HTMLDivElement>}\n className={cn(\"rounded-xl border border-border/40 bg-card p-5\", className)}\n >\n {inner}\n </div>\n );\n },\n);\nStatTile.displayName = \"StatTile\";\n\nexport { StatTile };\n"]}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { cn } from './chunk-ZSRJCIWF.js';
|
|
2
|
+
import { CircleX, Circle, CheckCircle2, Loader2, CircleDashed } from 'lucide-react';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var STATUS_ICON = {
|
|
7
|
+
pending: CircleDashed,
|
|
8
|
+
running: Loader2,
|
|
9
|
+
done: CheckCircle2,
|
|
10
|
+
skipped: Circle,
|
|
11
|
+
failed: CircleX
|
|
12
|
+
};
|
|
13
|
+
var STATUS_COLOR = {
|
|
14
|
+
pending: "text-muted-foreground",
|
|
15
|
+
running: "text-primary",
|
|
16
|
+
done: "text-success",
|
|
17
|
+
skipped: "text-muted-foreground/60",
|
|
18
|
+
failed: "text-destructive"
|
|
19
|
+
};
|
|
20
|
+
var LABEL_STYLE = {
|
|
21
|
+
pending: "text-foreground",
|
|
22
|
+
running: "text-foreground",
|
|
23
|
+
done: "text-foreground line-through decoration-muted-foreground/40",
|
|
24
|
+
skipped: "text-muted-foreground line-through",
|
|
25
|
+
failed: "text-destructive"
|
|
26
|
+
};
|
|
27
|
+
var TaskNode = forwardRef(
|
|
28
|
+
({ className, node, depth = 0, ...props }, ref) => {
|
|
29
|
+
const Icon = STATUS_ICON[node.status];
|
|
30
|
+
return /* @__PURE__ */ jsxs(
|
|
31
|
+
"li",
|
|
32
|
+
{
|
|
33
|
+
ref,
|
|
34
|
+
className: cn("grid gap-1", className),
|
|
35
|
+
style: { marginLeft: `${depth * 1.25}rem` },
|
|
36
|
+
...props,
|
|
37
|
+
children: [
|
|
38
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-[auto_1fr] items-baseline gap-2", children: [
|
|
39
|
+
/* @__PURE__ */ jsx(
|
|
40
|
+
Icon,
|
|
41
|
+
{
|
|
42
|
+
"aria-hidden": "true",
|
|
43
|
+
className: cn(
|
|
44
|
+
"mt-0.5 size-3.5 shrink-0",
|
|
45
|
+
STATUS_COLOR[node.status],
|
|
46
|
+
node.status === "running" && "animate-spin"
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
),
|
|
50
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
51
|
+
/* @__PURE__ */ jsx("p", { className: cn("text-body-sm", LABEL_STYLE[node.status]), children: node.label }),
|
|
52
|
+
node.detail ? /* @__PURE__ */ jsx("p", { className: "text-body-sm text-muted-foreground", children: node.detail }) : null
|
|
53
|
+
] })
|
|
54
|
+
] }),
|
|
55
|
+
node.children && node.children.length > 0 ? /* @__PURE__ */ jsx("ul", { className: "grid gap-1 border-border/30 border-l pl-2", children: node.children.map((child) => /* @__PURE__ */ jsx(TaskNode, { node: child, depth: depth + 1 }, child.id)) }) : null
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
TaskNode.displayName = "TaskNode";
|
|
62
|
+
var TaskPlan = forwardRef(
|
|
63
|
+
({ className, nodes, title = "Plan", summary, ...props }, ref) => {
|
|
64
|
+
const auto = nodes.length;
|
|
65
|
+
const done = nodes.filter((n) => n.status === "done").length;
|
|
66
|
+
const computedSummary = summary ?? (auto > 0 ? `${done} of ${auto} done` : "no steps");
|
|
67
|
+
return /* @__PURE__ */ jsxs("section", { ref, className: cn("rounded-xl border bg-card p-4", className), ...props, children: [
|
|
68
|
+
/* @__PURE__ */ jsxs("header", { className: "mb-3 flex items-baseline justify-between gap-3", children: [
|
|
69
|
+
title ? /* @__PURE__ */ jsx("h3", { className: "font-display text-title-md tracking-tight", children: title }) : /* @__PURE__ */ jsx("span", {}),
|
|
70
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono text-label text-muted-foreground tabular-nums", children: computedSummary })
|
|
71
|
+
] }),
|
|
72
|
+
/* @__PURE__ */ jsx("ul", { className: "grid gap-1.5", children: nodes.map((node) => /* @__PURE__ */ jsx(TaskNode, { node }, node.id)) })
|
|
73
|
+
] });
|
|
74
|
+
}
|
|
75
|
+
);
|
|
76
|
+
TaskPlan.displayName = "TaskPlan";
|
|
77
|
+
|
|
78
|
+
export { TaskNode, TaskPlan };
|
|
79
|
+
//# sourceMappingURL=chunk-XUJYEADU.js.map
|
|
80
|
+
//# sourceMappingURL=chunk-XUJYEADU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/task-plan/task-plan.tsx"],"names":[],"mappings":"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","file":"chunk-XUJYEADU.js","sourcesContent":["import { CheckCircle2, Circle, CircleDashed, CircleX, Loader2 } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\nexport type PlanNodeStatus = \"pending\" | \"running\" | \"done\" | \"skipped\" | \"failed\";\n\nexport interface PlanNode {\n id: string;\n label: string;\n status: PlanNodeStatus;\n /** Optional details / sub-explanation. */\n detail?: string;\n /** Sub-nodes (rendered indented). */\n children?: PlanNode[];\n}\n\nconst STATUS_ICON = {\n pending: CircleDashed,\n running: Loader2,\n done: CheckCircle2,\n skipped: Circle,\n failed: CircleX,\n} as const;\n\nconst STATUS_COLOR: Record<PlanNodeStatus, string> = {\n pending: \"text-muted-foreground\",\n running: \"text-primary\",\n done: \"text-success\",\n skipped: \"text-muted-foreground/60\",\n failed: \"text-destructive\",\n};\n\nconst LABEL_STYLE: Record<PlanNodeStatus, string> = {\n pending: \"text-foreground\",\n running: \"text-foreground\",\n done: \"text-foreground line-through decoration-muted-foreground/40\",\n skipped: \"text-muted-foreground line-through\",\n failed: \"text-destructive\",\n};\n\ninterface TaskNodeProps extends HTMLAttributes<HTMLLIElement> {\n node: PlanNode;\n depth?: number;\n}\n\n/**\n * TaskNode — single row in a task plan. Renders its own children recursively\n * with increasing indentation.\n */\nconst TaskNode = forwardRef<HTMLLIElement, TaskNodeProps>(\n ({ className, node, depth = 0, ...props }, ref) => {\n const Icon = STATUS_ICON[node.status];\n return (\n <li\n ref={ref}\n className={cn(\"grid gap-1\", className)}\n style={{ marginLeft: `${depth * 1.25}rem` }}\n {...props}\n >\n <div className=\"grid grid-cols-[auto_1fr] items-baseline gap-2\">\n <Icon\n aria-hidden=\"true\"\n className={cn(\n \"mt-0.5 size-3.5 shrink-0\",\n STATUS_COLOR[node.status],\n node.status === \"running\" && \"animate-spin\",\n )}\n />\n <div className=\"min-w-0\">\n <p className={cn(\"text-body-sm\", LABEL_STYLE[node.status])}>{node.label}</p>\n {node.detail ? (\n <p className=\"text-body-sm text-muted-foreground\">{node.detail}</p>\n ) : null}\n </div>\n </div>\n {node.children && node.children.length > 0 ? (\n <ul className=\"grid gap-1 border-border/30 border-l pl-2\">\n {node.children.map((child) => (\n <TaskNode key={child.id} node={child} depth={depth + 1} />\n ))}\n </ul>\n ) : null}\n </li>\n );\n },\n);\nTaskNode.displayName = \"TaskNode\";\n\ninterface TaskPlanProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n nodes: PlanNode[];\n /** Header title. */\n title?: ReactNode;\n /** Summary line shown next to the title (e.g. \"3 of 7 done\"). */\n summary?: ReactNode;\n}\n\n/**\n * TaskPlan — hierarchical task plan, à la Claude \"plan mode\".\n *\n * The agent emits a structured plan; the user sees each step progress from\n * pending → running → done (or failed/skipped). Children render with one\n * extra indent level and a left border to suggest hierarchy.\n */\nconst TaskPlan = forwardRef<HTMLElement, TaskPlanProps>(\n ({ className, nodes, title = \"Plan\", summary, ...props }, ref) => {\n const auto = nodes.length;\n const done = nodes.filter((n) => n.status === \"done\").length;\n const computedSummary = summary ?? (auto > 0 ? `${done} of ${auto} done` : \"no steps\");\n return (\n <section ref={ref} className={cn(\"rounded-xl border bg-card p-4\", className)} {...props}>\n <header className=\"mb-3 flex items-baseline justify-between gap-3\">\n {title ? (\n <h3 className=\"font-display text-title-md tracking-tight\">{title}</h3>\n ) : (\n <span />\n )}\n <span className=\"font-mono text-label text-muted-foreground tabular-nums\">\n {computedSummary}\n </span>\n </header>\n <ul className=\"grid gap-1.5\">\n {nodes.map((node) => (\n <TaskNode key={node.id} node={node} />\n ))}\n </ul>\n </section>\n );\n },\n);\nTaskPlan.displayName = \"TaskPlan\";\n\nexport { TaskNode, TaskPlan };\n"]}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { cn } from './chunk-ZSRJCIWF.js';
|
|
2
|
+
import { Clock, Sparkles, Coins, MessageSquare, ChevronRight } from 'lucide-react';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var STATUS_CLASS = {
|
|
7
|
+
active: "border-primary/40 bg-primary/15 text-primary",
|
|
8
|
+
completed: "border-success/40 bg-success/15 text-success",
|
|
9
|
+
failed: "border-destructive/40 bg-destructive/15 text-destructive",
|
|
10
|
+
aborted: "border-border/40 bg-muted text-muted-foreground"
|
|
11
|
+
};
|
|
12
|
+
var STATUS_LABEL = {
|
|
13
|
+
active: "Active",
|
|
14
|
+
completed: "Completed",
|
|
15
|
+
failed: "Failed",
|
|
16
|
+
aborted: "Aborted"
|
|
17
|
+
};
|
|
18
|
+
var SessionTimeline = forwardRef(
|
|
19
|
+
({ className, sessions, title = "Recent sessions", onOpen, ...props }, ref) => /* @__PURE__ */ jsxs(
|
|
20
|
+
"section",
|
|
21
|
+
{
|
|
22
|
+
ref,
|
|
23
|
+
className: cn("rounded-xl border bg-card", className),
|
|
24
|
+
"aria-label": "Session history",
|
|
25
|
+
...props,
|
|
26
|
+
children: [
|
|
27
|
+
title ? /* @__PURE__ */ jsxs("header", { className: "flex items-baseline justify-between border-border/40 border-b px-4 py-3", children: [
|
|
28
|
+
/* @__PURE__ */ jsx("h3", { className: "font-display text-title-md tracking-tight", children: title }),
|
|
29
|
+
/* @__PURE__ */ jsxs("span", { className: "font-mono text-label text-muted-foreground", children: [
|
|
30
|
+
sessions.length,
|
|
31
|
+
" ",
|
|
32
|
+
sessions.length === 1 ? "session" : "sessions"
|
|
33
|
+
] })
|
|
34
|
+
] }) : null,
|
|
35
|
+
/* @__PURE__ */ jsxs("ul", { className: "divide-y divide-border/30", children: [
|
|
36
|
+
sessions.map((s) => {
|
|
37
|
+
const RowTag = onOpen ? "button" : "div";
|
|
38
|
+
return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
|
|
39
|
+
RowTag,
|
|
40
|
+
{
|
|
41
|
+
type: onOpen ? "button" : void 0,
|
|
42
|
+
onClick: onOpen ? () => onOpen(s.id) : void 0,
|
|
43
|
+
className: cn(
|
|
44
|
+
"grid w-full grid-cols-[1fr_auto] items-center gap-3 px-4 py-3 text-left",
|
|
45
|
+
onOpen && "hover:bg-muted/40 focus-visible:bg-muted/40 focus-visible:outline-none"
|
|
46
|
+
),
|
|
47
|
+
children: [
|
|
48
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
49
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
50
|
+
/* @__PURE__ */ jsx("p", { className: "truncate font-medium text-body-sm text-foreground", children: s.title }),
|
|
51
|
+
/* @__PURE__ */ jsx(
|
|
52
|
+
"span",
|
|
53
|
+
{
|
|
54
|
+
className: cn(
|
|
55
|
+
"inline-flex shrink-0 items-center rounded-full border px-2 py-0.5",
|
|
56
|
+
"font-mono text-label uppercase tracking-wider",
|
|
57
|
+
STATUS_CLASS[s.status]
|
|
58
|
+
),
|
|
59
|
+
children: STATUS_LABEL[s.status]
|
|
60
|
+
}
|
|
61
|
+
)
|
|
62
|
+
] }),
|
|
63
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-1 flex flex-wrap items-center gap-3 font-mono text-label text-muted-foreground", children: [
|
|
64
|
+
/* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
|
|
65
|
+
/* @__PURE__ */ jsx(Clock, { className: "size-3", "aria-hidden": "true" }),
|
|
66
|
+
" ",
|
|
67
|
+
s.startedAt,
|
|
68
|
+
s.duration ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
69
|
+
" \xB7 ",
|
|
70
|
+
s.duration
|
|
71
|
+
] }) : null
|
|
72
|
+
] }),
|
|
73
|
+
s.model ? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
|
|
74
|
+
/* @__PURE__ */ jsx(Sparkles, { className: "size-3", "aria-hidden": "true" }),
|
|
75
|
+
" ",
|
|
76
|
+
s.model
|
|
77
|
+
] }) : null,
|
|
78
|
+
s.tokens ? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
|
|
79
|
+
/* @__PURE__ */ jsx(Coins, { className: "size-3", "aria-hidden": "true" }),
|
|
80
|
+
" ",
|
|
81
|
+
s.tokens,
|
|
82
|
+
" tok"
|
|
83
|
+
] }) : null,
|
|
84
|
+
s.cost !== void 0 ? /* @__PURE__ */ jsxs("span", { className: "tabular-nums", children: [
|
|
85
|
+
"$",
|
|
86
|
+
s.cost.toFixed(2)
|
|
87
|
+
] }) : null,
|
|
88
|
+
s.messageCount !== void 0 ? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
|
|
89
|
+
/* @__PURE__ */ jsx(MessageSquare, { className: "size-3", "aria-hidden": "true" }),
|
|
90
|
+
" ",
|
|
91
|
+
s.messageCount
|
|
92
|
+
] }) : null
|
|
93
|
+
] })
|
|
94
|
+
] }),
|
|
95
|
+
onOpen ? /* @__PURE__ */ jsx(
|
|
96
|
+
ChevronRight,
|
|
97
|
+
{
|
|
98
|
+
className: "size-4 shrink-0 text-muted-foreground",
|
|
99
|
+
"aria-hidden": "true"
|
|
100
|
+
}
|
|
101
|
+
) : null
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
) }, s.id);
|
|
105
|
+
}),
|
|
106
|
+
sessions.length === 0 ? /* @__PURE__ */ jsx("li", { className: "px-4 py-8 text-center font-sans text-body-sm text-muted-foreground", children: "No sessions yet." }) : null
|
|
107
|
+
] })
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
)
|
|
111
|
+
);
|
|
112
|
+
SessionTimeline.displayName = "SessionTimeline";
|
|
113
|
+
|
|
114
|
+
export { SessionTimeline };
|
|
115
|
+
//# sourceMappingURL=chunk-XVYNSIQC.js.map
|
|
116
|
+
//# sourceMappingURL=chunk-XVYNSIQC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/session-timeline/session-timeline.tsx"],"names":[],"mappings":";;;;;AAiCA,IAAM,YAAA,GAA8C;AAAA,EAClD,MAAA,EAAQ,8CAAA;AAAA,EACR,SAAA,EAAW,8CAAA;AAAA,EACX,MAAA,EAAQ,0DAAA;AAAA,EACR,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,YAAA,GAA8C;AAAA,EAClD,MAAA,EAAQ,QAAA;AAAA,EACR,SAAA,EAAW,WAAA;AAAA,EACX,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS;AACX,CAAA;AAMA,IAAM,eAAA,GAAkB,UAAA;AAAA,EACtB,CAAC,EAAE,SAAA,EAAW,QAAA,EAAU,KAAA,GAAQ,mBAAmB,MAAA,EAAQ,GAAG,KAAA,EAAM,EAAG,GAAA,qBACrE,IAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,EAAA,CAAG,2BAAA,EAA6B,SAAS,CAAA;AAAA,MACpD,YAAA,EAAW,iBAAA;AAAA,MACV,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,KAAA,mBACC,IAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,yEAAA,EAChB,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2CAAA,EAA6C,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,0BACjE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EACb,QAAA,EAAA;AAAA,YAAA,QAAA,CAAS,MAAA;AAAA,YAAO,GAAA;AAAA,YAAE,QAAA,CAAS,MAAA,KAAW,CAAA,GAAI,SAAA,GAAY;AAAA,WAAA,EACzD;AAAA,SAAA,EACF,CAAA,GACE,IAAA;AAAA,wBACJ,IAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2BAAA,EACX,QAAA,EAAA;AAAA,UAAA,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM;AACnB,YAAA,MAAM,MAAA,GAAS,SAAS,QAAA,GAAW,KAAA;AACnC,YAAA,2BACG,IAAA,EAAA,EACC,QAAA,kBAAA,IAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAM,SAAS,QAAA,GAAW,MAAA;AAAA,gBAC1B,SAAS,MAAA,GAAS,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA,GAAI,MAAA;AAAA,gBACvC,SAAA,EAAW,EAAA;AAAA,kBACT,yEAAA;AAAA,kBACA,MAAA,IACE;AAAA,iBACJ;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,SAAA,EACb,QAAA,EAAA;AAAA,oCAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EACb,QAAA,EAAA;AAAA,sCAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mDAAA,EAAqD,QAAA,EAAA,CAAA,CAAE,KAAA,EAAM,CAAA;AAAA,sCAC1E,GAAA;AAAA,wBAAC,MAAA;AAAA,wBAAA;AAAA,0BACC,SAAA,EAAW,EAAA;AAAA,4BACT,mEAAA;AAAA,4BACA,+CAAA;AAAA,4BACA,YAAA,CAAa,EAAE,MAAM;AAAA,2BACvB;AAAA,0BAEC,QAAA,EAAA,YAAA,CAAa,EAAE,MAAM;AAAA;AAAA;AACxB,qBAAA,EACF,CAAA;AAAA,oCACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mFAAA,EACb,QAAA,EAAA;AAAA,sCAAA,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gCAAA,EACd,QAAA,EAAA;AAAA,wCAAA,GAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,QAAA,EAAS,aAAA,EAAY,MAAA,EAAO,CAAA;AAAA,wBAAE,GAAA;AAAA,wBAAE,CAAA,CAAE,SAAA;AAAA,wBAClD,CAAA,CAAE,2BAAW,IAAA,CAAA,QAAA,EAAA,EAAE,QAAA,EAAA;AAAA,0BAAA,QAAA;AAAA,0BAAI,CAAA,CAAE;AAAA,yBAAA,EAAS,CAAA,GAAM;AAAA,uBAAA,EACvC,CAAA;AAAA,sBACC,CAAA,CAAE,KAAA,mBACD,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gCAAA,EACd,QAAA,EAAA;AAAA,wCAAA,GAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,QAAA,EAAS,aAAA,EAAY,MAAA,EAAO,CAAA;AAAA,wBAAE,GAAA;AAAA,wBAAE,CAAA,CAAE;AAAA,uBAAA,EACxD,CAAA,GACE,IAAA;AAAA,sBACH,CAAA,CAAE,MAAA,mBACD,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gCAAA,EACd,QAAA,EAAA;AAAA,wCAAA,GAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,QAAA,EAAS,aAAA,EAAY,MAAA,EAAO,CAAA;AAAA,wBAAE,GAAA;AAAA,wBAAE,CAAA,CAAE,MAAA;AAAA,wBAAO;AAAA,uBAAA,EAC5D,CAAA,GACE,IAAA;AAAA,sBACH,EAAE,IAAA,KAAS,MAAA,mBACV,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,cAAA,EAAe,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,wBAAE,CAAA,CAAE,IAAA,CAAK,OAAA,CAAQ,CAAC;AAAA,uBAAA,EAAE,CAAA,GACjD,IAAA;AAAA,sBACH,EAAE,YAAA,KAAiB,MAAA,mBAClB,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gCAAA,EACd,QAAA,EAAA;AAAA,wCAAA,GAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,QAAA,EAAS,aAAA,EAAY,MAAA,EAAO,CAAA;AAAA,wBAAE,GAAA;AAAA,wBAAE,CAAA,CAAE;AAAA,uBAAA,EAC7D,CAAA,GACE;AAAA,qBAAA,EACN;AAAA,mBAAA,EACF,CAAA;AAAA,kBACC,MAAA,mBACC,GAAA;AAAA,oBAAC,YAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAU,uCAAA;AAAA,sBACV,aAAA,EAAY;AAAA;AAAA,mBACd,GACE;AAAA;AAAA;AAAA,aACN,EAAA,EAtDO,EAAE,EAuDX,CAAA;AAAA,UAEJ,CAAC,CAAA;AAAA,UACA,QAAA,CAAS,WAAW,CAAA,mBACnB,GAAA,CAAC,QAAG,SAAA,EAAU,oEAAA,EAAqE,8BAEnF,CAAA,GACE;AAAA,SAAA,EACN;AAAA;AAAA;AAAA;AAGN;AACA,eAAA,CAAgB,WAAA,GAAc,iBAAA","file":"chunk-XVYNSIQC.js","sourcesContent":["import { ChevronRight, Clock, Coins, MessageSquare, Sparkles } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\nexport type SessionStatus = \"active\" | \"completed\" | \"failed\" | \"aborted\";\n\nexport interface SessionSummary {\n id: string;\n /** Friendly title (often the first user message). */\n title: string;\n /** ISO timestamp / friendly date label. */\n startedAt: string;\n duration?: string;\n status: SessionStatus;\n /** Agent/model that ran the session. */\n model?: string;\n /** Total tokens consumed (formatted, e.g. \"35.7k\"). */\n tokens?: string;\n /** Total cost (USD). */\n cost?: number;\n /** Number of messages in the session. */\n messageCount?: number;\n}\n\ninterface SessionTimelineProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n sessions: SessionSummary[];\n /** Title above the list. */\n title?: ReactNode;\n /** Fires when a row is clicked. */\n onOpen?: (id: string) => void;\n}\n\nconst STATUS_CLASS: Record<SessionStatus, string> = {\n active: \"border-primary/40 bg-primary/15 text-primary\",\n completed: \"border-success/40 bg-success/15 text-success\",\n failed: \"border-destructive/40 bg-destructive/15 text-destructive\",\n aborted: \"border-border/40 bg-muted text-muted-foreground\",\n};\n\nconst STATUS_LABEL: Record<SessionStatus, string> = {\n active: \"Active\",\n completed: \"Completed\",\n failed: \"Failed\",\n aborted: \"Aborted\",\n};\n\n/**\n * SessionTimeline — historical view of past agent sessions with per-row\n * tokens / cost / duration / status. Click a row to open the full session.\n */\nconst SessionTimeline = forwardRef<HTMLDivElement, SessionTimelineProps>(\n ({ className, sessions, title = \"Recent sessions\", onOpen, ...props }, ref) => (\n <section\n ref={ref}\n className={cn(\"rounded-xl border bg-card\", className)}\n aria-label=\"Session history\"\n {...props}\n >\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 {sessions.length} {sessions.length === 1 ? \"session\" : \"sessions\"}\n </span>\n </header>\n ) : null}\n <ul className=\"divide-y divide-border/30\">\n {sessions.map((s) => {\n const RowTag = onOpen ? \"button\" : \"div\";\n return (\n <li key={s.id}>\n <RowTag\n type={onOpen ? \"button\" : undefined}\n onClick={onOpen ? () => onOpen(s.id) : undefined}\n className={cn(\n \"grid w-full grid-cols-[1fr_auto] items-center gap-3 px-4 py-3 text-left\",\n onOpen &&\n \"hover:bg-muted/40 focus-visible:bg-muted/40 focus-visible:outline-none\",\n )}\n >\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <p className=\"truncate font-medium text-body-sm text-foreground\">{s.title}</p>\n <span\n className={cn(\n \"inline-flex shrink-0 items-center rounded-full border px-2 py-0.5\",\n \"font-mono text-label uppercase tracking-wider\",\n STATUS_CLASS[s.status],\n )}\n >\n {STATUS_LABEL[s.status]}\n </span>\n </div>\n <div className=\"mt-1 flex flex-wrap items-center gap-3 font-mono text-label text-muted-foreground\">\n <span className=\"inline-flex items-center gap-1\">\n <Clock className=\"size-3\" aria-hidden=\"true\" /> {s.startedAt}\n {s.duration ? <> · {s.duration}</> : null}\n </span>\n {s.model ? (\n <span className=\"inline-flex items-center gap-1\">\n <Sparkles className=\"size-3\" aria-hidden=\"true\" /> {s.model}\n </span>\n ) : null}\n {s.tokens ? (\n <span className=\"inline-flex items-center gap-1\">\n <Coins className=\"size-3\" aria-hidden=\"true\" /> {s.tokens} tok\n </span>\n ) : null}\n {s.cost !== undefined ? (\n <span className=\"tabular-nums\">${s.cost.toFixed(2)}</span>\n ) : null}\n {s.messageCount !== undefined ? (\n <span className=\"inline-flex items-center gap-1\">\n <MessageSquare className=\"size-3\" aria-hidden=\"true\" /> {s.messageCount}\n </span>\n ) : null}\n </div>\n </div>\n {onOpen ? (\n <ChevronRight\n className=\"size-4 shrink-0 text-muted-foreground\"\n aria-hidden=\"true\"\n />\n ) : null}\n </RowTag>\n </li>\n );\n })}\n {sessions.length === 0 ? (\n <li className=\"px-4 py-8 text-center font-sans text-body-sm text-muted-foreground\">\n No sessions yet.\n </li>\n ) : null}\n </ul>\n </section>\n ),\n);\nSessionTimeline.displayName = \"SessionTimeline\";\n\nexport { SessionTimeline };\n"]}
|