Remove Storybook + unused components (#4517)

This commit is contained in:
Chris Estreich 2025-06-10 14:29:39 -07:00 committed by GitHub
parent 243a07e98c
commit c03869bf1e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
33 changed files with 10 additions and 1801 deletions

View file

@ -1,29 +1,25 @@
{
"$schema": "https://unpkg.com/knip@latest/schema.json",
"entry": ["src/extension.ts", "src/activate/index.ts", "webview-ui/src/index.tsx"],
"project": ["src/**/*.ts", "webview-ui/src/**/*.{ts,tsx}"],
"ignore": [
"**/__mocks__/**",
"**/__tests__/**",
"**/test/**",
"**/*.test.ts",
"**/*.test.tsx",
"**/stories/**",
"bin/**",
"apps/vscode-e2e/**",
"packages/evals/**",
"src/extension/**",
"src/extension/api.ts",
"src/activate/**",
"src/workers/**",
"src/schemas/ipc.ts",
"src/workers/countTokens.ts",
"src/extension.ts",
"scripts/**",
"vitest.config.ts"
"scripts/**"
],
"workspaces": {
"src": {
"entry": ["extension.ts"],
"project": ["**/*.ts"]
},
"webview-ui": {
"entry": ["src/index.tsx"],
"project": ["src/**/*.{ts,tsx}"]
},
"packages/{build,cloud,evals,ipc,telemetry,types}": {
"project": ["src/**/*.ts"]
}
}
}

626
pnpm-lock.yaml generated
View file

@ -1067,18 +1067,6 @@ importers:
'@roo-code/config-typescript':
specifier: workspace:^
version: link:../packages/config-typescript
'@storybook/addon-essentials':
specifier: ^8.5.6
version: 8.6.12(@types/react@18.3.23)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))
'@storybook/blocks':
specifier: ^8.5.6
version: 8.6.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))
'@storybook/react':
specifier: ^9.0.0
version: 9.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3)
'@storybook/react-vite':
specifier: ^9.0.0
version: 9.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.40.2)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3)(vite@6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0))
'@testing-library/jest-dom':
specifier: ^6.6.3
version: 6.6.3
@ -1124,12 +1112,6 @@ importers:
jest-simple-dot-reporter:
specifier: ^1.0.5
version: 1.0.5
storybook:
specifier: ^9.0.0
version: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)
storybook-dark-mode:
specifier: ^4.0.2
version: 4.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))
ts-jest:
specifier: ^29.2.5
version: 29.3.3(@babel/core@7.27.1)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.1))(esbuild@0.25.5)(jest@29.7.0(@types/node@18.19.100)(babel-plugin-macros@3.1.0))(typescript@5.8.3)
@ -2370,15 +2352,6 @@ packages:
resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
'@joshwooding/vite-plugin-react-docgen-typescript@0.6.0':
resolution: {integrity: sha512-dPo6SE4dm8UKcgGg4LsV9iw6f5HkIeJwzMA2M2Lb+mhl5vxesbDvb3ENTzNTkGnOxS6PqJig2pfXdtYaW3S9fg==}
peerDependencies:
typescript: '>= 4.3.x'
vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0
peerDependenciesMeta:
typescript:
optional: true
'@jridgewell/gen-mapping@0.3.8':
resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
engines: {node: '>=6.0.0'}
@ -2474,12 +2447,6 @@ packages:
resolution: {integrity: sha512-LyQz4XJIdCdY/+temIhD/Ed0x/p4GAOUycpFSEK2Ads1CPKZy6b7V/2ROEtQiLLQ8soIs0xe/QAoR6kwpyW/yw==}
engines: {node: '>=12'}
'@mdx-js/react@3.1.0':
resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==}
peerDependencies:
'@types/react': '>=16'
react: '>=16'
'@mermaid-js/parser@0.4.0':
resolution: {integrity: sha512-wla8XOWvQAwuqy+gxiZqY+c7FokraOTHRWMsbB4AgRx9Sy7zKslNyejy7E+a77qHfey5GXw/ik3IXv/NHMJgaA==}
@ -3381,15 +3348,6 @@ packages:
peerDependencies:
'@redis/client': ^5.5.5
'@rollup/pluginutils@5.1.4':
resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==}
engines: {node: '>=14.0.0'}
peerDependencies:
rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
peerDependenciesMeta:
rollup:
optional: true
'@rollup/rollup-android-arm-eabi@4.40.2':
resolution: {integrity: sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==}
cpu: [arm]
@ -3842,149 +3800,6 @@ packages:
'@standard-schema/utils@0.3.0':
resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==}
'@storybook/addon-actions@8.6.12':
resolution: {integrity: sha512-B5kfiRvi35oJ0NIo53CGH66H471A3XTzrfaa6SxXEJsgxxSeKScG5YeXcCvLiZfvANRQ7QDsmzPUgg0o3hdMXw==}
peerDependencies:
storybook: ^8.6.12
'@storybook/addon-backgrounds@8.6.12':
resolution: {integrity: sha512-lmIAma9BiiCTbJ8YfdZkXjpnAIrOUcgboLkt1f6XJ78vNEMnLNzD9gnh7Tssz1qrqvm34v9daDjIb+ggdiKp3Q==}
peerDependencies:
storybook: ^8.6.12
'@storybook/addon-controls@8.6.12':
resolution: {integrity: sha512-9VSRPJWQVb9wLp21uvpxDGNctYptyUX0gbvxIWOHMH3R2DslSoq41lsC/oQ4l4zSHVdL+nq8sCTkhBxIsjKqdQ==}
peerDependencies:
storybook: ^8.6.12
'@storybook/addon-docs@8.6.12':
resolution: {integrity: sha512-kEezQjAf/p3SpDzLABgg4fbT48B6dkT2LiZCKTRmCrJVtuReaAr4R9MMM6Jsph6XjbIj/SvOWf3CMeOPXOs9sg==}
peerDependencies:
storybook: ^8.6.12
'@storybook/addon-essentials@8.6.12':
resolution: {integrity: sha512-Y/7e8KFlttaNfv7q2zoHMPdX6hPXHdsuQMAjYl5NG9HOAJREu4XBy4KZpbcozRe4ApZ78rYsN/MO1EuA+bNMIA==}
peerDependencies:
storybook: ^8.6.12
'@storybook/addon-highlight@8.6.12':
resolution: {integrity: sha512-9FITVxdoycZ+eXuAZL9ElWyML/0fPPn9UgnnAkrU7zkMi+Segq/Tx7y+WWanC5zfWZrXAuG6WTOYEXeWQdm//w==}
peerDependencies:
storybook: ^8.6.12
'@storybook/addon-measure@8.6.12':
resolution: {integrity: sha512-tACmwqqOvutaQSduw8SMb62wICaT1rWaHtMN3vtWXuxgDPSdJQxLP+wdVyRYMAgpxhLyIO7YRf++Hfha9RHgFg==}
peerDependencies:
storybook: ^8.6.12
'@storybook/addon-outline@8.6.12':
resolution: {integrity: sha512-1ylwm+n1s40S91No0v9T4tCjZORu3GbnjINlyjYTDLLhQHyBQd3nWR1Y1eewU4xH4cW9SnSLcMQFS/82xHqU6A==}
peerDependencies:
storybook: ^8.6.12
'@storybook/addon-toolbars@8.6.12':
resolution: {integrity: sha512-HEcSzo1DyFtIu5/ikVOmh5h85C1IvK9iFKSzBR6ice33zBOaehVJK+Z5f487MOXxPsZ63uvWUytwPyViGInj+g==}
peerDependencies:
storybook: ^8.6.12
'@storybook/addon-viewport@8.6.12':
resolution: {integrity: sha512-EXK2LArAnABsPP0leJKy78L/lbMWow+EIJfytEP5fHaW4EhMR6h7Hzaqzre6U0IMMr/jVFa1ci+m0PJ0eQc2bw==}
peerDependencies:
storybook: ^8.6.12
'@storybook/blocks@8.6.12':
resolution: {integrity: sha512-DohlTq6HM1jDbHYiXL4ZvZ00VkhpUp5uftzj/CZDLY1fYHRjqtaTwWm2/OpceivMA8zDitLcq5atEZN+f+siTg==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
storybook: ^8.6.12
peerDependenciesMeta:
react:
optional: true
react-dom:
optional: true
'@storybook/builder-vite@9.0.5':
resolution: {integrity: sha512-mr2IqmNmlCWQCxorglo2diGcCIDwaZEJWG6noWkMPW6ri/Nh4y8DQYbK7hUK3O3sGLdV4QfTPCbRPGgMtBb07g==}
peerDependencies:
storybook: ^9.0.5
vite: ^5.0.0 || ^6.0.0
'@storybook/components@8.6.12':
resolution: {integrity: sha512-FiaE8xvCdvKC2arYusgtlDNZ77b8ysr8njAYQZwwaIHjy27TbR2tEpLDCmUwSbANNmivtc/xGEiDDwcNppMWlQ==}
peerDependencies:
storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
'@storybook/core-events@8.6.12':
resolution: {integrity: sha512-j2MUlSfYOhTsjlruRWTqSVwYreJGFIsWeqHFAhCdtmXe3qpFBM/LuxTKuaM1uWvs6vEAyGEzDw8+DXwuO6uISg==}
peerDependencies:
storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
'@storybook/csf-plugin@8.6.12':
resolution: {integrity: sha512-6s8CnP1aoKPb3XtC0jRLUp8M5vTA8RhGAwQDKUsFpCC7g89JR9CaKs9FY2ZSzsNbjR15uASi7b3K8BzeYumYQg==}
peerDependencies:
storybook: ^8.6.12
'@storybook/csf-plugin@9.0.5':
resolution: {integrity: sha512-dO+2J3GlIK1pRpXVL9CXhENwmaF0bF6jji+MtUXRHooHtbgtogaTGlYffBnIojuXHnskR6BAaMUPPLVOVY6Ctw==}
peerDependencies:
storybook: ^9.0.5
'@storybook/global@5.0.0':
resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==}
'@storybook/icons@1.4.0':
resolution: {integrity: sha512-Td73IeJxOyalzvjQL+JXx72jlIYHgs+REaHiREOqfpo3A2AYYG71AUbcv+lg7mEDIweKVCxsMQ0UKo634c8XeA==}
engines: {node: '>=14.0.0'}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
'@storybook/manager-api@8.6.12':
resolution: {integrity: sha512-O0SpISeJLNTQvhSBOsWzzkCgs8vCjOq1578rwqHlC6jWWm4QmtfdyXqnv7rR1Hk08kQ+Dzqh0uhwHx0nfwy4nQ==}
peerDependencies:
storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
'@storybook/react-dom-shim@8.6.12':
resolution: {integrity: sha512-51QvoimkBzYs8s3rCYnY5h0cFqLz/Mh0vRcughwYaXckWzDBV8l67WBO5Xf5nBsukCbWyqBVPpEQLww8s7mrLA==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
storybook: ^8.6.12
'@storybook/react-dom-shim@9.0.5':
resolution: {integrity: sha512-lMlYoiuJJm9UcUPYYkVNtJu8Xv23fMKqf0k0SF3JB/efaSiaiCNR+fH2g81FrdntOkfFU3YWQ8DUY5TYH73HeA==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
storybook: ^9.0.5
'@storybook/react-vite@9.0.5':
resolution: {integrity: sha512-FZH7T+hfoS8DMLICfX8E/LDPjrBTHmKvH4dZALZniVKlH0ML2w4ru9M+Lt0w2aPP2NPemnPiPH3aajIQjofY3Q==}
engines: {node: '>=20.0.0'}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
storybook: ^9.0.5
vite: ^5.0.0 || ^6.0.0
'@storybook/react@9.0.5':
resolution: {integrity: sha512-qBEUaiGd1d2SQllhcMrBwwnzwWJWHw5XiTeq5MsjkEy2Oqfm7kWqTdGSkMbW/MoeFX5foO+Mu7nLqM9s4GxNXg==}
engines: {node: '>=20.0.0'}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
storybook: ^9.0.5
typescript: '>= 4.9.x'
peerDependenciesMeta:
typescript:
optional: true
'@storybook/theming@8.6.12':
resolution: {integrity: sha512-6VjZg8HJ2Op7+KV7ihJpYrDnFtd9D1jrQnUS8LckcpuBXrIEbaut5+34ObY8ssQnSqkk2GwIZBBBQYQBCVvkOw==}
peerDependencies:
storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
'@swc/counter@0.1.3':
resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
@ -4355,9 +4170,6 @@ packages:
'@types/diff@5.2.3':
resolution: {integrity: sha512-K0Oqlrq3kQMaO2RhfrNQX5trmt+XLyom88zS0u84nnIcLvFnRUMRRHmrGny5GSM+kNO9IZLARsdQHDzkhAgmrQ==}
'@types/doctrine@0.0.9':
resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==}
'@types/estree-jsx@1.0.5':
resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
@ -4412,9 +4224,6 @@ packages:
'@types/mdast@4.0.4':
resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
'@types/mdx@2.0.13':
resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==}
'@types/minimatch@5.1.2':
resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==}
@ -4469,9 +4278,6 @@ packages:
'@types/react@18.3.23':
resolution: {integrity: sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==}
'@types/resolve@1.20.6':
resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==}
'@types/shell-quote@1.7.5':
resolution: {integrity: sha512-+UE8GAGRPbJVQDdxi16dgadcBfQ+KG2vgZhV1+3A1XmHbmwcdwhCUwIdy+d3pAGrbvgRoVSjeI9vOWyq376Yzw==}
@ -4586,9 +4392,6 @@ packages:
peerDependencies:
vite: ^4.2.0 || ^5.0.0 || ^6.0.0
'@vitest/expect@3.0.9':
resolution: {integrity: sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==}
'@vitest/expect@3.1.3':
resolution: {integrity: sha512-7FTQQuuLKmN1Ig/h+h/GO+44Q1IlglPlR2es4ab7Yvfx+Uk5xsv+Ykk+MEt/M2Yn/xGmzaLKxGw2lgy2bwuYqg==}
@ -4631,9 +4434,6 @@ packages:
vite:
optional: true
'@vitest/pretty-format@3.0.9':
resolution: {integrity: sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==}
'@vitest/pretty-format@3.1.3':
resolution: {integrity: sha512-i6FDiBeJUGLDKADw2Gb01UtUNb12yyXAqC/mmRWuYl+m/U9GS7s8us5ONmGkGpUUo7/iAYzI2ePVfOZTYvUifA==}
@ -4661,9 +4461,6 @@ packages:
'@vitest/snapshot@3.2.1':
resolution: {integrity: sha512-5xko/ZpW2Yc65NVK9Gpfg2y4BFvcF+At7yRT5AHUpTg9JvZ4xZoyuRY4ASlmNcBZjMslV08VRLDrBOmUe2YX3g==}
'@vitest/spy@3.0.9':
resolution: {integrity: sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==}
'@vitest/spy@3.1.3':
resolution: {integrity: sha512-x6w+ctOEmEXdWaa6TO4ilb7l9DxPR5bwEb6hILKuxfU1NqWT2mpJD9NJN7t3OTfxmVlOMrvtoFJGdgyzZ605lQ==}
@ -4673,9 +4470,6 @@ packages:
'@vitest/spy@3.2.1':
resolution: {integrity: sha512-Nbfib34Z2rfcJGSetMxjDCznn4pCYPZOtQYox2kzebIJcgH75yheIKd5QYSFmR8DIZf2M8fwOm66qSDIfRFFfQ==}
'@vitest/utils@3.0.9':
resolution: {integrity: sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==}
'@vitest/utils@3.1.3':
resolution: {integrity: sha512-2Ltrpht4OmHO9+c/nmHtF09HWiyWdworqnHIwjfvDyWjuwKbdkcS9AnhsDn+8E2RM4x++foD1/tNuLPVvWG1Rg==}
@ -4918,10 +4712,6 @@ packages:
resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==}
engines: {node: '>=4'}
ast-types@0.16.1:
resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==}
engines: {node: '>=4'}
async-function@1.0.0:
resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
engines: {node: '>= 0.4'}
@ -5030,10 +4820,6 @@ packages:
resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==}
engines: {node: '>=10.0.0'}
better-opn@3.0.2:
resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==}
engines: {node: '>=12.0.0'}
better-path-resolve@1.0.0:
resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==}
engines: {node: '>=4'}
@ -5770,10 +5556,6 @@ packages:
resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
engines: {node: '>= 0.4'}
define-lazy-prop@2.0.0:
resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
engines: {node: '>=8'}
define-lazy-prop@3.0.0:
resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==}
engines: {node: '>=12'}
@ -5858,10 +5640,6 @@ packages:
resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
engines: {node: '>=0.10.0'}
doctrine@3.0.0:
resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
engines: {node: '>=6.0.0'}
dom-accessibility-api@0.5.16:
resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
@ -6295,9 +6073,6 @@ packages:
estree-util-is-identifier-name@3.0.0:
resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==}
estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
estree-walker@3.0.3:
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
@ -7065,11 +6840,6 @@ packages:
is-decimal@2.0.1:
resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==}
is-docker@2.2.1:
resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
engines: {node: '>=8'}
hasBin: true
is-docker@3.0.0:
resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@ -7227,10 +6997,6 @@ packages:
resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
engines: {node: '>=0.10.0'}
is-wsl@2.2.0:
resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
engines: {node: '>=8'}
is-wsl@3.1.0:
resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==}
engines: {node: '>=16'}
@ -7605,7 +7371,6 @@ packages:
libsql@0.5.12:
resolution: {integrity: sha512-TikiQZ1j4TwFEqVdJdTM9ZTti28is/ytGEvn0S2MocOj69UKQetWACe/qd8KAD5VeNnQSVd6Nlm2AJx0DFW9Ag==}
cpu: [x64, arm64, wasm32, arm]
os: [darwin, linux, win32]
lie@3.3.0:
@ -7896,9 +7661,6 @@ packages:
engines: {node: '>=12.0.0'}
hasBin: true
map-or-similar@1.5.0:
resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==}
map-stream@0.1.0:
resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==}
@ -7988,9 +7750,6 @@ packages:
resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==}
engines: {node: '>= 0.8'}
memoizerific@1.11.3:
resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==}
memorystream@0.3.1:
resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==}
engines: {node: '>= 0.10.0'}
@ -8428,10 +8187,6 @@ packages:
resolution: {integrity: sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==}
engines: {node: '>=18'}
open@8.4.2:
resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
engines: {node: '>=12'}
openai@4.103.0:
resolution: {integrity: sha512-eWcz9kdurkGOFDtd5ySS5y251H2uBgq9+1a2lTBnjMMzlexJ40Am5t6Mu76SSE87VvitPa0dkIAp75F+dZVC0g==}
hasBin: true
@ -8690,10 +8445,6 @@ packages:
points-on-path@0.2.1:
resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==}
polished@4.3.1:
resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==}
engines: {node: '>=10'}
possible-typed-array-names@1.1.0:
resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
engines: {node: '>= 0.4'}
@ -8936,15 +8687,6 @@ packages:
resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
hasBin: true
react-docgen-typescript@2.2.2:
resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==}
peerDependencies:
typescript: '>= 4.3.x'
react-docgen@8.0.0:
resolution: {integrity: sha512-kmob/FOTwep7DUWf9KjuenKX0vyvChr3oTdvvPt09V60Iz75FJp+T/0ZeHMbAfJj2WaVWqAPP5Hmm3PYzSPPKg==}
engines: {node: ^20.9.0 || >=22}
react-dom@18.3.1:
resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
peerDependencies:
@ -9105,10 +8847,6 @@ packages:
resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
engines: {node: '>= 14.18.0'}
recast@0.23.11:
resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==}
engines: {node: '>= 4'}
recharts-scale@0.4.5:
resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==}
@ -9538,18 +9276,6 @@ packages:
resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==}
engines: {node: '>=18'}
storybook-dark-mode@4.0.2:
resolution: {integrity: sha512-zjcwwQ01R5t1VsakA6alc2JDIRVtavryW8J3E3eKLDIlAMcvsgtpxlelWkZs2cuNspk6Z10XzhQVrUWtYc3F0w==}
storybook@9.0.5:
resolution: {integrity: sha512-4RIyN7P6R6umcgAB6jv3GSIDA0qw9iRcm3KnIR6VhLKLKlbbmDsUs/JmjLobxL5W+LB4zbCbrBcFsW7AL2MSyA==}
hasBin: true
peerDependencies:
prettier: ^2 || ^3
peerDependenciesMeta:
prettier:
optional: true
stream-combiner@0.0.4:
resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==}
@ -9654,10 +9380,6 @@ packages:
resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
engines: {node: '>=8'}
strip-indent@4.0.0:
resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==}
engines: {node: '>=12'}
strip-json-comments@2.0.1:
resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
engines: {node: '>=0.10.0'}
@ -9959,10 +9681,6 @@ packages:
esbuild:
optional: true
tsconfig-paths@4.2.0:
resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==}
engines: {node: '>=6'}
tslib@1.14.1:
resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
@ -10201,10 +9919,6 @@ packages:
resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
engines: {node: '>= 0.8'}
unplugin@1.16.1:
resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==}
engines: {node: '>=14.0.0'}
untildify@4.0.0:
resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==}
engines: {node: '>=8'}
@ -10533,9 +10247,6 @@ packages:
resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
engines: {node: '>=12'}
webpack-virtual-modules@0.6.2:
resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
whatwg-encoding@2.0.0:
resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==}
engines: {node: '>=12'}
@ -12394,15 +12105,6 @@ snapshots:
'@types/yargs': 17.0.33
chalk: 4.1.2
'@joshwooding/vite-plugin-react-docgen-typescript@0.6.0(typescript@5.8.3)(vite@6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0))':
dependencies:
glob: 10.4.5
magic-string: 0.30.17
react-docgen-typescript: 2.2.2(typescript@5.8.3)
vite: 6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0)
optionalDependencies:
typescript: 5.8.3
'@jridgewell/gen-mapping@0.3.8':
dependencies:
'@jridgewell/set-array': 1.2.1
@ -12510,12 +12212,6 @@ snapshots:
dependencies:
unist-util-visit: 1.4.1
'@mdx-js/react@3.1.0(@types/react@18.3.23)(react@18.3.1)':
dependencies:
'@types/mdx': 2.0.13
'@types/react': 18.3.23
react: 18.3.1
'@mermaid-js/parser@0.4.0':
dependencies:
langium: 3.3.1
@ -13392,14 +13088,6 @@ snapshots:
dependencies:
'@redis/client': 5.5.5
'@rollup/pluginutils@5.1.4(rollup@4.40.2)':
dependencies:
'@types/estree': 1.0.8
estree-walker: 2.0.2
picomatch: 4.0.2
optionalDependencies:
rollup: 4.40.2
'@rollup/rollup-android-arm-eabi@4.40.2':
optional: true
@ -13992,175 +13680,6 @@ snapshots:
'@standard-schema/utils@0.3.0': {}
'@storybook/addon-actions@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))':
dependencies:
'@storybook/global': 5.0.0
'@types/uuid': 9.0.8
dequal: 2.0.3
polished: 4.3.1
storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)
uuid: 9.0.1
'@storybook/addon-backgrounds@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))':
dependencies:
'@storybook/global': 5.0.0
memoizerific: 1.11.3
storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)
ts-dedent: 2.2.0
'@storybook/addon-controls@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))':
dependencies:
'@storybook/global': 5.0.0
dequal: 2.0.3
storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)
ts-dedent: 2.2.0
'@storybook/addon-docs@8.6.12(@types/react@18.3.23)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))':
dependencies:
'@mdx-js/react': 3.1.0(@types/react@18.3.23)(react@18.3.1)
'@storybook/blocks': 8.6.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))
'@storybook/csf-plugin': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))
'@storybook/react-dom-shim': 8.6.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)
ts-dedent: 2.2.0
transitivePeerDependencies:
- '@types/react'
'@storybook/addon-essentials@8.6.12(@types/react@18.3.23)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))':
dependencies:
'@storybook/addon-actions': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))
'@storybook/addon-backgrounds': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))
'@storybook/addon-controls': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))
'@storybook/addon-docs': 8.6.12(@types/react@18.3.23)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))
'@storybook/addon-highlight': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))
'@storybook/addon-measure': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))
'@storybook/addon-outline': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))
'@storybook/addon-toolbars': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))
'@storybook/addon-viewport': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))
storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)
ts-dedent: 2.2.0
transitivePeerDependencies:
- '@types/react'
'@storybook/addon-highlight@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))':
dependencies:
'@storybook/global': 5.0.0
storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)
'@storybook/addon-measure@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))':
dependencies:
'@storybook/global': 5.0.0
storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)
tiny-invariant: 1.3.3
'@storybook/addon-outline@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))':
dependencies:
'@storybook/global': 5.0.0
storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)
ts-dedent: 2.2.0
'@storybook/addon-toolbars@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))':
dependencies:
storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)
'@storybook/addon-viewport@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))':
dependencies:
memoizerific: 1.11.3
storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)
'@storybook/blocks@8.6.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))':
dependencies:
'@storybook/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)
ts-dedent: 2.2.0
optionalDependencies:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
'@storybook/builder-vite@9.0.5(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))(vite@6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0))':
dependencies:
'@storybook/csf-plugin': 9.0.5(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))
storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)
ts-dedent: 2.2.0
vite: 6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0)
'@storybook/components@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))':
dependencies:
storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)
'@storybook/core-events@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))':
dependencies:
storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)
'@storybook/csf-plugin@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))':
dependencies:
storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)
unplugin: 1.16.1
'@storybook/csf-plugin@9.0.5(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))':
dependencies:
storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)
unplugin: 1.16.1
'@storybook/global@5.0.0': {}
'@storybook/icons@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
'@storybook/manager-api@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))':
dependencies:
storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)
'@storybook/react-dom-shim@8.6.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))':
dependencies:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)
'@storybook/react-dom-shim@9.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))':
dependencies:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)
'@storybook/react-vite@9.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.40.2)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3)(vite@6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0))':
dependencies:
'@joshwooding/vite-plugin-react-docgen-typescript': 0.6.0(typescript@5.8.3)(vite@6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0))
'@rollup/pluginutils': 5.1.4(rollup@4.40.2)
'@storybook/builder-vite': 9.0.5(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))(vite@6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0))
'@storybook/react': 9.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3)
find-up: 5.0.0
magic-string: 0.30.17
react: 18.3.1
react-docgen: 8.0.0
react-dom: 18.3.1(react@18.3.1)
resolve: 1.22.10
storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)
tsconfig-paths: 4.2.0
vite: 6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0)
transitivePeerDependencies:
- rollup
- supports-color
- typescript
'@storybook/react@9.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3)':
dependencies:
'@storybook/global': 5.0.0
'@storybook/react-dom-shim': 9.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)
optionalDependencies:
typescript: 5.8.3
'@storybook/theming@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))':
dependencies:
storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)
'@swc/counter@0.1.3': {}
'@swc/helpers@0.5.15':
@ -14532,8 +14051,6 @@ snapshots:
'@types/diff@5.2.3': {}
'@types/doctrine@0.0.9': {}
'@types/estree-jsx@1.0.5':
dependencies:
'@types/estree': 1.0.8
@ -14596,8 +14113,6 @@ snapshots:
dependencies:
'@types/unist': 3.0.3
'@types/mdx@2.0.13': {}
'@types/minimatch@5.1.2': {}
'@types/mocha@10.0.10': {}
@ -14655,8 +14170,6 @@ snapshots:
'@types/prop-types': 15.7.14
csstype: 3.1.3
'@types/resolve@1.20.6': {}
'@types/shell-quote@1.7.5': {}
'@types/stack-utils@2.0.3': {}
@ -14801,13 +14314,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@vitest/expect@3.0.9':
dependencies:
'@vitest/spy': 3.0.9
'@vitest/utils': 3.0.9
chai: 5.2.0
tinyrainbow: 2.0.0
'@vitest/expect@3.1.3':
dependencies:
'@vitest/spy': 3.1.3
@ -14863,10 +14369,6 @@ snapshots:
optionalDependencies:
vite: 6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0)
'@vitest/pretty-format@3.0.9':
dependencies:
tinyrainbow: 2.0.0
'@vitest/pretty-format@3.1.3':
dependencies:
tinyrainbow: 2.0.0
@ -14912,10 +14414,6 @@ snapshots:
magic-string: 0.30.17
pathe: 2.0.3
'@vitest/spy@3.0.9':
dependencies:
tinyspy: 3.0.2
'@vitest/spy@3.1.3':
dependencies:
tinyspy: 3.0.2
@ -14928,12 +14426,6 @@ snapshots:
dependencies:
tinyspy: 4.0.3
'@vitest/utils@3.0.9':
dependencies:
'@vitest/pretty-format': 3.0.9
loupe: 3.1.3
tinyrainbow: 2.0.0
'@vitest/utils@3.1.3':
dependencies:
'@vitest/pretty-format': 3.1.3
@ -15225,10 +14717,6 @@ snapshots:
dependencies:
tslib: 2.8.1
ast-types@0.16.1:
dependencies:
tslib: 2.8.1
async-function@1.0.0: {}
async-mutex@0.5.0:
@ -15365,10 +14853,6 @@ snapshots:
basic-ftp@5.0.5: {}
better-opn@3.0.2:
dependencies:
open: 8.4.2
better-path-resolve@1.0.0:
dependencies:
is-windows: 1.0.2
@ -16162,8 +15646,6 @@ snapshots:
es-errors: 1.3.0
gopd: 1.2.0
define-lazy-prop@2.0.0: {}
define-lazy-prop@3.0.0: {}
define-properties@1.2.1:
@ -16226,10 +15708,6 @@ snapshots:
dependencies:
esutils: 2.0.3
doctrine@3.0.0:
dependencies:
esutils: 2.0.3
dom-accessibility-api@0.5.16: {}
dom-accessibility-api@0.6.3: {}
@ -16765,8 +16243,6 @@ snapshots:
estree-util-is-identifier-name@3.0.0: {}
estree-walker@2.0.2: {}
estree-walker@3.0.3:
dependencies:
'@types/estree': 1.0.8
@ -17659,8 +17135,6 @@ snapshots:
is-decimal@2.0.1: {}
is-docker@2.2.1: {}
is-docker@3.0.0: {}
is-extglob@2.1.1: {}
@ -17785,10 +17259,6 @@ snapshots:
is-windows@1.0.2: {}
is-wsl@2.2.0:
dependencies:
is-docker: 2.2.1
is-wsl@3.1.0:
dependencies:
is-inside-container: 1.0.0
@ -18764,8 +18234,6 @@ snapshots:
underscore: 1.13.7
xmlbuilder: 10.1.1
map-or-similar@1.5.0: {}
map-stream@0.1.0: {}
markdown-it@14.1.0:
@ -18971,10 +18439,6 @@ snapshots:
media-typer@1.1.0: {}
memoizerific@1.11.3:
dependencies:
map-or-similar: 1.5.0
memorystream@0.3.1: {}
merge-descriptors@2.0.0: {}
@ -19540,12 +19004,6 @@ snapshots:
is-inside-container: 1.0.0
is-wsl: 3.1.0
open@8.4.2:
dependencies:
define-lazy-prop: 2.0.0
is-docker: 2.2.1
is-wsl: 2.2.0
openai@4.103.0(ws@8.18.2)(zod@3.24.4):
dependencies:
'@types/node': 18.19.100
@ -19835,10 +19293,6 @@ snapshots:
path-data-parser: 0.1.0
points-on-curve: 0.2.0
polished@4.3.1:
dependencies:
'@babel/runtime': 7.27.4
possible-typed-array-names@1.1.0: {}
postcss-import@15.1.0(postcss@8.5.4):
@ -20093,25 +19547,6 @@ snapshots:
minimist: 1.2.8
strip-json-comments: 2.0.1
react-docgen-typescript@2.2.2(typescript@5.8.3):
dependencies:
typescript: 5.8.3
react-docgen@8.0.0:
dependencies:
'@babel/core': 7.27.1
'@babel/traverse': 7.27.1
'@babel/types': 7.27.1
'@types/babel__core': 7.20.5
'@types/babel__traverse': 7.20.7
'@types/doctrine': 0.0.9
'@types/resolve': 1.20.6
doctrine: 3.0.0
resolve: 1.22.10
strip-indent: 4.0.0
transitivePeerDependencies:
- supports-color
react-dom@18.3.1(react@18.3.1):
dependencies:
loose-envify: 1.4.0
@ -20307,14 +19742,6 @@ snapshots:
readdirp@4.1.2: {}
recast@0.23.11:
dependencies:
ast-types: 0.16.1
esprima: 4.0.1
source-map: 0.6.1
tiny-invariant: 1.3.3
tslib: 2.8.1
recharts-scale@0.4.5:
dependencies:
decimal.js-light: 2.5.1
@ -20869,42 +20296,6 @@ snapshots:
stdin-discarder@0.2.2: {}
storybook-dark-mode@4.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)):
dependencies:
'@storybook/components': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))
'@storybook/core-events': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))
'@storybook/global': 5.0.0
'@storybook/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@storybook/manager-api': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))
'@storybook/theming': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))
fast-deep-equal: 3.1.3
memoizerific: 1.11.3
transitivePeerDependencies:
- react
- react-dom
- storybook
storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3):
dependencies:
'@storybook/global': 5.0.0
'@testing-library/jest-dom': 6.6.3
'@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0)
'@vitest/expect': 3.0.9
'@vitest/spy': 3.0.9
better-opn: 3.0.2
esbuild: 0.25.5
esbuild-register: 3.6.0(esbuild@0.25.5)
recast: 0.23.11
semver: 7.7.2
ws: 8.18.2
optionalDependencies:
prettier: 3.5.3
transitivePeerDependencies:
- '@testing-library/dom'
- bufferutil
- supports-color
- utf-8-validate
stream-combiner@0.0.4:
dependencies:
duplexer: 0.1.2
@ -21030,10 +20421,6 @@ snapshots:
dependencies:
min-indent: 1.0.1
strip-indent@4.0.0:
dependencies:
min-indent: 1.0.1
strip-json-comments@2.0.1: {}
strip-json-comments@3.1.1: {}
@ -21356,12 +20743,6 @@ snapshots:
babel-jest: 29.7.0(@babel/core@7.27.1)
esbuild: 0.25.5
tsconfig-paths@4.2.0:
dependencies:
json5: 2.2.3
minimist: 1.2.8
strip-bom: 3.0.0
tslib@1.14.1: {}
tslib@2.6.2: {}
@ -21630,11 +21011,6 @@ snapshots:
unpipe@1.0.0: {}
unplugin@1.16.1:
dependencies:
acorn: 8.15.0
webpack-virtual-modules: 0.6.2
untildify@4.0.0: {}
update-browserslist-db@1.1.3(browserslist@4.24.5):
@ -22127,8 +21503,6 @@ snapshots:
webidl-conversions@7.0.0: {}
webpack-virtual-modules@0.6.2: {}
whatwg-encoding@2.0.0:
dependencies:
iconv-lite: 0.6.3

View file

@ -1,11 +0,0 @@
import type { StorybookConfig } from "@storybook/react-vite"
const config: StorybookConfig = {
stories: ["../src/**/*.mdx", "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"],
addons: ["@storybook/addon-essentials", "storybook-dark-mode"],
framework: {
name: "@storybook/react-vite",
options: {},
},
}
export default config

View file

@ -1,17 +0,0 @@
import type { Preview } from "@storybook/react"
import "./vscode.css"
import "../src/index.css"
const preview: Preview = {
parameters: {
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/i,
},
},
},
}
export default preview

View file

@ -1,56 +0,0 @@
/**
* Use `Developer: Generate Color Theme From Current Settings` to generate themes
* using your current VSCode settings.
*
* See: https://code.visualstudio.com/docs/getstarted/themes
*/
:root {
/**
* The styles below have been defined for Tailwind.
*/
--vscode-foreground: #d1d5da; /* "foreground" */
--vscode-editor-foreground: #e1e4e8; /* "editor.foreground" */
--vscode-editor-background: #24292e; /* "editor.background" */
--vscode-button-foreground: #dcffe4; /* "button.foreground" */
--vscode-button-background: #176f2c; /* "button.background" */
--vscode-button-secondaryForeground: #ffffff; /* "button.secondaryForeground" */
--vscode-button-secondaryBackground: #444d56; /* "button.secondaryBackground" */
--vscode-dropdown-foreground: #e1e4e8; /* "dropdown.foreground" */
--vscode-dropdown-background: #2f363d; /* "dropdown.background" */
--vscode-dropdown-border: #1b1f23; /* "dropdown.border" */
--vscode-input-foreground: #e1e4e8; /* "input.foreground" */
--vscode-input-background: #2f363d; /* "input.background" */
--vscode-input-border: #1b1f23; /* "input.border" */
--vscode-focusBorder: #005cc5; /* "focusBorder" */
--vscode-badge-foreground: #c8e1ff; /* "badge.foreground" */
--vscode-badge-background: #044289; /* "badge.background" */
--vscode-notifications-foreground: #e1e4e8; /* "notifications.foreground" */
--vscode-notifications-background: #2f363d; /* "notifications.background" */
--vscode-notifications-border: #1b1f23; /* "notifications.border" */
--vscode-descriptionForeground: #959da5; /* "descriptionForeground" */
--vscode-errorForeground: #f97583; /* "errorForeground" */
--vscode-list-hoverForeground: #e1e4e8; /* "list.hoverForeground" */
--vscode-list-hoverBackground: #282e34; /* "list.hoverBackground" */
--vscode-list-focusBackground: #044289; /* "list.focusBackground" */
/**
* The styles below are used in the @shadcn/ui + Tailwind theme but are
* not exposed as `--color-vscode-*` variables.
*/
--vscode-menu-background: #2f363d; /* "menu.background" [MISSING] */
--vscode-menu-foreground: #e1e4e8; /* "menu.foreground" [MISSING] */
--vscode-disabledForeground: #cccccc; /* "disabledForeground" [MISSING] */
}

View file

@ -12,8 +12,6 @@
"build": "tsc -b && vite build",
"build:nightly": "tsc -b && vite build --mode nightly",
"preview": "vite preview",
"storybook": "storybook dev -p 6006",
"build-storybook": "storybook build",
"clean": "rimraf ../src/webview-ui/build ../apps/vscode-nightly/build/webview-ui tsconfig.tsbuildinfo .turbo"
},
"dependencies": {
@ -80,10 +78,6 @@
"@jest/globals": "^29.7.0",
"@roo-code/config-eslint": "workspace:^",
"@roo-code/config-typescript": "workspace:^",
"@storybook/addon-essentials": "^8.5.6",
"@storybook/blocks": "^8.5.6",
"@storybook/react": "^9.0.0",
"@storybook/react-vite": "^9.0.0",
"@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^16.2.0",
"@testing-library/user-event": "^14.6.1",
@ -99,8 +93,6 @@
"jest": "^29.7.0",
"jest-environment-jsdom": "^29.7.0",
"jest-simple-dot-reporter": "^1.0.5",
"storybook": "^9.0.0",
"storybook-dark-mode": "^4.0.2",
"ts-jest": "^29.2.5",
"typescript": "5.8.3",
"vite": "6.3.5"

View file

@ -1,29 +0,0 @@
import { HTMLAttributes } from "react"
import { cn } from "@/lib/utils"
import { ChatHandler } from "./types"
import { ChatProvider } from "./ChatProvider"
import { ChatMessages } from "./ChatMessages"
import { ChatInput } from "./ChatInput"
type ChatProps = HTMLAttributes<HTMLDivElement> & {
assistantName: string
handler: ChatHandler
}
export const Chat = ({ assistantName, handler, ...props }: ChatProps) => (
<ChatProvider value={{ assistantName, ...handler }}>
<InnerChat {...props} />
</ChatProvider>
)
type InnerChatProps = HTMLAttributes<HTMLDivElement>
const InnerChat = ({ className, children, ...props }: InnerChatProps) => (
<div className={cn("relative flex flex-col flex-1 min-h-0", className)} {...props}>
<ChatMessages />
{children}
<ChatInput />
</div>
)

View file

@ -1,100 +0,0 @@
import { PaperPlaneIcon, StopIcon } from "@radix-ui/react-icons"
import { Button, AutosizeTextarea } from "@/components/ui"
import { ChatInputProvider } from "./ChatInputProvider"
import { useChatUI } from "./useChatUI"
import { useChatInput } from "./useChatInput"
export function ChatInput() {
const { input, setInput, append, isLoading } = useChatUI()
const isDisabled = isLoading || !input.trim()
const submit = async () => {
if (input.trim() === "") {
return
}
setInput("")
await append({ role: "user", content: input })
}
const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault()
await submit()
}
const handleKeyDown = async (e: React.KeyboardEvent<HTMLTextAreaElement>) => {
if (isDisabled) {
return
}
if (e.key === "Enter" && !e.shiftKey) {
e.preventDefault()
await submit()
}
}
return (
<ChatInputProvider value={{ isDisabled, handleKeyDown, handleSubmit }}>
<div className="border-t border-vscode-editor-background p-3">
<ChatInputForm />
</div>
</ChatInputProvider>
)
}
function ChatInputForm() {
const { handleSubmit } = useChatInput()
return (
<form onSubmit={handleSubmit} className="relative">
<ChatInputField />
<ChatInputSubmit />
</form>
)
}
interface ChatInputFieldProps {
placeholder?: string
}
function ChatInputField({ placeholder = "Chat" }: ChatInputFieldProps) {
const { input, setInput } = useChatUI()
const { handleKeyDown } = useChatInput()
return (
<AutosizeTextarea
name="input"
placeholder={placeholder}
minHeight={75}
maxHeight={200}
value={input}
onChange={({ target: { value } }) => setInput(value)}
onKeyDown={handleKeyDown}
className="resize-none px-3 pt-3 pb-[50px]"
/>
)
}
function ChatInputSubmit() {
const { isLoading, stop } = useChatUI()
const { isDisabled } = useChatInput()
const isStoppable = isLoading && !!stop
return (
<div className="absolute bottom-[1px] left-[1px] right-[1px] h-[40px] bg-input border-t border-vscode-editor-background rounded-b-md p-1">
<div className="flex flex-row-reverse items-center gap-2">
{isStoppable ? (
<Button type="button" variant="ghost" size="sm" onClick={stop}>
<StopIcon className="text-destructive" />
</Button>
) : (
<Button type="submit" variant="ghost" size="icon" disabled={isDisabled}>
<PaperPlaneIcon />
</Button>
)}
</div>
</div>
)
}

View file

@ -1,11 +0,0 @@
import { createContext } from "react"
interface ChatInputContext {
isDisabled: boolean
handleKeyDown: (e: React.KeyboardEvent<HTMLTextAreaElement>) => void
handleSubmit: (e: React.FormEvent<HTMLFormElement>) => void
}
export const chatInputContext = createContext<ChatInputContext | null>(null)
export const ChatInputProvider = chatInputContext.Provider

View file

@ -1,105 +0,0 @@
import { useMemo } from "react"
import { CopyIcon, CheckIcon } from "@radix-ui/react-icons"
import { BrainCircuit, CircleUserRound } from "lucide-react"
import { cn } from "@/lib/utils"
import { useClipboard } from "@/components/ui/hooks"
import { Badge } from "@/components/ui"
import { Markdown } from "@/components/ui/markdown"
import { BadgeData, ChatHandler, Message, MessageAnnotationType } from "./types"
import { ChatMessageProvider } from "./ChatMessageProvider"
import { useChatUI } from "./useChatUI"
import { useChatMessage } from "./useChatMessage"
interface ChatMessageProps {
message: Message
isLast: boolean
isHeaderVisible: boolean
isLoading?: boolean
append?: ChatHandler["append"]
}
export function ChatMessage({ message, isLast, isHeaderVisible }: ChatMessageProps) {
const badges = useMemo(
() =>
message.annotations
?.filter(({ type }) => type === MessageAnnotationType.BADGE)
.map(({ data }) => data as BadgeData),
[message.annotations],
)
return (
<ChatMessageProvider value={{ message, isLast }}>
<div
className={cn("relative group flex flex-col text-secondary-foreground", {
"bg-vscode-input-background/50": message.role === "user",
})}>
{isHeaderVisible && <ChatMessageHeader badges={badges} />}
<ChatMessageContent isHeaderVisible={isHeaderVisible} />
<ChatMessageActions />
</div>
</ChatMessageProvider>
)
}
interface ChatMessageHeaderProps {
badges?: BadgeData[]
}
function ChatMessageHeader({ badges }: ChatMessageHeaderProps) {
return (
<div className="flex flex-row items-center justify-between border-t border-accent px-3 pt-3 pb-1">
<ChatMessageAvatar />
{badges?.map(({ label, variant = "outline" }) => (
<Badge variant={variant} key={label}>
{label}
</Badge>
))}
</div>
)
}
const icons: Record<string, React.ReactNode> = {
user: <CircleUserRound className="h-4 w-4" />,
assistant: <BrainCircuit className="h-4 w-4" />,
}
function ChatMessageAvatar() {
const { assistantName } = useChatUI()
const { message } = useChatMessage()
return icons[message.role] ? (
<div className="flex flex-row items-center gap-1">
<div className="opacity-25 select-none">{icons[message.role]}</div>
<div className="text-muted">{message.role === "user" ? "You" : assistantName}</div>
</div>
) : null
}
interface ChatMessageContentProps {
isHeaderVisible: boolean
}
function ChatMessageContent({ isHeaderVisible }: ChatMessageContentProps) {
const { message } = useChatMessage()
return (
<div className={cn("flex flex-col gap-4 flex-1 min-w-0 px-4 pb-6", { "pt-4": isHeaderVisible })}>
<Markdown content={message.content} />
</div>
)
}
function ChatMessageActions() {
const { message } = useChatMessage()
const { isCopied, copy } = useClipboard()
return (
<div
className="absolute right-2 bottom-2 opacity-0 group-hover:opacity-25 cursor-pointer"
onClick={() => copy(message.content)}>
{isCopied ? <CheckIcon /> : <CopyIcon />}
</div>
)
}

View file

@ -1,12 +0,0 @@
import { createContext } from "react"
import { Message } from "./types"
export interface ChatMessageContext {
message: Message
isLast: boolean
}
export const chatMessageContext = createContext<ChatMessageContext | null>(null)
export const ChatMessageProvider = chatMessageContext.Provider

View file

@ -1,41 +0,0 @@
import { useEffect, useRef } from "react"
import { Virtuoso, VirtuosoHandle } from "react-virtuoso"
import { useChatUI } from "./useChatUI"
import { ChatMessage } from "./ChatMessage"
export function ChatMessages() {
const { messages, isLoading, append } = useChatUI()
const messageCount = messages.length
const virtuoso = useRef<VirtuosoHandle>(null)
useEffect(() => {
if (!virtuoso.current) {
return
}
requestAnimationFrame(() =>
virtuoso.current?.scrollToIndex({ index: messageCount - 1, align: "end", behavior: "smooth" }),
)
}, [messageCount])
return (
<Virtuoso
ref={virtuoso}
data={messages}
totalCount={messageCount}
itemContent={(index, message) => (
<ChatMessage
key={index}
message={message}
isHeaderVisible={
!!message.annotations?.length || index === 0 || messages[index - 1].role !== message.role
}
isLast={index === messageCount - 1}
isLoading={isLoading}
append={append}
/>
)}
/>
)
}

View file

@ -1,11 +0,0 @@
import { createContext } from "react"
import { ChatHandler } from "./types"
type ChatContext = ChatHandler & {
assistantName: string
}
export const chatContext = createContext<ChatContext | null>(null)
export const ChatProvider = chatContext.Provider

View file

@ -1,2 +0,0 @@
export * from "./types"
export * from "./Chat"

View file

@ -1,39 +0,0 @@
export interface Message {
role: "system" | "user" | "assistant" | "data"
content: string
annotations?: MessageAnnotation[]
}
export type ChatHandler = {
isLoading: boolean
setIsLoading: (isLoading: boolean, message?: string) => void
loadingMessage?: string
setLoadingMessage?: (message: string) => void
input: string
setInput: (input: string) => void
messages: Message[]
reload?: (options?: { data?: any }) => void
stop?: () => void
append: (message: Message, options?: { data?: any }) => Promise<string | null | undefined>
reset?: () => void
}
export enum MessageAnnotationType {
BADGE = "badge",
}
export type BadgeData = {
label: string
variant?: "default" | "secondary" | "destructive" | "outline"
}
export type AnnotationData = BadgeData
export type MessageAnnotation = {
type: MessageAnnotationType
data: AnnotationData
}

View file

@ -1,13 +0,0 @@
import { useContext } from "react"
import { chatInputContext } from "./ChatInputProvider"
export const useChatInput = () => {
const context = useContext(chatInputContext)
if (!context) {
throw new Error("useChatInput must be used within a ChatInputProvider")
}
return context
}

View file

@ -1,13 +0,0 @@
import { useContext } from "react"
import { chatMessageContext } from "./ChatMessageProvider"
export const useChatMessage = () => {
const context = useContext(chatMessageContext)
if (!context) {
throw new Error("useChatMessage must be used within a ChatMessageProvider")
}
return context
}

View file

@ -1,13 +0,0 @@
import { useContext } from "react"
import { chatContext } from "./ChatProvider"
export const useChatUI = () => {
const context = useContext(chatContext)
if (!context) {
throw new Error("useChatUI must be used within a ChatProvider")
}
return context
}

View file

@ -1,3 +0,0 @@
export const Blockquote = ({ children }: { children: React.ReactNode }) => {
return <div className="border-l-3 border-accent italic pl-2 py-2 mb-2">{children}</div>
}

View file

@ -1,72 +0,0 @@
import { FC, memo, useState, useEffect, useCallback } from "react"
import { codeToHtml } from "shiki"
import { CopyIcon, CheckIcon } from "@radix-ui/react-icons"
import { cn } from "@/lib/utils"
import { useClipboard } from "@/components/ui/hooks"
import { Button } from "@/components/ui"
interface CodeBlockProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "children"> {
language: string
value: string
}
export const CodeBlock: FC<CodeBlockProps> = memo(({ language, value, className, ...props }) => {
const [highlightedCode, setHighlightedCode] = useState<string>("")
const { isCopied, copy } = useClipboard()
const onCopy = useCallback(() => {
if (!isCopied) {
copy(value)
}
}, [isCopied, copy, value])
useEffect(() => {
const highlight = async () => {
const theme = "github-dark" // Use VSCode's current theme.
try {
const html = await codeToHtml(value, {
lang: language,
theme,
transformers: [
{
pre(node) {
node.properties.class = cn(className, "overflow-x-auto")
return node
},
code(node) {
node.properties.style = "background-color: transparent !important;"
return node
},
},
],
})
setHighlightedCode(html)
} catch (_e) {
setHighlightedCode(value)
}
}
highlight()
}, [language, value, className])
return (
<div className="relative" {...props}>
<div dangerouslySetInnerHTML={{ __html: highlightedCode }} />
<Button
variant="outline"
size="icon"
className="absolute top-1 right-1 cursor-pointer bg-black/10"
onClick={onCopy}>
{isCopied ? (
<CheckIcon style={{ width: 12, height: 12 }} />
) : (
<CopyIcon style={{ width: 12, height: 12 }} />
)}
</Button>
</div>
)
})
CodeBlock.displayName = "CodeBlock"

View file

@ -1,81 +0,0 @@
import { FC, memo } from "react"
import ReactMarkdown, { Options } from "react-markdown"
import remarkGfm from "remark-gfm"
import { Separator } from "@/components/ui"
import { CodeBlock } from "./CodeBlock"
import { Blockquote } from "./Blockquote"
const MemoizedReactMarkdown: FC<Options> = memo(
ReactMarkdown,
(prevProps, nextProps) => prevProps.children === nextProps.children && prevProps.className === nextProps.className,
)
export function Markdown({ content }: { content: string }) {
return (
<MemoizedReactMarkdown
remarkPlugins={[remarkGfm]}
className="custom-markdown break-words"
components={{
p({ children }) {
return <div className="mb-2 last:mb-0">{children}</div>
},
hr() {
return <Separator />
},
ol({ children }) {
return (
<ol className="list-decimal pl-4 [&>li]:mb-1 [&>li:last-child]:mb-0 [&>li>ul]:mt-1 [&>li>ol]:mt-1">
{children}
</ol>
)
},
ul({ children }) {
return (
<ul className="list-disc pl-4 [&>li]:mb-1 [&>li:last-child]:mb-0 [&>li>ul]:mt-1 [&>li>ol]:mt-1">
{children}
</ul>
)
},
blockquote({ children }) {
return <Blockquote>{children}</Blockquote>
},
code({ className, children, ...props }) {
if (children && Array.isArray(children) && children.length) {
if (children[0] === "▍") {
return <span className="mt-1 animate-pulse cursor-default"></span>
}
children[0] = (children[0] as string).replace("`▍`", "▍")
}
const match = /language-(\w+)/.exec(className || "")
const isInline =
props.node?.position && props.node.position.start.line === props.node.position.end.line
return isInline ? (
<code className={className} {...props}>
{children}
</code>
) : (
<CodeBlock
language={(match && match[1]) || ""}
value={String(children).replace(/\n$/, "")}
className="rounded-xs p-3 mb-2"
/>
)
},
a({ href, children }) {
return (
<a href={href} target="_blank" rel="noopener noreferrer">
{children}
</a>
)
},
}}>
{content}
</MemoizedReactMarkdown>
)
}

View file

@ -1 +0,0 @@
export * from "./Markdown"

View file

@ -1,22 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react"
import { AutosizeTextarea } from "@src/components/ui/autosize-textarea"
const meta: Meta<typeof AutosizeTextarea> = {
title: "Primitives/AutosizeTextarea",
component: AutosizeTextarea,
tags: ["autodocs"],
args: {
minHeight: 40,
maxHeight: 400,
placeholder: "This textarea will expand as you type.",
className: "p-2",
},
}
export default meta
type Story = StoryObj<typeof AutosizeTextarea>
export const Default: Story = {
args: {},
}

View file

@ -1,43 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react"
import { Badge } from "@/components/ui"
const meta: Meta<typeof Badge> = {
title: "Primitives/Badge",
component: Badge,
tags: ["autodocs"],
args: {
children: "Badge",
},
}
export default meta
type Story = StoryObj<typeof Badge>
export const Default: Story = {
args: {
children: "Default",
},
}
export const Secondary: Story = {
args: {
variant: "secondary",
children: "Secondary",
},
}
export const Destructive: Story = {
args: {
variant: "destructive",
children: "Destructive",
},
}
export const Outline: Story = {
args: {
variant: "outline",
children: "Outline",
},
}

View file

@ -1,95 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react"
import { Button } from "@/components/ui"
const meta = {
title: "primitives/Button",
component: Button,
parameters: { layout: "centered" },
tags: ["autodocs"],
argTypes: {
variant: {
control: "select",
options: ["default", "secondary", "outline", "ghost", "link", "destructive"],
type: "string",
table: {
defaultValue: {
summary: "default",
},
},
},
size: {
control: "select",
options: ["default", "sm", "lg", "icon"],
type: "string",
table: {
defaultValue: {
summary: "default",
},
},
},
children: {
table: {
disable: true,
},
},
asChild: {
table: {
disable: true,
},
},
},
args: {
children: "Button",
},
} satisfies Meta<typeof Button>
export default meta
type Story = StoryObj<typeof meta>
export const Default: Story = {
name: "Default",
}
export const Secondary: Story = {
name: "Secondary",
args: {
variant: "secondary",
},
}
export const Destructive: Story = {
name: "Destructive",
args: {
variant: "destructive",
},
}
export const Outline: Story = {
name: "Outline",
args: {
variant: "outline",
},
}
export const Ghost: Story = {
name: "Ghost",
args: {
variant: "ghost",
},
}
export const Link: Story = {
name: "Link",
args: {
variant: "link",
},
}
export const Combobox: Story = {
name: "Combobox",
args: {
variant: "combobox",
},
}

View file

@ -1,51 +0,0 @@
import { useState } from "react"
import type { Meta, StoryObj } from "@storybook/react"
import { Chat, ChatHandler, Message } from "@/components/ui/chat"
const meta = {
title: "ui/Chat",
component: Chat,
parameters: { layout: "centered" },
tags: ["autodocs"],
} satisfies Meta<typeof Chat>
export default meta
type Story = StoryObj<typeof meta>
export const Default: Story = {
name: "Chat",
args: {
assistantName: "Assistant",
handler: {} as ChatHandler,
},
render: function StorybookChat() {
const handler = useStorybookChat()
return (
<Chat
assistantName="Assistant"
handler={handler}
className="border w-[460px] h-[640px] bg-vscode-editor-background"
/>
)
},
}
const useStorybookChat = (): ChatHandler => {
const [isLoading, setIsLoading] = useState(false)
const [input, setInput] = useState("")
const [messages, setMessages] = useState<Message[]>([])
const append = async (message: Message, _options?: { data?: any }) => {
const echo: Message = {
...message,
role: "assistant",
content: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
}
setMessages((prev) => [...prev, message, echo])
return Promise.resolve(null)
}
return { isLoading, setIsLoading, input, setInput, messages, append }
}

View file

@ -1,36 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react"
import { useState } from "react"
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@src/components/ui/collapsible"
import { Button } from "@src/components/ui/button"
import { ChevronsUpDown } from "lucide-react"
const meta: Meta<typeof Collapsible> = {
title: "Primitives/Collapsible",
component: Collapsible,
tags: ["autodocs"],
}
export default meta
type Story = StoryObj<typeof Collapsible>
export const Default: Story = {
render: () => <CollapsibleDemo />,
}
const CollapsibleDemo = () => {
const [isOpen, setIsOpen] = useState(false)
return (
<Collapsible open={isOpen} onOpenChange={setIsOpen}>
<CollapsibleTrigger asChild>
<Button variant="ghost">
Hello
<ChevronsUpDown className="size-4" />
</Button>
</CollapsibleTrigger>
<CollapsibleContent className="p-2">👋</CollapsibleContent>
</Collapsible>
)
}

View file

@ -1,99 +0,0 @@
import { useState } from "react"
import type { Meta, StoryObj } from "@storybook/react"
import { CaretSortIcon, CheckIcon } from "@radix-ui/react-icons"
import { cn } from "@/lib/utils"
import {
Button,
Command,
CommandEmpty,
CommandGroup,
CommandInput,
CommandItem,
CommandList,
Popover,
PopoverContent,
PopoverTrigger,
} from "@/components/ui"
const meta = {
title: "primitives/Combobox",
component: Combobox,
parameters: { layout: "centered" },
tags: ["autodocs"],
} satisfies Meta<typeof Combobox>
export default meta
type Story = StoryObj<typeof meta>
export const Default: Story = {
name: "Combobox",
render: () => <Combobox />,
}
const frameworks = [
{
value: "next.js",
label: "Next.js",
},
{
value: "sveltekit",
label: "SvelteKit",
},
{
value: "nuxt.js",
label: "Nuxt.js",
},
{
value: "remix",
label: "Remix",
},
{
value: "astro",
label: "Astro",
},
]
function Combobox() {
const [open, setOpen] = useState(false)
const [value, setValue] = useState("")
return (
<Popover open={open} onOpenChange={setOpen}>
<PopoverTrigger asChild>
<Button variant="combobox" role="combobox" aria-expanded={open} className="w-[200px] justify-between">
{value ? frameworks.find((framework) => framework.value === value)?.label : "Select framework..."}
<CaretSortIcon className="opacity-50" />
</Button>
</PopoverTrigger>
<PopoverContent className="w-[200px] p-0">
<Command>
<CommandInput placeholder="Search framework..." className="h-9" />
<CommandList>
<CommandEmpty>No framework found.</CommandEmpty>
<CommandGroup>
{frameworks.map((framework) => (
<CommandItem
key={framework.value}
value={framework.value}
onSelect={(currentValue) => {
setValue(currentValue === value ? "" : currentValue)
setOpen(false)
}}>
{framework.label}
<CheckIcon
className={cn(
"ml-auto",
value === framework.value ? "opacity-100" : "opacity-0",
)}
/>
</CommandItem>
))}
</CommandGroup>
</CommandList>
</Command>
</PopoverContent>
</Popover>
)
}

View file

@ -1,113 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react"
import {
HamburgerMenuIcon,
BorderLeftIcon,
BorderRightIcon,
BorderBottomIcon,
BorderTopIcon,
TextAlignLeftIcon,
TextAlignCenterIcon,
TextAlignRightIcon,
} from "@radix-ui/react-icons"
import {
Button,
DropdownMenu,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuSeparator,
DropdownMenuShortcut,
DropdownMenuTrigger,
} from "@/components/ui"
const meta = {
title: "primitives/DropdownMenu",
component: DropdownMenu,
parameters: { layout: "centered" },
tags: ["autodocs"],
} satisfies Meta<typeof DropdownMenu>
export default meta
type Story = StoryObj<typeof meta>
export const Default: Story = {
name: "DropdownMenu",
render: () => (
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="ghost" size="icon">
<HamburgerMenuIcon />
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuLabel>Label</DropdownMenuLabel>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem>Item 1</DropdownMenuItem>
<DropdownMenuItem>
Item 2<DropdownMenuShortcut>2</DropdownMenuShortcut>
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
),
}
type DropdownMenuVariantProps = {
side?: "top" | "bottom" | "left" | "right"
align?: "start" | "center" | "end"
children?: React.ReactNode
}
const DropdownMenuVariant = ({ side = "bottom", align = "center", children }: DropdownMenuVariantProps) => (
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="ghost" size="icon">
{children}
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent side={side} align={align}>
<DropdownMenuItem>Foo</DropdownMenuItem>
<DropdownMenuItem>Bar</DropdownMenuItem>
<DropdownMenuItem>Baz</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
)
export const Placements: Story = {
render: () => (
<div className="flex gap-2">
<DropdownMenuVariant side="top">
<BorderTopIcon />
</DropdownMenuVariant>
<DropdownMenuVariant side="bottom">
<BorderBottomIcon />
</DropdownMenuVariant>
<DropdownMenuVariant side="left">
<BorderLeftIcon />
</DropdownMenuVariant>
<DropdownMenuVariant side="right">
<BorderRightIcon />
</DropdownMenuVariant>
</div>
),
}
export const Alignments: Story = {
render: () => (
<div className="flex gap-2">
<DropdownMenuVariant align="center">
<TextAlignCenterIcon />
</DropdownMenuVariant>
<DropdownMenuVariant align="end">
<TextAlignRightIcon />
</DropdownMenuVariant>
<DropdownMenuVariant align="start">
<TextAlignLeftIcon />
</DropdownMenuVariant>
</div>
),
}

View file

@ -1,25 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react"
import { Progress } from "@/components/ui"
const meta: Meta<typeof Progress> = {
title: "Primitives/Progress",
component: Progress,
parameters: {
layout: "centered",
},
args: {
className: "w-[300px]",
},
tags: ["autodocs"],
}
export default meta
type Story = StoryObj<typeof Progress>
export const Default: Story = {
args: {
value: 50,
},
}

View file

@ -1,32 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react"
import { Slider } from "@/components/ui"
const meta: Meta<typeof Slider> = {
title: "Primitives/Slider",
component: Slider,
parameters: {
layout: "centered",
},
args: {
defaultValue: [50],
max: 100,
min: 0,
step: 1,
className: "w-[300px]",
},
tags: ["autodocs"],
}
export default meta
type Story = StoryObj<typeof Slider>
export const Default: Story = {
args: {
defaultValue: [50],
max: 100,
min: 0,
step: 1,
},
}

View file

@ -1,7 +0,0 @@
import { Meta } from "@storybook/blocks"
<Meta title="Welcome" />
# Welcome
This Roo Code storybook is used to independently develop components for the Roo Code webview UI.