diff --git a/dotfiles/macos/sketchybar/plugins/tests/notch_layout_test.sh b/dotfiles/macos/sketchybar/plugins/tests/notch_layout_test.sh index 99af6e65..25907dc3 100644 --- a/dotfiles/macos/sketchybar/plugins/tests/notch_layout_test.sh +++ b/dotfiles/macos/sketchybar/plugins/tests/notch_layout_test.sh @@ -94,7 +94,7 @@ popup_script="$(properties | jq -r '."notch.stats".script')" : >"$SKETCHYBAR_LOG" NAME=notch.stats SENDER=mouse.entered /bin/sh -c "$popup_script" assert '."notch.stats"."popup.drawing" == "on"' -[[ "$(wc -l <"$SKETCHYBAR_LOG" | tr -d ' ')" == 1 ]] +jq -es 'length == 1' "$SKETCHYBAR_LOG" >/dev/null : >"$SKETCHYBAR_LOG" NAME=notch.stats SENDER=forced /bin/sh -c "$popup_script" NAME=notch.stats SENDER=routine /bin/sh -c "$popup_script" diff --git a/mise.lock b/mise.lock index 07234463..76bcd90a 100644 --- a/mise.lock +++ b/mise.lock @@ -604,61 +604,61 @@ url = "https://download.docker.com/mac/static/stable/x86_64/docker-29.8.2.tgz" url = "https://download.docker.com/mac/static/stable/x86_64/docker-29.8.2.tgz" [[tools."aqua:docker/compose"]] -version = "5.5.1" +version = "5.6.0" backend = "aqua:docker/compose" [tools."aqua:docker/compose"."platforms.linux-arm64"] -checksum = "sha256:732e3a84c1a0f67256ce80bc2598a24546b10ca05f9faa97efceb1171ece2ef7" -url = "https://github.com/docker/compose/releases/download/v5.5.1/docker-compose-linux-aarch64" -url_api = "https://api.github.com/repos/docker/compose/releases/assets/542966295" +checksum = "sha256:733ec76717ceb59052a9609b9dadfb523b2df8eab57a54212872d10a58078ea2" +url = "https://github.com/docker/compose/releases/download/v5.6.0/docker-compose-linux-aarch64" +url_api = "https://api.github.com/repos/docker/compose/releases/assets/605922781" provenance = "cosign" [tools."aqua:docker/compose"."platforms.linux-arm64-musl"] -checksum = "sha256:732e3a84c1a0f67256ce80bc2598a24546b10ca05f9faa97efceb1171ece2ef7" -url = "https://github.com/docker/compose/releases/download/v5.5.1/docker-compose-linux-aarch64" -url_api = "https://api.github.com/repos/docker/compose/releases/assets/542966295" +checksum = "sha256:733ec76717ceb59052a9609b9dadfb523b2df8eab57a54212872d10a58078ea2" +url = "https://github.com/docker/compose/releases/download/v5.6.0/docker-compose-linux-aarch64" +url_api = "https://api.github.com/repos/docker/compose/releases/assets/605922781" provenance = "cosign" [tools."aqua:docker/compose"."platforms.linux-x64"] -checksum = "sha256:db1889184726840f75c4f9c001048430d4f25b3be3cb084d3ddd762bc0aed576" -url = "https://github.com/docker/compose/releases/download/v5.5.1/docker-compose-linux-x86_64" -url_api = "https://api.github.com/repos/docker/compose/releases/assets/542966285" +checksum = "sha256:40343e21ca777173e69cff5dbafeb37c6f81f3b0d57d9e597f036e95eb63e76a" +url = "https://github.com/docker/compose/releases/download/v5.6.0/docker-compose-linux-x86_64" +url_api = "https://api.github.com/repos/docker/compose/releases/assets/605922749" provenance = "cosign" [tools."aqua:docker/compose"."platforms.linux-x64-baseline"] -checksum = "sha256:db1889184726840f75c4f9c001048430d4f25b3be3cb084d3ddd762bc0aed576" -url = "https://github.com/docker/compose/releases/download/v5.5.1/docker-compose-linux-x86_64" -url_api = "https://api.github.com/repos/docker/compose/releases/assets/542966285" +checksum = "sha256:40343e21ca777173e69cff5dbafeb37c6f81f3b0d57d9e597f036e95eb63e76a" +url = "https://github.com/docker/compose/releases/download/v5.6.0/docker-compose-linux-x86_64" +url_api = "https://api.github.com/repos/docker/compose/releases/assets/605922749" provenance = "cosign" [tools."aqua:docker/compose"."platforms.linux-x64-musl"] -checksum = "sha256:db1889184726840f75c4f9c001048430d4f25b3be3cb084d3ddd762bc0aed576" -url = "https://github.com/docker/compose/releases/download/v5.5.1/docker-compose-linux-x86_64" -url_api = "https://api.github.com/repos/docker/compose/releases/assets/542966285" +checksum = "sha256:40343e21ca777173e69cff5dbafeb37c6f81f3b0d57d9e597f036e95eb63e76a" +url = "https://github.com/docker/compose/releases/download/v5.6.0/docker-compose-linux-x86_64" +url_api = "https://api.github.com/repos/docker/compose/releases/assets/605922749" provenance = "cosign" [tools."aqua:docker/compose"."platforms.linux-x64-musl-baseline"] -checksum = "sha256:db1889184726840f75c4f9c001048430d4f25b3be3cb084d3ddd762bc0aed576" -url = "https://github.com/docker/compose/releases/download/v5.5.1/docker-compose-linux-x86_64" -url_api = "https://api.github.com/repos/docker/compose/releases/assets/542966285" +checksum = "sha256:40343e21ca777173e69cff5dbafeb37c6f81f3b0d57d9e597f036e95eb63e76a" +url = "https://github.com/docker/compose/releases/download/v5.6.0/docker-compose-linux-x86_64" +url_api = "https://api.github.com/repos/docker/compose/releases/assets/605922749" provenance = "cosign" [tools."aqua:docker/compose"."platforms.macos-arm64"] -checksum = "sha256:998735c9b6fe68a4f05895e6ea73d71ad06f9fc7046383ad89e47346781b6af5" -url = "https://github.com/docker/compose/releases/download/v5.5.1/docker-compose-darwin-aarch64" -url_api = "https://api.github.com/repos/docker/compose/releases/assets/542966325" +checksum = "sha256:bd714a42b46e51757fc1121085b3096b9064e3f80d3ca5a991e33f44df4f43c9" +url = "https://github.com/docker/compose/releases/download/v5.6.0/docker-compose-darwin-aarch64" +url_api = "https://api.github.com/repos/docker/compose/releases/assets/605922795" provenance = "cosign" [tools."aqua:docker/compose"."platforms.macos-x64"] -checksum = "sha256:a264d61e824bf08a78867e59cdf32eb09f0aee9ecdf9f6ebfa43f76dc52880f1" -url = "https://github.com/docker/compose/releases/download/v5.5.1/docker-compose-darwin-x86_64" -url_api = "https://api.github.com/repos/docker/compose/releases/assets/542966307" +checksum = "sha256:c76e3abf5fde1aeb3bd7c7306ff15bef2246afc1f9e54832a0a050dd7cdfb2f8" +url = "https://github.com/docker/compose/releases/download/v5.6.0/docker-compose-darwin-x86_64" +url_api = "https://api.github.com/repos/docker/compose/releases/assets/605922764" provenance = "cosign" [tools."aqua:docker/compose"."platforms.macos-x64-baseline"] -checksum = "sha256:a264d61e824bf08a78867e59cdf32eb09f0aee9ecdf9f6ebfa43f76dc52880f1" -url = "https://github.com/docker/compose/releases/download/v5.5.1/docker-compose-darwin-x86_64" -url_api = "https://api.github.com/repos/docker/compose/releases/assets/542966307" +checksum = "sha256:c76e3abf5fde1aeb3bd7c7306ff15bef2246afc1f9e54832a0a050dd7cdfb2f8" +url = "https://github.com/docker/compose/releases/download/v5.6.0/docker-compose-darwin-x86_64" +url_api = "https://api.github.com/repos/docker/compose/releases/assets/605922764" provenance = "cosign" [[tools."aqua:getsops/sops"]] diff --git a/mise.personal-macos.lock b/mise.personal-macos.lock index 6b29900c..919fcc5f 100644 --- a/mise.personal-macos.lock +++ b/mise.personal-macos.lock @@ -1,20 +1,20 @@ # @generated - this file is auto-generated by `mise lock` https://mise.jdx.dev/dev-tools/mise-lock.html [[tools."aqua:aws/aws-cli"]] -version = "2.37.8" +version = "2.37.9" backend = "aqua:aws/aws-cli" [tools."aqua:aws/aws-cli"."platforms.linux-arm64"] -url = "https://awscli.amazonaws.com/awscli-exe-linux-aarch64-2.37.8.zip" +url = "https://awscli.amazonaws.com/awscli-exe-linux-aarch64-2.37.9.zip" [tools."aqua:aws/aws-cli"."platforms.linux-x64"] -url = "https://awscli.amazonaws.com/awscli-exe-linux-x86_64-2.37.8.zip" +url = "https://awscli.amazonaws.com/awscli-exe-linux-x86_64-2.37.9.zip" [tools."aqua:aws/aws-cli"."platforms.macos-arm64"] -url = "https://awscli.amazonaws.com/AWSCLIV2-2.37.8.pkg" +url = "https://awscli.amazonaws.com/AWSCLIV2-2.37.9.pkg" [tools."aqua:aws/aws-cli"."platforms.macos-x64"] -url = "https://awscli.amazonaws.com/AWSCLIV2-2.37.8.pkg" +url = "https://awscli.amazonaws.com/AWSCLIV2-2.37.9.pkg" [[tools."aqua:opentofu/opentofu"]] version = "1.13.1" diff --git a/mise.personal-macos.toml b/mise.personal-macos.toml index 2ef352e2..ac6be3f4 100644 --- a/mise.personal-macos.toml +++ b/mise.personal-macos.toml @@ -1,5 +1,5 @@ [tools] -"aqua:aws/aws-cli" = "2.37.8" +"aqua:aws/aws-cli" = "2.37.9" "aqua:opentofu/opentofu" = "1.13.1" "pipx:ansible-core" = "2.21.4" "pipx:ansible-lint" = "26.9.0" diff --git a/mise.toml b/mise.toml index 991194ce..1fc8196a 100644 --- a/mise.toml +++ b/mise.toml @@ -80,7 +80,7 @@ rust = { version = "1.99.0", components = ["clippy", "rustfmt", "rust-src", "rus "aqua:mvdan/sh" = "3.14.1" "aqua:JohnnyMorganz/StyLua" = "2.5.2" "aqua:docker/cli" = "29.8.2" -"aqua:docker/compose" = "5.5.1" +"aqua:docker/compose" = "5.6.0" # Upstream does not publish macOS binaries; Cargo works on all shared platforms. "cargo:eza" = "0.23.5" "cargo:tree-sitter-cli" = "0.27.0" diff --git a/pi-extensions/bun.lock b/pi-extensions/bun.lock index 1705bbdd..4f08c3bd 100644 --- a/pi-extensions/bun.lock +++ b/pi-extensions/bun.lock @@ -8,7 +8,7 @@ "@juicesharp/rpiv-ask-user-question": "2.12.0", "@plannotator/pi-extension": "0.27.25", "@router-for-me/pi-cliproxyapi-provider": "1.4.21", - "pi-subagents": "0.74.0", + "pi-subagents": "0.75.0", "pi-vim": "0.14.2", "pi-web-access": "0.35.0", "proper-lockfile": "4.1.2", @@ -34,9 +34,6 @@ }, }, }, - "patchedDependencies": { - "pi-subagents@0.74.0": "patches/pi-subagents@0.74.0.patch", - }, "packages": { "@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.124.0", "", { "dependencies": { "json-schema-to-ts": "^3.1.1", "standardwebhooks": "^1.0.0" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["zod"], "bin": { "anthropic-ai-sdk": "bin/cli" } }, "sha512-cN5O8i9UVxHeOQAzj/XjshWXG8KiibJDw9OGpH2Z/eR3n/RBxdoLxDJOcfqAJWvjaMDFfHTBADU04hWRJVkDyA=="], @@ -824,7 +821,7 @@ "path-to-regexp": ["path-to-regexp@8.4.2", "", {}, "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA=="], - "pi-subagents": ["pi-subagents@0.74.0", "", { "dependencies": { "acorn": "8.18.0", "jiti": "2.7.0", "undici": "8.10.2", "yaml": "2.8.3" }, "peerDependencies": { "@earendil-works/pi-agent-core": "*", "@earendil-works/pi-ai": ">=0.86.1", "@earendil-works/pi-coding-agent": "*", "@earendil-works/pi-tui": "*", "typebox": "*" }, "optionalPeers": ["@earendil-works/pi-agent-core", "@earendil-works/pi-ai", "@earendil-works/pi-coding-agent", "@earendil-works/pi-tui", "typebox"], "bin": { "pi-subagents": "install.mjs" } }, "sha512-7+67TCpQuYoW2kMu4Kmt4j90hiR8uX8ozg3F/eakApUU6PxK7NteO58ylOWPql7fh/uTIEfS00FT2LKVDTSicw=="], + "pi-subagents": ["pi-subagents@0.75.0", "", { "dependencies": { "acorn": "8.18.0", "jiti": "2.7.0", "undici": "8.10.2", "yaml": "2.8.3" }, "peerDependencies": { "@earendil-works/pi-agent-core": "*", "@earendil-works/pi-ai": ">=0.86.1", "@earendil-works/pi-coding-agent": "*", "@earendil-works/pi-tui": "*", "typebox": "*" }, "optionalPeers": ["@earendil-works/pi-agent-core", "@earendil-works/pi-ai", "@earendil-works/pi-coding-agent", "@earendil-works/pi-tui", "typebox"], "bin": { "pi-subagents": "install.mjs" } }, "sha512-RO4DiTJM6pnK8y9PnD7Y6TLeiX2c8Kh6QhmkecFo+ou5qtnz5qiM+vUKru48UmJG1nB9eJ6rALd1M04uBOR4XQ=="], "pi-vim": ["pi-vim@0.14.2", "", { "peerDependencies": { "@earendil-works/pi-coding-agent": "*", "@earendil-works/pi-tui": ">=0.74.0" } }, "sha512-CFSKJvOCNToueIMyBgsujT+gHa4sAlLOnT4VYZ6iCGKJ7M24eCVWFKKnnMt6tmP1rDE6T7k/AqBrb6LWzCzRaQ=="], diff --git a/pi-extensions/package.json b/pi-extensions/package.json index 997e9801..08bb04f5 100644 --- a/pi-extensions/package.json +++ b/pi-extensions/package.json @@ -44,7 +44,7 @@ "@juicesharp/rpiv-ask-user-question": "2.12.0", "@plannotator/pi-extension": "0.27.25", "@router-for-me/pi-cliproxyapi-provider": "1.4.21", - "pi-subagents": "0.74.0", + "pi-subagents": "0.75.0", "pi-vim": "0.14.2", "pi-web-access": "0.35.0", "proper-lockfile": "4.1.2" @@ -75,8 +75,5 @@ "pi-web-access", "@juicesharp/rpiv-ask-user-question", "pi-subagents" - ], - "patchedDependencies": { - "pi-subagents@0.74.0": "patches/pi-subagents@0.74.0.patch" - } + ] } diff --git a/pi-extensions/packages/shared-prompt-history/history-store.test.ts b/pi-extensions/packages/shared-prompt-history/history-store.test.ts index 520f639e..d744d61f 100644 --- a/pi-extensions/packages/shared-prompt-history/history-store.test.ts +++ b/pi-extensions/packages/shared-prompt-history/history-store.test.ts @@ -213,7 +213,7 @@ await appendPrompt("recovered", ${JSON.stringify(historyPath)}); await writeFile( historyPath, - '{"prompt":"valid"}\nnot-json\n{"prompt":42}\n{"prompt":"also valid"}\n', + ' {"prompt":"valid"}\nnot-json\n{broken\nnull\n[]\n42\n"text"\n{"prompt":42}\n{"prompt":"also valid"}\n', "utf8", ); diff --git a/pi-extensions/packages/shared-prompt-history/history-store.ts b/pi-extensions/packages/shared-prompt-history/history-store.ts index da88326a..2d706fe7 100644 --- a/pi-extensions/packages/shared-prompt-history/history-store.ts +++ b/pi-extensions/packages/shared-prompt-history/history-store.ts @@ -27,9 +27,12 @@ export function getPromptHistoryPath( } function parsePromptEntry(line: string): PromptHistoryEntry | undefined { - if (!line.trim()) return undefined; + const trimmed = line.trim(); + // History records are objects. Skip obvious garbage without throwing once + // per line when a bounded tail contains thousands of malformed records. + if (!trimmed.startsWith("{")) return undefined; try { - const entry: unknown = JSON.parse(line); + const entry: unknown = JSON.parse(trimmed); const prompt = entry ? Reflect.get(Object(entry), "prompt") : undefined; if (typeof prompt !== "string" || !prompt.trim()) return undefined; diff --git a/pi-extensions/patches/pi-subagents@0.74.0.patch b/pi-extensions/patches/pi-subagents@0.74.0.patch deleted file mode 100644 index 8c351892..00000000 --- a/pi-extensions/patches/pi-subagents@0.74.0.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/src/runs/background/runner-aliases.js b/src/runs/background/runner-aliases.js -index 7b101ec3e081f96de4ef8550b7bb1e6f3922711d..393515a146ac1da1a84ea967faa53e072106de8f 100644 ---- a/src/runs/background/runner-aliases.js -+++ b/src/runs/background/runner-aliases.js -@@ -16,7 +16,6 @@ export const JITI_ALIAS_ENV = "JITI_ALIAS"; - export const HOST_PEER_ALIASES = [ - { specifier: "@earendil-works/pi-coding-agent", pkg: "@earendil-works/pi-coding-agent", subpath: "." }, - { specifier: "@earendil-works/pi-agent-core", pkg: "@earendil-works/pi-agent-core", subpath: "." }, -- { specifier: "@earendil-works/pi-agent-core/node", pkg: "@earendil-works/pi-agent-core", subpath: "./node" }, - { specifier: "@earendil-works/pi-tui", pkg: "@earendil-works/pi-tui", subpath: "." }, - { specifier: "@earendil-works/pi-ai", pkg: "@earendil-works/pi-ai", subpath: "./compat" }, - { specifier: "@earendil-works/pi-ai/compat", pkg: "@earendil-works/pi-ai", subpath: "./compat" }, diff --git a/pi-extensions/subagents-host.test.mjs b/pi-extensions/subagents-host.test.mjs index a41296ee..2f3547f5 100644 --- a/pi-extensions/subagents-host.test.mjs +++ b/pi-extensions/subagents-host.test.mjs @@ -36,18 +36,21 @@ const piName = "@earendil-works/pi-coding-agent"; // Versions belong in declarations/locks, not compatibility assertions. This // covers imports and a native runner session, not a complete delegated workflow. -const requiredSpecifiers = HOST_PEER_ALIASES.map(({ specifier }) => specifier); +const requiredSpecifiers = HOST_PEER_ALIASES.filter( + ({ optional }) => !optional, +).map(({ specifier }) => specifier); function assertAliasResolution( result, missing = [], specifiers = requiredSpecifiers, + omitted = [], ) { assert.deepEqual([...result.missing].sort(), [...missing].sort()); for (const specifier of specifiers) { assert.equal( Object.hasOwn(result.aliases, specifier), - !missing.includes(specifier), + !missing.includes(specifier) && !omitted.includes(specifier), `${specifier}: required aliases must resolve, missing ones must not have fallback targets`, ); } @@ -175,10 +178,18 @@ test("historical isolated Pi layout: import-only exports resolve and missing dep delete modified.exports[subpath]; writeFileSync(packagePath, JSON.stringify(modified)); try { + // An undeclared optional export is unreachable; a declared + // export with a missing file still fails closed above. + const omitted = missing.filter((specifier) => + fixtureAliases.some( + (entry) => entry.specifier === specifier && entry.optional, + ), + ); assertAliasResolution( resolveHostPeerAliases(host), - missing, + missing.filter((specifier) => !omitted.includes(specifier)), fixtureSpecifiers, + omitted, ); } finally { writeFileSync(packagePath, source);