diff --git a/chat/package.json b/chat/package.json index 9298a924..7b4201bf 100644 --- a/chat/package.json +++ b/chat/package.json @@ -1,9 +1,9 @@ { "name": "@patchwork/chat", - "version": "0.4.0", + "version": "0.5.0", "description": "chitterchatter: chat with emoji reactions, presence/typing indicators, image paste, voice notes, and message replies.", "type": "module", - "main": "./main.js", + "main": "./dist/index.js", "exports": { ".": "./dist/index.js" }, @@ -25,8 +25,8 @@ "dependencies": { "@automerge/automerge": "^3.2.1", "@automerge/automerge-repo": "^2.5.0", - "@chee/patchwork-llm": "^0.2.1", "@chee/patchwork-transcript": "^0.1.0", + "@grjte/patchwork-worker": "^0.0.2", "@inkandswitch/patchwork-elements": "^6.0.2", "@inkandswitch/patchwork-filesystem": "^0.2.9", "cute.txt": "^0.0.6", diff --git a/chat/pnpm-lock.yaml b/chat/pnpm-lock.yaml index a227d145..157e3535 100644 --- a/chat/pnpm-lock.yaml +++ b/chat/pnpm-lock.yaml @@ -31,38 +31,38 @@ importers: dependencies: '@automerge/automerge': specifier: ^3.2.1 - version: 3.4.0 + version: 3.5.0 '@automerge/automerge-repo': specifier: ^2.5.0 version: 2.5.6 - '@chee/patchwork-llm': - specifier: ^0.2.1 - version: 0.2.1(@automerge/automerge-repo@2.5.6) '@chee/patchwork-transcript': specifier: ^0.1.0 version: 0.1.0(@automerge/automerge-repo@2.5.6) + '@grjte/patchwork-worker': + specifier: ^0.0.2 + version: 0.0.2(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0)) '@inkandswitch/patchwork-elements': specifier: ^6.0.2 - version: 6.0.2(@automerge/automerge-repo@2.5.6)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.4.0))(@inkandswitch/patchwork-plugins@1.2.5(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.4.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.4.0)))(@inkandswitch/patchwork-providers@0.5.2(@automerge/automerge-repo@2.5.6))(solid-js@1.9.14) + version: 6.0.2(@automerge/automerge-repo@2.5.6)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0))(@inkandswitch/patchwork-plugins@1.2.5(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0)))(@inkandswitch/patchwork-providers@0.5.2(@automerge/automerge-repo@2.5.6))(solid-js@1.9.15) '@inkandswitch/patchwork-filesystem': specifier: ^0.2.9 - version: 0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.4.0) + version: 0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0) cute.txt: specifier: ^0.0.6 - version: 0.0.6(@automerge/automerge@3.4.0)(@codemirror/state@6.7.5)(@codemirror/view@6.43.12)(solid-js@1.9.14) + version: 0.0.6(@automerge/automerge@3.5.0)(@codemirror/state@6.7.6)(@codemirror/view@6.43.13)(solid-js@1.9.15) solid-automerge: specifier: ^2.0.2 - version: 2.0.2(@automerge/automerge-repo@2.5.6)(solid-js@1.9.14) + version: 2.0.2(@automerge/automerge-repo@2.5.6)(solid-js@1.9.15) solid-js: specifier: ^1.9.11 - version: 1.9.14 + version: 1.9.15 devDependencies: '@chee/patchwork-bundles': specifier: ^0.2.0 - version: 0.2.0(@automerge/automerge@3.4.0) + version: 0.2.0(@automerge/automerge@3.5.0) '@inkandswitch/patchwork-bootloader': specifier: ^0.7.2 - version: 0.7.2(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.4.0) + version: 0.7.2(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0) happy-dom: specifier: ^15.11.7 version: 15.11.7 @@ -77,7 +77,7 @@ importers: version: 3.5.2(vite@5.4.21(@types/node@20.19.43)) vite-plugin-solid: specifier: ^2.10.0 - version: 2.11.14(solid-js@1.9.14)(vite@5.4.21(@types/node@20.19.43)) + version: 2.11.14(solid-js@1.9.15)(vite@5.4.21(@types/node@20.19.43)) vitest: specifier: ^3.2.4 version: 3.2.7(@types/debug@4.1.13)(@types/node@20.19.43)(happy-dom@15.11.7) @@ -123,8 +123,8 @@ packages: '@automerge/automerge@3.3.2': resolution: {integrity: sha512-9vCdCL7pdQwUra66SBxPVHr+/t9epXKni9KDeak2rNBFMzABVh2u6gSpcwxi3jkR5qr047jVqZv9DlrOfVxLFw==} - '@automerge/automerge@3.4.0': - resolution: {integrity: sha512-THmghtTNGGt2xsI0pM3o1i3PM8oZKcYFgOj25FOzW7l6e94SQOivNtCwy6xc0I8hVJsQSSotoBNs+yk/9hM2dg==} + '@automerge/automerge@3.5.0': + resolution: {integrity: sha512-ejbqJWfXWM2QbTcUK/5ugYiQiyOP7LYVAp/RuSvthCc07oek0FClMxEuouuhjrLjVPDSI34RP1ftGc45PF7WRA==} '@babel/code-frame@7.29.7': resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} @@ -184,8 +184,8 @@ packages: resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.8': - resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} + '@babel/parser@7.29.9': + resolution: {integrity: sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==} engines: {node: '>=6.0.0'} hasBin: true @@ -240,11 +240,6 @@ packages: '@chee/patchwork-bundles@0.2.0': resolution: {integrity: sha512-Hc8YhdYM1s/6ij08wMFFBa0+LUyPyW7EBh8yrIsWtBzurWcsHnCtdF7ObZtWVqslkLjlgLqcvpDHYpWhfg6I0g==} - '@chee/patchwork-llm@0.2.1': - resolution: {integrity: sha512-9XZj8AiGqvHZrtFXdLth+2DwK3bBXjZWtbdxWJmZXv/5hxuIB6sV92OZgtuU6vPy4yjN1RY0+OMHJjS2VOnqTw==} - peerDependencies: - '@automerge/automerge-repo': ^2.5.6 - '@chee/patchwork-transcript@0.1.0': resolution: {integrity: sha512-yBBBAS7OP+3dlUt11LqGW95VhIbZDlAJUN53xUNb99Lf4XFwGHNPkSpLpTM9chbWcDciaMr3h4ZNzfRjtXfqYw==} peerDependencies: @@ -256,11 +251,11 @@ packages: '@codemirror/language@6.12.4': resolution: {integrity: sha512-1q4PaT+o6PbgpkJt4Q8Fv5XJxTy4FUZ4MWETtyiDw3J0Pyr9E2vqcKL+k9wcvjNTIsauxvE7OfmWj3FRPHQ76A==} - '@codemirror/state@6.7.5': - resolution: {integrity: sha512-QjLbZmY1Au3JiRrDVYFLRD0BZ3SOKS9pR3yjIkd7u27YY8TFD9/Q9fhPnLV5l1mHFSo3hHU/N31vpwEJOx4owQ==} + '@codemirror/state@6.7.6': + resolution: {integrity: sha512-kAz+AncRtKuIknedxT1bq4XwXv4UowhbkHU1myPrtVb/jZtImWuV5BXzv5vK6i3kYACsdiZiQKFQQ5Mq7elW8w==} - '@codemirror/view@6.43.12': - resolution: {integrity: sha512-Nv0vxQ19NAqvB/c2pFzjIzFlzzJl7jmdtNkwOwGbn0Ks9mFAzibvumz7cQem5cRsFA2cEw2fg+uHZGbcHupLQQ==} + '@codemirror/view@6.43.13': + resolution: {integrity: sha512-sihaFrUzAsYBQsL9J2t69y8nfMQGwcYmggAZsk+kjPbjYZMyuf2hU8tUNTZ+P+isb6XRr8JE22TZlJxBoVdH1A==} '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} @@ -400,6 +395,9 @@ packages: cpu: [x64] os: [win32] + '@grjte/patchwork-worker@0.0.2': + resolution: {integrity: sha512-a7vJ0O2ZNyOUzCyK32PwaGJbVxUFqE/lHhRGadR3lA1XWpbIJ059B4qDpthn8R4eUzGPAIqFy2k0lawaLsKktA==} + '@inkandswitch/patchwork-bootloader@0.7.2': resolution: {integrity: sha512-b5ki9fodXB7uEzvBvpZ0uAkaM7CwwtAdD596XKZJY+TjaSnYsWnx0IP0ewz9rL6ASU282ItyCB8917PKxr8ckA==} peerDependencies: @@ -441,6 +439,13 @@ packages: '@automerge/automerge': '*' '@automerge/automerge-repo': '*' + '@inkandswitch/patchwork-plugins@0.0.11': + resolution: {integrity: sha512-ElwDEixpZN64gdoE7EU8QFz4WzvyJt6j4Zn0pTezsW6SzGlx+Rc6Ox+7POK7gqEzQEcl3Iqo8+QdYRucYllRFw==} + peerDependencies: + '@automerge/automerge': '*' + '@automerge/automerge-repo': '*' + '@inkandswitch/patchwork-filesystem': ^0.0.8 + '@inkandswitch/patchwork-plugins@1.2.5': resolution: {integrity: sha512-4R/N6W4v4Xyfp47RaG7WesN0jUdNsQmZshJt9pHfsTbAFEbvNvgnmC2JF9mzSL5CagCy1njACIoasOVvkv/A/A==} peerDependencies: @@ -468,8 +473,8 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} @@ -500,141 +505,141 @@ packages: resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} - '@rollup/rollup-android-arm-eabi@4.62.4': - resolution: {integrity: sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==} + '@rollup/rollup-android-arm-eabi@4.63.4': + resolution: {integrity: sha512-I+BSHzTAhKN2n7ZwGZsegGcZjDpLqFOMAtJz/u6uFGe0pUFbq56dEHjqJV/ZUdRJtNXNxA+hREUatZBvMR3Oiw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.62.4': - resolution: {integrity: sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==} + '@rollup/rollup-android-arm64@4.63.4': + resolution: {integrity: sha512-pu3BdjS2LtEzRu2elmGzS3fIeWSZy4BMDIaLNwjorO76+k2d0LMluijhsDx3KQyQBQ/lLUZCQA9/s6csvUfuhw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.62.4': - resolution: {integrity: sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==} + '@rollup/rollup-darwin-arm64@4.63.4': + resolution: {integrity: sha512-xfSrj9MHnWK9GaSqT9U0ImHtH/N8WZlHLx4cZHiuLcqs640hvZ3hLPd5UR2AZS57FaE8HrRUSpltbZdWRxHiDA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.62.4': - resolution: {integrity: sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==} + '@rollup/rollup-darwin-x64@4.63.4': + resolution: {integrity: sha512-bqU99PLJb/dqb3S0GIMdeuyAEETSUgZBoqXYd3Sd+WCsV+MmPhnN6JrotWyir31+QgH7EvvE5/mwGJlEoci8Fw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.62.4': - resolution: {integrity: sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==} + '@rollup/rollup-freebsd-arm64@4.63.4': + resolution: {integrity: sha512-JinsFZ5G40oXQb+sUuiA5x689vhr6dDYK0H0NL+rwKdL6CqnmYN8PE4ZwfRSoIjrCxqTQG/SLfTtSvHeGxoVlw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.62.4': - resolution: {integrity: sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==} + '@rollup/rollup-freebsd-x64@4.63.4': + resolution: {integrity: sha512-GAdA4UxpiNm27cLHr2GqXBpAD0x9FqwYBY7/YSP0Ss0/PNi4k8gbviqpIpYbVSRBaS2ZcegXEzgTQMbRNCwxCw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.62.4': - resolution: {integrity: sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==} + '@rollup/rollup-linux-arm-gnueabihf@4.63.4': + resolution: {integrity: sha512-qDd6NoA1znaLjp4jR5U/KWCdLAKDJNB8W9ChbbDaKbo0xA+Atln5HK6LFCZ4oJQpemtRZA288DCirFRjrspptw==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.62.4': - resolution: {integrity: sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==} + '@rollup/rollup-linux-arm-musleabihf@4.63.4': + resolution: {integrity: sha512-WtB5Tz5KTNINb8ZA+8sQ7bmjuS1JrRT7YverYIhUGdWWDlpzVWmIwuZE+jidkEXUn1l0zrEkaIMa8dHF3NGcsA==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.62.4': - resolution: {integrity: sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==} + '@rollup/rollup-linux-arm64-gnu@4.63.4': + resolution: {integrity: sha512-VcQ3L1tjnkKzWjryAVaFhHEWcqOfICX9uxVVoDzm2t0DpgKRHd2zOpVrJc0xsWeBZcBFyYROCIBdyR/fS174pg==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.62.4': - resolution: {integrity: sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==} + '@rollup/rollup-linux-arm64-musl@4.63.4': + resolution: {integrity: sha512-6+ZQX6P5s0cMDN2Ypb8Lbm2+/sZYmZjdaYny992ujUU9UKi/4CWoJWsl1pNvjWJHNHGK51m+jKGLlh1ylb2ifQ==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.62.4': - resolution: {integrity: sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==} + '@rollup/rollup-linux-loong64-gnu@4.63.4': + resolution: {integrity: sha512-D72ZnvkFkBXOfzMMQLcwfPLyGkKb7HZ9/mf97B7v6/P5Lbv4oFOtSY/uHbS8lH6uKUOxoKiuokdb50XZSzzbJw==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.62.4': - resolution: {integrity: sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==} + '@rollup/rollup-linux-loong64-musl@4.63.4': + resolution: {integrity: sha512-piU6BxeqA3O9KSu3kRCIQQtNqFFaTu21SEV4FwaRZowpnj3bLaWPZHw+xFqCs0XlJ+aOH3PTRWGoglH+mKA/OA==} cpu: [loong64] os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.62.4': - resolution: {integrity: sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==} + '@rollup/rollup-linux-ppc64-gnu@4.63.4': + resolution: {integrity: sha512-/5PGpHwqt2EEEOUs1XwzubE/ucr0dWDQ+to3zqi4Ds7EWpwtQ79wXc4JBoxqj/OwpawTsKWzJxHfSuBOq3DrWA==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.62.4': - resolution: {integrity: sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==} + '@rollup/rollup-linux-ppc64-musl@4.63.4': + resolution: {integrity: sha512-cX3beZDLWt7G2oJF+nhChiT+qtaihs+S2xi7ziGmVB+2pwPng6D0Ed0HmElQOgv2UsUmSJJLGwpBao/3TDx3VA==} cpu: [ppc64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.62.4': - resolution: {integrity: sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==} + '@rollup/rollup-linux-riscv64-gnu@4.63.4': + resolution: {integrity: sha512-1uz2mGWHyptR7DgHHrlbdRAjXK7v7elGZ9lMja910/RP+ZYbX6xAmCiU9UZSX4hqmgtHMv6lr5l3kq1HIOpcag==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.62.4': - resolution: {integrity: sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==} + '@rollup/rollup-linux-riscv64-musl@4.63.4': + resolution: {integrity: sha512-nLS8topojxyz7SRpKR2IODRpQ0XPZ+xaOXvT3+hqK/Uy8Lo5HFgkkIBiIrCu5tL5YqzTvgovGw55PwpahTAGig==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.62.4': - resolution: {integrity: sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==} + '@rollup/rollup-linux-s390x-gnu@4.63.4': + resolution: {integrity: sha512-gs7DRKotr3l3q+jGPQBjH0ng1FjlEDm5ueQrkw5JtQvtLyEIcLASqAEaor56BhkKRzk+IcQzrcanBdb/bBQn8g==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.62.4': - resolution: {integrity: sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==} + '@rollup/rollup-linux-x64-gnu@4.63.4': + resolution: {integrity: sha512-791ET7W17NnScOZM7h4dX5hYspxE28htPFsb1awY/NRR8+PRNkS53e475rDdxXXDrP+kwnCcNWg9CX5ztn/Aqw==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.62.4': - resolution: {integrity: sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==} + '@rollup/rollup-linux-x64-musl@4.63.4': + resolution: {integrity: sha512-iwZQRcmj7g88g3tzefIrQY7qvmuA/cfYwhrDtTBhsmukO4U2huVO5W+86XacUMRvdSFVAc6kZUZy21JaRwiB9w==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.62.4': - resolution: {integrity: sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==} + '@rollup/rollup-openbsd-x64@4.63.4': + resolution: {integrity: sha512-dVHFp9gRWrdTpnqQuGfCwd7hOQDatK1VCP2iWhLY/cGrOQs/ucFzJ6A5SRqbXX12ZDI8EUuejSM5kwg+ja7Png==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.62.4': - resolution: {integrity: sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==} + '@rollup/rollup-openharmony-arm64@4.63.4': + resolution: {integrity: sha512-t3NlauOW6gxZVVFcBEnO62Cb4wbyDFL416gTg1uFI/2tgqYQlf69FbSE115Ajre9I+c26Lk4mcmdFUsS/DGifQ==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.62.4': - resolution: {integrity: sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==} + '@rollup/rollup-win32-arm64-msvc@4.63.4': + resolution: {integrity: sha512-xWuIaSye5FWZF8+UYtVEcHtRJDN5kN9Kfgxx3Kq8XIov9KSKbc1fiqQCm90SKrgQbUXZelbnUhnlUJmfSE7P9A==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.62.4': - resolution: {integrity: sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==} + '@rollup/rollup-win32-ia32-msvc@4.63.4': + resolution: {integrity: sha512-9ALJJUOg/ZflMJepVo2PlgsGxSaxN7SQ4Z8GoZfVlarWr6r3rkHUNsd/zAio7p4YMtChSMXPionxej4Hkf6CXQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.62.4': - resolution: {integrity: sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==} + '@rollup/rollup-win32-x64-gnu@4.63.4': + resolution: {integrity: sha512-blj9z5qx/Pv4WU0W1NMFDB97e0JH5ed+aZGywW8WCvp/NhWX/4PFAq5uu6Q0AebNn+Vo6KzUYDT++JzTT5ojlQ==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.62.4': - resolution: {integrity: sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==} + '@rollup/rollup-win32-x64-msvc@4.63.4': + resolution: {integrity: sha512-Erx822VRBwLa124shbj+wNXe//BOgMEctDV0m1aqTQdNO1S69DgNUCFKC1RCeZfixs1J31l6igk1ziyXErbigQ==} cpu: [x64] os: [win32] @@ -714,16 +719,16 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - babel-plugin-jsx-dom-expressions@0.40.7: - resolution: {integrity: sha512-/O6JWUmjv03OI9lL2ry9bUjpD5S3PclM55RRJEyCdcFZ5W2SEA/59d+l2hNsk3gI6kiWRdRPdOtqZmsQzFN1pQ==} + babel-plugin-jsx-dom-expressions@0.40.10: + resolution: {integrity: sha512-lxve6Y02YiZTldB7efKpnbf1BH00XCFZNYYW235jSGsYaJNFtHrYlKV6/O+miHbjqpIr9FTe5+0no4hofAMbfA==} peerDependencies: '@babel/core': ^7.20.12 - babel-preset-solid@1.9.12: - resolution: {integrity: sha512-LLqnuKVDlKpyBlMPcH6qEvs/wmS9a+NczppxJ3ryS/c0O5IiSFOIBQi9GzyiGDSbcJpx4Gr87jyFTos1MyEuWg==} + babel-preset-solid@1.9.15: + resolution: {integrity: sha512-GBmg1OiPb+OwcH51XbDAKPtvrPfQW7rCJTJxcp8+yhtWwN+kqnbEJk2SgVybd+uhTxTKAvjaFyiQSr/eUZBwzg==} peerDependencies: '@babel/core': ^7.0.0 - solid-js: ^1.9.12 + solid-js: ^1.9.15 peerDependenciesMeta: solid-js: optional: true @@ -734,13 +739,13 @@ packages: base-x@5.0.1: resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} - baseline-browser-mapping@2.11.12: - resolution: {integrity: sha512-r7WnVImvVCeFpf2DOXfy41aPWzeNg3H/A2X4dKmy1QL0MSyyk/e7z8ihJ3N6Nn2PsdhkVlqnEfnUE4a05P2aTA==} + baseline-browser-mapping@2.11.25: + resolution: {integrity: sha512-gMmEShwwq7FJqMwvfRwvCl00v4kN+KOfJqXn+f4nrufak5gNHJOksd/60Dvjuz7sI8Y5WiSFBa8FEYr+zoyqCw==} engines: {node: '>=6.0.0'} hasBin: true - browserslist@4.28.7: - resolution: {integrity: sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==} + browserslist@4.29.0: + resolution: {integrity: sha512-3GSvyjvDI4Dur1Meg2BekJquu5uF+9R9a1+5M1Mde192eZoXbeXjzgOsgqPS2V8D5wrrip0gR5Hf/GhWQ9ZzaA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -763,15 +768,15 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - caniuse-lite@1.0.30001807: - resolution: {integrity: sha512-daRXJ9EB/rdRgu7kV+TTl1YUKtlsMWblPl2sLnpg9DZae16QCegol6A1SmCE31Lm9mXC1sRWGt/krouH+/dl7Q==} + caniuse-lite@1.0.30001810: + resolution: {integrity: sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==} cbor-extract@2.2.2: resolution: {integrity: sha512-hlSxxI9XO2yQfe9g6msd3g4xCfDqK5T5P0fRMLuaLHhxn4ViPrm+a+MUfhrvH2W962RGxcBwEGzLQyjbDG1gng==} hasBin: true - cbor-x@1.6.5: - resolution: {integrity: sha512-yO64CxnSh6kp+pHNRK9IfwnMvCB+c8HvmUjQY/9l9YRF0/cAPka/tUHLwS64QqUpFCq3/OtbKziVJYXH2EaRig==} + cbor-x@1.6.6: + resolution: {integrity: sha512-8QiD9PGOxyQHo7s2pzwTBH6lTjqekxPdl9Aq6fXvZgCuCJHOht1puDEA/fTr6mciB76c+M+Gi0qT2i1a4pm4Wg==} chai@5.3.3: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} @@ -824,8 +829,8 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - electron-to-chromium@1.5.402: - resolution: {integrity: sha512-/oOpMaPT6Yg+6/1XQhyIPlzgj7Ye9zf+nNM2Uh6OcE2G2oNptWazFa+qB2Pdqqbsc9KnIDzgAntoYN0dbwOXwA==} + electron-to-chromium@1.5.438: + resolution: {integrity: sha512-AN9xMU1hJiT65LkCUPL1DZm5TCbOPb2Qsm5pYwFLEXp6/qj9SdT4yMiqs7Qqstwvkn1zF7l36SRGt+s6XcJ0FA==} entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} @@ -838,8 +843,8 @@ packages: es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - es-module-lexer@2.3.1: - resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} + es-module-lexer@2.3.2: + resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} @@ -929,8 +934,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.17: - resolution: {integrity: sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==} + nanoid@3.3.19: + resolution: {integrity: sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -938,8 +943,8 @@ packages: resolution: {integrity: sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==} hasBin: true - node-releases@2.0.53: - resolution: {integrity: sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==} + node-releases@2.0.57: + resolution: {integrity: sha512-kQK9LGGFiHtrWiNhZtA7Qbw17AQz+dmsEKODRIVTXA9+e5MS/2gZEBhYJt13GrAz5/IOZKddH/0Z3TP/Zgo+yw==} engines: {node: '>=18'} parse5@7.3.0: @@ -955,20 +960,20 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@4.0.5: - resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} engines: {node: '>=12'} - postcss@8.5.26: - resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} + postcss@8.5.28: + resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} engines: {node: ^10 || ^12 || >=14} resolve.exports@2.0.3: resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} engines: {node: '>=10'} - rollup@4.62.4: - resolution: {integrity: sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==} + rollup@4.63.4: + resolution: {integrity: sha512-4U0liVayNIoLp3GFl1FcI8561WepLnZ1rqfraGh7S9B3Ur5F9S283y8Futii7RUU2C/97tOBmBy7nYvhoiOpbQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -995,8 +1000,8 @@ packages: '@automerge/automerge-repo': ^2.6.0-subduction.34 solid-js: ^1.9.13 - solid-js@1.9.14: - resolution: {integrity: sha512-sAEXC0Kk0S1EDg+8ysEWJDbYhA3RRoEjwuySUGlKIemeo0I5YZfOyumNjNs9Sv3y2nmhD+0rW66ag2HsMuQiGQ==} + solid-js@1.9.15: + resolution: {integrity: sha512-EeiY2xfpZJqPLjXspVEKjAII4yv8NyG//NxZ3IpOFHdUNnnTyL0uJOeS9LWGvA7cFCz5y94cjFwYlmw5Luncsg==} solid-refresh@0.6.3: resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} @@ -1041,8 +1046,8 @@ packages: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyspy@4.0.4: - resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + tinyspy@4.0.6: + resolution: {integrity: sha512-u8KszXvGfU68hVcZpRHKG28T0krMuv2G5nDhiHaMLen/gIuFEgIJhaJuO69qjnXg5paSrbPMFfx3brNuN8eVSg==} engines: {node: '>=14.0.0'} typescript@5.9.3: @@ -1057,14 +1062,14 @@ packages: resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} engines: {node: '>=18.12.0'} - update-browserslist-db@1.2.3: - resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + update-browserslist-db@1.3.3: + resolution: {integrity: sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' - uuid@14.0.1: - resolution: {integrity: sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==} + uuid@14.0.2: + resolution: {integrity: sha512-xZe/16rV4aa+HGSOCiY2YeLT1OybRLrrkL/Rqaq7p7GMVXjFh+6wN4oMYgjFmnSnhY8t6Xpdl2l9qmnHYuMHwQ==} hasBin: true uuid@9.0.1: @@ -1178,8 +1183,8 @@ packages: engines: {node: '>=8'} hasBin: true - ws@8.21.2: - resolution: {integrity: sha512-54dMVAo4WIe6SKy3vBgN+9bJZqqQ8IMRevAkOLQALhi49qkkQDQfWdAZ8KQlXiEabw88ARXXdUrlvtbKQX+aKw==} + ws@8.21.3: + resolution: {integrity: sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -1190,8 +1195,8 @@ packages: utf-8-validate: optional: true - xstate@5.32.5: - resolution: {integrity: sha512-ULazi1oe6wGrXl0Frb6otSlkm5HLifbbVTkMk5kkSKqz4TkxJaVpnl6jOJwKeid3ORPxYyZQgNLUSYX9q65SIA==} + xstate@5.33.2: + resolution: {integrity: sha512-8tC7yXgeCvpT8gKEeEje6ikJJG1wpnoLiXe+HfECW8m10ubMd3QxKOwWA8KxPJVBcLwfdRoMKYxIBGYKmo37/A==} yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -1218,10 +1223,10 @@ snapshots: '@automerge/automerge-repo-network-websocket@2.6.0-subduction.48': dependencies: '@automerge/automerge-repo': 2.6.0-subduction.48 - cbor-x: 1.6.5 + cbor-x: 1.6.6 debug: 4.4.3 eventemitter3: 5.0.4 - ws: 8.21.2 + ws: 8.21.3 transitivePeerDependencies: - bufferutil - supports-color @@ -1237,14 +1242,14 @@ snapshots: '@automerge/automerge-repo@2.5.6': dependencies: - '@automerge/automerge': 3.4.0 + '@automerge/automerge': 3.5.0 bs58check: 3.0.1 - cbor-x: 1.6.5 + cbor-x: 1.6.6 debug: 4.4.3 eventemitter3: 5.0.4 fast-sha256: 1.3.0 uuid: 9.0.1 - xstate: 5.32.5 + xstate: 5.33.2 transitivePeerDependencies: - supports-color @@ -1253,14 +1258,14 @@ snapshots: '@automerge/automerge': 3.3.0-fragments.2 '@automerge/automerge-subduction': 0.16.0 bs58check: 4.0.0 - cbor-x: 1.6.5 + cbor-x: 1.6.6 debug: 4.4.3 eventemitter3: 5.0.4 fast-sha256: 1.3.0 - isomorphic-ws: 5.0.0(ws@8.21.2) - uuid: 14.0.1 - ws: 8.21.2 - xstate: 5.32.5 + isomorphic-ws: 5.0.0(ws@8.21.3) + uuid: 14.0.2 + ws: 8.21.3 + xstate: 5.33.2 transitivePeerDependencies: - bufferutil - supports-color @@ -1271,14 +1276,14 @@ snapshots: '@automerge/automerge': 3.3.2 '@automerge/automerge-subduction': 0.16.1 bs58check: 4.0.0 - cbor-x: 1.6.5 + cbor-x: 1.6.6 debug: 4.4.3 eventemitter3: 5.0.4 fast-sha256: 1.3.0 - isomorphic-ws: 5.0.0(ws@8.21.2) - uuid: 14.0.1 - ws: 8.21.2 - xstate: 5.32.5 + isomorphic-ws: 5.0.0(ws@8.21.3) + uuid: 14.0.2 + ws: 8.21.3 + xstate: 5.33.2 transitivePeerDependencies: - bufferutil - supports-color @@ -1292,7 +1297,7 @@ snapshots: '@automerge/automerge@3.3.2': {} - '@automerge/automerge@3.4.0': {} + '@automerge/automerge@3.5.0': {} '@babel/code-frame@7.29.7': dependencies: @@ -1309,7 +1314,7 @@ snapshots: '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) '@babel/helpers': 7.29.7 - '@babel/parser': 7.29.8 + '@babel/parser': 7.29.9 '@babel/template': 7.29.7 '@babel/traverse': 7.29.8 '@babel/types': 7.29.8 @@ -1324,7 +1329,7 @@ snapshots: '@babel/generator@7.29.8': dependencies: - '@babel/parser': 7.29.8 + '@babel/parser': 7.29.9 '@babel/types': 7.29.8 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 @@ -1334,7 +1339,7 @@ snapshots: dependencies: '@babel/compat-data': 7.29.7 '@babel/helper-validator-option': 7.29.7 - browserslist: 4.28.7 + browserslist: 4.29.0 lru-cache: 5.1.1 semver: 6.3.1 @@ -1373,7 +1378,7 @@ snapshots: '@babel/template': 7.29.7 '@babel/types': 7.29.8 - '@babel/parser@7.29.8': + '@babel/parser@7.29.9': dependencies: '@babel/types': 7.29.8 @@ -1385,7 +1390,7 @@ snapshots: '@babel/template@7.29.7': dependencies: '@babel/code-frame': 7.29.7 - '@babel/parser': 7.29.8 + '@babel/parser': 7.29.9 '@babel/types': 7.29.8 '@babel/traverse@7.29.8': @@ -1393,7 +1398,7 @@ snapshots: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.8 '@babel/helper-globals': 7.29.7 - '@babel/parser': 7.29.8 + '@babel/parser': 7.29.9 '@babel/template': 7.29.7 '@babel/types': 7.29.8 debug: 4.4.3 @@ -1423,12 +1428,12 @@ snapshots: '@cbor-extract/cbor-extract-win32-x64@2.2.2': optional: true - '@chee/patchwork-bundles@0.2.0(@automerge/automerge@3.4.0)': + '@chee/patchwork-bundles@0.2.0(@automerge/automerge@3.5.0)': dependencies: '@automerge/automerge-repo': 2.6.0-subduction.40 - '@inkandswitch/patchwork-bootloader': 0.7.2(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.4.0) - '@inkandswitch/patchwork-filesystem': 0.2.9(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.4.0) - es-module-lexer: 2.3.1 + '@inkandswitch/patchwork-bootloader': 0.7.2(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.5.0) + '@inkandswitch/patchwork-filesystem': 0.2.9(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.5.0) + es-module-lexer: 2.3.2 resolve.exports: 2.0.3 unplugin: 2.3.11 transitivePeerDependencies: @@ -1441,11 +1446,6 @@ snapshots: - supports-color - utf-8-validate - '@chee/patchwork-llm@0.2.1(@automerge/automerge-repo@2.5.6)': - dependencies: - '@automerge/automerge-repo': 2.5.6 - '@inkandswitch/patchwork-providers': 0.3.0(@automerge/automerge-repo@2.5.6) - '@chee/patchwork-transcript@0.1.0(@automerge/automerge-repo@2.5.6)': dependencies: '@automerge/automerge-repo': 2.5.6 @@ -1454,26 +1454,26 @@ snapshots: '@codemirror/commands@6.11.1': dependencies: '@codemirror/language': 6.12.4 - '@codemirror/state': 6.7.5 - '@codemirror/view': 6.43.12 + '@codemirror/state': 6.7.6 + '@codemirror/view': 6.43.13 '@lezer/common': 1.5.2 '@codemirror/language@6.12.4': dependencies: - '@codemirror/state': 6.7.5 - '@codemirror/view': 6.43.12 + '@codemirror/state': 6.7.6 + '@codemirror/view': 6.43.13 '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.10 style-mod: 4.1.4 - '@codemirror/state@6.7.5': + '@codemirror/state@6.7.6': dependencies: '@marijn/find-cluster-break': 1.0.4 - '@codemirror/view@6.43.12': + '@codemirror/view@6.43.13': dependencies: - '@codemirror/state': 6.7.5 + '@codemirror/state': 6.7.6 crelt: 1.0.7 style-mod: 4.1.4 w3c-keyname: 2.2.8 @@ -1547,7 +1547,17 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@inkandswitch/patchwork-bootloader@0.7.2(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.4.0)': + '@grjte/patchwork-worker@0.0.2(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0))': + dependencies: + '@inkandswitch/patchwork-plugins': 0.0.11(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0)) + '@inkandswitch/patchwork-providers': 0.5.2(@automerge/automerge-repo@2.5.6) + transitivePeerDependencies: + - '@automerge/automerge' + - '@automerge/automerge-repo' + - '@inkandswitch/patchwork-filesystem' + - supports-color + + '@inkandswitch/patchwork-bootloader@0.7.2(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0)': dependencies: '@automerge/automerge-repo-network-broadcastchannel': 2.6.0-subduction.48 '@automerge/automerge-repo-network-messagechannel': 2.6.0-subduction.48 @@ -1556,21 +1566,21 @@ snapshots: '@automerge/automerge-subduction': 0.16.1 '@codemirror/commands': 6.11.1 '@codemirror/language': 6.12.4 - '@codemirror/state': 6.7.5 - '@codemirror/view': 6.43.12 - '@inkandswitch/patchwork-elements': 6.0.2(@automerge/automerge-repo@2.5.6)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.4.0))(@inkandswitch/patchwork-plugins@1.2.5(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.4.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.4.0)))(@inkandswitch/patchwork-providers@0.5.2(@automerge/automerge-repo@2.5.6))(solid-js@1.9.14) - '@inkandswitch/patchwork-filesystem': 0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.4.0) - '@inkandswitch/patchwork-plugins': 1.2.5(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.4.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.4.0)) + '@codemirror/state': 6.7.6 + '@codemirror/view': 6.43.13 + '@inkandswitch/patchwork-elements': 6.0.2(@automerge/automerge-repo@2.5.6)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0))(@inkandswitch/patchwork-plugins@1.2.5(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0)))(@inkandswitch/patchwork-providers@0.5.2(@automerge/automerge-repo@2.5.6))(solid-js@1.9.15) + '@inkandswitch/patchwork-filesystem': 0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0) + '@inkandswitch/patchwork-plugins': 1.2.5(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0)) '@inkandswitch/patchwork-providers': 0.5.2(@automerge/automerge-repo@2.5.6) '@keyhive/keyhive': 0.1.0-alpha.8 '@types/debug': 4.1.13 debug: 4.4.3 resolve.exports: 2.0.3 service-worker-types: '@types/serviceworker@0.0.153' - solid-js: 1.9.14 + solid-js: 1.9.15 tinyargs: 0.1.4 optionalDependencies: - '@automerge/automerge': 3.4.0 + '@automerge/automerge': 3.5.0 '@automerge/automerge-repo': 2.5.6 transitivePeerDependencies: - '@types/react' @@ -1579,7 +1589,7 @@ snapshots: - supports-color - utf-8-validate - '@inkandswitch/patchwork-bootloader@0.7.2(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.4.0)': + '@inkandswitch/patchwork-bootloader@0.7.2(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.5.0)': dependencies: '@automerge/automerge-repo-network-broadcastchannel': 2.6.0-subduction.48 '@automerge/automerge-repo-network-messagechannel': 2.6.0-subduction.48 @@ -1588,21 +1598,21 @@ snapshots: '@automerge/automerge-subduction': 0.16.1 '@codemirror/commands': 6.11.1 '@codemirror/language': 6.12.4 - '@codemirror/state': 6.7.5 - '@codemirror/view': 6.43.12 - '@inkandswitch/patchwork-elements': 6.0.2(@automerge/automerge-repo@2.6.0-subduction.40)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.4.0))(@inkandswitch/patchwork-plugins@1.2.5(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.4.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.4.0)))(@inkandswitch/patchwork-providers@0.5.2(@automerge/automerge-repo@2.6.0-subduction.40))(solid-js@1.9.14) - '@inkandswitch/patchwork-filesystem': 0.2.9(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.4.0) - '@inkandswitch/patchwork-plugins': 1.2.5(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.4.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.4.0)) + '@codemirror/state': 6.7.6 + '@codemirror/view': 6.43.13 + '@inkandswitch/patchwork-elements': 6.0.2(@automerge/automerge-repo@2.6.0-subduction.40)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.5.0))(@inkandswitch/patchwork-plugins@1.2.5(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.5.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.5.0)))(@inkandswitch/patchwork-providers@0.5.2(@automerge/automerge-repo@2.6.0-subduction.40))(solid-js@1.9.15) + '@inkandswitch/patchwork-filesystem': 0.2.9(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.5.0) + '@inkandswitch/patchwork-plugins': 1.2.5(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.5.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.5.0)) '@inkandswitch/patchwork-providers': 0.5.2(@automerge/automerge-repo@2.6.0-subduction.40) '@keyhive/keyhive': 0.1.0-alpha.8 '@types/debug': 4.1.13 debug: 4.4.3 resolve.exports: 2.0.3 service-worker-types: '@types/serviceworker@0.0.153' - solid-js: 1.9.14 + solid-js: 1.9.15 tinyargs: 0.1.4 optionalDependencies: - '@automerge/automerge': 3.4.0 + '@automerge/automerge': 3.5.0 '@automerge/automerge-repo': 2.6.0-subduction.40 transitivePeerDependencies: - '@types/react' @@ -1611,53 +1621,66 @@ snapshots: - supports-color - utf-8-validate - '@inkandswitch/patchwork-elements@6.0.2(@automerge/automerge-repo@2.5.6)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.4.0))(@inkandswitch/patchwork-plugins@1.2.5(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.4.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.4.0)))(@inkandswitch/patchwork-providers@0.5.2(@automerge/automerge-repo@2.5.6))(solid-js@1.9.14)': + '@inkandswitch/patchwork-elements@6.0.2(@automerge/automerge-repo@2.5.6)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0))(@inkandswitch/patchwork-plugins@1.2.5(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0)))(@inkandswitch/patchwork-providers@0.5.2(@automerge/automerge-repo@2.5.6))(solid-js@1.9.15)': dependencies: '@automerge/automerge-repo': 2.5.6 - '@inkandswitch/patchwork-filesystem': 0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.4.0) - '@inkandswitch/patchwork-plugins': 1.2.5(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.4.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.4.0)) + '@inkandswitch/patchwork-filesystem': 0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0) + '@inkandswitch/patchwork-plugins': 1.2.5(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0)) '@inkandswitch/patchwork-providers': 0.5.2(@automerge/automerge-repo@2.5.6) debug: 4.4.3 optionalDependencies: - solid-js: 1.9.14 + solid-js: 1.9.15 transitivePeerDependencies: - supports-color - '@inkandswitch/patchwork-elements@6.0.2(@automerge/automerge-repo@2.6.0-subduction.40)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.4.0))(@inkandswitch/patchwork-plugins@1.2.5(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.4.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.4.0)))(@inkandswitch/patchwork-providers@0.5.2(@automerge/automerge-repo@2.6.0-subduction.40))(solid-js@1.9.14)': + '@inkandswitch/patchwork-elements@6.0.2(@automerge/automerge-repo@2.6.0-subduction.40)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.5.0))(@inkandswitch/patchwork-plugins@1.2.5(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.5.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.5.0)))(@inkandswitch/patchwork-providers@0.5.2(@automerge/automerge-repo@2.6.0-subduction.40))(solid-js@1.9.15)': dependencies: '@automerge/automerge-repo': 2.6.0-subduction.40 - '@inkandswitch/patchwork-filesystem': 0.2.9(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.4.0) - '@inkandswitch/patchwork-plugins': 1.2.5(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.4.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.4.0)) + '@inkandswitch/patchwork-filesystem': 0.2.9(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.5.0) + '@inkandswitch/patchwork-plugins': 1.2.5(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.5.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.5.0)) '@inkandswitch/patchwork-providers': 0.5.2(@automerge/automerge-repo@2.6.0-subduction.40) debug: 4.4.3 optionalDependencies: - solid-js: 1.9.14 + solid-js: 1.9.15 transitivePeerDependencies: - supports-color - '@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.4.0)': + '@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0)': dependencies: - '@automerge/automerge': 3.4.0 + '@automerge/automerge': 3.5.0 '@automerge/automerge-repo': 2.5.6 debug: 4.4.3 resolve.exports: 2.0.3 transitivePeerDependencies: - supports-color - '@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.4.0)': + '@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.5.0)': dependencies: - '@automerge/automerge': 3.4.0 + '@automerge/automerge': 3.5.0 '@automerge/automerge-repo': 2.6.0-subduction.40 debug: 4.4.3 resolve.exports: 2.0.3 transitivePeerDependencies: - supports-color - '@inkandswitch/patchwork-plugins@1.2.5(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.4.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.4.0))': + '@inkandswitch/patchwork-plugins@0.0.11(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0))': + dependencies: + '@automerge/automerge': 3.5.0 + '@automerge/automerge-repo': 2.5.6 + '@inkandswitch/patchwork-filesystem': 0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0) + '@types/debug': 4.1.13 + '@types/node': 20.19.43 + debug: 4.4.3 + eventemitter3: 5.0.4 + resolve.exports: 2.0.3 + transitivePeerDependencies: + - supports-color + + '@inkandswitch/patchwork-plugins@1.2.5(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0))': dependencies: - '@automerge/automerge': 3.4.0 + '@automerge/automerge': 3.5.0 '@automerge/automerge-repo': 2.5.6 - '@inkandswitch/patchwork-filesystem': 0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.4.0) + '@inkandswitch/patchwork-filesystem': 0.2.9(@automerge/automerge-repo@2.5.6)(@automerge/automerge@3.5.0) '@types/debug': 4.1.13 '@types/node': 20.19.43 debug: 4.4.3 @@ -1666,11 +1689,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@inkandswitch/patchwork-plugins@1.2.5(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.4.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.4.0))': + '@inkandswitch/patchwork-plugins@1.2.5(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.5.0)(@inkandswitch/patchwork-filesystem@0.2.9(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.5.0))': dependencies: - '@automerge/automerge': 3.4.0 + '@automerge/automerge': 3.5.0 '@automerge/automerge-repo': 2.6.0-subduction.40 - '@inkandswitch/patchwork-filesystem': 0.2.9(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.4.0) + '@inkandswitch/patchwork-filesystem': 0.2.9(@automerge/automerge-repo@2.6.0-subduction.40)(@automerge/automerge@3.5.0) '@types/debug': 4.1.13 '@types/node': 20.19.43 debug: 4.4.3 @@ -1693,7 +1716,7 @@ snapshots: '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/remapping@2.3.5': @@ -1703,12 +1726,12 @@ snapshots: '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/sourcemap-codec@1.6.0': {} '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 '@keyhive/keyhive@0.1.0-alpha.8': {} @@ -1729,88 +1752,88 @@ snapshots: '@noble/hashes@1.8.0': {} - '@rollup/rollup-android-arm-eabi@4.62.4': + '@rollup/rollup-android-arm-eabi@4.63.4': optional: true - '@rollup/rollup-android-arm64@4.62.4': + '@rollup/rollup-android-arm64@4.63.4': optional: true - '@rollup/rollup-darwin-arm64@4.62.4': + '@rollup/rollup-darwin-arm64@4.63.4': optional: true - '@rollup/rollup-darwin-x64@4.62.4': + '@rollup/rollup-darwin-x64@4.63.4': optional: true - '@rollup/rollup-freebsd-arm64@4.62.4': + '@rollup/rollup-freebsd-arm64@4.63.4': optional: true - '@rollup/rollup-freebsd-x64@4.62.4': + '@rollup/rollup-freebsd-x64@4.63.4': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.62.4': + '@rollup/rollup-linux-arm-gnueabihf@4.63.4': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.62.4': + '@rollup/rollup-linux-arm-musleabihf@4.63.4': optional: true - '@rollup/rollup-linux-arm64-gnu@4.62.4': + '@rollup/rollup-linux-arm64-gnu@4.63.4': optional: true - '@rollup/rollup-linux-arm64-musl@4.62.4': + '@rollup/rollup-linux-arm64-musl@4.63.4': optional: true - '@rollup/rollup-linux-loong64-gnu@4.62.4': + '@rollup/rollup-linux-loong64-gnu@4.63.4': optional: true - '@rollup/rollup-linux-loong64-musl@4.62.4': + '@rollup/rollup-linux-loong64-musl@4.63.4': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.62.4': + '@rollup/rollup-linux-ppc64-gnu@4.63.4': optional: true - '@rollup/rollup-linux-ppc64-musl@4.62.4': + '@rollup/rollup-linux-ppc64-musl@4.63.4': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.62.4': + '@rollup/rollup-linux-riscv64-gnu@4.63.4': optional: true - '@rollup/rollup-linux-riscv64-musl@4.62.4': + '@rollup/rollup-linux-riscv64-musl@4.63.4': optional: true - '@rollup/rollup-linux-s390x-gnu@4.62.4': + '@rollup/rollup-linux-s390x-gnu@4.63.4': optional: true - '@rollup/rollup-linux-x64-gnu@4.62.4': + '@rollup/rollup-linux-x64-gnu@4.63.4': optional: true - '@rollup/rollup-linux-x64-musl@4.62.4': + '@rollup/rollup-linux-x64-musl@4.63.4': optional: true - '@rollup/rollup-openbsd-x64@4.62.4': + '@rollup/rollup-openbsd-x64@4.63.4': optional: true - '@rollup/rollup-openharmony-arm64@4.62.4': + '@rollup/rollup-openharmony-arm64@4.63.4': optional: true - '@rollup/rollup-win32-arm64-msvc@4.62.4': + '@rollup/rollup-win32-arm64-msvc@4.63.4': optional: true - '@rollup/rollup-win32-ia32-msvc@4.62.4': + '@rollup/rollup-win32-ia32-msvc@4.63.4': optional: true - '@rollup/rollup-win32-x64-gnu@4.62.4': + '@rollup/rollup-win32-x64-gnu@4.63.4': optional: true - '@rollup/rollup-win32-x64-msvc@4.62.4': + '@rollup/rollup-win32-x64-msvc@4.63.4': optional: true - '@solid-primitives/utils@6.4.1(solid-js@1.9.14)': + '@solid-primitives/utils@6.4.1(solid-js@1.9.15)': dependencies: - solid-js: 1.9.14 + solid-js: 1.9.15 '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.29.8 + '@babel/parser': 7.29.9 '@babel/types': 7.29.8 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 @@ -1822,7 +1845,7 @@ snapshots: '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.29.8 + '@babel/parser': 7.29.9 '@babel/types': 7.29.8 '@types/babel__traverse@7.28.0': @@ -1884,7 +1907,7 @@ snapshots: '@vitest/spy@3.2.7': dependencies: - tinyspy: 4.0.4 + tinyspy: 4.0.6 '@vitest/utils@3.2.7': dependencies: @@ -1896,7 +1919,7 @@ snapshots: assertion-error@2.0.1: {} - babel-plugin-jsx-dom-expressions@0.40.7(@babel/core@7.29.7): + babel-plugin-jsx-dom-expressions@0.40.10(@babel/core@7.29.7): dependencies: '@babel/core': 7.29.7 '@babel/helper-module-imports': 7.18.6 @@ -1905,26 +1928,26 @@ snapshots: html-entities: 2.3.3 parse5: 7.3.0 - babel-preset-solid@1.9.12(@babel/core@7.29.7)(solid-js@1.9.14): + babel-preset-solid@1.9.15(@babel/core@7.29.7)(solid-js@1.9.15): dependencies: '@babel/core': 7.29.7 - babel-plugin-jsx-dom-expressions: 0.40.7(@babel/core@7.29.7) + babel-plugin-jsx-dom-expressions: 0.40.10(@babel/core@7.29.7) optionalDependencies: - solid-js: 1.9.14 + solid-js: 1.9.15 base-x@4.0.1: {} base-x@5.0.1: {} - baseline-browser-mapping@2.11.12: {} + baseline-browser-mapping@2.11.25: {} - browserslist@4.28.7: + browserslist@4.29.0: dependencies: - baseline-browser-mapping: 2.11.12 - caniuse-lite: 1.0.30001807 - electron-to-chromium: 1.5.402 - node-releases: 2.0.53 - update-browserslist-db: 1.2.3(browserslist@4.28.7) + baseline-browser-mapping: 2.11.25 + caniuse-lite: 1.0.30001810 + electron-to-chromium: 1.5.438 + node-releases: 2.0.57 + update-browserslist-db: 1.3.3(browserslist@4.29.0) bs58@5.0.0: dependencies: @@ -1952,7 +1975,7 @@ snapshots: cac@6.7.14: {} - caniuse-lite@1.0.30001807: {} + caniuse-lite@1.0.30001810: {} cbor-extract@2.2.2: dependencies: @@ -1966,7 +1989,7 @@ snapshots: '@cbor-extract/cbor-extract-win32-x64': 2.2.2 optional: true - cbor-x@1.6.5: + cbor-x@1.6.6: optionalDependencies: cbor-extract: 2.2.2 @@ -1986,12 +2009,12 @@ snapshots: csstype@3.2.3: {} - cute.txt@0.0.6(@automerge/automerge@3.4.0)(@codemirror/state@6.7.5)(@codemirror/view@6.43.12)(solid-js@1.9.14): + cute.txt@0.0.6(@automerge/automerge@3.5.0)(@codemirror/state@6.7.6)(@codemirror/view@6.43.13)(solid-js@1.9.15): optionalDependencies: - '@automerge/automerge': 3.4.0 - '@codemirror/state': 6.7.5 - '@codemirror/view': 6.43.12 - solid-js: 1.9.14 + '@automerge/automerge': 3.5.0 + '@codemirror/state': 6.7.6 + '@codemirror/view': 6.43.13 + solid-js: 1.9.15 debug@4.4.3: dependencies: @@ -2002,7 +2025,7 @@ snapshots: detect-libc@2.1.2: optional: true - electron-to-chromium@1.5.402: {} + electron-to-chromium@1.5.438: {} entities@4.5.0: {} @@ -2010,7 +2033,7 @@ snapshots: es-module-lexer@1.7.0: {} - es-module-lexer@2.3.1: {} + es-module-lexer@2.3.2: {} esbuild@0.21.5: optionalDependencies: @@ -2050,9 +2073,9 @@ snapshots: fast-sha256@1.3.0: {} - fdir@6.5.0(picomatch@4.0.5): + fdir@6.5.0(picomatch@4.0.7): optionalDependencies: - picomatch: 4.0.5 + picomatch: 4.0.7 fsevents@2.3.3: optional: true @@ -2069,9 +2092,9 @@ snapshots: is-what@4.1.16: {} - isomorphic-ws@5.0.0(ws@8.21.2): + isomorphic-ws@5.0.0(ws@8.21.3): dependencies: - ws: 8.21.2 + ws: 8.21.3 js-tokens@4.0.0: {} @@ -2089,7 +2112,7 @@ snapshots: magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 merge-anything@5.1.7: dependencies: @@ -2097,14 +2120,14 @@ snapshots: ms@2.1.3: {} - nanoid@3.3.17: {} + nanoid@3.3.19: {} node-gyp-build-optional-packages@5.1.1: dependencies: detect-libc: 2.1.2 optional: true - node-releases@2.0.53: {} + node-releases@2.0.57: {} parse5@7.3.0: dependencies: @@ -2116,46 +2139,46 @@ snapshots: picocolors@1.1.1: {} - picomatch@4.0.5: {} + picomatch@4.0.7: {} - postcss@8.5.26: + postcss@8.5.28: dependencies: - nanoid: 3.3.17 + nanoid: 3.3.19 picocolors: 1.1.1 source-map-js: 1.2.1 resolve.exports@2.0.3: {} - rollup@4.62.4: + rollup@4.63.4: dependencies: '@types/estree': 1.0.9 optionalDependencies: '@napi-rs/lzma-linux-x64-gnu': 1.5.1 - '@rollup/rollup-android-arm-eabi': 4.62.4 - '@rollup/rollup-android-arm64': 4.62.4 - '@rollup/rollup-darwin-arm64': 4.62.4 - '@rollup/rollup-darwin-x64': 4.62.4 - '@rollup/rollup-freebsd-arm64': 4.62.4 - '@rollup/rollup-freebsd-x64': 4.62.4 - '@rollup/rollup-linux-arm-gnueabihf': 4.62.4 - '@rollup/rollup-linux-arm-musleabihf': 4.62.4 - '@rollup/rollup-linux-arm64-gnu': 4.62.4 - '@rollup/rollup-linux-arm64-musl': 4.62.4 - '@rollup/rollup-linux-loong64-gnu': 4.62.4 - '@rollup/rollup-linux-loong64-musl': 4.62.4 - '@rollup/rollup-linux-ppc64-gnu': 4.62.4 - '@rollup/rollup-linux-ppc64-musl': 4.62.4 - '@rollup/rollup-linux-riscv64-gnu': 4.62.4 - '@rollup/rollup-linux-riscv64-musl': 4.62.4 - '@rollup/rollup-linux-s390x-gnu': 4.62.4 - '@rollup/rollup-linux-x64-gnu': 4.62.4 - '@rollup/rollup-linux-x64-musl': 4.62.4 - '@rollup/rollup-openbsd-x64': 4.62.4 - '@rollup/rollup-openharmony-arm64': 4.62.4 - '@rollup/rollup-win32-arm64-msvc': 4.62.4 - '@rollup/rollup-win32-ia32-msvc': 4.62.4 - '@rollup/rollup-win32-x64-gnu': 4.62.4 - '@rollup/rollup-win32-x64-msvc': 4.62.4 + '@rollup/rollup-android-arm-eabi': 4.63.4 + '@rollup/rollup-android-arm64': 4.63.4 + '@rollup/rollup-darwin-arm64': 4.63.4 + '@rollup/rollup-darwin-x64': 4.63.4 + '@rollup/rollup-freebsd-arm64': 4.63.4 + '@rollup/rollup-freebsd-x64': 4.63.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.63.4 + '@rollup/rollup-linux-arm-musleabihf': 4.63.4 + '@rollup/rollup-linux-arm64-gnu': 4.63.4 + '@rollup/rollup-linux-arm64-musl': 4.63.4 + '@rollup/rollup-linux-loong64-gnu': 4.63.4 + '@rollup/rollup-linux-loong64-musl': 4.63.4 + '@rollup/rollup-linux-ppc64-gnu': 4.63.4 + '@rollup/rollup-linux-ppc64-musl': 4.63.4 + '@rollup/rollup-linux-riscv64-gnu': 4.63.4 + '@rollup/rollup-linux-riscv64-musl': 4.63.4 + '@rollup/rollup-linux-s390x-gnu': 4.63.4 + '@rollup/rollup-linux-x64-gnu': 4.63.4 + '@rollup/rollup-linux-x64-musl': 4.63.4 + '@rollup/rollup-openbsd-x64': 4.63.4 + '@rollup/rollup-openharmony-arm64': 4.63.4 + '@rollup/rollup-win32-arm64-msvc': 4.63.4 + '@rollup/rollup-win32-ia32-msvc': 4.63.4 + '@rollup/rollup-win32-x64-gnu': 4.63.4 + '@rollup/rollup-win32-x64-msvc': 4.63.4 fsevents: 2.3.3 semver@6.3.1: {} @@ -2168,27 +2191,27 @@ snapshots: siginfo@2.0.0: {} - solid-automerge@2.0.2(@automerge/automerge-repo@2.5.6)(solid-js@1.9.14): + solid-automerge@2.0.2(@automerge/automerge-repo@2.5.6)(solid-js@1.9.15): dependencies: '@automerge/automerge-repo': 2.5.6 - '@solid-primitives/utils': 6.4.1(solid-js@1.9.14) + '@solid-primitives/utils': 6.4.1(solid-js@1.9.15) cabbages: 0.2.10 - solid-js: 1.9.14 + solid-js: 1.9.15 transitivePeerDependencies: - supports-color - solid-js@1.9.14: + solid-js@1.9.15: dependencies: csstype: 3.2.3 seroval: 1.5.6 seroval-plugins: 1.5.6(seroval@1.5.6) - solid-refresh@0.6.3(solid-js@1.9.14): + solid-refresh@0.6.3(solid-js@1.9.15): dependencies: '@babel/generator': 7.29.8 '@babel/helper-module-imports': 7.29.7 '@babel/types': 7.29.8 - solid-js: 1.9.14 + solid-js: 1.9.15 transitivePeerDependencies: - supports-color @@ -2212,14 +2235,14 @@ snapshots: tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.5) - picomatch: 4.0.5 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 tinypool@1.1.1: {} tinyrainbow@2.0.0: {} - tinyspy@4.0.4: {} + tinyspy@4.0.6: {} typescript@5.9.3: {} @@ -2229,16 +2252,16 @@ snapshots: dependencies: '@jridgewell/remapping': 2.3.5 acorn: 8.18.0 - picomatch: 4.0.5 + picomatch: 4.0.7 webpack-virtual-modules: 0.6.2 - update-browserslist-db@1.2.3(browserslist@4.28.7): + update-browserslist-db@1.3.3(browserslist@4.29.0): dependencies: - browserslist: 4.28.7 + browserslist: 4.29.0 escalade: 3.2.0 picocolors: 1.1.1 - uuid@14.0.1: {} + uuid@14.0.2: {} uuid@9.0.1: {} @@ -2264,14 +2287,14 @@ snapshots: dependencies: vite: 5.4.21(@types/node@20.19.43) - vite-plugin-solid@2.11.14(solid-js@1.9.14)(vite@5.4.21(@types/node@20.19.43)): + vite-plugin-solid@2.11.14(solid-js@1.9.15)(vite@5.4.21(@types/node@20.19.43)): dependencies: '@babel/core': 7.29.7 '@types/babel__core': 7.20.5 - babel-preset-solid: 1.9.12(@babel/core@7.29.7)(solid-js@1.9.14) + babel-preset-solid: 1.9.15(@babel/core@7.29.7)(solid-js@1.9.15) merge-anything: 5.1.7 - solid-js: 1.9.14 - solid-refresh: 0.6.3(solid-js@1.9.14) + solid-js: 1.9.15 + solid-refresh: 0.6.3(solid-js@1.9.15) vite: 5.4.21(@types/node@20.19.43) vitefu: 1.1.3(vite@5.4.21(@types/node@20.19.43)) transitivePeerDependencies: @@ -2280,8 +2303,8 @@ snapshots: vite@5.4.21(@types/node@20.19.43): dependencies: esbuild: 0.21.5 - postcss: 8.5.26 - rollup: 4.62.4 + postcss: 8.5.28 + rollup: 4.63.4 optionalDependencies: '@types/node': 20.19.43 fsevents: 2.3.3 @@ -2305,7 +2328,7 @@ snapshots: expect-type: 1.4.0 magic-string: 0.30.21 pathe: 2.0.3 - picomatch: 4.0.5 + picomatch: 4.0.7 std-env: 3.10.0 tinybench: 2.9.0 tinyexec: 0.3.2 @@ -2343,8 +2366,8 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 - ws@8.21.2: {} + ws@8.21.3: {} - xstate@5.32.5: {} + xstate@5.33.2: {} yallist@3.1.1: {} diff --git a/chat/src/components/ChatRoot.tsx b/chat/src/components/ChatRoot.tsx index db4ba6dc..f390f0b8 100644 --- a/chat/src/components/ChatRoot.tsx +++ b/chat/src/components/ChatRoot.tsx @@ -19,24 +19,53 @@ import {TypingBar} from "./TypingBar" import {InputArea} from "./InputArea" import {PluginPanel} from "./PluginPanel" import {Lightbox} from "./Lightbox" -// @ts-ignore — plain-JS library, ships no type declarations -import { - generate as llmGenerate, - popup as llmPopup, - ensureConfig as llmEnsureConfig, - readConfig as llmReadConfig, - writeConfig as llmWriteConfig, - readScopedConfig as llmReadScopedConfig, - describeConfig as llmDescribeConfig, - fetchOpenRouterModels as llmFetchOpenRouterModels, - parseToolCalls as llmParseToolCalls, -} from "@chee/patchwork-llm" +// Chat imports NOTHING from patchwork-llm and has NO build-time dependency on the +// LLM host package. Generation goes through the generic @grjte/patchwork-worker +// transport; the LLM client (the protocol layer: frame vocabulary in, {text, +// toolCalls} out) is resolved at RUNTIME from the plugin registry — whichever +// package registered a `patchwork:worker-client` plugin with id "llm" (today +// @grjte/llm-host) supplies a factory `(session) => {generate}`. The host +// worker-provider resolves config and runs the worker; config lives entirely in +// the host-side LLM config tray, opened via a patchwork:open-tool event. See +// libraries/patchwork-worker/README.md ("The paired client plugin"). +import {connectWorkerClient} from "@grjte/patchwork-worker/client.js" import {generateId} from "../lib/helpers" import {automergeUrlToServiceWorkerUrl} from "@inkandswitch/patchwork-filesystem" import {transcribeVoiceNote} from "../lib/transcription" import {reloadPreviewIframe} from "../lib/preview-frame" import "../styles/chat.css" +function clog(...args: any[]) { + try { + console.log("[chat-llm]", ...args) + } catch {} +} + +/** The LLM client API the "llm" worker-client factory returns (llm-host/src/client.js). */ +interface LLMClient { + generate( + messages: any[] | string, + opts?: Record + ): Promise<{text: string; toolCalls: any[] | null; toolMode?: string}> +} + +// One client for the whole tool, resolved on first use. The registry lookup is +// global (no element needed); the session inside it opens on the first request, +// multiplexes every generation by id, and reconnects on its own. A FAILED +// resolution is not cached: a tool that asked before the LLM package registered +// gets another try on the next generation instead of being wedged. +let llmClientPromise: Promise | null = null +function llmClient(): Promise { + if (!llmClientPromise) { + llmClientPromise = connectWorkerClient("llm", { + sessionOpts: {idPrefix: "chatllm", onLog: clog}, + }) as Promise + llmClientPromise.catch(() => { + llmClientPromise = null + }) + } + return llmClientPromise +} export function ChatRoot(props: { handle: DocHandle @@ -103,57 +132,45 @@ export function ChatRoot(props: { // Sidebar state const [sidebarVisible, setSidebarVisible] = createSignal(false) - // The per-tool / per-doc config scope this chat resolves against. Generation - // passes the same scope to generate(), so every config READ in the UI must go - // through scopedCfg() too — otherwise the UI shows the global default while the - // computer runs with this chat's override. - const llmScope = () => ({toolId: "chitterchatter", docId: props.handle.url}) - function scopedCfg(): any { - try { - return llmReadScopedConfig(llmScope()) - } catch { - return llmReadConfig() - } - } + // The per-tool / per-doc config scope this chat resolves against. Chat never + // reads config itself — it passes this scope to the host on every generation + // (the host worker-provider resolves provider/model/apiKey/prompts/toolToggles + // from it) and when opening the config picker. `docName` is a display label for + // the picker's scope switcher. + const llmScope = () => ({ + toolId: "chitterchatter", + docId: props.handle.url, + toolName: "Chitterchatter", + docName: (props.handle.doc() as any)?.title || "this chat", + }) - // Model picker (the @chee/patchwork-llm popover lives in the light DOM) - let modelPickerEl: HTMLElement | null = null - async function openModelPicker() { - if (modelPickerEl) return - await llmEnsureConfig(llmScope(), props.element) - // Surface @computer's built-in system prompt in the picker so it's visible - // and can be forked into an editable override. - const el = llmPopup({ - toolName: "Chitterchatter", - // Per-tool / per-doc config scope (Default · This tool · This doc switcher). - scope: { - toolId: "chitterchatter", - docId: props.handle.url, - toolName: "Chitterchatter", - docName: (props.handle.doc() as any)?.title || "this chat", - }, - toolPrompt: { - name: "Chitterchatter · Computer", - text: computerSystemPrompt(), - }, - toolTools: activeTools().map((t) => ({ - name: t.name, - description: t.description, - })), - }) - modelPickerEl = el - document.body.append(el) - ;(el as any).showPopover?.() - try { - await (el as any).result - } finally { - el.remove() - modelPickerEl = null - // Refresh the label and, if the model actually changed, announce it in - // the chat — regardless of whether this tab is the computer host, so a - // model switch is always visible to everyone. - void syncModelLabel({announce: true}) - } + // Open the host-side LLM config tool (the @grjte/llm-config tray). Chat can't + // render the picker itself (config lives in the host; the settings doc is + // denylisted under isolation) — it dispatches a patchwork:open-tool event that + // the host tray answers directly, or that the isolation open-tool bridge + // relays to the host when chat runs inside the sandbox. Same call either way. + // We pass chat's system prompt + tool list (with defaultOff flags) so the host + // picker can surface them; opt-in tools render unchecked with no doc write. + function openModelPicker() { + props.element.dispatchEvent( + new CustomEvent("patchwork:open-tool", { + detail: { + component: "llm-config-tray", + scope: llmScope(), + toolPrompt: { + name: "Chitterchatter · Computer", + text: computerSystemPrompt(), + }, + toolTools: activeTools().map((t) => ({ + name: t.name, + description: t.description, + defaultOff: GLOBAL_DEFAULT_OFF.includes(t.name) || CONTEXT_DEFAULT_OFF.includes(t.name), + })), + }, + bubbles: true, + composed: true, + }) + ) } // Drop state @@ -173,19 +190,17 @@ export function ChatRoot(props: { // Human-readable label of the model the computer is currently running, shown // in the computer's username (e.g. "computer (OpenRouter Claude Opus 4)"). const [modelLabel, setModelLabel] = createSignal("") - function refreshModelLabel() { - describeCurrentModel().then(setModelLabel).catch(() => {}) - } - // Resolve the live model label and, if it changed, announce it in the chat so - // everyone sees which model the computer switched to. Returns the new label. - async function syncModelLabel({announce = false} = {}): Promise { + // The model label now arrives on the generation stream (the host worker emits a + // {type:"model", label} frame — chat reads no config to compute it). This is + // called from the generate loop's onModel callback: it updates the label and, + // if it changed since last time, announces the switch in the chat. + function noteModelLabel(label: string) { + if (!label) return const before = modelLabel() - const after = await describeCurrentModel().catch(() => before) - setModelLabel(after) - if (announce && after && after !== before) { - sendComputerMessage("🔌 switched model to " + after) + setModelLabel(label) + if (before && label !== before) { + sendComputerMessage("🔌 switched model to " + label) } - return after } // The model name suffix shown after the computer's username, e.g. " (Browser // Qwen3 0.6B)". Empty until the label resolves. @@ -199,11 +214,9 @@ export function ChatRoot(props: { const owner = (props.handle.doc() as any)?.computerOwner return "computer" + (owner ? " (" + owner + ")" : "") + modelSuffix() } - // Keep the label populated from the start so the very first computer message - // already carries the model name (not just messages sent after the picker). - onMount(() => { - refreshModelLabel() - }) + // The model label is populated from the generation stream (noteModelLabel), so + // there's nothing to resolve at rest — the first computer message picks it up + // as soon as generation emits the model frame. const [computerAbort, setComputerAbort] = createSignal(null) const computerRespondedToIds = new Set() @@ -516,16 +529,24 @@ Keep responses concise. When you create a tool, explain briefly what it does.` // Pick the prompt for the active model: local/in-browser models (small, // limited context) get the compact prompt; capable cloud providers get the - // full one with worked examples. Falls back to full on any read error. + // full one with worked examples. The provider is resolved HOST-side, so chat + // no longer reads config to choose — it sends BOTH variants as a + // provider-conditional map and the worker picks by resolved provider (see + // computerSystemForFrame). computerSystemPrompt() returns the full prompt for + // display (e.g. in the picker). function computerSystemPrompt(): string { if (isContext()) return CONTEXT_SYSTEM_PROMPT - try { - const cfg = scopedCfg() - return cfg?.provider === "local" - ? COMPUTER_SYSTEM_PROMPT_COMPACT - : COMPUTER_SYSTEM_PROMPT_FULL - } catch { - return COMPUTER_SYSTEM_PROMPT_FULL + return COMPUTER_SYSTEM_PROMPT_FULL + } + + // The provider-conditional system prompt sent on each generation: local models + // get the compact prompt, everything else the full one. The worker resolves + // the provider and picks the matching entry (falling back to `default`). + function computerSystemForFrame(): string | Record { + if (isContext()) return CONTEXT_SYSTEM_PROMPT + return { + default: COMPUTER_SYSTEM_PROMPT_FULL, + local: COMPUTER_SYSTEM_PROMPT_COMPACT, } } @@ -685,94 +706,68 @@ Never overwrite an entire long field with a key-assign (range:"content") just to return ["tool: " + call.name, ...lines].join("\n") } - // Tools to offer this turn — the active mode's set, minus any the user disabled - // in the picker (cfg.toolToggles[name] === false). Most default to enabled; - // define_tool (any mode) and context mode's inspect_dom/eval_js are opt-IN - // (offered only if the toggle is explicitly true). + // Tools to offer this turn: the active mode's full set, each tagged with + // `defaultOff` (chat's opt-in policy). Chat does NOT filter by toolToggles — + // the host worker applies the generic rule (include unless off; defaultOff + // tools included only when explicitly on) using the config it resolves. So the + // user's per-tool toggles still take effect, host-side, without chat reading + // config. Picker default-off rendering is handled via the same `defaultOff` + // flag (no seed-write needed). function enabledComputerTools() { - const toggles = (scopedCfg()?.toolToggles) || {} - return activeTools().filter((t) => { - const optIn = + return activeTools().map((t) => ({ + ...t, + defaultOff: GLOBAL_DEFAULT_OFF.includes(t.name) || - (isContext() && CONTEXT_DEFAULT_OFF.includes(t.name)) - if (optIn) return toggles[t.name] === true - return toggles[t.name] !== false - }) + (isContext() && CONTEXT_DEFAULT_OFF.includes(t.name)), + })) } - // The model picker renders a tool's checkbox CHECKED unless - // toolToggles[name] === false (it has no "default off" concept). So our opt-in - // tools would show checked while actually being off. Seed them to `false` once - // (only if unset — a user who turns one ON stays ON) so the picker shows them - // unchecked, matching enabledComputerTools(). - onMount(async () => { - if (!has("computer")) return - try { - await llmEnsureConfig(llmScope(), props.element) - const tg = {...((llmReadConfig() as any)?.toolToggles || {})} - let changed = false - for (const n of [...GLOBAL_DEFAULT_OFF, ...CONTEXT_DEFAULT_OFF]) { - if (tg[n] === undefined) { - tg[n] = false - changed = true - } - } - if (changed) llmWriteConfig({toolToggles: tg} as any) - } catch {} - }) - - // ---- LLM generation (via @chee/patchwork-llm) ---- - // Provider / model / API key / sampling parameters all live on the account - // doc and are configured through the shared model picker (`/model` → - // openModelPicker). The library runs local (transformers.js) / OpenRouter / - // Ollama in a refresh-surviving SharedWorker and streams tokens back. + // (Former onMount toolToggles seed-write removed: the picker now renders opt-in + // tools unchecked via their `defaultOff` flag, and the worker filters by that + // flag + the user's toggles — no client-side config read/write needed.) + + // ---- LLM generation (via the host worker over @grjte/patchwork-worker) ---- + // Provider / model / API key / sampling all live in the LLM settings doc and + // are configured through the host-side config tool (`/model` → openModelPicker + // dispatches patchwork:open-tool). The host worker-provider resolves config + // from `scope` and runs the worker (local transformers.js / OpenRouter / + // Ollama), streaming tokens back. Chat reads no config. The client itself + // comes from the registry (see llmClient), not from an import. async function generateLLM( messages: any[], onToken: (text: string) => void, signal?: AbortSignal, onStatus?: (status: string) => void, - system?: string, - tools?: any[] + system?: string | Record, + tools?: any[], + onModel?: (label: string) => void ): Promise<{text: string; toolCalls: any[] | null}> { - const {text, toolCalls} = await llmGenerate(messages, { + const client = await llmClient() + const {text, toolCalls} = await client.generate(messages, { sessionKey: props.handle.url, - // Resolve config for this tool + this chat doc (whole-scope overrides - // configured in the picker; falls back to tool, then default). + // A node inside the mounted , so connectWorker's + // discovery dispatches patchwork:worker-channel from here — reaching the + // host-realm worker provider (directly, or relayed across isolation). + element: props.element, + // The scope the host resolves config from (provider/model/apiKey/prompts/ + // toolToggles) — chat sends it but reads none of it. scope: llmScope(), - // The system prompt goes through the lib (opts.system) so it composes - // with any user-selected/forked system prompt via effectiveSystem. + // Provider-conditional system prompt ({default, local}); the worker picks + // by resolved provider and composes with any user-forked prompt host-side. ...(system ? {system} : {}), - // Real tool calls: native function-calling for OpenRouter/Ollama, the - // convention for local. Execution stays in runToolByName. + // All active tools, each tagged defaultOff; the worker filters by the + // user's toolToggles. Execution stays in runToolByName. ...(tools && tools.length ? {tools} : {}), onToken: (_delta: string, full: string) => onToken(full), onStatus: (status: string) => onStatus?.(status), + onModel, signal, }) return {text, toolCalls: (toolCalls as any) || null} } - // Human-readable label for the model that's currently selected (provider + - // model name). Used in the computer's join message so people can see/change - // which model is answering. Falls back gracefully if the config or the - // OpenRouter catalogue can't be read. - async function describeCurrentModel(): Promise { - try { - await llmEnsureConfig(llmScope(), props.element) - const cfg = scopedCfg() - let openrouterModels: any[] = [] - if (cfg.provider === "openrouter") { - try { - openrouterModels = await llmFetchOpenRouterModels() - } catch { - openrouterModels = [] - } - } - return llmDescribeConfig(cfg, {openrouterModels}) - } catch { - return "the configured model" - } - } + // (describeCurrentModel removed — the model label is computed HOST-side and + // arrives on the generation stream via noteModelLabel; chat reads no config.) // ---- Rich block parsing ---- function parseRichBlocks(response: string) { @@ -2117,20 +2112,19 @@ Never overwrite an entire long field with a key-assign (range:"content") just to } setComputerActive(true) claimComputerHost() - describeCurrentModel().then((model) => { - setModelLabel(model) - sendComputerMessage( - [ - "hello! i'm computer, a computer program. mention @computer or reply to my messages and i'll respond.", - "", - "• currently running: " + model, - "• /model — pick a different model or provider", - "• /computer nosey — make me respond to everything", - "• /computer owner — see who's hosting me; /computer own to take over", - "• /computer kick — send me away", - ].join("\n") - ) - }) + // The model label arrives on the first generation stream (noteModelLabel); + // we don't resolve it at join time (chat reads no config). The join message + // points people at /model to see/change which model is running. + sendComputerMessage( + [ + "hello! i'm computer, a computer program. mention @computer or reply to my messages and i'll respond.", + "", + "• /model — pick the model or provider (opens the config panel)", + "• /computer nosey — make me respond to everything", + "• /computer owner — see who's hosting me; /computer own to take over", + "• /computer kick — send me away", + ].join("\n") + ) startComputerListener() } @@ -2453,22 +2447,26 @@ Never overwrite an entire long field with a key-assign (range:"content") just to .includes("@momputer") // Generate a tool name for this response — the LLM uses it if it builds a tool const suggestedToolName = randomToolName() - // The built-in COMPUTER_SYSTEM_PROMPT is the *default* — but if the user - // forked it (a selected system prompt doc, cfg.systemUrl), that override - // fully replaces it (the lib prepends it via effectiveSystem). Either way, - // the per-response addenda below always apply. System goes through - // opts.system (not a chat message) so the lib can compose them. - const forked = !!scopedCfg()?.systemUrl - let systemPrompt = forked ? "" : computerSystemPrompt() - systemPrompt += - (systemPrompt ? "\n\n" : "") + - '## Your Tool ID\nIf you build a patchwork tool in this response, use `"' + + // The provider-conditional base system prompt ({default, local}) plus + // per-response addenda that always apply. Chat reads no config; the worker + // picks the base by resolved provider and composes. (Forked/custom system + // prompts via cfg.systemUrl are not applied for now — see the config + // redesign plan; chat no longer reads systemUrl.) The addenda are appended + // to every provider variant so they apply regardless of which is chosen. + const base = computerSystemForFrame() + const addenda = + '\n\n## Your Tool ID\nIf you build a patchwork tool in this response, use `"' + suggestedToolName + - '"` as the id for both the datatype and tool plugins, and in supportedDatatypes.' - if (isMomputer) { - systemPrompt += - '\n\n## Special Mode: Momputer\nThe user addressed you as @momputer. Be warm, nurturing, and motherly in your response. Use gentle encouragement, express care and concern, and be supportive like a loving mom would be. You can use pet names like "sweetie", "honey", "dear", etc. Still be helpful and knowledgeable, but with a cozy maternal energy.' - } + '"` as the id for both the datatype and tool plugins, and in supportedDatatypes.' + + (isMomputer + ? '\n\n## Special Mode: Momputer\nThe user addressed you as @momputer. Be warm, nurturing, and motherly in your response. Use gentle encouragement, express care and concern, and be supportive like a loving mom would be. You can use pet names like "sweetie", "honey", "dear", etc. Still be helpful and knowledgeable, but with a cozy maternal energy.' + : "") + const systemPrompt: string | Record = + typeof base === "string" + ? base + addenda + : Object.fromEntries( + Object.entries(base).map(([k, v]) => [k, v + addenda]) + ) const messages = [...context, {role: "user", content: userMsg.text}] // Create streaming message — use `let` so we can reassign @@ -2531,7 +2529,8 @@ Never overwrite an entire long field with a key-assign (range:"content") just to abortController.signal, onStatus, systemPrompt, - enabledComputerTools() + enabledComputerTools(), + noteModelLabel ) resetInactivityTimer() if (tokenThrottleTimer) { @@ -2540,11 +2539,9 @@ Never overwrite an entire long field with a key-assign (range:"content") just to } let response = (gen.text || "").replace(/^\[Computer\]\s*/i, "") // Real tool calls: structured from the provider (native function - // calling), else parsed from the model's text (local). - const calls = - gen.toolCalls && gen.toolCalls.length - ? gen.toolCalls - : llmParseToolCalls(response) + // calling), or parsed from the model's text HOST-side by + // the LLM worker spec. Chat never parses model output itself. + const calls = gen.toolCalls ?? [] // Strip any tool-call markup from the text we display (local models // emit … inline; that's plumbing, not prose). const visible = response @@ -2991,10 +2988,8 @@ Never overwrite an entire long field with a key-assign (range:"content") just to } onCleanup(() => { - if (modelPickerEl) { - modelPickerEl.remove() - modelPickerEl = null - } + // (No chat-owned model picker to tear down anymore — the picker lives in the + // host config tool, opened via patchwork:open-tool.) if (heartbeatInterval) { clearInterval(heartbeatInterval) heartbeatInterval = null