feat: Implement LiveCode module with WebSocket and SSE support

- Added config management using `useConfig` for environment variables.
- Created `LiveCode` class to manage WebSocket connections and routing.
- Implemented `SSEManager` for Server-Sent Events handling.
- Developed `WSSManager` for managing WebSocket connections with heartbeat functionality.
- Introduced `ReconnectingWebSocket` class for robust WebSocket client with automatic reconnection.
- Added test files for live application demonstrating WebSocket and TCP server integration.
This commit is contained in:
2026-02-02 23:29:58 +08:00
parent 5774391bbe
commit a76c2235ea
19 changed files with 871 additions and 385 deletions

286
pnpm-lock.yaml generated
View File

@@ -129,21 +129,18 @@ importers:
'@aws-sdk/client-s3':
specifier: ^3.980.0
version: 3.980.0
'@kevisual/ha-api':
specifier: ^0.0.8
version: 0.0.8
'@kevisual/js-filter':
specifier: ^0.0.5
version: 0.0.5
'@kevisual/oss':
specifier: ^0.0.18
version: 0.0.18
specifier: ^0.0.19
version: 0.0.19
'@kevisual/video-tools':
specifier: ^0.0.13
version: 0.0.13(dotenv@17.2.3)(supports-color@10.2.2)
'@opencode-ai/sdk':
specifier: ^1.1.47
version: 1.1.47
specifier: ^1.1.48
version: 1.1.48
es-toolkit:
specifier: ^1.44.0
version: 1.44.0
@@ -168,16 +165,13 @@ importers:
devDependencies:
'@inquirer/prompts':
specifier: ^8.2.0
version: 8.2.0(@types/node@25.1.0)
version: 8.2.0(@types/node@25.2.0)
'@kevisual/ai':
specifier: ^0.0.24
version: 0.0.24
'@kevisual/api':
specifier: ^0.0.35
version: 0.0.35
'@kevisual/cnb':
specifier: ^0.0.13
version: 0.0.13(dotenv@17.2.3)(idb-keyval@6.2.2)(typescript@5.8.2)
specifier: ^0.0.42
version: 0.0.42
'@kevisual/load':
specifier: ^0.0.6
version: 0.0.6
@@ -188,29 +182,29 @@ importers:
specifier: ^0.0.4
version: 0.0.4
'@kevisual/query':
specifier: 0.0.38
version: 0.0.38
specifier: 0.0.39
version: 0.0.39
'@kevisual/query-login':
specifier: 0.0.7
version: 0.0.7(@kevisual/query@0.0.38)
version: 0.0.7(@kevisual/query@0.0.39)
'@kevisual/router':
specifier: ^0.0.64
version: 0.0.64(typescript@5.8.2)
specifier: ^0.0.67
version: 0.0.67
'@kevisual/types':
specifier: ^0.0.12
version: 0.0.12
'@kevisual/use-config':
specifier: ^1.0.28
version: 1.0.28(dotenv@17.2.3)
specifier: ^1.0.30
version: 1.0.30(dotenv@17.2.3)
'@opencode-ai/plugin':
specifier: ^1.1.47
version: 1.1.47
specifier: ^1.1.48
version: 1.1.48
'@types/bun':
specifier: ^1.3.8
version: 1.3.8
'@types/node':
specifier: ^25.1.0
version: 25.1.0
specifier: ^25.2.0
version: 25.2.0
'@types/send':
specifier: ^1.2.1
version: 1.2.1
@@ -1306,9 +1300,6 @@ packages:
'@kevisual/api@0.0.28':
resolution: {integrity: sha512-WQluRlu2qGM1qktIhPLODie8x382a6jEMfFOcay/rnkCgXK0BRpnqOKwlX7IMLdMqka7GY/BD69kSMnK1Exf5g==}
'@kevisual/api@0.0.35':
resolution: {integrity: sha512-NbaOasecbG+O9Ju2/LWC2eWeqcPc5yZYXXyT4vHpU2W5SoPzBf7H3W7+i3py/JcEXF6adcHZVofftCYpecmGMQ==}
'@kevisual/api@0.0.42':
resolution: {integrity: sha512-Bn5G+ZzGEPoJdvd5U3xWHGY0oidQj23gt1YAWvTqjm0frDJfJ4Q2WT9Xjb1ZdJ/YBcfaNe9yEoMCpFNdUls/mw==}
@@ -1324,12 +1315,6 @@ packages:
'@kevisual/cache@0.0.3':
resolution: {integrity: sha512-BWEck69KYL96/ywjYVkML974RHjDJTj2ITQND1zFPR+hlBV1H1p55QZgSYRJCObg3EAV1S9Zic/fR2T4pfe8yg==}
'@kevisual/cache@0.0.5':
resolution: {integrity: sha512-fgtUYGUUq/DY0KFV4CkWszNqvQUaA8XvMTUjoR9ZXRpau5IIDolD/Wen2TFsZ7G3Rfy+lef5dnaiZVDkZwdVKg==}
'@kevisual/cnb@0.0.13':
resolution: {integrity: sha512-n98lwnlVHz8YqceR/fcorYUaBzcvwwqehyOAGVrqCVwVLsltYmYuHUhzVy1bK3NJ6zwhVdoDrkq7+bv3ZqDT3g==}
'@kevisual/context@0.0.4':
resolution: {integrity: sha512-HJeLeZQLU+7tCluSfOyvkgKLs0HjCZrdJlZgEgKRSa8XTwZfMAUt6J7qZTbrZAHBlPtX68EPu/PI8JMCeu3WAQ==}
@@ -1337,9 +1322,6 @@ packages:
resolution: {integrity: sha512-4T/m2LqhtwWEW+lWmg7jLxKFW7VtIAftsWFDDZvh10bZunqFf8iXxChHcVSQWikghJb4cq1IkWzPkvc2l+Asdw==}
hasBin: true
'@kevisual/ha-api@0.0.8':
resolution: {integrity: sha512-RVBrHOXx471lwVmoP5lnAw4XAwyBN3BsJvwaJKLTpAaefvZ2slZEuJZY7lAX7OVEAZJLrfjH+QeErLQ+EvpdVA==}
'@kevisual/js-filter@0.0.5':
resolution: {integrity: sha512-+S+Sf3K/aP6XtZI2s7TgKOr35UuvUvtpJ9YDW30a+mY0/N8gRuzyKhieBzQN7Ykayzz70uoMavBXut2rUlLgzw==}
@@ -1355,8 +1337,8 @@ packages:
'@kevisual/logger@0.0.4':
resolution: {integrity: sha512-+fpr92eokSxoGOW1SIRl/27lPuO+zyY+feR5o2Q4YCNlAdt2x64NwC/w8r/3NEC5QenLgd4K0azyKTI2mHbARw==}
'@kevisual/oss@0.0.18':
resolution: {integrity: sha512-vTdXe41inq4oc+bfYIR3xMDm8GZyOAaWq3DBh+Eur9uNOJcIUdgZBVPOm2uSigmjl3PvqekUw8bE/vbWWJAY7w==}
'@kevisual/oss@0.0.19':
resolution: {integrity: sha512-4Y5krJTqLQOsEwJf7K7a/88t9YHm8PQNuZ5SJDTMopYDOflJlwVjvqiu0lapQ0UrpI+wG6FdfmdmnWpXdQsa1Q==}
'@kevisual/permission@0.0.3':
resolution: {integrity: sha512-8JsA/5O5Ax/z+M+MYpFYdlioHE6jNmWMuFSokBWYs9CCAHNiSKMR01YLkoVDoPvncfH/Y8F5K/IEXRCbptuMNA==}
@@ -1390,17 +1372,12 @@ packages:
'@kevisual/router@0.0.51':
resolution: {integrity: sha512-i9qYBeS/um78oC912oWJD3iElB+5NTKyTrz1Hzf4DckiUFnjLL81UPwjIh5I2l9+ul0IZ/Pxx+sFSF99fJkzKg==}
'@kevisual/router@0.0.64':
resolution: {integrity: sha512-EYz1MZxrltgySUL0Y+/MtZf2FEmqC5U8GmFAqvHNjgtS5FJdHpxRjo6zab4+0wSUlVyCxCpZXFY5vHB/g+nQBw==}
'@kevisual/router@0.0.67':
resolution: {integrity: sha512-SKQDc9RUSUqpcVA4Y05rl525zmHcyl4JlHdFyBhatNRMBQdKCVd8rBAojnyz4gNmUU9bY+gxM87f30dHsQkRAw==}
'@kevisual/types@0.0.12':
resolution: {integrity: sha512-zJXH2dosir3jVrQ6QG4i0+iLQeT9gJ3H+cKXs8ReWboxBSYzUZO78XssVeVrFPsJ33iaAqo4q3DWbSS1dWGn7Q==}
'@kevisual/use-config@1.0.28':
resolution: {integrity: sha512-ngF+LDbjxpXWrZNmnShIKF/jPpAa+ezV+DcgoZIIzHlRnIjE+rr9sLkN/B7WJbiH9C/j1tQXOILY8ujBqILrow==}
peerDependencies:
dotenv: ^17
'@kevisual/use-config@1.0.30':
resolution: {integrity: sha512-kPdna0FW/X7D600aMdiZ5UTjbCo6d8d4jjauSc8RMmBwUU6WliFDSPUNKVpzm2BsDX5Nth1IXFPYMqH+wxqAmw==}
peerDependencies:
@@ -1416,10 +1393,6 @@ packages:
resolution: {integrity: sha512-jlFxSlXUEz93cFW+UYT5BXv/rFVgiMQnIfqRYZ0gj1hSP8PMGRqMqUoHSLfKvfRRS4jseLSvTTeEKSQpZJtURg==}
engines: {node: '>=10.0.0'}
'@kevisual/ws@8.19.0':
resolution: {integrity: sha512-jLsL80wBBKkrJZrfk3SQpJ9JA/zREdlUROj7eCkmzqduAWKSI0wVcXuCKf+mLFCHB0Q0Tkh2rgzjSlurt3JQgw==}
engines: {node: '>=10.0.0'}
'@lezer/common@1.4.0':
resolution: {integrity: sha512-DVeMRoGrgn/k45oQNu189BoW4SZwgZFzJ1+1TV5j2NJ/KFC83oa/enRqZSGshyeMk5cPWMhsKs9nx+8o0unwGg==}
@@ -1466,11 +1439,8 @@ packages:
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'}
'@opencode-ai/plugin@1.1.47':
resolution: {integrity: sha512-gNMPz72altieDfLhUw3VAT1xbduKi3w3wZ57GLeS7qU9W474HdvdIiLBnt2Xq3U7Ko0/0tvK3nzCker6IIDqmQ==}
'@opencode-ai/sdk@1.1.47':
resolution: {integrity: sha512-s3PBHwk1sP6Zt/lJxIWSBWZ1TnrI1nFxSP97LCODUytouAQgbygZ1oDH7O2sGMBEuGdA8B1nNSPla0aRSN3IpA==}
'@opencode-ai/plugin@1.1.48':
resolution: {integrity: sha512-KkaSMevXmz7tOwYDMJeWiXE5N8LmRP18qWI5Xhv3+c+FdGPL+l1hQrjSgyv3k7Co7qpCyW3kAUESBB7BzIOl2w==}
'@opencode-ai/sdk@1.1.48':
resolution: {integrity: sha512-j5/79X45fUPWVD2Ffm/qvwLclDCdPeV+TYMDrm9to0p4pmzhmeKevCsyiRdLg0o0HE3AFRUnOo2rdO9NetN79A==}
@@ -2402,9 +2372,6 @@ packages:
'@types/node@17.0.45':
resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==}
'@types/node@25.1.0':
resolution: {integrity: sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA==}
'@types/node@25.2.0':
resolution: {integrity: sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w==}
@@ -3427,10 +3394,6 @@ packages:
resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==}
engines: {node: '>=12.0.0'}
hono@4.11.7:
resolution: {integrity: sha512-l7qMiNee7t82bH3SeyUCt9UF15EVmaBvsppY2zQtrbIhl/yzBTny+YUxsVjSjQ6gaqaeVtZmGocom8TzBlA4Yw==}
engines: {node: '>=16.9.0'}
hookable@5.5.3:
resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
@@ -6314,15 +6277,6 @@ snapshots:
'@inquirer/ansi@2.0.3': {}
'@inquirer/checkbox@5.0.4(@types/node@25.1.0)':
dependencies:
'@inquirer/ansi': 2.0.3
'@inquirer/core': 11.1.1(@types/node@25.1.0)
'@inquirer/figures': 2.0.3
'@inquirer/type': 4.0.3(@types/node@25.1.0)
optionalDependencies:
'@types/node': 25.1.0
'@inquirer/checkbox@5.0.4(@types/node@25.2.0)':
dependencies:
'@inquirer/ansi': 2.0.3
@@ -6332,13 +6286,6 @@ snapshots:
optionalDependencies:
'@types/node': 25.2.0
'@inquirer/confirm@6.0.4(@types/node@25.1.0)':
dependencies:
'@inquirer/core': 11.1.1(@types/node@25.1.0)
'@inquirer/type': 4.0.3(@types/node@25.1.0)
optionalDependencies:
'@types/node': 25.1.0
'@inquirer/confirm@6.0.4(@types/node@25.2.0)':
dependencies:
'@inquirer/core': 11.1.1(@types/node@25.2.0)
@@ -6346,18 +6293,6 @@ snapshots:
optionalDependencies:
'@types/node': 25.2.0
'@inquirer/core@11.1.1(@types/node@25.1.0)':
dependencies:
'@inquirer/ansi': 2.0.3
'@inquirer/figures': 2.0.3
'@inquirer/type': 4.0.3(@types/node@25.1.0)
cli-width: 4.1.0
mute-stream: 3.0.0
signal-exit: 4.1.0
wrap-ansi: 9.0.2
optionalDependencies:
'@types/node': 25.1.0
'@inquirer/core@11.1.1(@types/node@25.2.0)':
dependencies:
'@inquirer/ansi': 2.0.3
@@ -6370,14 +6305,6 @@ snapshots:
optionalDependencies:
'@types/node': 25.2.0
'@inquirer/editor@5.0.4(@types/node@25.1.0)':
dependencies:
'@inquirer/core': 11.1.1(@types/node@25.1.0)
'@inquirer/external-editor': 2.0.3(@types/node@25.1.0)
'@inquirer/type': 4.0.3(@types/node@25.1.0)
optionalDependencies:
'@types/node': 25.1.0
'@inquirer/editor@5.0.4(@types/node@25.2.0)':
dependencies:
'@inquirer/core': 11.1.1(@types/node@25.2.0)
@@ -6386,13 +6313,6 @@ snapshots:
optionalDependencies:
'@types/node': 25.2.0
'@inquirer/expand@5.0.4(@types/node@25.1.0)':
dependencies:
'@inquirer/core': 11.1.1(@types/node@25.1.0)
'@inquirer/type': 4.0.3(@types/node@25.1.0)
optionalDependencies:
'@types/node': 25.1.0
'@inquirer/expand@5.0.4(@types/node@25.2.0)':
dependencies:
'@inquirer/core': 11.1.1(@types/node@25.2.0)
@@ -6400,13 +6320,6 @@ snapshots:
optionalDependencies:
'@types/node': 25.2.0
'@inquirer/external-editor@2.0.3(@types/node@25.1.0)':
dependencies:
chardet: 2.1.1
iconv-lite: 0.7.2
optionalDependencies:
'@types/node': 25.1.0
'@inquirer/external-editor@2.0.3(@types/node@25.2.0)':
dependencies:
chardet: 2.1.1
@@ -6416,13 +6329,6 @@ snapshots:
'@inquirer/figures@2.0.3': {}
'@inquirer/input@5.0.4(@types/node@25.1.0)':
dependencies:
'@inquirer/core': 11.1.1(@types/node@25.1.0)
'@inquirer/type': 4.0.3(@types/node@25.1.0)
optionalDependencies:
'@types/node': 25.1.0
'@inquirer/input@5.0.4(@types/node@25.2.0)':
dependencies:
'@inquirer/core': 11.1.1(@types/node@25.2.0)
@@ -6430,13 +6336,6 @@ snapshots:
optionalDependencies:
'@types/node': 25.2.0
'@inquirer/number@4.0.4(@types/node@25.1.0)':
dependencies:
'@inquirer/core': 11.1.1(@types/node@25.1.0)
'@inquirer/type': 4.0.3(@types/node@25.1.0)
optionalDependencies:
'@types/node': 25.1.0
'@inquirer/number@4.0.4(@types/node@25.2.0)':
dependencies:
'@inquirer/core': 11.1.1(@types/node@25.2.0)
@@ -6444,14 +6343,6 @@ snapshots:
optionalDependencies:
'@types/node': 25.2.0
'@inquirer/password@5.0.4(@types/node@25.1.0)':
dependencies:
'@inquirer/ansi': 2.0.3
'@inquirer/core': 11.1.1(@types/node@25.1.0)
'@inquirer/type': 4.0.3(@types/node@25.1.0)
optionalDependencies:
'@types/node': 25.1.0
'@inquirer/password@5.0.4(@types/node@25.2.0)':
dependencies:
'@inquirer/ansi': 2.0.3
@@ -6460,21 +6351,6 @@ snapshots:
optionalDependencies:
'@types/node': 25.2.0
'@inquirer/prompts@8.2.0(@types/node@25.1.0)':
dependencies:
'@inquirer/checkbox': 5.0.4(@types/node@25.1.0)
'@inquirer/confirm': 6.0.4(@types/node@25.1.0)
'@inquirer/editor': 5.0.4(@types/node@25.1.0)
'@inquirer/expand': 5.0.4(@types/node@25.1.0)
'@inquirer/input': 5.0.4(@types/node@25.1.0)
'@inquirer/number': 4.0.4(@types/node@25.1.0)
'@inquirer/password': 5.0.4(@types/node@25.1.0)
'@inquirer/rawlist': 5.2.0(@types/node@25.1.0)
'@inquirer/search': 4.1.0(@types/node@25.1.0)
'@inquirer/select': 5.0.4(@types/node@25.1.0)
optionalDependencies:
'@types/node': 25.1.0
'@inquirer/prompts@8.2.0(@types/node@25.2.0)':
dependencies:
'@inquirer/checkbox': 5.0.4(@types/node@25.2.0)
@@ -6490,13 +6366,6 @@ snapshots:
optionalDependencies:
'@types/node': 25.2.0
'@inquirer/rawlist@5.2.0(@types/node@25.1.0)':
dependencies:
'@inquirer/core': 11.1.1(@types/node@25.1.0)
'@inquirer/type': 4.0.3(@types/node@25.1.0)
optionalDependencies:
'@types/node': 25.1.0
'@inquirer/rawlist@5.2.0(@types/node@25.2.0)':
dependencies:
'@inquirer/core': 11.1.1(@types/node@25.2.0)
@@ -6504,14 +6373,6 @@ snapshots:
optionalDependencies:
'@types/node': 25.2.0
'@inquirer/search@4.1.0(@types/node@25.1.0)':
dependencies:
'@inquirer/core': 11.1.1(@types/node@25.1.0)
'@inquirer/figures': 2.0.3
'@inquirer/type': 4.0.3(@types/node@25.1.0)
optionalDependencies:
'@types/node': 25.1.0
'@inquirer/search@4.1.0(@types/node@25.2.0)':
dependencies:
'@inquirer/core': 11.1.1(@types/node@25.2.0)
@@ -6520,15 +6381,6 @@ snapshots:
optionalDependencies:
'@types/node': 25.2.0
'@inquirer/select@5.0.4(@types/node@25.1.0)':
dependencies:
'@inquirer/ansi': 2.0.3
'@inquirer/core': 11.1.1(@types/node@25.1.0)
'@inquirer/figures': 2.0.3
'@inquirer/type': 4.0.3(@types/node@25.1.0)
optionalDependencies:
'@types/node': 25.1.0
'@inquirer/select@5.0.4(@types/node@25.2.0)':
dependencies:
'@inquirer/ansi': 2.0.3
@@ -6538,10 +6390,6 @@ snapshots:
optionalDependencies:
'@types/node': 25.2.0
'@inquirer/type@4.0.3(@types/node@25.1.0)':
optionalDependencies:
'@types/node': 25.1.0
'@inquirer/type@4.0.3(@types/node@25.2.0)':
optionalDependencies:
'@types/node': 25.2.0
@@ -6592,16 +6440,6 @@ snapshots:
fuse.js: 7.1.0
nanoid: 5.1.6
'@kevisual/api@0.0.35':
dependencies:
'@kevisual/js-filter': 0.0.5
'@kevisual/load': 0.0.6
es-toolkit: 1.44.0
eventemitter3: 5.0.4
fuse.js: 7.1.0
nanoid: 5.1.6
path-browserify-esm: 1.0.6
'@kevisual/api@0.0.42':
dependencies:
'@kevisual/js-filter': 0.0.5
@@ -6645,45 +6483,6 @@ snapshots:
dependencies:
idb-keyval: 6.2.1
'@kevisual/cache@0.0.5':
dependencies:
idb-keyval: 6.2.2
lru-cache: 11.2.5
nanoid: 5.1.6
'@kevisual/cnb@0.0.13(dotenv@17.2.3)(idb-keyval@6.2.2)(typescript@5.8.2)':
dependencies:
'@kevisual/query': 0.0.38
'@kevisual/router': 0.0.64(typescript@5.8.2)
'@kevisual/use-config': 1.0.30(dotenv@17.2.3)
es-toolkit: 1.44.0
nanoid: 5.1.6
unstorage: 1.17.4(idb-keyval@6.2.2)
ws: '@kevisual/ws@8.19.0'
zod: 4.3.6
transitivePeerDependencies:
- '@azure/app-configuration'
- '@azure/cosmos'
- '@azure/data-tables'
- '@azure/identity'
- '@azure/keyvault-secrets'
- '@azure/storage-blob'
- '@capacitor/preferences'
- '@deno/kv'
- '@netlify/blobs'
- '@planetscale/database'
- '@upstash/redis'
- '@vercel/blob'
- '@vercel/functions'
- '@vercel/kv'
- aws4fetch
- db0
- dotenv
- idb-keyval
- ioredis
- typescript
- uploadthing
'@kevisual/context@0.0.4': {}
'@kevisual/dts@0.0.3(typescript@5.8.2)':
@@ -6697,12 +6496,6 @@ snapshots:
transitivePeerDependencies:
- typescript
'@kevisual/ha-api@0.0.8':
dependencies:
'@kevisual/cache': 0.0.5
fuse.js: 7.1.0
lru-cache: 11.2.5
'@kevisual/js-filter@0.0.5': {}
'@kevisual/kv-code@0.0.4(@types/react@19.2.10)(dotenv@17.2.3)':
@@ -6748,7 +6541,7 @@ snapshots:
'@kevisual/logger@0.0.4': {}
'@kevisual/oss@0.0.18': {}
'@kevisual/oss@0.0.19': {}
'@kevisual/permission@0.0.3': {}
@@ -6818,20 +6611,10 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@kevisual/router@0.0.64(typescript@5.8.2)':
dependencies:
'@kevisual/dts': 0.0.3(typescript@5.8.2)
hono: 4.11.7
transitivePeerDependencies:
- typescript
'@kevisual/router@0.0.67': {}
'@kevisual/types@0.0.12': {}
'@kevisual/use-config@1.0.28(dotenv@17.2.3)':
dependencies:
'@kevisual/load': 0.0.6
dotenv: 17.2.3
'@kevisual/use-config@1.0.30(dotenv@17.2.3)':
dependencies:
'@kevisual/load': 0.0.6
@@ -6856,8 +6639,6 @@ snapshots:
'@kevisual/ws@8.0.0': {}
'@kevisual/ws@8.19.0': {}
'@lezer/common@1.4.0': {}
'@lezer/css@1.3.0':
@@ -6943,13 +6724,11 @@ snapshots:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.17.1
'@opencode-ai/plugin@1.1.47':
'@opencode-ai/plugin@1.1.48':
dependencies:
'@opencode-ai/sdk': 1.1.47
'@opencode-ai/sdk': 1.1.48
zod: 4.1.8
'@opencode-ai/sdk@1.1.47': {}
'@opencode-ai/sdk@1.1.48': {}
'@oslojs/encoding@1.1.0': {}
@@ -8087,10 +7866,6 @@ snapshots:
'@types/node@17.0.45': {}
'@types/node@25.1.0':
dependencies:
undici-types: 7.16.0
'@types/node@25.2.0':
dependencies:
undici-types: 7.16.0
@@ -9390,8 +9165,6 @@ snapshots:
highlight.js@11.11.1: {}
hono@4.11.7: {}
hookable@5.5.3: {}
html-escaper@3.0.3: {}
@@ -9456,7 +9229,8 @@ snapshots:
idb-keyval@6.2.1: {}
idb-keyval@6.2.2: {}
idb-keyval@6.2.2:
optional: true
ignore@7.0.5: {}