From 88ed58b3d0180dbbb95733cf1d4387d7d37505f0 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 2 Jan 2026 23:47:28 +0100 Subject: [PATCH] chore: update deps and extend read tool tests --- CHANGELOG.md | 2 + package.json | 14 +- pnpm-lock.yaml | 331 +++++++++++++++++++----------------- src/agents/pi-tools.test.ts | 76 +++++++++ 4 files changed, 260 insertions(+), 163 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d58658041..c81deeecf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ ### Fixed - Media: preserve GIF animation when uploading to Discord/other providers (skip JPEG optimization for image/gif). - Agent runtime: update pi-mono dependencies to 0.31.1 (agent-core split). +- Dependencies: bump to latest compatible versions (TypeBox, grammY, Zod, Rolldown, oxlint-tsgolint). +- Tests: cover read tool image metadata + text output. ### Breaking - Skills config schema moved under `skills.*`: diff --git a/package.json b/package.json index da86103a1..6fa1a2eab 100644 --- a/package.json +++ b/package.json @@ -69,13 +69,13 @@ }, "packageManager": "pnpm@10.23.0", "dependencies": { - "@grammyjs/transformer-throttler": "^1.2.1", "@clack/prompts": "^0.11.0", + "@grammyjs/transformer-throttler": "^1.2.1", "@homebridge/ciao": "^1.3.4", "@mariozechner/pi-agent-core": "^0.31.1", "@mariozechner/pi-ai": "^0.31.1", "@mariozechner/pi-coding-agent": "^0.31.1", - "@sinclair/typebox": "^0.34.45", + "@sinclair/typebox": "0.34.46", "@whiskeysockets/baileys": "7.0.0-rc.9", "ajv": "^8.17.1", "body-parser": "^2.2.1", @@ -89,7 +89,7 @@ "dotenv": "^17.2.3", "express": "^5.2.1", "file-type": "^21.2.0", - "grammy": "^1.38.4", + "grammy": "^1.39.2", "json5": "^2.2.3", "long": "5.3.2", "playwright-core": "1.57.0", @@ -98,7 +98,7 @@ "tslog": "^4.10.2", "undici": "^7.16.0", "ws": "^8.18.3", - "zod": "^4.2.1" + "zod": "^4.3.4" }, "devDependencies": { "@biomejs/biome": "^2.3.10", @@ -119,9 +119,9 @@ "markdown-it": "^14.1.0", "ollama": "^0.6.3", "oxlint": "^1.36.0", - "oxlint-tsgolint": "^0.10.0", + "oxlint-tsgolint": "^0.10.1", "quicktype-core": "^23.2.6", - "rolldown": "1.0.0-beta.57", + "rolldown": "1.0.0-beta.58", "signal-utils": "^0.21.1", "tsx": "^4.21.0", "typescript": "^5.9.3", @@ -130,7 +130,7 @@ }, "pnpm": { "overrides": { - "@sinclair/typebox": "0.34.45" + "@sinclair/typebox": "0.34.46" }, "patchedDependencies": { "@mariozechner/pi-ai": "patches/@mariozechner__pi-ai.patch", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 64b3171a6..47c9a29a3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,22 +24,22 @@ importers: version: 0.11.0 '@grammyjs/transformer-throttler': specifier: ^1.2.1 - version: 1.2.1(grammy@1.38.4) + version: 1.2.1(grammy@1.39.2) '@homebridge/ciao': specifier: ^1.3.4 version: 1.3.4 '@mariozechner/pi-agent-core': specifier: ^0.31.1 - version: 0.31.1(ws@8.18.3)(zod@4.2.1) + version: 0.31.1(ws@8.18.3)(zod@4.3.4) '@mariozechner/pi-ai': specifier: ^0.31.1 - version: 0.31.1(patch_hash=bf3e904ebaad236b8c3bb48c7d1150a1463735e783acaab6d15d6cd381b43832)(ws@8.18.3)(zod@4.2.1) + version: 0.31.1(patch_hash=bf3e904ebaad236b8c3bb48c7d1150a1463735e783acaab6d15d6cd381b43832)(ws@8.18.3)(zod@4.3.4) '@mariozechner/pi-coding-agent': specifier: ^0.31.1 - version: 0.31.1(patch_hash=d0d5ffa1bfda8a0f9d14a5e73a074014346d3edbdb2ffc91444d3be5119f5745)(ws@8.18.3)(zod@4.2.1) + version: 0.31.1(patch_hash=d0d5ffa1bfda8a0f9d14a5e73a074014346d3edbdb2ffc91444d3be5119f5745)(ws@8.18.3)(zod@4.3.4) '@sinclair/typebox': - specifier: 0.34.45 - version: 0.34.45 + specifier: 0.34.46 + version: 0.34.46 '@whiskeysockets/baileys': specifier: 7.0.0-rc.9 version: 7.0.0-rc.9(audio-decode@2.2.3)(sharp@0.34.5) @@ -80,8 +80,8 @@ importers: specifier: ^21.2.0 version: 21.2.0 grammy: - specifier: ^1.38.4 - version: 1.38.4 + specifier: ^1.39.2 + version: 1.39.2 json5: specifier: ^2.2.3 version: 2.2.3 @@ -107,8 +107,8 @@ importers: specifier: ^8.18.3 version: 8.18.3 zod: - specifier: ^4.2.1 - version: 4.2.1 + specifier: ^4.3.4 + version: 4.3.4 devDependencies: '@biomejs/biome': specifier: ^2.3.10 @@ -163,16 +163,16 @@ importers: version: 0.6.3 oxlint: specifier: ^1.36.0 - version: 1.36.0(oxlint-tsgolint@0.10.0) + version: 1.36.0(oxlint-tsgolint@0.10.1) oxlint-tsgolint: - specifier: ^0.10.0 - version: 0.10.0 + specifier: ^0.10.1 + version: 0.10.1 quicktype-core: specifier: ^23.2.6 version: 23.2.6 rolldown: - specifier: 1.0.0-beta.57 - version: 1.0.0-beta.57 + specifier: 1.0.0-beta.58 + version: 1.0.0-beta.58 signal-utils: specifier: ^0.21.1 version: 0.21.1(signal-polyfill@0.2.2) @@ -304,9 +304,6 @@ packages: cpu: [x64] os: [win32] - '@borewit/text-codec@0.1.1': - resolution: {integrity: sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==} - '@borewit/text-codec@0.2.1': resolution: {integrity: sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw==} @@ -540,8 +537,8 @@ packages: peerDependencies: grammy: ^1.0.0 - '@grammyjs/types@3.22.2': - resolution: {integrity: sha512-uu7DX2ezhnBPozL3bXHmwhLvaFsh59E4QyviNH4Cij7EdVekYrs6mCzeXsa2pDk30l3uXo7DBahlZLzTPtpYZg==} + '@grammyjs/types@3.23.0': + resolution: {integrity: sha512-D3jQ4UWERPsyR3op/YFudMMIPNTU47vy7L51uO9/73tMELmjO/+LX5N36/Y0CG5IQfIsz43MxiHI5rgsK0/k+g==} '@hapi/boom@9.1.4': resolution: {integrity: sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==} @@ -781,33 +778,36 @@ packages: '@oxc-project/types@0.103.0': resolution: {integrity: sha512-bkiYX5kaXWwUessFRSoXFkGIQTmc6dLGdxuRTrC+h8PSnIdZyuXHHlLAeTmOue5Br/a0/a7dHH0Gca6eXn9MKg==} - '@oxlint-tsgolint/darwin-arm64@0.10.0': - resolution: {integrity: sha512-mhBF/pjey0UdLL1ocU46Fqta+uJuRfqrLfDpcViRg17BtDiUNd8JY9iN2FOoS2HGSCAgCUjZ0AZkwkHwFs/VTw==} + '@oxc-project/types@0.106.0': + resolution: {integrity: sha512-QdsH3rZq480VnOHSHgPYOhjL8O8LBdcnSjM408BpPCCUc0JYYZPG9Gafl9i3OcGk/7137o+gweb4cCv3WAUykg==} + + '@oxlint-tsgolint/darwin-arm64@0.10.1': + resolution: {integrity: sha512-KGC4++BeEqrIcmDHiJt/e6/860PWJmUJjjp0mE+smpBmRXMjmOFFjrPmN+ZyCyVgf1WdmhPkQXsRSPeTR+2omw==} cpu: [arm64] os: [darwin] - '@oxlint-tsgolint/darwin-x64@0.10.0': - resolution: {integrity: sha512-roLi34mw/i1z+NS7luboix55SXyhVv38dNUTcRDkk+0lNPzI9ngrM+1y1N2oBSUmz5o9OZGnfJJ7BSGCw/fFEQ==} + '@oxlint-tsgolint/darwin-x64@0.10.1': + resolution: {integrity: sha512-tvmrDgj3Q0tdc+zMWfCVLVq8EQDEUqasm1zaWgSMYIszpID6qdgqbT+OpWWXV9fLZgtvrkoXGwxkHAUJzdVZXQ==} cpu: [x64] os: [darwin] - '@oxlint-tsgolint/linux-arm64@0.10.0': - resolution: {integrity: sha512-HL9NThPH1V2F6l9XhwNmhQZUknN4m4yQYEvQFFGfZTYN6cvEEBIiqfF4KvBUg8c0xadMbQlW+Ug7/ybA9Nn+CA==} + '@oxlint-tsgolint/linux-arm64@0.10.1': + resolution: {integrity: sha512-7kD28z6/ykGx8WetKTPRZt30pd+ziassxg/8cM24lhjUI+hNXyRHVtHes73dh9D6glJKno+1ut+3amUdZBZcpQ==} cpu: [arm64] os: [linux] - '@oxlint-tsgolint/linux-x64@0.10.0': - resolution: {integrity: sha512-Tw8QNq8ab+4+qE5krvJyMA66v6XE3GoiISRD5WmJ7YOxUnu//jSw/bBm7OYf/TNEZyeV0BTR7zXzhT5R+VFWlQ==} + '@oxlint-tsgolint/linux-x64@0.10.1': + resolution: {integrity: sha512-NmJmiqdzYUTHIxteSTyX6IFFgnIsOAjRWXfrS6Jbo5xlB3g39WHniSF3asB/khLJNtwSg4InUS34NprYM7zrEw==} cpu: [x64] os: [linux] - '@oxlint-tsgolint/win32-arm64@0.10.0': - resolution: {integrity: sha512-LTogmTRwpwQqVaH1Ama8Wd5/VVZWBSF8v5qTbeT628+1F5Kt1V5eHBvyFh4oN18UCZlgqrh7DqkDhsieXUaC8Q==} + '@oxlint-tsgolint/win32-arm64@0.10.1': + resolution: {integrity: sha512-3KrT80vl3nXUkjuJI/z8dF6xWsKx0t9Tz4ZQHgQw3fYw+CoihBRWGklrdlmCz+EGfMyVaQLqBV9PZckhSqLe2A==} cpu: [arm64] os: [win32] - '@oxlint-tsgolint/win32-x64@0.10.0': - resolution: {integrity: sha512-ygqxx8EmNWy9/wCQS5uXq9k/o2EyYNwNxY1ZHNzlmZC/kV06Aemx5OBDafefawBNqH7xTZPfccUrjdiy+QlTrw==} + '@oxlint-tsgolint/win32-x64@0.10.1': + resolution: {integrity: sha512-hW1fSJZVxG51sLdGq1sQjOzb1tsQ23z/BquJfUwL7CqBobxr7TJvGmoINL+9KryOJt0jCoaiMfWe4yoYw5XfIA==} cpu: [x64] os: [win32] @@ -900,8 +900,8 @@ packages: cpu: [arm64] os: [android] - '@rolldown/binding-android-arm64@1.0.0-beta.57': - resolution: {integrity: sha512-GoOVDy8bjw9z1K30Oo803nSzXJS/vWhFijFsW3kzvZCO8IZwFnNa6pGctmbbJstKl3Fv6UBwyjJQN6msejW0IQ==} + '@rolldown/binding-android-arm64@1.0.0-beta.58': + resolution: {integrity: sha512-mWj5eE4Qc8TbPdGGaaLvBb9XfDPvE1EmZkJQgiGKwchkWH4oAJcRAKMTw7ZHnb1L+t7Ah41sBkAecaIsuUgsug==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] @@ -912,8 +912,8 @@ packages: cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-arm64@1.0.0-beta.57': - resolution: {integrity: sha512-9c4FOhRGpl+PX7zBK5p17c5efpF9aSpTPgyigv57hXf5NjQUaJOOiejPLAtFiKNBIfm5Uu6yFkvLKzOafNvlTw==} + '@rolldown/binding-darwin-arm64@1.0.0-beta.58': + resolution: {integrity: sha512-wFxUymI/5R8bH8qZFYDfAxAN9CyISEIYke+95oZPiv6EWo88aa5rskjVcCpKA532R+klFmdqjbbaD56GNmTF4Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] @@ -924,8 +924,8 @@ packages: cpu: [x64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.57': - resolution: {integrity: sha512-6RsB8Qy4LnGqNGJJC/8uWeLWGOvbRL/KG5aJ8XXpSEupg/KQtlBEiFaYU/Ma5Usj1s+bt3ItkqZYAI50kSplBA==} + '@rolldown/binding-darwin-x64@1.0.0-beta.58': + resolution: {integrity: sha512-ybp3MkPj23VDV9PhtRwdU5qrGhlViWRV5BjKwO6epaSlUD5lW0WyY+roN3ZAzbma/9RrMTgZ/a/gtQq8YXOcqw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] @@ -936,8 +936,8 @@ packages: cpu: [x64] os: [freebsd] - '@rolldown/binding-freebsd-x64@1.0.0-beta.57': - resolution: {integrity: sha512-uA9kG7+MYkHTbqwv67Tx+5GV5YcKd33HCJIi0311iYBd25yuwyIqvJfBdt1VVB8tdOlyTb9cPAgfCki8nhwTQg==} + '@rolldown/binding-freebsd-x64@1.0.0-beta.58': + resolution: {integrity: sha512-Evxj3yh7FWvyklUYZa0qTVT9N2zX9TPDqGF056hl8hlCZ9/ndQ2xMv6uw9PD1VlLpukbsqL+/C6M0qwipL0QMg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] @@ -948,8 +948,8 @@ packages: cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.57': - resolution: {integrity: sha512-3KkS0cHsllT2T+Te+VZMKHNw6FPQihYsQh+8J4jkzwgvAQpbsbXmrqhkw3YU/QGRrD8qgcOvBr6z5y6Jid+rmw==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.58': + resolution: {integrity: sha512-tYeXprDOrEgVHUbPXH6MPso4cM/c6RTkmJNICMQlYdki4hGMh92aj3yU6CKs+4X5gfG0yj5kVUw/L4M685SYag==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] @@ -960,8 +960,8 @@ packages: cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.57': - resolution: {integrity: sha512-A3/wu1RgsHhqP3rVH2+sM81bpk+Qd2XaHTl8LtX5/1LNR7QVBFBCpAoiXwjTdGnI5cMdBVi7Z1pi52euW760Fw==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.58': + resolution: {integrity: sha512-N78vmZzP6zG967Ohr+MasCjmKtis0geZ1SOVmxrA0/bklTQSzH5kHEjW5Qn+i1taFno6GEre1E40v0wuWsNOQw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] @@ -972,8 +972,8 @@ packages: cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.57': - resolution: {integrity: sha512-d0kIVezTQtazpyWjiJIn5to8JlwfKITDqwsFv0Xc6s31N16CD2PC/Pl2OtKgS7n8WLOJbfqgIp5ixYzTAxCqMg==} + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.58': + resolution: {integrity: sha512-l+p4QVtG72C7wI2SIkNQw/KQtSjuYwS3rV6AKcWrRBF62ClsFUcif5vLaZIEbPrCXu5OFRXigXFJnxYsVVZqdQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] @@ -984,8 +984,8 @@ packages: cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.57': - resolution: {integrity: sha512-E199LPijo98yrLjPCmETx8EF43sZf9t3guSrLee/ej1rCCc3zDVTR4xFfN9BRAapGVl7/8hYqbbiQPTkv73kUg==} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.58': + resolution: {integrity: sha512-urzJX0HrXxIh0FfxwWRjfPCMeInU9qsImLQxHBgLp5ivji1EEUnOfux8KxPPnRQthJyneBrN2LeqUix9DYrNaQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -996,8 +996,8 @@ packages: cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.57': - resolution: {integrity: sha512-++EQDpk/UJ33kY/BNsh7A7/P1sr/jbMuQ8cE554ZIy+tCUWCivo9zfyjDUoiMdnxqX6HLJEqqGnbGQOvzm2OMQ==} + '@rolldown/binding-linux-x64-musl@1.0.0-beta.58': + resolution: {integrity: sha512-7ijfVK3GISnXIwq/1FZo+KyAUJjL3kWPJ7rViAL6MWeEBhEgRzJ0yEd9I8N9aut8Y8ab+EKFJyRNMWZuUBwQ0A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -1008,8 +1008,8 @@ packages: cpu: [arm64] os: [openharmony] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.57': - resolution: {integrity: sha512-voDEBcNqxbUv/GeXKFtxXVWA+H45P/8Dec4Ii/SbyJyGvCqV1j+nNHfnFUIiRQ2Q40DwPe/djvgYBs9PpETiMA==} + '@rolldown/binding-openharmony-arm64@1.0.0-beta.58': + resolution: {integrity: sha512-/m7sKZCS+cUULbzyJTIlv8JbjNohxbpAOA6cM+lgWgqVzPee3U6jpwydrib328JFN/gF9A99IZEnuGYqEDJdww==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] @@ -1019,8 +1019,8 @@ packages: engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.57': - resolution: {integrity: sha512-bRhcF7NLlCnpkzLVlVhrDEd0KH22VbTPkPTbMjlYvqhSmarxNIq5vtlQS8qmV7LkPKHrNLWyJW/V/sOyFba26Q==} + '@rolldown/binding-wasm32-wasi@1.0.0-beta.58': + resolution: {integrity: sha512-6SZk7zMgv+y3wFFQ9qE5P9NnRHcRsptL1ypmudD26PDY+PvFCvfHRkJNfclWnvacVGxjowr7JOL3a9fd1wWhUw==} engines: {node: '>=14.0.0'} cpu: [wasm32] @@ -1030,8 +1030,8 @@ packages: cpu: [arm64] os: [win32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.57': - resolution: {integrity: sha512-rnDVGRks2FQ2hgJ2g15pHtfxqkGFGjJQUDWzYznEkE8Ra2+Vag9OffxdbJMZqBWXHVM0iS4dv8qSiEn7bO+n1Q==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.58': + resolution: {integrity: sha512-sFqfYPnBZ6xBhMkadB7UD0yjEDRvs7ipR3nCggblN+N4ODCXY6qhg/bKL39+W+dgQybL7ErD4EGERVbW9DAWvg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] @@ -1042,8 +1042,8 @@ packages: cpu: [x64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.57': - resolution: {integrity: sha512-OqIUyNid1M4xTj6VRXp/Lht/qIP8fo25QyAZlCP+p6D2ATCEhyW4ZIFLnC9zAGN/HMbXoCzvwfa8Jjg/8J4YEg==} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.58': + resolution: {integrity: sha512-AnFWJdAqB8+IDPcGrATYs67Kik/6tnndNJV2jGRmwlbeNiQQ8GhRJU8ETRlINfII0pqi9k4WWLnb00p1QCxw/Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -1051,8 +1051,8 @@ packages: '@rolldown/pluginutils@1.0.0-beta.55': resolution: {integrity: sha512-vajw/B3qoi7aYnnD4BQ4VoCcXQWnF0roSwE2iynbNxgW4l9mFwtLmLmUhpDdcTBfKyZm1p/T0D13qG94XBLohA==} - '@rolldown/pluginutils@1.0.0-beta.57': - resolution: {integrity: sha512-aQNelgx14tGA+n2tNSa9x6/jeoCL9fkDeCei7nOKnHx0fEFRRMu5ReiITo+zZD5TzWDGGRjbSYCs93IfRIyTuQ==} + '@rolldown/pluginutils@1.0.0-beta.58': + resolution: {integrity: sha512-qWhDs6yFGR5xDfdrwiSa3CWGIHxD597uGE/A9xGqytBjANvh4rLCTTkq7szhMV4+Ygh+PMS90KVJ8xWG/TkX4w==} '@rollup/rollup-android-arm-eabi@4.54.0': resolution: {integrity: sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng==} @@ -1179,6 +1179,9 @@ packages: '@sinclair/typebox@0.34.45': resolution: {integrity: sha512-qJcFVfCa5jxBFSuv7S5WYbA8XdeCPmhnaVVfX/2Y6L8WYg8sk3XY2+6W0zH+3mq1Cz+YC7Ki66HfqX6IHAwnkg==} + '@sinclair/typebox@0.34.46': + resolution: {integrity: sha512-kiW7CtS/NkdvTUjkjUJo7d5JsFfbJ14YjdhDk9KoEgK6nFjKNXZPrX0jfLA8ZlET4cFLHxOZ/0vFKOP+bOxIOQ==} + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -1865,8 +1868,8 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - grammy@1.38.4: - resolution: {integrity: sha512-z07Kin3HgRwMdy40KUs+c9fmNBvGlSxGwcqY8NAH0a8KULGFYEMQaFAo3ge0V5tvmgr02Jgubkf54KjHLAMCbw==} + grammy@1.39.2: + resolution: {integrity: sha512-7mLdNsNI2HBN1Gjombx7p3/Cjfgw/kErR/Qv3pDRw2qO/dYEdK8B9G9rpdZayNID+3qFQVTXNqxcGpG38mC2TQ==} engines: {node: ^12.20.0 || >=14.13.1} gtoken@8.0.0: @@ -1881,8 +1884,8 @@ packages: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} - hashery@1.3.0: - resolution: {integrity: sha512-fWltioiy5zsSAs9ouEnvhsVJeAXRybGCNNv0lvzpzNOSDbULXRy7ivFWwCCv4I5Am6kSo75hmbsCduOoc2/K4w==} + hashery@1.4.0: + resolution: {integrity: sha512-Wn2i1In6XFxl8Az55kkgnFRiAlIAushzh26PTjL2AKtQcEfXrcLa7Hn5QOWGZEf3LU057P9TwwZjFyxfS1VuvQ==} engines: {node: '>=20'} hasown@2.0.2: @@ -2229,8 +2232,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - music-metadata@11.10.3: - resolution: {integrity: sha512-j0g/x4cNNZW6I5gdcPAY+GFkJY9WHTpkFDMBJKQLxJQyvSfQbXm57fTE3haGFFuOzCgtsTd4Plwc49Sn9RacDQ==} + music-metadata@11.10.4: + resolution: {integrity: sha512-W8ByTxUk3p2PHycZraD+XVOzho5zONRqP9XVDwK4kTDGwfDrAmsNXMxNgSii8bI/GDC86mtk5kwGh1Lv/imNlA==} engines: {node: '>=18'} mz@2.7.0: @@ -2314,8 +2317,8 @@ packages: opus-decoder@0.7.11: resolution: {integrity: sha512-+e+Jz3vGQLxRTBHs8YJQPRPc1Tr+/aC6coV/DlZylriA29BdHQAYXhvNRKtjftof17OFng0+P4wsFIqQu3a48A==} - oxlint-tsgolint@0.10.0: - resolution: {integrity: sha512-LDDSIu5J/4D4gFUuQQIEQpAC6maNEbMg4nC8JL/+Pe0cUDR86dtVZ09E2x5MwCh8f9yfktoaxt5x6UIVyzrajg==} + oxlint-tsgolint@0.10.1: + resolution: {integrity: sha512-EEHNdo5cW2w1xwYdBQ7d3IXDqWAtMkfVFrh+9gQ4kYbYJwygY4QXSh1eH80/xVipZdVKujAwBgg/nNNHk56kxQ==} hasBin: true oxlint@1.36.0: @@ -2541,8 +2544,8 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rolldown@1.0.0-beta.57: - resolution: {integrity: sha512-lMMxcNN71GMsSko8RyeTaFoATHkCh4IWU7pYF73ziMYjhHZWfVesC6GQ+iaJCvZmVjvgSks9Ks1aaqEkBd8udg==} + rolldown@1.0.0-beta.58: + resolution: {integrity: sha512-v1FCjMZCan7f+xGAHBi+mqiE4MlH7I+SXEHSQSJoMOGNNB2UYtvMiejsq9YuUOiZjNeUeV/a21nSFbrUR+4ZCQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -2756,8 +2759,8 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - token-types@6.1.1: - resolution: {integrity: sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ==} + token-types@6.1.2: + resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} engines: {node: '>=14.16'} totalist@3.0.1: @@ -3028,16 +3031,16 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@4.2.1: - resolution: {integrity: sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==} + zod@4.3.4: + resolution: {integrity: sha512-Zw/uYiiyF6pUT1qmKbZziChgNPRu+ZRneAsMUDU6IwmXdWt5JwcUfy2bvLOCUtz5UniaN/Zx5aFttZYbYc7O/A==} snapshots: - '@anthropic-ai/sdk@0.71.2(zod@4.2.1)': + '@anthropic-ai/sdk@0.71.2(zod@4.3.4)': dependencies: json-schema-to-ts: 3.1.1 optionalDependencies: - zod: 4.2.1 + zod: 4.3.4 '@babel/code-frame@7.27.1': dependencies: @@ -3098,8 +3101,6 @@ snapshots: '@biomejs/cli-win32-x64@2.3.10': optional: true - '@borewit/text-codec@0.1.1': {} - '@borewit/text-codec@0.2.1': {} '@cacheable/memory@2.0.7': @@ -3117,7 +3118,7 @@ snapshots: '@cacheable/utils@2.3.3': dependencies: - hashery: 1.3.0 + hashery: 1.4.0 keyv: 5.5.5 '@clack/core@0.5.0': @@ -3288,12 +3289,12 @@ snapshots: - supports-color - utf-8-validate - '@grammyjs/transformer-throttler@1.2.1(grammy@1.38.4)': + '@grammyjs/transformer-throttler@1.2.1(grammy@1.39.2)': dependencies: bottleneck: 2.19.5 - grammy: 1.38.4 + grammy: 1.39.2 - '@grammyjs/types@3.22.2': {} + '@grammyjs/types@3.23.0': {} '@hapi/boom@9.1.4': dependencies: @@ -3432,7 +3433,7 @@ snapshots: '@keyv/bigmap@1.3.0(keyv@5.5.5)': dependencies: - hashery: 1.3.0 + hashery: 1.4.0 hookified: 1.14.0 keyv: 5.5.5 @@ -3470,9 +3471,9 @@ snapshots: transitivePeerDependencies: - tailwindcss - '@mariozechner/pi-agent-core@0.31.1(ws@8.18.3)(zod@4.2.1)': + '@mariozechner/pi-agent-core@0.31.1(ws@8.18.3)(zod@4.3.4)': dependencies: - '@mariozechner/pi-ai': 0.31.1(patch_hash=bf3e904ebaad236b8c3bb48c7d1150a1463735e783acaab6d15d6cd381b43832)(ws@8.18.3)(zod@4.2.1) + '@mariozechner/pi-ai': 0.31.1(patch_hash=bf3e904ebaad236b8c3bb48c7d1150a1463735e783acaab6d15d6cd381b43832)(ws@8.18.3)(zod@4.3.4) '@mariozechner/pi-tui': 0.31.1 transitivePeerDependencies: - '@modelcontextprotocol/sdk' @@ -3482,18 +3483,18 @@ snapshots: - ws - zod - '@mariozechner/pi-ai@0.31.1(patch_hash=bf3e904ebaad236b8c3bb48c7d1150a1463735e783acaab6d15d6cd381b43832)(ws@8.18.3)(zod@4.2.1)': + '@mariozechner/pi-ai@0.31.1(patch_hash=bf3e904ebaad236b8c3bb48c7d1150a1463735e783acaab6d15d6cd381b43832)(ws@8.18.3)(zod@4.3.4)': dependencies: - '@anthropic-ai/sdk': 0.71.2(zod@4.2.1) + '@anthropic-ai/sdk': 0.71.2(zod@4.3.4) '@google/genai': 1.34.0 '@mistralai/mistralai': 1.10.0 '@sinclair/typebox': 0.34.45 ajv: 8.17.1 ajv-formats: 3.0.1(ajv@8.17.1) chalk: 5.6.2 - openai: 6.10.0(ws@8.18.3)(zod@4.2.1) + openai: 6.10.0(ws@8.18.3)(zod@4.3.4) partial-json: 0.1.7 - zod-to-json-schema: 3.25.1(zod@4.2.1) + zod-to-json-schema: 3.25.1(zod@4.3.4) transitivePeerDependencies: - '@modelcontextprotocol/sdk' - bufferutil @@ -3502,10 +3503,10 @@ snapshots: - ws - zod - '@mariozechner/pi-coding-agent@0.31.1(patch_hash=d0d5ffa1bfda8a0f9d14a5e73a074014346d3edbdb2ffc91444d3be5119f5745)(ws@8.18.3)(zod@4.2.1)': + '@mariozechner/pi-coding-agent@0.31.1(patch_hash=d0d5ffa1bfda8a0f9d14a5e73a074014346d3edbdb2ffc91444d3be5119f5745)(ws@8.18.3)(zod@4.3.4)': dependencies: - '@mariozechner/pi-agent-core': 0.31.1(ws@8.18.3)(zod@4.2.1) - '@mariozechner/pi-ai': 0.31.1(patch_hash=bf3e904ebaad236b8c3bb48c7d1150a1463735e783acaab6d15d6cd381b43832)(ws@8.18.3)(zod@4.2.1) + '@mariozechner/pi-agent-core': 0.31.1(ws@8.18.3)(zod@4.3.4) + '@mariozechner/pi-ai': 0.31.1(patch_hash=bf3e904ebaad236b8c3bb48c7d1150a1463735e783acaab6d15d6cd381b43832)(ws@8.18.3)(zod@4.3.4) '@mariozechner/pi-tui': 0.31.1 chalk: 5.6.2 cli-highlight: 2.1.11 @@ -3558,22 +3559,24 @@ snapshots: '@oxc-project/types@0.103.0': {} - '@oxlint-tsgolint/darwin-arm64@0.10.0': + '@oxc-project/types@0.106.0': {} + + '@oxlint-tsgolint/darwin-arm64@0.10.1': optional: true - '@oxlint-tsgolint/darwin-x64@0.10.0': + '@oxlint-tsgolint/darwin-x64@0.10.1': optional: true - '@oxlint-tsgolint/linux-arm64@0.10.0': + '@oxlint-tsgolint/linux-arm64@0.10.1': optional: true - '@oxlint-tsgolint/linux-x64@0.10.0': + '@oxlint-tsgolint/linux-x64@0.10.1': optional: true - '@oxlint-tsgolint/win32-arm64@0.10.0': + '@oxlint-tsgolint/win32-arm64@0.10.1': optional: true - '@oxlint-tsgolint/win32-x64@0.10.0': + '@oxlint-tsgolint/win32-x64@0.10.1': optional: true '@oxlint/darwin-arm64@1.36.0': @@ -3635,61 +3638,61 @@ snapshots: '@rolldown/binding-android-arm64@1.0.0-beta.55': optional: true - '@rolldown/binding-android-arm64@1.0.0-beta.57': + '@rolldown/binding-android-arm64@1.0.0-beta.58': optional: true '@rolldown/binding-darwin-arm64@1.0.0-beta.55': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-beta.57': + '@rolldown/binding-darwin-arm64@1.0.0-beta.58': optional: true '@rolldown/binding-darwin-x64@1.0.0-beta.55': optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.57': + '@rolldown/binding-darwin-x64@1.0.0-beta.58': optional: true '@rolldown/binding-freebsd-x64@1.0.0-beta.55': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.57': + '@rolldown/binding-freebsd-x64@1.0.0-beta.58': optional: true '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.55': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.57': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.58': optional: true '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.55': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.57': + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.58': optional: true '@rolldown/binding-linux-arm64-musl@1.0.0-beta.55': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.57': + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.58': optional: true '@rolldown/binding-linux-x64-gnu@1.0.0-beta.55': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.57': + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.58': optional: true '@rolldown/binding-linux-x64-musl@1.0.0-beta.55': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.57': + '@rolldown/binding-linux-x64-musl@1.0.0-beta.58': optional: true '@rolldown/binding-openharmony-arm64@1.0.0-beta.55': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-beta.57': + '@rolldown/binding-openharmony-arm64@1.0.0-beta.58': optional: true '@rolldown/binding-wasm32-wasi@1.0.0-beta.55': @@ -3697,7 +3700,7 @@ snapshots: '@napi-rs/wasm-runtime': 1.1.1 optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.57': + '@rolldown/binding-wasm32-wasi@1.0.0-beta.58': dependencies: '@napi-rs/wasm-runtime': 1.1.1 optional: true @@ -3705,18 +3708,18 @@ snapshots: '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.55': optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.57': + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.58': optional: true '@rolldown/binding-win32-x64-msvc@1.0.0-beta.55': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.57': + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.58': optional: true '@rolldown/pluginutils@1.0.0-beta.55': {} - '@rolldown/pluginutils@1.0.0-beta.57': {} + '@rolldown/pluginutils@1.0.0-beta.58': {} '@rollup/rollup-android-arm-eabi@4.54.0': optional: true @@ -3795,6 +3798,8 @@ snapshots: '@sinclair/typebox@0.34.45': {} + '@sinclair/typebox@0.34.46': {} + '@standard-schema/spec@1.1.0': {} '@testing-library/dom@10.4.1': @@ -3825,7 +3830,7 @@ snapshots: '@tokenizer/inflate@0.4.1': dependencies: debug: 4.4.3 - token-types: 6.1.1 + token-types: 6.1.2 transitivePeerDependencies: - supports-color @@ -3912,6 +3917,20 @@ snapshots: dependencies: '@types/node': 25.0.3 + '@vitest/browser-playwright@4.0.16(playwright@1.57.0)(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.16)': + dependencies: + '@vitest/browser': 4.0.16(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.16) + '@vitest/mocker': 4.0.16(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + playwright: 1.57.0 + tinyrainbow: 3.0.3 + vitest: 4.0.16(@types/node@25.0.3)(@vitest/browser-playwright@4.0.16)(@vitest/browser-preview@4.0.16)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + optional: true + '@vitest/browser-playwright@4.0.16(playwright@1.57.0)(vite@8.0.0-beta.3(@types/node@25.0.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.16)': dependencies: '@vitest/browser': 4.0.16(vite@8.0.0-beta.3(@types/node@25.0.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.16) @@ -3925,11 +3944,11 @@ snapshots: - utf-8-validate - vite - '@vitest/browser-preview@4.0.16(vite@8.0.0-beta.3(@types/node@25.0.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.16)': + '@vitest/browser-preview@4.0.16(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.16)': dependencies: '@testing-library/dom': 10.4.1 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) - '@vitest/browser': 4.0.16(vite@8.0.0-beta.3(@types/node@25.0.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.16) + '@vitest/browser': 4.0.16(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.16) vitest: 4.0.16(@types/node@25.0.3)(@vitest/browser-playwright@4.0.16)(@vitest/browser-preview@4.0.16)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - bufferutil @@ -4075,7 +4094,7 @@ snapshots: async-mutex: 0.5.0 libsignal: '@whiskeysockets/libsignal-node@https://codeload.github.com/whiskeysockets/libsignal-node/tar.gz/1c30d7d7e76a3b0aa120b04dc6a26f5a12dccf67' lru-cache: 11.2.4 - music-metadata: 11.10.3 + music-metadata: 11.10.4 p-queue: 9.0.1 pino: 9.14.0 protobufjs: 7.5.4 @@ -4528,7 +4547,7 @@ snapshots: dependencies: '@tokenizer/inflate': 0.4.1 strtok3: 10.3.4 - token-types: 6.1.1 + token-types: 6.1.2 uint8array-extras: 1.5.0 transitivePeerDependencies: - supports-color @@ -4652,9 +4671,9 @@ snapshots: graceful-fs@4.2.11: {} - grammy@1.38.4: + grammy@1.39.2: dependencies: - '@grammyjs/types': 3.22.2 + '@grammyjs/types': 3.23.0 abort-controller: 3.0.0 debug: 4.4.3 node-fetch: 2.7.0 @@ -4673,7 +4692,7 @@ snapshots: has-symbols@1.1.0: {} - hashery@1.3.0: + hashery@1.4.0: dependencies: hookified: 1.14.0 @@ -4984,7 +5003,7 @@ snapshots: ms@2.1.3: {} - music-metadata@11.10.3: + music-metadata@11.10.4: dependencies: '@borewit/text-codec': 0.2.1 '@tokenizer/token': 0.3.0 @@ -4993,7 +5012,7 @@ snapshots: file-type: 21.2.0 media-typer: 1.1.0 strtok3: 10.3.4 - token-types: 6.1.1 + token-types: 6.1.2 uint8array-extras: 1.5.0 transitivePeerDependencies: - supports-color @@ -5053,26 +5072,26 @@ snapshots: dependencies: wrappy: 1.0.2 - openai@6.10.0(ws@8.18.3)(zod@4.2.1): + openai@6.10.0(ws@8.18.3)(zod@4.3.4): optionalDependencies: ws: 8.18.3 - zod: 4.2.1 + zod: 4.3.4 opus-decoder@0.7.11: dependencies: '@wasm-audio-decoders/common': 9.0.7 optional: true - oxlint-tsgolint@0.10.0: + oxlint-tsgolint@0.10.1: optionalDependencies: - '@oxlint-tsgolint/darwin-arm64': 0.10.0 - '@oxlint-tsgolint/darwin-x64': 0.10.0 - '@oxlint-tsgolint/linux-arm64': 0.10.0 - '@oxlint-tsgolint/linux-x64': 0.10.0 - '@oxlint-tsgolint/win32-arm64': 0.10.0 - '@oxlint-tsgolint/win32-x64': 0.10.0 + '@oxlint-tsgolint/darwin-arm64': 0.10.1 + '@oxlint-tsgolint/darwin-x64': 0.10.1 + '@oxlint-tsgolint/linux-arm64': 0.10.1 + '@oxlint-tsgolint/linux-x64': 0.10.1 + '@oxlint-tsgolint/win32-arm64': 0.10.1 + '@oxlint-tsgolint/win32-x64': 0.10.1 - oxlint@1.36.0(oxlint-tsgolint@0.10.0): + oxlint@1.36.0(oxlint-tsgolint@0.10.1): optionalDependencies: '@oxlint/darwin-arm64': 1.36.0 '@oxlint/darwin-x64': 1.36.0 @@ -5082,7 +5101,7 @@ snapshots: '@oxlint/linux-x64-musl': 1.36.0 '@oxlint/win32-arm64': 1.36.0 '@oxlint/win32-x64': 1.36.0 - oxlint-tsgolint: 0.10.0 + oxlint-tsgolint: 0.10.1 p-queue@9.0.1: dependencies: @@ -5339,24 +5358,24 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.55 '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.55 - rolldown@1.0.0-beta.57: + rolldown@1.0.0-beta.58: dependencies: - '@oxc-project/types': 0.103.0 - '@rolldown/pluginutils': 1.0.0-beta.57 + '@oxc-project/types': 0.106.0 + '@rolldown/pluginutils': 1.0.0-beta.58 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.57 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.57 - '@rolldown/binding-darwin-x64': 1.0.0-beta.57 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.57 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.57 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.57 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.57 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.57 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.57 - '@rolldown/binding-openharmony-arm64': 1.0.0-beta.57 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.57 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.57 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.57 + '@rolldown/binding-android-arm64': 1.0.0-beta.58 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.58 + '@rolldown/binding-darwin-x64': 1.0.0-beta.58 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.58 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.58 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.58 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.58 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.58 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.58 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.58 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.58 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.58 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.58 rollup@4.54.0: dependencies: @@ -5625,9 +5644,9 @@ snapshots: toidentifier@1.0.1: {} - token-types@6.1.1: + token-types@6.1.2: dependencies: - '@borewit/text-codec': 0.1.1 + '@borewit/text-codec': 0.2.1 '@tokenizer/token': 0.3.0 ieee754: 1.2.1 @@ -5746,8 +5765,8 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.0.3 - '@vitest/browser-playwright': 4.0.16(playwright@1.57.0)(vite@8.0.0-beta.3(@types/node@25.0.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.16) - '@vitest/browser-preview': 4.0.16(vite@8.0.0-beta.3(@types/node@25.0.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.16) + '@vitest/browser-playwright': 4.0.16(playwright@1.57.0)(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.16) + '@vitest/browser-preview': 4.0.16(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.16) transitivePeerDependencies: - jiti - less @@ -5827,10 +5846,10 @@ snapshots: dependencies: zod: 3.25.76 - zod-to-json-schema@3.25.1(zod@4.2.1): + zod-to-json-schema@3.25.1(zod@4.3.4): dependencies: - zod: 4.2.1 + zod: 4.3.4 zod@3.25.76: {} - zod@4.2.1: {} + zod@4.3.4: {} diff --git a/src/agents/pi-tools.test.ts b/src/agents/pi-tools.test.ts index bc95eb4b1..2a7930b8c 100644 --- a/src/agents/pi-tools.test.ts +++ b/src/agents/pi-tools.test.ts @@ -1,3 +1,8 @@ +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; + +import sharp from "sharp"; import { describe, expect, it } from "vitest"; import { createClawdisCodingTools } from "./pi-tools.js"; @@ -77,4 +82,75 @@ describe("createClawdisCodingTools", () => { expect(tools.some((tool) => tool.name === "bash")).toBe(true); expect(tools.some((tool) => tool.name === "process")).toBe(true); }); + + it("keeps read tool image metadata intact", async () => { + const tools = createClawdisCodingTools(); + const readTool = tools.find((tool) => tool.name === "read"); + expect(readTool).toBeDefined(); + + const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "clawdis-read-")); + try { + const imagePath = path.join(tmpDir, "sample.png"); + const png = await sharp({ + create: { + width: 8, + height: 8, + channels: 3, + background: { r: 0, g: 128, b: 255 }, + }, + }) + .png() + .toBuffer(); + await fs.writeFile(imagePath, png); + + const result = await readTool?.execute("tool-1", { + path: imagePath, + }); + + expect(result?.content?.some((block) => block.type === "image")).toBe( + true, + ); + const text = result?.content?.find((block) => block.type === "text") as + | { text?: string } + | undefined; + expect(text?.text ?? "").toContain("Read image file [image/png]"); + const image = result?.content?.find((block) => block.type === "image") as + | { mimeType?: string } + | undefined; + expect(image?.mimeType).toBe("image/png"); + } finally { + await fs.rm(tmpDir, { recursive: true, force: true }); + } + }); + + it("returns text content without image blocks for text files", async () => { + const tools = createClawdisCodingTools(); + const readTool = tools.find((tool) => tool.name === "read"); + expect(readTool).toBeDefined(); + + const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "clawdis-read-")); + try { + const textPath = path.join(tmpDir, "sample.txt"); + const contents = "Hello from clawdis read tool."; + await fs.writeFile(textPath, contents, "utf8"); + + const result = await readTool?.execute("tool-2", { + path: textPath, + }); + + expect(result?.content?.some((block) => block.type === "image")).toBe( + false, + ); + const textBlocks = result?.content?.filter( + (block) => block.type === "text", + ) as Array<{ text?: string }> | undefined; + expect(textBlocks?.length ?? 0).toBeGreaterThan(0); + const combinedText = textBlocks + ?.map((block) => block.text ?? "") + .join("\n"); + expect(combinedText).toContain(contents); + } finally { + await fs.rm(tmpDir, { recursive: true, force: true }); + } + }); });