From 11664dff8c12a2bf7b365a7da1823133c97cc439 Mon Sep 17 00:00:00 2001 From: yiliang114 Date: Sat, 22 Aug 2026 18:25:30 +0800 Subject: [PATCH 01/57] feat(vscode-ide-companion): reuse WebShell transcript UI behind experimental flag Bridge ACP session/update notifications into the shared SDK daemon transcript reducer and render the result with the WebShell transcript component, gated on qwen-code.experimental.webShellTranscript (default off). The WebShell renderer and its heavy transitive dependencies (echarts, mermaid, shiki, codemirror, katex) are lazily loaded via esbuild code splitting, so the default configuration keeps the ~700KB webview bundle unchanged. --- packages/vscode-ide-companion/NOTICES.txt | 9871 +++++++++++++++++ packages/vscode-ide-companion/esbuild.js | 10 +- packages/vscode-ide-companion/package.json | 7 + .../src/services/qwenAgentManager.ts | 18 + .../src/types/chatTypes.ts | 6 + .../vscode-ide-companion/src/webview/App.tsx | 52 +- .../adapters/acpTranscriptAdapter.test.ts | 46 + .../webview/adapters/acpTranscriptAdapter.ts | 30 + .../src/webview/hooks/useAcpTranscript.ts | 52 + .../webview/providers/WebViewContent.test.ts | 44 +- .../src/webview/providers/WebViewContent.ts | 11 +- .../src/webview/providers/WebViewProvider.ts | 16 + 12 files changed, 10154 insertions(+), 9 deletions(-) create mode 100644 packages/vscode-ide-companion/src/webview/adapters/acpTranscriptAdapter.test.ts create mode 100644 packages/vscode-ide-companion/src/webview/adapters/acpTranscriptAdapter.ts create mode 100644 packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.ts diff --git a/packages/vscode-ide-companion/NOTICES.txt b/packages/vscode-ide-companion/NOTICES.txt index 1993b0957cf..27f3a6a4b9b 100644 --- a/packages/vscode-ide-companion/NOTICES.txt +++ b/packages/vscode-ide-companion/NOTICES.txt @@ -16792,6 +16792,9877 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +============================================================ +@codemirror/autocomplete@6.20.3 +(git+https://code.haverbeke.berlin/codemirror/autocomplete.git) + +MIT License + +Copyright (C) 2018-2021 by Marijn Haverbeke and others + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +============================================================ +@codemirror/language@6.12.3 +(git+https://github.com/codemirror/language.git) + +MIT License + +Copyright (C) 2018-2021 by Marijn Haverbeke and others + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +============================================================ +@codemirror/state@6.6.0 +(git+https://github.com/codemirror/state.git) + +MIT License + +Copyright (C) 2018-2021 by Marijn Haverbeke and others + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +============================================================ +@marijn/find-cluster-break@1.0.2 +(git+https://github.com/marijnh/find-cluster-break.git) + +MIT License + +Copyright (C) 2024 by Marijn Haverbeke + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +============================================================ +@codemirror/view@6.43.1 +(git+https://code.haverbeke.berlin/codemirror/view.git) + +MIT License + +Copyright (C) 2018-2021 by Marijn Haverbeke and others + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +============================================================ +crelt@1.0.6 +(git+https://github.com/marijnh/crelt.git) + +Copyright (C) 2020 by Marijn Haverbeke + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +============================================================ +style-mod@4.1.3 +(git+https://github.com/marijnh/style-mod.git) + +Copyright (C) 2018 by Marijn Haverbeke and others + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +============================================================ +w3c-keyname@2.2.8 +(git+https://github.com/marijnh/w3c-keyname.git) + +Copyright (C) 2016 by Marijn Haverbeke and others + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +============================================================ +@lezer/common@1.5.2 +(https://github.com/lezer-parser/common.git) + +MIT License + +Copyright (C) 2018 by Marijn Haverbeke and others + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +============================================================ +@lezer/highlight@1.2.3 +(https://github.com/lezer-parser/highlight.git) + +MIT License + +Copyright (C) 2018 by Marijn Haverbeke and others + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +============================================================ +@lezer/lr@1.4.10 +(git+https://code.haverbeke.berlin/lezer/lr.git) + +MIT License + +Copyright (C) 2018 by Marijn Haverbeke and others + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +============================================================ +@codemirror/commands@6.10.3 +(git+https://github.com/codemirror/commands.git) + +MIT License + +Copyright (C) 2018-2021 by Marijn Haverbeke and others + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +============================================================ +@codemirror/merge@6.12.2 +(git+https://code.haverbeke.berlin/codemirror/merge.git) + +MIT License + +Copyright (C) 2018-2022 by Marijn Haverbeke and others + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +============================================================ +@datafe-open/markdown-chart@0.1.12 +(https://github.com/datafe/markdown-chart.git) + +MIT License + +Copyright (c) 2026 DataFE contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@datafe-open/markdown-chart-echarts@0.1.12 +(https://github.com/datafe/markdown-chart.git) + +MIT License + +Copyright (c) 2026 DataFE contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +papaparse@5.5.4 +(git+https://github.com/mholt/PapaParse.git) + +The MIT License (MIT) + +Copyright (c) 2015 Matthew Holt + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +@datafe-open/markdown-chart-react@0.1.12 +(https://github.com/datafe/markdown-chart.git) + +MIT License + +Copyright (c) 2026 DataFE contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +react-markdown@10.1.0 +(No repository found) + +The MIT License (MIT) + +Copyright (c) Espen Hovlandsdal + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@types/hast@3.0.4 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/unist@3.0.3 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/mdast@4.0.4 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +devlop@1.1.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2023 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +dequal@2.0.3 +(No repository found) + +The MIT License (MIT) + +Copyright (c) Luke Edwards (lukeed.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +============================================================ +hast-util-to-jsx-runtime@2.3.6 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +@types/estree@1.0.9 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +comma-separated-tokens@2.0.3 +(No repository found) + +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +estree-util-is-identifier-name@3.0.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +hast-util-whitespace@3.0.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +mdast-util-mdx-expression@2.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +@types/estree-jsx@1.0.5 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +mdast-util-from-markdown@2.0.3 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +decode-named-character-reference@1.3.0 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +character-entities@2.0.2 +(No repository found) + +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +mdast-util-to-string@4.0.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark@4.0.2 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +@types/debug@4.1.13 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/ms@2.1.0 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +micromark-core-commonmark@2.0.3 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-factory-destination@2.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-util-character@2.1.1 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-util-symbol@2.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-util-types@2.0.2 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-factory-label@2.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-factory-space@2.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-factory-title@2.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-factory-whitespace@2.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-util-chunked@2.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-util-classify-character@2.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-util-html-tag-name@2.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-util-normalize-identifier@2.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-util-resolve-all@2.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-util-subtokenize@2.1.0 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-util-combine-extensions@2.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-util-decode-numeric-character-reference@2.0.2 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-util-encode@2.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-util-sanitize-uri@2.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-util-decode-string@2.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +unist-util-stringify-position@4.0.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +mdast-util-to-markdown@2.1.2 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +longest-streak@3.1.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +mdast-util-phrasing@4.1.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2017 Titus Wormer +Copyright (c) 2017 Victor Felder + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +unist-util-is@6.0.1 +(No repository found) + +(The MIT license) + +Copyright (c) 2015 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +unist-util-visit@5.1.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +unist-util-visit-parents@6.0.2 +(No repository found) + +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +zwitch@2.0.4 +(No repository found) + +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +mdast-util-mdx-jsx@3.2.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +ccount@2.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +parse-entities@4.0.2 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +@types/unist@2.0.11 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +character-entities-legacy@3.0.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +character-reference-invalid@2.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +is-alphanumerical@2.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +is-alphabetical@2.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +is-decimal@2.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +is-hexadecimal@2.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +stringify-entities@4.0.4 +(No repository found) + +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +character-entities-html4@2.1.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +vfile-message@4.0.3 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +mdast-util-mdxjs-esm@2.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +property-information@7.2.0 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +space-separated-tokens@2.0.2 +(No repository found) + +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +style-to-js@1.1.21 +(git+https://github.com/remarkablemark/style-to-js.git) + +The MIT License (MIT) + +Copyright (c) 2020 Menglin "Mark" Xu + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +style-to-object@1.0.14 +(git+https://github.com/remarkablemark/style-to-object.git) + +The MIT License (MIT) + +Copyright (c) 2017 Menglin "Mark" Xu + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +inline-style-parser@0.2.7 +(git+https://github.com/remarkablemark/inline-style-parser.git) + +(The MIT License) + +Copyright (c) 2012 TJ Holowaychuk + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +unist-util-position@5.0.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +html-url-attributes@3.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +============================================================ +mdast-util-to-hast@13.2.1 +(No repository found) + +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +@ungap/structured-clone@1.3.0 +(git+https://github.com/ungap/structured-clone.git) + +ISC License + +Copyright (c) 2021, Andrea Giammarchi, @WebReflection + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + + +============================================================ +trim-lines@3.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +vfile@6.0.3 +(No repository found) + +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +============================================================ +remark-parse@11.0.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2014 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +============================================================ +unified@11.0.5 +(No repository found) + +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +============================================================ +bail@2.0.2 +(No repository found) + +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +is-plain-obj@4.1.0 +(No repository found) + +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +trough@2.2.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +============================================================ +remark-rehype@11.1.2 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +@tanstack/react-virtual@3.14.2 +(git+https://github.com/TanStack/virtual.git) + +MIT License + +Copyright (c) 2021-present Tanner Linsley + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@tanstack/virtual-core@3.17.0 +(git+https://github.com/TanStack/virtual.git) + +MIT License + +Copyright (c) 2021-present Tanner Linsley + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +class-variance-authority@0.7.1 +(No repository found) + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2022 Joe Bell + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +============================================================ +clsx@2.1.1 +(No repository found) + +MIT License + +Copyright (c) Luke Edwards (lukeed.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +codemirror@6.0.2 +(https://github.com/codemirror/basic-setup.git) + +MIT License + +Copyright (C) 2018-2021 by Marijn Haverbeke and others + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +============================================================ +@codemirror/lint@6.9.7 +(git+https://code.haverbeke.berlin/codemirror/lint.git) + +MIT License + +Copyright (C) 2018-2021 by Marijn Haverbeke and others + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +============================================================ +@codemirror/search@6.7.0 +(git+https://code.haverbeke.berlin/codemirror/search.git) + +MIT License + +Copyright (C) 2018-2021 by Marijn Haverbeke and others + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +============================================================ +echarts@6.1.0 +(git+https://github.com/apache/echarts.git) + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + + +======================================================================== +Apache ECharts Subcomponents: + +The Apache ECharts project contains subcomponents with separate copyright +notices and license terms. Your use of the source code for these +subcomponents is also subject to the terms and conditions of the following +licenses. + +BSD 3-Clause (d3.js): +The following files embed [d3.js](https://github.com/d3/d3) BSD 3-Clause: + `/src/chart/treemap/treemapLayout.ts`, + `/src/chart/tree/layoutHelper.ts`, + `/src/chart/graph/forceHelper.ts`, + `/src/util/number.ts` +See `/licenses/LICENSE-d3` for details of the license. + + +============================================================ +tslib@2.3.0 +(https://github.com/Microsoft/tslib.git) + +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + +============================================================ +zrender@6.1.0 +(https://github.com/ecomfe/zrender.git) + +BSD 3-Clause License + +Copyright (c) 2017, Baidu Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +============================================================ +katex@0.16.47 +(https://github.com/KaTeX/KaTeX.git) + +The MIT License (MIT) + +Copyright (c) 2013-2020 Khan Academy and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +commander@8.3.0 +(https://github.com/tj/commander.js.git) + +(The MIT License) + +Copyright (c) 2011 TJ Holowaychuk + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +lucide-react@1.24.0 +(https://github.com/lucide-icons/lucide.git) + +ISC License + +Copyright (c) 2026 Lucide Icons and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--- + +The following Lucide icons are derived from the Feather project: + +airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + +The MIT License (MIT) (for the icons listed above) + +Copyright (c) 2013-present Cole Bemis + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +mermaid@11.17.0 +(https://github.com/mermaid-js/mermaid) + +The MIT License (MIT) + +Copyright (c) 2014 - 2022 Knut Sveidqvist + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@braintree/sanitize-url@7.1.2 +(git+https://github.com/braintree/sanitize-url.git) + +MIT License + +Copyright (c) 2017 Braintree + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@iconify/utils@3.1.3 +(https://github.com/iconify/iconify.git) + +MIT License + +Copyright (c) 2021-PRESENT Vjacheslav Trushkin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +============================================================ +@antfu/install-pkg@1.1.0 +(git+https://github.com/antfu/install-pkg.git) + +MIT License + +Copyright (c) 2021 Anthony Fu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +package-manager-detector@1.6.0 +(git+https://github.com/antfu-collective/package-manager-detector.git) + +MIT License + +Copyright (c) 2020-PRESENT Anthony Fu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +tinyexec@1.2.4 +(git+https://github.com/tinylibs/tinyexec.git) + +MIT License + +Copyright (c) 2024 Tinylibs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@iconify/types@2.0.0 +(https://github.com/iconify/iconify.git) + +MIT License + +Copyright (c) 2021 - 2022 Vjacheslav Trushkin / Iconify OÜ + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +============================================================ +import-meta-resolve@4.2.0 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--- + +This is a derivative work based on: +. +Which is licensed: + +""" +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + + +============================================================ +@mermaid-js/parser@1.2.1 +(https://github.com/mermaid-js/mermaid.git) + +The MIT License (MIT) + +Copyright (c) 2023 Yokozuna59 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@chevrotain/types@11.1.2 +(git://github.com/Chevrotain/chevrotain.git) + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +============================================================ +@types/d3@7.4.3 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-array@3.2.2 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-axis@3.0.6 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-selection@3.0.11 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-brush@3.0.6 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-chord@3.0.6 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-color@3.1.3 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-contour@3.0.6 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/geojson@7946.0.16 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-delaunay@6.0.4 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-dispatch@3.0.7 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-drag@3.0.7 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-dsv@3.0.7 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-ease@3.0.2 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-fetch@3.0.7 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-force@3.0.10 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-format@3.0.4 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-geo@3.1.0 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-hierarchy@3.1.7 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-interpolate@3.0.4 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-path@3.1.1 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-polygon@3.0.2 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-quadtree@3.0.6 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-random@3.0.3 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-scale@4.0.9 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-time@3.0.4 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-scale-chromatic@3.1.0 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-shape@3.1.8 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-time-format@4.0.3 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-timer@3.0.2 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-transition@3.0.9 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@types/d3-zoom@3.0.8 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +@upsetjs/venn.js@2.0.0 +(https://github.com/upsetjs/venn.js.git) + +MIT License + +Copyright (c) 2013 Ben Frederickson +Copyright (c) 2021 Samuel Gratzl + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +cytoscape@3.34.0 +(https://github.com/cytoscape/cytoscape.js.git) + +Copyright (c) 2016-2026, The Cytoscape Consortium. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the “Software”), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +============================================================ +cytoscape-cose-bilkent@4.1.0 +(https://github.com/cytoscape/cytoscape.js-cose-bilkent.git) + + + +Copyright (c) 2016-2018, The Cytoscape Consortium. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the “Software”), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +============================================================ +cose-base@1.0.3 +(git+https://github.com/iVis-at-Bilkent/cose-base.git) + +MIT License + +Copyright (c) 2019 - present, iVis@Bilkent. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +layout-base@1.0.2 +(git+https://github.com/iVis-at-Bilkent/layout-base.git) + +MIT License + +Copyright (c) 2019 iVis@Bilkent + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +cytoscape-fcose@2.2.0 +(https://github.com/iVis-at-Bilkent/cytoscape.js-fcose.git) + +Copyright (c) 2018 - present, iVis-at-Bilkent. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the “Software”), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +cose-base@2.2.0 +(git+https://github.com/iVis-at-Bilkent/cose-base.git) + +MIT License + +Copyright (c) 2019 - present, iVis@Bilkent. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +layout-base@2.0.1 +(git+https://github.com/iVis-at-Bilkent/layout-base.git) + +MIT License + +Copyright (c) 2019 iVis@Bilkent + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +d3@7.9.0 +(https://github.com/d3/d3.git) + +Copyright 2010-2023 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-array@3.2.4 +(https://github.com/d3/d3-array.git) + +Copyright 2010-2023 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +internmap@2.0.3 +(https://github.com/mbostock/internmap.git) + +Copyright 2021 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-axis@3.0.0 +(https://github.com/d3/d3-axis.git) + +Copyright 2010-2021 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-brush@3.0.0 +(https://github.com/d3/d3-brush.git) + +Copyright 2010-2021 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-dispatch@3.0.1 +(https://github.com/d3/d3-dispatch.git) + +Copyright 2010-2021 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-drag@3.0.0 +(https://github.com/d3/d3-drag.git) + +Copyright 2010-2021 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-selection@3.0.0 +(https://github.com/d3/d3-selection.git) + +Copyright 2010-2021 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-interpolate@3.0.1 +(https://github.com/d3/d3-interpolate.git) + +Copyright 2010-2021 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-color@3.1.0 +(https://github.com/d3/d3-color.git) + +Copyright 2010-2022 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-transition@3.0.1 +(https://github.com/d3/d3-transition.git) + +Copyright 2010-2021 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-ease@3.0.1 +(https://github.com/d3/d3-ease.git) + +Copyright 2010-2021 Mike Bostock +Copyright 2001 Robert Penner +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +============================================================ +d3-timer@3.0.1 +(https://github.com/d3/d3-timer.git) + +Copyright 2010-2021 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-chord@3.0.1 +(https://github.com/d3/d3-chord.git) + +Copyright 2010-2021 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-path@3.1.0 +(https://github.com/d3/d3-path.git) + +Copyright 2015-2022 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-contour@4.0.2 +(https://github.com/d3/d3-contour.git) + +Copyright 2012-2023 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-delaunay@6.0.4 +(https://github.com/d3/d3-delaunay.git) + +Copyright 2018-2021 Observable, Inc. +Copyright 2021 Mapbox + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +delaunator@5.1.0 +(https://github.com/mapbox/delaunator.git) + +ISC License + +Copyright (c) 2026, Mapbox + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +robust-predicates@3.0.3 +(https://github.com/mourner/robust-predicates.git) + +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to + + +============================================================ +d3-dsv@3.0.1 +(https://github.com/d3/d3-dsv.git) + +Copyright 2013-2021 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +commander@7.2.0 +(https://github.com/tj/commander.js.git) + +(The MIT License) + +Copyright (c) 2011 TJ Holowaychuk + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +rw@1.3.3 +(http://github.com/mbostock/rw.git) + +Copyright (c) 2014-2016, Michael Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* The name Michael Bostock may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +============================================================ +d3-fetch@3.0.1 +(https://github.com/d3/d3-fetch.git) + +Copyright 2016-2021 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-force@3.0.0 +(https://github.com/d3/d3-force.git) + +Copyright 2010-2021 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-quadtree@3.0.1 +(https://github.com/d3/d3-quadtree.git) + +Copyright 2010-2021 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-format@3.1.2 +(https://github.com/d3/d3-format.git) + +Copyright 2010-2026 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-geo@3.1.1 +(https://github.com/d3/d3-geo.git) + +Copyright 2010-2024 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +This license applies to GeographicLib, versions 1.12 and later. + +Copyright 2008-2012 Charles Karney + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +d3-hierarchy@3.1.2 +(https://github.com/d3/d3-hierarchy.git) + +Copyright 2010-2021 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-polygon@3.0.1 +(https://github.com/d3/d3-polygon.git) + +Copyright 2010-2021 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-random@3.0.1 +(https://github.com/d3/d3-random.git) + +Copyright 2010-2021 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-scale@4.0.2 +(https://github.com/d3/d3-scale.git) + +Copyright 2010-2021 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-time@3.1.0 +(https://github.com/d3/d3-time.git) + +Copyright 2010-2022 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-time-format@4.1.0 +(https://github.com/d3/d3-time-format.git) + +Copyright 2010-2021 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-scale-chromatic@3.1.0 +(https://github.com/d3/d3-scale-chromatic.git) + +Copyright 2010-2024 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +Apache-Style Software License for ColorBrewer software and ColorBrewer Color Schemes + +Copyright 2002 Cynthia Brewer, Mark Harrower, and The Pennsylvania State University + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +this file except in compliance with the License. You may obtain a copy of the +License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for the +specific language governing permissions and limitations under the License. + + +============================================================ +d3-shape@3.2.0 +(https://github.com/d3/d3-shape.git) + +Copyright 2010-2022 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-zoom@3.0.0 +(https://github.com/d3/d3-zoom.git) + +Copyright 2010-2021 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-sankey@0.12.3 +(https://github.com/d3/d3-sankey.git) + +Copyright 2015, Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +============================================================ +d3-array@2.12.1 +(https://github.com/d3/d3-array.git) + +Copyright 2010-2020 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +============================================================ +internmap@1.0.1 +(https://github.com/mbostock/internmap.git) + +Copyright 2021 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +d3-shape@1.3.7 +(https://github.com/d3/d3-shape.git) + +Copyright 2010-2015 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +============================================================ +d3-path@1.0.9 +(https://github.com/d3/d3-path.git) + +Copyright 2015-2016 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +============================================================ +dagre-d3-es@7.0.14 +(git+https://github.com/tbo47/dagre-es.git) + +Original dagre-d3 copyright: Copyright (c) 2013 Chris Pettitt +Original dagre copyright: Copyright (c) 2012-2014 Chris Pettitt +Original graphlib copyright: Copyright (c) 2012-2014 Chris Pettitt + +Copyright (c) 2022-2024 Thibaut Lassalle, David Newell, Alois Klink, Sidharth Vinod and dagre-es contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +============================================================ +lodash-es@4.18.1 +(No repository found) + +Copyright OpenJS Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. + + +============================================================ +dayjs@1.11.21 +(https://github.com/iamkun/dayjs.git) + +MIT License + +Copyright (c) 2018-present, iamkun + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +dompurify@3.4.14 +(git://github.com/cure53/DOMPurify.git) + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +============================================================ +es-toolkit@1.46.1 +(https://github.com/toss/es-toolkit.git) + +MIT License + +Copyright (c) 2024 Viva Republica, Inc + +Copyright OpenJS Foundation and other contributors + +Parts of the test suite and compatibility layer in `es-toolkit/compat` are derived from Lodash (https://github.com/lodash/lodash) by the OpenJS Foundation (https://openjsf.org/) and Underscore.js by Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors (http://underscorejs.org/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +fastdom@1.0.12 +(git://github.com/wilsonpage/fastdom.git) + +License text not found. + +============================================================ +strictdom@1.0.1 +(git://github.com/wilsonpage/strictdom.git) + +License text not found. + +============================================================ +khroma@2.1.0 +(No repository found) + +The MIT License (MIT) + +Copyright (c) 2019-present Fabio Spampinato, Andrew Maney + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + + +============================================================ +marked@16.4.2 +(git://github.com/markedjs/marked.git) + +# License information + +## Contribution License Agreement + +If you contribute code to this project, you are implicitly allowing your code +to be distributed under the MIT license. You are also implicitly verifying that +all code is your original work. `` + +## Marked + +Copyright (c) 2018+, MarkedJS (https://github.com/markedjs/) +Copyright (c) 2011-2018, Christopher Jeffrey (https://github.com/chjj/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +## Markdown + +Copyright © 2004, John Gruber +http://daringfireball.net/ +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name “Markdown” nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +This software is provided by the copyright holders and contributors “as is” and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. In no event shall the copyright owner or contributors be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this software, even if advised of the possibility of such damage. + + +============================================================ +roughjs@4.6.6 +(git+https://github.com/pshihn/rough.git) + +MIT License + +Copyright (c) 2019 Preet Shihn + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +hachure-fill@0.5.2 +(git+https://github.com/pshihn/hachure-fill.git) + +MIT License + +Copyright (c) 2023 Preet Shihn + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +path-data-parser@0.1.0 +(git+https://github.com/pshihn/path-data-parser.git) + +MIT License + +Copyright (c) 2020 Preet Shihn + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +points-on-curve@0.2.0 +(git+https://github.com/pshihn/bezier-points.git) + +MIT License + +Copyright (c) 2020 Preet Shihn + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +points-on-path@0.2.1 +(git+https://github.com/pshihn/points-on-path.git) + +MIT License + +Copyright (c) 2020 Preet + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +stylis@4.4.0 +(No repository found) + +MIT License + +Copyright (c) 2016-present Sultan Tarimo + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +ts-dedent@2.2.0 +(https://github.com/tamino-martinius/node-ts-dedent.git) + +MIT License + +Copyright (c) 2018 Tamino Martinius + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +uuid@14.0.0 +(https://github.com/uuidjs/uuid.git) + +The MIT License (MIT) + +Copyright (c) 2010-2020 Robert Kieffer and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +radix-ui@1.6.2 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/primitive@1.1.5 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-accessible-icon@1.1.11 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-visually-hidden@1.2.7 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-primitive@2.1.7 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-slot@1.3.0 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-compose-refs@1.1.3 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-accordion@1.2.16 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-collapsible@1.1.16 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-context@1.2.0 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-id@1.1.2 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-use-layout-effect@1.1.2 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-presence@1.1.7 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-use-controllable-state@1.2.3 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-use-effect-event@0.0.3 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-collection@1.1.12 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-direction@1.1.2 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-alert-dialog@1.1.19 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-dialog@1.1.19 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-dismissable-layer@1.1.15 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-use-callback-ref@1.1.2 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-focus-guards@1.1.4 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-focus-scope@1.1.12 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-portal@1.1.13 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +aria-hidden@1.2.6 +(git+https://github.com/theKashey/aria-hidden.git) + +MIT License + +Copyright (c) 2017 Anton Korzunov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +react-remove-scroll@2.7.2 +(No repository found) + +MIT License + +Copyright (c) 2017 Anton Korzunov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +react-remove-scroll-bar@2.3.8 +(No repository found) + +License text not found. + +============================================================ +react-style-singleton@2.2.3 +(https://github.com/theKashey/react-style-singleton) + +MIT License + +Copyright (c) 2017 Anton Korzunov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +get-nonce@1.0.1 +(No repository found) + +MIT License + +Copyright (c) 2020 Anton Korzunov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +use-callback-ref@1.3.3 +(No repository found) + +MIT License + +Copyright (c) 2017 Anton Korzunov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +use-sidecar@1.1.3 +(https://github.com/theKashey/use-sidecar) + +MIT License + +Copyright (c) 2017 Anton Korzunov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +detect-node-es@1.1.0 +(https://github.com/thekashey/detect-node) + +MIT License + +Copyright (c) 2017 Ilya Kantor + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-arrow@1.1.11 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-aspect-ratio@1.1.11 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-avatar@1.2.2 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-use-is-hydrated@0.1.1 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-checkbox@1.3.7 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-use-previous@1.1.2 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-use-size@1.1.2 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-context-menu@2.3.3 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-menu@2.1.20 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-popper@1.3.3 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@floating-ui/react-dom@2.1.9 +(https://github.com/floating-ui/floating-ui.git) + +MIT License + +Copyright (c) 2021-present Floating UI contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +@floating-ui/dom@1.8.0 +(https://github.com/floating-ui/floating-ui.git) + +MIT License + +Copyright (c) 2021-present Floating UI contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +@floating-ui/core@1.8.0 +(https://github.com/floating-ui/floating-ui.git) + +MIT License + +Copyright (c) 2021-present Floating UI contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +@floating-ui/utils@0.2.12 +(https://github.com/floating-ui/floating-ui.git) + +MIT License + +Copyright (c) 2021-present Floating UI contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +@radix-ui/react-use-rect@1.1.2 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/rect@1.1.2 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-roving-focus@1.1.15 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-dropdown-menu@2.1.20 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-form@0.1.12 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-label@2.1.11 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-hover-card@1.1.19 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-menubar@1.1.20 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-navigation-menu@1.2.18 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-one-time-password-field@0.1.12 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/number@1.1.2 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-password-toggle-field@0.1.7 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-popover@1.1.19 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-progress@1.1.12 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-radio-group@1.4.3 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-scroll-area@1.2.14 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-select@2.3.3 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-separator@1.1.11 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-slider@1.4.3 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-switch@1.3.3 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-tabs@1.1.17 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-toast@1.2.19 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-toggle@1.1.14 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-toggle-group@1.1.15 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-toolbar@1.1.15 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-tooltip@1.2.12 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@radix-ui/react-use-escape-keydown@1.1.3 +(git+https://github.com/radix-ui/primitives.git) + +MIT License + +Copyright (c) 2022 WorkOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +react-markdown@9.1.0 +(No repository found) + +The MIT License (MIT) + +Copyright (c) Espen Hovlandsdal + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +rehype-katex@7.0.1 +(No repository found) + +License text not found. + +============================================================ +@types/katex@0.16.8 +(https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +============================================================ +hast-util-from-html-isomorphic@2.0.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2023 Remco Haszing + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +hast-util-from-dom@5.0.1 +(No repository found) + +(ISC License) + +Copyright (c) Keith McKnight + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + +============================================================ +hastscript@9.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +hast-util-parse-selector@4.0.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +web-namespaces@2.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +hast-util-from-html@2.0.3 +(No repository found) + +(The MIT License) + +Copyright (c) 2022 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +hast-util-from-parse5@8.0.3 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +vfile-location@5.0.3 +(No repository found) + +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +parse5@7.3.0 +(git://github.com/inikulin/parse5.git) + +Copyright (c) 2013-2019 Ivan Nikulin (ifaaan@gmail.com, https://github.com/inikulin) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +============================================================ +entities@6.0.1 +(git://github.com/fb55/entities.git) + +Copyright (c) Felix Böhm +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +============================================================ +unist-util-remove-position@5.0.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +hast-util-to-text@4.0.2 +(No repository found) + +(The MIT License) + +Copyright (c) 2019 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +hast-util-is-element@3.0.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +unist-util-find-after@5.0.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +remark-gfm@4.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +mdast-util-gfm@3.1.0 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +mdast-util-gfm-autolink-literal@2.0.1 +(No repository found) + +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +mdast-util-find-and-replace@3.0.2 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +escape-string-regexp@5.0.0 +(No repository found) + +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +mdast-util-gfm-footnote@2.1.0 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +mdast-util-gfm-strikethrough@2.0.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +mdast-util-gfm-table@2.0.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +markdown-table@3.0.4 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +mdast-util-gfm-task-list-item@2.0.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-extension-gfm@3.0.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-extension-gfm-autolink-literal@2.1.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-extension-gfm-footnote@2.1.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2021 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-extension-gfm-strikethrough@2.1.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-extension-gfm-table@2.1.1 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-extension-gfm-tagfilter@2.0.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-extension-gfm-task-list-item@2.1.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +remark-stringify@11.0.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2014 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +============================================================ +remark-math@6.0.0 +(No repository found) + +License text not found. + +============================================================ +mdast-util-math@3.0.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-extension-math@3.1.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +shiki@1.29.2 +(git+https://github.com/shikijs/shiki.git) + +MIT License + +Copyright (c) 2021 Pine Wu +Copyright (c) 2023 Anthony Fu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@shikijs/core@1.29.2 +(git+https://github.com/shikijs/shiki.git) + +MIT License + +Copyright (c) 2021 Pine Wu +Copyright (c) 2023 Anthony Fu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@shikijs/engine-javascript@1.29.2 +(git+https://github.com/shikijs/shiki.git) + +MIT License + +Copyright (c) 2021 Pine Wu +Copyright (c) 2023 Anthony Fu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@shikijs/types@1.29.2 +(git+https://github.com/shikijs/shiki.git) + +MIT License + +Copyright (c) 2021 Pine Wu +Copyright (c) 2023 Anthony Fu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@shikijs/vscode-textmate@10.0.2 +(https://github.com/shikijs/vscode-textmate) + +The MIT License (MIT) + +Copyright (c) Microsoft Corporation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +oniguruma-to-es@2.3.0 +(git+https://github.com/slevithan/oniguruma-to-es.git) + +MIT License + +Copyright (c) 2025 Steven Levithan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +emoji-regex-xs@1.0.0 +(git+https://github.com/slevithan/emoji-regex-xs.git) + +MIT License + +Copyright (c) 2024 Steven Levithan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +regex@5.1.1 +(git+https://github.com/slevithan/regex.git) + +MIT License + +Copyright (c) 2024 Steven Levithan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +regex-utilities@2.3.0 +(git+https://github.com/slevithan/regex-utilities.git) + +MIT License + +Copyright (c) 2024 Steven Levithan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +regex-recursion@5.1.1 +(git+https://github.com/slevithan/regex-recursion.git) + +MIT License + +Copyright (c) 2024 Steven Levithan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@shikijs/engine-oniguruma@1.29.2 +(git+https://github.com/shikijs/shiki.git) + +MIT License + +Copyright (c) 2021 Pine Wu +Copyright (c) 2023 Anthony Fu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +hast-util-to-html@9.0.5 +(No repository found) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +html-void-elements@3.0.0 +(No repository found) + +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +@shikijs/langs@1.29.2 +(git+https://github.com/shikijs/shiki.git) + +MIT License + +Copyright (c) 2021 Pine Wu +Copyright (c) 2023 Anthony Fu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@shikijs/themes@1.29.2 +(git+https://github.com/shikijs/shiki.git) + +MIT License + +Copyright (c) 2021 Pine Wu +Copyright (c) 2023 Anthony Fu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +tailwind-merge@3.6.0 +(https://github.com/dcastil/tailwind-merge.git) + +MIT License + +Copyright (c) 2021 Dany Castillo + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +vaul@1.1.2 +(https://github.com/emilkowalski/vaul.git) + +MIT License + +Copyright (c) 2023 Emil Kowalski + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + ============================================================ punycode@2.3.1 (https://github.com/mathiasbynens/punycode.js.git) diff --git a/packages/vscode-ide-companion/esbuild.js b/packages/vscode-ide-companion/esbuild.js index 5e5944b9694..9ab72e20813 100644 --- a/packages/vscode-ide-companion/esbuild.js +++ b/packages/vscode-ide-companion/esbuild.js @@ -209,12 +209,18 @@ async function main() { const webviewCtx = await esbuild.context({ entryPoints: ['src/webview/index.tsx'], bundle: true, - format: 'iife', + // ES modules + splitting so the WebShell transcript renderer (and its + // heavy transitive deps) is a lazily-loaded chunk instead of inflating the + // entry bundle for every user. `splitting` requires ESM and an outdir. + format: 'esm', + splitting: true, minify: production, sourcemap: !production, sourcesContent: false, platform: 'browser', - outfile: 'dist/webview.js', + outdir: 'dist', + entryNames: 'webview', + chunkNames: 'chunks/[name]-[hash]', // @qwen-code/qwen-code-core is a peer dependency of @qwen-code/webui. // Since @qwen-code/webui marks it as external in its own Vite build, the // browser bundle must also mark it external to avoid bundling Node.js-only diff --git a/packages/vscode-ide-companion/package.json b/packages/vscode-ide-companion/package.json index d033928a57f..8c15c256110 100644 --- a/packages/vscode-ide-companion/package.json +++ b/packages/vscode-ide-companion/package.json @@ -227,6 +227,12 @@ "type": "boolean", "default": true, "description": "Show notifications with sound when a task completes (at least 20 seconds) or needs your attention, while you are not actively viewing the Qwen Code panel." + }, + "qwen-code.experimental.webShellTranscript": { + "order": 5, + "type": "boolean", + "default": false, + "markdownDescription": "Render the conversation timeline with the shared WebShell transcript UI (experimental). Requires a window reload after changing." } } }, @@ -293,6 +299,7 @@ "@qwen-code/acp-bridge": "*", "@qwen-code/sdk": "*", "@qwen-code/webui": "*", + "@qwen-code/web-shell": "*", "@modelcontextprotocol/sdk": "^1.30.0", "cors": "^2.8.5", "dotenv": "^17.1.0", diff --git a/packages/vscode-ide-companion/src/services/qwenAgentManager.ts b/packages/vscode-ide-companion/src/services/qwenAgentManager.ts index 8149c19fdeb..cb624e5877f 100644 --- a/packages/vscode-ide-companion/src/services/qwenAgentManager.ts +++ b/packages/vscode-ide-companion/src/services/qwenAgentManager.ts @@ -127,6 +127,11 @@ export class QwenAgentManager { // Set ACP connection callbacks this.connection.onSessionUpdate = (data: SessionNotification) => { + // Forward the raw notification verbatim for consumers that reduce the + // transcript themselves (WebShell transcript UI). This runs before the + // rehydration branch so history replay and live streaming are both + // captured with the same shape the daemon SSE envelope would carry. + this.callbacks.onTranscriptUpdate?.(data); // If we are rehydrating a loaded session, map message chunks into // discrete messages for the UI instead of streaming behavior. // During rehydration the webview is NOT in streaming mode, so @@ -1483,6 +1488,19 @@ export class QwenAgentManager { this.sessionUpdateHandler.updateCallbacks(this.callbacks); } + /** + * Register a handler for raw ACP session/update notifications. Unlike the + * dedicated callbacks (onStreamChunk, onToolCall, ...) this is emitted + * verbatim from {@link onSessionUpdate} before any rehydration/streaming + * shaping, so transcript-reducing consumers see the same shape the daemon + * SSE envelope would carry. + */ + onTranscriptUpdate( + callback: (notification: SessionNotification) => void, + ): void { + this.callbacks.onTranscriptUpdate = callback; + } + /** * Register callback for unexpected process disconnection */ diff --git a/packages/vscode-ide-companion/src/types/chatTypes.ts b/packages/vscode-ide-companion/src/types/chatTypes.ts index 7d9f5b48d26..afea708f812 100644 --- a/packages/vscode-ide-companion/src/types/chatTypes.ts +++ b/packages/vscode-ide-companion/src/types/chatTypes.ts @@ -7,6 +7,7 @@ import type { ModelInfo, AvailableCommand, RequestPermissionRequest, + SessionNotification, } from '@agentclientprotocol/sdk'; import type { AskUserQuestionRequest, @@ -96,6 +97,11 @@ export interface QwenAgentCallbacks { onAvailableModels?: (models: ModelInfo[]) => void; onDisconnected?: (code: number | null, signal: string | null) => void; onSlashCommandNotification?: (event: SlashCommandNotification) => void; + /** + * Raw ACP session/update notification, forwarded verbatim for consumers + * that reduce the transcript themselves (e.g. the WebShell transcript UI). + */ + onTranscriptUpdate?: (notification: SessionNotification) => void; } export interface ToolCallUpdate { diff --git a/packages/vscode-ide-companion/src/webview/App.tsx b/packages/vscode-ide-companion/src/webview/App.tsx index 423e9294beb..9957f146ead 100644 --- a/packages/vscode-ide-companion/src/webview/App.tsx +++ b/packages/vscode-ide-companion/src/webview/App.tsx @@ -18,6 +18,7 @@ import { useFileContext } from './hooks/file/useFileContext.js'; import { useMessageHandling } from './hooks/message/useMessageHandling.js'; import { useToolCalls } from './hooks/useToolCalls.js'; import { useWebViewMessages } from './hooks/useWebViewMessages.js'; +import { useAcpTranscript } from './hooks/useAcpTranscript.js'; import { shouldSendMessage, useMessageSubmit, @@ -71,6 +72,14 @@ import { buildSlashCommandItems, isExpandableSlashCommand, } from './utils/slashCommandUtils.js'; +// Lazy-load the WebShell transcript renderer so the experimental flag stays +// opt-in at the bundle level: the ~17MB web-shell chunk is fetched only when +// `data-web-shell-transcript` is present on . +const WebShellTranscriptLazy = React.lazy(() => + import('@qwen-code/web-shell').then((module) => ({ + default: module.WebShellTranscript, + })), +); /** * Memoized message list that only re-renders when messages or callbacks change, @@ -1488,6 +1497,22 @@ export const App: React.FC = () => { planEntries.length > 0 || allMessages.length > 0; + // Experimental WebShell transcript rendering, enabled via the + // `qwen-code.experimental.webShellTranscript` setting. The flag is threaded + // from the extension host through a `` + // attribute so the webview can decide once at mount without postMessage. + const webShellTranscriptEnabled = useMemo( + () => + typeof document !== 'undefined' && + document.body.getAttribute('data-web-shell-transcript') === 'true', + [], + ); + const webShellTheme = useMemo<'dark' | 'light'>(() => { + const kind = document.body.getAttribute('data-vscode-theme-kind') ?? ''; + return kind.includes('light') ? 'light' : 'dark'; + }, []); + const transcriptBlocks = useAcpTranscript(); + return (
{/* Top-level loading overlay */} @@ -1532,12 +1557,33 @@ export const App: React.FC = () => {
*]:flex [&>*]:gap-0 [&>*]:items-start [&>*]:text-left [&>*]:py-2 [&>*:not(:last-child)]:pb-[8px] [&>*]:flex-col [&>*]:relative [&>*]:animate-[fadeIn_0.2s_ease-in]' + } data-vscode-context={ - hasContent ? '{"webviewSection": "chat-messages"}' : undefined + hasContent && !webShellTranscriptEnabled + ? '{"webviewSection": "chat-messages"}' + : undefined } > - {!hasContent && !isLoading && !sessionManagement.isSwitchingSession ? ( + {webShellTranscriptEnabled ? ( + + +
+ } + > + + + ) : !hasContent && + !isLoading && + !sessionManagement.isSwitchingSession ? ( isAuthenticated === false ? ( ) : isAuthenticated === null ? ( diff --git a/packages/vscode-ide-companion/src/webview/adapters/acpTranscriptAdapter.test.ts b/packages/vscode-ide-companion/src/webview/adapters/acpTranscriptAdapter.test.ts new file mode 100644 index 00000000000..15b1e9962c5 --- /dev/null +++ b/packages/vscode-ide-companion/src/webview/adapters/acpTranscriptAdapter.test.ts @@ -0,0 +1,46 @@ +/** + * @license + * Copyright 2025 Qwen Team + * SPDX-License-Identifier: Apache-2.0 + */ + +import type { SessionNotification } from '@agentclientprotocol/sdk'; +import { + createDaemonTranscriptState, + selectTranscriptBlocks, +} from '@qwen-code/sdk/daemon'; +import { describe, expect, it } from 'vitest'; +import { reduceSessionNotification } from './acpTranscriptAdapter.js'; + +function userTextNotification(text: string): SessionNotification { + return { + sessionId: 'session-1', + update: { + sessionUpdate: 'user_message_chunk', + content: { type: 'text', text }, + }, + }; +} + +describe('reduceSessionNotification', () => { + it('wraps an ACP notification into a daemon event and reduces it', () => { + const state = reduceSessionNotification( + createDaemonTranscriptState(), + userTextNotification('hello world'), + ); + + const blocks = selectTranscriptBlocks(state); + expect(blocks).toHaveLength(1); + expect(blocks[0]).toMatchObject({ kind: 'user', text: 'hello world' }); + }); + + it('merges consecutive user text chunks into one block', () => { + let state = createDaemonTranscriptState(); + state = reduceSessionNotification(state, userTextNotification('hello ')); + state = reduceSessionNotification(state, userTextNotification('world')); + + const blocks = selectTranscriptBlocks(state); + expect(blocks).toHaveLength(1); + expect(blocks[0]).toMatchObject({ kind: 'user', text: 'hello world' }); + }); +}); diff --git a/packages/vscode-ide-companion/src/webview/adapters/acpTranscriptAdapter.ts b/packages/vscode-ide-companion/src/webview/adapters/acpTranscriptAdapter.ts new file mode 100644 index 00000000000..d66e4a93204 --- /dev/null +++ b/packages/vscode-ide-companion/src/webview/adapters/acpTranscriptAdapter.ts @@ -0,0 +1,30 @@ +/** + * @license + * Copyright 2025 Qwen Team + * SPDX-License-Identifier: Apache-2.0 + * + * Thin adapter that bridges ACP session/update notifications into the shared + * SDK daemon transcript reducer. The ACP `SessionNotification` payload is + * structurally identical to the daemon `session_update` envelope, so no + * per-field projection is needed: wrap the notification once, then let + * `normalizeDaemonEvent` + `reduceDaemonTranscriptEvents` do the work. + */ +import type { SessionNotification } from '@agentclientprotocol/sdk'; +import { + normalizeDaemonEvent, + reduceDaemonTranscriptEvents, +} from '@qwen-code/sdk/daemon'; +import type { DaemonEvent, DaemonTranscriptState } from '@qwen-code/sdk/daemon'; + +/** Reduce one ACP notification into the transcript state. */ +export function reduceSessionNotification( + state: DaemonTranscriptState, + notification: SessionNotification, +): DaemonTranscriptState { + const event: DaemonEvent = { + v: 1, + type: 'session_update', + data: notification, + }; + return reduceDaemonTranscriptEvents(state, normalizeDaemonEvent(event)); +} diff --git a/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.ts b/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.ts new file mode 100644 index 00000000000..52006673861 --- /dev/null +++ b/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.ts @@ -0,0 +1,52 @@ +/** + * @license + * Copyright 2025 Qwen Team + * SPDX-License-Identifier: Apache-2.0 + */ + +import { useEffect, useRef, useState } from 'react'; +import type { SessionNotification } from '@agentclientprotocol/sdk'; +import { + createDaemonTranscriptState, + selectTranscriptBlocks, +} from '@qwen-code/sdk/daemon'; +import type { DaemonTranscriptState } from '@qwen-code/sdk/daemon'; +import { reduceSessionNotification } from '../adapters/acpTranscriptAdapter.js'; + +/** + * Reduce `transcriptUpdate` webview messages into a shared-SDK transcript + * state and expose the rendered blocks. The WebViewProvider only emits these + * messages when the experimental WebShell transcript flag is enabled, so this + * hook is inert (zero messages) in the default configuration. + */ +export function useAcpTranscript() { + const stateRef = useRef(null); + const [blocks, setBlocks] = useState(() => + selectTranscriptBlocks(createDaemonTranscriptState()), + ); + + useEffect(() => { + const handleMessage = (event: MessageEvent) => { + const message = event.data as { + type?: string; + data?: SessionNotification; + }; + if (message?.type !== 'transcriptUpdate' || !message.data) { + return; + } + if (stateRef.current === null) { + stateRef.current = createDaemonTranscriptState(); + } + stateRef.current = reduceSessionNotification( + stateRef.current, + message.data, + ); + setBlocks(selectTranscriptBlocks(stateRef.current)); + }; + + window.addEventListener('message', handleMessage); + return () => window.removeEventListener('message', handleMessage); + }, []); + + return blocks; +} diff --git a/packages/vscode-ide-companion/src/webview/providers/WebViewContent.test.ts b/packages/vscode-ide-companion/src/webview/providers/WebViewContent.test.ts index 3c2029fe53a..ad6919e4e31 100644 --- a/packages/vscode-ide-companion/src/webview/providers/WebViewContent.test.ts +++ b/packages/vscode-ide-companion/src/webview/providers/WebViewContent.test.ts @@ -4,15 +4,35 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { describe, expect, it, vi } from 'vitest'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { WebViewContent } from './WebViewContent.js'; +const { getWebShellTranscriptFlag, setWebShellTranscriptFlag } = vi.hoisted( + () => { + let enabled = false; + return { + getWebShellTranscriptFlag: () => enabled, + setWebShellTranscriptFlag: (value: boolean) => { + enabled = value; + }, + }; + }, +); + vi.mock('vscode', () => ({ Uri: { joinPath: vi.fn((_base: unknown, ...parts: string[]) => ({ fsPath: `/ext/${parts.join('/')}`, })), }, + workspace: { + getConfiguration: vi.fn(() => ({ + get: (key: string, fallback: unknown) => + key === 'experimental.webShellTranscript' + ? getWebShellTranscriptFlag() + : fallback, + })), + }, })); /** @@ -29,6 +49,9 @@ function createMockWebview() { describe('WebViewContent', () => { const fakeExtensionUri = { fsPath: '/ext' } as never; + beforeEach(() => { + setWebShellTranscriptFlag(false); + }); it('generates HTML when given a raw Webview', () => { const webview = createMockWebview(); @@ -64,7 +87,7 @@ describe('WebViewContent', () => { const webview = createMockWebview(); const html = WebViewContent.generate(webview as never, fakeExtensionUri); - expect(html).toContain(' + `; } diff --git a/packages/vscode-ide-companion/src/webview/providers/WebViewProvider.ts b/packages/vscode-ide-companion/src/webview/providers/WebViewProvider.ts index bbf45eb8624..a17cfc926b3 100644 --- a/packages/vscode-ide-companion/src/webview/providers/WebViewProvider.ts +++ b/packages/vscode-ide-companion/src/webview/providers/WebViewProvider.ts @@ -351,6 +351,22 @@ export class WebViewProvider { }); }); + // Forward raw ACP session/update notifications for the WebShell transcript + // UI. Gated on the experimental flag so the default configuration incurs + // no extra per-update overhead. + if ( + vscode.workspace + .getConfiguration('qwen-code') + .get('experimental.webShellTranscript', false) + ) { + this.agentManager.onTranscriptUpdate((notification) => { + this.sendMessageToWebView({ + type: 'transcriptUpdate', + data: notification, + }); + }); + } + // Surface available modes and current mode (from ACP initialize) this.agentManager.onModeInfo((info) => { try { From b843439c57d31b13f6acac382dfc2d54046e7b46 Mon Sep 17 00:00:00 2001 From: yiliang114 Date: Sat, 22 Aug 2026 20:54:58 +0800 Subject: [PATCH 02/57] fix(vscode-ide-companion): grant wasm-unsafe-eval for shiki WASM when WebShell transcript enabled --- .../webview/providers/WebViewContent.test.ts | 19 +++++++++++++++++++ .../src/webview/providers/WebViewContent.ts | 10 +++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/packages/vscode-ide-companion/src/webview/providers/WebViewContent.test.ts b/packages/vscode-ide-companion/src/webview/providers/WebViewContent.test.ts index ad6919e4e31..ed2ece9d59d 100644 --- a/packages/vscode-ide-companion/src/webview/providers/WebViewContent.test.ts +++ b/packages/vscode-ide-companion/src/webview/providers/WebViewContent.test.ts @@ -114,4 +114,23 @@ describe('WebViewContent', () => { expect(html).toContain('data-web-shell-transcript="true"'); }); + + it('keeps script-src without wasm-unsafe-eval when the flag is off', () => { + setWebShellTranscriptFlag(false); + const webview = createMockWebview(); + + const html = WebViewContent.generate(webview as never, fakeExtensionUri); + + expect(html).toContain('script-src https://csp.source;'); + expect(html).not.toContain('wasm-unsafe-eval'); + }); + + it('grants wasm-unsafe-eval to script-src when the flag is on', () => { + setWebShellTranscriptFlag(true); + const webview = createMockWebview(); + + const html = WebViewContent.generate(webview as never, fakeExtensionUri); + + expect(html).toContain("script-src https://csp.source 'wasm-unsafe-eval';"); + }); }); diff --git a/packages/vscode-ide-companion/src/webview/providers/WebViewContent.ts b/packages/vscode-ide-companion/src/webview/providers/WebViewContent.ts index 964f7fb72d8..85ae8d60aed 100644 --- a/packages/vscode-ide-companion/src/webview/providers/WebViewContent.ts +++ b/packages/vscode-ide-companion/src/webview/providers/WebViewContent.ts @@ -52,12 +52,20 @@ export class WebViewContent { ? ' data-web-shell-transcript="true"' : ''; + // The WebShell transcript bundles Shiki, whose Oniguruma engine compiles + // WASM at runtime. `script-src` must therefore grant 'wasm-unsafe-eval' + // when the transcript is enabled; the flag-off path keeps the original CSP + // untouched so legacy users get no widened permission. + const csp = webShellTranscriptEnabled + ? `default-src 'none'; img-src ${webview.cspSource} data:; script-src ${webview.cspSource} 'wasm-unsafe-eval'; style-src ${webview.cspSource} 'unsafe-inline';` + : `default-src 'none'; img-src ${webview.cspSource} data:; script-src ${webview.cspSource}; style-src ${webview.cspSource} 'unsafe-inline';`; + return ` - + Qwen Code From ade51c281f58c94bc95046d48d8586a454fb3568 Mon Sep 17 00:00:00 2001 From: yiliang114 Date: Sat, 22 Aug 2026 23:04:37 +0800 Subject: [PATCH 03/57] feat(vscode-ide-companion): adopt WebShell transcript as default timeline Drop the experimental flag and the legacy MessageList renderer. The companion timeline now always renders through the shared WebShell transcript component, fed by ACP session/update notifications via the SDK daemon transcript reducer (lazy loaded through esbuild code splitting). The flag-gated wiring is removed: the qwen-code.experimental.webShellTranscript setting, the conditional CSP/body attribute in WebViewContent, and the legacy MessageList path in App.tsx (~850 lines). The webview CSP now grants wasm-unsafe-eval unconditionally for Shiki's Oniguruma WASM. --- packages/vscode-ide-companion/package.json | 6 - .../src/webview/App.test.tsx | 55 +- .../vscode-ide-companion/src/webview/App.tsx | 856 +----------------- .../src/webview/hooks/useAcpTranscript.ts | 4 +- .../webview/providers/WebViewContent.test.ts | 55 +- .../src/webview/providers/WebViewContent.ts | 17 +- .../webview/providers/WebViewProvider.test.ts | 1 + .../src/webview/providers/WebViewProvider.ts | 20 +- 8 files changed, 42 insertions(+), 972 deletions(-) diff --git a/packages/vscode-ide-companion/package.json b/packages/vscode-ide-companion/package.json index 8c15c256110..b47ee28de47 100644 --- a/packages/vscode-ide-companion/package.json +++ b/packages/vscode-ide-companion/package.json @@ -227,12 +227,6 @@ "type": "boolean", "default": true, "description": "Show notifications with sound when a task completes (at least 20 seconds) or needs your attention, while you are not actively viewing the Qwen Code panel." - }, - "qwen-code.experimental.webShellTranscript": { - "order": 5, - "type": "boolean", - "default": false, - "markdownDescription": "Render the conversation timeline with the shared WebShell transcript UI (experimental). Requires a window reload after changing." } } }, diff --git a/packages/vscode-ide-companion/src/webview/App.test.tsx b/packages/vscode-ide-companion/src/webview/App.test.tsx index 782bd8a2f39..b8812a10614 100644 --- a/packages/vscode-ide-companion/src/webview/App.test.tsx +++ b/packages/vscode-ide-companion/src/webview/App.test.tsx @@ -284,7 +284,7 @@ vi.mock('./components/layout/InputForm.js', () => ({ ), })); -import { App, getLastUserTurnIndex, type MessageListItem } from './App.js'; +import { App } from './App.js'; function createDomRect(): DOMRect { return { @@ -364,59 +364,6 @@ function renderApp() { return { container, root }; } -describe('getLastUserTurnIndex', () => { - it('returns the latest user turn and ignores assistant messages', () => { - const messages: MessageListItem[] = [ - { - type: 'message', - timestamp: 1, - data: { role: 'user', content: 'first', timestamp: 1, turnIndex: 0 }, - }, - { - type: 'message', - timestamp: 2, - data: { role: 'assistant', content: 'reply', timestamp: 2 }, - }, - { - type: 'message', - timestamp: 3, - data: { role: 'user', content: 'second', timestamp: 3, turnIndex: 1 }, - }, - ]; - - expect(getLastUserTurnIndex(messages)).toBe(1); - }); - - it('keeps image and text parts in the same explicit user turn', () => { - const messages: MessageListItem[] = [ - { - type: 'message', - timestamp: 1, - data: { role: 'user', content: 'first', timestamp: 1, turnIndex: 0 }, - }, - { - type: 'message', - timestamp: 2, - data: { - role: 'user', - content: '', - timestamp: 2, - turnIndex: 1, - kind: 'image', - imagePath: '/tmp/image.png', - }, - }, - { - type: 'message', - timestamp: 2, - data: { role: 'user', content: 'caption', timestamp: 2, turnIndex: 1 }, - }, - ]; - - expect(getLastUserTurnIndex(messages)).toBe(1); - }); -}); - describe('App /skills secondary picker', () => { let root: Root | null = null; let container: HTMLDivElement | null = null; diff --git a/packages/vscode-ide-companion/src/webview/App.tsx b/packages/vscode-ide-companion/src/webview/App.tsx index 9957f146ead..8d9d1a11a25 100644 --- a/packages/vscode-ide-companion/src/webview/App.tsx +++ b/packages/vscode-ide-companion/src/webview/App.tsx @@ -10,7 +10,6 @@ import React, { useRef, useCallback, useMemo, - useLayoutEffect, } from 'react'; import { useVSCode } from './hooks/useVSCode.js'; import { useSessionManagement } from './hooks/session/useSessionManagement.js'; @@ -25,27 +24,14 @@ import { } from './hooks/useMessageSubmit.js'; import type { PermissionOption, PermissionToolCall } from '@qwen-code/webui'; import { stripZeroWidthSpaces } from '@qwen-code/webui'; -import type { TextMessage } from './hooks/message/useMessageHandling.js'; -import type { ToolCallData } from './components/messages/toolcalls/ToolCall.js'; -import { ToolCall } from './components/messages/toolcalls/ToolCall.js'; -import { hasToolCallOutput, shouldShowToolCall } from './utils/utils.js'; import { Onboarding } from './components/layout/Onboarding.js'; import { type CompletionItem } from '../types/completionItemTypes.js'; import { useCompletionTrigger } from './hooks/useCompletionTrigger.js'; import { - AssistantMessage, - UserMessage, - ThinkingMessage, - WaitingMessage, - InterruptedMessage, FileIcon, PermissionDrawer, AskUserQuestionDialog, - InsightProgressCard, - ImageMessageRenderer, ImagePreview, - ZERO_WIDTH_SPACE, - CloseSmallIcon, // Layout components imported directly from webui EmptyState, ChatHeader, @@ -61,7 +47,7 @@ import type { ApprovalModeValue } from '../types/approvalModeValueTypes.js'; import type { PlanEntry, UsageStatsPayload } from '../types/chatTypes.js'; import type { ModelInfo, AvailableCommand } from '@agentclientprotocol/sdk'; import type { Question } from '../types/acpTypes.js'; -import { useImagePaste, type WebViewImageMessage } from './hooks/useImage.js'; +import { useImagePaste } from './hooks/useImage.js'; import { computeContextUsage } from './utils/contextUsage.js'; import { SKILL_ITEM_ID_PREFIX, @@ -72,234 +58,14 @@ import { buildSlashCommandItems, isExpandableSlashCommand, } from './utils/slashCommandUtils.js'; -// Lazy-load the WebShell transcript renderer so the experimental flag stays -// opt-in at the bundle level: the ~17MB web-shell chunk is fetched only when -// `data-web-shell-transcript` is present on . +// Lazy-load the WebShell transcript renderer so the ~17MB web-shell chunk +// stays split into its own bundle and is fetched on demand. const WebShellTranscriptLazy = React.lazy(() => import('@qwen-code/web-shell').then((module) => ({ default: module.WebShellTranscript, })), ); -/** - * Memoized message list that only re-renders when messages or callbacks change, - * not on every keystroke in the input field. - */ -export interface MessageListItem { - type: 'message' | 'in-progress-tool-call' | 'completed-tool-call'; - data: TextMessage | ToolCallData; - timestamp: number; -} - -interface UserTurnCounter { - next: number; -} - -const consumeUserTurnIndex = ( - msg: TextMessage, - counter: UserTurnCounter, -): number => { - if (typeof msg.turnIndex === 'number') { - counter.next = Math.max(counter.next, msg.turnIndex + 1); - return msg.turnIndex; - } - - const fallback = counter.next; - counter.next += 1; - return fallback; -}; - -export const getLastUserTurnIndex = ( - allMessages: MessageListItem[], -): number | null => { - const counter: UserTurnCounter = { next: 0 }; - let lastUserTurnIndex: number | null = null; - - allMessages.forEach((item) => { - if (item.type !== 'message') { - return; - } - - const msg = item.data as TextMessage; - if (msg.role === 'user') { - lastUserTurnIndex = consumeUserTurnIndex(msg, counter); - } - }); - - return lastUserTurnIndex; -}; - -interface MessageListProps { - allMessages: MessageListItem[]; - onFileClick: (path: string) => void; - onEditUserMessage: (targetTurnIndex: number, content: string) => void; - canEditMessages: boolean; - /** - * After each render, this ref is updated with an array that maps - * DOM child position → allMessages index, only for items that - * actually render a DOM element (skipping nulls). - */ - childIndexMap: React.MutableRefObject; -} - -const MessageList = React.memo( - ({ - allMessages, - onFileClick, - onEditUserMessage, - canEditMessages, - childIndexMap, - }) => { - let imageIndex = 0; - const userTurnCounter: UserTurnCounter = { next: 0 }; - const lastUserTurnIndex = getLastUserTurnIndex(allMessages); - - // Build child→allMessages index mapping: for each item that renders - // a non-null element, record its allMessages index. This array's - // position corresponds to the DOM child position in the container. - const mapping: number[] = []; - - const elements = allMessages.map((item, index) => { - let child: React.ReactNode; - switch (item.type) { - case 'message': { - const msg = item.data as TextMessage; - - if (msg.kind === 'image' && msg.imagePath) { - if (msg.role === 'user') { - consumeUserTurnIndex(msg, userTurnCounter); - } - imageIndex += 1; - child = ( - - ); - break; - } - - if (msg.role === 'thinking') { - child = ( - - ); - break; - } - - if (msg.role === 'user') { - const targetTurnIndex = consumeUserTurnIndex(msg, userTurnCounter); - const canEditThisMessage = - canEditMessages && targetTurnIndex === lastUserTurnIndex; - child = ( - - onEditUserMessage(targetTurnIndex, msg.content || '') - : undefined - } - /> - ); - break; - } - - { - const content = (msg.content || '').trim(); - if (!content) { - child = null; - break; - } - if (content === 'Interrupted' || content === 'Tool interrupted') { - child = ; - break; - } - child = ( - - ); - } - break; - } - - case 'in-progress-tool-call': - case 'completed-tool-call': { - const tc = item.data as ToolCallData; - if (!shouldShowToolCall(tc.kind)) { - child = null; - break; - } - child = ; - break; - } - - default: - child = null; - } - // No wrapper div — message components render directly as children - // of the scroll container, preserving the original CSS layout. - if (child == null) { - return null; - } - mapping.push(index); - return {child}; - }); - - // Update the mapping ref so the copy handler can use it - childIndexMap.current = mapping; - - return <>{elements}; - }, -); - -MessageList.displayName = 'MessageList'; - -/** - * Given a click target inside the messages container, find which - * allMessages index it belongs to by walking up from the target to - * the container's direct child, then mapping through childIndexMap. - * - * NOTE: childIndexMap indices correspond to MessageList's DOM children - * which must be the first N children of the container. Elements rendered - * after MessageList (InsightProgressCard, WaitingMessage, etc.) are - * excluded from the map and will correctly return -1. - */ -function findMessageIndex( - target: Element, - container: Element, - childIndexMap: number[], -): number { - // Walk up from the click target to find the direct child of the container. - // This works for all message types regardless of whether they have - // .qwen-message class (e.g. InterruptedMessage does not). - let directChild: Element | null = target; - while (directChild && directChild.parentElement !== container) { - directChild = directChild.parentElement; - } - if (!directChild) { - return -1; - } - - // Find DOM child position among container's children - const children = container.children; - for (let i = 0; i < children.length; i++) { - if (children[i] === directChild) { - return i < childIndexMap.length ? childIndexMap[i] : -1; - } - } - return -1; -} - export const App: React.FC = () => { const vscode = useVSCode(); @@ -338,22 +104,8 @@ export const App: React.FC = () => { >([]); const [availableSkills, setAvailableSkills] = useState([]); const [availableModels, setAvailableModels] = useState([]); - const [insightProgress, setInsightProgress] = useState<{ - stage: string; - progress: number; - detail?: string; - } | null>(null); - const [insightReportPath, setInsightReportPath] = useState( - null, - ); const [showModelSelector, setShowModelSelector] = useState(false); const [accountInfo, setAccountInfo] = useState(null); - const messagesEndRef = useRef(null); - // Maps DOM child position → allMessages index. Built during render by - // MessageList, only includes items that actually produce DOM elements. - const childIndexMapRef = useRef([]); - // Scroll container for message list; used to keep the view anchored to the latest content - const messagesContainerRef = useRef(null); const inputFieldRef = useRef(null); const [editMode, setEditMode] = useState( @@ -361,9 +113,6 @@ export const App: React.FC = () => { ); const [thinkingEnabled, setThinkingEnabled] = useState(false); const [isComposing, setIsComposing] = useState(false); - const [editingMessage, setEditingMessage] = useState<{ - targetTurnIndex: number; - } | null>(null); // When true, do NOT auto-attach the active editor file/selection to message context const [skipAutoActiveContext, setSkipAutoActiveContext] = useState(false); @@ -547,67 +296,11 @@ export const App: React.FC = () => { }, }); - const setComposerText = useCallback( - (text: string) => { - setInputText(text); - const inputElement = inputFieldRef.current; - if (!inputElement) { - return; - } - - inputElement.textContent = text || ZERO_WIDTH_SPACE; - inputElement.setAttribute( - 'data-empty', - text.trim().length === 0 ? 'true' : 'false', - ); - inputElement.focus(); - - requestAnimationFrame(() => { - const selection = window.getSelection(); - if (!selection) { - return; - } - const range = document.createRange(); - range.selectNodeContents(inputElement); - range.collapse(false); - selection.removeAllRanges(); - selection.addRange(range); - }); - }, - [setInputText], - ); - - const handleEditUserMessage = useCallback( - (targetTurnIndex: number, content: string) => { - if (messageHandling.isStreaming || messageHandling.isWaitingForResponse) { - return; - } - clearImages(); - setEditingMessage({ targetTurnIndex }); - setComposerText(content); - }, - [ - clearImages, - messageHandling.isStreaming, - messageHandling.isWaitingForResponse, - setComposerText, - ], - ); - - const clearEditingMessage = useCallback(() => { - setEditingMessage(null); - setComposerText(''); - clearImages(); - fileContext.clearFileReferences(); - }, [clearImages, fileContext, setComposerText]); - const { handleSubmit: submitMessage } = useMessageSubmit({ inputText, setInputText, attachedImages, clearImages, - editTargetTurnIndex: editingMessage?.targetTurnIndex ?? null, - onSubmitted: () => setEditingMessage(null), messageHandling, fileContext, skipAutoActiveContext, @@ -617,42 +310,6 @@ export const App: React.FC = () => { isWaitingForResponse: messageHandling.isWaitingForResponse, }); - useEffect(() => { - const clearEditingOnRestoreOrFailure = (event: MessageEvent) => { - const message = event.data; - if ( - message?.type === 'conversationLoaded' || - message?.type === 'qwenSessionSwitched' || - message?.type === 'conversationCleared' - ) { - setEditingMessage(null); - return; - } - - if (message?.type === 'streamEnd') { - const reason = String(message.data?.reason ?? '').toLowerCase(); - if ( - reason === 'user_cancelled' || - reason === 'cancelled' || - reason === 'timeout' || - reason === 'error' || - reason === 'session_expired' - ) { - setEditingMessage(null); - } - return; - } - - if (message?.type === 'error' || message?.type === 'sessionExpired') { - setEditingMessage(null); - } - }; - - window.addEventListener('message', clearEditingOnRestoreOrFailure); - return () => - window.removeEventListener('message', clearEditingOnRestoreOrFailure); - }, []); - const canSubmit = shouldSendMessage({ inputText, attachedImages, @@ -663,15 +320,6 @@ export const App: React.FC = () => { // Handle cancel/stop from the input bar // Emit a cancel to the extension and immediately reflect interruption locally. const handleCancel = useCallback(() => { - if ( - editingMessage && - !messageHandling.isStreaming && - !messageHandling.isWaitingForResponse - ) { - clearEditingMessage(); - return; - } - if (!messageHandling.isStreaming && !messageHandling.isWaitingForResponse) { const inputElement = inputFieldRef.current; if (inputElement) { @@ -711,14 +359,7 @@ export const App: React.FC = () => { type: 'cancelStreaming', data: {}, }); - }, [ - clearEditingMessage, - editingMessage, - inputFieldRef, - messageHandling, - setInputText, - vscode, - ]); + }, [inputFieldRef, messageHandling, setInputText, vscode]); // Message handling useWebViewMessages({ @@ -751,121 +392,8 @@ export const App: React.FC = () => { setAccountInfo: (info) => { setAccountInfo(info); }, - setInsightReportPath, - setInsightProgress, }); - // Auto-scroll handling: keep the view pinned to bottom when new content arrives, - // but don't interrupt the user if they scrolled up. - // We track whether the user is currently "pinned" to the bottom (near the end). - const [pinnedToBottom, setPinnedToBottom] = useState(true); - const prevCountsRef = useRef({ msgLen: 0, inProgLen: 0, doneLen: 0 }); - - // Observe scroll position to know if user has scrolled away from the bottom. - useEffect(() => { - const container = messagesContainerRef.current; - if (!container) { - return; - } - - const onScroll = () => { - // Use a small threshold so slight deltas don't flip the state. - // Note: there's extra bottom padding for the input area, so keep this a bit generous. - const threshold = 80; // px tolerance - const distanceFromBottom = - container.scrollHeight - (container.scrollTop + container.clientHeight); - setPinnedToBottom(distanceFromBottom <= threshold); - }; - - // Initialize once mounted so first render is correct - onScroll(); - container.addEventListener('scroll', onScroll, { passive: true }); - return () => container.removeEventListener('scroll', onScroll); - }, []); - - // When content changes, if the user is pinned to bottom, keep it anchored there. - // Only smooth-scroll when new items are appended; do not smooth for streaming chunk updates. - useLayoutEffect(() => { - const container = messagesContainerRef.current; - if (!container) { - return; - } - - // Detect whether new items were appended (vs. streaming chunk updates) - const prev = prevCountsRef.current; - const newMsg = messageHandling.messages.length > prev.msgLen; - const newInProg = inProgressToolCalls.length > prev.inProgLen; - const newDone = completedToolCalls.length > prev.doneLen; - prevCountsRef.current = { - msgLen: messageHandling.messages.length, - inProgLen: inProgressToolCalls.length, - doneLen: completedToolCalls.length, - }; - - if (!pinnedToBottom) { - // Do nothing if user scrolled away; avoid stealing scroll. - return; - } - - const smooth = newMsg || newInProg || newDone; // avoid smooth on streaming chunks - - // Anchor to the bottom on next frame to avoid layout thrash. - const raf = requestAnimationFrame(() => { - const top = container.scrollHeight - container.clientHeight; - // Use scrollTo to avoid cross-context issues with scrollIntoView. - container.scrollTo({ top, behavior: smooth ? 'smooth' : 'auto' }); - }); - return () => cancelAnimationFrame(raf); - }, [ - pinnedToBottom, - messageHandling.messages, - inProgressToolCalls, - completedToolCalls, - messageHandling.isWaitingForResponse, - messageHandling.loadingMessage, - messageHandling.isStreaming, - planEntries, - ]); - - // When the last rendered item resizes (e.g., images/code blocks load/expand), - // if we're pinned to bottom, keep it anchored there. - useEffect(() => { - const container = messagesContainerRef.current; - const endEl = messagesEndRef.current; - if (!container || !endEl) { - return; - } - - const lastItem = endEl.previousElementSibling as HTMLElement | null; - if (!lastItem) { - return; - } - - let frame = 0; - const ro = new ResizeObserver(() => { - if (!pinnedToBottom) { - return; - } - // Defer to next frame to avoid thrash during rapid size changes - cancelAnimationFrame(frame); - frame = requestAnimationFrame(() => { - const top = container.scrollHeight - container.clientHeight; - container.scrollTo({ top }); - }); - }); - ro.observe(lastItem); - - return () => { - cancelAnimationFrame(frame); - ro.disconnect(); - }; - }, [ - pinnedToBottom, - messageHandling.messages, - inProgressToolCalls, - completedToolCalls, - ]); - // Set loading state to false after initial mount and when we have authentication info useEffect(() => { if (isAuthenticated !== null) { @@ -1212,16 +740,6 @@ export const App: React.FC = () => { }); }, [vscode]); - const handleOpenInsightReport = useCallback(() => { - if (!insightReportPath) { - return; - } - vscode.postMessage({ - type: 'openInsightReport', - data: { path: insightReportPath }, - }); - }, [insightReportPath, vscode]); - // Handle toggle edit mode (Default -> Auto-edit -> YOLO -> Default) const handleToggleEditMode = useCallback(() => { setEditMode((prev) => { @@ -1259,254 +777,13 @@ export const App: React.FC = () => { setThinkingEnabled((prev) => !prev); }, []); - // When user sends a message after scrolling up, re-pin and jump to the bottom - const handleSubmitWithScroll = useCallback( - (e: React.FormEvent | React.KeyboardEvent, explicitText?: string) => { - setPinnedToBottom(true); - - const container = messagesContainerRef.current; - if (container) { - const top = container.scrollHeight - container.clientHeight; - container.scrollTo({ top }); - } - - submitMessage(e, explicitText); - }, - [submitMessage], - ); - - // Create unified message array containing all types of messages and tool calls - const allMessages = useMemo< - Array<{ - type: 'message' | 'in-progress-tool-call' | 'completed-tool-call'; - data: TextMessage | ToolCallData; - timestamp: number; - }> - >(() => { - // Regular messages - const regularMessages = messageHandling.messages.map((msg) => ({ - type: 'message' as const, - data: msg, - timestamp: msg.timestamp, - })); - - // In-progress tool calls - const inProgressTools = inProgressToolCalls.map((toolCall) => ({ - type: 'in-progress-tool-call' as const, - data: toolCall, - timestamp: toolCall.timestamp ?? 0, - })); - - // Completed tool calls - const completedTools = completedToolCalls - .filter(hasToolCallOutput) - .map((toolCall) => ({ - type: 'completed-tool-call' as const, - data: toolCall, - timestamp: toolCall.timestamp ?? 0, - })); - - // Merge and sort by timestamp to ensure messages and tool calls are interleaved - return [...regularMessages, ...inProgressTools, ...completedTools].sort( - (a, b) => (a.timestamp || 0) - (b.timestamp || 0), - ); - }, [messageHandling.messages, inProgressToolCalls, completedToolCalls]); - - const handleFileClick = useCallback( - (path: string): void => { - vscode.postMessage({ - type: 'openFile', - data: { path }, - }); - }, - [vscode], - ); - - // Build a markdown code fence that won't collide with content containing backticks - const buildFence = useCallback((content: string): string => { - const matches = (content ?? '').match(/`+/g); - const maxRun = matches ? Math.max(...matches.map((m) => m.length)) : 0; - return '`'.repeat(Math.max(3, maxRun + 1)); - }, []); - - // Format a tool call's content for clipboard copy - // wrapCodeBlock: true for Copy All (markdown), false for single Copy Message (plain text) - const formatToolCallForCopy = useCallback( - (tc: ToolCallData, wrapCodeBlock = false): string => { - const parts: string[] = []; - if (tc.content) { - for (const c of tc.content) { - if (c.type === 'content' && c.content?.text) { - if (wrapCodeBlock) { - const fence = buildFence(c.content.text); - parts.push(`${fence}\n${c.content.text}\n${fence}`); - } else { - parts.push(c.content.text); - } - } else if (c.type === 'diff') { - const filePath = c.path || ''; - if (c.oldText) { - const oldLines = c.oldText - .split('\n') - .map((l) => `-${l}`) - .join('\n'); - const newLines = (c.newText || '') - .split('\n') - .map((l) => `+${l}`) - .join('\n'); - const diffContent = `--- ${filePath}\n+++ ${filePath}\n${oldLines}\n${newLines}`; - if (wrapCodeBlock) { - const fence = buildFence(diffContent); - parts.push(`${fence}diff\n${diffContent}\n${fence}`); - } else { - parts.push(diffContent); - } - } else { - if (wrapCodeBlock) { - const fence = buildFence(c.newText || ''); - parts.push( - `${filePath}:\n${fence}\n${c.newText || ''}\n${fence}`, - ); - } else { - parts.push(`${filePath}:\n${c.newText || ''}`); - } - } - } - } - } - return parts.join('\n\n'); - }, - [buildFence], - ); - - // Track which message was right-clicked by resolving the index immediately. - // Storing the DOM element reference would be fragile: React re-renders between - // the right-click and the async copy command (routed via extension host) can - // detach the element, causing findMessageIndex to fail intermittently. - const contextMenuMsgIdxRef = useRef(-1); - useEffect(() => { - const trackTarget = (e: MouseEvent) => { - const container = messagesContainerRef.current; - if (container && e.target instanceof Element) { - contextMenuMsgIdxRef.current = findMessageIndex( - e.target, - container, - childIndexMapRef.current, - ); - } - // Notify extension that this webview was right-clicked, so copy commands route here - vscode.postMessage({ type: 'contextMenuTriggered', data: {} }); - }; - document.addEventListener('contextmenu', trackTarget, true); - return () => document.removeEventListener('contextmenu', trackTarget, true); - }, [vscode]); - - // Copy text via the extension host's clipboard API (more reliable than navigator.clipboard in webview) - const copyToClipboard = useCallback( - (text: string) => { - vscode.postMessage({ type: 'copyToClipboard', data: { text } }); - }, - [vscode], - ); - - // Handle copy commands from VSCode native context menu - useEffect(() => { - const handler = (event: MessageEvent) => { - const message = event.data; - if (message?.type !== 'copyCommand') { - return; - } - - const { action } = message.data as { action: string }; - - if (action === 'copyMessage') { - const idx = contextMenuMsgIdxRef.current; - if (idx >= 0 && idx < allMessages.length) { - const item = allMessages[idx]; - if (item.type === 'message') { - const msg = item.data as TextMessage; - if (msg.kind === 'image' && msg.imagePath) { - copyToClipboard(`![image](${msg.imagePath})`); - } else { - copyToClipboard(msg.content || ''); - } - } else if ( - item.type === 'completed-tool-call' || - item.type === 'in-progress-tool-call' - ) { - copyToClipboard(formatToolCallForCopy(item.data as ToolCallData)); - } - } - } else if (action === 'copyAllMessages') { - const parts: string[] = []; - for (const item of allMessages) { - if (item.type === 'message') { - const msg = item.data as TextMessage; - const content = - msg.kind === 'image' && msg.imagePath - ? `![image](${msg.imagePath})` - : (msg.content || '').trim(); - if (!content) { - continue; - } - if (msg.role === 'user') { - parts.push(`**User:** ${content}`); - } else if (msg.role === 'thinking') { - parts.push(`**Thinking:** ${content}`); - } else { - parts.push(`**Qwen Code:** ${content}`); - } - } else if ( - item.type === 'completed-tool-call' || - item.type === 'in-progress-tool-call' - ) { - const tc = item.data as ToolCallData; - if (!shouldShowToolCall(tc.kind)) { - continue; - } - const text = formatToolCallForCopy(tc, true); - if (text) { - parts.push(`**[Tool: ${tc.kind}]**\n\n${text}`); - } - } - } - copyToClipboard(parts.join('\n\n---\n\n')); - } else if (action === 'copyLastReply') { - for (let i = allMessages.length - 1; i >= 0; i--) { - const item = allMessages[i]; - if (item.type === 'message') { - const msg = item.data as TextMessage; - if (msg.role === 'assistant' && msg.content?.trim()) { - copyToClipboard(msg.content); - return; - } - } - } - } - }; - - window.addEventListener('message', handler); - return () => window.removeEventListener('message', handler); - }, [allMessages, copyToClipboard, formatToolCallForCopy]); - const hasContent = messageHandling.messages.length > 0 || messageHandling.isStreaming || inProgressToolCalls.length > 0 || completedToolCalls.length > 0 || - planEntries.length > 0 || - allMessages.length > 0; - - // Experimental WebShell transcript rendering, enabled via the - // `qwen-code.experimental.webShellTranscript` setting. The flag is threaded - // from the extension host through a `` - // attribute so the webview can decide once at mount without postMessage. - const webShellTranscriptEnabled = useMemo( - () => - typeof document !== 'undefined' && - document.body.getAttribute('data-web-shell-transcript') === 'true', - [], - ); + planEntries.length > 0; + const webShellTheme = useMemo<'dark' | 'light'>(() => { const kind = document.body.getAttribute('data-vscode-theme-kind') ?? ''; return kind.includes('light') ? 'light' : 'dark'; @@ -1555,35 +832,8 @@ export const App: React.FC = () => { } /> -
*]:flex [&>*]:gap-0 [&>*]:items-start [&>*]:text-left [&>*]:py-2 [&>*:not(:last-child)]:pb-[8px] [&>*]:flex-col [&>*]:relative [&>*]:animate-[fadeIn_0.2s_ease-in]' - } - data-vscode-context={ - hasContent && !webShellTranscriptEnabled - ? '{"webviewSection": "chat-messages"}' - : undefined - } - > - {webShellTranscriptEnabled ? ( - - -
- } - > - - - ) : !hasContent && - !isLoading && - !sessionManagement.isSwitchingSession ? ( +
+ {!hasContent && !isLoading && !sessionManagement.isSwitchingSession ? ( isAuthenticated === false ? ( ) : isAuthenticated === null ? ( @@ -1606,56 +856,18 @@ export const App: React.FC = () => { ) ) : ( - <> - {/* Render all messages and tool calls */} - - - {insightProgress && ( - - )} - - {insightReportPath && ( - - )} - - {/* Waiting message positioned fixed above the input form to avoid layout shifts */} - {messageHandling.isWaitingForResponse && - messageHandling.loadingMessage && ( -
- -
- )} -
- + } + > + + )}
@@ -1676,7 +888,7 @@ export const App: React.FC = () => { onCompositionStart={() => setIsComposing(true)} onCompositionEnd={() => setIsComposing(false)} onKeyDown={handleInputKeyDown} - onSubmit={handleSubmitWithScroll} + onSubmit={submitMessage} onCancel={handleCancel} onToggleEditMode={handleToggleEditMode} onToggleThinking={handleToggleThinking} @@ -1728,29 +940,11 @@ export const App: React.FC = () => { onCompletionClose={closeCompletion} canSubmit={canSubmit} extraContent={ - editingMessage || attachedImages.length > 0 ? ( - <> - {editingMessage && ( -
- Editing message - -
- )} - {attachedImages.length > 0 ? ( - - ) : null} - + attachedImages.length > 0 ? ( + ) : null } showModelSelector={showModelSelector} diff --git a/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.ts b/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.ts index 52006673861..d59b592cd4f 100644 --- a/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.ts +++ b/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.ts @@ -15,9 +15,7 @@ import { reduceSessionNotification } from '../adapters/acpTranscriptAdapter.js'; /** * Reduce `transcriptUpdate` webview messages into a shared-SDK transcript - * state and expose the rendered blocks. The WebViewProvider only emits these - * messages when the experimental WebShell transcript flag is enabled, so this - * hook is inert (zero messages) in the default configuration. + * state and expose the rendered blocks. */ export function useAcpTranscript() { const stateRef = useRef(null); diff --git a/packages/vscode-ide-companion/src/webview/providers/WebViewContent.test.ts b/packages/vscode-ide-companion/src/webview/providers/WebViewContent.test.ts index ed2ece9d59d..e1bc309d5eb 100644 --- a/packages/vscode-ide-companion/src/webview/providers/WebViewContent.test.ts +++ b/packages/vscode-ide-companion/src/webview/providers/WebViewContent.test.ts @@ -4,35 +4,15 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { describe, expect, it, vi } from 'vitest'; import { WebViewContent } from './WebViewContent.js'; -const { getWebShellTranscriptFlag, setWebShellTranscriptFlag } = vi.hoisted( - () => { - let enabled = false; - return { - getWebShellTranscriptFlag: () => enabled, - setWebShellTranscriptFlag: (value: boolean) => { - enabled = value; - }, - }; - }, -); - vi.mock('vscode', () => ({ Uri: { joinPath: vi.fn((_base: unknown, ...parts: string[]) => ({ fsPath: `/ext/${parts.join('/')}`, })), }, - workspace: { - getConfiguration: vi.fn(() => ({ - get: (key: string, fallback: unknown) => - key === 'experimental.webShellTranscript' - ? getWebShellTranscriptFlag() - : fallback, - })), - }, })); /** @@ -49,9 +29,6 @@ function createMockWebview() { describe('WebViewContent', () => { const fakeExtensionUri = { fsPath: '/ext' } as never; - beforeEach(() => { - setWebShellTranscriptFlag(false); - }); it('generates HTML when given a raw Webview', () => { const webview = createMockWebview(); @@ -97,40 +74,18 @@ describe('WebViewContent', () => { expect(html).toContain('data-extension-uri='); }); - it('omits data-web-shell-transcript when the flag is off', () => { - setWebShellTranscriptFlag(false); - const webview = createMockWebview(); - - const html = WebViewContent.generate(webview as never, fakeExtensionUri); - - expect(html).not.toContain('data-web-shell-transcript'); - }); - it('sets data-web-shell-transcript="true" when the flag is on', () => { - setWebShellTranscriptFlag(true); + it('grants wasm-unsafe-eval to script-src unconditionally', () => { const webview = createMockWebview(); - const html = WebViewContent.generate(webview as never, fakeExtensionUri); - expect(html).toContain('data-web-shell-transcript="true"'); - }); - - it('keeps script-src without wasm-unsafe-eval when the flag is off', () => { - setWebShellTranscriptFlag(false); - const webview = createMockWebview(); - - const html = WebViewContent.generate(webview as never, fakeExtensionUri); - - expect(html).toContain('script-src https://csp.source;'); - expect(html).not.toContain('wasm-unsafe-eval'); + expect(html).toContain("script-src https://csp.source 'wasm-unsafe-eval';"); }); - it('grants wasm-unsafe-eval to script-src when the flag is on', () => { - setWebShellTranscriptFlag(true); + it('does not set data-web-shell-transcript on the body', () => { const webview = createMockWebview(); - const html = WebViewContent.generate(webview as never, fakeExtensionUri); - expect(html).toContain("script-src https://csp.source 'wasm-unsafe-eval';"); + expect(html).not.toContain('data-web-shell-transcript'); }); }); diff --git a/packages/vscode-ide-companion/src/webview/providers/WebViewContent.ts b/packages/vscode-ide-companion/src/webview/providers/WebViewContent.ts index 85ae8d60aed..4b583b4c417 100644 --- a/packages/vscode-ide-companion/src/webview/providers/WebViewContent.ts +++ b/packages/vscode-ide-companion/src/webview/providers/WebViewContent.ts @@ -45,20 +45,9 @@ export class WebViewContent { const safeExtensionUri = escapeHtml(extensionUriForWebview.toString()); const safeScriptUri = escapeHtml(scriptUri.toString()); - const webShellTranscriptEnabled = vscode.workspace - .getConfiguration('qwen-code') - .get('experimental.webShellTranscript', false); - const webShellTranscriptAttr = webShellTranscriptEnabled - ? ' data-web-shell-transcript="true"' - : ''; - // The WebShell transcript bundles Shiki, whose Oniguruma engine compiles - // WASM at runtime. `script-src` must therefore grant 'wasm-unsafe-eval' - // when the transcript is enabled; the flag-off path keeps the original CSP - // untouched so legacy users get no widened permission. - const csp = webShellTranscriptEnabled - ? `default-src 'none'; img-src ${webview.cspSource} data:; script-src ${webview.cspSource} 'wasm-unsafe-eval'; style-src ${webview.cspSource} 'unsafe-inline';` - : `default-src 'none'; img-src ${webview.cspSource} data:; script-src ${webview.cspSource}; style-src ${webview.cspSource} 'unsafe-inline';`; + // WASM at runtime, so script-src grants 'wasm-unsafe-eval'. + const csp = `default-src 'none'; img-src ${webview.cspSource} data:; script-src ${webview.cspSource} 'wasm-unsafe-eval'; style-src ${webview.cspSource} 'unsafe-inline';`; return ` @@ -68,7 +57,7 @@ export class WebViewContent { Qwen Code - +
diff --git a/packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts b/packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts index 59624e456ad..c5d782ad72c 100644 --- a/packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts +++ b/packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts @@ -252,6 +252,7 @@ vi.mock('../../services/qwenAgentManager.js', () => ({ askUserQuestionCallbackRef.current = callback; }, ); + onTranscriptUpdate = vi.fn(); onDisconnected = vi.fn(); permissionRequestCallback?: (request: unknown) => Promise; cancelCurrentPrompt = vi.fn(); diff --git a/packages/vscode-ide-companion/src/webview/providers/WebViewProvider.ts b/packages/vscode-ide-companion/src/webview/providers/WebViewProvider.ts index a17cfc926b3..31a1b681b77 100644 --- a/packages/vscode-ide-companion/src/webview/providers/WebViewProvider.ts +++ b/packages/vscode-ide-companion/src/webview/providers/WebViewProvider.ts @@ -351,21 +351,13 @@ export class WebViewProvider { }); }); - // Forward raw ACP session/update notifications for the WebShell transcript - // UI. Gated on the experimental flag so the default configuration incurs - // no extra per-update overhead. - if ( - vscode.workspace - .getConfiguration('qwen-code') - .get('experimental.webShellTranscript', false) - ) { - this.agentManager.onTranscriptUpdate((notification) => { - this.sendMessageToWebView({ - type: 'transcriptUpdate', - data: notification, - }); + // Forward raw ACP session/update notifications for the WebShell transcript UI. + this.agentManager.onTranscriptUpdate((notification) => { + this.sendMessageToWebView({ + type: 'transcriptUpdate', + data: notification, }); - } + }); // Surface available modes and current mode (from ACP initialize) this.agentManager.onModeInfo((info) => { From 778fee0f9c6bddffefefa4fcb00dad4f7849d5fd Mon Sep 17 00:00:00 2001 From: "jinjing.zzj" Date: Sat, 22 Aug 2026 23:12:32 +0800 Subject: [PATCH 04/57] fix(vscode-ide-companion): reset WebShell transcript state on session switch The experimental useAcpTranscript hook only consumed transcriptUpdate messages, so its reducer state survived session boundaries. When the extension switched sessions it kept the webview mounted and replayed the newly-selected session through ACP, causing the previous session's blocks to merge with the new replay (e.g. user text "alpha" from session A leaked into session B as "alphabeta"). Reset both the reducer state and the rendered blocks on the same boundaries the legacy message flow uses: qwenSessionSwitched (sent before the ACP replay of the selected session) and conversationCleared (new session). Adds a regression test that replays two sessions with a switch between them. --- .../webview/hooks/useAcpTranscript.test.ts | 145 ++++++++++++++++++ .../src/webview/hooks/useAcpTranscript.ts | 17 ++ 2 files changed, 162 insertions(+) create mode 100644 packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.test.ts diff --git a/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.test.ts b/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.test.ts new file mode 100644 index 00000000000..b81c0479ac1 --- /dev/null +++ b/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.test.ts @@ -0,0 +1,145 @@ +/** + * @license + * Copyright 2025 Qwen Team + * SPDX-License-Identifier: Apache-2.0 + */ + +/** @vitest-environment jsdom */ + +import { act, createElement } from 'react'; +import { createRoot, type Root } from 'react-dom/client'; +import type { SessionNotification } from '@agentclientprotocol/sdk'; +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; +import { useAcpTranscript } from './useAcpTranscript.js'; + +function userTextNotification( + sessionId: string, + text: string, +): SessionNotification { + return { + sessionId, + update: { + sessionUpdate: 'user_message_chunk', + content: { type: 'text', text }, + }, + }; +} + +function postToWebview(message: unknown): void { + window.dispatchEvent(new MessageEvent('message', { data: message })); +} + +describe('useAcpTranscript', () => { + let root: Root | null = null; + let container: HTMLDivElement | null = null; + let captured: { blocks: ReturnType }; + + beforeEach(() => { + ( + globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT?: boolean } + ).IS_REACT_ACT_ENVIRONMENT = true; + captured = { blocks: [] }; + container = document.createElement('div'); + document.body.appendChild(container); + root = createRoot(container); + + function Harness() { + captured.blocks = useAcpTranscript(); + return null; + } + + act(() => { + root?.render(createElement(Harness)); + }); + }); + + afterEach(() => { + if (root) { + act(() => { + root?.unmount(); + }); + root = null; + } + if (container) { + container.remove(); + container = null; + } + }); + + it('reduces transcriptUpdate messages into rendered blocks', () => { + act(() => { + postToWebview({ + type: 'transcriptUpdate', + data: userTextNotification('session-a', 'hello '), + }); + }); + act(() => { + postToWebview({ + type: 'transcriptUpdate', + data: userTextNotification('session-a', 'world'), + }); + }); + + expect(captured.blocks).toHaveLength(1); + expect(captured.blocks[0]).toMatchObject({ + kind: 'user', + text: 'hello world', + }); + }); + + it('resets transcript state when qwenSessionSwitched arrives between sessions', () => { + // Session A replays its own user text. + act(() => { + postToWebview({ + type: 'transcriptUpdate', + data: userTextNotification('session-a', 'alpha'), + }); + }); + expect(captured.blocks).toHaveLength(1); + + // Session boundary: the extension clears the UI before replaying the + // newly-selected session through ACP. + act(() => { + postToWebview({ + type: 'qwenSessionSwitched', + data: { sessionId: 'session-b', messages: [] }, + }); + }); + expect(captured.blocks).toHaveLength(0); + + // Session B's replay must not merge with session A's leftover state. + act(() => { + postToWebview({ + type: 'transcriptUpdate', + data: userTextNotification('session-b', 'beta'), + }); + }); + + expect(captured.blocks).toHaveLength(1); + expect(captured.blocks[0]).toMatchObject({ kind: 'user', text: 'beta' }); + }); + + it('resets transcript state when a new session clears the conversation', () => { + act(() => { + postToWebview({ + type: 'transcriptUpdate', + data: userTextNotification('session-a', 'alpha'), + }); + }); + expect(captured.blocks).toHaveLength(1); + + act(() => { + postToWebview({ type: 'conversationCleared', data: {} }); + }); + expect(captured.blocks).toHaveLength(0); + + act(() => { + postToWebview({ + type: 'transcriptUpdate', + data: userTextNotification('session-b', 'beta'), + }); + }); + expect(captured.blocks).toHaveLength(1); + expect(captured.blocks[0]).toMatchObject({ kind: 'user', text: 'beta' }); + }); +}); diff --git a/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.ts b/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.ts index d59b592cd4f..a53722c5f54 100644 --- a/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.ts +++ b/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.ts @@ -16,6 +16,11 @@ import { reduceSessionNotification } from '../adapters/acpTranscriptAdapter.js'; /** * Reduce `transcriptUpdate` webview messages into a shared-SDK transcript * state and expose the rendered blocks. + * + * The transcript state resets on the session boundaries used by the rest of + * the webview message flow (`qwenSessionSwitched` before an ACP replay, and + * `conversationCleared` for a new session), so blocks from one session can + * never leak into another session's replay. */ export function useAcpTranscript() { const stateRef = useRef(null); @@ -24,11 +29,23 @@ export function useAcpTranscript() { ); useEffect(() => { + const resetTranscript = () => { + stateRef.current = null; + setBlocks(selectTranscriptBlocks(createDaemonTranscriptState())); + }; + const handleMessage = (event: MessageEvent) => { const message = event.data as { type?: string; data?: SessionNotification; }; + if ( + message?.type === 'qwenSessionSwitched' || + message?.type === 'conversationCleared' + ) { + resetTranscript(); + return; + } if (message?.type !== 'transcriptUpdate' || !message.data) { return; } From 2bad894ec109177a953286c7949cef578c347fa7 Mon Sep 17 00:00:00 2001 From: "jinjing.zzj" Date: Sun, 23 Aug 2026 06:38:42 +0800 Subject: [PATCH 05/57] fix(vscode-ide-companion): harden WebShell transcript session boundaries - reset the transcript on `conversationLoaded` too, closing the same cross-session leak the previous commit fixed for `qwenSessionSwitched` and `conversationCleared` (agent reconnect posts only this boundary) - track the active session id and drop late `transcriptUpdate` frames whose `sessionId` no longer matches, so a previous session's trailing frames cannot contaminate the next session's timeline - seed the transcript from cached messages carried by `qwenSessionSwitched` so offline restores and load-failure fallbacks render their history instead of a blank timeline - dispatch `assistant.done` on `streamEnd`/`sessionLoadComplete` so the final assistant/thought block of a turn (or history replay) does not stay `streaming: true` forever --- .../webview/adapters/acpTranscriptAdapter.ts | 41 +++++ .../webview/hooks/useAcpTranscript.test.ts | 169 ++++++++++++++++++ .../src/webview/hooks/useAcpTranscript.ts | 96 +++++++++- 3 files changed, 298 insertions(+), 8 deletions(-) diff --git a/packages/vscode-ide-companion/src/webview/adapters/acpTranscriptAdapter.ts b/packages/vscode-ide-companion/src/webview/adapters/acpTranscriptAdapter.ts index d66e4a93204..e7cf7778fb6 100644 --- a/packages/vscode-ide-companion/src/webview/adapters/acpTranscriptAdapter.ts +++ b/packages/vscode-ide-companion/src/webview/adapters/acpTranscriptAdapter.ts @@ -28,3 +28,44 @@ export function reduceSessionNotification( }; return reduceDaemonTranscriptEvents(state, normalizeDaemonEvent(event)); } + +/** Minimal shape of cached history rows (ChatMessage) delivered offline. */ +export interface CachedTranscriptMessage { + role?: string; + content?: string; +} + +/** + * Convert one cached ChatMessage-shaped history row into the ACP + * session/update notification the shared reducer already understands. + * Returns `null` for rows without renderable text so offline restores and + * load-failure fallbacks render the same timeline as live replays. + */ +export function cachedMessageToNotification( + message: CachedTranscriptMessage, + sessionId: string, +): SessionNotification | null { + if (typeof message?.content !== 'string' || message.content.length === 0) { + return null; + } + const content = { type: 'text' as const, text: message.content }; + switch (message.role) { + case 'user': + return { + sessionId, + update: { sessionUpdate: 'user_message_chunk', content }, + }; + case 'assistant': + return { + sessionId, + update: { sessionUpdate: 'agent_message_chunk', content }, + }; + case 'thinking': + return { + sessionId, + update: { sessionUpdate: 'agent_thought_chunk', content }, + }; + default: + return null; + } +} diff --git a/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.test.ts b/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.test.ts index b81c0479ac1..490a6acdb8d 100644 --- a/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.test.ts +++ b/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.test.ts @@ -25,6 +25,19 @@ function userTextNotification( }; } +function assistantTextNotification( + sessionId: string, + text: string, +): SessionNotification { + return { + sessionId, + update: { + sessionUpdate: 'agent_message_chunk', + content: { type: 'text', text }, + }, + }; +} + function postToWebview(message: unknown): void { window.dispatchEvent(new MessageEvent('message', { data: message })); } @@ -142,4 +155,160 @@ describe('useAcpTranscript', () => { expect(captured.blocks).toHaveLength(1); expect(captured.blocks[0]).toMatchObject({ kind: 'user', text: 'beta' }); }); + + it('resets transcript state when conversationLoaded arrives on reconnect', () => { + act(() => { + postToWebview({ + type: 'transcriptUpdate', + data: userTextNotification('session-a', 'alpha'), + }); + }); + expect(captured.blocks).toHaveLength(1); + + // Agent reconnect initialises an empty conversation and only posts + // conversationLoaded; the previous session's blocks must not survive. + act(() => { + postToWebview({ + type: 'conversationLoaded', + data: { id: 'temp', messages: [] }, + }); + }); + expect(captured.blocks).toHaveLength(0); + + act(() => { + postToWebview({ + type: 'transcriptUpdate', + data: userTextNotification('session-b', 'beta'), + }); + }); + expect(captured.blocks).toHaveLength(1); + expect(captured.blocks[0]).toMatchObject({ kind: 'user', text: 'beta' }); + }); + + it('drops late transcript frames from a previous session after a switch', () => { + act(() => { + postToWebview({ + type: 'transcriptUpdate', + data: userTextNotification('session-a', 'first'), + }); + }); + expect(captured.blocks).toHaveLength(1); + + act(() => { + postToWebview({ + type: 'qwenSessionSwitched', + data: { sessionId: 'session-b', messages: [] }, + }); + }); + expect(captured.blocks).toHaveLength(0); + + // Session A's turn is still running on the CLI and emits a trailing + // frame after the boundary; it must not contaminate session B. + act(() => { + postToWebview({ + type: 'transcriptUpdate', + data: userTextNotification('session-a', 'late tail from A'), + }); + }); + expect(captured.blocks).toHaveLength(0); + + act(() => { + postToWebview({ + type: 'transcriptUpdate', + data: userTextNotification('session-b', 'beta'), + }); + }); + expect(captured.blocks).toHaveLength(1); + expect(captured.blocks[0]).toMatchObject({ kind: 'user', text: 'beta' }); + }); + + it('seeds the transcript from cached messages carried by qwenSessionSwitched', () => { + act(() => { + postToWebview({ + type: 'qwenSessionSwitched', + data: { + sessionId: 'session-cached', + messages: [ + { role: 'user', content: 'cached question', timestamp: 1 }, + { role: 'assistant', content: 'cached answer', timestamp: 2 }, + { role: 'thinking', content: 'cached thought', timestamp: 3 }, + ], + }, + }); + }); + + expect(captured.blocks).toHaveLength(3); + expect(captured.blocks[0]).toMatchObject({ + kind: 'user', + text: 'cached question', + }); + expect(captured.blocks[1]).toMatchObject({ + kind: 'assistant', + text: 'cached answer', + }); + expect(captured.blocks[2]).toMatchObject({ + kind: 'thought', + text: 'cached thought', + }); + + // History restores are completed turns; sessionLoadComplete finalizes + // the last block so it does not keep streaming. + act(() => { + postToWebview({ + type: 'sessionLoadComplete', + data: { sessionId: 'session-cached' }, + }); + }); + expect(captured.blocks[2]).toMatchObject({ streaming: false }); + }); + + it('finalizes the streaming assistant block when the turn ends', () => { + act(() => { + postToWebview({ + type: 'transcriptUpdate', + data: userTextNotification('session-a', 'hi'), + }); + }); + act(() => { + postToWebview({ + type: 'transcriptUpdate', + data: assistantTextNotification('session-a', 'answer'), + }); + }); + + const assistant = captured.blocks.find((b) => b.kind === 'assistant'); + expect(assistant).toMatchObject({ kind: 'assistant', streaming: true }); + + act(() => { + postToWebview({ + type: 'streamEnd', + data: { timestamp: Date.now(), reason: 'end_turn' }, + }); + }); + + const finished = captured.blocks.find((b) => b.kind === 'assistant'); + expect(finished).toMatchObject({ + kind: 'assistant', + text: 'answer', + streaming: false, + }); + }); + + it('finalizes blocks with a cancelled reason when the user cancels', () => { + act(() => { + postToWebview({ + type: 'transcriptUpdate', + data: assistantTextNotification('session-a', 'partial'), + }); + }); + expect(captured.blocks[0]).toMatchObject({ streaming: true }); + + act(() => { + postToWebview({ + type: 'streamEnd', + data: { timestamp: Date.now(), reason: 'user_cancelled' }, + }); + }); + expect(captured.blocks[0]).toMatchObject({ streaming: false }); + }); }); diff --git a/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.ts b/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.ts index a53722c5f54..be44a62d5a4 100644 --- a/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.ts +++ b/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.ts @@ -8,22 +8,37 @@ import { useEffect, useRef, useState } from 'react'; import type { SessionNotification } from '@agentclientprotocol/sdk'; import { createDaemonTranscriptState, + reduceDaemonTranscriptEvents, selectTranscriptBlocks, } from '@qwen-code/sdk/daemon'; import type { DaemonTranscriptState } from '@qwen-code/sdk/daemon'; -import { reduceSessionNotification } from '../adapters/acpTranscriptAdapter.js'; +import { + cachedMessageToNotification, + reduceSessionNotification, +} from '../adapters/acpTranscriptAdapter.js'; + +/** Map webview `streamEnd` reasons onto the reducer's done reasons. */ +function streamEndToDoneReason(reason: unknown): string { + if (reason === 'user_cancelled') { + return 'cancelled'; + } + return typeof reason === 'string' && reason.length > 0 ? reason : 'end_turn'; +} /** * Reduce `transcriptUpdate` webview messages into a shared-SDK transcript * state and expose the rendered blocks. * - * The transcript state resets on the session boundaries used by the rest of - * the webview message flow (`qwenSessionSwitched` before an ACP replay, and - * `conversationCleared` for a new session), so blocks from one session can - * never leak into another session's replay. + * The transcript state resets on every session boundary used by the rest of + * the webview message flow (`qwenSessionSwitched` before an ACP replay, + * `conversationCleared` for a new session, and `conversationLoaded` on + * startup/reconnect), so blocks from one session can never leak into another + * session's replay. Frames arriving after a boundary are additionally + * dropped when their `sessionId` no longer matches the active session. */ export function useAcpTranscript() { const stateRef = useRef(null); + const activeSessionIdRef = useRef(null); const [blocks, setBlocks] = useState(() => selectTranscriptBlocks(createDaemonTranscriptState()), ); @@ -31,30 +46,95 @@ export function useAcpTranscript() { useEffect(() => { const resetTranscript = () => { stateRef.current = null; + activeSessionIdRef.current = null; setBlocks(selectTranscriptBlocks(createDaemonTranscriptState())); }; + /** Finalize in-flight assistant/thought blocks at a turn boundary. */ + const finishTurn = (reason: unknown) => { + if (stateRef.current === null) { + return; + } + stateRef.current = reduceDaemonTranscriptEvents(stateRef.current, [ + { type: 'assistant.done', reason: streamEndToDoneReason(reason) }, + ]); + setBlocks(selectTranscriptBlocks(stateRef.current)); + }; + const handleMessage = (event: MessageEvent) => { const message = event.data as { type?: string; - data?: SessionNotification; + data?: unknown; }; if ( message?.type === 'qwenSessionSwitched' || - message?.type === 'conversationCleared' + message?.type === 'conversationCleared' || + message?.type === 'conversationLoaded' ) { resetTranscript(); + if (message.type === 'qwenSessionSwitched') { + const data = message.data as + | { + sessionId?: unknown; + messages?: Array>; + } + | undefined; + if (typeof data?.sessionId === 'string' && data.sessionId) { + activeSessionIdRef.current = data.sessionId; + } + // Offline restores and load-failure fallbacks deliver cached + // history here and never replay it through `transcriptUpdate`, + // so seed the transcript from the cached rows directly. + if (Array.isArray(data?.messages) && data.messages.length > 0) { + let state = createDaemonTranscriptState(); + for (const cached of data.messages) { + const notification = cachedMessageToNotification( + cached, + activeSessionIdRef.current ?? '', + ); + if (notification) { + state = reduceSessionNotification(state, notification); + } + } + stateRef.current = state; + setBlocks(selectTranscriptBlocks(state)); + } + } + return; + } + if (message?.type === 'streamEnd') { + finishTurn((message.data as { reason?: unknown } | undefined)?.reason); + return; + } + if (message?.type === 'sessionLoadComplete') { + // History replays (and cached restores) have no turn-end frame of + // their own; finalize so the last block does not stay streaming. + finishTurn('end_turn'); return; } if (message?.type !== 'transcriptUpdate' || !message.data) { return; } + const notification = message.data as SessionNotification; + // Drop late frames from a previous session that arrive after the + // boundary reset; adopt the session id on the first frame when the + // boundary did not carry one. + if (activeSessionIdRef.current === null) { + if ( + typeof notification.sessionId === 'string' && + notification.sessionId + ) { + activeSessionIdRef.current = notification.sessionId; + } + } else if (notification.sessionId !== activeSessionIdRef.current) { + return; + } if (stateRef.current === null) { stateRef.current = createDaemonTranscriptState(); } stateRef.current = reduceSessionNotification( stateRef.current, - message.data, + notification, ); setBlocks(selectTranscriptBlocks(stateRef.current)); }; From 97872e48d618081cbe20ef98577208e449f3807a Mon Sep 17 00:00:00 2001 From: "jinjing.zzj" Date: Sun, 23 Aug 2026 12:16:39 +0800 Subject: [PATCH 06/57] fix(vscode-ide-companion): adopt live ACP session id after load-failure fallback --- .../webview/handlers/SessionMessageHandler.ts | 12 ++- .../webview/hooks/useAcpTranscript.test.ts | 74 +++++++++++++++++++ .../src/webview/hooks/useAcpTranscript.ts | 14 +++- 3 files changed, 98 insertions(+), 2 deletions(-) diff --git a/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.ts b/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.ts index f2f8e165886..7d55833536f 100644 --- a/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.ts +++ b/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.ts @@ -1203,7 +1203,17 @@ export class SessionMessageHandler extends BaseMessageHandler { this.sendToWebView({ type: 'qwenSessionSwitched', - data: { sessionId, messages, session: sessionDetails }, + data: { + sessionId, + messages, + session: sessionDetails, + // The fallback created a fresh ACP session whose live + // transcript frames carry the new id, not the archived one. + // Publish it so the transcript filter adopts the session + // that will actually stream instead of dropping every live + // frame. + liveSessionId: this.agentManager.currentSessionId ?? undefined, + }, }); this.sendToWebView({ type: 'sessionLoadComplete', diff --git a/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.test.ts b/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.test.ts index 490a6acdb8d..1c13d88c2c2 100644 --- a/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.test.ts +++ b/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.test.ts @@ -262,6 +262,80 @@ describe('useAcpTranscript', () => { expect(captured.blocks[2]).toMatchObject({ streaming: false }); }); + it('renders live frames of the fresh session published by a load-failure fallback', () => { + // session/load failed for an archived session: the extension falls back + // to cached history plus a fresh ACP session and publishes the fresh id + // as liveSessionId alongside the archived sessionId. + act(() => { + postToWebview({ + type: 'qwenSessionSwitched', + data: { + sessionId: 'archived-session', + liveSessionId: 'fresh-acp-session', + messages: [ + { role: 'user', content: 'cached question', timestamp: 1 }, + { role: 'assistant', content: 'cached answer', timestamp: 2 }, + ], + }, + }); + }); + + expect(captured.blocks).toHaveLength(2); + expect(captured.blocks[0]).toMatchObject({ + kind: 'user', + text: 'cached question', + }); + expect(captured.blocks[1]).toMatchObject({ + kind: 'assistant', + text: 'cached answer', + }); + + // The extension posts sessionLoadComplete right after the boundary to + // finalize the cached history before the user interacts. + act(() => { + postToWebview({ + type: 'sessionLoadComplete', + data: { sessionId: 'archived-session' }, + }); + }); + expect(captured.blocks).toHaveLength(2); + expect(captured.blocks[1]).toMatchObject({ streaming: false }); + + // Live frames of the fresh session (user echo + assistant reply) must + // render even though the boundary's sessionId named the archived one. + act(() => { + postToWebview({ + type: 'transcriptUpdate', + data: userTextNotification('fresh-acp-session', 'follow-up'), + }); + }); + act(() => { + postToWebview({ + type: 'transcriptUpdate', + data: assistantTextNotification('fresh-acp-session', 'live answer'), + }); + }); + + expect(captured.blocks).toHaveLength(4); + expect(captured.blocks[2]).toMatchObject({ + kind: 'user', + text: 'follow-up', + }); + expect(captured.blocks[3]).toMatchObject({ + kind: 'assistant', + text: 'live answer', + }); + + // Frames from unrelated sessions must still be dropped by the guard. + act(() => { + postToWebview({ + type: 'transcriptUpdate', + data: userTextNotification('unrelated-session', 'stray'), + }); + }); + expect(captured.blocks).toHaveLength(4); + }); + it('finalizes the streaming assistant block when the turn ends', () => { act(() => { postToWebview({ diff --git a/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.ts b/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.ts index be44a62d5a4..088227e302e 100644 --- a/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.ts +++ b/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.ts @@ -35,6 +35,9 @@ function streamEndToDoneReason(reason: unknown): string { * startup/reconnect), so blocks from one session can never leak into another * session's replay. Frames arriving after a boundary are additionally * dropped when their `sessionId` no longer matches the active session. + * Boundaries that carry a `liveSessionId` (load-failure fallbacks that + * create a fresh ACP session) adopt that live id instead of the archived + * `sessionId`, so the fresh session's live frames pass the guard. */ export function useAcpTranscript() { const stateRef = useRef(null); @@ -76,10 +79,19 @@ export function useAcpTranscript() { const data = message.data as | { sessionId?: unknown; + liveSessionId?: unknown; messages?: Array>; } | undefined; - if (typeof data?.sessionId === 'string' && data.sessionId) { + // Load-failure fallbacks keep the archived conversation id for + // the session list while creating a fresh ACP session for live + // streaming; the boundary publishes that fresh id as + // `liveSessionId`. Adopt it (instead of the archived id) so the + // live frames carrying it are not dropped by the session guard + // below; cached history is seeded under the same adopted id. + if (typeof data?.liveSessionId === 'string' && data.liveSessionId) { + activeSessionIdRef.current = data.liveSessionId; + } else if (typeof data?.sessionId === 'string' && data.sessionId) { activeSessionIdRef.current = data.sessionId; } // Offline restores and load-failure fallbacks deliver cached From fb3ef2ef928a38abfe3961d89bb574776ceca874 Mon Sep 17 00:00:00 2001 From: "jinjing.zzj" Date: Sun, 23 Aug 2026 12:19:31 +0800 Subject: [PATCH 07/57] fix(vscode-ide-companion): echo user prompt into WebShell transcript --- .../handlers/SessionMessageHandler.test.ts | 118 ++++++++++++++++++ .../webview/handlers/SessionMessageHandler.ts | 19 +++ 2 files changed, 137 insertions(+) diff --git a/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.test.ts b/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.test.ts index adc19323066..603e435c18e 100644 --- a/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.test.ts +++ b/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.test.ts @@ -238,6 +238,64 @@ describe('SessionMessageHandler', () => { ]); }); + it('echoes the user prompt into the ACP transcript as a user_message_chunk', async () => { + mockProcessImageAttachments.mockResolvedValue({ + formattedText: 'hello transcript', + displayText: 'hello transcript', + savedImageCount: 0, + promptImages: [], + }); + + const agentManager = { + isConnected: true, + currentSessionId: 'session-1', + sendMessage: vi.fn().mockResolvedValue(undefined), + }; + const conversationStore = { + createConversation: vi.fn().mockResolvedValue({ id: 'conversation-1' }), + getConversation: vi.fn().mockResolvedValue(null), + addMessage: vi.fn(), + renameConversationId: vi.fn().mockResolvedValue(true), + }; + const sendToWebView = vi.fn(); + + const handler = new SessionMessageHandler( + agentManager as never, + conversationStore as never, + null, + sendToWebView, + ); + + await handler.handle({ + type: 'sendMessage', + data: { text: 'hello transcript' }, + }); + + // The direct stdio ACP channel never emits user_message_chunk for an + // interactive prompt; the handler must synthesize it so the user's own + // turn renders in the WebShell transcript timeline. + expect(sendToWebView).toHaveBeenCalledWith({ + type: 'transcriptUpdate', + data: { + sessionId: 'session-1', + update: { + sessionUpdate: 'user_message_chunk', + content: { type: 'text', text: 'hello transcript' }, + }, + }, + }); + // The echo must be posted before the prompt is dispatched so the user + // block renders ahead of this turn's assistant frames. + const echoCallIndex = sendToWebView.mock.calls.findIndex( + (call) => + (call[0] as { type?: string } | undefined)?.type === 'transcriptUpdate', + ); + expect(echoCallIndex).toBeGreaterThanOrEqual(0); + expect(sendToWebView.mock.invocationCallOrder[echoCallIndex]).toBeLessThan( + agentManager.sendMessage.mock.invocationCallOrder[0], + ); + }); + it('sends image file context as prompt image blocks', async () => { mockProcessImageAttachments.mockImplementation( async (promptText: string) => ({ @@ -1003,6 +1061,66 @@ describe('SessionMessageHandler', () => { ); }); + it('publishes the fresh ACP session id as liveSessionId in the load-failure fallback boundary', async () => { + const archivedSessionId = 'archived-session'; + const agentManager: { + isConnected: boolean; + currentSessionId: string | null; + getSessionList: ReturnType; + loadSessionViaAcp: ReturnType; + getSessionMessages: ReturnType; + createNewSession: ReturnType; + } = { + isConnected: true, + currentSessionId: 'old-acp-session', + getSessionList: vi + .fn() + .mockResolvedValue([{ id: archivedSessionId, cwd: '/workspace' }]), + loadSessionViaAcp: vi + .fn() + .mockRejectedValue(new Error('session not found on server')), + getSessionMessages: vi.fn().mockResolvedValue([]), + createNewSession: vi.fn(), + }; + // Mirror the real manager: session/new flips currentSessionId to the + // freshly created ACP session. + agentManager.createNewSession.mockImplementation(async () => { + agentManager.currentSessionId = 'new-acp-session'; + return 'new-acp-session'; + }); + const conversationStore = { + createConversation: vi.fn(), + getConversation: vi.fn(), + addMessage: vi.fn(), + }; + const sendToWebView = vi.fn(); + + const handler = new SessionMessageHandler( + agentManager as never, + conversationStore as never, + null, + sendToWebView, + ); + + await handler.handle({ + type: 'switchQwenSession', + data: { sessionId: archivedSessionId }, + }); + + // The transcript filter must learn the live session id from the + // boundary; otherwise every live frame of the fresh session is + // dropped because it does not carry the archived id. + expect(sendToWebView).toHaveBeenCalledWith( + expect.objectContaining({ + type: 'qwenSessionSwitched', + data: expect.objectContaining({ + sessionId: archivedSessionId, + liveSessionId: 'new-acp-session', + }), + }), + ); + }); + it('forces a fresh ACP session when the webview requests a new session', async () => { const agentManager = { isConnected: true, diff --git a/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.ts b/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.ts index 7d55833536f..2ecc148527a 100644 --- a/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.ts +++ b/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.ts @@ -874,6 +874,25 @@ export class SessionMessageHandler extends BaseMessageHandler { }, }); + // The companion's direct stdio ACP channel never receives a + // user_message_chunk for an interactive prompt, so echo the user's + // own turn into the transcript timeline (mirrors the daemon-bridge + // echo on the SSE bus). Posted before the prompt is dispatched so + // the user block renders ahead of this turn's assistant frames. + const transcriptEchoSessionId = this.agentManager.currentSessionId; + if (transcriptEchoSessionId && displayText) { + this.sendToWebView({ + type: 'transcriptUpdate', + data: { + sessionId: transcriptEchoSessionId, + update: { + sessionUpdate: 'user_message_chunk', + content: { type: 'text', text: displayText }, + }, + }, + }); + } + await this.agentManager.sendMessage( buildPromptBlocks(promptText, promptImages), ); From 843670d2d73891d3eb99c224307dbffa4e4be642 Mon Sep 17 00:00:00 2001 From: "jinjing.zzj" Date: Sun, 23 Aug 2026 12:28:42 +0800 Subject: [PATCH 08/57] fix(vscode-ide-companion): keep WebShell transcript expanded and clear of the composer --- .../src/webview/App.test.tsx | 54 +++++++++++++++++++ .../vscode-ide-companion/src/webview/App.tsx | 18 +++++++ 2 files changed, 72 insertions(+) diff --git a/packages/vscode-ide-companion/src/webview/App.test.tsx b/packages/vscode-ide-companion/src/webview/App.test.tsx index b8812a10614..3d2608edf4b 100644 --- a/packages/vscode-ide-companion/src/webview/App.test.tsx +++ b/packages/vscode-ide-companion/src/webview/App.test.tsx @@ -19,6 +19,7 @@ const { mockMessageState, mockAddMessage, mockEndStreaming, + mockWebShellTranscriptProps, } = vi.hoisted(() => ({ mockPostMessage: vi.fn(), mockOpenCompletion: vi.fn().mockResolvedValue(undefined), @@ -29,6 +30,9 @@ const { }, mockAddMessage: vi.fn(), mockEndStreaming: vi.fn(), + mockWebShellTranscriptProps: { + current: null as null | Record, + }, })); const slashSkillsItem: CompletionItem = { @@ -284,6 +288,13 @@ vi.mock('./components/layout/InputForm.js', () => ({ ), })); +vi.mock('@qwen-code/web-shell', () => ({ + WebShellTranscript: (props: Record) => { + mockWebShellTranscriptProps.current = props; + return null; + }, +})); + import { App } from './App.js'; function createDomRect(): DOMRect { @@ -364,6 +375,11 @@ function renderApp() { return { container, root }; } +/** Reset via a call so tsc does not narrow the prop capture to `null`. */ +function resetWebShellTranscriptProps(): void { + mockWebShellTranscriptProps.current = null; +} + describe('App /skills secondary picker', () => { let root: Root | null = null; let container: HTMLDivElement | null = null; @@ -568,4 +584,42 @@ describe('App /skills secondary picker', () => { data: {}, }); }); + + it('disables WebShell transcript turn auto-collapse while a response is in flight', async () => { + mockMessageState.isStreaming = true; + resetWebShellTranscriptProps(); + + const rendered = renderApp(); + root = rendered.root; + container = rendered.container; + + await act(async () => {}); + + // WebShellTranscript hardcodes isResponding={false}; without an + // explicit opt-out, MessageList would auto-collapse the in-progress + // turn mid-response. + const transcriptProps = mockWebShellTranscriptProps.current; + expect(transcriptProps).not.toBeNull(); + expect(transcriptProps!.collapseCompletedTurns).toBe(false); + }); + + it('reserves composer clearance on the WebShell transcript scroll area', async () => { + mockMessageState.isStreaming = true; + resetWebShellTranscriptProps(); + + const rendered = renderApp(); + root = rendered.root; + container = rendered.container; + + await act(async () => {}); + + // MessageList pads its scroll area by + // calc(8px + var(--web-shell-bottom-panel-inset, 0px)); the absolutely + // positioned composer would otherwise occlude the transcript tail. + const transcriptProps = mockWebShellTranscriptProps.current; + expect(transcriptProps).not.toBeNull(); + expect(transcriptProps!.style).toMatchObject({ + '--web-shell-bottom-panel-inset': '140px', + }); + }); }); diff --git a/packages/vscode-ide-companion/src/webview/App.tsx b/packages/vscode-ide-companion/src/webview/App.tsx index 8d9d1a11a25..e21ddf19be0 100644 --- a/packages/vscode-ide-companion/src/webview/App.tsx +++ b/packages/vscode-ide-companion/src/webview/App.tsx @@ -866,6 +866,24 @@ export const App: React.FC = () => {
{isAuthenticated && ( diff --git a/packages/vscode-ide-companion/src/webview/hooks/useImage.ts b/packages/vscode-ide-companion/src/webview/hooks/useImage.ts index 113960aeced..5133e68bed2 100644 --- a/packages/vscode-ide-companion/src/webview/hooks/useImage.ts +++ b/packages/vscode-ide-companion/src/webview/hooks/useImage.ts @@ -24,6 +24,14 @@ export interface WebViewMessageBase { content: string; timestamp: number; turnIndex?: number; + /** + * True for messages generated inside the webview itself (connection / + * auth / generic errors, the local "Interrupted" cancel mark) rather than + * delivered by the extension. The WebShell transcript renders ACP + * `transcriptUpdate` frames only, so the App renders these entries in a + * dedicated notice slot to keep them visible. + */ + localOnly?: boolean; fileContext?: { fileName: string; filePath: string; diff --git a/packages/vscode-ide-companion/src/webview/hooks/useWebViewMessages.test.tsx b/packages/vscode-ide-companion/src/webview/hooks/useWebViewMessages.test.tsx index 0a223c3d3a3..9131f1653ea 100644 --- a/packages/vscode-ide-companion/src/webview/hooks/useWebViewMessages.test.tsx +++ b/packages/vscode-ide-companion/src/webview/hooks/useWebViewMessages.test.tsx @@ -666,4 +666,56 @@ describe('useWebViewMessages', () => { expect(input.textContent).toBe('@notes.txt '); expect(rendered.handlers.setInputText).toHaveBeenCalledWith('@notes.txt '); }); + + it('marks locally generated error notices so the App can render them outside the ACP transcript', () => { + const rendered = renderHookHarness(); + root = rendered.root; + container = rendered.container; + + act(() => { + window.dispatchEvent( + new MessageEvent('message', { + data: { + type: 'agentConnectionError', + data: { message: 'spawn failed' }, + }, + }), + ); + }); + + act(() => { + window.dispatchEvent( + new MessageEvent('message', { + data: { + type: 'authError', + data: { message: 'bad token' }, + }, + }), + ); + }); + + act(() => { + window.dispatchEvent( + new MessageEvent('message', { + data: { + type: 'error', + data: { message: 'boom' }, + }, + }), + ); + }); + + const added = rendered.handlers.messageHandling.addMessage.mock.calls.map( + (call) => + call[0] as { role?: string; content?: string; localOnly?: boolean }, + ); + expect(added).toHaveLength(3); + for (const message of added) { + expect(message.localOnly).toBe(true); + expect(message.role).toBe('assistant'); + } + expect(added[0]?.content).toContain('Failed to connect to Qwen agent'); + expect(added[1]?.content).toBe('bad token'); + expect(added[2]?.content).toBe('boom'); + }); }); diff --git a/packages/vscode-ide-companion/src/webview/hooks/useWebViewMessages.ts b/packages/vscode-ide-companion/src/webview/hooks/useWebViewMessages.ts index 22fe8798700..4563c588358 100644 --- a/packages/vscode-ide-companion/src/webview/hooks/useWebViewMessages.ts +++ b/packages/vscode-ide-companion/src/webview/hooks/useWebViewMessages.ts @@ -565,6 +565,7 @@ export const useWebViewMessages = ({ role: 'assistant', content: `Failed to connect to Qwen agent: ${errorMsg}\nYou can still use the chat UI, but messages won't be sent to AI.`, timestamp: Date.now(), + localOnly: true, }); // Set authentication state to false handlers.setIsAuthenticated?.(false); @@ -581,6 +582,7 @@ export const useWebViewMessages = ({ role: 'assistant', content: errorMsg, timestamp: Date.now(), + localOnly: true, }); // Set authentication state to false handlers.setIsAuthenticated?.(false); @@ -846,6 +848,7 @@ export const useWebViewMessages = ({ role: 'assistant', content: errorMessage, timestamp: Date.now(), + localOnly: true, }); break; } From 019b325de9b1f025c0a04785055a3e7b9d31f707 Mon Sep 17 00:00:00 2001 From: "jinjing.zzj" Date: Sun, 23 Aug 2026 13:09:10 +0800 Subject: [PATCH 10/57] fix(vscode-ide-companion): restore file-link opening from the WebShell transcript --- .../src/webview/App.test.tsx | 77 +++++++++++++++ .../vscode-ide-companion/src/webview/App.tsx | 28 +++++- .../src/webview/utils/fileLinks.test.ts | 84 ++++++++++++++++ .../src/webview/utils/fileLinks.ts | 96 +++++++++++++++++++ 4 files changed, 284 insertions(+), 1 deletion(-) create mode 100644 packages/vscode-ide-companion/src/webview/utils/fileLinks.test.ts create mode 100644 packages/vscode-ide-companion/src/webview/utils/fileLinks.ts diff --git a/packages/vscode-ide-companion/src/webview/App.test.tsx b/packages/vscode-ide-companion/src/webview/App.test.tsx index 49ce21759cd..b6b8ecb193e 100644 --- a/packages/vscode-ide-companion/src/webview/App.test.tsx +++ b/packages/vscode-ide-companion/src/webview/App.test.tsx @@ -634,6 +634,83 @@ describe('App /skills secondary picker', () => { ).not.toContain('ordinary history'); }); + it('posts openFile when a file link inside the transcript area is clicked', async () => { + mockMessages.push({ + role: 'assistant', + content: 'see the report', + timestamp: 1, + localOnly: true, + }); + + const rendered = renderApp(); + root = rendered.root; + container = rendered.container; + + await act(async () => {}); + + const area = rendered.container.querySelector( + '.flex-1.min-h-0.relative', + ) as HTMLDivElement; + expect(area).not.toBeNull(); + + const link = document.createElement('a'); + link.setAttribute('href', '/tmp/insight-report.md'); + link.textContent = '/tmp/insight-report.md'; + area.appendChild(link); + + act(() => { + link.dispatchEvent( + new MouseEvent('click', { bubbles: true, cancelable: true }), + ); + }); + + expect(mockPostMessage).toHaveBeenCalledWith({ + type: 'openFile', + data: { path: '/tmp/insight-report.md' }, + }); + }); + + it('leaves external links alone when clicked in the transcript area', async () => { + mockMessages.push({ + role: 'assistant', + content: 'docs', + timestamp: 1, + localOnly: true, + }); + + const rendered = renderApp(); + root = rendered.root; + container = rendered.container; + + await act(async () => {}); + + const area = rendered.container.querySelector( + '.flex-1.min-h-0.relative', + ) as HTMLDivElement; + const link = document.createElement('a'); + link.setAttribute('href', 'https://example.com/docs'); + link.textContent = 'docs'; + area.appendChild(link); + + // VS Code webviews never navigate on external links; cancel the jsdom + // navigation without interfering with the handler under test. + const preventNavigation = (event: Event) => event.preventDefault(); + document.addEventListener('click', preventNavigation); + try { + act(() => { + link.dispatchEvent( + new MouseEvent('click', { bubbles: true, cancelable: true }), + ); + }); + } finally { + document.removeEventListener('click', preventNavigation); + } + + expect(mockPostMessage).not.toHaveBeenCalledWith( + expect.objectContaining({ type: 'openFile' }), + ); + }); + it('disables WebShell transcript turn auto-collapse while a response is in flight', async () => { mockMessageState.isStreaming = true; resetWebShellTranscriptProps(); diff --git a/packages/vscode-ide-companion/src/webview/App.tsx b/packages/vscode-ide-companion/src/webview/App.tsx index 13499c05481..c9727fda11a 100644 --- a/packages/vscode-ide-companion/src/webview/App.tsx +++ b/packages/vscode-ide-companion/src/webview/App.tsx @@ -49,6 +49,7 @@ import type { ModelInfo, AvailableCommand } from '@agentclientprotocol/sdk'; import type { Question } from '../types/acpTypes.js'; import { useImagePaste } from './hooks/useImage.js'; import { computeContextUsage } from './utils/contextUsage.js'; +import { resolveFileLinkFromAnchor } from './utils/fileLinks.js'; import { SKILL_ITEM_ID_PREFIX, isSkillsSecondaryQuery, @@ -793,6 +794,31 @@ export const App: React.FC = () => { (message) => message.localOnly, ); + // The WebShell transcript has no file-open callback; intercept file-like + // anchor clicks at the container level and route them through the + // existing `openFile` message (handled by FileMessageHandler), restoring + // the pre-PR behavior where file references opened in the editor. + const handleTranscriptClick = useCallback( + (event: React.MouseEvent) => { + const target = event.target as HTMLElement | null; + const anchor = target?.closest?.('a') as HTMLAnchorElement | null; + if (!anchor) { + return; + } + const filePath = resolveFileLinkFromAnchor(anchor); + if (!filePath) { + return; + } + event.preventDefault(); + event.stopPropagation(); + vscode.postMessage({ + type: 'openFile', + data: { path: filePath }, + }); + }, + [vscode], + ); + const webShellTheme = useMemo<'dark' | 'light'>(() => { const kind = document.body.getAttribute('data-vscode-theme-kind') ?? ''; return kind.includes('light') ? 'light' : 'dark'; @@ -841,7 +867,7 @@ export const App: React.FC = () => { } /> -
+
{!hasContent && !isLoading && !sessionManagement.isSwitchingSession ? ( isAuthenticated === false ? ( diff --git a/packages/vscode-ide-companion/src/webview/utils/fileLinks.test.ts b/packages/vscode-ide-companion/src/webview/utils/fileLinks.test.ts new file mode 100644 index 00000000000..12203deea42 --- /dev/null +++ b/packages/vscode-ide-companion/src/webview/utils/fileLinks.test.ts @@ -0,0 +1,84 @@ +/** + * @license + * Copyright 2025 Qwen Team + * SPDX-License-Identifier: Apache-2.0 + */ + +/** @vitest-environment jsdom */ + +import { describe, expect, it } from 'vitest'; +import { + normalizeExplicitFileLink, + resolveFileLinkFromAnchor, +} from './fileLinks.js'; + +function anchorWith(href: string | null, text = ''): HTMLAnchorElement { + const anchor = document.createElement('a'); + if (href !== null) { + anchor.setAttribute('href', href); + } + anchor.textContent = text; + return anchor; +} + +describe('normalizeExplicitFileLink', () => { + it('strips the file:// scheme and restores the leading slash', () => { + expect(normalizeExplicitFileLink('file:///tmp/report.md')).toBe( + '/tmp/report.md', + ); + }); + + it('keeps Windows drive paths intact', () => { + expect(normalizeExplicitFileLink('file:///C:/Users/me/notes.txt')).toBe( + 'C:/Users/me/notes.txt', + ); + }); + + it('converts a line-number fragment into a path:line suffix', () => { + expect(normalizeExplicitFileLink('/src/app.ts#L42')).toBe('/src/app.ts:42'); + }); +}); + +describe('resolveFileLinkFromAnchor', () => { + it('resolves file:// anchors', () => { + expect(resolveFileLinkFromAnchor(anchorWith('file:///tmp/a.md'))).toBe( + '/tmp/a.md', + ); + }); + + it('resolves absolute-path anchors', () => { + expect( + resolveFileLinkFromAnchor(anchorWith('/tmp/insight-report.md')), + ).toBe('/tmp/insight-report.md'); + }); + + it('resolves relative anchors with a known file extension', () => { + expect(resolveFileLinkFromAnchor(anchorWith('src/index.ts'))).toBe( + 'src/index.ts', + ); + }); + + it('falls back to the anchor text when the href was sanitized away', () => { + expect( + resolveFileLinkFromAnchor(anchorWith(null, '/var/log/app.log')), + ).toBe('/var/log/app.log'); + }); + + it('ignores external links', () => { + expect( + resolveFileLinkFromAnchor(anchorWith('https://example.com/')), + ).toBeNull(); + expect(resolveFileLinkFromAnchor(anchorWith('mailto:a@b.c'))).toBeNull(); + }); + + it('ignores fragment-only anchors', () => { + expect(resolveFileLinkFromAnchor(anchorWith('#'))).toBeNull(); + expect(resolveFileLinkFromAnchor(anchorWith('#section'))).toBeNull(); + }); + + it('ignores text without a file-like shape', () => { + expect( + resolveFileLinkFromAnchor(anchorWith(null, 'click here')), + ).toBeNull(); + }); +}); diff --git a/packages/vscode-ide-companion/src/webview/utils/fileLinks.ts b/packages/vscode-ide-companion/src/webview/utils/fileLinks.ts new file mode 100644 index 00000000000..a1f6fff22b2 --- /dev/null +++ b/packages/vscode-ide-companion/src/webview/utils/fileLinks.ts @@ -0,0 +1,96 @@ +/** + * @license + * Copyright 2025 Qwen Team + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * File-link detection for clicks inside the WebShell transcript. + * + * The legacy webui timeline intercepted file links through its own markdown + * renderer (`onFileClick`). The shared WebShell transcript has no file-open + * callback, so the companion intercepts anchor clicks at the container level + * instead and posts the existing `openFile` message. The heuristics mirror + * webui's MarkdownRenderer so identical markdown resolves identically. + */ + +// Known file extensions for validation of explicit markdown links +const KNOWN_FILE_EXTENSIONS = + /\.(tsx?|jsx?|css|scss|json|md|py|java|go|rs|c|cpp|h|hpp|sh|ya?ml|toml|xml|html|vue|svelte)$/i; + +const safeDecodePath = (value: string): string => { + try { + return decodeURIComponent(value); + } catch { + return value; + } +}; + +export const normalizeExplicitFileLink = (raw: string): string => { + const decoded = safeDecodePath(raw).replace(/\\/g, '/'); + + // file:// URIs (e.g. from vscode.Uri.file().toString()) encode special + // characters like # as %23 in the path component. After decoding the + // full URI we can strip the scheme and return the filesystem path + // directly — no fragment splitting needed, because any # in the + // decoded result is a literal filename character, not an anchor. + if (/^file:\/\//i.test(decoded)) { + let filePath = decoded.replace(/^file:\/\/\//i, ''); + // On Unix the path should start with / + if (!/^[a-zA-Z]:/.test(filePath) && !filePath.startsWith('/')) { + filePath = '/' + filePath; + } + return filePath; + } + + const hashIndex = decoded.indexOf('#'); + if (hashIndex < 0) { + return decoded; + } + + const base = decoded.slice(0, hashIndex); + const fragment = decoded.slice(hashIndex + 1); + const lineMatch = fragment.match(/^L?(\d+)(?:-\d+)?$/i); + if (lineMatch) { + return `${base}:${parseInt(lineMatch[1], 10)}`; + } + + return base; +}; + +/** + * Return the filesystem path an anchor points to when it is a file link, + * or `null` for external/in-page links the browser should keep handling. + */ +export function resolveFileLinkFromAnchor( + anchor: HTMLAnchorElement, +): string | null { + const href = anchor.getAttribute('href') || ''; + + // file:// URIs come from trusted system-generated content (e.g. /export). + if (/^file:\/\//i.test(href)) { + return normalizeExplicitFileLink(href); + } + + // External schemes and fragment-only links stay with the browser. + if (/^(https?|mailto|ftp|data):/i.test(href) || href.startsWith('#')) { + return null; + } + + // Explicit markdown file-path links (e.g. [report](/tmp/report.md)). + // Falls back to the anchor text for anchors whose href was stripped by + // markdown sanitizers, matching the legacy webui behavior. + const text = (anchor.textContent || '').trim(); + const candidate = normalizeExplicitFileLink(href || text); + + const isAbsolutePath = /^(?:[a-zA-Z]:[/\\]|[/\\])/i.test(candidate); + const isRelativeFile = + !isAbsolutePath && + KNOWN_FILE_EXTENSIONS.test(candidate.replace(/:\d+(?::\d+)?$/, '')); + + if (isAbsolutePath || isRelativeFile) { + return candidate; + } + + return null; +} From 62b6560631988831cee0075bc31ea95a5ba56023 Mon Sep 17 00:00:00 2001 From: "jinjing.zzj" Date: Sun, 23 Aug 2026 13:14:12 +0800 Subject: [PATCH 11/57] fix(vscode-ide-companion): restore contributed copy commands for the WebShell transcript --- .../src/webview/App.test.tsx | 174 ++++++++++++++++++ .../vscode-ide-companion/src/webview/App.tsx | 77 +++++++- .../src/webview/utils/copyTranscript.test.ts | 120 ++++++++++++ .../src/webview/utils/copyTranscript.ts | 121 ++++++++++++ 4 files changed, 491 insertions(+), 1 deletion(-) create mode 100644 packages/vscode-ide-companion/src/webview/utils/copyTranscript.test.ts create mode 100644 packages/vscode-ide-companion/src/webview/utils/copyTranscript.ts diff --git a/packages/vscode-ide-companion/src/webview/App.test.tsx b/packages/vscode-ide-companion/src/webview/App.test.tsx index b6b8ecb193e..3f8e30699f1 100644 --- a/packages/vscode-ide-companion/src/webview/App.test.tsx +++ b/packages/vscode-ide-companion/src/webview/App.test.tsx @@ -711,6 +711,180 @@ describe('App /skills secondary picker', () => { ); }); + it('exposes the chat-messages webviewSection context key when content exists', async () => { + mockMessages.push({ + role: 'assistant', + content: 'notice', + timestamp: 1, + localOnly: true, + }); + + const rendered = renderApp(); + root = rendered.root; + container = rendered.container; + + await act(async () => {}); + + const area = rendered.container.querySelector( + '.flex-1.min-h-0.relative', + ) as HTMLDivElement; + // The contributed copy commands filter on + // `when: "webviewSection == 'chat-messages'"`; without the attribute + // the context-menu items never appear. + expect(area.getAttribute('data-vscode-context')).toBe( + '{"webviewSection": "chat-messages"}', + ); + }); + + it('reports contextMenuTriggered so copy commands route to this webview', async () => { + mockMessages.push({ + role: 'assistant', + content: 'notice', + timestamp: 1, + localOnly: true, + }); + + const rendered = renderApp(); + root = rendered.root; + container = rendered.container; + + await act(async () => {}); + mockPostMessage.mockClear(); + + act(() => { + document.dispatchEvent(new MouseEvent('contextmenu', { bubbles: true })); + }); + + expect(mockPostMessage).toHaveBeenCalledWith({ + type: 'contextMenuTriggered', + data: {}, + }); + }); + + async function renderAppWithTranscriptText(text: string) { + mockMessages.push({ + role: 'assistant', + content: 'notice', + timestamp: 1, + localOnly: true, + }); + + const rendered = renderApp(); + root = rendered.root; + container = rendered.container; + + await act(async () => {}); + + // Feed one assistant block through the real transcript reducer. + act(() => { + window.dispatchEvent( + new MessageEvent('message', { + data: { + type: 'transcriptUpdate', + data: { + sessionId: 'session-copy', + update: { + sessionUpdate: 'agent_message_chunk', + content: { type: 'text', text }, + }, + }, + }, + }), + ); + }); + + return rendered; + } + + it('copies the last assistant reply on copyLastReply', async () => { + await renderAppWithTranscriptText('reply text'); + mockPostMessage.mockClear(); + + act(() => { + window.dispatchEvent( + new MessageEvent('message', { + data: { type: 'copyCommand', data: { action: 'copyLastReply' } }, + }), + ); + }); + + expect(mockPostMessage).toHaveBeenCalledWith({ + type: 'copyToClipboard', + data: { text: 'reply text' }, + }); + }); + + it('copies labeled conversation text on copyAllMessages', async () => { + const rendered = await renderAppWithTranscriptText('reply text'); + void rendered; + + // Also feed a user block so the labeled format is exercised. + act(() => { + window.dispatchEvent( + new MessageEvent('message', { + data: { + type: 'transcriptUpdate', + data: { + sessionId: 'session-copy', + update: { + sessionUpdate: 'user_message_chunk', + content: { type: 'text', text: 'the question' }, + }, + }, + }, + }), + ); + }); + mockPostMessage.mockClear(); + + act(() => { + window.dispatchEvent( + new MessageEvent('message', { + data: { type: 'copyCommand', data: { action: 'copyAllMessages' } }, + }), + ); + }); + + expect(mockPostMessage).toHaveBeenCalledWith({ + type: 'copyToClipboard', + data: { + text: '**Qwen Code:** reply text\n\n---\n\n**User:** the question', + }, + }); + }); + + it('copies the block under the cursor on copyMessage', async () => { + const rendered = await renderAppWithTranscriptText('reply text'); + + const area = rendered.container.querySelector( + '.flex-1.min-h-0.relative', + ) as HTMLDivElement; + // Simulate a MessageList row for the first assistant block + // (reducer block ids are `assistant-`, ordinal starts at 1). + const row = document.createElement('div'); + row.setAttribute('data-message-row-key', 'msg:assistant-1'); + row.textContent = 'reply text'; + area.appendChild(row); + + act(() => { + row.dispatchEvent(new MouseEvent('contextmenu', { bubbles: true })); + }); + mockPostMessage.mockClear(); + + act(() => { + window.dispatchEvent( + new MessageEvent('message', { + data: { type: 'copyCommand', data: { action: 'copyMessage' } }, + }), + ); + }); + + expect(mockPostMessage).toHaveBeenCalledWith({ + type: 'copyToClipboard', + data: { text: 'reply text' }, + }); + }); + it('disables WebShell transcript turn auto-collapse while a response is in flight', async () => { mockMessageState.isStreaming = true; resetWebShellTranscriptProps(); diff --git a/packages/vscode-ide-companion/src/webview/App.tsx b/packages/vscode-ide-companion/src/webview/App.tsx index c9727fda11a..d309cdddaaf 100644 --- a/packages/vscode-ide-companion/src/webview/App.tsx +++ b/packages/vscode-ide-companion/src/webview/App.tsx @@ -50,6 +50,12 @@ import type { Question } from '../types/acpTypes.js'; import { useImagePaste } from './hooks/useImage.js'; import { computeContextUsage } from './utils/contextUsage.js'; import { resolveFileLinkFromAnchor } from './utils/fileLinks.js'; +import { + findBlockByRowKey, + findLastAssistantText, + formatBlocksForCopyAll, + getBlockCopyText, +} from './utils/copyTranscript.js'; import { SKILL_ITEM_ID_PREFIX, isSkillsSecondaryQuery, @@ -825,6 +831,66 @@ export const App: React.FC = () => { }, []); const transcriptBlocks = useAcpTranscript(); + // === Contributed copy commands (qwen-code.copyMessage/copyAllMessages/ + // copyLastReply) === + // The extension host routes the commands back to the webview that last + // reported a context menu (`contextMenuTriggered`) via a `copyCommand` + // message. The transcript container carries the `webviewSection` context + // key the `webview/context` contributions filter on. + const messagesContainerRef = useRef(null); + const transcriptBlocksRef = useRef(transcriptBlocks); + useEffect(() => { + transcriptBlocksRef.current = transcriptBlocks; + }, [transcriptBlocks]); + const contextMenuRowKeyRef = useRef(null); + + useEffect(() => { + const trackTarget = (event: MouseEvent) => { + const container = messagesContainerRef.current; + const target = event.target instanceof Element ? event.target : null; + const row = target?.closest?.('[data-message-row-key]') as + | HTMLElement + | null + | undefined; + contextMenuRowKeyRef.current = + container && row && container.contains(row) + ? row.getAttribute('data-message-row-key') + : null; + // Notify the extension that this webview was right-clicked, so the + // contributed copy commands route here. + vscode.postMessage({ type: 'contextMenuTriggered', data: {} }); + }; + document.addEventListener('contextmenu', trackTarget, true); + return () => document.removeEventListener('contextmenu', trackTarget, true); + }, [vscode]); + + useEffect(() => { + const handleCopyCommand = (event: MessageEvent) => { + const message = event.data as { + type?: string; + data?: { action?: string }; + }; + if (message?.type !== 'copyCommand') { + return; + } + const blocks = transcriptBlocksRef.current; + let text: string | null = null; + if (message.data?.action === 'copyMessage') { + const block = findBlockByRowKey(blocks, contextMenuRowKeyRef.current); + text = block ? getBlockCopyText(block) : null; + } else if (message.data?.action === 'copyAllMessages') { + text = formatBlocksForCopyAll(blocks); + } else if (message.data?.action === 'copyLastReply') { + text = findLastAssistantText(blocks); + } + if (text) { + vscode.postMessage({ type: 'copyToClipboard', data: { text } }); + } + }; + window.addEventListener('message', handleCopyCommand); + return () => window.removeEventListener('message', handleCopyCommand); + }, [vscode]); + return (
{/* Top-level loading overlay */} @@ -867,7 +933,16 @@ export const App: React.FC = () => { } /> -
+
{!hasContent && !isLoading && !sessionManagement.isSwitchingSession ? ( isAuthenticated === false ? ( diff --git a/packages/vscode-ide-companion/src/webview/utils/copyTranscript.test.ts b/packages/vscode-ide-companion/src/webview/utils/copyTranscript.test.ts new file mode 100644 index 00000000000..85171d6fa09 --- /dev/null +++ b/packages/vscode-ide-companion/src/webview/utils/copyTranscript.test.ts @@ -0,0 +1,120 @@ +/** + * @license + * Copyright 2025 Qwen Team + * SPDX-License-Identifier: Apache-2.0 + */ + +import { describe, expect, it } from 'vitest'; +import type { DaemonTranscriptBlock } from '@qwen-code/sdk/daemon'; +import { + findBlockByRowKey, + findLastAssistantText, + formatBlocksForCopyAll, + getBlockCopyText, +} from './copyTranscript.js'; + +type TextKind = 'user' | 'assistant' | 'thought'; + +function textBlock(kind: TextKind, id: string, text: string) { + return { + kind, + id, + text, + clientReceivedAt: 0, + createdAt: 0, + updatedAt: 0, + } satisfies DaemonTranscriptBlock; +} + +function toolBlock(id: string, title: string, details?: string) { + return { + kind: 'tool', + id, + toolCallId: `${id}-call`, + title, + status: 'completed', + preview: { kind: 'generic', summary: '' }, + details, + clientReceivedAt: 0, + createdAt: 0, + updatedAt: 0, + } satisfies DaemonTranscriptBlock; +} + +describe('getBlockCopyText', () => { + it('copies text blocks', () => { + expect(getBlockCopyText(textBlock('assistant', 'a-1', 'hello'))).toBe( + 'hello', + ); + }); + + it('skips whitespace-only blocks', () => { + expect(getBlockCopyText(textBlock('user', 'u-1', ' '))).toBeNull(); + }); + + it('copies tool title and details', () => { + expect(getBlockCopyText(toolBlock('t-1', 'Ran ls', '2 files'))).toBe( + 'Ran ls\n2 files', + ); + expect(getBlockCopyText(toolBlock('t-2', 'Ran ls'))).toBe('Ran ls'); + }); +}); + +describe('formatBlocksForCopyAll', () => { + it('labels conversation blocks like the pre-PR timeline and skips others', () => { + const blocks = [ + textBlock('user', 'u-1', 'question'), + toolBlock('t-1', 'Ran ls'), + textBlock('thought', 'th-1', 'pondering'), + textBlock('assistant', 'a-1', 'answer'), + ]; + expect(formatBlocksForCopyAll(blocks)).toBe( + '**User:** question\n\n---\n\n**Thinking:** pondering\n\n---\n\n**Qwen Code:** answer', + ); + }); + + it('returns an empty string when there is nothing to copy', () => { + expect(formatBlocksForCopyAll([])).toBe(''); + }); +}); + +describe('findLastAssistantText', () => { + it('returns the most recent non-empty assistant block', () => { + const blocks = [ + textBlock('assistant', 'a-1', 'first'), + textBlock('user', 'u-1', 'next'), + textBlock('assistant', 'a-2', 'second'), + textBlock('assistant', 'a-3', ' '), + ]; + expect(findLastAssistantText(blocks)).toBe('second'); + }); + + it('returns null without an assistant block', () => { + expect(findLastAssistantText([textBlock('user', 'u-1', 'hi')])).toBeNull(); + }); +}); + +describe('findBlockByRowKey', () => { + const blocks = [ + textBlock('user', 'u-1', 'question'), + textBlock('assistant', 'a-1', 'answer'), + ]; + + it('matches an exact message key', () => { + expect(findBlockByRowKey(blocks, 'msg:a-1')).toBe(blocks[1]); + }); + + it('matches projected message keys derived from a block id', () => { + expect(findBlockByRowKey(blocks, 'msg:a-1-ip')).toBe(blocks[1]); + }); + + it('ignores non-message rows and unknown keys', () => { + expect(findBlockByRowKey(blocks, 'slot:header')).toBeNull(); + expect(findBlockByRowKey(blocks, 'msg:zz-9')).toBeNull(); + expect(findBlockByRowKey(blocks, null)).toBeNull(); + }); + + it('does not match across block id prefixes', () => { + expect(findBlockByRowKey(blocks, 'msg:a-10')).toBeNull(); + }); +}); diff --git a/packages/vscode-ide-companion/src/webview/utils/copyTranscript.ts b/packages/vscode-ide-companion/src/webview/utils/copyTranscript.ts new file mode 100644 index 00000000000..a0192e8a4b7 --- /dev/null +++ b/packages/vscode-ide-companion/src/webview/utils/copyTranscript.ts @@ -0,0 +1,121 @@ +/** + * @license + * Copyright 2025 Qwen Team + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * Clipboard copy support for the WebShell transcript timeline. + * + * The contributed `qwen-code.copyMessage` / `copyAllMessages` / + * `copyLastReply` commands route through the extension host + * (`WebViewProvider.sendCopyCommand`) and land back in the webview as a + * `copyCommand` message. The pre-PR timeline copied from the legacy + * `allMessages` list; the transcript timeline copies from the reduced + * `DaemonTranscriptBlock`s instead. + */ + +import type { DaemonTranscriptBlock } from '@qwen-code/sdk/daemon'; + +/** Plain-text payload of one block, or null when it carries no copyable text. */ +export function getBlockCopyText(block: DaemonTranscriptBlock): string | null { + switch (block.kind) { + case 'user': + case 'assistant': + case 'thought': + case 'status': + case 'error': + case 'debug': + case 'shell': { + const text = block.text.trim(); + return text ? text : null; + } + case 'user_shell': { + const parts = [block.command, block.text].filter( + (part) => typeof part === 'string' && part.trim().length > 0, + ); + const text = parts.join('\n').trim(); + return text ? text : null; + } + case 'tool': { + const parts: string[] = []; + if (block.title.trim()) { + parts.push(block.title.trim()); + } + if (typeof block.details === 'string' && block.details.trim()) { + parts.push(block.details.trim()); + } + const text = parts.join('\n'); + return text ? text : null; + } + case 'prompt_cancelled': + return null; + default: + return null; + } +} + +/** + * Conversation-formatted copy of all message blocks (the "Copy All Messages" + * command). Labels match the pre-PR timeline output. + */ +export function formatBlocksForCopyAll( + blocks: readonly DaemonTranscriptBlock[], +): string { + const parts: string[] = []; + for (const block of blocks) { + if ( + block.kind !== 'user' && + block.kind !== 'assistant' && + block.kind !== 'thought' + ) { + continue; + } + const content = block.text.trim(); + if (!content) { + continue; + } + if (block.kind === 'user') { + parts.push(`**User:** ${content}`); + } else if (block.kind === 'thought') { + parts.push(`**Thinking:** ${content}`); + } else { + parts.push(`**Qwen Code:** ${content}`); + } + } + return parts.join('\n\n---\n\n'); +} + +/** Text of the most recent non-empty assistant block ("Copy Last Reply"). */ +export function findLastAssistantText( + blocks: readonly DaemonTranscriptBlock[], +): string | null { + for (let i = blocks.length - 1; i >= 0; i -= 1) { + const block = blocks[i]; + if (block && block.kind === 'assistant' && block.text.trim()) { + return block.text; + } + } + return null; +} + +/** + * Map a captured `data-message-row-key` value to its transcript block. + * MessageList keys message rows as `msg:`; the message id is the + * block id, optionally with a projection suffix (e.g. `-ip`, `-t-2`). + */ +export function findBlockByRowKey( + blocks: readonly DaemonTranscriptBlock[], + rowKey: string | null, +): DaemonTranscriptBlock | null { + if (!rowKey || !rowKey.startsWith('msg:')) { + return null; + } + const messageKey = rowKey.slice('msg:'.length); + for (const block of blocks) { + if (messageKey === block.id || messageKey.startsWith(`${block.id}-`)) { + return block; + } + } + return null; +} From e68382cf9404fc35e40e73f11f94d054aceacc4d Mon Sep 17 00:00:00 2001 From: "jinjing.zzj" Date: Sun, 23 Aug 2026 13:23:01 +0800 Subject: [PATCH 12/57] fix(vscode-ide-companion): add localOnly marker to TextMessage state type --- .../src/webview/hooks/message/useMessageHandling.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/vscode-ide-companion/src/webview/hooks/message/useMessageHandling.ts b/packages/vscode-ide-companion/src/webview/hooks/message/useMessageHandling.ts index 028caeb75bb..855afa81180 100644 --- a/packages/vscode-ide-companion/src/webview/hooks/message/useMessageHandling.ts +++ b/packages/vscode-ide-companion/src/webview/hooks/message/useMessageHandling.ts @@ -11,6 +11,13 @@ export interface TextMessage { content: string; timestamp: number; turnIndex?: number; + /** + * True for messages generated inside the webview itself (connection / + * auth / generic errors, the local "Interrupted" cancel mark). The + * WebShell transcript renders ACP `transcriptUpdate` frames only, so the + * App renders these entries in a dedicated notice slot. + */ + localOnly?: boolean; kind?: 'image'; imagePath?: string; imageSrc?: string; From 778966416ce250c2ae81f472de374d9c9e48ace0 Mon Sep 17 00:00:00 2001 From: "jinjing.zzj" Date: Sun, 23 Aug 2026 13:23:03 +0800 Subject: [PATCH 13/57] fix(vscode-ide-companion): restore /insight progress card and report link in the transcript UI --- .../src/webview/App.test.tsx | 84 ++++++++++++++++++- .../vscode-ide-companion/src/webview/App.tsx | 59 ++++++++++++- .../webview/hooks/useWebViewMessages.test.tsx | 49 +++++++++++ 3 files changed, 190 insertions(+), 2 deletions(-) diff --git a/packages/vscode-ide-companion/src/webview/App.test.tsx b/packages/vscode-ide-companion/src/webview/App.test.tsx index 3f8e30699f1..8b00e97ae65 100644 --- a/packages/vscode-ide-companion/src/webview/App.test.tsx +++ b/packages/vscode-ide-companion/src/webview/App.test.tsx @@ -18,6 +18,7 @@ const { mockCloseCompletion, mockMessageState, mockMessages, + mockInsightState, mockAddMessage, mockEndStreaming, mockWebShellTranscriptProps, @@ -35,6 +36,14 @@ const { timestamp: number; localOnly?: boolean; }>, + mockInsightState: { + progress: null as null | { + stage: string; + progress: number; + detail?: string; + }, + reportPath: null as null | string, + }, mockAddMessage: vi.fn(), mockEndStreaming: vi.fn(), mockWebShellTranscriptProps: { @@ -134,6 +143,8 @@ vi.mock('./hooks/useWebViewMessages.js', async () => { setIsAuthenticated, setAvailableCommands, setAvailableSkills, + setInsightProgress, + setInsightReportPath, }: { setIsAuthenticated: (value: boolean) => void; setAvailableCommands: ( @@ -144,6 +155,10 @@ vi.mock('./hooks/useWebViewMessages.js', async () => { }>, ) => void; setAvailableSkills: (value: string[]) => void; + setInsightProgress?: ( + value: { stage: string; progress: number; detail?: string } | null, + ) => void; + setInsightReportPath?: (value: string | null) => void; }) => { const initializedRef = React.useRef(false); @@ -153,6 +168,12 @@ vi.mock('./hooks/useWebViewMessages.js', async () => { } initializedRef.current = true; setIsAuthenticated(true); + if (mockInsightState.progress) { + setInsightProgress?.(mockInsightState.progress); + } + if (mockInsightState.reportPath) { + setInsightReportPath?.(mockInsightState.reportPath); + } setAvailableCommands([ { name: 'skills', @@ -171,7 +192,13 @@ vi.mock('./hooks/useWebViewMessages.js', async () => { }, ]); setAvailableSkills(['code-review']); - }, [setAvailableCommands, setAvailableSkills, setIsAuthenticated]); + }, [ + setAvailableCommands, + setAvailableSkills, + setIsAuthenticated, + setInsightProgress, + setInsightReportPath, + ]); }, }; }); @@ -243,6 +270,14 @@ vi.mock('@qwen-code/webui', () => ({ EmptyState: () => null, ChatHeader: () => null, SessionSelector: () => null, + InsightProgressCard: ({ + stage, + progress, + }: { + stage: string; + progress: number; + detail?: string; + }) => `${stage} ${Math.round(progress)}%`, ZERO_WIDTH_SPACE: '\u200B', CloseSmallIcon: () => null, stripZeroWidthSpaces: (text: string) => text.replace(/\u200B/g, ''), @@ -394,6 +429,8 @@ describe('App /skills secondary picker', () => { beforeEach(() => { vi.clearAllMocks(); mockMessages.length = 0; + mockInsightState.progress = null; + mockInsightState.reportPath = null; mockMessageState.isStreaming = false; mockMessageState.isWaitingForResponse = false; ( @@ -885,6 +922,51 @@ describe('App /skills secondary picker', () => { }); }); + it('renders /insight progress updates from the insightProgress setter', async () => { + mockInsightState.progress = { stage: 'Analyzing', progress: 40 }; + + const rendered = renderApp(); + root = rendered.root; + container = rendered.container; + + await act(async () => {}); + + const card = rendered.container.querySelector( + '[data-testid="insight-progress"]', + ); + expect(card).not.toBeNull(); + expect(card?.textContent).toContain('Analyzing'); + expect(card?.textContent).toContain('40%'); + }); + + it('surfaces the generated insight report path and opens it on click', async () => { + mockInsightState.reportPath = '/tmp/insight-report.md'; + + const rendered = renderApp(); + root = rendered.root; + container = rendered.container; + + await act(async () => {}); + + const link = rendered.container.querySelector( + '[data-testid="insight-report-link"]', + ) as HTMLAnchorElement; + expect(link).not.toBeNull(); + expect(link.textContent).toBe('/tmp/insight-report.md'); + + mockPostMessage.mockClear(); + act(() => { + link.dispatchEvent( + new MouseEvent('click', { bubbles: true, cancelable: true }), + ); + }); + + expect(mockPostMessage).toHaveBeenCalledWith({ + type: 'openInsightReport', + data: { path: '/tmp/insight-report.md' }, + }); + }); + it('disables WebShell transcript turn auto-collapse while a response is in flight', async () => { mockMessageState.isStreaming = true; resetWebShellTranscriptProps(); diff --git a/packages/vscode-ide-companion/src/webview/App.tsx b/packages/vscode-ide-companion/src/webview/App.tsx index d309cdddaaf..318e5aa9669 100644 --- a/packages/vscode-ide-companion/src/webview/App.tsx +++ b/packages/vscode-ide-companion/src/webview/App.tsx @@ -32,6 +32,7 @@ import { PermissionDrawer, AskUserQuestionDialog, ImagePreview, + InsightProgressCard, // Layout components imported directly from webui EmptyState, ChatHeader, @@ -113,6 +114,17 @@ export const App: React.FC = () => { const [availableModels, setAvailableModels] = useState([]); const [showModelSelector, setShowModelSelector] = useState(false); const [accountInfo, setAccountInfo] = useState(null); + // /insight feedback: latest structured progress update and the generated + // report path, surfaced by the extension via insightProgress / + // insightReportReady messages. + const [insightProgress, setInsightProgress] = useState<{ + stage: string; + progress: number; + detail?: string; + } | null>(null); + const [insightReportPath, setInsightReportPath] = useState( + null, + ); const inputFieldRef = useRef(null); const [editMode, setEditMode] = useState( @@ -400,6 +412,12 @@ export const App: React.FC = () => { setAccountInfo: (info) => { setAccountInfo(info); }, + setInsightProgress: (progress) => { + setInsightProgress(progress); + }, + setInsightReportPath: (path) => { + setInsightReportPath(path); + }, }); // Set loading state to false after initial mount and when we have authentication info @@ -825,6 +843,18 @@ export const App: React.FC = () => { [vscode], ); + // Open the generated /insight report in the editor via the extension's + // existing `openInsightReport` handler. + const handleOpenInsightReport = useCallback(() => { + if (!insightReportPath) { + return; + } + vscode.postMessage({ + type: 'openInsightReport', + data: { path: insightReportPath }, + }); + }, [insightReportPath, vscode]); + const webShellTheme = useMemo<'dark' | 'light'>(() => { const kind = document.body.getAttribute('data-vscode-theme-kind') ?? ''; return kind.includes('light') ? 'light' : 'dark'; @@ -997,13 +1027,40 @@ export const App: React.FC = () => { /> )} - {localNotices.length > 0 && ( + {(localNotices.length > 0 || insightProgress || insightReportPath) && (
+ {insightProgress && ( +
+ +
+ )} + {insightReportPath && ( + + )} {localNotices.map((notice, index) => (
; clearWaitingForResponse?: ReturnType; setInsightReportPath?: ReturnType; + setInsightProgress?: ReturnType; }) { const container = document.createElement('div'); document.body.appendChild(container); @@ -45,6 +46,7 @@ function renderHookHarness(overrides?: { const endStreaming = overrides?.endStreaming ?? vi.fn(); const clearWaitingForResponse = overrides?.clearWaitingForResponse ?? vi.fn(); const setInsightReportPath = overrides?.setInsightReportPath ?? vi.fn(); + const setInsightProgress = overrides?.setInsightProgress ?? vi.fn(); const handlers = { sessionManagement: { @@ -100,6 +102,7 @@ function renderHookHarness(overrides?: { setAvailableCommands: vi.fn(), setAvailableModels: vi.fn(), setInsightReportPath, + setInsightProgress, }; function Harness() { @@ -119,6 +122,7 @@ function renderHookHarness(overrides?: { endStreaming, clearWaitingForResponse, setInsightReportPath, + setInsightProgress, }; } @@ -718,4 +722,49 @@ describe('useWebViewMessages', () => { expect(added[1]?.content).toBe('bad token'); expect(added[2]?.content).toBe('boom'); }); + + it('delivers insight progress and report path to the provided setters', () => { + const setInsightReportPath = vi.fn(); + const setInsightProgress = vi.fn(); + const rendered = renderHookHarness({ + setInsightReportPath, + setInsightProgress, + }); + root = rendered.root; + container = rendered.container; + + act(() => { + window.dispatchEvent( + new MessageEvent('message', { + data: { + type: 'insightProgress', + data: { stage: 'Analyzing', progress: 0.4 }, + }, + }), + ); + }); + + expect(rendered.setInsightProgress).toHaveBeenCalledWith({ + stage: 'Analyzing', + progress: 0.4, + detail: undefined, + }); + + act(() => { + window.dispatchEvent( + new MessageEvent('message', { + data: { + type: 'insightReportReady', + data: { path: '/tmp/insight-report.md' }, + }, + }), + ); + }); + + expect(rendered.setInsightReportPath).toHaveBeenCalledWith( + '/tmp/insight-report.md', + ); + // Report ready clears the progress indicator. + expect(rendered.setInsightProgress).toHaveBeenLastCalledWith(null); + }); }); From af98d96a9731ce0b9be36f9a6bab03e7f9126de7 Mon Sep 17 00:00:00 2001 From: "jinjing.zzj" Date: Sun, 23 Aug 2026 14:04:46 +0800 Subject: [PATCH 14/57] fix(vscode-ide-companion): finalize in-flight tools on timeout and pin session-switch seeding guard Map streamEnd reasons timeout/session_expired onto the reducer's error reason so abandoned mid-tool turns no longer spin forever (ceuI). Add qwenSessionSwitched cases with no messages field and an empty cache array; the no-messages case fails when the seeding guard is forced true, pinning its false side (ceuN). --- .../webview/hooks/useAcpTranscript.test.ts | 145 ++++++++++++++++++ .../src/webview/hooks/useAcpTranscript.ts | 6 + 2 files changed, 151 insertions(+) diff --git a/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.test.ts b/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.test.ts index 1c13d88c2c2..717ebb26ef8 100644 --- a/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.test.ts +++ b/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.test.ts @@ -38,6 +38,22 @@ function assistantTextNotification( }; } +function toolCallNotification( + sessionId: string, + toolCallId: string, +): SessionNotification { + return { + sessionId, + update: { + sessionUpdate: 'tool_call', + toolCallId, + status: 'in_progress', + title: 'Running command', + kind: 'execute', + }, + } as SessionNotification; +} + function postToWebview(message: unknown): void { window.dispatchEvent(new MessageEvent('message', { data: message })); } @@ -385,4 +401,133 @@ describe('useAcpTranscript', () => { }); expect(captured.blocks[0]).toMatchObject({ streaming: false }); }); + + it.each(['timeout', 'session_expired'] as const)( + 'force-finalizes an in-flight tool block when the stream ends with %s', + (reason) => { + act(() => { + postToWebview({ + type: 'transcriptUpdate', + data: toolCallNotification('session-a', 'call-1'), + }); + }); + expect(captured.blocks[0]).toMatchObject({ + kind: 'tool', + status: 'in_progress', + }); + + act(() => { + postToWebview({ + type: 'streamEnd', + data: { timestamp: Date.now(), reason }, + }); + }); + + // The reducer only propagates abnormal termination for the + // cancelled/error reasons; without the mapping the tool block would + // keep its in-flight status and spin forever. + expect(captured.blocks[0]).toMatchObject({ + kind: 'tool', + status: 'cancelled', + }); + }, + ); + + it('force-finalizes an in-flight tool block when the user cancels', () => { + act(() => { + postToWebview({ + type: 'transcriptUpdate', + data: toolCallNotification('session-a', 'call-1'), + }); + }); + expect(captured.blocks[0]).toMatchObject({ + kind: 'tool', + status: 'in_progress', + }); + + act(() => { + postToWebview({ + type: 'streamEnd', + data: { timestamp: Date.now(), reason: 'user_cancelled' }, + }); + }); + expect(captured.blocks[0]).toMatchObject({ + kind: 'tool', + status: 'cancelled', + }); + }); + + it('leaves an in-flight tool block running on a normal end_turn stream end', () => { + act(() => { + postToWebview({ + type: 'transcriptUpdate', + data: toolCallNotification('session-a', 'call-1'), + }); + }); + + act(() => { + postToWebview({ + type: 'streamEnd', + data: { timestamp: Date.now(), reason: 'end_turn' }, + }); + }); + + // Transport-layer-style endings must not cancel in-flight tools; the + // daemon still delivers the real terminal status via tool_call_update. + expect(captured.blocks[0]).toMatchObject({ + kind: 'tool', + status: 'in_progress', + }); + }); + + it('does not seed the transcript when qwenSessionSwitched carries no messages field', () => { + const errors: Event[] = []; + const onError = (event: Event) => { + errors.push(event); + }; + window.addEventListener('error', onError); + try { + act(() => { + postToWebview({ + type: 'qwenSessionSwitched', + data: { sessionId: 'session-no-messages' }, + }); + }); + + // The boundary still resets the transcript, but nothing is seeded + // and the handler must not crash on the missing cache array. + expect(captured.blocks).toHaveLength(0); + expect(errors).toHaveLength(0); + } finally { + window.removeEventListener('error', onError); + } + }); + + it('does not clobber the fresh transcript when qwenSessionSwitched carries an empty messages array', () => { + act(() => { + postToWebview({ + type: 'transcriptUpdate', + data: userTextNotification('session-a', 'alpha'), + }); + }); + expect(captured.blocks).toHaveLength(1); + + act(() => { + postToWebview({ + type: 'qwenSessionSwitched', + data: { sessionId: 'session-empty-cache', messages: [] }, + }); + }); + expect(captured.blocks).toHaveLength(0); + + // Live frames of the switched session render after the boundary. + act(() => { + postToWebview({ + type: 'transcriptUpdate', + data: userTextNotification('session-empty-cache', 'live'), + }); + }); + expect(captured.blocks).toHaveLength(1); + expect(captured.blocks[0]).toMatchObject({ kind: 'user', text: 'live' }); + }); }); diff --git a/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.ts b/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.ts index 088227e302e..a8738d1157a 100644 --- a/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.ts +++ b/packages/vscode-ide-companion/src/webview/hooks/useAcpTranscript.ts @@ -22,6 +22,12 @@ function streamEndToDoneReason(reason: unknown): string { if (reason === 'user_cancelled') { return 'cancelled'; } + // Timeouts and expired sessions terminate the turn at the application + // layer; map them onto the reducer's abnormal-reason set so in-flight + // tool blocks are force-finalized instead of spinning forever. + if (reason === 'timeout' || reason === 'session_expired') { + return 'error'; + } return typeof reason === 'string' && reason.length > 0 ? reason : 'end_turn'; } From de3b2d873fbfeb8b2ca583e612ebdf6ad71294cf Mon Sep 17 00:00:00 2001 From: "jinjing.zzj" Date: Sun, 23 Aug 2026 14:08:39 +0800 Subject: [PATCH 15/57] fix(vscode-ide-companion): remove unreachable editMessage backend and dead submit options The user-message edit/rewind UI was dropped in the WebShell-transcript migration, leaving editTargetTurnIndex/onSubmitted options in useMessageSubmit and the full editMessage/rewind flow in SessionMessageHandler unreachable. Remove the dead options, the editMessage dispatch case, the rewind/snapshot flow with its recovery branches, and their tests (R1-8 direction b). --- .../handlers/SessionMessageHandler.test.ts | 534 ------------------ .../webview/handlers/SessionMessageHandler.ts | 279 +-------- .../webview/hooks/useMessageSubmit.test.ts | 25 - .../src/webview/hooks/useMessageSubmit.ts | 15 +- 4 files changed, 12 insertions(+), 841 deletions(-) diff --git a/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.test.ts b/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.test.ts index 603e435c18e..a8be91e3bd0 100644 --- a/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.test.ts +++ b/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.test.ts @@ -360,94 +360,6 @@ describe('SessionMessageHandler', () => { ]); }); - it('keeps the conversation store aligned with the ACP session id before editing', async () => { - mockProcessImageAttachments.mockImplementation( - async (promptText: string) => ({ - formattedText: promptText, - displayText: promptText, - savedImageCount: 0, - promptImages: [], - }), - ); - - const agentManager = { - isConnected: true, - currentSessionId: 'session-1', - rewindSession: vi.fn().mockResolvedValue({ - historyBeforeRewind: [{ role: 'user', parts: [{ text: 'first' }] }], - }), - restoreSessionHistory: vi.fn().mockResolvedValue(undefined), - sendMessage: vi.fn().mockResolvedValue(undefined), - }; - let conversation = { - id: 'conversation-1', - title: 'Conversation', - messages: [] as Array<{ - role: 'user' | 'assistant' | 'thinking'; - content: string; - timestamp: number; - }>, - createdAt: 1, - updatedAt: 1, - }; - const conversationStore = { - createConversation: vi.fn().mockResolvedValue(conversation), - getConversation: vi.fn(async (id: string) => - conversation.id === id ? conversation : null, - ), - addMessage: vi.fn(async (id: string, message) => { - if (conversation.id === id) { - conversation.messages.push(message); - } - }), - renameConversationId: vi.fn(async (fromId: string, toId: string) => { - if (conversation.id !== fromId) { - return false; - } - conversation = { ...conversation, id: toId }; - return true; - }), - replaceMessages: vi.fn().mockResolvedValue(true), - truncateFromUserTurn: vi.fn().mockResolvedValue(true), - }; - const sendToWebView = vi.fn(); - - const handler = new SessionMessageHandler( - agentManager as never, - conversationStore as never, - null, - sendToWebView, - ); - - await handler.handle({ - type: 'sendMessage', - data: { text: 'first prompt' }, - }); - - await handler.handle({ - type: 'editMessage', - data: { - text: 'edited prompt', - targetTurnIndex: 0, - }, - }); - - expect(conversationStore.renameConversationId).toHaveBeenCalledWith( - 'conversation-1', - 'session-1', - ); - expect(conversationStore.getConversation).toHaveBeenCalledWith('session-1'); - expect(conversationStore.truncateFromUserTurn).toHaveBeenCalledWith( - 'session-1', - 0, - ); - expect(agentManager.rewindSession).toHaveBeenCalledWith(0); - expect(sendToWebView).not.toHaveBeenCalledWith({ - type: 'error', - data: { message: 'Failed to capture conversation state before editing.' }, - }); - }); - it('does not switch to a colliding ACP session id when rename fails', async () => { mockProcessImageAttachments.mockImplementation( async (promptText: string) => ({ @@ -569,452 +481,6 @@ describe('SessionMessageHandler', () => { expect(handler.getCurrentConversationId()).toBe('session-1'); }); - it('rewinds the active ACP session before sending an edited message', async () => { - mockProcessImageAttachments.mockResolvedValue({ - formattedText: 'edited prompt', - displayText: 'edited prompt', - savedImageCount: 0, - promptImages: [], - }); - - const agentManager = { - isConnected: true, - currentSessionId: 'session-1', - rewindSession: vi.fn().mockResolvedValue({ - historyBeforeRewind: [{ role: 'user', parts: [{ text: 'first' }] }], - }), - restoreSessionHistory: vi.fn().mockResolvedValue(undefined), - sendMessage: vi.fn().mockResolvedValue(undefined), - }; - const conversationStore = { - createConversation: vi.fn(), - getConversation: vi.fn().mockResolvedValue({ - id: 'session-1', - title: 'Existing session', - messages: [ - { role: 'user', content: 'first', timestamp: 1 }, - { role: 'assistant', content: 'first reply', timestamp: 2 }, - { role: 'user', content: 'second', timestamp: 3 }, - ], - createdAt: 1, - updatedAt: 3, - }), - addMessage: vi.fn(), - replaceMessages: vi.fn().mockResolvedValue(true), - truncateFromUserTurn: vi.fn().mockResolvedValue(true), - }; - const sendToWebView = vi.fn(); - - const handler = new SessionMessageHandler( - agentManager as never, - conversationStore as never, - 'session-1', - sendToWebView, - ); - - await handler.handle({ - type: 'editMessage', - data: { - text: 'edited prompt', - targetTurnIndex: 1, - }, - }); - - expect(agentManager.rewindSession).toHaveBeenCalledWith(1); - expect(conversationStore.truncateFromUserTurn).toHaveBeenCalledWith( - 'session-1', - 1, - ); - expect(sendToWebView).toHaveBeenCalledWith({ - type: 'conversationRewound', - data: { targetTurnIndex: 1 }, - }); - expect(agentManager.sendMessage).toHaveBeenCalledWith([ - { type: 'text', text: 'edited prompt' }, - ]); - expect( - conversationStore.truncateFromUserTurn.mock.invocationCallOrder[0], - ).toBeLessThan(agentManager.rewindSession.mock.invocationCallOrder[0]); - expect(agentManager.rewindSession.mock.invocationCallOrder[0]).toBeLessThan( - agentManager.sendMessage.mock.invocationCallOrder[0], - ); - }); - - it('restores the edited conversation snapshot when replacement send fails', async () => { - mockProcessImageAttachments.mockResolvedValue({ - formattedText: 'edited prompt', - displayText: 'edited prompt', - savedImageCount: 0, - promptImages: [], - }); - - const originalConversation = { - id: 'session-1', - title: 'Existing session', - messages: [ - { role: 'user' as const, content: 'first', timestamp: 1 }, - { role: 'assistant' as const, content: 'first reply', timestamp: 2 }, - { role: 'user' as const, content: 'second', timestamp: 3 }, - { role: 'assistant' as const, content: 'second reply', timestamp: 4 }, - ], - createdAt: 1, - updatedAt: 4, - }; - const agentManager = { - isConnected: true, - currentSessionId: 'session-1', - rewindSession: vi.fn().mockResolvedValue({ - historyBeforeRewind: [{ role: 'user', parts: [{ text: 'first' }] }], - }), - restoreSessionHistory: vi.fn().mockResolvedValue(undefined), - sendMessage: vi.fn().mockRejectedValue(new Error('send failed')), - }; - const conversationStore = { - createConversation: vi.fn(), - getConversation: vi.fn().mockResolvedValue(originalConversation), - addMessage: vi.fn(), - replaceMessages: vi.fn().mockResolvedValue(true), - truncateFromUserTurn: vi.fn().mockResolvedValue(true), - }; - const sendToWebView = vi.fn(); - - const handler = new SessionMessageHandler( - agentManager as never, - conversationStore as never, - 'session-1', - sendToWebView, - ); - - await handler.handle({ - type: 'editMessage', - data: { - text: 'edited prompt', - targetTurnIndex: 1, - }, - }); - - expect(agentManager.restoreSessionHistory).toHaveBeenCalledWith([ - { role: 'user', parts: [{ text: 'first' }] }, - ]); - expect(conversationStore.replaceMessages).toHaveBeenCalledWith( - 'session-1', - originalConversation.messages, - ); - expect(sendToWebView).toHaveBeenCalledWith({ - type: 'conversationLoaded', - data: originalConversation, - }); - expect(sendToWebView).toHaveBeenCalledWith({ - type: 'error', - data: { message: 'send failed' }, - }); - }); - - it('continues edits with ACP-only rewind when no local snapshot exists', async () => { - mockProcessImageAttachments.mockResolvedValue({ - formattedText: 'edited prompt', - displayText: 'edited prompt', - savedImageCount: 0, - promptImages: [], - }); - - const agentManager = { - isConnected: true, - currentSessionId: 'session-1', - rewindSession: vi.fn().mockResolvedValue({ - historyBeforeRewind: [{ role: 'user', parts: [{ text: 'first' }] }], - }), - restoreSessionHistory: vi.fn(), - sendMessage: vi.fn().mockResolvedValue(undefined), - getSessionMessages: vi.fn().mockResolvedValue([]), - }; - const conversationStore = { - createConversation: vi.fn(), - getConversation: vi.fn().mockResolvedValue(null), - addMessage: vi.fn(), - replaceMessages: vi.fn(), - truncateFromUserTurn: vi.fn(), - upsertConversation: vi.fn(), - }; - const sendToWebView = vi.fn(); - - const handler = new SessionMessageHandler( - agentManager as never, - conversationStore as never, - 'session-1', - sendToWebView, - ); - - await handler.handle({ - type: 'editMessage', - data: { - text: 'edited prompt', - targetTurnIndex: 1, - }, - }); - - expect(conversationStore.truncateFromUserTurn).not.toHaveBeenCalled(); - expect(agentManager.rewindSession).toHaveBeenCalledWith(1); - expect(sendToWebView).toHaveBeenCalledWith({ - type: 'conversationRewound', - data: { targetTurnIndex: 1 }, - }); - expect(agentManager.sendMessage).toHaveBeenCalledWith([ - { type: 'text', text: 'edited prompt' }, - ]); - expect(sendToWebView).not.toHaveBeenCalledWith({ - type: 'sessionTitleUpdated', - data: { - sessionId: 'session-1', - title: 'edited prompt', - }, - }); - expect(sendToWebView).not.toHaveBeenCalledWith({ - type: 'error', - data: expect.objectContaining({ - message: 'Failed to capture conversation state before editing.', - }), - }); - }); - - it('recovers a missing edit snapshot from persisted session messages', async () => { - mockProcessImageAttachments.mockResolvedValue({ - formattedText: 'edited prompt', - displayText: 'edited prompt', - savedImageCount: 0, - promptImages: [], - }); - - const persistedMessages = [ - { role: 'user' as const, content: 'first', timestamp: 1 }, - { role: 'assistant' as const, content: 'first reply', timestamp: 2 }, - { role: 'user' as const, content: 'second', timestamp: 3 }, - ]; - const agentManager = { - isConnected: true, - currentSessionId: 'session-1', - rewindSession: vi.fn().mockResolvedValue({ - historyBeforeRewind: [{ role: 'user', parts: [{ text: 'first' }] }], - }), - restoreSessionHistory: vi.fn().mockResolvedValue(undefined), - sendMessage: vi.fn().mockResolvedValue(undefined), - getSessionMessages: vi.fn().mockResolvedValue(persistedMessages), - }; - const conversationStore = { - createConversation: vi.fn(), - getConversation: vi.fn().mockResolvedValue(null), - addMessage: vi.fn(), - replaceMessages: vi.fn(), - truncateFromUserTurn: vi.fn().mockResolvedValue(true), - upsertConversation: vi.fn().mockResolvedValue(undefined), - }; - const sendToWebView = vi.fn(); - - const handler = new SessionMessageHandler( - agentManager as never, - conversationStore as never, - 'session-1', - sendToWebView, - ); - - await handler.handle({ - type: 'editMessage', - data: { - text: 'edited prompt', - targetTurnIndex: 1, - }, - }); - - expect(agentManager.getSessionMessages).toHaveBeenCalledWith('session-1'); - expect(conversationStore.upsertConversation).toHaveBeenCalledWith({ - id: 'session-1', - title: 'first', - messages: persistedMessages, - createdAt: 1, - updatedAt: 3, - }); - expect(conversationStore.truncateFromUserTurn).toHaveBeenCalledWith( - 'session-1', - 1, - ); - expect(agentManager.rewindSession).toHaveBeenCalledWith(1); - expect(agentManager.sendMessage).toHaveBeenCalledWith([ - { type: 'text', text: 'edited prompt' }, - ]); - expect(sendToWebView).not.toHaveBeenCalledWith({ - type: 'error', - data: { message: 'Failed to capture conversation state before editing.' }, - }); - }); - - it('restores the edited conversation snapshot when ACP rewind fails', async () => { - mockProcessImageAttachments.mockResolvedValue({ - formattedText: 'edited prompt', - displayText: 'edited prompt', - savedImageCount: 0, - promptImages: [], - }); - - const originalConversation = { - id: 'session-1', - title: 'Existing session', - messages: [ - { role: 'user' as const, content: 'first', timestamp: 1 }, - { role: 'assistant' as const, content: 'first reply', timestamp: 2 }, - { role: 'user' as const, content: 'second', timestamp: 3 }, - ], - createdAt: 1, - updatedAt: 3, - }; - const agentManager = { - isConnected: true, - currentSessionId: 'session-1', - rewindSession: vi.fn().mockRejectedValue(new Error('rewind failed')), - restoreSessionHistory: vi.fn(), - sendMessage: vi.fn(), - }; - const conversationStore = { - createConversation: vi.fn(), - getConversation: vi.fn().mockResolvedValue(originalConversation), - addMessage: vi.fn(), - replaceMessages: vi.fn().mockResolvedValue(true), - truncateFromUserTurn: vi.fn().mockResolvedValue(true), - }; - const sendToWebView = vi.fn(); - - const handler = new SessionMessageHandler( - agentManager as never, - conversationStore as never, - 'session-1', - sendToWebView, - ); - - await handler.handle({ - type: 'editMessage', - data: { - text: 'edited prompt', - targetTurnIndex: 1, - }, - }); - - expect(agentManager.restoreSessionHistory).not.toHaveBeenCalled(); - expect(conversationStore.replaceMessages).toHaveBeenCalledWith( - 'session-1', - originalConversation.messages, - ); - expect(agentManager.sendMessage).not.toHaveBeenCalled(); - expect(sendToWebView).toHaveBeenCalledWith({ - type: 'error', - data: { message: 'rewind failed' }, - }); - }); - - it('restores store and ACP history when saving the edited user message fails', async () => { - mockProcessImageAttachments.mockResolvedValue({ - formattedText: 'edited prompt', - displayText: 'edited prompt', - savedImageCount: 0, - promptImages: [], - }); - - const historyBeforeRewind = [{ role: 'user', parts: [{ text: 'first' }] }]; - const originalConversation = { - id: 'session-1', - title: 'Existing session', - messages: [ - { role: 'user' as const, content: 'first', timestamp: 1 }, - { role: 'assistant' as const, content: 'first reply', timestamp: 2 }, - { role: 'user' as const, content: 'second', timestamp: 3 }, - ], - createdAt: 1, - updatedAt: 3, - }; - const agentManager = { - isConnected: true, - currentSessionId: 'session-1', - rewindSession: vi.fn().mockResolvedValue({ historyBeforeRewind }), - restoreSessionHistory: vi.fn().mockResolvedValue(undefined), - sendMessage: vi.fn(), - }; - const conversationStore = { - createConversation: vi.fn(), - getConversation: vi.fn().mockResolvedValue(originalConversation), - addMessage: vi.fn().mockRejectedValue(new Error('storage failed')), - replaceMessages: vi.fn().mockResolvedValue(true), - truncateFromUserTurn: vi.fn().mockResolvedValue(true), - }; - const sendToWebView = vi.fn(); - - const handler = new SessionMessageHandler( - agentManager as never, - conversationStore as never, - 'session-1', - sendToWebView, - ); - - await handler.handle({ - type: 'editMessage', - data: { - text: 'edited prompt', - targetTurnIndex: 1, - }, - }); - - expect(agentManager.restoreSessionHistory).toHaveBeenCalledWith( - historyBeforeRewind, - ); - expect(conversationStore.replaceMessages).toHaveBeenCalledWith( - 'session-1', - originalConversation.messages, - ); - expect(agentManager.sendMessage).not.toHaveBeenCalled(); - expect(sendToWebView).toHaveBeenCalledWith({ - type: 'error', - data: { message: 'storage failed' }, - }); - }); - - it('rejects edit submissions with invalid target turn indexes', async () => { - const agentManager = { - isConnected: true, - currentSessionId: 'session-1', - rewindSession: vi.fn(), - restoreSessionHistory: vi.fn(), - sendMessage: vi.fn(), - }; - const conversationStore = { - createConversation: vi.fn(), - getConversation: vi.fn(), - addMessage: vi.fn(), - replaceMessages: vi.fn(), - truncateFromUserTurn: vi.fn(), - }; - const sendToWebView = vi.fn(); - - const handler = new SessionMessageHandler( - agentManager as never, - conversationStore as never, - 'session-1', - sendToWebView, - ); - - await handler.handle({ - type: 'editMessage', - data: { - text: 'edited prompt', - targetTurnIndex: -1, - }, - }); - - expect(agentManager.rewindSession).not.toHaveBeenCalled(); - expect(agentManager.sendMessage).not.toHaveBeenCalled(); - expect(conversationStore.truncateFromUserTurn).not.toHaveBeenCalled(); - expect(sendToWebView).toHaveBeenCalledWith({ - type: 'error', - data: { message: 'Invalid message edit target.' }, - }); - }); - it('keeps currentConversationId aligned with the archived sessionId when session/load falls back to a new ACP session', async () => { const archivedSessionId = 'archived-session'; const agentManager = { diff --git a/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.ts b/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.ts index 2ecc148527a..b391305f861 100644 --- a/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.ts +++ b/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.ts @@ -9,7 +9,6 @@ import * as vscode from 'vscode'; import { pathToFileURL } from 'node:url'; import { BaseMessageHandler } from './BaseMessageHandler.js'; import type { ChatMessage } from '../../services/qwenAgentManager.js'; -import type { Conversation } from '../../services/conversationStore.js'; import { getDisplayableImageMimeType, type ImageAttachment, @@ -55,7 +54,6 @@ export class SessionMessageHandler extends BaseMessageHandler { canHandle(messageType: string): boolean { return [ 'sendMessage', - 'editMessage', 'newQwenSession', 'switchQwenSession', 'getQwenSessions', @@ -107,34 +105,6 @@ export class SessionMessageHandler extends BaseMessageHandler { ); break; - case 'editMessage': - await this.handleSendMessage( - (data?.text as string) || '', - data?.context as - | Array<{ - type: string; - name: string; - value: string; - startLine?: number; - endLine?: number; - isImage?: boolean; - }> - | undefined, - data?.fileContext as - | { - fileName: string; - filePath: string; - startLine?: number; - endLine?: number; - } - | undefined, - data?.attachments as ImageAttachment[] | undefined, - typeof data?.targetTurnIndex === 'number' - ? data.targetTurnIndex - : undefined, - ); - break; - case 'newQwenSession': await this.handleNewQwenSession(); break; @@ -241,76 +211,6 @@ export class SessionMessageHandler extends BaseMessageHandler { this.currentStreamContent = ''; } - private async captureConversationSnapshot( - conversationId: string | null, - ): Promise { - if (!conversationId) { - return null; - } - - const conversation = - await this.conversationStore.getConversation(conversationId); - if (conversation) { - return { - ...conversation, - messages: conversation.messages.map((message) => ({ ...message })), - }; - } - - const getSessionMessages = ( - this.agentManager as { - getSessionMessages?: (sessionId: string) => Promise; - } - ).getSessionMessages; - if (!getSessionMessages) { - return null; - } - - const messages = await getSessionMessages.call( - this.agentManager, - conversationId, - ); - if (messages.length === 0) { - return null; - } - - const timestamps = messages.map((message) => message.timestamp); - const recoveredConversation: Conversation = { - id: conversationId, - title: messages.find((message) => message.role === 'user')?.content ?? '', - messages: messages.map((message) => ({ ...message })), - createdAt: Math.min(...timestamps), - updatedAt: Math.max(...timestamps), - }; - await this.conversationStore.upsertConversation(recoveredConversation); - - return recoveredConversation; - } - - private async restoreConversationSnapshot( - snapshot: Conversation | null, - ): Promise { - if (!snapshot) { - return; - } - - const restored = await this.conversationStore.replaceMessages( - snapshot.id, - snapshot.messages, - ); - if (!restored) { - logger.warn( - '[SessionMessageHandler] Failed to restore conversation snapshot; conversation not found:', - snapshot.id, - ); - } - this.updateCurrentConversationId(snapshot.id); - this.sendToWebView({ - type: 'conversationLoaded', - data: snapshot, - }); - } - /** * Monotonically increasing request counter used to tag streamStart/streamEnd * so the WebView can detect and discard stale events from previous requests. @@ -501,7 +401,6 @@ export class SessionMessageHandler extends BaseMessageHandler { endLine?: number; }, attachments?: ImageAttachment[], - editTargetTurnIndex?: number, ): Promise { logger.log('[SessionMessageHandler] handleSendMessage called', { textLength: text.length, @@ -616,144 +515,18 @@ export class SessionMessageHandler extends BaseMessageHandler { return; } - let editRestoreSnapshot: Conversation | null = null; - let editStoreMutationApplied = false; - let editAcpMutationApplied = false; - let editAcpHistorySnapshot: unknown[] | null = null; - - if (editTargetTurnIndex !== undefined) { - if (!Number.isInteger(editTargetTurnIndex) || editTargetTurnIndex < 0) { - const errorMsg = 'Invalid message edit target.'; - logger.error('[SessionMessageHandler]', errorMsg, editTargetTurnIndex); - this.sendToWebView({ - type: 'error', - data: { message: errorMsg }, - }); - return; - } - - if (!this.agentManager.isConnected) { - await this.promptAuth( - 'You need to configure your provider to use Qwen Code.', - ); - return; - } - - if (!this.agentManager.currentSessionId) { - try { - const workspaceFolder = vscode.workspace.workspaceFolders?.[0]; - const workingDir = workspaceFolder?.uri.fsPath || process.cwd(); - await this.agentManager.createNewSession(workingDir); - } catch (createErr) { - logger.error( - '[SessionMessageHandler] Failed to create session before editing message:', - createErr, - ); - const errorMsg = this.getErrorMessage(createErr); - if (this.shouldPromptAuth(createErr)) { - await this.promptAuth( - 'Your session has expired or is invalid. Please configure your provider to continue using Qwen Code.', - ); - return; - } - vscode.window.showErrorMessage( - `Failed to create session: ${errorMsg}`, - ); - return; - } - } - - try { - editRestoreSnapshot = await this.captureConversationSnapshot( - this.currentConversationId, - ); - } catch (error) { - logger.error( - '[SessionMessageHandler] Failed to capture edit restore snapshot:', - error, - ); - const errorMsg = this.getErrorMessage(error); - vscode.window.showErrorMessage(`Failed to edit message: ${errorMsg}`); - this.sendToWebView({ - type: 'error', - data: { message: errorMsg }, - }); - return; - } - - if (!editRestoreSnapshot) { - logger.warn( - '[SessionMessageHandler] Local conversation snapshot missing before edit; continuing with ACP rewind only.', - ); - } - - try { - if (editRestoreSnapshot) { - const truncated = await this.conversationStore.truncateFromUserTurn( - this.currentConversationId, - editTargetTurnIndex, - ); - if (!truncated) { - throw new Error('Conversation not found for edit target.'); - } - editStoreMutationApplied = true; - } - - const rewindResult = - await this.agentManager.rewindSession(editTargetTurnIndex); - editAcpHistorySnapshot = rewindResult?.historyBeforeRewind ?? null; - editAcpMutationApplied = true; - - this.sendToWebView({ - type: 'conversationRewound', - data: { targetTurnIndex: editTargetTurnIndex }, - }); - } catch (error) { - if (editAcpMutationApplied && editAcpHistorySnapshot) { - try { - await this.agentManager.restoreSessionHistory( - editAcpHistorySnapshot, - ); - } catch (restoreError) { - logger.warn( - '[SessionMessageHandler] Failed to restore ACP history after rewind failure:', - restoreError, - ); - } - } - if (editStoreMutationApplied) { - await this.restoreConversationSnapshot(editRestoreSnapshot); - } - const errorMsg = this.getErrorMessage(error); - logger.error( - '[SessionMessageHandler] Failed to rewind session:', - error, - ); - vscode.window.showErrorMessage(`Failed to edit message: ${errorMsg}`); - this.sendToWebView({ - type: 'error', - data: { message: errorMsg }, - }); - return; - } - } - // Check if this is the first message let isFirstMessage = false; - if (editTargetTurnIndex !== undefined) { - isFirstMessage = editTargetTurnIndex === 0; - } else { - try { - const conversation = await this.conversationStore.getConversation( - this.currentConversationId, - ); - isFirstMessage = !conversation || conversation.messages.length === 0; - } catch (error) { - logger.error( - '[SessionMessageHandler] Failed to check conversation:', - error, - ); - } + try { + const conversation = await this.conversationStore.getConversation( + this.currentConversationId, + ); + isFirstMessage = !conversation || conversation.messages.length === 0; + } catch (error) { + logger.error( + '[SessionMessageHandler] Failed to check conversation:', + error, + ); } // Generate title for first message, but only if it hasn't been set yet @@ -786,23 +559,8 @@ export class SessionMessageHandler extends BaseMessageHandler { error, ); - if (editAcpMutationApplied && editAcpHistorySnapshot) { - try { - await this.agentManager.restoreSessionHistory(editAcpHistorySnapshot); - } catch (restoreError) { - logger.warn( - '[SessionMessageHandler] Failed to restore ACP history after user message save failure:', - restoreError, - ); - } - } - - if (editStoreMutationApplied) { - await this.restoreConversationSnapshot(editRestoreSnapshot); - } - const errorMsg = this.getErrorMessage(error); - vscode.window.showErrorMessage(`Failed to edit message: ${errorMsg}`); + vscode.window.showErrorMessage(`Failed to send message: ${errorMsg}`); this.sendToWebView({ type: 'error', data: { message: errorMsg }, @@ -944,21 +702,6 @@ export class SessionMessageHandler extends BaseMessageHandler { } catch (error) { logger.error('[SessionMessageHandler] Error sending message:', error); - if (editAcpMutationApplied && editAcpHistorySnapshot) { - try { - await this.agentManager.restoreSessionHistory(editAcpHistorySnapshot); - } catch (restoreError) { - logger.warn( - '[SessionMessageHandler] Failed to restore ACP history after send failure:', - restoreError, - ); - } - } - - if (editStoreMutationApplied) { - await this.restoreConversationSnapshot(editRestoreSnapshot); - } - const err = error as unknown as Error; // Safely convert error to string const errorMsg = this.getErrorMessage(error); diff --git a/packages/vscode-ide-companion/src/webview/hooks/useMessageSubmit.test.ts b/packages/vscode-ide-companion/src/webview/hooks/useMessageSubmit.test.ts index 684f61816b4..d4a2b07a15f 100644 --- a/packages/vscode-ide-companion/src/webview/hooks/useMessageSubmit.test.ts +++ b/packages/vscode-ide-companion/src/webview/hooks/useMessageSubmit.test.ts @@ -251,31 +251,6 @@ describe('useMessageSubmit', () => { }); }); - it('posts editMessage with targetTurnIndex for edit submissions', () => { - const props = createDefaultProps({ - inputText: 'edited prompt', - editTargetTurnIndex: 2, - }); - const rendered = renderHookHarness(props); - root = rendered.root; - container = rendered.container; - - act(() => { - rendered.api.handleSubmit(createSubmitEvent()); - }); - - expect(props.vscode.postMessage).toHaveBeenCalledWith({ - type: 'editMessage', - data: { - text: 'edited prompt', - context: undefined, - fileContext: undefined, - attachments: undefined, - targetTurnIndex: 2, - }, - }); - }); - it('resolves raw image picker paths with spaces on submit', () => { const imagePath = 'C:\\Users\\Me\\Pictures\\screen shot.png'; const props = createDefaultProps({ diff --git a/packages/vscode-ide-companion/src/webview/hooks/useMessageSubmit.ts b/packages/vscode-ide-companion/src/webview/hooks/useMessageSubmit.ts index f48eb8c277d..af8f53db636 100644 --- a/packages/vscode-ide-companion/src/webview/hooks/useMessageSubmit.ts +++ b/packages/vscode-ide-companion/src/webview/hooks/useMessageSubmit.ts @@ -20,8 +20,6 @@ interface UseMessageSubmitProps { inputFieldRef: React.RefObject; isStreaming: boolean; isWaitingForResponse: boolean; - editTargetTurnIndex?: number | null; - onSubmitted?: () => void; // When true, do NOT auto-attach the active editor file/selection to context skipAutoActiveContext?: boolean; @@ -109,8 +107,6 @@ export const useMessageSubmit = ({ inputFieldRef, isStreaming, isWaitingForResponse, - editTargetTurnIndex = null, - onSubmitted, skipAutoActiveContext = false, fileContext, messageHandling, @@ -224,18 +220,12 @@ export const useMessageSubmit = ({ } vscode.postMessage({ - type: - typeof editTargetTurnIndex === 'number' - ? 'editMessage' - : 'sendMessage', + type: 'sendMessage', data: { text: textToSend, context: context.length > 0 ? context : undefined, fileContext: fileContextForMessage, attachments: attachedImages.length > 0 ? attachedImages : undefined, - ...(typeof editTargetTurnIndex === 'number' - ? { targetTurnIndex: editTargetTurnIndex } - : {}), }, }); @@ -248,7 +238,6 @@ export const useMessageSubmit = ({ if (clearImages) { clearImages(); } - onSubmitted?.(); }, [ inputText, @@ -262,8 +251,6 @@ export const useMessageSubmit = ({ skipAutoActiveContext, isWaitingForResponse, messageHandling, - editTargetTurnIndex, - onSubmitted, ], ); From ebebe4500fb0d50befb5230cc6506e4411528cc8 Mon Sep 17 00:00:00 2001 From: "jinjing.zzj" Date: Sun, 23 Aug 2026 14:10:32 +0800 Subject: [PATCH 16/57] fix(vscode-ide-companion): drop write-only loadingMessage bookkeeping The waiting-message renderer was removed with the WebShell transcript migration and the user prompt is echoed into the timeline at send time (bd09e19d86), so the loadingMessage string was write-only dead state. Keep the isWaitingForResponse flag (submit gating / cancel) and pin its API surface (R1-19 direction b). --- .../src/webview/App.test.tsx | 1 - .../hooks/message/useMessageHandling.test.tsx | 22 +++++++++++++++++++ .../hooks/message/useMessageHandling.ts | 6 +---- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/packages/vscode-ide-companion/src/webview/App.test.tsx b/packages/vscode-ide-companion/src/webview/App.test.tsx index 8b00e97ae65..5d174571e95 100644 --- a/packages/vscode-ide-companion/src/webview/App.test.tsx +++ b/packages/vscode-ide-companion/src/webview/App.test.tsx @@ -120,7 +120,6 @@ vi.mock('./hooks/message/useMessageHandling.js', () => ({ messages: mockMessages, isStreaming: mockMessageState.isStreaming, isWaitingForResponse: mockMessageState.isWaitingForResponse, - loadingMessage: null, addMessage: mockAddMessage, endStreaming: mockEndStreaming, setWaitingForResponse: vi.fn(), diff --git a/packages/vscode-ide-companion/src/webview/hooks/message/useMessageHandling.test.tsx b/packages/vscode-ide-companion/src/webview/hooks/message/useMessageHandling.test.tsx index 6e2182c846a..2a3b2427357 100644 --- a/packages/vscode-ide-companion/src/webview/hooks/message/useMessageHandling.test.tsx +++ b/packages/vscode-ide-companion/src/webview/hooks/message/useMessageHandling.test.tsx @@ -85,6 +85,28 @@ describe('useMessageHandling', () => { } }); + it('toggles the waiting flag without exposing write-only loading text', () => { + const rendered = renderHookHarness(); + root = rendered.root; + container = rendered.container; + + expect(rendered.api.isWaitingForResponse).toBe(false); + // The waiting-message renderer was removed with the WebShell transcript + // migration; only the boolean flag (submit gating / cancel) may survive. + expect(rendered.api).not.toHaveProperty('loadingMessage'); + + act(() => { + rendered.api.setWaitingForResponse('Loading hint'); + }); + expect(rendered.api.isWaitingForResponse).toBe(true); + expect(rendered.api).not.toHaveProperty('loadingMessage'); + + act(() => { + rendered.api.clearWaitingForResponse(); + }); + expect(rendered.api.isWaitingForResponse).toBe(false); + }); + it('assigns the second assistant segment a newer timestamp so a tool call can sort between the two segments', () => { vi.useFakeTimers(); vi.setSystemTime(1_000); diff --git a/packages/vscode-ide-companion/src/webview/hooks/message/useMessageHandling.ts b/packages/vscode-ide-companion/src/webview/hooks/message/useMessageHandling.ts index 855afa81180..c8af16a6544 100644 --- a/packages/vscode-ide-companion/src/webview/hooks/message/useMessageHandling.ts +++ b/packages/vscode-ide-companion/src/webview/hooks/message/useMessageHandling.ts @@ -38,7 +38,6 @@ export const useMessageHandling = () => { const [messages, setMessages] = useState([]); const [isStreaming, setIsStreaming] = useState(false); const [isWaitingForResponse, setIsWaitingForResponse] = useState(false); - const [loadingMessage, setLoadingMessage] = useState(''); // Track the index of the assistant placeholder message during streaming const streamingMessageIndexRef = useRef(null); // Track the index of the current aggregated thinking message @@ -142,9 +141,8 @@ export const useMessageHandling = () => { /** * Set waiting for response state */ - const setWaitingForResponse = useCallback((message: string) => { + const setWaitingForResponse = useCallback(() => { setIsWaitingForResponse(true); - setLoadingMessage(message); }, []); /** @@ -152,7 +150,6 @@ export const useMessageHandling = () => { */ const clearWaitingForResponse = useCallback(() => { setIsWaitingForResponse(false); - setLoadingMessage(''); }, []); return { @@ -160,7 +157,6 @@ export const useMessageHandling = () => { messages, isStreaming, isWaitingForResponse, - loadingMessage, // Operations addMessage, From af938d6a15f2d1d91fc49afcb521bdbed31cb581 Mon Sep 17 00:00:00 2001 From: "jinjing.zzj" Date: Sun, 23 Aug 2026 14:11:33 +0800 Subject: [PATCH 17/57] fix(vscode-ide-companion): align waiting-flag pin test with the argument-less setter --- .../src/webview/hooks/message/useMessageHandling.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vscode-ide-companion/src/webview/hooks/message/useMessageHandling.test.tsx b/packages/vscode-ide-companion/src/webview/hooks/message/useMessageHandling.test.tsx index 2a3b2427357..85a89c29543 100644 --- a/packages/vscode-ide-companion/src/webview/hooks/message/useMessageHandling.test.tsx +++ b/packages/vscode-ide-companion/src/webview/hooks/message/useMessageHandling.test.tsx @@ -96,7 +96,7 @@ describe('useMessageHandling', () => { expect(rendered.api).not.toHaveProperty('loadingMessage'); act(() => { - rendered.api.setWaitingForResponse('Loading hint'); + rendered.api.setWaitingForResponse(); }); expect(rendered.api.isWaitingForResponse).toBe(true); expect(rendered.api).not.toHaveProperty('loadingMessage'); From 4aef24f361860de1e44c9495bbbc1ff523cc562e Mon Sep 17 00:00:00 2001 From: "jinjing.zzj" Date: Sun, 23 Aug 2026 17:18:29 +0800 Subject: [PATCH 18/57] fix(vscode-ide-companion): echo attached images into the transcript timeline The prompt carries pasted/attached images as ACP resource_link blocks, which the transcript reducer cannot render (no inline data), so user images vanished from the timeline while the attach path stayed alive. Read each saved prompt image back from disk and echo it alongside the text echo as an inline user_message_chunk image part (the daemon-echo content shape), which the shared reducer folds into the user block and the WebShell renderer already displays. Unreadable images are skipped without breaking the send. --- .../handlers/SessionMessageHandler.test.ts | 159 ++++++++++++++++++ .../webview/handlers/SessionMessageHandler.ts | 51 ++++++ 2 files changed, 210 insertions(+) diff --git a/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.test.ts b/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.test.ts index a8be91e3bd0..629d0ca5998 100644 --- a/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.test.ts +++ b/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.test.ts @@ -11,15 +11,22 @@ const { mockProcessImageAttachments, mockShowErrorMessage, mockExportSessionToFile, + mockReadFile, } = vi.hoisted(() => ({ mockProcessImageAttachments: vi.fn(), mockShowErrorMessage: vi.fn(), mockExportSessionToFile: vi.fn(), + mockReadFile: vi.fn(), })); const { mockExecuteCommand } = vi.hoisted(() => ({ mockExecuteCommand: vi.fn(), })); +vi.mock('fs/promises', () => ({ + readFile: mockReadFile, + default: { readFile: mockReadFile }, +})); + vi.mock('vscode', () => ({ window: { showWarningMessage: vi.fn(), @@ -296,6 +303,158 @@ describe('SessionMessageHandler', () => { ); }); + it('echoes attached prompt images into the transcript as inline image chunks', async () => { + mockProcessImageAttachments.mockResolvedValue({ + formattedText: 'look at this\n\n@/tmp/clipboard/clipboard-1.png', + displayText: 'look at this\n\n@/tmp/clipboard/clipboard-1.png', + savedImageCount: 1, + promptImages: [ + { + path: '/tmp/clipboard/clipboard-1.png', + name: 'pasted_image.png', + mimeType: 'image/png', + }, + ], + }); + mockReadFile.mockResolvedValue(Buffer.from([1, 2, 3])); + + const agentManager = { + isConnected: true, + currentSessionId: 'session-1', + sendMessage: vi.fn().mockResolvedValue(undefined), + }; + const conversationStore = { + createConversation: vi.fn().mockResolvedValue({ id: 'conversation-1' }), + getConversation: vi.fn().mockResolvedValue(null), + addMessage: vi.fn(), + renameConversationId: vi.fn().mockResolvedValue(true), + }; + const sendToWebView = vi.fn(); + + const handler = new SessionMessageHandler( + agentManager as never, + conversationStore as never, + null, + sendToWebView, + ); + + await handler.handle({ + type: 'sendMessage', + data: { + text: 'look at this', + attachments: [ + { + id: 'img-1', + name: 'pasted_image.png', + type: 'image/png', + size: 3, + data: 'data:image/png;base64,AQID', + timestamp: Date.now(), + }, + ], + }, + }); + + // The prompt itself still carries the image as a resource_link block, + // but the transcript echo must carry inline data the reducer can render. + expect(mockReadFile).toHaveBeenCalledWith('/tmp/clipboard/clipboard-1.png'); + expect(sendToWebView).toHaveBeenCalledWith({ + type: 'transcriptUpdate', + data: { + sessionId: 'session-1', + update: { + sessionUpdate: 'user_message_chunk', + content: { + type: 'image', + data: Buffer.from([1, 2, 3]).toString('base64'), + mimeType: 'image/png', + }, + }, + }, + }); + // Image echoes land before the prompt is dispatched, mirroring the text + // echo, so the user turn renders complete ahead of assistant frames. + const imageEchoCallIndex = sendToWebView.mock.calls.findIndex( + (call) => + ( + (call[0] as { type?: string; data?: unknown } | undefined)?.data as + | { update?: { content?: { type?: string } } } + | undefined + )?.update?.content?.type === 'image', + ); + expect(imageEchoCallIndex).toBeGreaterThanOrEqual(0); + expect( + sendToWebView.mock.invocationCallOrder[imageEchoCallIndex], + ).toBeLessThan(agentManager.sendMessage.mock.invocationCallOrder[0]); + }); + + it('keeps the send flowing when a prompt image cannot be read back for the echo', async () => { + mockProcessImageAttachments.mockResolvedValue({ + formattedText: 'look at this\n\n@/tmp/clipboard/clipboard-1.png', + displayText: 'look at this\n\n@/tmp/clipboard/clipboard-1.png', + savedImageCount: 1, + promptImages: [ + { + path: '/tmp/clipboard/clipboard-1.png', + name: 'pasted_image.png', + mimeType: 'image/png', + }, + ], + }); + mockReadFile.mockRejectedValue(Object.assign(new Error('ENOENT'), {})); + + const agentManager = { + isConnected: true, + currentSessionId: 'session-1', + sendMessage: vi.fn().mockResolvedValue(undefined), + }; + const conversationStore = { + createConversation: vi.fn().mockResolvedValue({ id: 'conversation-1' }), + getConversation: vi.fn().mockResolvedValue(null), + addMessage: vi.fn(), + renameConversationId: vi.fn().mockResolvedValue(true), + }; + const sendToWebView = vi.fn(); + + const handler = new SessionMessageHandler( + agentManager as never, + conversationStore as never, + null, + sendToWebView, + ); + + await handler.handle({ + type: 'sendMessage', + data: { text: 'look at this' }, + }); + + // The unreadable image is skipped (no image chunk) but the text echo and + // the prompt itself still go through. + const imageEchoCallIndex = sendToWebView.mock.calls.findIndex( + (call) => + ( + (call[0] as { type?: string; data?: unknown } | undefined)?.data as + | { update?: { content?: { type?: string } } } + | undefined + )?.update?.content?.type === 'image', + ); + expect(imageEchoCallIndex).toBe(-1); + expect(sendToWebView).toHaveBeenCalledWith({ + type: 'transcriptUpdate', + data: { + sessionId: 'session-1', + update: { + sessionUpdate: 'user_message_chunk', + content: { + type: 'text', + text: 'look at this\n\n@/tmp/clipboard/clipboard-1.png', + }, + }, + }, + }); + expect(agentManager.sendMessage).toHaveBeenCalledTimes(1); + }); + it('sends image file context as prompt image blocks', async () => { mockProcessImageAttachments.mockImplementation( async (promptText: string) => ({ diff --git a/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.ts b/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.ts index b391305f861..195ab7e354e 100644 --- a/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.ts +++ b/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.ts @@ -7,6 +7,7 @@ import { logger } from '../../utils/logger.js'; import * as vscode from 'vscode'; import { pathToFileURL } from 'node:url'; +import * as fsp from 'fs/promises'; import { BaseMessageHandler } from './BaseMessageHandler.js'; import type { ChatMessage } from '../../services/qwenAgentManager.js'; import { @@ -650,6 +651,33 @@ export class SessionMessageHandler extends BaseMessageHandler { }, }); } + // The prompt carries attached images as ACP `resource_link` blocks, + // which the transcript reducer cannot render (no inline data). Echo + // each saved image back as an inline `user_message_chunk` image part + // (the daemon-echo content shape) so pasted/attached pictures render + // in the WebShell transcript timeline alongside the prompt text. + if (transcriptEchoSessionId && promptImages.length > 0) { + for (const image of promptImages) { + const imageData = await this.readPromptImageAsBase64(image.path); + if (imageData === null) { + continue; + } + this.sendToWebView({ + type: 'transcriptUpdate', + data: { + sessionId: transcriptEchoSessionId, + update: { + sessionUpdate: 'user_message_chunk', + content: { + type: 'image', + data: imageData, + mimeType: image.mimeType, + }, + }, + }, + }); + } + } await this.agentManager.sendMessage( buildPromptBlocks(promptText, promptImages), @@ -775,6 +803,29 @@ export class SessionMessageHandler extends BaseMessageHandler { } } + /** + * Read a saved prompt image back from disk as base64 so the transcript + * echo can carry it as inline data (the ACP `resource_link` form used in + * the prompt has no inline payload the transcript reducer can render). + * Returns `null` when the file is unreadable so the echo degrades to the + * text-only turn instead of failing the send. + */ + private async readPromptImageAsBase64( + imagePath: string, + ): Promise { + try { + const buffer = await fsp.readFile(imagePath); + return buffer.toString('base64'); + } catch (error) { + logger.warn( + '[SessionMessageHandler] Failed to read image for transcript echo:', + imagePath, + error, + ); + return null; + } + } + /** * Handle new Qwen session request */ From fd1a807400b19efa7a1de27b25d03aebf91ee5cf Mon Sep 17 00:00:00 2001 From: "jinjing.zzj" Date: Sun, 23 Aug 2026 17:21:01 +0800 Subject: [PATCH 19/57] fix(vscode-ide-companion): track live VS Code theme for the transcript webShellTheme was snapshotted once at mount via useMemo with an empty dependency array, so switching the VS Code color theme left the timeline on the stale theme (VS Code updates data-vscode-theme-kind on in place without reloading the webview). Hold the theme in state and refresh it with a MutationObserver on the body theme attributes. --- .../src/webview/App.test.tsx | 29 +++++++++++++++++++ .../vscode-ide-companion/src/webview/App.tsx | 25 ++++++++++++++-- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/packages/vscode-ide-companion/src/webview/App.test.tsx b/packages/vscode-ide-companion/src/webview/App.test.tsx index 5d174571e95..5a29993ef35 100644 --- a/packages/vscode-ide-companion/src/webview/App.test.tsx +++ b/packages/vscode-ide-companion/src/webview/App.test.tsx @@ -1003,4 +1003,33 @@ describe('App /skills secondary picker', () => { '--web-shell-bottom-panel-inset': '140px', }); }); + + it('tracks live VS Code color-theme changes on the transcript theme prop', async () => { + mockMessageState.isStreaming = true; + resetWebShellTranscriptProps(); + document.body.setAttribute('data-vscode-theme-kind', 'vscode-dark'); + + try { + const rendered = renderApp(); + root = rendered.root; + container = rendered.container; + + await act(async () => {}); + + expect(mockWebShellTranscriptProps.current).not.toBeNull(); + expect(mockWebShellTranscriptProps.current!.theme).toBe('dark'); + + // VS Code applies a color-theme change to an open webview in place by + // updating the body attribute (no reload); the transcript theme must + // follow instead of staying on the mount-time snapshot. + await act(async () => { + document.body.setAttribute('data-vscode-theme-kind', 'vscode-light'); + await Promise.resolve(); + }); + + expect(mockWebShellTranscriptProps.current!.theme).toBe('light'); + } finally { + document.body.removeAttribute('data-vscode-theme-kind'); + } + }); }); diff --git a/packages/vscode-ide-companion/src/webview/App.tsx b/packages/vscode-ide-companion/src/webview/App.tsx index 318e5aa9669..3e335a1c29c 100644 --- a/packages/vscode-ide-companion/src/webview/App.tsx +++ b/packages/vscode-ide-companion/src/webview/App.tsx @@ -74,6 +74,12 @@ const WebShellTranscriptLazy = React.lazy(() => })), ); +/** Map VS Code's body theme attribute onto the transcript's dark/light prop. */ +function readVSCodeWebviewTheme(): 'dark' | 'light' { + const kind = document.body.getAttribute('data-vscode-theme-kind') ?? ''; + return kind.includes('light') ? 'light' : 'dark'; +} + export const App: React.FC = () => { const vscode = useVSCode(); @@ -855,9 +861,22 @@ export const App: React.FC = () => { }); }, [insightReportPath, vscode]); - const webShellTheme = useMemo<'dark' | 'light'>(() => { - const kind = document.body.getAttribute('data-vscode-theme-kind') ?? ''; - return kind.includes('light') ? 'light' : 'dark'; + // VS Code applies color-theme changes to an open webview in place + // (updating data-vscode-theme-kind on without reloading it), and + // the panel keeps its context while hidden, so a mount-time snapshot + // would go stale. Track the live value via a body-attribute observer. + const [webShellTheme, setWebShellTheme] = useState<'dark' | 'light'>( + readVSCodeWebviewTheme, + ); + useEffect(() => { + const observer = new MutationObserver(() => { + setWebShellTheme(readVSCodeWebviewTheme()); + }); + observer.observe(document.body, { + attributes: true, + attributeFilter: ['data-vscode-theme-kind', 'class'], + }); + return () => observer.disconnect(); }, []); const transcriptBlocks = useAcpTranscript(); From 39d6f24b642e564a264368b4f9ccdda310ace17b Mon Sep 17 00:00:00 2001 From: "jinjing.zzj" Date: Sun, 23 Aug 2026 18:05:17 +0800 Subject: [PATCH 20/57] fix(vscode-ide-companion): copy every transcript block kind and map ambiguous row keys - Copy All Messages now includes tool, shell, user_shell, and status blocks via getBlockCopyText, matching the pre-PR copyAllMessages handler which included formatted tool calls (review 5001842059 S-1). - findBlockByRowKey prefers an exact id match and otherwise the longest matching block id, so one block id that dash-prefixes a sibling (e.g. `a` vs `a-1`) can no longer capture the sibling's row key (S-4). --- .../src/webview/utils/copyTranscript.test.ts | 99 ++++++++++++++++++- .../src/webview/utils/copyTranscript.ts | 43 +++++++- 2 files changed, 134 insertions(+), 8 deletions(-) diff --git a/packages/vscode-ide-companion/src/webview/utils/copyTranscript.test.ts b/packages/vscode-ide-companion/src/webview/utils/copyTranscript.test.ts index 85171d6fa09..e085c20416d 100644 --- a/packages/vscode-ide-companion/src/webview/utils/copyTranscript.test.ts +++ b/packages/vscode-ide-companion/src/webview/utils/copyTranscript.test.ts @@ -26,7 +26,12 @@ function textBlock(kind: TextKind, id: string, text: string) { } satisfies DaemonTranscriptBlock; } -function toolBlock(id: string, title: string, details?: string) { +function toolBlock( + id: string, + title: string, + details?: string, + toolKind?: string, +) { return { kind: 'tool', id, @@ -35,6 +40,41 @@ function toolBlock(id: string, title: string, details?: string) { status: 'completed', preview: { kind: 'generic', summary: '' }, details, + toolKind, + clientReceivedAt: 0, + createdAt: 0, + updatedAt: 0, + } satisfies DaemonTranscriptBlock; +} + +function shellBlock(id: string, text: string) { + return { + kind: 'shell', + id, + text, + clientReceivedAt: 0, + createdAt: 0, + updatedAt: 0, + } satisfies DaemonTranscriptBlock; +} + +function userShellBlock(id: string, command: string, text: string) { + return { + kind: 'user_shell', + id, + command, + text, + clientReceivedAt: 0, + createdAt: 0, + updatedAt: 0, + } satisfies DaemonTranscriptBlock; +} + +function statusBlock(id: string, text: string) { + return { + kind: 'status', + id, + text, clientReceivedAt: 0, createdAt: 0, updatedAt: 0, @@ -61,18 +101,50 @@ describe('getBlockCopyText', () => { }); describe('formatBlocksForCopyAll', () => { - it('labels conversation blocks like the pre-PR timeline and skips others', () => { + it('labels conversation blocks like the pre-PR timeline, including tool and shell output', () => { const blocks = [ textBlock('user', 'u-1', 'question'), - toolBlock('t-1', 'Ran ls'), + toolBlock('t-1', 'Ran ls', '2 files', 'execute'), + shellBlock('s-1', 'agent shell output'), + userShellBlock('us-1', 'ls -la', 'user shell output'), + statusBlock('st-1', 'Compacting context'), textBlock('thought', 'th-1', 'pondering'), textBlock('assistant', 'a-1', 'answer'), ]; expect(formatBlocksForCopyAll(blocks)).toBe( - '**User:** question\n\n---\n\n**Thinking:** pondering\n\n---\n\n**Qwen Code:** answer', + [ + '**User:** question', + '**[Tool: execute]**\n\nRan ls\n2 files', + '**Shell:** agent shell output', + '**User Shell:** ls -la\nuser shell output', + '**Status:** Compacting context', + '**Thinking:** pondering', + '**Qwen Code:** answer', + ].join('\n\n---\n\n'), ); }); + it('falls back to the tool name or a generic label when no tool kind is set', () => { + const namedTool: DaemonTranscriptBlock = { + ...toolBlock('t-1', 'Read file'), + toolName: 'read_file', + }; + const blocks = [namedTool, toolBlock('t-2', 'Did work')]; + expect(formatBlocksForCopyAll(blocks)).toBe( + '**[Tool: read_file]**\n\nRead file\n\n---\n\n**[Tool: tool]**\n\nDid work', + ); + }); + + it('skips tool, shell, and status blocks without copyable text', () => { + const blocks = [ + toolBlock('t-1', ' '), + shellBlock('s-1', ' '), + statusBlock('st-1', ''), + textBlock('assistant', 'a-1', 'answer'), + ]; + expect(formatBlocksForCopyAll(blocks)).toBe('**Qwen Code:** answer'); + }); + it('returns an empty string when there is nothing to copy', () => { expect(formatBlocksForCopyAll([])).toBe(''); }); @@ -117,4 +189,23 @@ describe('findBlockByRowKey', () => { it('does not match across block id prefixes', () => { expect(findBlockByRowKey(blocks, 'msg:a-10')).toBeNull(); }); + + it('prefers the exact block when one id dash-prefixes a sibling id', () => { + const ambiguous = [ + textBlock('user', 'a', 'first'), + textBlock('assistant', 'a-1', 'second'), + ]; + expect(findBlockByRowKey(ambiguous, 'msg:a-1')).toBe(ambiguous[1]); + expect(findBlockByRowKey(ambiguous, 'msg:a')).toBe(ambiguous[0]); + }); + + it('matches projection suffixes against the longest block id, not the first', () => { + const ambiguous = [ + textBlock('user', 'a', 'first'), + textBlock('assistant', 'a-1', 'second'), + ]; + expect(findBlockByRowKey(ambiguous, 'msg:a-1-ip')).toBe(ambiguous[1]); + expect(findBlockByRowKey(ambiguous, 'msg:a-1-t-2')).toBe(ambiguous[1]); + expect(findBlockByRowKey(ambiguous, 'msg:a-ip')).toBe(ambiguous[0]); + }); }); diff --git a/packages/vscode-ide-companion/src/webview/utils/copyTranscript.ts b/packages/vscode-ide-companion/src/webview/utils/copyTranscript.ts index a0192e8a4b7..ef19f8ea30c 100644 --- a/packages/vscode-ide-companion/src/webview/utils/copyTranscript.ts +++ b/packages/vscode-ide-companion/src/webview/utils/copyTranscript.ts @@ -57,13 +57,38 @@ export function getBlockCopyText(block: DaemonTranscriptBlock): string | null { /** * Conversation-formatted copy of all message blocks (the "Copy All Messages" - * command). Labels match the pre-PR timeline output. + * command). Labels match the pre-PR timeline output, which included tool + * call details alongside the text messages; shell output and status notices + * are copied through the same `getBlockCopyText` helper so the transcript + * timeline's extra block kinds are not silently dropped. */ export function formatBlocksForCopyAll( blocks: readonly DaemonTranscriptBlock[], ): string { const parts: string[] = []; for (const block of blocks) { + if ( + block.kind === 'tool' || + block.kind === 'shell' || + block.kind === 'user_shell' || + block.kind === 'status' + ) { + const content = getBlockCopyText(block); + if (!content) { + continue; + } + if (block.kind === 'tool') { + const label = block.toolKind ?? block.toolName ?? 'tool'; + parts.push(`**[Tool: ${label}]**\n\n${content}`); + } else if (block.kind === 'status') { + parts.push(`**Status:** ${content}`); + } else if (block.kind === 'user_shell') { + parts.push(`**User Shell:** ${content}`); + } else { + parts.push(`**Shell:** ${content}`); + } + continue; + } if ( block.kind !== 'user' && block.kind !== 'assistant' && @@ -102,7 +127,10 @@ export function findLastAssistantText( /** * Map a captured `data-message-row-key` value to its transcript block. * MessageList keys message rows as `msg:`; the message id is the - * block id, optionally with a projection suffix (e.g. `-ip`, `-t-2`). + * block id, optionally with a projection suffix (e.g. `-ip`, `-t-2`). An + * exact id match always wins; among projection prefixes the longest block id + * matches, so one block's id can never shadow a sibling whose id extends it + * (e.g. block `a` must not capture keys belonging to block `a-1`). */ export function findBlockByRowKey( blocks: readonly DaemonTranscriptBlock[], @@ -112,10 +140,17 @@ export function findBlockByRowKey( return null; } const messageKey = rowKey.slice('msg:'.length); + let best: DaemonTranscriptBlock | null = null; for (const block of blocks) { - if (messageKey === block.id || messageKey.startsWith(`${block.id}-`)) { + if (messageKey === block.id) { return block; } + if ( + messageKey.startsWith(`${block.id}-`) && + (best === null || block.id.length > best.id.length) + ) { + best = block; + } } - return null; + return best; } From acc290f1b590b27849dc90673f0deabcc7122c77 Mon Sep 17 00:00:00 2001 From: "jinjing.zzj" Date: Sun, 23 Aug 2026 18:05:27 +0800 Subject: [PATCH 21/57] fix(vscode-ide-companion): drop whitespace-only cached transcript rows cachedMessageToNotification rejected empty strings but admitted whitespace-only content, which the reducer turns into an empty block when seeding history from cached rows. Reject content that trims to nothing (review 5001842059 S-2). --- .../adapters/acpTranscriptAdapter.test.ts | 38 ++++++++++++++++++- .../webview/adapters/acpTranscriptAdapter.ts | 5 ++- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/packages/vscode-ide-companion/src/webview/adapters/acpTranscriptAdapter.test.ts b/packages/vscode-ide-companion/src/webview/adapters/acpTranscriptAdapter.test.ts index 15b1e9962c5..87d8731649d 100644 --- a/packages/vscode-ide-companion/src/webview/adapters/acpTranscriptAdapter.test.ts +++ b/packages/vscode-ide-companion/src/webview/adapters/acpTranscriptAdapter.test.ts @@ -10,7 +10,10 @@ import { selectTranscriptBlocks, } from '@qwen-code/sdk/daemon'; import { describe, expect, it } from 'vitest'; -import { reduceSessionNotification } from './acpTranscriptAdapter.js'; +import { + cachedMessageToNotification, + reduceSessionNotification, +} from './acpTranscriptAdapter.js'; function userTextNotification(text: string): SessionNotification { return { @@ -44,3 +47,36 @@ describe('reduceSessionNotification', () => { expect(blocks[0]).toMatchObject({ kind: 'user', text: 'hello world' }); }); }); + +describe('cachedMessageToNotification', () => { + it('converts a cached row with renderable text into a notification', () => { + expect( + cachedMessageToNotification( + { role: 'user', content: 'hello' }, + 'session-1', + ), + ).toEqual({ + sessionId: 'session-1', + update: { + sessionUpdate: 'user_message_chunk', + content: { type: 'text', text: 'hello' }, + }, + }); + }); + + it('returns null for whitespace-only content instead of an empty block', () => { + expect( + cachedMessageToNotification({ role: 'user', content: ' ' }, 's'), + ).toBeNull(); + expect( + cachedMessageToNotification({ role: 'assistant', content: '\n\t ' }, 's'), + ).toBeNull(); + }); + + it('returns null for empty, missing, or non-string content', () => { + expect( + cachedMessageToNotification({ role: 'user', content: '' }, 's'), + ).toBeNull(); + expect(cachedMessageToNotification({ role: 'user' }, 's')).toBeNull(); + }); +}); diff --git a/packages/vscode-ide-companion/src/webview/adapters/acpTranscriptAdapter.ts b/packages/vscode-ide-companion/src/webview/adapters/acpTranscriptAdapter.ts index e7cf7778fb6..56d2dbb099f 100644 --- a/packages/vscode-ide-companion/src/webview/adapters/acpTranscriptAdapter.ts +++ b/packages/vscode-ide-companion/src/webview/adapters/acpTranscriptAdapter.ts @@ -45,7 +45,10 @@ export function cachedMessageToNotification( message: CachedTranscriptMessage, sessionId: string, ): SessionNotification | null { - if (typeof message?.content !== 'string' || message.content.length === 0) { + if ( + typeof message?.content !== 'string' || + message.content.trim().length === 0 + ) { return null; } const content = { type: 'text' as const, text: message.content }; From 0ed655cd6fbb9976eafb51162a073fec23f6783c Mon Sep 17 00:00:00 2001 From: "jinjing.zzj" Date: Sun, 23 Aug 2026 18:33:56 +0800 Subject: [PATCH 22/57] fix(vscode-ide-companion): ship missing third-party notices in NOTICES.txt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Extend generate-notices.js so the regenerated NOTICES.txt carries the attribution texts it previously only pointed at or dropped: - Append license files from a package's licenses/ directory (echarts' Apache LICENSE references licenses/LICENSE-d3 for its embedded d3-derived files; the BSD-3-Clause text is now shipped). - Append a package's NOTICE file when present (Apache-2.0 §4(d)), covering echarts' Apache Software Foundation attribution. - Accept string-form package.json repository values (full URLs and GitHub shorthand) instead of emitting "(No repository found)". - Fall back to the standard MIT text (copyright holder from package.json metadata) for MIT-declared packages that ship no license file. --- packages/vscode-ide-companion/NOTICES.txt | 1420 +++++++++++++---- .../scripts/generate-notices.js | 246 ++- .../scripts/generate-notices.test.js | 174 +- 3 files changed, 1489 insertions(+), 351 deletions(-) diff --git a/packages/vscode-ide-companion/NOTICES.txt b/packages/vscode-ide-companion/NOTICES.txt index 27f3a6a4b9b..ae2eeb253ea 100644 --- a/packages/vscode-ide-companion/NOTICES.txt +++ b/packages/vscode-ide-companion/NOTICES.txt @@ -199,7 +199,7 @@ This file contains third-party software notices and license terms. ============================================================ @anthropic-ai/sdk@0.36.3 -(No repository found) +(https://github.com/anthropics/anthropic-sdk-typescript) Copyright 2023 Anthropic, PBC. @@ -242,7 +242,27 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI undici-types@5.26.5 (git+https://github.com/nodejs/undici.git) -License text not found. +Standard MIT license text (package declares MIT but ships no license file; copyright holder from package.json metadata). + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF OTHER DEALINGS IN THE +SOFTWARE. ============================================================ @types/node-fetch@2.6.13 @@ -806,7 +826,7 @@ SOFTWARE. ============================================================ mime-types@2.1.35 -(No repository found) +(https://github.com/jshttp/mime-types) (The MIT License) @@ -835,7 +855,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ mime-db@1.54.0 -(No repository found) +(https://github.com/jshttp/mime-db) (The MIT License) @@ -971,7 +991,7 @@ THE SOFTWARE. ============================================================ ms@2.1.3 -(No repository found) +(https://github.com/vercel/ms) The MIT License (MIT) @@ -998,7 +1018,7 @@ SOFTWARE. ============================================================ form-data-encoder@1.7.2 -(No repository found) +(https://github.com/octet-stream/form-data-encoder) The MIT License (MIT) @@ -1025,7 +1045,7 @@ SOFTWARE. ============================================================ formdata-node@4.4.1 -(No repository found) +(https://github.com/octet-stream/form-data) The MIT License (MIT) @@ -1135,7 +1155,7 @@ SOFTWARE. ============================================================ whatwg-url@5.0.0 -(No repository found) +(https://github.com/jsdom/whatwg-url) The MIT License (MIT) @@ -1164,11 +1184,33 @@ THE SOFTWARE. tr46@0.0.3 (git+https://github.com/Sebmaster/tr46.js.git) -License text not found. +Standard MIT license text (package declares MIT but ships no license file; copyright holder from package.json metadata). + +Copyright (c) Sebastian Mayr + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF OTHER DEALINGS IN THE +SOFTWARE. ============================================================ webidl-conversions@3.0.1 -(No repository found) +(https://github.com/jsdom/webidl-conversions) # The BSD 2-Clause License @@ -2210,11 +2252,33 @@ SOFTWARE. data-uri-to-buffer@4.0.1 (git://github.com/TooTallNate/node-data-uri-to-buffer.git) -License text not found. +Standard MIT license text (package declares MIT but ships no license file; copyright holder from package.json metadata). + +Copyright (c) Nathan Rajlich + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF OTHER DEALINGS IN THE +SOFTWARE. ============================================================ fetch-blob@3.2.0 -(No repository found) +(https://github.com/node-fetch/fetch-blob.git) MIT License @@ -2816,7 +2880,7 @@ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEAL ============================================================ buffer-equal-constant-time@1.0.1 -(No repository found) +(https://github.com/goinstant/buffer-equal-constant-time.git) Copyright (c) 2013, GoInstant Inc., a salesforce.com company All rights reserved. @@ -2834,7 +2898,7 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ============================================================ p-retry@4.6.2 -(No repository found) +(https://github.com/sindresorhus/p-retry) MIT License @@ -2903,7 +2967,7 @@ Felix Geisendörfer (felix@debuggable.com) ============================================================ protobufjs@7.6.5 -(No repository found) +(https://github.com/protobufjs/protobuf.js) This license applies to all parts of protobuf.js except those files either explicitly including or referencing a different license or @@ -3988,7 +4052,7 @@ THE SOFTWARE. ============================================================ path-key@3.1.1 -(No repository found) +(https://github.com/sindresorhus/path-key) MIT License @@ -4003,7 +4067,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ============================================================ shebang-command@2.0.0 -(No repository found) +(https://github.com/kevva/shebang-command) MIT License @@ -4018,7 +4082,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ============================================================ shebang-regex@3.0.0 -(No repository found) +(https://github.com/sindresorhus/shebang-regex) MIT License @@ -4130,7 +4194,7 @@ SOFTWARE. ============================================================ jose@6.1.3 -(No repository found) +(https://github.com/panva/jose) The MIT License (MIT) @@ -4238,7 +4302,7 @@ SOFTWARE. ============================================================ ajv@8.20.0 -(No repository found) +(https://github.com/ajv-validator/ajv) The MIT License (MIT) @@ -4355,7 +4419,7 @@ SOFTWARE. ============================================================ require-from-string@2.0.2 -(No repository found) +(https://github.com/floatdrop/require-from-string) The MIT License (MIT) @@ -4409,7 +4473,7 @@ SOFTWARE. ============================================================ content-type@1.0.5 -(No repository found) +(https://github.com/jshttp/content-type) (The MIT License) @@ -4437,7 +4501,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ cors@2.8.5 -(No repository found) +(https://github.com/expressjs/cors) (The MIT License) @@ -4465,7 +4529,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ object-assign@4.1.1 -(No repository found) +(https://github.com/sindresorhus/object-assign) The MIT License (MIT) @@ -4492,7 +4556,7 @@ THE SOFTWARE. ============================================================ vary@1.1.2 -(No repository found) +(https://github.com/jshttp/vary) (The MIT License) @@ -4520,7 +4584,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ express@5.2.1 -(No repository found) +(https://github.com/expressjs/express) (The MIT License) @@ -4550,7 +4614,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ accepts@2.0.0 -(No repository found) +(https://github.com/jshttp/accepts) (The MIT License) @@ -4579,7 +4643,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ mime-types@3.0.2 -(No repository found) +(https://github.com/jshttp/mime-types) (The MIT License) @@ -4608,7 +4672,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ negotiator@1.0.0 -(No repository found) +(https://github.com/jshttp/negotiator) (The MIT License) @@ -4638,7 +4702,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ body-parser@2.3.0 -(No repository found) +(https://github.com/expressjs/body-parser) (The MIT License) @@ -4667,7 +4731,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ bytes@3.1.2 -(No repository found) +(https://github.com/visionmedia/bytes.js) (The MIT License) @@ -4696,7 +4760,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ content-type@2.0.0 -(No repository found) +(https://github.com/jshttp/content-type) (The MIT License) @@ -4724,7 +4788,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ http-errors@2.0.1 -(No repository found) +(https://github.com/jshttp/http-errors) The MIT License (MIT) @@ -4753,7 +4817,7 @@ THE SOFTWARE. ============================================================ depd@2.0.0 -(No repository found) +(https://github.com/dougwilson/nodejs-depd) (The MIT License) @@ -4781,7 +4845,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ inherits@2.0.4 -(No repository found) +(https://github.com/isaacs/inherits) The ISC License @@ -4822,7 +4886,7 @@ CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ============================================================ statuses@2.0.2 -(No repository found) +(https://github.com/jshttp/statuses) The MIT License (MIT) @@ -4851,7 +4915,7 @@ THE SOFTWARE. ============================================================ toidentifier@1.0.1 -(No repository found) +(https://github.com/component/toidentifier) MIT License @@ -4932,7 +4996,7 @@ SOFTWARE. ============================================================ on-finished@2.4.1 -(No repository found) +(https://github.com/jshttp/on-finished) (The MIT License) @@ -4961,7 +5025,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ ee-first@1.1.1 -(No repository found) +(https://github.com/jonathanong/ee-first) The MIT License (MIT) @@ -5186,7 +5250,7 @@ SOFTWARE. ============================================================ raw-body@3.0.2 -(No repository found) +(https://github.com/stream-utils/raw-body) The MIT License (MIT) @@ -5214,7 +5278,7 @@ THE SOFTWARE. ============================================================ unpipe@1.0.0 -(No repository found) +(https://github.com/stream-utils/unpipe) (The MIT License) @@ -5242,7 +5306,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ type-is@2.1.0 -(No repository found) +(https://github.com/jshttp/type-is) (The MIT License) @@ -5271,7 +5335,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ media-typer@1.1.0 -(No repository found) +(https://github.com/jshttp/media-typer) (The MIT License) @@ -5299,7 +5363,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ content-disposition@1.1.0 -(No repository found) +(https://github.com/jshttp/content-disposition) (The MIT License) @@ -5327,7 +5391,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ cookie@0.7.2 -(No repository found) +(https://github.com/jshttp/cookie) (The MIT License) @@ -5385,7 +5449,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ encodeurl@2.0.0 -(No repository found) +(https://github.com/pillarjs/encodeurl) (The MIT License) @@ -5413,7 +5477,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ escape-html@1.0.3 -(No repository found) +(https://github.com/component/escape-html) (The MIT License) @@ -5443,7 +5507,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ etag@1.8.1 -(No repository found) +(https://github.com/jshttp/etag) (The MIT License) @@ -5471,7 +5535,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ finalhandler@2.1.1 -(No repository found) +(https://github.com/pillarjs/finalhandler) (The MIT License) @@ -5499,7 +5563,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ parseurl@1.3.3 -(No repository found) +(https://github.com/pillarjs/parseurl) (The MIT License) @@ -5529,7 +5593,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ fresh@2.0.0 -(No repository found) +(https://github.com/jshttp/fresh) (The MIT License) @@ -5558,7 +5622,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ merge-descriptors@2.0.0 -(No repository found) +(https://github.com/sindresorhus/merge-descriptors) MIT License @@ -5617,7 +5681,7 @@ IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ============================================================ proxy-addr@2.0.7 -(No repository found) +(https://github.com/jshttp/proxy-addr) (The MIT License) @@ -5645,7 +5709,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ forwarded@0.2.0 -(No repository found) +(https://github.com/jshttp/forwarded) (The MIT License) @@ -5673,7 +5737,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ ipaddr.js@1.9.1 -(No repository found) +(https://github.com/whitequark/ipaddr.js) Copyright (C) 2011-2017 whitequark @@ -5698,7 +5762,7 @@ THE SOFTWARE. ============================================================ range-parser@1.2.1 -(No repository found) +(https://github.com/jshttp/range-parser) (The MIT License) @@ -5727,7 +5791,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ router@2.2.0 -(No repository found) +(https://github.com/pillarjs/router) (The MIT License) @@ -5807,7 +5871,7 @@ THE SOFTWARE. ============================================================ send@1.2.1 -(No repository found) +(https://github.com/pillarjs/send) (The MIT License) @@ -5836,7 +5900,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ serve-static@2.2.1 -(No repository found) +(https://github.com/expressjs/serve-static) (The MIT License) @@ -6055,7 +6119,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ============================================================ @opentelemetry/api@1.9.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -6262,7 +6326,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ============================================================ @opentelemetry/core@2.10.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -6469,7 +6533,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ============================================================ @opentelemetry/semantic-conventions@1.36.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -6676,7 +6740,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ============================================================ @opentelemetry/exporter-logs-otlp-grpc@0.221.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -6883,7 +6947,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ============================================================ @opentelemetry/otlp-exporter-base@0.221.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -7090,7 +7154,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ============================================================ @opentelemetry/otlp-transformer@0.221.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -7297,7 +7361,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ============================================================ @opentelemetry/api-logs@0.221.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -7504,7 +7568,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ============================================================ @opentelemetry/resources@2.10.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -7918,7 +7982,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ============================================================ @opentelemetry/sdk-metrics@2.10.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -8125,7 +8189,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ============================================================ @opentelemetry/sdk-trace@2.10.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -8332,7 +8396,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ============================================================ @opentelemetry/otlp-grpc-exporter-base@0.221.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -8539,7 +8603,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ============================================================ @grpc/grpc-js@1.14.4 -(No repository found) +(https://github.com/grpc/grpc-node/tree/master/packages/grpc-js) Apache License Version 2.0, January 2004 @@ -8953,7 +9017,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ============================================================ lodash.camelcase@4.3.0 -(No repository found) +(https://github.com/lodash/lodash) Copyright jQuery Foundation and other contributors @@ -9033,7 +9097,7 @@ THE SOFTWARE. ============================================================ cliui@8.0.1 -(No repository found) +(https://github.com/yargs/cliui) Copyright (c) 2015, Contributors @@ -9053,7 +9117,7 @@ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ============================================================ string-width@4.2.3 -(No repository found) +(https://github.com/sindresorhus/string-width) MIT License @@ -9094,7 +9158,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ is-fullwidth-code-point@3.0.0 -(No repository found) +(https://github.com/sindresorhus/is-fullwidth-code-point) MIT License @@ -9109,7 +9173,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ============================================================ strip-ansi@6.0.1 -(No repository found) +(https://github.com/chalk/strip-ansi) MIT License @@ -9124,7 +9188,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ============================================================ ansi-regex@6.2.2 -(No repository found) +(https://github.com/chalk/ansi-regex) MIT License @@ -9139,7 +9203,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ============================================================ wrap-ansi@7.0.0 -(No repository found) +(https://github.com/chalk/wrap-ansi) MIT License @@ -9154,7 +9218,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ============================================================ ansi-styles@4.3.0 -(No repository found) +(https://github.com/chalk/ansi-styles) MIT License @@ -9169,7 +9233,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ============================================================ color-convert@2.0.1 -(No repository found) +(https://github.com/Qix-/color-convert) Copyright (c) 2011-2016 Heather Arthur @@ -9209,7 +9273,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ============================================================ escalade@3.2.0 -(No repository found) +(https://github.com/lukeed/escalade) MIT License @@ -9264,7 +9328,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ y18n@5.0.8 -(No repository found) +(https://github.com/yargs/y18n) Copyright (c) 2015, Contributors @@ -9537,7 +9601,7 @@ SOFTWARE. ============================================================ @opentelemetry/exporter-metrics-otlp-grpc@0.221.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -9744,7 +9808,7 @@ SOFTWARE. ============================================================ @opentelemetry/exporter-metrics-otlp-http@0.221.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -9951,7 +10015,7 @@ SOFTWARE. ============================================================ @opentelemetry/exporter-trace-otlp-grpc@0.221.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -10158,7 +10222,7 @@ SOFTWARE. ============================================================ @opentelemetry/exporter-trace-otlp-http@0.221.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -10365,7 +10429,7 @@ SOFTWARE. ============================================================ @opentelemetry/instrumentation-http@0.221.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -10983,6 +11047,42 @@ import-in-the-middle@3.3.3 See the License for the specific language governing permissions and limitations under the License. +--- NOTICE --- + +import-in-the-middle is licensed for use as follows: + +Copyright 2024 Node.js contributors. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +This license applies to parts of import-in-the-middle originating from the +https://github.com/DataDog/import-in-the-middle repository: + + This product includes software developed at Datadog (https://www.datadoghq.com/). + + Copyright 2021 Datadog, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. ============================================================ cjs-module-lexer@2.2.1 @@ -11074,7 +11174,7 @@ SOFTWARE. ============================================================ forwarded-parse@2.1.2 -(No repository found) +(https://github.com/lpinca/forwarded-parse) Copyright (c) 2015 Luigi Pinca @@ -11306,7 +11406,7 @@ THE SOFTWARE. ============================================================ @opentelemetry/sdk-node@0.221.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -11513,7 +11613,7 @@ THE SOFTWARE. ============================================================ @opentelemetry/configuration@0.221.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -11720,7 +11820,7 @@ THE SOFTWARE. ============================================================ yaml@2.9.0 -(No repository found) +(https://github.com/eemeli/yaml) Copyright Eemeli Aro @@ -11739,7 +11839,7 @@ THIS SOFTWARE. ============================================================ @opentelemetry/context-async-hooks@2.10.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -11946,7 +12046,7 @@ THIS SOFTWARE. ============================================================ @opentelemetry/exporter-logs-otlp-proto@0.221.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -12153,7 +12253,7 @@ THIS SOFTWARE. ============================================================ @opentelemetry/exporter-metrics-otlp-proto@0.221.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -12360,7 +12460,7 @@ THIS SOFTWARE. ============================================================ @opentelemetry/exporter-prometheus@0.221.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -12567,7 +12667,7 @@ THIS SOFTWARE. ============================================================ @opentelemetry/exporter-trace-otlp-proto@0.221.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -12774,7 +12874,7 @@ THIS SOFTWARE. ============================================================ @opentelemetry/exporter-zipkin@2.10.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -12981,7 +13081,7 @@ THIS SOFTWARE. ============================================================ @opentelemetry/propagator-b3@2.10.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -13188,7 +13288,7 @@ THIS SOFTWARE. ============================================================ @opentelemetry/propagator-jaeger@2.10.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -13395,7 +13495,7 @@ THIS SOFTWARE. ============================================================ @opentelemetry/sdk-trace-base@2.10.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -13602,7 +13702,7 @@ THIS SOFTWARE. ============================================================ @opentelemetry/sdk-trace-node@2.10.0 -(No repository found) +(https://github.com/open-telemetry/opentelemetry-js) Apache License Version 2.0, January 2004 @@ -13809,9 +13909,29 @@ THIS SOFTWARE. ============================================================ @xterm/headless@5.5.0 -(No repository found) +(https://github.com/xtermjs/xterm.js) + +Standard MIT license text (package declares MIT but ships no license file; copyright holder from package.json metadata). + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -License text not found. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF OTHER DEALINGS IN THE +SOFTWARE. ============================================================ async-mutex@0.5.0 @@ -14046,7 +14166,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ============================================================ fzf@0.5.2 -(No repository found) +(https://github.com/ajitid/fzf-for-js) BSD 3-Clause License @@ -14206,7 +14326,7 @@ software or this license, under any kind of legal claim._** ============================================================ @isaacs/cliui@8.0.2 -(No repository found) +(https://github.com/yargs/cliui) Copyright (c) 2015, Contributors @@ -14226,7 +14346,7 @@ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ============================================================ string-width@5.1.2 -(No repository found) +(https://github.com/sindresorhus/string-width) MIT License @@ -14241,9 +14361,31 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ============================================================ eastasianwidth@0.2.0 -(No repository found) +(https://github.com/komagata/eastasianwidth.git) + +Standard MIT license text (package declares MIT but ships no license file; copyright holder from package.json metadata). + +Copyright (c) Masaki Komagata + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -License text not found. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF OTHER DEALINGS IN THE +SOFTWARE. ============================================================ emoji-regex@9.2.2 @@ -14273,7 +14415,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ strip-ansi@7.1.2 -(No repository found) +(https://github.com/chalk/strip-ansi) MIT License @@ -14288,7 +14430,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ============================================================ string-width-cjs@4.2.3 -(No repository found) +(https://github.com/sindresorhus/string-width) MIT License @@ -14303,7 +14445,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ============================================================ strip-ansi-cjs@6.0.1 -(No repository found) +(https://github.com/chalk/strip-ansi) MIT License @@ -14318,7 +14460,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ============================================================ wrap-ansi@8.1.0 -(No repository found) +(https://github.com/chalk/wrap-ansi) MIT License @@ -14333,7 +14475,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ============================================================ ansi-styles@6.2.3 -(No repository found) +(https://github.com/chalk/ansi-styles) MIT License @@ -14348,7 +14490,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ============================================================ wrap-ansi-cjs@7.0.0 -(No repository found) +(https://github.com/chalk/wrap-ansi) MIT License @@ -14438,7 +14580,7 @@ SOFTWARE. ============================================================ minipass@7.1.3 -(No repository found) +(https://github.com/isaacs/minipass) # Blue Oak Model License @@ -14846,7 +14988,7 @@ THE SOFTWARE. ============================================================ openai@5.11.0 -(No repository found) +(https://github.com/openai/openai-node) Apache License Version 2.0, January 2004 @@ -15053,7 +15195,7 @@ openai@5.11.0 ============================================================ picomatch@4.0.4 -(No repository found) +(https://github.com/micromatch/picomatch) The MIT License (MIT) @@ -15080,7 +15222,7 @@ THE SOFTWARE. ============================================================ prompts@2.4.2 -(No repository found) +(https://github.com/terkelg/prompts) MIT License @@ -15107,7 +15249,7 @@ SOFTWARE. ============================================================ kleur@3.0.3 -(No repository found) +(https://github.com/lukeed/kleur) The MIT License (MIT) @@ -15802,11 +15944,33 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. simple-git@3.36.0 (https://github.com/steveukx/git-js.git) -License text not found. +Standard MIT license text (package declares MIT but ships no license file; copyright holder from package.json metadata). + +Copyright (c) Steve King + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF OTHER DEALINGS IN THE +SOFTWARE. ============================================================ @kwsites/file-exists@1.1.1 -(No repository found) +(https://github.com/kwsites/file-exists.git) The MIT License (MIT) @@ -15832,7 +15996,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ @kwsites/promise-deferred@1.1.1 -(No repository found) +(https://github.com/kwsites/promise-deferred.git) MIT License @@ -15861,13 +16025,53 @@ SOFTWARE. @simple-git/args-pathspec@1.0.3 (git+https://github.com/steveukx/git-js.git) -License text not found. +Standard MIT license text (package declares MIT but ships no license file; copyright holder from package.json metadata). + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF OTHER DEALINGS IN THE +SOFTWARE. ============================================================ @simple-git/argv-parser@1.1.1 (git+https://github.com/steveukx/git-js.git) -License text not found. +Standard MIT license text (package declares MIT but ships no license file; copyright holder from package.json metadata). + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF OTHER DEALINGS IN THE +SOFTWARE. ============================================================ tar@7.5.22 @@ -16358,7 +16562,7 @@ SOFTWARE. ============================================================ markdown-it@14.2.0 -(No repository found) +(https://github.com/markdown-it/markdown-it) Copyright (c) 2014 Vitaly Puzrin, Alex Kocharin. @@ -16386,7 +16590,7 @@ OTHER DEALINGS IN THE SOFTWARE. ============================================================ argparse@2.0.1 -(No repository found) +(https://github.com/nodeca/argparse) A. HISTORY OF THE SOFTWARE ========================== @@ -16663,7 +16867,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ============================================================ linkify-it@5.0.2 -(No repository found) +(https://github.com/markdown-it/linkify-it) Copyright (c) 2015 Vitaly Puzrin. @@ -16691,7 +16895,7 @@ OTHER DEALINGS IN THE SOFTWARE. ============================================================ uc.micro@2.1.0 -(No repository found) +(https://github.com/markdown-it/uc.micro) Copyright Mathias Bynens @@ -16717,7 +16921,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ mdurl@2.0.0 -(No repository found) +(https://github.com/markdown-it/mdurl) Copyright (c) 2015 Vitaly Puzrin, Alex Kocharin. @@ -17246,7 +17450,7 @@ SOFTWARE. ============================================================ react-markdown@10.1.0 -(No repository found) +(https://github.com/remarkjs/react-markdown) The MIT License (MIT) @@ -17354,7 +17558,7 @@ SOFTWARE. ============================================================ devlop@1.1.0 -(No repository found) +(https://github.com/wooorm/devlop) (The MIT License) @@ -17382,7 +17586,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ dequal@2.0.3 -(No repository found) +(https://github.com/lukeed/dequal) The MIT License (MIT) @@ -17409,7 +17613,7 @@ THE SOFTWARE. ============================================================ hast-util-to-jsx-runtime@2.3.6 -(No repository found) +(https://github.com/syntax-tree/hast-util-to-jsx-runtime) (The MIT License) @@ -17464,7 +17668,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ comma-separated-tokens@2.0.3 -(No repository found) +(https://github.com/wooorm/comma-separated-tokens) (The MIT License) @@ -17492,7 +17696,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ estree-util-is-identifier-name@3.0.0 -(No repository found) +(https://github.com/syntax-tree/estree-util-is-identifier-name) (The MIT License) @@ -17520,7 +17724,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ hast-util-whitespace@3.0.0 -(No repository found) +(https://github.com/syntax-tree/hast-util-whitespace) (The MIT License) @@ -17548,7 +17752,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ mdast-util-mdx-expression@2.0.1 -(No repository found) +(https://github.com/syntax-tree/mdast-util-mdx-expression) (The MIT License) @@ -17603,7 +17807,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ mdast-util-from-markdown@2.0.3 -(No repository found) +(https://github.com/syntax-tree/mdast-util-from-markdown) (The MIT License) @@ -17631,7 +17835,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ decode-named-character-reference@1.3.0 -(No repository found) +(https://github.com/wooorm/decode-named-character-reference) (The MIT License) @@ -17659,7 +17863,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ character-entities@2.0.2 -(No repository found) +(https://github.com/wooorm/character-entities) (The MIT License) @@ -17687,7 +17891,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ mdast-util-to-string@4.0.0 -(No repository found) +(https://github.com/syntax-tree/mdast-util-to-string) (The MIT License) @@ -17715,7 +17919,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark@4.0.2 -(No repository found) +(https://github.com/micromark/micromark/tree/main/packages/micromark) (The MIT License) @@ -17797,7 +18001,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-core-commonmark@2.0.3 -(No repository found) +(https://github.com/micromark/micromark/tree/main/packages/micromark-core-commonmark) (The MIT License) @@ -17825,7 +18029,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-factory-destination@2.0.1 -(No repository found) +(https://github.com/micromark/micromark/tree/main/packages/micromark-factory-destination) (The MIT License) @@ -17853,7 +18057,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-util-character@2.1.1 -(No repository found) +(https://github.com/micromark/micromark/tree/main/packages/micromark-util-character) (The MIT License) @@ -17881,7 +18085,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-util-symbol@2.0.1 -(No repository found) +(https://github.com/micromark/micromark/tree/main/packages/micromark-util-symbol) (The MIT License) @@ -17909,7 +18113,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-util-types@2.0.2 -(No repository found) +(https://github.com/micromark/micromark/tree/main/packages/micromark-util-types) (The MIT License) @@ -17937,7 +18141,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-factory-label@2.0.1 -(No repository found) +(https://github.com/micromark/micromark/tree/main/packages/micromark-factory-label) (The MIT License) @@ -17965,7 +18169,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-factory-space@2.0.1 -(No repository found) +(https://github.com/micromark/micromark/tree/main/packages/micromark-factory-space) (The MIT License) @@ -17993,7 +18197,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-factory-title@2.0.1 -(No repository found) +(https://github.com/micromark/micromark/tree/main/packages/micromark-factory-title) (The MIT License) @@ -18021,7 +18225,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-factory-whitespace@2.0.1 -(No repository found) +(https://github.com/micromark/micromark/tree/main/packages/micromark-factory-whitespace) (The MIT License) @@ -18049,7 +18253,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-util-chunked@2.0.1 -(No repository found) +(https://github.com/micromark/micromark/tree/main/packages/micromark-util-chunked) (The MIT License) @@ -18077,7 +18281,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-util-classify-character@2.0.1 -(No repository found) +(https://github.com/micromark/micromark/tree/main/packages/micromark-util-classify-character) (The MIT License) @@ -18105,7 +18309,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-util-html-tag-name@2.0.1 -(No repository found) +(https://github.com/micromark/micromark/tree/main/packages/micromark-util-html-tag-name) (The MIT License) @@ -18133,7 +18337,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-util-normalize-identifier@2.0.1 -(No repository found) +(https://github.com/micromark/micromark/tree/main/packages/micromark-util-normalize-identifier) (The MIT License) @@ -18161,7 +18365,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-util-resolve-all@2.0.1 -(No repository found) +(https://github.com/micromark/micromark/tree/main/packages/micromark-util-resolve-all) (The MIT License) @@ -18189,7 +18393,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-util-subtokenize@2.1.0 -(No repository found) +(https://github.com/micromark/micromark/tree/main/packages/micromark-util-subtokenize) (The MIT License) @@ -18217,7 +18421,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-util-combine-extensions@2.0.1 -(No repository found) +(https://github.com/micromark/micromark/tree/main/packages/micromark-util-combine-extensions) (The MIT License) @@ -18245,7 +18449,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-util-decode-numeric-character-reference@2.0.2 -(No repository found) +(https://github.com/micromark/micromark/tree/main/packages/micromark-util-decode-numeric-character-reference) (The MIT License) @@ -18273,7 +18477,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-util-encode@2.0.1 -(No repository found) +(https://github.com/micromark/micromark/tree/main/packages/micromark-util-encode) (The MIT License) @@ -18301,7 +18505,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-util-sanitize-uri@2.0.1 -(No repository found) +(https://github.com/micromark/micromark/tree/main/packages/micromark-util-sanitize-uri) (The MIT License) @@ -18329,7 +18533,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-util-decode-string@2.0.1 -(No repository found) +(https://github.com/micromark/micromark/tree/main/packages/micromark-util-decode-string) (The MIT License) @@ -18357,7 +18561,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ unist-util-stringify-position@4.0.0 -(No repository found) +(https://github.com/syntax-tree/unist-util-stringify-position) (The MIT License) @@ -18385,7 +18589,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ mdast-util-to-markdown@2.1.2 -(No repository found) +(https://github.com/syntax-tree/mdast-util-to-markdown) (The MIT License) @@ -18413,7 +18617,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ longest-streak@3.1.0 -(No repository found) +(https://github.com/wooorm/longest-streak) (The MIT License) @@ -18441,7 +18645,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ mdast-util-phrasing@4.1.0 -(No repository found) +(https://github.com/syntax-tree/mdast-util-phrasing) (The MIT License) @@ -18470,7 +18674,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ unist-util-is@6.0.1 -(No repository found) +(https://github.com/syntax-tree/unist-util-is) (The MIT license) @@ -18498,7 +18702,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ unist-util-visit@5.1.0 -(No repository found) +(https://github.com/syntax-tree/unist-util-visit) (The MIT License) @@ -18526,7 +18730,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ unist-util-visit-parents@6.0.2 -(No repository found) +(https://github.com/syntax-tree/unist-util-visit-parents) (The MIT License) @@ -18554,7 +18758,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ zwitch@2.0.4 -(No repository found) +(https://github.com/wooorm/zwitch) (The MIT License) @@ -18582,7 +18786,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ mdast-util-mdx-jsx@3.2.0 -(No repository found) +(https://github.com/syntax-tree/mdast-util-mdx-jsx) (The MIT License) @@ -18610,7 +18814,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ ccount@2.0.1 -(No repository found) +(https://github.com/wooorm/ccount) (The MIT License) @@ -18638,7 +18842,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ parse-entities@4.0.2 -(No repository found) +(https://github.com/wooorm/parse-entities) (The MIT License) @@ -18693,7 +18897,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ character-entities-legacy@3.0.0 -(No repository found) +(https://github.com/wooorm/character-entities-legacy) (The MIT License) @@ -18721,7 +18925,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ character-reference-invalid@2.0.1 -(No repository found) +(https://github.com/wooorm/character-reference-invalid) (The MIT License) @@ -18749,7 +18953,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ is-alphanumerical@2.0.1 -(No repository found) +(https://github.com/wooorm/is-alphanumerical) (The MIT License) @@ -18777,7 +18981,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ is-alphabetical@2.0.1 -(No repository found) +(https://github.com/wooorm/is-alphabetical) (The MIT License) @@ -18805,7 +19009,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ is-decimal@2.0.1 -(No repository found) +(https://github.com/wooorm/is-decimal) (The MIT License) @@ -18833,7 +19037,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ is-hexadecimal@2.0.1 -(No repository found) +(https://github.com/wooorm/is-hexadecimal) (The MIT License) @@ -18861,7 +19065,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ stringify-entities@4.0.4 -(No repository found) +(https://github.com/wooorm/stringify-entities) (The MIT License) @@ -18889,7 +19093,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ character-entities-html4@2.1.0 -(No repository found) +(https://github.com/wooorm/character-entities-html4) (The MIT License) @@ -18917,7 +19121,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ vfile-message@4.0.3 -(No repository found) +(https://github.com/vfile/vfile-message) (The MIT License) @@ -18945,7 +19149,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ mdast-util-mdxjs-esm@2.0.1 -(No repository found) +(https://github.com/syntax-tree/mdast-util-mdxjs-esm) (The MIT License) @@ -18973,7 +19177,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ property-information@7.2.0 -(No repository found) +(https://github.com/wooorm/property-information) (The MIT License) @@ -19001,7 +19205,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ space-separated-tokens@2.0.2 -(No repository found) +(https://github.com/wooorm/space-separated-tokens) (The MIT License) @@ -19100,7 +19304,7 @@ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ============================================================ unist-util-position@5.0.0 -(No repository found) +(https://github.com/syntax-tree/unist-util-position) (The MIT License) @@ -19128,7 +19332,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ html-url-attributes@3.0.1 -(No repository found) +(https://github.com/rehypejs/rehype-minify/tree/main/packages/html-url-attributes) (The MIT License) @@ -19155,7 +19359,7 @@ THE SOFTWARE. ============================================================ mdast-util-to-hast@13.2.1 -(No repository found) +(https://github.com/syntax-tree/mdast-util-to-hast) (The MIT License) @@ -19204,7 +19408,7 @@ PERFORMANCE OF THIS SOFTWARE. ============================================================ trim-lines@3.0.1 -(No repository found) +(https://github.com/wooorm/trim-lines) (The MIT License) @@ -19232,7 +19436,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ vfile@6.0.3 -(No repository found) +(https://github.com/vfile/vfile) (The MIT License) @@ -19259,7 +19463,7 @@ THE SOFTWARE. ============================================================ remark-parse@11.0.0 -(No repository found) +(https://github.com/remarkjs/remark/tree/main/packages/remark-parse) (The MIT License) @@ -19286,7 +19490,7 @@ THE SOFTWARE. ============================================================ unified@11.0.5 -(No repository found) +(https://github.com/unifiedjs/unified) (The MIT License) @@ -19313,7 +19517,7 @@ THE SOFTWARE. ============================================================ bail@2.0.2 -(No repository found) +(https://github.com/wooorm/bail) (The MIT License) @@ -19341,7 +19545,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ is-plain-obj@4.1.0 -(No repository found) +(https://github.com/sindresorhus/is-plain-obj) MIT License @@ -19356,7 +19560,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ============================================================ trough@2.2.0 -(No repository found) +(https://github.com/wooorm/trough) (The MIT License) @@ -19383,7 +19587,7 @@ THE SOFTWARE. ============================================================ remark-rehype@11.1.2 -(No repository found) +(https://github.com/remarkjs/remark-rehype) (The MIT License) @@ -19410,62 +19614,16 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ -@tanstack/react-virtual@3.14.2 -(git+https://github.com/TanStack/virtual.git) - -MIT License - -Copyright (c) 2021-present Tanner Linsley - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -============================================================ -@tanstack/virtual-core@3.17.0 -(git+https://github.com/TanStack/virtual.git) - -MIT License - -Copyright (c) 2021-present Tanner Linsley +@modelcontextprotocol/ext-apps@1.7.5 +(https://github.com/modelcontextprotocol/ext-apps) -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The MCP project is undergoing a licensing transition from the MIT License to the Apache License, Version 2.0 ("Apache-2.0"). All new code and specification contributions to the project are licensed under Apache-2.0. Documentation contributions (excluding specifications) are licensed under CC-BY-4.0. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +Contributions for which relicensing consent has been obtained are licensed under Apache-2.0. Contributions made by authors who originally licensed their work under the MIT License and who have not yet granted explicit permission to relicense remain licensed under the MIT License. +No rights beyond those granted by the applicable original license are conveyed for such contributions. -============================================================ -class-variance-authority@0.7.1 -(No repository found) +--- Apache License Version 2.0, January 2004 @@ -19517,9 +19675,9 @@ class-variance-authority@0.7.1 "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" + submitted to the Licensor for inclusion in the Work by the copyright + owner or by an individual or Legal Entity authorized to submit on behalf + of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, @@ -19644,32 +19802,326 @@ class-variance-authority@0.7.1 END OF TERMS AND CONDITIONS - Copyright 2022 Joe Bell - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -============================================================ -clsx@2.1.1 -(No repository found) +--- MIT License -Copyright (c) Luke Edwards (lukeed.com) +Copyright (c) 2024-2025 Model Context Protocol a Series of LF Projects, LLC. -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +--- + +Creative Commons Attribution 4.0 International (CC-BY-4.0) + +Documentation in this project (excluding specifications) is licensed under +CC-BY-4.0. See https://creativecommons.org/licenses/by/4.0/legalcode for +the full license text. + + +============================================================ +@standard-schema/spec@1.1.0 +(https://github.com/standard-schema/standard-schema) + +MIT License + +Copyright (c) 2024 Colin McDonnell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +============================================================ +@tanstack/react-virtual@3.14.2 +(git+https://github.com/TanStack/virtual.git) + +MIT License + +Copyright (c) 2021-present Tanner Linsley + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +@tanstack/virtual-core@3.17.0 +(git+https://github.com/TanStack/virtual.git) + +MIT License + +Copyright (c) 2021-present Tanner Linsley + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +============================================================ +class-variance-authority@0.7.1 +(https://github.com/joe-bell/cva.git) + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2022 Joe Bell + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +============================================================ +clsx@2.1.1 +(https://github.com/lukeed/clsx) + +MIT License + +Copyright (c) Luke Edwards (lukeed.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -19966,22 +20418,59 @@ echarts@6.1.0 -======================================================================== -Apache ECharts Subcomponents: +======================================================================== +Apache ECharts Subcomponents: + +The Apache ECharts project contains subcomponents with separate copyright +notices and license terms. Your use of the source code for these +subcomponents is also subject to the terms and conditions of the following +licenses. + +BSD 3-Clause (d3.js): +The following files embed [d3.js](https://github.com/d3/d3) BSD 3-Clause: + `/src/chart/treemap/treemapLayout.ts`, + `/src/chart/tree/layoutHelper.ts`, + `/src/chart/graph/forceHelper.ts`, + `/src/util/number.ts` +See `/licenses/LICENSE-d3` for details of the license. + +--- licenses/LICENSE-d3 --- + +Copyright 2010-2016 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -The Apache ECharts project contains subcomponents with separate copyright -notices and license terms. Your use of the source code for these -subcomponents is also subject to the terms and conditions of the following -licenses. +--- NOTICE --- -BSD 3-Clause (d3.js): -The following files embed [d3.js](https://github.com/d3/d3) BSD 3-Clause: - `/src/chart/treemap/treemapLayout.ts`, - `/src/chart/tree/layoutHelper.ts`, - `/src/chart/graph/forceHelper.ts`, - `/src/util/number.ts` -See `/licenses/LICENSE-d3` for details of the license. +Apache ECharts +Copyright 2017-2026 The Apache Software Foundation +This product includes software developed at +The Apache Software Foundation (https://www.apache.org/). ============================================================ tslib@2.3.0 @@ -20327,7 +20816,7 @@ SOFTWARE. ============================================================ import-meta-resolve@4.2.0 -(No repository found) +(https://github.com/wooorm/import-meta-resolve) (The MIT License) @@ -22668,7 +23157,7 @@ THE SOFTWARE. ============================================================ lodash-es@4.18.1 -(No repository found) +(https://github.com/lodash/lodash) Copyright OpenJS Foundation and other contributors @@ -22989,17 +23478,61 @@ SOFTWARE. fastdom@1.0.12 (git://github.com/wilsonpage/fastdom.git) -License text not found. +Standard MIT license text (package declares MIT but ships no license file; copyright holder from package.json metadata). + +Copyright (c) Wilson Page + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF OTHER DEALINGS IN THE +SOFTWARE. ============================================================ strictdom@1.0.1 (git://github.com/wilsonpage/strictdom.git) -License text not found. +Standard MIT license text (package declares MIT but ships no license file; copyright holder from package.json metadata). + +Copyright (c) Wilson Page + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF OTHER DEALINGS IN THE +SOFTWARE. ============================================================ khroma@2.1.0 -(No repository found) +(https://github.com/fabiospampinato/khroma) The MIT License (MIT) @@ -23211,7 +23744,7 @@ SOFTWARE. ============================================================ stylis@4.4.0 -(No repository found) +(https://github.com/thysultan/stylis.js) MIT License @@ -23955,7 +24488,7 @@ SOFTWARE. ============================================================ react-remove-scroll@2.7.2 -(No repository found) +(https://github.com/theKashey/react-remove-scroll) MIT License @@ -23982,9 +24515,31 @@ SOFTWARE. ============================================================ react-remove-scroll-bar@2.3.8 -(No repository found) +(https://github.com/theKashey/react-remove-scroll-bar) + +Standard MIT license text (package declares MIT but ships no license file; copyright holder from package.json metadata). + +Copyright (c) Anton Korzunov + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -License text not found. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF OTHER DEALINGS IN THE +SOFTWARE. ============================================================ react-style-singleton@2.2.3 @@ -24015,7 +24570,7 @@ SOFTWARE. ============================================================ get-nonce@1.0.1 -(No repository found) +(https://github.com/theKashey/get-nonce.git) MIT License @@ -24042,7 +24597,7 @@ SOFTWARE. ============================================================ use-callback-ref@1.3.3 -(No repository found) +(https://github.com/theKashey/use-callback-ref/) MIT License @@ -25226,7 +25781,7 @@ SOFTWARE. ============================================================ react-markdown@9.1.0 -(No repository found) +(https://github.com/remarkjs/react-markdown) The MIT License (MIT) @@ -25253,9 +25808,31 @@ SOFTWARE. ============================================================ rehype-katex@7.0.1 -(No repository found) +(https://github.com/remarkjs/remark-math/tree/main/packages/rehype-katex) + +Standard MIT license text (package declares MIT but ships no license file; copyright holder from package.json metadata). + +Copyright (c) Junyoung Choi + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -License text not found. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF OTHER DEALINGS IN THE +SOFTWARE. ============================================================ @types/katex@0.16.8 @@ -25286,7 +25863,7 @@ License text not found. ============================================================ hast-util-from-html-isomorphic@2.0.0 -(No repository found) +(https://github.com/syntax-tree/hast-util-from-html-isomorphic) (The MIT License) @@ -25314,7 +25891,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ hast-util-from-dom@5.0.1 -(No repository found) +(https://github.com/syntax-tree/hast-util-from-dom) (ISC License) @@ -25335,7 +25912,7 @@ THIS SOFTWARE. ============================================================ hastscript@9.0.1 -(No repository found) +(https://github.com/syntax-tree/hastscript) (The MIT License) @@ -25363,7 +25940,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ hast-util-parse-selector@4.0.0 -(No repository found) +(https://github.com/syntax-tree/hast-util-parse-selector) (The MIT License) @@ -25391,7 +25968,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ web-namespaces@2.0.1 -(No repository found) +(https://github.com/wooorm/web-namespaces) (The MIT License) @@ -25419,7 +25996,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ hast-util-from-html@2.0.3 -(No repository found) +(https://github.com/syntax-tree/hast-util-from-html) (The MIT License) @@ -25447,7 +26024,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ hast-util-from-parse5@8.0.3 -(No repository found) +(https://github.com/syntax-tree/hast-util-from-parse5) (The MIT License) @@ -25475,7 +26052,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ vfile-location@5.0.3 -(No repository found) +(https://github.com/vfile/vfile-location) (The MIT License) @@ -25545,7 +26122,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ============================================================ unist-util-remove-position@5.0.0 -(No repository found) +(https://github.com/syntax-tree/unist-util-remove-position) (The MIT License) @@ -25573,7 +26150,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ hast-util-to-text@4.0.2 -(No repository found) +(https://github.com/syntax-tree/hast-util-to-text) (The MIT License) @@ -25601,7 +26178,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ hast-util-is-element@3.0.0 -(No repository found) +(https://github.com/syntax-tree/hast-util-is-element) (The MIT License) @@ -25629,7 +26206,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ unist-util-find-after@5.0.0 -(No repository found) +(https://github.com/syntax-tree/unist-util-find-after) (The MIT License) @@ -25655,9 +26232,160 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +============================================================ +remark-cjk-friendly@2.3.1 +(https://github.com/tats-u/markdown-cjk-friendly) + +Copyright (c) 2025 Tatsunori Uchino + +MIT LICENSE + +Based on remark-gfm: + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +mdast-util-to-markdown-cjk-friendly@1.0.0 +(https://github.com/tats-u/markdown-cjk-friendly) + +Copyright (c) 2025 Tatsunori Uchino + +MIT LICENSE + +Based on remark-gfm: + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-extension-cjk-friendly-util@3.0.1 +(https://github.com/tats-u/markdown-cjk-friendly) + +Copyright (c) 2025 Tatsunori Uchino + +MIT LICENSE + +Based on micromark's sub-packages (micromark-util-character, micromark-util-symbol, and micromark-util-classify-character) + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +get-east-asian-width@1.5.0 +(https://github.com/sindresorhus/get-east-asian-width) + +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +micromark-extension-cjk-friendly@2.0.1 +(https://github.com/tats-u/markdown-cjk-friendly) + +Copyright (c) 2025 Tatsunori Uchino + +MIT LICENSE + +Based on micromark and micromark-core-commonmark + +(The MIT License) + +Copyright (c) Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + ============================================================ remark-gfm@4.0.1 -(No repository found) +(https://github.com/remarkjs/remark-gfm) (The MIT License) @@ -25685,7 +26413,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ mdast-util-gfm@3.1.0 -(No repository found) +(https://github.com/syntax-tree/mdast-util-gfm) (The MIT License) @@ -25713,7 +26441,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ mdast-util-gfm-autolink-literal@2.0.1 -(No repository found) +(https://github.com/syntax-tree/mdast-util-gfm-autolink-literal) (The MIT License) @@ -25741,7 +26469,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ mdast-util-find-and-replace@3.0.2 -(No repository found) +(https://github.com/syntax-tree/mdast-util-find-and-replace) (The MIT License) @@ -25769,7 +26497,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ escape-string-regexp@5.0.0 -(No repository found) +(https://github.com/sindresorhus/escape-string-regexp) MIT License @@ -25784,7 +26512,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ============================================================ mdast-util-gfm-footnote@2.1.0 -(No repository found) +(https://github.com/syntax-tree/mdast-util-gfm-footnote) (The MIT License) @@ -25812,7 +26540,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ mdast-util-gfm-strikethrough@2.0.0 -(No repository found) +(https://github.com/syntax-tree/mdast-util-gfm-strikethrough) (The MIT License) @@ -25840,7 +26568,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ mdast-util-gfm-table@2.0.0 -(No repository found) +(https://github.com/syntax-tree/mdast-util-gfm-table) (The MIT License) @@ -25868,7 +26596,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ markdown-table@3.0.4 -(No repository found) +(https://github.com/wooorm/markdown-table) (The MIT License) @@ -25896,7 +26624,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ mdast-util-gfm-task-list-item@2.0.0 -(No repository found) +(https://github.com/syntax-tree/mdast-util-gfm-task-list-item) (The MIT License) @@ -25924,7 +26652,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-extension-gfm@3.0.0 -(No repository found) +(https://github.com/micromark/micromark-extension-gfm) (The MIT License) @@ -25952,7 +26680,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-extension-gfm-autolink-literal@2.1.0 -(No repository found) +(https://github.com/micromark/micromark-extension-gfm-autolink-literal) (The MIT License) @@ -25980,7 +26708,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-extension-gfm-footnote@2.1.0 -(No repository found) +(https://github.com/micromark/micromark-extension-gfm-footnote) (The MIT License) @@ -26008,7 +26736,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-extension-gfm-strikethrough@2.1.0 -(No repository found) +(https://github.com/micromark/micromark-extension-gfm-strikethrough) (The MIT License) @@ -26036,7 +26764,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-extension-gfm-table@2.1.1 -(No repository found) +(https://github.com/micromark/micromark-extension-gfm-table) (The MIT License) @@ -26064,7 +26792,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-extension-gfm-tagfilter@2.0.0 -(No repository found) +(https://github.com/micromark/micromark-extension-gfm-tagfilter) (The MIT License) @@ -26092,7 +26820,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-extension-gfm-task-list-item@2.1.0 -(No repository found) +(https://github.com/micromark/micromark-extension-gfm-task-list-item) (The MIT License) @@ -26120,7 +26848,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ remark-stringify@11.0.0 -(No repository found) +(https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) (The MIT License) @@ -26147,13 +26875,35 @@ THE SOFTWARE. ============================================================ remark-math@6.0.0 -(No repository found) +(https://github.com/remarkjs/remark-math/tree/main/packages/remark-math) + +Standard MIT license text (package declares MIT but ships no license file; copyright holder from package.json metadata). + +Copyright (c) Junyoung Choi + +MIT License -License text not found. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF OTHER DEALINGS IN THE +SOFTWARE. ============================================================ mdast-util-math@3.0.0 -(No repository found) +(https://github.com/syntax-tree/mdast-util-math) (The MIT License) @@ -26181,7 +26931,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ micromark-extension-math@3.1.0 -(No repository found) +(https://github.com/micromark/micromark-extension-math) (The MIT License) @@ -26511,7 +27261,7 @@ SOFTWARE. ============================================================ hast-util-to-html@9.0.5 -(No repository found) +(https://github.com/syntax-tree/hast-util-to-html) (The MIT License) @@ -26539,7 +27289,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ html-void-elements@3.0.0 -(No repository found) +(https://github.com/wooorm/html-void-elements) (The MIT License) diff --git a/packages/vscode-ide-companion/scripts/generate-notices.js b/packages/vscode-ide-companion/scripts/generate-notices.js index acd0a572149..a162c3a543d 100644 --- a/packages/vscode-ide-companion/scripts/generate-notices.js +++ b/packages/vscode-ide-companion/scripts/generate-notices.js @@ -14,6 +14,31 @@ const projectRoot = path.resolve( const packagePath = path.join(projectRoot, 'packages', 'vscode-ide-companion'); const noticeFilePath = path.join(packagePath, 'NOTICES.txt'); +/** + * Standard MIT license text used when a package declares MIT but ships no + * license file (some packages keep the text only in their README). The + * copyright holder line is taken from package.json metadata when available. + */ +const MIT_FALLBACK_TEXT = `MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF OTHER DEALINGS IN THE +SOFTWARE.`; + /** * Read license information for a dependency from its on-disk location. * @@ -40,7 +65,8 @@ async function getDependencyLicense(depName, depVersion, resolvedKey) { ); const depPackageJson = JSON.parse(depPackageJsonContent); - repositoryUrl = depPackageJson.repository?.url || repositoryUrl; + repositoryUrl = + normalizeRepositoryUrl(depPackageJson.repository) || repositoryUrl; const packageDir = path.dirname(depPackageJsonPath); const licenseFile = await findLicenseFile( @@ -57,7 +83,56 @@ async function getDependencyLicense(depName, depVersion, resolvedKey) { ); } } else { - console.warn(`Warning: Could not find license file for ${depName}`); + const fallbackLicense = getFallbackLicenseText( + depPackageJson.license, + depPackageJson.author, + ); + if (fallbackLicense) { + licenseContent = fallbackLicense; + } else { + console.warn(`Warning: Could not find license file for ${depName}`); + } + } + + // Some packages keep additional license texts outside the top level: + // a `licenses/` directory (e.g. echarts ships licenses/LICENSE-d3 for + // its embedded d3-derived files, referenced from its Apache LICENSE) + // and an Apache-style NOTICE file (required by Apache-2.0 §4(d)). + // Append both so the notices they accompany are actually shipped. + const extraSections = []; + for (const supplementaryFile of await findSupplementaryLicenseFiles( + packageDir, + )) { + try { + const content = await fs.readFile(supplementaryFile, 'utf-8'); + const relativeName = path + .relative(packageDir, supplementaryFile) + .split(path.sep) + .join('/'); + extraSections.push(`--- ${relativeName} ---\n\n${content.trim()}`); + } catch (e) { + console.warn( + `Warning: Failed to read supplementary license file for ${depName}: ${e.message}`, + ); + } + } + + const noticeFile = await findNoticeFile(packageDir); + if (noticeFile) { + try { + const noticeContent = (await fs.readFile(noticeFile, 'utf-8')).trim(); + if (noticeContent) { + extraSections.push(`--- NOTICE ---\n\n${noticeContent}`); + } + } catch (e) { + console.warn( + `Warning: Failed to read NOTICE file for ${depName}: ${e.message}`, + ); + } + } + + if (extraSections.length > 0) { + licenseContent = `${licenseContent.replace(/\s+$/, '')}\n\n${extraSections.join('\n\n')}`; } } catch (e) { console.warn( @@ -74,11 +149,30 @@ async function getDependencyLicense(depName, depVersion, resolvedKey) { } /** - * Resolve a dependency's license file case-insensitively. The default macOS - * filesystem is case-insensitive while Linux (CI) is case-sensitive, so a - * fixed-case candidate list finds a `License` file on macOS but misses it on - * Linux, making the generated notices platform-dependent. Scan the directory - * and compare lowercased names so the result is identical on both. + * Scan a directory and map lowercased entry names to the actual entry name. + * The default macOS filesystem is case-insensitive while Linux (CI) is + * case-sensitive, so a fixed-case candidate list finds a `License` file on + * macOS but misses it on Linux, making the generated notices + * platform-dependent. Comparing lowercased names gives the same result on + * both. + * + * @param {string} dir - Directory to scan + * @returns {Promise>} Lowercased name -> actual name + */ +async function entriesByLowerName(dir) { + const dirEntries = await fs.readdir(dir).catch(() => []); + const map = new Map(); + for (const entry of dirEntries) { + const lower = entry.toLowerCase(); + if (!map.has(lower)) { + map.set(lower, entry); + } + } + return map; +} + +/** + * Resolve a dependency's license file case-insensitively. * * @param {string} packageDir - Directory containing the dependency's package.json * @param {string} [licenseFileHint] - License file name declared in package.json, if any @@ -99,24 +193,145 @@ export async function findLicenseFile(packageDir, licenseFileHint) { .filter(Boolean) .map((candidate) => candidate.toLowerCase()); - const dirEntries = await fs.readdir(packageDir).catch(() => []); - const entriesByLowerName = new Map(); - for (const entry of dirEntries) { - const lower = entry.toLowerCase(); - if (!entriesByLowerName.has(lower)) { - entriesByLowerName.set(lower, entry); + const entries = await entriesByLowerName(packageDir); + + for (const candidate of candidates) { + const match = entries.get(candidate); + if (match) { + return path.join(packageDir, match); } } + return undefined; +} + +/** + * Resolve a dependency's NOTICE file case-insensitively. Apache-2.0 §4(d) + * requires redistribution to retain NOTICE attributions when the work ships + * a NOTICE file. + * + * @param {string} packageDir - Directory containing the dependency's package.json + * @returns {Promise} Absolute path to the NOTICE file, or undefined + */ +export async function findNoticeFile(packageDir) { + const candidates = ['notice', 'notice.txt', 'notice.md']; + const entries = await entriesByLowerName(packageDir); for (const candidate of candidates) { - const match = entriesByLowerName.get(candidate); + const match = entries.get(candidate); if (match) { - return path.join(packageDir, match); + const matchPath = path.join(packageDir, match); + const stat = await fs.stat(matchPath).catch(() => undefined); + if (stat?.isFile()) { + return matchPath; + } } } return undefined; } +/** + * List supplementary license files kept in a package's top-level `licenses/` + * directory (sorted for deterministic output). These are referenced from the + * package's main license text (e.g. echarts' Apache LICENSE points at + * licenses/LICENSE-d3 for its embedded d3-derived files) but were previously + * never shipped with the notices. The match is exact-case on purpose: the + * uppercase `LICENSES/` directory is the unrelated REUSE convention of + * SPDX-keyed standard texts, which the package's own license entry already + * covers. + * + * @param {string} packageDir - Directory containing the dependency's package.json + * @returns {Promise} Absolute paths of the supplementary license files + */ +export async function findSupplementaryLicenseFiles(packageDir) { + const dirEntries = await fs.readdir(packageDir).catch(() => []); + if (!dirEntries.includes('licenses')) { + return []; + } + const licensesDir = path.join(packageDir, 'licenses'); + const dirStat = await fs.stat(licensesDir).catch(() => undefined); + if (!dirStat?.isDirectory()) { + return []; + } + + const filePaths = []; + const files = (await fs.readdir(licensesDir).catch(() => [])) + .slice() + .sort((a, b) => a.localeCompare(b)); + for (const file of files) { + const filePath = path.join(licensesDir, file); + const fileStat = await fs.stat(filePath).catch(() => undefined); + if (fileStat?.isFile()) { + filePaths.push(filePath); + } + } + return filePaths; +} + +/** + * Normalize the package.json `repository` field to a display URL. + * + * Object-form values are returned unchanged (preserving the historical + * output). String-form values — which npm allows as a full URL, a + * `github:user/repo` shortcut, or a bare `user/repo` GitHub shorthand — are + * expanded to an https URL so they are not dropped as "No repository found". + * + * @param {string | {url?: string} | undefined} repository - The `repository` field from package.json + * @returns {string | undefined} A display URL, or undefined when absent + */ +export function normalizeRepositoryUrl(repository) { + if (typeof repository !== 'string') { + return repository?.url; + } + + let value = repository.trim(); + if (!value) { + return undefined; + } + + if (value.startsWith('git+') && /^git\+https?:/.test(value)) { + value = value.slice('git+'.length); + } + if (value.startsWith('github:')) { + return `https://github.com/${value.slice('github:'.length)}`; + } + const scpMatch = value.match(/^git@([^:]+):(.+)$/); + if (scpMatch) { + return `https://${scpMatch[1]}/${scpMatch[2]}`; + } + if (value.startsWith('git://')) { + return `https://${value.slice('git://'.length)}`; + } + if (/^[\w.-]+\/[\w.-]+$/.test(value)) { + return `https://github.com/${value}`; + } + return value; +} + +/** + * Produce fallback license text for packages that declare a known SPDX + * license but ship no license file. Currently only MIT is covered, as it is + * the only such declaration in the dependency graph. + * + * @param {unknown} license - The `license` field from package.json + * @param {unknown} author - The `author` field from package.json + * @returns {string | undefined} Fallback text, or undefined when no fallback applies + */ +export function getFallbackLicenseText(license, author) { + if (typeof license !== 'string' || license.trim().toUpperCase() !== 'MIT') { + return undefined; + } + const authorName = + typeof author === 'string' && author.trim() + ? // npm author strings may carry a trailing homepage in parentheses + // ("Name (url)"), which does not belong in a copyright line. + author.trim().replace(/\s*\([^)]*\)$/, '') + : typeof author?.name === 'string' && author.name.trim() + ? author.name.trim() + : undefined; + const copyrightLine = authorName ? `Copyright (c) ${authorName}\n\n` : ''; + return `Standard MIT license text (package declares MIT but ships no license file; copyright holder from package.json metadata).\n\n${copyrightLine}${MIT_FALLBACK_TEXT}`; +} + /** * Resolve a package in the lockfile by walking up the node_modules chain, * mirroring Node.js module resolution algorithm. @@ -156,6 +371,7 @@ function resolveInLockfile(packageName, packages, resolveFrom) { * @param {object} packageLock - Parsed package-lock.json * @param {Map} dependenciesMap - Accumulated results * @param {string} resolveFrom - Lockfile key prefix to resolve from (e.g. "packages/vscode-ide-companion") + * @param {Set} visitedKeys - Lockfile keys already traversed */ export function collectDependencies( packageName, diff --git a/packages/vscode-ide-companion/scripts/generate-notices.test.js b/packages/vscode-ide-companion/scripts/generate-notices.test.js index 4be5a948cfb..0d8fbacad1f 100644 --- a/packages/vscode-ide-companion/scripts/generate-notices.test.js +++ b/packages/vscode-ide-companion/scripts/generate-notices.test.js @@ -8,7 +8,14 @@ import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import fs from 'node:fs/promises'; import os from 'node:os'; import path from 'node:path'; -import { collectDependencies, findLicenseFile } from './generate-notices.js'; +import { + collectDependencies, + findLicenseFile, + findNoticeFile, + findSupplementaryLicenseFiles, + getFallbackLicenseText, + normalizeRepositoryUrl, +} from './generate-notices.js'; describe('findLicenseFile', () => { let packageDir; @@ -88,3 +95,168 @@ describe('collectDependencies', () => { ]); }); }); + +describe('normalizeRepositoryUrl', () => { + it('returns object-form repository urls unchanged', () => { + expect( + normalizeRepositoryUrl({ + type: 'git', + url: 'git+https://github.com/nodejs/undici.git', + }), + ).toBe('git+https://github.com/nodejs/undici.git'); + }); + + it('accepts string-form repository urls', () => { + expect( + normalizeRepositoryUrl( + 'https://github.com/theKashey/react-remove-scroll-bar', + ), + ).toBe('https://github.com/theKashey/react-remove-scroll-bar'); + }); + + it('expands bare GitHub shorthand strings', () => { + expect(normalizeRepositoryUrl('yargs/cliui')).toBe( + 'https://github.com/yargs/cliui', + ); + }); + + it('expands github:-prefixed shorthand strings', () => { + expect( + normalizeRepositoryUrl('github:anthropics/anthropic-sdk-typescript'), + ).toBe('https://github.com/anthropics/anthropic-sdk-typescript'); + }); + + it('normalizes git://, git+https:// and scp-style string urls', () => { + expect( + normalizeRepositoryUrl('git://github.com/komagata/eastasianwidth.git'), + ).toBe('https://github.com/komagata/eastasianwidth.git'); + expect( + normalizeRepositoryUrl('git+https://github.com/jsdom/tr46.git'), + ).toBe('https://github.com/jsdom/tr46.git'); + expect( + normalizeRepositoryUrl('git@github.com:kwsites/file-exists.git'), + ).toBe('https://github.com/kwsites/file-exists.git'); + }); + + it('returns undefined for absent or empty repository values', () => { + expect(normalizeRepositoryUrl(undefined)).toBeUndefined(); + expect(normalizeRepositoryUrl({})).toBeUndefined(); + expect(normalizeRepositoryUrl(' ')).toBeUndefined(); + }); +}); + +describe('findNoticeFile', () => { + let packageDir; + + beforeEach(async () => { + packageDir = await fs.mkdtemp(path.join(os.tmpdir(), 'notices-test-')); + }); + + afterEach(async () => { + await fs.rm(packageDir, { recursive: true, force: true }); + }); + + it('resolves a mixed-case NOTICE file', async () => { + await fs.writeFile(path.join(packageDir, 'Notice'), 'Apache ECharts'); + + const resolved = await findNoticeFile(packageDir); + + expect(resolved).toBe(path.join(packageDir, 'Notice')); + }); + + it('prefers NOTICE over NOTICE.txt', async () => { + await fs.writeFile(path.join(packageDir, 'NOTICE'), 'notice'); + await fs.writeFile(path.join(packageDir, 'NOTICE.txt'), 'notice.txt'); + + const resolved = await findNoticeFile(packageDir); + + expect(resolved).toBe(path.join(packageDir, 'NOTICE')); + }); + + it('returns undefined when no NOTICE file exists', async () => { + const resolved = await findNoticeFile(packageDir); + + expect(resolved).toBeUndefined(); + }); +}); + +describe('findSupplementaryLicenseFiles', () => { + let packageDir; + + beforeEach(async () => { + packageDir = await fs.mkdtemp(path.join(os.tmpdir(), 'notices-test-')); + }); + + afterEach(async () => { + await fs.rm(packageDir, { recursive: true, force: true }); + }); + + it('lists files in the licenses directory sorted', async () => { + await fs.mkdir(path.join(packageDir, 'licenses')); + await fs.writeFile(path.join(packageDir, 'licenses', 'LICENSE-d3'), 'BSD'); + await fs.writeFile(path.join(packageDir, 'licenses', 'LICENSE-abc'), 'MIT'); + + const resolved = await findSupplementaryLicenseFiles(packageDir); + + expect(resolved).toEqual([ + path.join(packageDir, 'licenses', 'LICENSE-abc'), + path.join(packageDir, 'licenses', 'LICENSE-d3'), + ]); + }); + + it('ignores the uppercase REUSE-style LICENSES directory', async () => { + await fs.mkdir(path.join(packageDir, 'LICENSES')); + await fs.writeFile( + path.join(packageDir, 'LICENSES', 'Apache-2.0.txt'), + 'Apache-2.0', + ); + + const resolved = await findSupplementaryLicenseFiles(packageDir); + + expect(resolved).toEqual([]); + }); + + it('returns an empty list when the package has no licenses directory', async () => { + const resolved = await findSupplementaryLicenseFiles(packageDir); + + expect(resolved).toEqual([]); + }); +}); + +describe('getFallbackLicenseText', () => { + it('returns standard MIT text with the copyright holder from a string author', () => { + const text = getFallbackLicenseText('MIT', 'Wilson Page'); + + expect(text).toContain('Standard MIT license text'); + expect(text).toContain('Copyright (c) Wilson Page'); + expect(text).toContain('Permission is hereby granted, free of charge'); + }); + + it('reads the author name from object-form authors', () => { + const text = getFallbackLicenseText('MIT', { name: 'Junyoung Choi' }); + + expect(text).toContain('Copyright (c) Junyoung Choi'); + }); + + it('strips the trailing homepage from npm author strings', () => { + const text = getFallbackLicenseText( + 'MIT', + 'Junyoung Choi (https://rokt33r.github.io)', + ); + + expect(text).toContain('Copyright (c) Junyoung Choi '); + expect(text).not.toContain('rokt33r.github.io'); + }); + + it('omits the copyright line when no author is declared', () => { + const text = getFallbackLicenseText('MIT', undefined); + + expect(text).toContain('Permission is hereby granted, free of charge'); + expect(text).not.toContain('Copyright (c)'); + }); + + it('returns undefined for non-MIT declarations', () => { + expect(getFallbackLicenseText('Apache-2.0', 'Some Author')).toBeUndefined(); + expect(getFallbackLicenseText(undefined, 'Some Author')).toBeUndefined(); + }); +}); From c7ccb74c292420e6216ee339e8122cc213195eb8 Mon Sep 17 00:00:00 2001 From: "jinjing.zzj" Date: Sun, 23 Aug 2026 22:08:38 +0800 Subject: [PATCH 23/57] fix(vscode-ide-companion): show a recoverable error state when the transcript chunk fails to load --- .../src/webview/App.test.tsx | 45 +++++++ .../vscode-ide-companion/src/webview/App.tsx | 113 +++++++++++++----- 2 files changed, 129 insertions(+), 29 deletions(-) diff --git a/packages/vscode-ide-companion/src/webview/App.test.tsx b/packages/vscode-ide-companion/src/webview/App.test.tsx index 5a29993ef35..f83a745d0de 100644 --- a/packages/vscode-ide-companion/src/webview/App.test.tsx +++ b/packages/vscode-ide-companion/src/webview/App.test.tsx @@ -22,6 +22,7 @@ const { mockAddMessage, mockEndStreaming, mockWebShellTranscriptProps, + mockWebShellLoadFailure, } = vi.hoisted(() => ({ mockPostMessage: vi.fn(), mockOpenCompletion: vi.fn().mockResolvedValue(undefined), @@ -49,6 +50,7 @@ const { mockWebShellTranscriptProps: { current: null as null | Record, }, + mockWebShellLoadFailure: { current: false }, })); const slashSkillsItem: CompletionItem = { @@ -331,6 +333,15 @@ vi.mock('./components/layout/InputForm.js', () => ({ vi.mock('@qwen-code/web-shell', () => ({ WebShellTranscript: (props: Record) => { + // Simulate the lazy chunk failing to load (e.g. a retained webview + // fetching a content-hashed chunk that an extension auto-update + // removed). Like a rejected dynamic import, the failure surfaces as a + // render error escaping Suspense, which only an ErrorBoundary catches. + if (mockWebShellLoadFailure.current) { + throw new Error( + 'Failed to fetch dynamically imported module: chunks/web-shell.js', + ); + } mockWebShellTranscriptProps.current = props; return null; }, @@ -432,6 +443,7 @@ describe('App /skills secondary picker', () => { mockInsightState.reportPath = null; mockMessageState.isStreaming = false; mockMessageState.isWaitingForResponse = false; + mockWebShellLoadFailure.current = false; ( globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT?: boolean } ).IS_REACT_ACT_ENVIRONMENT = true; @@ -1032,4 +1044,37 @@ describe('App /skills secondary picker', () => { document.body.removeAttribute('data-vscode-theme-kind'); } }); + + it('shows a recoverable error state instead of blanking the panel when the transcript chunk fails to load', async () => { + mockMessageState.isStreaming = true; + mockWebShellLoadFailure.current = true; + // React logs errors that an error boundary catches; keep output clean. + const consoleErrorSpy = vi + .spyOn(console, 'error') + .mockImplementation(() => {}); + + try { + const rendered = renderApp(); + root = rendered.root; + container = rendered.container; + + await act(async () => {}); + + const fallback = rendered.container.querySelector( + '[data-testid="transcript-load-error"]', + ); + expect(fallback).not.toBeNull(); + expect(fallback?.textContent).toContain('failed to load'); + expect(fallback?.textContent).toContain('Reload panel'); + + // The boundary must be scoped to the transcript subtree: the rest of + // the panel (here the composer) has to survive the chunk failure + // instead of being unmounted with the whole root. + expect( + rendered.container.querySelector('[data-testid="input-field"]'), + ).not.toBeNull(); + } finally { + consoleErrorSpy.mockRestore(); + } + }); }); diff --git a/packages/vscode-ide-companion/src/webview/App.tsx b/packages/vscode-ide-companion/src/webview/App.tsx index 3e335a1c29c..8e0eb578ab8 100644 --- a/packages/vscode-ide-companion/src/webview/App.tsx +++ b/packages/vscode-ide-companion/src/webview/App.tsx @@ -80,6 +80,59 @@ function readVSCodeWebviewTheme(): 'dark' | 'light' { return kind.includes('light') ? 'light' : 'dark'; } +/** + * Keep a failed lazy chunk load from blanking the whole panel. The + * transcript renderer ships as a content-hashed dynamic import, so a + * webview retained across an extension auto-update can request chunk + * hashes that no longer exist in the new bundle. Suspense does not catch + * the rejected import — React rethrows it and unmounts the entire root — + * so catch it here and show a recoverable error state instead. + */ +class TranscriptErrorBoundary extends React.Component< + { children?: React.ReactNode }, + { hasError: boolean } +> { + state: { hasError: boolean } = { hasError: false }; + + static getDerivedStateFromError(): { hasError: boolean } { + return { hasError: true }; + } + + private handleReload = () => { + // A full webview reload re-requests the HTML entry and picks up the + // current bundle, which is the reliable recovery when the stale + // webview is pinned to chunk hashes that no longer exist. + window.location.reload(); + }; + + render(): React.ReactNode { + if (!this.state.hasError) { + return this.props.children; + } + return ( +
+ + The conversation timeline failed to load. + + +
+ ); + } +} + export const App: React.FC = () => { const vscode = useVSCode(); @@ -1015,36 +1068,38 @@ export const App: React.FC = () => { ) ) : ( - - -
- } - > -
} - /> - + > +
+
+ + ); +} + +const iconButtonStyle = { + display: 'inline-flex', + width: 22, + height: 22, + alignItems: 'center', + justifyContent: 'center', + padding: 0, + border: 0, + borderRadius: 3, + background: 'transparent', + color: 'inherit', + cursor: 'pointer', +} as const; diff --git a/packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.ts b/packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.ts index 023f8541663..81bcf618e0e 100644 --- a/packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.ts +++ b/packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.ts @@ -8,7 +8,10 @@ import { logger } from '../../utils/logger.js'; import * as vscode from 'vscode'; import { BaseMessageHandler } from './BaseMessageHandler.js'; import { getFileName } from '../utils/webviewUtils.js'; -import { showDiffCommand } from '../../commands/index.js'; +import { + closeDiffCommand, + showDiffCommand, +} from '../../commands/index.js'; import { findLeftGroupOfChatWebview, findRightGroupOfChatWebview, @@ -57,6 +60,8 @@ export class FileMessageHandler extends BaseMessageHandler { 'getWorkspaceFiles', 'openFile', 'openDiff', + 'openDiffList', + 'closeDiff', 'createAndOpenTempFile', ].includes(messageType); } @@ -225,6 +230,17 @@ export class FileMessageHandler extends BaseMessageHandler { await this.handleOpenDiff(data); break; + case 'openDiffList': + await this.handleOpenDiffList(data); + break; + + case 'closeDiff': + await vscode.commands.executeCommand( + closeDiffCommand, + (data?.path as string) || '', + ); + break; + case 'createAndOpenTempFile': await this.handleCreateAndOpenTempFile(data); break; @@ -624,6 +640,55 @@ export class FileMessageHandler extends BaseMessageHandler { } } + private async handleOpenDiffList( + data: Record | undefined, + ): Promise { + const changes = Array.isArray(data?.changes) + ? (data.changes as Array>) + : []; + if (changes.length === 0) return; + + const selectedPath = data?.selectedPath as string | undefined; + let selected = selectedPath + ? changes.find((change) => change.path === selectedPath) + : undefined; + if (!selected) { + const items = changes.flatMap((change) => { + const path = typeof change.path === 'string' ? change.path : ''; + if (!path) return []; + const additions = Number(change.additions ?? 0); + const deletions = Number(change.deletions ?? 0); + return [ + { + label: getFileName(path), + description: path, + detail: `+${additions} −${deletions}`, + change, + }, + ]; + }); + selected = ( + await vscode.window.showQuickPick(items, { + title: 'Review changes', + placeHolder: 'Select a file to open its diff', + }) + )?.change; + } + if (!selected) return; + + const diffs = Array.isArray(selected.diffs) + ? (selected.diffs as Array>) + : []; + const latest = diffs[diffs.length - 1]; + const path = typeof selected.path === 'string' ? selected.path : ''; + if (!path || !latest) return; + await this.handleOpenDiff({ + path, + oldText: typeof latest.oldText === 'string' ? latest.oldText : '', + newText: typeof latest.newText === 'string' ? latest.newText : '', + }); + } + /** * Create and open temporary readonly file */ diff --git a/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.ts b/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.ts index c7f4e95e184..05c93d5c7d1 100644 --- a/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.ts +++ b/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.ts @@ -93,6 +93,7 @@ export class SessionMessageHandler extends BaseMessageHandler { return [ 'sendMessage', 'editMessage', + 'exportSession', 'newQwenSession', 'switchQwenSession', 'getQwenSessions', @@ -172,6 +173,13 @@ export class SessionMessageHandler extends BaseMessageHandler { ); break; + case 'exportSession': + await this.handleWebShellExport( + (data?.text as string) || '', + (data?.sessionId as string) || undefined, + ); + break; + case 'newQwenSession': await this.handleNewQwenSession(); break; @@ -465,11 +473,14 @@ export class SessionMessageHandler extends BaseMessageHandler { private async handleExportCommand( format: SessionExportFormat, + explicitSessionId?: string, ): Promise { // Prefer the active ACP session id. The local conversation id may still be // a webview-only `conv_*` placeholder after starting a fresh session. const sessionId = - this.agentManager.currentSessionId ?? this.currentConversationId; + explicitSessionId ?? + this.agentManager.currentSessionId ?? + this.currentConversationId; if (!sessionId) { const errorMsg = 'No active session found to export.'; this.sendToWebView({ @@ -502,6 +513,14 @@ export class SessionMessageHandler extends BaseMessageHandler { localOnly: true, }, }); + this.sendToWebView({ + type: 'exportCompleted', + data: { + format: formatLabel, + filename: result.filename, + filePath: result.uri.fsPath, + }, + }); } catch (error) { const errorMsg = this.getErrorMessage(error); logger.error('[SessionMessageHandler] Failed to export session:', error); @@ -512,6 +531,22 @@ export class SessionMessageHandler extends BaseMessageHandler { } } + private async handleWebShellExport( + text: string, + sessionId?: string, + ): Promise { + try { + const format = parseExportSlashCommand(text); + if (!format) return; + await this.handleExportCommand(format, sessionId); + } catch (error) { + this.sendToWebView({ + type: 'error', + data: { message: this.getErrorMessage(error) }, + }); + } + } + /** * Handle send message request */ @@ -741,7 +776,10 @@ export class SessionMessageHandler extends BaseMessageHandler { } // Generate title for first message, but only if it hasn't been set yet - if (isFirstMessage && !this.isTitleSet) { + if ( + isFirstMessage && + (!this.isTitleSet || editTargetTurnIndex === 0) + ) { this.sendToWebView({ type: 'sessionTitleUpdated', data: { diff --git a/packages/vscode-ide-companion/src/webview/providers/WebViewContent.ts b/packages/vscode-ide-companion/src/webview/providers/WebViewContent.ts index 5062b19bbc7..a58bca08f1f 100644 --- a/packages/vscode-ide-companion/src/webview/providers/WebViewContent.ts +++ b/packages/vscode-ide-companion/src/webview/providers/WebViewContent.ts @@ -34,9 +34,9 @@ export class WebViewContent { */ static generate(host: WebviewHost, extensionUri: vscode.Uri): string { const webview = this.getWebview(host); - const scriptUri = webview.asWebviewUri( - vscode.Uri.joinPath(extensionUri, 'dist', 'webview.js'), - ); + const scriptUri = webview + .asWebviewUri(vscode.Uri.joinPath(extensionUri, 'dist', 'webview.js')) + .with({ query: `v=${Date.now()}` }); // Convert extension URI for webview access - this allows frontend to construct resource paths const extensionUriForWebview = webview.asWebviewUri(extensionUri); @@ -48,7 +48,7 @@ export class WebViewContent { // The WebShell transcript bundles Shiki, whose Oniguruma engine compiles // WASM at runtime, and self-contained KaTeX fonts as data URLs, so the CSP // grants both wasm-unsafe-eval and data: fonts. - const csp = `default-src 'none'; img-src ${webview.cspSource} data:; font-src data:; script-src ${webview.cspSource} 'wasm-unsafe-eval'; style-src ${webview.cspSource} 'unsafe-inline';`; + const csp = `default-src 'none'; connect-src http://127.0.0.1:* ws://127.0.0.1:*; img-src ${webview.cspSource} data:; font-src data:; script-src ${webview.cspSource} 'wasm-unsafe-eval'; style-src ${webview.cspSource} 'unsafe-inline';`; return ` diff --git a/packages/vscode-ide-companion/src/webview/providers/WebViewProvider.ts b/packages/vscode-ide-companion/src/webview/providers/WebViewProvider.ts index 1fb191fc675..34a09dc0f77 100644 --- a/packages/vscode-ide-companion/src/webview/providers/WebViewProvider.ts +++ b/packages/vscode-ide-companion/src/webview/providers/WebViewProvider.ts @@ -42,11 +42,26 @@ import { parseInsightMessage, } from '@qwen-code/qwen-code-core'; import { isLogLevel, logger } from '../../utils/logger.js'; +import { QwenDaemonProcess } from '../../services/qwenDaemonProcess.js'; /** Threshold (ms) before a completed task triggers a notification. */ const LONG_TASK_THRESHOLD_MS = 20_000; const MAX_WEBVIEW_LOG_LENGTH = 10_000; +const daemonProcesses = new WeakMap< + vscode.ExtensionContext, + QwenDaemonProcess +>(); + +function getDaemonProcess(context: vscode.ExtensionContext): QwenDaemonProcess { + const current = daemonProcesses.get(context); + if (current) return current; + const daemon = new QwenDaemonProcess(); + daemonProcesses.set(context, daemon); + context.subscriptions.push(daemon); + return daemon; +} + /** Possible tab-dot colours. */ const DotColor = { /** Task completed while tab was not active. */ @@ -94,11 +109,31 @@ function isInsightCommand(command: string): boolean { return firstToken.replace(/^\/+/, '') === 'insight'; } +const WEB_SHELL_SESSION_STATE_PREFIX = 'qwenCode.webShellSessionId:'; + +function getRestorableDaemonSessionId(value: unknown): string | undefined { + if (typeof value !== 'string') return undefined; + const sessionId = value.trim(); + if ( + !sessionId || + /^conv_/i.test(sessionId) || + /^temp(?:$|[-_])/i.test(sessionId) + ) { + return undefined; + } + return sessionId; +} + +function webShellSessionStateKey(workspaceCwd: string): string { + return `${WEB_SHELL_SESSION_STATE_PREFIX}${workspaceCwd}`; +} + export class WebViewProvider { private panelManager: PanelManager; private messageHandler: MessageHandler; private agentManager: QwenAgentManager; private conversationStore: ConversationStore; + private daemonProcess: QwenDaemonProcess; private disposables: vscode.Disposable[] = []; private agentInitialized = false; // Track if agent has been initialized private isSyncingToVSCode = false; // Guard to prevent config change loop @@ -153,6 +188,7 @@ export class WebViewProvider { private context: vscode.ExtensionContext, private extensionUri: vscode.Uri, ) { + this.daemonProcess = getDaemonProcess(context); this.agentManager = new QwenAgentManager(); this.conversationStore = new ConversationStore(context); this.panelManager = new PanelManager(extensionUri, () => { @@ -880,9 +916,8 @@ export class WebViewProvider { }); } - // Re-initialize when the view becomes visible after being hidden, - // in case the agent was never connected (e.g. sidebar opened but collapsed). - // Also reset dotState so it doesn't leak into a future editor-tab panel. + // Re-check authentication when the view becomes visible in case the + // initial connection was never established. webviewView.onDidChangeVisibility(() => { if (webviewView.visible) { this.dotState = null; @@ -900,10 +935,6 @@ export class WebViewProvider { this.disposables.forEach((d) => d.dispose()); }); - // Attempt to restore auth state and initialize connection - logger.log( - '[WebViewProvider] Attempting to restore auth state and connection for view...', - ); await this.attemptAuthStateRestoration(); } @@ -1080,10 +1111,6 @@ export class WebViewProvider { }); } - // Attempt to restore authentication state and initialize connection - logger.log( - '[WebViewProvider] Attempting to restore auth state and connection...', - ); await this.attemptAuthStateRestoration(); } @@ -1753,6 +1780,11 @@ export class WebViewProvider { case 'authError': this.authState = false; break; + case 'authCancelled': + if (this.authState === null) { + this.authState = false; + } + break; default: break; } @@ -1812,6 +1844,20 @@ export class WebViewProvider { } } + private async replayAuthState(webview: vscode.Webview): Promise { + const authenticated = + typeof this.authState === 'boolean' + ? this.authState + : this.agentInitialized + ? Boolean(this.agentManager.currentSessionId) + : null; + if (authenticated === null) return; + await webview.postMessage({ + type: 'authState', + data: { authenticated }, + }); + } + /** * Context-aware handler for the "New Chat" action (openNewChatTab message). * @@ -1862,6 +1908,96 @@ export class WebViewProvider { message: { type: string; data?: unknown }, webview: vscode.Webview, ): Promise { + if (message.type === 'webShellSessionChanged') { + const data = message.data as + | { sessionId?: unknown; workspaceCwd?: unknown } + | undefined; + const sessionId = getRestorableDaemonSessionId(data?.sessionId) ?? null; + this.messageHandler.setCurrentConversationId(sessionId); + if (this.isViewHost && typeof data?.workspaceCwd === 'string') { + await this.context.workspaceState.update( + webShellSessionStateKey(data.workspaceCwd), + sessionId ?? undefined, + ); + } + return true; + } + if (message.type === 'webShellReady') { + const workspaceCwd = + (vscode.window.activeTextEditor + ? vscode.workspace.getWorkspaceFolder( + vscode.window.activeTextEditor.document.uri, + )?.uri.fsPath + : undefined) ?? vscode.workspace.workspaceFolders?.[0]?.uri.fsPath; + if (!workspaceCwd) { + await webview.postMessage({ + type: 'webShellBootstrapError', + data: { message: 'Open a folder to use Qwen Code.' }, + }); + return true; + } + try { + const runtime = await this.daemonProcess.start( + resolveQwenCliEntryPath( + this.extensionUri, + this.context.extensionMode, + ), + workspaceCwd, + ); + const serializedSessionId = getRestorableDaemonSessionId( + this.messageHandler.getCurrentConversationId(), + ); + const viewSessionId = this.isViewHost + ? getRestorableDaemonSessionId( + this.context.workspaceState.get( + webShellSessionStateKey(workspaceCwd), + ), + ) + : undefined; + const restoredSessionId = this.isViewHost + ? viewSessionId + : serializedSessionId; + await webview.postMessage({ + type: 'webShellBootstrap', + data: { + ...runtime, + workspaceCwd, + hostKind: this.isViewHost ? 'view' : 'panel', + ...(restoredSessionId ? { sessionId: restoredSessionId } : {}), + }, + }); + await this.replayAuthState(webview); + const editor = vscode.window.activeTextEditor; + if (editor) { + const filePath = editor.document.uri.fsPath || null; + await webview.postMessage({ + type: 'activeEditorChanged', + data: { + fileName: filePath ? getFileName(filePath) : null, + filePath, + selection: editor.selection.isEmpty + ? null + : { + startLine: editor.selection.start.line + 1, + endLine: editor.selection.end.line + 1, + }, + }, + }); + } + } catch (error) { + logger.error( + '[WebViewProvider] Failed to start WebShell daemon:', + error, + ); + await webview.postMessage({ + type: 'webShellBootstrapError', + data: { + message: error instanceof Error ? error.message : String(error), + }, + }); + } + return true; + } if (message.type === 'log') { const data = message.data as | { level?: unknown; message?: unknown } @@ -1879,7 +2015,8 @@ export class WebViewProvider { return true; } if (message.type === 'openDiff' && this.isAutoMode()) { - return true; + const source = (message.data as { source?: unknown } | undefined)?.source; + if (source !== 'web-shell') return true; } if (message.type === 'webviewReady') { this.handleWebviewReady(); @@ -2446,10 +2583,6 @@ export class WebViewProvider { logger.log('[WebViewProvider] Panel restored successfully'); - // Attempt to restore authentication state and initialize connection - logger.log( - '[WebViewProvider] Attempting to restore auth state and connection after restore...', - ); await this.attemptAuthStateRestoration(); } diff --git a/packages/vscode-ide-companion/src/webview/utils/copyTranscript.ts b/packages/vscode-ide-companion/src/webview/utils/copyTranscript.ts index 4af6283d9a9..c43c07803a1 100644 --- a/packages/vscode-ide-companion/src/webview/utils/copyTranscript.ts +++ b/packages/vscode-ide-companion/src/webview/utils/copyTranscript.ts @@ -17,12 +17,34 @@ import type { DaemonTranscriptBlock } from '@qwen-code/sdk/daemon'; +function getTextBlockCopyText( + block: Extract< + DaemonTranscriptBlock, + { kind: 'user' | 'assistant' | 'thought' } + >, +): string | null { + const parts = [ + block.text.trim(), + ...(block.images ?? []).map((image) => `![image](${image.data})`), + ].filter(Boolean); + return parts.length > 0 ? parts.join('\n\n') : null; +} + +function buildFence(content: string): string { + const longestRun = Math.max( + 0, + ...Array.from(content.matchAll(/`+/g), (match) => match[0].length), + ); + return '`'.repeat(Math.max(3, longestRun + 1)); +} + /** Plain-text payload of one block, or null when it carries no copyable text. */ export function getBlockCopyText(block: DaemonTranscriptBlock): string | null { switch (block.kind) { case 'user': case 'assistant': case 'thought': + return getTextBlockCopyText(block); case 'status': case 'error': case 'debug': @@ -89,7 +111,10 @@ export function formatBlocksForCopyAll( } if (block.kind === 'tool') { const label = block.toolKind ?? block.toolName ?? 'tool'; - parts.push(`**[Tool: ${label}]**\n\n${content}`); + const toolParts = getToolContentCopyParts(block, true); + parts.push( + `**[Tool: ${label}]**\n\n${toolParts.length > 0 ? toolParts.join('\n\n') : content}`, + ); } else if (block.kind === 'status') { parts.push(`**Status:** ${content}`); } else if (block.kind === 'user_shell') { @@ -110,7 +135,7 @@ export function formatBlocksForCopyAll( ) { continue; } - const content = block.text.trim(); + const content = getTextBlockCopyText(block); if (!content) { continue; } @@ -143,7 +168,10 @@ export function findLastAssistantText( * Mirrors the shapes `normalizeToolContent` accepts in web-shell and the * `---/+++` diff rendering of the pre-PR `formatToolCallForCopy`. */ -function getToolContentCopyParts(block: { content?: unknown }): string[] { +function getToolContentCopyParts( + block: { content?: unknown }, + wrapCodeBlock = false, +): string[] { if (!Array.isArray(block.content)) { return []; } @@ -160,7 +188,12 @@ function getToolContentCopyParts(block: { content?: unknown }): string[] { typeof body === 'object' && typeof (body as Record).text === 'string' ) { - parts.push((body as Record).text as string); + const text = (body as Record).text as string; + parts.push( + wrapCodeBlock + ? `${buildFence(text)}\n${text}\n${buildFence(text)}` + : text, + ); } continue; } @@ -176,11 +209,19 @@ function getToolContentCopyParts(block: { content?: unknown }): string[] { .split('\n') .map((line) => `+${line}`) .join('\n'); + const diff = `--- ${filePath}\n+++ ${filePath}\n${oldLines}\n${newLines}`; parts.push( - `--- ${filePath}\n+++ ${filePath}\n${oldLines}\n${newLines}`, + wrapCodeBlock + ? `${buildFence(diff)}diff\n${diff}\n${buildFence(diff)}` + : diff, ); } else { - parts.push(`${filePath}:\n${record.newText}`); + const text = record.newText; + parts.push( + wrapCodeBlock + ? `${filePath}:\n${buildFence(text)}\n${text}\n${buildFence(text)}` + : `${filePath}:\n${text}`, + ); } } } diff --git a/packages/web-shell/client/App.tsx b/packages/web-shell/client/App.tsx index 708a525607b..5684969574d 100644 --- a/packages/web-shell/client/App.tsx +++ b/packages/web-shell/client/App.tsx @@ -276,7 +276,12 @@ import { } from './utils/composerInputState'; import { isDefinitelyRejectedPromptAdmission } from './utils/promptAdmission'; import { base64ToBlob } from './utils/base64'; -import type { ACPToolCall, Message, PermissionRequest } from './adapters/types'; +import type { + ACPToolCall, + CommandInfo, + Message, + PermissionRequest, +} from './adapters/types'; import { backgroundShellTaskId, isBackgroundSubAgentToolCall, @@ -913,6 +918,11 @@ export interface WebShellProps { workspaceId?: string, workspaceCwd?: string, ) => void; + /** Called when the active session id or display name changes. */ + onSessionInfoChange?: (session: { + sessionId?: string; + sessionName?: string; + }) => void; /** Called after a new session is created. Session setup waits up to 30 seconds. */ onSessionCreated?: (sessionId: string) => Promise | void; /** Visual theme for the embedded shell. */ @@ -954,6 +964,12 @@ export interface WebShellProps { * a turn output such as review changes, an artifact, or a scheduled task. */ onRightPanelOpen?: (request: TurnOutputOpenRequest) => void; + /** Override file-review links without replacing the other right panels. */ + onFileReviewOpen?: ( + request: Extract, + ) => void; + /** Open a completed Insight report in a host-native surface. */ + onInsightReportOpen?: (path: string) => void; /** * Controls which turn output cards appear below messages. Defaults to all. */ @@ -962,6 +978,26 @@ export interface WebShellProps { shellRef?: React.Ref; /** Built-in composer toolbar actions to show. Defaults to all actions. */ composerToolbarActions?: readonly ComposerToolbarAction[]; + /** Stack completion details vertically for narrow embedded hosts. */ + compactComposerOverlays?: boolean; + /** Submit slash items marked as immediate actions when selected. */ + autoSubmitSlashCommands?: boolean; + /** Host-only slash entries or presentation overrides. */ + additionalSlashCommands?: readonly CommandInfo[]; + /** Keep Context Usage available while restored-session usage is loading. */ + contextUsageAlwaysVisible?: boolean; + /** Let the host expose the last user turn's edit-and-resend action. */ + userMessageEditing?: boolean; + /** + * Called before WebShell starts its built-in user-message edit flow. Return + * true when the host owns the edit-and-resend lifecycle. + */ + onUserMessageEditRequest?: ( + turnIndex: number, + content: string, + ) => boolean | void; + /** Cycle the approval mode when an otherwise-unhandled Tab is pressed. */ + cycleModeOnTab?: boolean; /** * Main-composer copy by semantic state. Omitted or blank entries retain the * WebShell localized default; shell-mode and follow-up copy still wins. @@ -1137,6 +1173,7 @@ type SessionActionsWithCreate = { }; const emptyComposerApi: WebShellComposerApi = { + focus: () => {}, insertText: () => {}, setText: () => {}, addTags: () => {}, @@ -1874,6 +1911,7 @@ function readScopedModelSetting( export function App({ onSessionIdChange, + onSessionInfoChange, onSessionCreated, theme: providedTheme, onThemeChange, @@ -1921,9 +1959,18 @@ export function App({ onSplitSessionIdsChange, renderPaneHeaderActions, onRightPanelOpen, + onFileReviewOpen, + onInsightReportOpen, messageTurnOutputs, shellRef, composerToolbarActions, + compactComposerOverlays = false, + autoSubmitSlashCommands = false, + additionalSlashCommands = [], + contextUsageAlwaysVisible = false, + userMessageEditing = false, + onUserMessageEditRequest, + cycleModeOnTab = false, composerPlaceholders, compactThinking = false, collapseCompletedTurns = true, @@ -3722,6 +3769,10 @@ export function App({ ); const handleTurnOutputOpen = useCallback( (request: TurnOutputOpenRequest) => { + if (request.kind === 'review' && onFileReviewOpen) { + onFileReviewOpen(request); + return; + } if (onRightPanelOpen) { onRightPanelOpen(request); return; @@ -3819,6 +3870,7 @@ export function App({ }, [ getDefaultReviewPanelWidth, + onFileReviewOpen, onRightPanelOpen, openReviewPanel, openScheduledTaskPanel, @@ -5739,6 +5791,16 @@ export function App({ return false; }, [pushToast, t]); const sessionDisplayName = connection.displayName ?? sessionStatusDisplayName; + useEffect(() => { + onSessionInfoChange?.({ + sessionId: connection.sessionId, + sessionName: sessionDisplayName, + }); + }, [ + connection.sessionId, + onSessionInfoChange, + sessionDisplayName, + ]); const [currentMode, setCurrentMode] = useState('default'); const currentModeRef = useRef(currentMode); currentModeRef.current = currentMode; @@ -9130,6 +9192,35 @@ export function App({ [sessionActions], ); + const editUserMessage = useCallback( + async (turnIndex: number, content: string) => { + if (onUserMessageEditRequest?.(turnIndex, content) === true) return; + + const restoreComposer = () => { + editorRef.current?.setText(content); + editorRef.current?.focus(); + }; + + restoreComposer(); + window.setTimeout(restoreComposer, 0); + try { + const { snapshots } = await sessionActions.getRewindSnapshots(); + const snapshot = snapshots.find( + (entry) => entry.turnIndex === turnIndex, + ); + if (!snapshot) throw new Error(t('rewind.empty')); + await sessionActions.rewindSession(snapshot.promptId, { + rewindFiles: false, + }); + } catch (error) { + reportError(error, t('rewind.failed', { reason: String(error) })); + } finally { + restoreComposer(); + } + }, + [onUserMessageEditRequest, reportError, sessionActions, t], + ); + const handleRewindError = useCallback( (error: unknown) => { if (isAlreadyDispatched(error)) return; @@ -11311,6 +11402,7 @@ export function App({ retainedCommands, refreshedSkillCommands, getLocalCommands(t, { sideTaskAvailable: sideTasksAvailable }), + [...additionalSlashCommands], ), t, ) @@ -11327,6 +11419,7 @@ export function App({ }; }); }, [ + additionalSlashCommands, connection.commands, connection.skills, hiddenCommands, @@ -12846,6 +12939,15 @@ export function App({ : visibleFailedPromptBlock?.id } onRetryFailedPrompt={handleFailedPromptRetry} + onEditUserMessage={ + userMessageEditing + ? (turnIndex, content) => + void editUserMessage( + turnIndex, + content, + ) + : undefined + } onBranchSession={handleBranchCurrentSession} bottomOverlayInset={bottomPanelInset} welcomeHeader={ @@ -12878,6 +12980,7 @@ export function App({ onTurnOutputOpen={handleTurnOutputOpen} onImagePreview={openImagePanel} onAttachmentPreview={openAttachmentPanel} + onInsightReportOpen={onInsightReportOpen} onReviewChanges={openReviewPanel} onOpenArtifact={openArtifactPanel} onOpenScheduledTask={openScheduledTaskPanel} @@ -13205,6 +13308,7 @@ export function App({ )} = { { name: 'zh-CN', description: '中文' }, ], }, - { name: 'output', description: '设置 LLM 输出语言' }, + { + name: 'output', + description: '设置 LLM 输出语言', + argumentHint: '<语言>', + }, ], extensions: [ { name: 'manage', description: '管理扩展' }, - { name: 'install', description: '安装扩展' }, + { + name: 'install', + description: '安装扩展', + argumentHint: '<来源>', + }, ], }; @@ -107,11 +118,19 @@ const SUBCOMMAND_TREE_EN: Record = { { name: 'zh-CN', description: '中文' }, ], }, - { name: 'output', description: 'Set LLM output language' }, + { + name: 'output', + description: 'Set LLM output language', + argumentHint: '', + }, ], extensions: [ { name: 'manage', description: 'Manage installed extensions' }, - { name: 'install', description: 'Install an extension from a source' }, + { + name: 'install', + description: 'Install an extension from a source', + argumentHint: '', + }, ], }; @@ -169,12 +188,14 @@ function resolveSubcommands( dynamicSkills: SkillInfo[] | undefined, language: WebShellLanguage, commandSubcommands?: string[], + commandArgumentHint?: string, ): SubcommandNode[] | null { if (cmdName === 'skills' && parts.length === 0) { if (!dynamicSkills || dynamicSkills.length === 0) return null; return dynamicSkills.map((s) => ({ name: s.name, description: s.description, + ...(s.argumentHint ? { argumentHint: s.argumentHint } : {}), })); } @@ -190,10 +211,14 @@ function resolveSubcommands( } if (!nodes && parts.length === 0 && commandSubcommands?.length) { - nodes = commandSubcommands.map((name) => ({ - name, - description: '', - })); + nodes = commandSubcommands.map((name) => { + const argumentHint = getSubcommandArgumentHint(commandArgumentHint, name); + return { + name, + description: '', + ...(argumentHint ? { argumentHint } : {}), + }; + }); } if (!nodes) return null; @@ -206,6 +231,25 @@ function resolveSubcommands( return nodes; } +function escapeRegExp(value: string): string { + return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +} + +/** Preserve an argument-bearing suffix from a server command's hint. */ +function getSubcommandArgumentHint( + argumentHint: string | undefined, + name: string, +): string | undefined { + if (!argumentHint) return undefined; + const match = argumentHint.match( + new RegExp( + `(?:^|\\||\\[)\\s*${escapeRegExp(name)}(?:\\s+([^|\\]]+))?`, + ), + ); + const suffix = match?.[1]?.trim(); + return suffix || undefined; +} + function comparePrefixFirst(a: string, b: string, query: string): number { const aLower = a.toLowerCase(); const bLower = b.toLowerCase(); @@ -221,11 +265,25 @@ function compareSlashCommands( query: string, categoryOrder: CommandDisplayCategoryOrder, ): number { + const priority = (a.completionPriority ?? 0) - (b.completionPriority ?? 0); + if (priority !== 0) return priority; const order = compareCommandsByCategory(a, b, categoryOrder); if (order !== 0) return order; return query ? comparePrefixFirst(a.name, b.name, query) : 0; } +function hasSubcommandPicker( + command: CommandInfo, + language: WebShellLanguage, +): boolean { + const tree = language === 'zh-CN' ? SUBCOMMAND_TREE_ZH : SUBCOMMAND_TREE_EN; + return ( + command.name === 'skills' || + Boolean(command.subcommands?.length) || + Boolean(tree[command.name]) + ); +} + const COMMAND_SECTION_KEYS: Record = { custom: 'slash.category.custom', skill: 'slash.category.skill', @@ -296,13 +354,42 @@ export function getSlashCommandArgumentHint( commands: CommandInfo[], language: WebShellLanguage, ): string | null { - const match = text.match(new RegExp(`^/${COMMAND_NAME_PATTERN}(\\s*)$`)); + const match = text.match( + new RegExp(`^/${COMMAND_NAME_PATTERN}(?:\\s+(.*?))?\\s*$`), + ); if (!match) return null; const cmdName = match[1]; const cmd = commands.find((c) => c.name === cmdName); if (!cmd) return null; + const subcommandPath = match[2]?.trim(); + if (subcommandPath) { + const parts = subcommandPath.split(/\s+/); + if (cmdName === 'skills' && parts.length === 1) { + return ( + commands.find((command) => command.name === parts[0])?.argumentHint ?? + null + ); + } + + let nodes = resolveSubcommands( + cmdName, + [], + [], + language, + cmd.subcommands, + cmd.argumentHint, + ); + let selected: SubcommandNode | undefined; + for (const part of parts) { + selected = nodes?.find((node) => node.name === part); + if (!selected) return null; + nodes = selected.children ?? null; + } + return selected?.argumentHint?.trim() || null; + } + const argumentHint = cmd.argumentHint?.trim(); if (argumentHint) return argumentHint; @@ -444,6 +531,7 @@ export function getSlashCommandCompletionResult( skills, language, cmd?.subcommands, + cmd?.argumentHint, ); if (!nodes) return null; @@ -465,8 +553,14 @@ export function getSlashCommandCompletionResult( id: command, label: node.name, detail: node.description || undefined, + ...(node.argumentHint + ? { argumentHint: node.argumentHint } + : {}), apply: `${command} `, ...(isSkillList ? { type: 'skill' as const } : {}), + ...(!node.children?.length && !node.argumentHint + ? { autoSubmit: true } + : {}), }; }); @@ -502,19 +596,30 @@ export function getSlashCommandCompletionResult( const showCommandInfo = category === 'custom' || category === 'skill'; return { id: command.name, - label: `/${command.name}`, + label: command.completionLabel || `/${command.name}`, detail: command.description || undefined, + ...(!command.autoSubmit && command.argumentHint + ? { argumentHint: command.argumentHint } + : {}), apply, category, // Section headers only make sense while browsing the category-ordered // list; a relevance-ranked result set interleaves categories, so headers // would appear before nearly every row. Drop them during search. ...(isBrowsing - ? { section: translate(COMMAND_SECTION_KEYS[category]) } + ? { + section: + command.completionSection || + translate(COMMAND_SECTION_KEYS[category]), + } : {}), ...(showCommandInfo && command.description ? { type: 'command-info' as const } : {}), + ...(command.autoSubmit && + !hasSubcommandPicker(command, language) + ? { autoSubmit: true } + : {}), }; }); @@ -581,6 +686,7 @@ export function slashCompletionSource( getSkills(), language, cmd?.subcommands, + cmd?.argumentHint, ); if (!nodes) return null; @@ -607,7 +713,11 @@ export function slashCompletionSource( } : {}), detail: n.description || undefined, + ...(n.argumentHint ? { argumentHint: n.argumentHint } : {}), apply: `${command} `, + ...(n.children?.length || n.argumentHint + ? {} + : { autoSubmit: true }), }; }); diff --git a/packages/web-shell/client/components/AtMentionPanel.tsx b/packages/web-shell/client/components/AtMentionPanel.tsx index fc63afaee6c..c1cca577e54 100644 --- a/packages/web-shell/client/components/AtMentionPanel.tsx +++ b/packages/web-shell/client/components/AtMentionPanel.tsx @@ -35,6 +35,7 @@ export function AtMentionPanel({ menu, anchorRef, panelRef, + compact, onSelect, onAccept, onBack, @@ -44,6 +45,7 @@ export function AtMentionPanel({ menu: AtMentionMenuState; anchorRef: RefObject; panelRef: RefObject; + compact?: boolean; onSelect: (index: number) => boolean; onAccept: (index?: number) => boolean; onBack: () => boolean; @@ -117,8 +119,11 @@ export function AtMentionPanel({ const maxHeight = Math.max(96, Math.min(300, rect.top - safeTop - 8)); const next = { left: Math.max( - 12, - Math.min(rect.left + 16, window.innerWidth - panelWidth - 12), + compact ? 8 : 12, + Math.min( + rect.left + (compact ? 0 : 16), + window.innerWidth - panelWidth - (compact ? 8 : 12), + ), ), bottom: window.innerHeight - rect.top + 8, width: rect.width, @@ -158,7 +163,7 @@ export function AtMentionPanel({ window.removeEventListener('resize', scheduleUpdatePosition); window.removeEventListener('scroll', scheduleUpdatePosition, true); }; - }, [anchorRef, panelRef]); + }, [anchorRef, compact, panelRef]); const rows = menu.level === 'categories' @@ -223,6 +228,7 @@ export function AtMentionPanel({ ref={panelRef} className={styles.atPanel} data-at-mention-panel="true" + data-web-shell-compact-overlay={compact ? '' : undefined} style={ { ...themeVars, diff --git a/packages/web-shell/client/components/ChatEditor.module.css b/packages/web-shell/client/components/ChatEditor.module.css index d2afb34c0e3..3d1954ea12a 100644 --- a/packages/web-shell/client/components/ChatEditor.module.css +++ b/packages/web-shell/client/components/ChatEditor.module.css @@ -4,6 +4,13 @@ margin: 0 0 14px; } +.editorShell[data-web-shell-compact-composer] { + width: 100%; + min-width: 0; + box-sizing: border-box; + margin-bottom: 8px; +} + .editorShellDropdownOpen { z-index: 7; } @@ -27,6 +34,12 @@ --chat-send-button-foreground: #fafafa; } +.editorShell[data-web-shell-compact-composer] .container { + width: 100%; + min-width: 0; + box-sizing: border-box; +} + .content { position: relative; z-index: 2; @@ -43,6 +56,10 @@ padding: 12px; } +.editorShell[data-web-shell-compact-composer] .content { + padding: 10px; +} + .container[data-image-drag-active] .content { border-color: var(--primary); background: color-mix( @@ -209,6 +226,17 @@ overflow: hidden; } +:global([data-web-shell-slash-menu][data-web-shell-compact-overlay]) { + width: min(360px, calc(100vw - 16px)); + max-width: min( + var(--radix-popover-content-available-width), + calc(100vw - 16px) + ); + box-sizing: border-box; + min-width: 0; + padding: 6px; +} + :global([data-web-shell-slash-detail]) { z-index: calc(var(--web-shell-popover-z-index, 1000) + 1); width: min(320px, calc(100vw - 24px)); @@ -222,6 +250,26 @@ overflow: hidden; } +:global( + [data-web-shell-toolbar-popover][data-web-shell-compact-overlay] + ) { + width: min(360px, calc(100vw - 16px)); + max-width: calc(100vw - 16px); + box-sizing: border-box; + padding: 6px; +} + +:global( + [data-web-shell-toolbar-popover][data-web-shell-compact-overlay] + ) + .dropdownItemDesc { + display: -webkit-box; + overflow-wrap: anywhere; + white-space: normal; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} + :global([data-web-shell-reasoning-popover]) { overflow-x: hidden; overflow-y: auto; @@ -331,6 +379,44 @@ column-gap: 0; } +:global([data-web-shell-slash-menu][data-web-shell-compact-overlay]) + .slashItem { + display: flex; + align-items: stretch; + flex-direction: column; + gap: 1px; + padding: 6px 8px; +} + +:global([data-web-shell-slash-menu][data-web-shell-compact-overlay]) + .slashDescription { + display: none; + overflow-wrap: anywhere; + text-align: left; + white-space: normal; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} + +:global([data-web-shell-slash-menu][data-web-shell-compact-overlay]) + .slashItemActive + .slashDescription { + display: -webkit-box; +} + +:global([data-web-shell-slash-menu][data-web-shell-compact-overlay]) + .slashCommand { + min-width: 0; + overflow-wrap: anywhere; + text-overflow: clip; + white-space: normal; +} + +:global([data-web-shell-slash-menu][data-web-shell-compact-overlay]) + .slashSectionCount { + display: none; +} + .slashItem:hover, .slashItemActive { background: var(--accent); @@ -381,6 +467,12 @@ white-space: nowrap; } +.slashArgumentHint { + color: var(--muted-foreground); + font-size: 12px; + font-weight: 400; +} + .slashDescription { min-width: 0; overflow: hidden; @@ -417,6 +509,29 @@ line-height: 1.35; } +.atPanel[data-web-shell-compact-overlay] { + width: min(360px, calc(100vw - 16px)); + padding: 4px; +} + +.atPanel[data-web-shell-compact-overlay] .atItemDescription { + overflow-wrap: anywhere; + white-space: normal; +} + +.atPanel[data-web-shell-compact-overlay] .atItemMain { + grid-template-columns: minmax(0, 1fr); + row-gap: 1px; +} + +.atPanel[data-web-shell-compact-overlay] .atItemSubtitle { + justify-self: start; + overflow-wrap: anywhere; + text-align: left; + text-overflow: clip; + white-space: normal; +} + .atPanelHeaderWrap { flex: 0 0 auto; padding: 3px 4px 7px; @@ -945,6 +1060,10 @@ gap: 8px; } +.editorShell[data-web-shell-compact-composer] .toolbar { + gap: 4px; +} + .toolbarLeading, .toolbarStart, .toolbarEnd, @@ -960,6 +1079,10 @@ min-width: 0; } +.editorShell[data-web-shell-compact-composer] .toolbarLeading { + margin-left: 0; +} + .toolbar[data-mobile-voice-active='true'] .toolbarLeading, .toolbar[data-mobile-voice-active='true'] [data-hide-during-mobile-voice] { display: none; @@ -1193,6 +1316,27 @@ margin-right: -5px; } +.editorShell[data-web-shell-compact-composer] .toolbarRight { + gap: 0; + margin-right: 0; +} + +.editorShell[data-web-shell-compact-composer] + .toolbarRight + button[data-available] { + width: 28px; + height: 28px; + border-radius: 6px; +} + +.editorShell[data-web-shell-compact-composer] + .toolbarRight + button + svg { + width: 16px; + height: 16px; +} + .toolbarRightCustom { display: inline-flex; min-width: 0; diff --git a/packages/web-shell/client/components/ChatEditor.tsx b/packages/web-shell/client/components/ChatEditor.tsx index 950aad5777c..4bf83889134 100644 --- a/packages/web-shell/client/components/ChatEditor.tsx +++ b/packages/web-shell/client/components/ChatEditor.tsx @@ -83,6 +83,7 @@ import { ChevronRightIcon, FolderClosedIcon, LoaderCircleIcon, + SlashIcon, UploadIcon, XIcon, } from 'lucide-react'; @@ -153,6 +154,7 @@ function collectDroppedFiles(dataTransfer: DataTransfer): File[] { const ACTIVE_TOOLBAR_ACTIONS = [ 'approvalMode', + 'commands', 'contextUsage', 'gitBranch', 'model', @@ -175,6 +177,7 @@ interface ChatEditorProps { onInputTextChange?: (text: string) => void; onAttachmentsChange?: (hasAttachments: boolean) => void; onCycleMode?: () => void; + cycleModeOnTab?: boolean; onToggleShortcuts?: () => void; onCancel?: () => void; isRunning?: boolean; @@ -186,6 +189,7 @@ interface ChatEditorProps { commands: CommandInfo[]; skills?: SkillInfo[]; slashCommandCategoryOrder?: CommandDisplayCategoryOrder; + autoSubmitSlashCommands?: boolean; queuedMessages?: string[]; onPopQueuedMessages?: () => boolean; onClearQueuedMessages?: () => boolean; @@ -223,6 +227,8 @@ interface ChatEditorProps { /** Current context-window occupancy for the `contextUsage` toolbar ring. */ tokenCount?: number; contextWindow?: number; + /** Keep Context Usage available before a restored session reports usage. */ + contextUsageAlwaysVisible?: boolean; /** Show the context-usage breakdown, exactly like typing /context. */ onShowContextUsage?: () => void; availableModels?: Array<{ id: string; label?: string }>; @@ -265,6 +271,7 @@ interface ChatEditorProps { /** Click a pasted image in the composer to preview it in the right panel. */ onImagePreview?: (src: string, alt?: string) => void; onAttachmentPreview?: (file: AttachmentPreviewRequest) => void; + compactOverlays?: boolean; } const CHAT_EDITOR_THEME = { @@ -790,6 +797,7 @@ function ToolbarPopover({ noResultsLabel, header, submenu, + compact = false, }: { open: boolean; items: DropdownItem[]; @@ -808,6 +816,7 @@ function ToolbarPopover({ triggerAriaLabel: string; sectionLabel: string; }; + compact?: boolean; }) { const [searchQuery, setSearchQuery] = useState(''); const [submenuOpen, setSubmenuOpen] = useState(false); @@ -956,6 +965,7 @@ function ToolbarPopover({ collisionPadding={8} collisionBoundary={collisionBoundary ?? undefined} data-web-shell-toolbar-popover + data-web-shell-compact-overlay={compact ? '' : undefined} data-web-shell-reasoning-popover={submenu ? '' : undefined} onClick={(event) => event.stopPropagation()} onOpenAutoFocus={(event) => { @@ -1124,6 +1134,7 @@ function SlashCommandPanel({ anchorRef, panelRef, detailRef, + compact, onClose, onSelect, onAccept, @@ -1132,6 +1143,7 @@ function SlashCommandPanel({ anchorRef: RefObject; panelRef: RefObject; detailRef: RefObject; + compact?: boolean; onClose: () => void; onSelect: (index: number) => boolean; onAccept: (index?: number) => boolean; @@ -1209,14 +1221,15 @@ function SlashCommandPanel({ ref={panelRef} side="top" align="start" - alignOffset={16} - sideOffset={8} - avoidCollisions={false} - collisionPadding={12} + alignOffset={compact ? 0 : 16} + sideOffset={compact ? 6 : 8} + avoidCollisions={compact} + collisionPadding={compact ? 8 : 12} collisionBoundary={collisionBoundary ?? undefined} className="duration-0 data-open:animate-none data-closed:animate-none" role="listbox" data-web-shell-slash-menu + data-web-shell-compact-overlay={compact ? '' : undefined} onOpenAutoFocus={(event) => event.preventDefault()} onCloseAutoFocus={(event) => event.preventDefault()} onInteractOutside={(event) => { @@ -1284,7 +1297,7 @@ function SlashCommandPanel({ }`} onMouseEnter={(event) => { onSelect(index); - if (!item.detail) { + if (!item.detail || compact) { setHoverDetail(null); return; } @@ -1322,6 +1335,12 @@ function SlashCommandPanel({ > {item.label} + {item.argumentHint && ( + + {' '} + {item.argumentHint} + + )} {item.detail && ( @@ -1338,7 +1357,7 @@ function SlashCommandPanel({ { if (!open) setHoverDetail(null); }} @@ -1447,6 +1466,7 @@ export const ChatEditor = memo( onInputTextChange, onAttachmentsChange, onCycleMode, + cycleModeOnTab = false, onToggleShortcuts, onCancel, isRunning = false, @@ -1457,6 +1477,7 @@ export const ChatEditor = memo( commands, skills = [], slashCommandCategoryOrder, + autoSubmitSlashCommands = false, queuedMessages = [], onPopQueuedMessages, currentMode = 'default', @@ -1479,6 +1500,7 @@ export const ChatEditor = memo( visibleToolbarActions, tokenCount = 0, contextWindow = 0, + contextUsageAlwaysVisible = false, onShowContextUsage, availableModels = [], onSelectMode, @@ -1513,6 +1535,7 @@ export const ChatEditor = memo( onImageIngestionNotice, onImagePreview, onAttachmentPreview, + compactOverlays = false, } = props; const { @@ -1641,6 +1664,7 @@ export const ChatEditor = memo( onSubmit, onInputTextChange, onCycleMode, + cycleModeOnTab, onToggleShortcuts, disabled, fileDragEnabled: fileUploadEnabled !== false, @@ -1648,6 +1672,7 @@ export const ChatEditor = memo( commands, skills, slashCommandCategoryOrder, + autoSubmitSlashCommands, queuedMessages, onPopQueuedMessages, currentMode, @@ -2041,6 +2066,7 @@ export const ChatEditor = memo( }; const showModeAction = showToolbarAction('approvalMode'); const showModelAction = showToolbarAction('model'); + const showCommandAction = showToolbarAction('commands'); const commandNames = useMemo( () => new Set(commands.map((command) => command.name.replace(/^\/+/, ''))), @@ -2542,6 +2568,7 @@ export const ChatEditor = memo( }`} data-composer data-web-shell-composer + data-web-shell-compact-composer={compactOverlays ? '' : undefined} onDragOver={cancelShellFileDrag} onDrop={cancelShellFileDrag} > @@ -2905,9 +2932,10 @@ export const ChatEditor = memo( anchorRef={containerRef} panelRef={slashPanelRef} detailRef={slashDetailRef} + compact={compactOverlays} onClose={core.closeSlashMenu} onSelect={core.selectSlashCompletion} - onAccept={core.acceptSlashCompletion} + onAccept={(index) => core.acceptSlashCompletion(index, true)} /> )} {core.atMenu && ( @@ -2915,6 +2943,7 @@ export const ChatEditor = memo( menu={core.atMenu} anchorRef={containerRef} panelRef={atPanelRef} + compact={compactOverlays} onSelect={core.selectAtCompletion} onAccept={core.acceptAtCompletion} onBack={() => { @@ -3058,6 +3087,7 @@ export const ChatEditor = memo( }`} > )} {showToolbarAction('contextUsage') && - contextWindow > 0 && - tokenCount > 0 && ( + (contextUsageAlwaysVisible || + (contextWindow > 0 && tokenCount > 0)) && ( @@ -3269,25 +3300,60 @@ export const ChatEditor = memo( onShowContextUsage?.(); }} disabled={!onShowContextUsage} - aria-label={t('status.contextUsed', { - pct: ((tokenCount / contextWindow) * 100).toFixed( - 1, - ), - })} + aria-label={ + contextWindow > 0 && tokenCount > 0 + ? t('status.contextUsed', { + pct: ( + (tokenCount / contextWindow) * + 100 + ).toFixed(1), + }) + : t('contextUsage.title') + } > 0 + ? (tokenCount / contextWindow) * 100 + : 0 + } /> - {formatContextUsageDetail(tokenCount, contextWindow)} + {contextWindow > 0 && tokenCount > 0 + ? formatContextUsageDetail( + tokenCount, + contextWindow, + ) + : t('contextUsage.title')} )} + {showCommandAction && ( + + )} {showToolbarAction('voice') && ( <> diff --git a/packages/web-shell/client/components/InsightProgress.module.css b/packages/web-shell/client/components/InsightProgress.module.css index 5a33971bfc2..5f44fa30dc0 100644 --- a/packages/web-shell/client/components/InsightProgress.module.css +++ b/packages/web-shell/client/components/InsightProgress.module.css @@ -57,3 +57,27 @@ color: var(--muted-foreground); font-size: 12px; } + +.pathButton { + appearance: none; + border: 0; + padding: 0; + background: transparent; + font-family: inherit; + font-weight: inherit; + line-height: inherit; + text-align: left; + text-decoration: underline; + text-underline-offset: 2px; + cursor: pointer; +} + +.pathButton:hover { + color: var(--foreground); +} + +.pathButton:focus-visible { + border-radius: 2px; + outline: 1px solid var(--agent-blue-500); + outline-offset: 2px; +} diff --git a/packages/web-shell/client/components/InsightReady.tsx b/packages/web-shell/client/components/InsightReady.tsx index 45b0bd869a1..6f46197859a 100644 --- a/packages/web-shell/client/components/InsightReady.tsx +++ b/packages/web-shell/client/components/InsightReady.tsx @@ -3,15 +3,29 @@ import { useI18n } from '../i18n'; interface InsightReadyProps { path: string; + onInsightReportOpen?: (path: string) => void; } -export function InsightReady({ path }: InsightReadyProps) { +export function InsightReady({ + path, + onInsightReportOpen, +}: InsightReadyProps) { const { t } = useI18n(); return (
{t('insight.ready')} - {path} + {onInsightReportOpen ? ( + + ) : ( + {path} + )}
); } diff --git a/packages/web-shell/client/components/MessageItem.tsx b/packages/web-shell/client/components/MessageItem.tsx index d37b062cb4b..efcf3d9f5bb 100644 --- a/packages/web-shell/client/components/MessageItem.tsx +++ b/packages/web-shell/client/components/MessageItem.tsx @@ -33,6 +33,7 @@ interface MessageItemProps { /** Click an uploaded image in a user message to preview it in the right panel. */ onImagePreview?: (src: string, alt?: string) => void; onAttachmentPreview?: (file: AttachmentPreviewRequest) => void; + onInsightReportOpen?: (path: string) => void; workspaceCwd?: string; showRetryHint?: boolean; onRetryClick?: () => void; @@ -54,6 +55,7 @@ export const MessageItem = memo(function MessageItem({ onShowContextDetail, onImagePreview, onAttachmentPreview, + onInsightReportOpen, workspaceCwd, showRetryHint = false, onRetryClick, @@ -180,7 +182,12 @@ export const MessageItem = memo(function MessageItem({ /> ); case 'insight_ready': - return ; + return ( + + ); case 'insight_error': return (
@@ -300,6 +307,8 @@ function areMessageItemPropsEqual( if (prev.onRetryClick !== next.onRetryClick) return false; if (prev.sendFailed !== next.sendFailed) return false; if (prev.onRetrySend !== next.onRetrySend) return false; + if (prev.onEditUserMessage !== next.onEditUserMessage) return false; + if (prev.onInsightReportOpen !== next.onInsightReportOpen) return false; if (prev.onBranchSession !== next.onBranchSession) return false; if (prev.branchRecordId !== next.branchRecordId) return false; if (prev.showAssistantActions !== next.showAssistantActions) return false; diff --git a/packages/web-shell/client/components/MessageList.tsx b/packages/web-shell/client/components/MessageList.tsx index a34acd661cf..5c4497ed621 100644 --- a/packages/web-shell/client/components/MessageList.tsx +++ b/packages/web-shell/client/components/MessageList.tsx @@ -81,6 +81,7 @@ interface MessageListProps { /** Click an uploaded image in a user message to preview it in the right panel. */ onImagePreview?: (src: string, alt?: string) => void; onAttachmentPreview?: (file: AttachmentPreviewRequest) => void; + onInsightReportOpen?: (path: string) => void; onEditUserMessage?: (targetTurnIndex: number, content: string) => void; loadingTranscript?: boolean; catchingUp?: boolean; @@ -2733,6 +2734,7 @@ export const MessageList = memo( onShowContextDetail, onImagePreview, onAttachmentPreview, + onInsightReportOpen, onEditUserMessage, loadingTranscript, catchingUp, @@ -5123,6 +5125,10 @@ export const MessageList = memo( displayItem.message.role === 'assistant' ? displayItem.message.branchRecordId : undefined; + const editableUserContent = + displayItem.message.role === 'user' + ? displayItem.message.content + : undefined; return ( onEditUserMessage( editableUserTurn.turnIndexById.get( displayItem.message.id, ) ?? 0, - displayItem.message.content, + editableUserContent, ) : undefined } @@ -5205,6 +5213,9 @@ export const MessageList = memo( onShowContextDetail, onImagePreview, onAttachmentPreview, + onInsightReportOpen, + onEditUserMessage, + editableUserTurn, generateContent, headerOffset, visibleItems, diff --git a/packages/web-shell/client/customization.tsx b/packages/web-shell/client/customization.tsx index c26bfcf72e8..56cf36492e9 100644 --- a/packages/web-shell/client/customization.tsx +++ b/packages/web-shell/client/customization.tsx @@ -366,6 +366,7 @@ export interface WebShellAtProvider { } export interface WebShellComposerApi { + focus?(): void; insertText(text: string, options?: WebShellComposerTextOptions): void; setText(text: string): void; addTags( diff --git a/packages/web-shell/client/daemon/session/mappers.ts b/packages/web-shell/client/daemon/session/mappers.ts index 825820426aa..a596d28f164 100644 --- a/packages/web-shell/client/daemon/session/mappers.ts +++ b/packages/web-shell/client/daemon/session/mappers.ts @@ -192,6 +192,7 @@ export function mapSupportedCommands( name: command.name, description: command.description || '', ...(command.input?.hint ? { argumentHint: command.input.hint } : {}), + ...(command.input === null ? { autoSubmit: true } : {}), ...mapCommandMeta(command._meta), raw: command, })); @@ -764,6 +765,7 @@ function mapAvailableCommandsUpdate( ...(daemonCommand.input?.hint ? { argumentHint: daemonCommand.input.hint } : {}), + ...(daemonCommand.input === null ? { autoSubmit: true } : {}), ...mapCommandMeta(daemonCommand._meta), raw: daemonCommand, }, diff --git a/packages/web-shell/client/daemon/session/types.ts b/packages/web-shell/client/daemon/session/types.ts index 4ce9db8d675..759ad63c234 100644 --- a/packages/web-shell/client/daemon/session/types.ts +++ b/packages/web-shell/client/daemon/session/types.ts @@ -289,6 +289,7 @@ export interface DaemonCommandInfo { name: string; description: string; argumentHint?: string; + autoSubmit?: boolean; source?: string; raw: DaemonAvailableCommand; } diff --git a/packages/web-shell/client/hooks/daemonSessionMappers.ts b/packages/web-shell/client/hooks/daemonSessionMappers.ts index 1047ffc84b7..62938ba013a 100644 --- a/packages/web-shell/client/hooks/daemonSessionMappers.ts +++ b/packages/web-shell/client/hooks/daemonSessionMappers.ts @@ -11,6 +11,8 @@ export function mergeCommands(...groups: CommandInfo[][]): CommandInfo[] { ...command, description: command.description || existing.description, argumentHint: command.argumentHint ?? existing.argumentHint, + autoSubmit: command.autoSubmit ?? existing.autoSubmit, + subcommands: command.subcommands ?? existing.subcommands, }); } else { byName.set(command.name, command); diff --git a/packages/web-shell/client/hooks/useComposerCore.ts b/packages/web-shell/client/hooks/useComposerCore.ts index b2cdc4b7a71..1d971dca52b 100644 --- a/packages/web-shell/client/hooks/useComposerCore.ts +++ b/packages/web-shell/client/hooks/useComposerCore.ts @@ -1095,6 +1095,7 @@ export interface UseComposerCoreOptions { ) => boolean | void; onInputTextChange?: (text: string) => void; onCycleMode?: () => void; + cycleModeOnTab?: boolean; onToggleShortcuts?: () => void; disabled?: boolean; /** @@ -1109,6 +1110,7 @@ export interface UseComposerCoreOptions { commands: CommandInfo[]; skills?: SkillInfo[]; slashCommandCategoryOrder?: CommandDisplayCategoryOrder; + autoSubmitSlashCommands?: boolean; queuedMessages?: string[]; onPopQueuedMessages?: () => boolean; onClearQueuedMessages?: () => boolean; @@ -1379,9 +1381,10 @@ export interface UseComposerCoreReturn { onAcceptFollowup: UseDaemonFollowupSuggestionReturn['onAcceptFollowup']; onDismissFollowup: UseDaemonFollowupSuggestionReturn['onDismissFollowup']; slashMenu: SlashMenuState | null; + openSlashMenu: () => boolean; closeSlashMenu: () => void; selectSlashCompletion: (index: number) => boolean; - acceptSlashCompletion: (index?: number) => boolean; + acceptSlashCompletion: (index?: number, submit?: boolean) => boolean; atMenu: AtMentionMenuState | null; closeAtMenu: () => void; selectAtCompletion: (index: number) => boolean; @@ -1399,6 +1402,7 @@ export function useComposerCore( onSubmit, onInputTextChange, onCycleMode, + cycleModeOnTab = false, onToggleShortcuts, disabled = false, fileDragEnabled = true, @@ -1406,6 +1410,7 @@ export function useComposerCore( commands, skills = [], slashCommandCategoryOrder, + autoSubmitSlashCommands = false, queuedMessages = [], onPopQueuedMessages, currentMode = 'default', @@ -1516,6 +1521,8 @@ export function useComposerCore( }, []); const onCycleModeRef = useRef(onCycleMode); onCycleModeRef.current = onCycleMode; + const cycleModeOnTabRef = useRef(cycleModeOnTab); + cycleModeOnTabRef.current = cycleModeOnTab; const onToggleShortcutsRef = useRef(onToggleShortcuts); onToggleShortcutsRef.current = onToggleShortcuts; const disabledRef = useRef(disabled); @@ -2182,6 +2189,31 @@ export function useComposerCore( closeAtMenuState(); }, [clearAutoAtTriggerIfIntact, closeAtMenuState]); + const openSlashMenu = useCallback(() => { + const view = viewRef.current; + if (!view) return false; + const result = getSlashCommandCompletionResult( + '/', + 1, + commandsRef.current, + skillsRef.current, + languageRef.current, + tRef.current, + slashCommandCategoryOrderRef.current ?? DEFAULT_COMMAND_CATEGORY_ORDER, + ); + if (!result) return false; + closeAtMenu(); + const cursor = view.state.selection.main.head; + setSlashMenu({ + ...result, + from: cursor, + to: cursor, + selectedIndex: 0, + }); + view.focus(); + return true; + }, [closeAtMenu, setSlashMenu]); + const closeAtMenuIfOpenFn = atMenu.closeIfOpen; const closeAtMenuIfOpen = useCallback(() => { const result = closeAtMenuIfOpenFn(); @@ -2278,20 +2310,33 @@ export function useComposerCore( [setSlashMenu], ); - const acceptSlashCompletion = useCallback((index?: number) => { - const view = viewRef.current; - const current = slashMenuRef.current; - if (!view || !current) return false; - const item = current.items[index ?? current.selectedIndex]; - if (!item) return false; - view.dispatch({ - changes: { from: current.from, to: current.to, insert: item.apply }, - selection: { anchor: current.from + item.apply.length }, - scrollIntoView: true, - }); - view.focus(); - return true; - }, []); + const acceptSlashCompletion = useCallback( + (index?: number, submit = false) => { + const view = viewRef.current; + const current = slashMenuRef.current; + if (!view || !current) return false; + const item = current.items[index ?? current.selectedIndex]; + if (!item) return false; + const commandReplacesEntireDraft = + current.from === 0 && current.to === view.state.doc.length; + view.dispatch({ + changes: { from: current.from, to: current.to, insert: item.apply }, + selection: { anchor: current.from + item.apply.length }, + scrollIntoView: true, + }); + view.focus(); + if ( + submit && + autoSubmitSlashCommands && + item.autoSubmit && + commandReplacesEntireDraft + ) { + submitTextRef.current(view); + } + return true; + }, + [autoSubmitSlashCommands], + ); // Track whether editor has content for send button state const [hasContent, setHasContent] = useState(false); @@ -2841,7 +2886,7 @@ export function useComposerCore( return true; } if (slashMenuRef.current) { - return acceptSlashCompletion(); + return acceptSlashCompletion(undefined, true); } if (completionStatus(view.state) === 'active') return false; const followup = followupStateRef.current; @@ -3022,10 +3067,12 @@ export function useComposerCore( return true; } if (slashMenuRef.current) { - return acceptSlashCompletion(); + if (acceptSlashCompletion()) return true; + if (!cycleModeOnTabRef.current) return false; } if (completionStatus(view.state) === 'active') { - return acceptCompletion(view); + if (acceptCompletion(view)) return true; + if (!cycleModeOnTabRef.current) return false; } const text = view.state.doc.toString(); const implicitResult = getImplicitTabCompletion( @@ -3059,6 +3106,9 @@ export function useComposerCore( }); return true; } + if (cycleModeOnTabRef.current) { + onCycleModeRef.current?.(); + } return true; }, }, @@ -3497,15 +3547,22 @@ export function useComposerCore( [ command.name, command.description ?? '', + command.completionLabel ?? '', + command.completionSection ?? '', command.source ?? '', command.displayCategory ?? '', command.argumentHint ?? '', command.subcommands?.join(',') ?? '', + command.autoSubmit ? '1' : '0', ].join('\u0000'), ) .join('\u0001'), skills - .map((skill) => [skill.name, skill.description].join('\u0000')) + .map((skill) => + [skill.name, skill.description, skill.argumentHint ?? ''].join( + '\u0000', + ), + ) .join('\u0001'), slashCommandCategoryOrder?.join('|') ?? '', ].join('\u0002'); @@ -4464,6 +4521,7 @@ export function useComposerCore( onDismissFollowup: onDismissFollowup as UseDaemonFollowupSuggestionReturn['onDismissFollowup'], slashMenu, + openSlashMenu, closeSlashMenu, selectSlashCompletion, acceptSlashCompletion, diff --git a/packages/web-shell/client/utils/slash-command-action.ts b/packages/web-shell/client/utils/slash-command-action.ts index a4ae227b8b7..7ff14f338f5 100644 --- a/packages/web-shell/client/utils/slash-command-action.ts +++ b/packages/web-shell/client/utils/slash-command-action.ts @@ -1,6 +1,6 @@ import type { WebShellSlashCommandHandler } from '../App'; -export const SLASH_COMMAND_PATTERN = /^\/([\w-]+)(?=\s|$)/; +export const SLASH_COMMAND_PATTERN = /^\/([^\s/]+)(?=\s|$)/; export function invokeSlashCommandHandler( input: string, From 4e4d2ac592cbfd53faca89437a11eae4a04c1128 Mon Sep 17 00:00:00 2001 From: yiliang114 Date: Tue, 25 Aug 2026 23:33:06 +0800 Subject: [PATCH 39/57] test(vscode-ide-companion): repair host-wiring tests for the WebShell cutover --- .../src/webview/EmbeddedApp.test.tsx | 413 +++--------------- .../webview/providers/WebViewContent.test.ts | 12 +- 2 files changed, 77 insertions(+), 348 deletions(-) diff --git a/packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx b/packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx index 4a36276b8ef..af2caaea591 100644 --- a/packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx +++ b/packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx @@ -18,7 +18,6 @@ import { it, vi, } from 'vitest'; -import type { DaemonTranscriptBlock } from '@qwen-code/sdk/daemon'; Object.assign(globalThis, { IS_REACT_ACT_ENVIRONMENT: true }); @@ -39,94 +38,11 @@ const mocks = vi.hoisted(() => ({ getState: vi.fn(() => ({})), setState: vi.fn(), }, - session: { - qwenSessions: [ - { id: 'session-1', title: 'Session one', messageCount: 2 }, - ] as Array>, - currentSessionId: 'session-1' as string | null, - currentSessionTitle: 'Session one', - showSessionSelector: false, - sessionSearchQuery: '', - filteredSessions: [ - { id: 'session-1', title: 'Session one', messageCount: 2 }, - ] as Array>, - hasMore: true, - isLoading: false, - isSwitchingSession: false, - setSessionSearchQuery: vi.fn(), - setShowSessionSelector: vi.fn(), - handleLoadQwenSessions: vi.fn(), - handleLoadMoreSessions: vi.fn(), - handleSwitchSession: vi.fn(), - handleNewQwenSession: vi.fn(), - handleDeleteSession: vi.fn(), - handleRenameSession: vi.fn(), - setQwenSessions: vi.fn(), - setCurrentSessionId: vi.fn(), - setCurrentSessionTitle: vi.fn(), - setNextCursor: vi.fn(), - setHasMore: vi.fn(), - setIsLoading: vi.fn(), - setIsSwitchingSession: vi.fn(), - }, - fileContext: { - activeFileName: 'editor.ts', - activeFilePath: '/workspace/editor.ts', - activeSelection: { startLine: 3, endLine: 5 }, - workspaceFiles: [], - hasRequestedFiles: true, - getFileReferences: vi.fn(() => [ - { name: 'main.ts', value: '/workspace/src/main.ts' }, - ]), - searchWorkspaceFiles: vi.fn(async () => []), - clearFileReferences: vi.fn(), - addFileReference: vi.fn(), - requestWorkspaceFiles: vi.fn(), - requestActiveEditor: vi.fn(), - focusActiveEditor: vi.fn(), - setActiveFileName: vi.fn(), - setActiveFilePath: vi.fn(), - setActiveSelection: vi.fn(), - setWorkspaceFiles: vi.fn(), - setWorkspaceFilesFromResponse: vi.fn(), - }, - messageHandling: { - messages: [] as Array<{ - role: 'assistant'; - content: string; - timestamp: number; - localOnly?: boolean; - }>, - isStreaming: false, - isWaitingForResponse: false, - setWaitingForResponse: vi.fn(), - clearWaitingForResponse: vi.fn(), - endStreaming: vi.fn(), - addMessage: vi.fn(), - clearMessages: vi.fn(), - setMessages: vi.fn(), - }, - tools: { - inProgressToolCalls: [], - handleToolCallUpdate: vi.fn(), - clearToolCalls: vi.fn(), - rewindToolCallsToTimestamp: vi.fn(), - }, - blocks: { - current: [ - { - id: 'assistant-1', - kind: 'assistant', - text: 'assistant reply', - } as unknown as DaemonTranscriptBlock, - ], - }, embeddedProps: { current: null as CapturedProps | null }, - webViewMessageProps: { current: null as CapturedProps | null }, })); vi.mock('@qwen-code/web-shell', () => ({ - EmbeddedWebShell: (props: CapturedProps) => { + WebShellWithProviders: (props: CapturedProps) => { mocks.embeddedProps.current = props; return null; }, @@ -136,32 +52,6 @@ vi.mock('./hooks/useVSCode.js', () => ({ useVSCode: () => mocks.vscode, })); -vi.mock('./hooks/session/useSessionManagement.js', () => ({ - useSessionManagement: () => mocks.session, -})); - -vi.mock('./hooks/file/useFileContext.js', () => ({ - useFileContext: () => mocks.fileContext, -})); - -vi.mock('./hooks/message/useMessageHandling.js', () => ({ - useMessageHandling: () => mocks.messageHandling, -})); - -vi.mock('./hooks/useToolCalls.js', () => ({ - useToolCalls: () => mocks.tools, -})); - -vi.mock('./hooks/useAcpTranscript.js', () => ({ - useAcpTranscript: () => mocks.blocks.current, -})); - -vi.mock('./hooks/useWebViewMessages.js', () => ({ - useWebViewMessages: (props: CapturedProps) => { - mocks.webViewMessageProps.current = props; - }, -})); - const mounted: RenderedApp[] = []; async function renderApp(): Promise { @@ -171,17 +61,7 @@ async function renderApp(): Promise { await act(async () => { root.render(); await Promise.resolve(); - await Promise.resolve(); }); - for ( - let attempt = 0; - attempt < 5 && !mocks.embeddedProps.current; - attempt++ - ) { - await act(async () => { - await new Promise((resolve) => setTimeout(resolve, 0)); - }); - } mounted.push({ container, root }); const props = mocks.embeddedProps.current; expect(props).not.toBeNull(); @@ -193,35 +73,29 @@ function callback unknown>( name: string, ): T { const value = props[name]; - expect(value).toEqual(expect.any(Function)); + expect(typeof value).toBe('function'); return value as T; } -function postMessagesOfType(type: string): unknown[] { +function postMessagesOfType( + type: string, +): Array<{ type?: string; data?: unknown }> { return mocks.vscode.postMessage.mock.calls .map(([message]) => message as { type?: string }) - .filter((message) => message.type === type) - .map((message) => message); + .filter((message) => message.type === type); } beforeAll(async () => { + document.body.dataset.qwenDaemonBaseUrl = 'http://localhost:4141'; + document.body.dataset.qwenWorkspaceCwd = '/workspace'; + document.body.dataset.qwenSessionId = 'session-1'; + document.body.dataset.qwenHostKind = 'panel'; ({ EmbeddedApp } = await import('./EmbeddedApp.js')); }); beforeEach(() => { vi.clearAllMocks(); mocks.embeddedProps.current = null; - mocks.webViewMessageProps.current = null; - mocks.messageHandling.messages = []; - mocks.messageHandling.isStreaming = false; - mocks.messageHandling.isWaitingForResponse = false; - mocks.blocks.current = [ - { - id: 'assistant-1', - kind: 'assistant', - text: 'assistant reply', - } as unknown as DaemonTranscriptBlock, - ]; }); afterEach(() => { @@ -232,230 +106,79 @@ afterEach(() => { }); describe('EmbeddedApp host wiring', () => { - it('maps composer submissions to the existing ACP sendMessage contract', async () => { - const props = await renderApp(); - const submit = callback< - (submission: { - text: string; - images?: Array<{ data: string; media_type: string }>; - files?: Array<{ name: string; media_type: string; text?: string }>; - inputAnnotations?: unknown[]; - }) => boolean - >(props, 'onSubmit'); - - expect( - submit({ - text: 'Explain @main.ts', - images: [{ data: 'aGVsbG8=', media_type: 'image/png' }], - files: [ - { name: 'notes.md', media_type: 'text/markdown', text: '# Notes' }, - ], - inputAnnotations: [{ type: 'file', text: '@main.ts' }], - }), - ).toBe(true); - - const message = postMessagesOfType('sendMessage').at(-1) as { - data: { - text: string; - context: Array>; - attachments: Array>; - inlineFiles: Array>; - fileContext: Record; - inputAnnotations: unknown[]; - }; - }; - expect(message.data.text).toBe('Explain @main.ts'); - expect(message.data.context).toEqual([ - { - type: 'file', - name: 'main.ts', - value: '/workspace/src/main.ts', - isImage: false, - }, - { - type: 'file', - name: 'editor.ts', - value: '/workspace/editor.ts', - startLine: 3, - endLine: 5, - isImage: false, - }, - ]); - expect(message.data.fileContext).toEqual({ - fileName: 'editor.ts', - filePath: '/workspace/editor.ts', - startLine: 3, - endLine: 5, - }); - expect(message.data.attachments[0]).toMatchObject({ - type: 'image/png', - data: 'aGVsbG8=', - }); - expect(message.data.inlineFiles).toEqual([ - { name: 'notes.md', mediaType: 'text/markdown', text: '# Notes' }, - ]); - expect(message.data.inputAnnotations).toEqual([ - { type: 'file', text: '@main.ts' }, - ]); - expect(mocks.messageHandling.setWaitingForResponse).toHaveBeenCalledOnce(); - expect(mocks.fileContext.clearFileReferences).toHaveBeenCalledOnce(); - }); - - it('maps permission, question, history, model, mode, and copy host actions', async () => { + it('injects the active editor reference into prepared submissions', async () => { await renderApp(); - const webViewProps = mocks.webViewMessageProps.current as CapturedProps; - const handlePermissionRequest = callback<(request: unknown) => void>( - webViewProps, - 'handlePermissionRequest', - ); - const handleAskUserQuestion = callback<(request: unknown) => void>( - webViewProps, - 'handleAskUserQuestion', - ); await act(async () => { - callback<(authenticated: boolean) => void>( - webViewProps, - 'setIsAuthenticated', - )(true); - await Promise.resolve(); - }); - - await act(async () => { - handlePermissionRequest({ - options: [ - { name: 'Allow once', kind: 'allow_once', optionId: 'proceed_once' }, - { name: 'Reject', kind: 'reject_once', optionId: 'cancel' }, - ], - toolCall: { - toolCallId: 'tool-1', - kind: 'bash', - title: 'Run command', - rawInput: { command: 'npm test' }, - content: [], - }, - }); - handleAskUserQuestion({ - sessionId: 'session-1', - questions: [ - { - header: 'Keep?', - question: 'Keep current changes?', - multiSelect: false, - options: [{ label: 'Keep', description: 'Keep current changes' }], + window.dispatchEvent( + new MessageEvent('message', { + data: { + type: 'activeEditorChanged', + data: { + fileName: 'editor.ts', + filePath: '/workspace/editor.ts', + selection: { startLine: 3, endLine: 5 }, + }, }, - ], - }); - callback<(path: string | null) => void>( - webViewProps, - 'setInsightReportPath', - )('/workspace/insight.md'); + }), + ); await Promise.resolve(); }); - const props = mocks.embeddedProps.current as CapturedProps; - expect(props.style).toMatchObject({ - '--background': 'var(--vscode-sideBar-background)', - '--foreground': 'var(--vscode-foreground)', - '--chat-editor-bg-primary': 'var(--vscode-input-background)', - }); - expect(props.pendingPermission).toMatchObject({ - id: 'tool-1', - kind: 'bash', - options: [ - { id: 'proceed_once', kind: 'allow_once' }, - { id: 'cancel', kind: 'reject_once' }, + const prepareSubmit = callback< + (submission: { + prompt: string; + sessionId?: string; + inputAnnotations: unknown[]; + }) => Promise<{ prompt: string; inputAnnotations: unknown[] } | undefined> + >(mocks.embeddedProps.current as CapturedProps, 'prepareSubmit'); + + await expect( + prepareSubmit({ prompt: 'Explain this', inputAnnotations: [] }), + ).resolves.toEqual({ + prompt: '@editor.ts (selected lines 3-5) Explain this', + inputAnnotations: [ + expect.objectContaining({ + type: 'reference', + start: 0, + end: '@editor.ts'.length, + reference: expect.objectContaining({ + kind: 'file', + label: 'editor.ts', + value: '/workspace/editor.ts', + }), + }), ], }); - expect(props.pendingQuestion).toMatchObject({ - id: 'session-1', - kind: 'ask_user_question', - rawInput: expect.objectContaining({ questions: expect.any(Array) }), - }); - expect(props.notices).toContainEqual({ - id: 'insight-report', - message: 'Insight report: /workspace/insight.md', - actionLabel: 'Open report', - }); + }); - await act(async () => { - callback<(requestId: string, optionId: string) => void>( - props, - 'onPermissionResponse', - )('tool-1', 'proceed_once'); - await callback< - ( - requestId: string, - optionId: string, - answers?: Record, - ) => Promise - >(props, 'onQuestionResponse')('session-1', 'proceed_once', { - '0': 'Keep', - }); - }); - expect(postMessagesOfType('permissionResponse').at(-1)).toEqual({ - type: 'permissionResponse', - data: { optionId: 'proceed_once' }, - }); - expect(postMessagesOfType('askUserQuestionResponse').at(-1)).toEqual({ - type: 'askUserQuestionResponse', - data: { answers: { '0': 'Keep' }, cancelled: false }, - }); - callback<(noticeId: string) => void>( - props, - 'onNoticeAction', - )('insight-report'); - expect(postMessagesOfType('openInsightReport').at(-1)).toEqual({ - type: 'openInsightReport', - data: { path: '/workspace/insight.md' }, - }); + it('routes auth and session-change host actions to the extension', async () => { + const props = await renderApp(); - const historyOpenChange = callback<(open: boolean) => void>( - props, - 'onHistoryOpenChange', - ); - historyOpenChange(true); - callback<(sessionId: string) => void>( + const onSlashCommand = callback< + (command: { command: string; input: string }) => boolean | void + >(props, 'onSlashCommand'); + expect(onSlashCommand({ command: 'auth', input: '' })).toBe(true); + expect(onSlashCommand({ command: 'account', input: '' })).toBe(true); + + callback<(sessionId: string | undefined) => void>( props, - 'onSessionSelect', + 'onSessionIdChange', )('session-2'); - callback<() => void>(props, 'onLoadMoreSessions')(); - callback<(modelId: string) => void>(props, 'onSelectModel')('qwen-next'); - callback<(modeId: string) => void>(props, 'onSelectMode')('yolo'); - expect(mocks.session.handleLoadQwenSessions).toHaveBeenCalledOnce(); - expect(mocks.session.handleSwitchSession).toHaveBeenCalledWith('session-2'); - expect(mocks.session.handleLoadMoreSessions).toHaveBeenCalledOnce(); - expect(mocks.vscode.postMessage).toHaveBeenCalledWith({ - type: 'setModel', - data: { modelId: 'qwen-next' }, - }); - expect(mocks.vscode.postMessage).toHaveBeenCalledWith({ - type: 'setApprovalMode', - data: { modeId: 'yolo' }, - }); + callback<(session: { sessionId?: string; sessionName?: string }) => void>( + props, + 'onSessionInfoChange', + )({ sessionId: 'session-2', sessionName: 'My Title' }); - const host = document.createElement('div'); - host.setAttribute('data-web-shell-embedded-host', ''); - const row = document.createElement('div'); - row.setAttribute('data-message-row-key', 'msg:assistant-1'); - host.appendChild(row); - document.body.appendChild(host); - expect(row).not.toBeNull(); - act(() => - row?.dispatchEvent(new MouseEvent('contextmenu', { bubbles: true })), - ); - expect(postMessagesOfType('contextMenuTriggered')).toHaveLength(1); - act(() => { - window.dispatchEvent( - new MessageEvent('message', { - data: { type: 'copyCommand', data: { action: 'copyMessage' } }, - }), - ); + expect(postMessagesOfType('auth')).toHaveLength(1); + expect(postMessagesOfType('getAccountInfo')).toHaveLength(1); + expect(postMessagesOfType('webShellSessionChanged').at(-1)).toEqual({ + type: 'webShellSessionChanged', + data: { sessionId: 'session-2', workspaceCwd: '/workspace' }, }); - expect(postMessagesOfType('copyToClipboard').at(-1)).toEqual({ - type: 'copyToClipboard', - data: { text: 'assistant reply' }, + expect(postMessagesOfType('updatePanelTitle').at(-1)).toEqual({ + type: 'updatePanelTitle', + data: { title: 'My Title' }, }); - host.remove(); }); }); diff --git a/packages/vscode-ide-companion/src/webview/providers/WebViewContent.test.ts b/packages/vscode-ide-companion/src/webview/providers/WebViewContent.test.ts index 48eed8ef5b8..430f6d15acb 100644 --- a/packages/vscode-ide-companion/src/webview/providers/WebViewContent.test.ts +++ b/packages/vscode-ide-companion/src/webview/providers/WebViewContent.test.ts @@ -20,9 +20,15 @@ vi.mock('vscode', () => ({ */ function createMockWebview() { return { - asWebviewUri: vi.fn((uri: { fsPath: string }) => ({ - toString: () => `https://webview/${uri.fsPath}`, - })), + asWebviewUri: vi.fn((uri: { fsPath: string }) => { + const toString = () => `https://webview/${uri.fsPath}`; + return { + toString, + with: ({ query }: { query?: string } = {}) => ({ + toString: () => (query ? `${toString()}?${query}` : toString()), + }), + }; + }), cspSource: 'https://csp.source', }; } From 85715968e8f84e297542bb1138e616fc70c11595 Mon Sep 17 00:00:00 2001 From: qwen-code-dev-bot Date: Wed, 26 Aug 2026 12:01:58 +0000 Subject: [PATCH 40/57] refactor(vscode-ide-companion): replace webui build scanner with an ESLint boundary rule The bespoke recursive source scanner reimplemented a dependency-boundary check on every extension build. A scoped no-restricted-imports rule enforces the same boundary on every lint run with less custom code; the manifest dependency entry was already removed by the cutover. --- eslint.config.js | 20 +++++++ packages/vscode-ide-companion/package.json | 5 +- .../scripts/check-no-webui-dependency.js | 42 --------------- .../vscode-companion-no-webui-config.test.js | 53 +++++++++++++++++++ 4 files changed, 75 insertions(+), 45 deletions(-) delete mode 100644 packages/vscode-ide-companion/scripts/check-no-webui-dependency.js create mode 100644 scripts/tests/vscode-companion-no-webui-config.test.js diff --git a/eslint.config.js b/eslint.config.js index 69d2ff58af9..e37f463a15d 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -453,6 +453,26 @@ export default tseslint.config( }, }, + // The VS Code companion renders through @qwen-code/web-shell; the legacy + // @qwen-code/webui surface must not re-enter the extension bundle. + { + files: ['packages/vscode-ide-companion/src/**/*.{ts,tsx}'], + rules: { + 'no-restricted-imports': [ + 'error', + { + patterns: [ + { + group: ['@qwen-code/webui', '@qwen-code/webui/*'], + message: + 'vscode-ide-companion must render through @qwen-code/web-shell; do not re-introduce @qwen-code/webui.', + }, + ], + }, + ], + }, + }, + // ==================== no-console allowlist ==================== // The following files/packages are allowed to use console.* diff --git a/packages/vscode-ide-companion/package.json b/packages/vscode-ide-companion/package.json index 458d3df1c6c..88ef666cd63 100644 --- a/packages/vscode-ide-companion/package.json +++ b/packages/vscode-ide-companion/package.json @@ -253,9 +253,8 @@ "scripts": { "prepackage": "node ./scripts/prepackage.js", "build": "npm run build:dev", - "build:dev": "npm run check:no-webui && npm run check-types && npm run lint && node esbuild.js", - "build:prod": "npm run check:no-webui && node esbuild.js --production", - "check:no-webui": "node scripts/check-no-webui-dependency.js", + "build:dev": "npm run check-types && npm run lint && node esbuild.js", + "build:prod": "node esbuild.js --production", "generate:notices": "node ./scripts/generate-notices.js", "prepare": "npm run generate:notices", "check-types": "tsc --noEmit", diff --git a/packages/vscode-ide-companion/scripts/check-no-webui-dependency.js b/packages/vscode-ide-companion/scripts/check-no-webui-dependency.js deleted file mode 100644 index 4ce20d8ee29..00000000000 --- a/packages/vscode-ide-companion/scripts/check-no-webui-dependency.js +++ /dev/null @@ -1,42 +0,0 @@ -/** - * @license - * Copyright 2025 Qwen Team - * SPDX-License-Identifier: Apache-2.0 - */ - -import fs from 'node:fs'; -import path from 'node:path'; -import { fileURLToPath } from 'node:url'; - -const packageRoot = path.dirname(path.dirname(fileURLToPath(import.meta.url))); -const sourceRoot = path.join(packageRoot, 'src'); -const forbidden = '@qwen-code/webui'; -const violations = []; - -function visit(directory) { - for (const entry of fs.readdirSync(directory, { withFileTypes: true })) { - const entryPath = path.join(directory, entry.name); - if (entry.isDirectory()) { - visit(entryPath); - } else if (/\.(?:ts|tsx|js|jsx)$/.test(entry.name)) { - if (fs.readFileSync(entryPath, 'utf8').includes(forbidden)) { - violations.push(path.relative(packageRoot, entryPath)); - } - } - } -} - -visit(sourceRoot); -const packageJson = JSON.parse( - fs.readFileSync(path.join(packageRoot, 'package.json'), 'utf8'), -); -if (packageJson.dependencies?.[forbidden]) { - violations.push('package.json dependencies'); -} - -if (violations.length > 0) { - console.error( - `VS Code companion must not depend on ${forbidden}:\n${violations.join('\n')}`, - ); - process.exitCode = 1; -} diff --git a/scripts/tests/vscode-companion-no-webui-config.test.js b/scripts/tests/vscode-companion-no-webui-config.test.js new file mode 100644 index 00000000000..602f1575f7a --- /dev/null +++ b/scripts/tests/vscode-companion-no-webui-config.test.js @@ -0,0 +1,53 @@ +/** + * @license + * Copyright 2026 Qwen Team + * SPDX-License-Identifier: Apache-2.0 + */ + +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { ESLint } from 'eslint'; +import { expect, it } from 'vitest'; + +const root = join(dirname(fileURLToPath(import.meta.url)), '../..'); + +const eslint = new ESLint({ cwd: root }); + +async function restrictedReports(statement) { + const filePath = join( + root, + 'packages/vscode-ide-companion/src/boundary-probe.ts', + ); + const [result] = await eslint.lintText(`${statement}\n`, { filePath }); + return result.messages.filter((m) => m.ruleId === 'no-restricted-imports'); +} + +it('blocks @qwen-code/webui imports from the VS Code companion', async () => { + expect( + await restrictedReports(`import { App } from '@qwen-code/webui';`), + ).toHaveLength(1); + expect( + await restrictedReports( + `import type { AppProps } from '@qwen-code/webui';`, + ), + ).toHaveLength(1); + expect( + await restrictedReports(`export { App } from '@qwen-code/webui';`), + ).toHaveLength(1); +}); + +it('blocks deep @qwen-code/webui specifiers from the VS Code companion', async () => { + expect( + await restrictedReports( + `import { styles } from '@qwen-code/webui/styles';`, + ), + ).toHaveLength(1); +}); + +it('still allows @qwen-code/web-shell imports in the VS Code companion', async () => { + expect( + await restrictedReports( + `import { WebShellApp } from '@qwen-code/web-shell';`, + ), + ).toHaveLength(0); +}); From 72777d0758d3b9600a84a789e569106aa42c8497 Mon Sep 17 00:00:00 2001 From: qwen-code-dev-bot Date: Wed, 26 Aug 2026 12:40:01 +0000 Subject: [PATCH 41/57] fix(web-shell): keep ChatEditor commands prop referentially stable (#9811) The `additionalSlashCommands = []` destructure default allocated a fresh array on every App render, invalidating the `commands` useMemo and breaking ChatEditor memoization on every transcript-only re-render. Default to a module-level constant instead, matching the existing EMPTY_* convention. Also align the /skills completion expectation with the autoSubmit field the completion source intentionally emits for leaf skill items. --- packages/web-shell/client/App.tsx | 9 +++------ .../web-shell/client/completions/slashCompletion.test.ts | 1 + 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/web-shell/client/App.tsx b/packages/web-shell/client/App.tsx index a9786f118e5..916fa2e0d69 100644 --- a/packages/web-shell/client/App.tsx +++ b/packages/web-shell/client/App.tsx @@ -1240,6 +1240,7 @@ const emptyComposerApi: WebShellComposerApi = { }; const EMPTY_BOTTOM_STATUS_ITEMS: readonly WebShellBottomStatusItem[] = []; +const EMPTY_ADDITIONAL_SLASH_COMMANDS: readonly CommandInfo[] = []; const DEFAULT_CHAT_MAX_WIDTH = 1000; const DEFAULT_CHAT_HEADER_ITEMS: readonly WebShellChatHeaderItem[] = [ 'title', @@ -2023,7 +2024,7 @@ export function App({ composerToolbarActions, compactComposerOverlays = false, autoSubmitSlashCommands = false, - additionalSlashCommands = [], + additionalSlashCommands = EMPTY_ADDITIONAL_SLASH_COMMANDS, contextUsageAlwaysVisible = false, userMessageEditing = false, onUserMessageEditRequest, @@ -5844,11 +5845,7 @@ export function App({ sessionId: connection.sessionId, sessionName: sessionDisplayName, }); - }, [ - connection.sessionId, - onSessionInfoChange, - sessionDisplayName, - ]); + }, [connection.sessionId, onSessionInfoChange, sessionDisplayName]); const [currentMode, setCurrentMode] = useState('default'); const currentModeRef = useRef(currentMode); currentModeRef.current = currentMode; diff --git a/packages/web-shell/client/completions/slashCompletion.test.ts b/packages/web-shell/client/completions/slashCompletion.test.ts index 9b620ab6138..66825ba9dc5 100644 --- a/packages/web-shell/client/completions/slashCompletion.test.ts +++ b/packages/web-shell/client/completions/slashCompletion.test.ts @@ -174,6 +174,7 @@ describe('getSlashCommandCompletionResult', () => { detail: 'Review current code', apply: '/skills review ', type: 'skill', + autoSubmit: true, }, ]); }); From f1b4b3eb26f16566798888db25fdef931f899786 Mon Sep 17 00:00:00 2001 From: yiliang114 Date: Fri, 28 Aug 2026 02:07:22 +0900 Subject: [PATCH 42/57] fix(vscode): distinguish the VS Code channel and localize its chrome MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The companion now drives Web Shell against a shared `qwen serve` daemon, so the CLI, the browser Web Shell, and this extension all create sessions in the same workspace catalog. Web Shell recorded `'default'` for every surface, leaving VS Code conversations indistinguishable from terminal and browser ones — the panel's history listed sessions the user never opened here, and nothing attributed a session back to the editor. Give Web Shell a `sessionSourceType` prop (defaulting to today's `'default'`) and have the companion stamp `'vscode'` on the sessions it creates, then scope the history dropdown to that source. The host also supplies a stable daemon `clientId`, which the bootstrap previously declared but never sent. Web Shell localizes its own surface from the `language` signal while the companion's chrome was hardcoded English, so a zh-CN panel rendered a Chinese transcript under an English header, history dropdown, onboarding screen, and account dialog. Route that chrome through a small string table driven by the same signal, including the host-only slash entries. Also fix accessibility defects in the history dropdown: rename and delete were revealed on hover alone and unreachable by keyboard, date headers sat inside `role="listbox"` as invalid non-option children, arrow-key roving stopped at group boundaries, `aria-modal` had no focus trap, and a primed "Delete?" survived both search changes and the pointer leaving the row. Formatting: `FileMessageHandler` and `SessionMessageHandler` were left unformatted earlier in this branch and failed the Prettier gate. --- .../src/webview/EmbeddedApp.test.tsx | 8 + .../src/webview/EmbeddedApp.tsx | 195 ++++++------- .../src/webview/components/QwenOnboarding.tsx | 17 +- .../components/SessionHistoryDropdown.tsx | 258 ++++++++++++------ .../webview/handlers/FileMessageHandler.ts | 5 +- .../webview/handlers/SessionMessageHandler.ts | 12 +- .../src/webview/providers/WebViewProvider.ts | 8 + .../src/webview/sessionSource.ts | 16 ++ .../src/webview/strings.ts | 183 +++++++++++++ packages/web-shell/client/App.tsx | 12 + .../client/utils/sessionPreparation.test.ts | 12 + .../client/utils/sessionPreparation.ts | 8 +- 12 files changed, 535 insertions(+), 199 deletions(-) create mode 100644 packages/vscode-ide-companion/src/webview/sessionSource.ts create mode 100644 packages/vscode-ide-companion/src/webview/strings.ts diff --git a/packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx b/packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx index af2caaea591..e4befdca7cf 100644 --- a/packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx +++ b/packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx @@ -106,6 +106,14 @@ afterEach(() => { }); describe('EmbeddedApp host wiring', () => { + it('attributes its sessions to the VS Code channel', async () => { + const props = await renderApp(); + // The daemon is shared with the CLI and the browser Web Shell for this + // workspace; without a distinct source type the panel cannot tell its own + // conversations apart from theirs. + expect(props['sessionSourceType']).toBe('vscode'); + }); + it('injects the active editor reference into prepared submissions', async () => { await renderApp(); diff --git a/packages/vscode-ide-companion/src/webview/EmbeddedApp.tsx b/packages/vscode-ide-companion/src/webview/EmbeddedApp.tsx index 602416dee4d..69cae90ccd8 100644 --- a/packages/vscode-ide-companion/src/webview/EmbeddedApp.tsx +++ b/packages/vscode-ide-companion/src/webview/EmbeddedApp.tsx @@ -23,6 +23,12 @@ import { ChevronDown, FileText, LoaderCircle, Plus, X } from 'lucide-react'; import { useVSCode } from './hooks/useVSCode.js'; import { QwenOnboarding } from './components/QwenOnboarding.js'; import { SessionHistoryDropdown } from './components/SessionHistoryDropdown.js'; +import { + createChromeStrings, + readLanguage, + type ChromeStrings, +} from './strings.js'; +import { VSCODE_SESSION_SOURCE_TYPE } from './sessionSource.js'; import { findBlockByRowKey, findLastAssistantText, @@ -38,38 +44,41 @@ const COMPOSER_TOOLBAR_ACTIONS = [ 'voice', ] as const satisfies readonly ComposerToolbarAction[]; -const VSCODE_SLASH_COMMANDS = [ - { - name: 'model', - description: 'Switch the active model', - completionLabel: 'Switch model...', - completionSection: 'Model', - completionPriority: -110, - autoSubmit: true, - }, - { - name: 'auth', - description: 'Configure Coding Plan or API Key', - completionSection: 'Account', - completionPriority: -100, - autoSubmit: true, - }, - { - name: 'account', - description: 'Show current account and authentication info', - completionLabel: 'Account', - completionSection: 'Account', - completionPriority: -100, - autoSubmit: true, - }, - { - name: 'export', - description: 'Export the current conversation', - completionSection: 'Session', - completionPriority: -90, - subcommands: ['html', 'md', 'json', 'jsonl'], - }, -]; +/** Host-only slash entries. Built per language so the menu is not half-English. */ +function buildVsCodeSlashCommands(t: ChromeStrings) { + return [ + { + name: 'model', + description: t('cmd.model.description'), + completionLabel: t('cmd.model.label'), + completionSection: t('cmd.section.model'), + completionPriority: -110, + autoSubmit: true, + }, + { + name: 'auth', + description: t('cmd.auth.description'), + completionSection: t('cmd.section.account'), + completionPriority: -100, + autoSubmit: true, + }, + { + name: 'account', + description: t('cmd.account.description'), + completionLabel: t('cmd.account.label'), + completionSection: t('cmd.section.account'), + completionPriority: -100, + autoSubmit: true, + }, + { + name: 'export', + description: t('cmd.export.description'), + completionSection: t('cmd.section.session'), + completionPriority: -90, + subcommands: ['html', 'md', 'json', 'jsonl'], + }, + ]; +} const VSCODE_HIDDEN_SLASH_COMMANDS = [ 'theme', @@ -186,11 +195,6 @@ function readTheme(): WebShellTheme { return /light/i.test(kind) ? 'light' : 'dark'; } -function readLanguage(): 'en' | 'zh-CN' { - const language = document.documentElement.lang || navigator.language; - return language.toLowerCase().startsWith('zh') ? 'zh-CN' : 'en'; -} - interface RuntimeConfig { baseUrl: string; token?: string; @@ -364,6 +368,9 @@ function permissionDiffPreview( export function EmbeddedApp() { const vscode = useVSCode(); + const language = useMemo(readLanguage, []); + const t = useMemo(() => createChromeStrings(language), [language]); + const slashCommands = useMemo(() => buildVsCodeSlashCommands(t), [t]); const [theme, setTheme] = useState(readTheme); const initialRuntime = useMemo(readRuntimeConfig, []); const [runtime, setRuntime] = useState(initialRuntime); @@ -377,7 +384,7 @@ export function EmbeddedApp() { const [insightReportPath, setInsightReportPath] = useState(); const [activeFile, setActiveFile] = useState(); const [includeActiveFile, setIncludeActiveFile] = useState(true); - const [sessionTitle, setSessionTitle] = useState('New Session'); + const [sessionTitle, setSessionTitle] = useState(() => t('session.new')); const [sessionHistoryOpen, setSessionHistoryOpen] = useState(false); const [sessionSearchQuery, setSessionSearchQuery] = useState(''); const [sessions, setSessions] = useState([]); @@ -428,6 +435,10 @@ export function EmbeddedApp() { pageSize: 20, cursor, archiveState: 'active', + // Only conversations started from VS Code. The daemon is shared + // with the CLI and the browser Web Shell for this workspace, so an + // unfiltered page lists sessions the user never opened here. + sourceType: VSCODE_SESSION_SOURCE_TYPE, }); const pageSessions = Array.isArray(page.sessions) ? page.sessions : []; setSessions((current) => { @@ -453,7 +464,7 @@ export function EmbeddedApp() { setSessionCursor(page.nextCursor); } catch (error) { setSessionListError( - error instanceof Error ? error.message : 'Failed to load sessions.', + error instanceof Error ? error.message : t('session.loadFailed'), ); } finally { setSessionListLoading(false); @@ -465,6 +476,7 @@ export function EmbeddedApp() { runtime?.workspaceCwd, sessionListLoading, sessionTitle, + t, ], ); @@ -644,9 +656,7 @@ export function EmbeddedApp() { const errorMessage = (message.data as { message?: unknown } | null) ?.message; setRuntimeError( - typeof errorMessage === 'string' - ? errorMessage - : 'Qwen Code failed to start.', + typeof errorMessage === 'string' ? errorMessage : t('boot.failed'), ); } else if (message.type === 'error') { const text = (message.data as { message?: unknown } | null)?.message; @@ -672,7 +682,7 @@ export function EmbeddedApp() { setAuthConnecting(false); setAuthError(undefined); if (message.type === 'authSuccess') { - setHostNotice({ tone: 'info', text: 'Signed in successfully.' }); + setHostNotice({ tone: 'info', text: t('auth.signedIn') }); } } else if (message.type === 'authCancelled') { setAuthenticated(false); @@ -692,7 +702,7 @@ export function EmbeddedApp() { ? data.message : typeof data?.error === 'string' ? data.error - : 'Failed to connect to Qwen Code.'; + : t('auth.failed'); setAuthenticated(false); setAuthConnecting(false); setAuthError(text); @@ -805,7 +815,7 @@ export function EmbeddedApp() { window.addEventListener('message', receiveBootstrap); vscode.postMessage({ type: 'webShellReady', data: {} }); return () => window.removeEventListener('message', receiveBootstrap); - }, [clearInsight, closeOpenPermissionDiffs, updateTranscript, vscode]); + }, [clearInsight, closeOpenPermissionDiffs, t, updateTranscript, vscode]); if (!runtime) { return ( @@ -834,7 +844,7 @@ export function EmbeddedApp() { /> )} - {runtimeError ?? 'Starting Qwen Code...'} + {runtimeError ?? t('boot.starting')}
); } @@ -847,6 +857,7 @@ export function EmbeddedApp() { {sessionHistoryOpen && ( current && current.sessionId !== session.sessionId ? { ...current, sessionId: session.sessionId } @@ -901,7 +912,7 @@ export function EmbeddedApp() { setSessionListError( error instanceof Error ? error.message - : 'Failed to rename session.', + : t('session.renameFailed'), ); } }} @@ -928,7 +939,7 @@ export function EmbeddedApp() { setSessionListError( error instanceof Error ? error.message - : 'Failed to delete session.', + : t('session.deleteFailed'), ); } }} @@ -957,9 +968,7 @@ export function EmbeddedApp() { style={{ animation: 'qwen-vscode-spin 0.8s linear infinite' }} /> - {creatingSession - ? 'Starting new session…' - : 'Loading conversation…'} + {creatingSession ? t('session.creating') : t('session.switching')}
)} @@ -980,8 +989,8 @@ export function EmbeddedApp() { ref={historyButtonRef} type="button" className="qwen-vscode-header-button" - title="Past conversations" - aria-label="Past conversations" + title={t('header.history')} + aria-label={t('header.history')} aria-haspopup="dialog" aria-expanded={sessionHistoryOpen} aria-controls={ @@ -1026,8 +1035,8 @@ export function EmbeddedApp() {
- {insightProgress.detail ?? 'Processing your chat history…'} + {insightProgress.detail ?? t('insight.progressDetail')}
- Insight report generated: {insightReportPath} + {t('insight.ready')} {insightReportPath} {error && (
- Supports Coding Plan, ModelStudio API Key, and OpenAI-compatible - providers. + {t('onboarding.providers')}
diff --git a/packages/vscode-ide-companion/src/webview/components/SessionHistoryDropdown.tsx b/packages/vscode-ide-companion/src/webview/components/SessionHistoryDropdown.tsx index fc74ef780cc..9cca18647a5 100644 --- a/packages/vscode-ide-companion/src/webview/components/SessionHistoryDropdown.tsx +++ b/packages/vscode-ide-companion/src/webview/components/SessionHistoryDropdown.tsx @@ -4,11 +4,13 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { Fragment, useEffect, useRef, useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; import type { DaemonSessionSummary } from '@qwen-code/sdk/daemon'; +import type { ChromeStrings } from '../strings.js'; import { LoaderCircle, Pencil, Search, Trash2 } from 'lucide-react'; interface SessionHistoryDropdownProps { + t: ChromeStrings; sessions: readonly DaemonSessionSummary[]; currentSessionId?: string; searchQuery: string; @@ -23,29 +25,33 @@ interface SessionHistoryDropdownProps { onClose: () => void; } -function groupSessions(sessions: readonly DaemonSessionSummary[]) { +function groupSessions( + sessions: readonly DaemonSessionSummary[], + t: ChromeStrings, +) { const today = new Date(); today.setHours(0, 0, 0, 0); const yesterday = new Date(today); yesterday.setDate(yesterday.getDate() - 1); const groups = new Map([ - ['Today', []], - ['Yesterday', []], - ['This Week', []], - ['Older', []], + [t('group.today'), []], + [t('group.yesterday'), []], + [t('group.thisWeek'), []], + [t('group.older'), []], ]); for (const session of sessions) { const timestamp = session.updatedAt ?? session.createdAt; const date = timestamp ? new Date(timestamp) : undefined; - let label = 'Older'; + let label = t('group.older'); if (date && !Number.isNaN(date.getTime())) { const day = new Date(date); day.setHours(0, 0, 0, 0); - if (day.getTime() === today.getTime()) label = 'Today'; - else if (day.getTime() === yesterday.getTime()) label = 'Yesterday'; - else if (day.getTime() > today.getTime() - 7 * 86_400_000) { - label = 'This Week'; + if (day.getTime() === today.getTime()) label = t('group.today'); + else if (day.getTime() === yesterday.getTime()) { + label = t('group.yesterday'); + } else if (day.getTime() > today.getTime() - 7 * 86_400_000) { + label = t('group.thisWeek'); } } groups.get(label)?.push(session); @@ -57,22 +63,45 @@ function groupSessions(sessions: readonly DaemonSessionSummary[]) { })).filter((group) => group.sessions.length > 0); } -function timeAgo(timestamp?: string): string { +function timeAgo(timestamp: string | undefined, t: ChromeStrings): string { if (!timestamp) return ''; const elapsed = Date.now() - new Date(timestamp).getTime(); if (!Number.isFinite(elapsed)) return ''; const minutes = Math.floor(elapsed / 60_000); - if (minutes < 1) return 'now'; + if (minutes < 1) return t('time.now'); if (minutes < 60) return `${minutes}m`; const hours = Math.floor(elapsed / 3_600_000); if (hours < 24) return `${hours}h`; const days = Math.floor(elapsed / 86_400_000); - if (days === 1) return 'Yesterday'; + if (days === 1) return t('group.yesterday'); if (days < 7) return `${days}d`; return new Date(timestamp).toLocaleDateString(); } +/** + * Row actions are revealed by hover *or* keyboard focus. Gating them on a + * React `hovered` flag alone left rename and delete unreachable without a + * mouse, and unmounting the focused button on mouse-out drops focus to + * ``; CSS keeps them mounted and reachable. + */ +const DROPDOWN_CSS = ` + .qwen-session-row-actions { visibility: hidden; } + .qwen-session-row:hover .qwen-session-row-actions, + .qwen-session-row:focus-within .qwen-session-row-actions, + .qwen-session-row-actions[data-confirming] { visibility: visible; } + .qwen-session-row:focus-visible, + .qwen-session-search:focus-visible, + .qwen-session-icon-button:focus-visible { + outline: 1px solid var(--vscode-focusBorder); + outline-offset: -1px; + } + .qwen-session-icon-button:hover { + background: var(--vscode-toolbar-hoverBackground); + } +`; + export function SessionHistoryDropdown({ + t, sessions, currentSessionId, searchQuery, @@ -98,6 +127,11 @@ export function SessionHistoryDropdown({ searchRef.current?.focus(); }, []); + // A stale "Delete?" must not survive a change of what is on screen. + useEffect(() => { + setConfirmDeleteId(undefined); + }, [searchQuery]); + useEffect(() => { if (renamingId) { renameRef.current?.focus(); @@ -127,7 +161,7 @@ export function SessionHistoryDropdown({ <> - {!active && - (confirmDeleteId === session.sessionId ? ( - - ) : ( - - ))} - - )} +