From 000065d207a868936d750aacc6808df41f2eabf8 Mon Sep 17 00:00:00 2001 From: mintaka Date: Sat, 5 Sep 2026 23:01:17 -0400 Subject: [PATCH 1/4] feat(compass-agent): migrate off the vendored oh-my-pi subtree onto @oh-my-pi/* 18.0.11 (RIG-2407) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Repoints `compass-agent` from the vendored `forks/oh-my-pi/` subtree onto the published upstream SDK, `@oh-my-pi/{pi-agent-core,pi-ai,pi-coding-agent,omptype}@^18.0.11`. This is PR1 of 3: runtime only. The generator repoint (PR2) and the actual deletion of `forks/oh-my-pi/` (PR3) stack on top, so the subtree is still present and still the generator's schema source after this lands. ### Why upstream, not the Rigel fork `forks/README.md:151-155` records the subtree's Sealed changes as **NONE** — byte-identical to upstream, with one sealed-added `forks/oh-my-pi/moon.yml`. The `forks/oh-my-pi/patches/` dir is upstream's own `patchedDependencies`, not ours. With no compass-specific patches to preserve there is nothing to carry, so this points at upstream `latest` and drops the vendoring rather than tracking a rebrand. `bunfig.toml` is untouched: 18.0.11 published 2026-08-29 and is already past the 5-day `minimumReleaseAge` soak, so no exemption entry was needed. ### The five API deltas, each fixed on the real contract 1. **`arktype` → `@oh-my-pi/omptype/ark`.** The direct `arktype` dependency is dropped; `omptype` is an ArkType-compatible lazy-JIT implementation whose `/ark` facade is purpose-built for this swap (it re-exports `type`, `Type`, and `ArkErrors = OmpErrors`). 8 files moved over. One cosmetic delta: `.expression` renders `number % 1 | undefined` instead of `<= 100`. The bound is still **enforced** — probed 101 and 1000 rejected, 100/1/omitted accepted — so `comms.test.ts` now asserts enforcement through the existing `rejects` helper instead of matching a rendered string. 2. **`irc` → `hub`.** The SDK renamed the COOP peer-channel tool. Compass's gate keeps its own name (`isIrcEnabled`, `tools/hub/messaging.ts:109-110`) with identical `taskDepth > 0` semantics, so this is a rename in tests and citations only. 3. **Progressive tool disclosure — `loadMode: "essential"`.** 18.x defaults an omitted `loadMode` at every adapter boundary (including SDK custom tools) to `"discoverable"`: registered, but not in the model's top-level callable schema. Left alone, the container agent would start with none of `comms_*` / `agents_*` / `forge_*` / `board_*` directly callable. Set once at the single registration seam (`cli.ts` `nativeTools`) rather than across 19 tool literals in 4 factories; the test helper mirrors it. 4. **Compaction supersession moved seam.** `elideSupersededCompactionEntries` is gone; elision is no longer a load-time step. It now happens during context assembly (`session/session-context.ts:377`, on the display-transcript path), and stored entries keep their real summaries. The round-trip test now asserts the chain survives load intact, which is what it was actually there to prove. 5. **Project-prompt footer restructured.** The cwd line moved out of `project-prompt.md` into a separate `date-cwd-reminder.md` block this render path does not include. The assertion now checks ``, which is what the footer renders. ### Verification - `bunx tsc --noEmit` — 0 errors - `bun test` — **677 pass / 0 fail** across 28 files (up from 380 pre-migration: the real SDK runtime now loads, so previously-skipped suites execute) - `moon run compass-agent:ci` — 5/5 tasks pass - `moon run toolchain-parity:ci` — green, all 71 pinned tools match the dev shell The `nodeModules` fixed-output derivation's `outputHash` is repinned (`sha256-JbgM44Aw…`). This is REQUIRED, not incidental: the FOD pins the installed dependency tree, so changing the closure (adding `omptype`, dropping `arktype`, bumping versions) while leaving the hash pinned makes the container build install the OLD 16.5.2 tree — which has no `omptype`, so the bundle failed with `Could not resolve: "@oh-my-pi/omptype/ark"`. The local `bun test` cannot catch this (it reads the real `node_modules`); only the container build does. Verified by building the image: `nix run … container build agent` now produces `image-compass-agent.json`. `agent-image/entrypoint.nix` natives path re-grounded against the installed package: `--external omp-legacy-pi-modules` still matches the SDK's optional dynamic import (`legacy-pi-compat.ts:751`), the loader's `execDir` candidate is confirmed at `loader-state.js:779`, and both `.node` CPU variants exist at the copy path. Upstream natives naming is self-consistent (`pi-natives` resolving `pi-natives-linux-x64`), so the addon-resolution bug the renamed fork build carries does not apply here. Spec-impact: none. Refs RIG-2407 Co-authored-by: Matt Wilkinson --- agent-image/entrypoint.nix | 10 +- bun.lock | 350 ++++-------------- packages/compass-agent/package.json | 8 +- packages/compass-agent/src/board.test.ts | 2 +- packages/compass-agent/src/board.ts | 8 +- packages/compass-agent/src/cli.test.ts | 33 +- packages/compass-agent/src/cli.ts | 18 +- packages/compass-agent/src/comms.test.ts | 30 +- packages/compass-agent/src/comms.ts | 15 +- packages/compass-agent/src/forge.test.ts | 2 +- packages/compass-agent/src/forge.ts | 8 +- packages/compass-agent/src/lifecycle.test.ts | 2 +- packages/compass-agent/src/lifecycle.ts | 8 +- .../src/subagent-tool-split.test.ts | 45 ++- .../src/transport/control-metrics.test.ts | 3 +- 15 files changed, 201 insertions(+), 341 deletions(-) diff --git a/agent-image/entrypoint.nix b/agent-image/entrypoint.nix index 83b1ff78e..fc9e9f417 100644 --- a/agent-image/entrypoint.nix +++ b/agent-image/entrypoint.nix @@ -131,7 +131,7 @@ let dontFixup = true; outputHashMode = "recursive"; outputHashAlgo = "sha256"; - outputHash = "sha256-GrsX8VmqoHIgvq/OZaOZN8HwrjI9PWcU6nYwI7I0uMo="; + outputHash = "sha256-JbgM44AwH7/b3Y/2T44+eBXwyvMi8owXToGVspEeCk4="; }; # The package's own source. A BARE path here (`${../packages/…}`) would copy @@ -188,10 +188,10 @@ let mkdir -p $out # `omp-legacy-pi-modules` is an OPTIONAL dynamic import inside the SDK's - # legacy-compat shim (pi-coding-agent legacy-pi-compat.ts:50), guarded at - # runtime and absent from our dependency closure. Left external so the - # bundler does not fail resolving a module the code already tolerates - # missing. + # legacy-compat shim (pi-coding-agent + # src/extensibility/plugins/legacy-pi-compat.ts:751), guarded at runtime and + # absent from our dependency closure. Left external so the bundler does not + # fail resolving a module the code already tolerates missing. # # `--compile` emits a STANDALONE executable (bun runtime + the whole # resolved graph baked in), not an interpreted `cli.js`. This is what lets diff --git a/bun.lock b/bun.lock index 822413a3d..7e4f2f793 100644 --- a/bun.lock +++ b/bun.lock @@ -75,9 +75,10 @@ "@connectrpc/connect-node": "^2.1.0", "@effect/opentelemetry": "catalog:", "@effect/platform": "catalog:", - "@oh-my-pi/pi-agent-core": "^16.4.8", - "@oh-my-pi/pi-ai": "^16.4.8", - "@oh-my-pi/pi-coding-agent": "^16.4.8", + "@oh-my-pi/omptype": "^18.0.11", + "@oh-my-pi/pi-agent-core": "^18.0.11", + "@oh-my-pi/pi-ai": "^18.0.11", + "@oh-my-pi/pi-coding-agent": "^18.0.11", "@opentelemetry/api": "catalog:", "@opentelemetry/exporter-metrics-otlp-proto": "catalog:", "@opentelemetry/exporter-trace-otlp-proto": "catalog:", @@ -88,7 +89,6 @@ "@opentelemetry/sdk-trace-node": "catalog:", "@opentelemetry/sdk-trace-web": "catalog:", "@opentelemetry/semantic-conventions": "catalog:", - "arktype": "2.2.3", "effect": "catalog:", }, "devDependencies": { @@ -303,14 +303,8 @@ "packages": { "@adobe/css-tools": ["@adobe/css-tools@4.5.0", "", {}, "sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q=="], - "@agentclientprotocol/sdk": ["@agentclientprotocol/sdk@1.2.1", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-jwYUdOQR7tc+Zfch53VL4JJyUNK/46q03uUTYb+PjECsmnNl94XFXOfYLJ8RBpMNidXd1rpOAVgb0vqD98xImA=="], - "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], - "@ark/schema": ["@ark/schema@0.56.2", "", { "dependencies": { "@ark/util": "0.56.2" } }, "sha512-Qx4D2JFbBWpntiHZaTv7bGG4H/M2rigiknezKg/WVyDSaLdE4YCcWAOoFB7pjjDqHbbV2OqRfntm1nnXvwMexg=="], - - "@ark/util": ["@ark/util@0.56.2", "", {}, "sha512-9kU2sUE38FZEGG7l3hamYMBieLYEJh2L1mrYD2eXpT+78EnQSV1bhjxJhnxGBMSTbtwpBSDNSK+K60WvaI/DTQ=="], - "@astrojs/check": ["@astrojs/check@0.9.10", "", { "dependencies": { "@astrojs/language-server": "^2.16.7", "chokidar": "^4.0.3", "kleur": "^4.1.5", "yargs": "^18.0.0" }, "peerDependencies": { "typescript": "^5.0.0 || ^6.0.0" }, "bin": { "astro-check": "./bin/astro-check.js" } }, "sha512-zgx/UQMozdjOa3bOxjgeCFdtpE3c9rRX6xHwa+2QXvy8z8Akifu2AtubHyv/zzC2znO8dl8fFWL4K+Ba9kS8HQ=="], "@astrojs/compiler": ["@astrojs/compiler@2.13.1", "", {}, "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg=="], @@ -465,8 +459,6 @@ "@clack/prompts": ["@clack/prompts@1.7.0", "", { "dependencies": { "@clack/core": "1.4.3", "fast-string-width": "^3.0.2", "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" } }, "sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A=="], - "@colors/colors": ["@colors/colors@1.6.0", "", {}, "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA=="], - "@compass/agent": ["@compass/agent@workspace:packages/compass-agent"], "@compass/agent-image-env-gate": ["@compass/agent-image-env-gate@workspace:tools/agent-image-env-gate"], @@ -533,8 +525,6 @@ "@ctrl/tinycolor": ["@ctrl/tinycolor@4.2.0", "", {}, "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A=="], - "@dabh/diagnostics": ["@dabh/diagnostics@2.0.8", "", { "dependencies": { "@so-ric/colorspace": "^1.1.6", "enabled": "2.0.x", "kuler": "^2.0.0" } }, "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q=="], - "@dom-expressions/babel-plugin-jsx": ["@dom-expressions/babel-plugin-jsx@0.50.0-next.43", "", { "dependencies": { "@babel/helper-module-imports": "7.18.6", "@babel/plugin-syntax-jsx": "^7.18.6", "@babel/types": "^7.20.7", "html-entities": "2.3.3", "parse5": "^7.1.2", "validate-html-nesting": "^1.2.1" }, "peerDependencies": { "@babel/core": "^7.20.12" } }, "sha512-JMMS/WHcptu2xMQQhUd7P0c0g2RSvvILg5Fj2y48AiWbPylQX8oXvekDTTXOlrebg1qapqMcEnw0OwYxwr7wOw=="], "@dom-expressions/compiler": ["@dom-expressions/compiler@0.50.0-next.40", "", { "optionalDependencies": { "@dom-expressions/compiler-darwin-arm64": "0.50.0-next.40", "@dom-expressions/compiler-darwin-x64": "0.50.0-next.40", "@dom-expressions/compiler-linux-arm64-gnu": "0.50.0-next.40", "@dom-expressions/compiler-linux-x64-gnu": "0.50.0-next.40", "@dom-expressions/compiler-wasm32-wasi": "0.50.0-next.40", "@dom-expressions/compiler-win32-x64-msvc": "0.50.0-next.40" } }, "sha512-RI/kHU+QkLOHo4CQyqLTn9c7sAfl/GEULMsOpS1YqkPJgy7R8MCPWXFN4sI0QDBbM6ePtEyuW+2bsdsXqyxkzQ=="], @@ -727,10 +717,6 @@ "@mdx-js/mdx": ["@mdx-js/mdx@3.1.1", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "acorn": "^8.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ=="], - "@mixmark-io/domino": ["@mixmark-io/domino@2.2.0", "", {}, "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw=="], - - "@mozilla/readability": ["@mozilla/readability@0.6.0", "", {}, "sha512-juG5VWh4qAivzTAeMzvY9xs9HY5rAcr2E4I7tiSSCokRFi7XIZCAu92ZkSTsIj1OPceCifL3cpfteP3pDT9/QQ=="], - "@msgpackr-extract/msgpackr-extract-darwin-arm64": ["@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ=="], "@msgpackr-extract/msgpackr-extract-darwin-x64": ["@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w=="], @@ -745,56 +731,58 @@ "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.2.2", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.3", "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.3" } }, "sha512-JfB4kuJQjaoHuCTseIINHtHWeJnvgEcxjwA5t/Y00ZgaOO1Crz3fjT/p8kT28zA/Caz7oiUMn3d6H2yOVCVwuw=="], - "@nodable/entities": ["@nodable/entities@3.0.0", "", {}, "sha512-8L9xFeTYKhm49xfIypoe2W5wV1m/3Z58kT+7kR9A8OyFxcPduI4VmxaUMQyKYrRjUoLLSXv6EKKID5Tvj9cUVw=="], - "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], - "@oh-my-pi/hashline": ["@oh-my-pi/hashline@16.5.2", "", { "dependencies": { "diff": "^9.0.0", "lru-cache": "11.5.2" } }, "sha512-5dUF7QuERyJoGFgcO8RkFzEtMDpMmvj3OcfQgSGk3GKQscXP2NH3BQreUmCcYsHuvz+hQ30FsEw+cKVKY9homA=="], + "@oh-my-pi/hashline": ["@oh-my-pi/hashline@18.0.11", "", { "dependencies": { "@oh-my-pi/pi-natives": "18.0.11", "@oh-my-pi/pi-utils": "18.0.11" } }, "sha512-7eaGky4yGj6Xoac7vF7FmYdEjrXQQfsS/7lrgnUtMWGTP7zTwEIrKWZd0LlVSoLVKB8OPcjvmj/Rpub2D2oN7A=="], + + "@oh-my-pi/omp-stats": ["@oh-my-pi/omp-stats@18.0.11", "", { "dependencies": { "@oh-my-pi/pi-ai": "18.0.11", "@oh-my-pi/pi-catalog": "18.0.11", "@oh-my-pi/pi-utils": "18.0.11", "@tailwindcss/node": "^4.3.2", "chart.js": "^4.5.1", "lucide-react": "^1.24.0", "react": "19.2.7", "react-chartjs-2": "^5.3.1", "react-dom": "19.2.7", "tailwindcss": "^4.3.2" }, "bin": { "omp-stats": "src/index.ts" } }, "sha512-HyWAqBqc/XIORwfAbRTe5pxdQfuwcbmf0l49KSYDDyk9QUToHLokkjnzo7cHKT6IpFjj8GZ7dioU+69qxCbipg=="], - "@oh-my-pi/omp-stats": ["@oh-my-pi/omp-stats@16.5.2", "", { "dependencies": { "@oh-my-pi/pi-ai": "16.5.2", "@oh-my-pi/pi-catalog": "16.5.2", "@oh-my-pi/pi-utils": "16.5.2", "@tailwindcss/node": "^4.3.2", "chart.js": "^4.5.1", "date-fns": "^4.4.0", "lucide-react": "^1.24.0", "react": "19.2.7", "react-chartjs-2": "^5.3.1", "react-dom": "19.2.7", "tailwindcss": "^4.3.2" }, "bin": { "omp-stats": "src/index.ts" } }, "sha512-olm624iqy0Epgt6AaP85SaKu/aUQNHBLXbOnqh6IXT+WtfMyq0ShUu7J/0HfhEzmFx2qlA4a+Knaf2UZBf2Ewg=="], + "@oh-my-pi/omptype": ["@oh-my-pi/omptype@18.0.11", "", {}, "sha512-7T6GLll8XB5LAIJ1aL97Lp8p/465wO3e0DYIRoveNUWrtLGmtp+uYDnHoixlW+JaWWo5iWuOoCnkNEeJXCxk/g=="], - "@oh-my-pi/pi-agent-core": ["@oh-my-pi/pi-agent-core@16.5.2", "", { "dependencies": { "@oh-my-pi/pi-ai": "16.5.2", "@oh-my-pi/pi-catalog": "16.5.2", "@oh-my-pi/pi-natives": "16.5.2", "@oh-my-pi/pi-utils": "16.5.2", "@oh-my-pi/pi-wire": "16.5.2", "@oh-my-pi/snapcompact": "16.5.2", "@opentelemetry/api": "^1.9.1" } }, "sha512-5aYKEvhbs/6dAaxvJbjOW6L1dr21TBk6UWTOtg13YudYpPtBbKakfwnMJUMuGsivYNNCipm0Z7uW8OWsg/HTiA=="], + "@oh-my-pi/pi-agent-core": ["@oh-my-pi/pi-agent-core@18.0.11", "", { "dependencies": { "@oh-my-pi/pi-ai": "18.0.11", "@oh-my-pi/pi-catalog": "18.0.11", "@oh-my-pi/pi-natives": "18.0.11", "@oh-my-pi/pi-utils": "18.0.11", "@oh-my-pi/pi-wire": "18.0.11", "@oh-my-pi/snapcompact": "18.0.11", "@opentelemetry/api": "^1.9.1" } }, "sha512-lni89wtJ3WOpXPcTNtxcYsVgdzJByVnELwCcAl6MOcJJLgt/h0wGcwV5fEOsMKF3oboZrujbCcAdHSvJClrvsQ=="], - "@oh-my-pi/pi-ai": ["@oh-my-pi/pi-ai@16.5.2", "", { "dependencies": { "@bufbuild/protobuf": "^2.12.1", "@oh-my-pi/pi-catalog": "16.5.2", "@oh-my-pi/pi-utils": "16.5.2", "@oh-my-pi/pi-wire": "16.5.2", "arktype": "2.2.3", "zod": "^4" } }, "sha512-KM3dfTxNaiztckBpMbrN/p651hmIMwbm02wqylUhJmC+XcfcZt0ZjXJ7skgUZ0ljnDCQUhAucTzWhrmMlrfQgA=="], + "@oh-my-pi/pi-ai": ["@oh-my-pi/pi-ai@18.0.11", "", { "dependencies": { "@oh-my-pi/omptype": "18.0.11", "@oh-my-pi/pi-catalog": "18.0.11", "@oh-my-pi/pi-utils": "18.0.11", "@oh-my-pi/pi-wire": "18.0.11" } }, "sha512-hgPcRLTta+W+Erlb5NRFJ7hXo/Wp9w6d9K1bfbfuUZ7tD0ksV397c8VFohsPJWq5Kwx1+kwQva7s1hWPPO6Sxg=="], - "@oh-my-pi/pi-catalog": ["@oh-my-pi/pi-catalog@16.5.2", "", { "dependencies": { "@bufbuild/protobuf": "^2.12.1", "@oh-my-pi/pi-utils": "16.5.2", "arktype": "2.2.3", "zod": "^4" } }, "sha512-adxH47fb4xuoOvPYupTP9nOzR/zSEr0ratNWjDC0yxYUMa3f1MCtKlk5t6a4MF0r5JljgJmUDIeTZ55vxI1QOw=="], + "@oh-my-pi/pi-catalog": ["@oh-my-pi/pi-catalog@18.0.11", "", { "dependencies": { "@oh-my-pi/omptype": "18.0.11", "@oh-my-pi/pi-utils": "18.0.11" } }, "sha512-TQdHq2VE+ftOfPJzTcOL5MeDAlc95GkjKlT3HL5G91LqRKIosXptCgq59+g3g8hsxo7x+WuoOmd2KHBy4Q16vw=="], - "@oh-my-pi/pi-coding-agent": ["@oh-my-pi/pi-coding-agent@16.5.2", "", { "dependencies": { "@agentclientprotocol/sdk": "1.2.1", "@babel/parser": "^7.29.7", "@mozilla/readability": "^0.6.0", "@oh-my-pi/hashline": "16.5.2", "@oh-my-pi/omp-stats": "16.5.2", "@oh-my-pi/pi-agent-core": "16.5.2", "@oh-my-pi/pi-ai": "16.5.2", "@oh-my-pi/pi-catalog": "16.5.2", "@oh-my-pi/pi-mnemopi": "16.5.2", "@oh-my-pi/pi-natives": "16.5.2", "@oh-my-pi/pi-tui": "16.5.2", "@oh-my-pi/pi-utils": "16.5.2", "@oh-my-pi/pi-wire": "16.5.2", "@oh-my-pi/snapcompact": "16.5.2", "@opentelemetry/api": "^1.9.1", "@opentelemetry/context-async-hooks": "^2.7.1", "@opentelemetry/exporter-trace-otlp-proto": "^0.220.0", "@opentelemetry/resources": "^2.7.1", "@opentelemetry/sdk-trace-base": "^2.7.1", "@opentelemetry/sdk-trace-node": "^2.7.1", "@puppeteer/browsers": "^3.0.6", "@types/turndown": "5.0.6", "@xterm/headless": "^6.0.0", "arktype": "2.2.3", "chalk": "^5.6.2", "diff": "^9.0.0", "fast-xml-parser": "^5.9.3", "handlebars": "^4.7.9", "header-generator": "^2.1.82", "linkedom": "^0.18.13", "lru-cache": "11.5.2", "mammoth": "^1.12.0", "mupdf": "^1.28.0", "puppeteer-core": "25.3.0", "turndown": "7.2.4", "turndown-plugin-gfm": "1.0.2", "zod": "^4" }, "optionalDependencies": { "@huggingface/transformers": "^4.2.0", "sherpa-onnx-node": "1.13.2" }, "bin": { "omp": "dist/cli.js" } }, "sha512-qvMnnZgEyx6xC0dVfYLXuX/afp/wqBzGKu0h3RNvriEBQiobLvA8IxFjyFBokLSq1Sns2bLG0vOhSLmsL1L43Q=="], + "@oh-my-pi/pi-coding-agent": ["@oh-my-pi/pi-coding-agent@18.0.11", "", { "dependencies": { "@babel/parser": "^7.29.7", "@oh-my-pi/hashline": "18.0.11", "@oh-my-pi/omp-stats": "18.0.11", "@oh-my-pi/omptype": "18.0.11", "@oh-my-pi/pi-agent-core": "18.0.11", "@oh-my-pi/pi-ai": "18.0.11", "@oh-my-pi/pi-catalog": "18.0.11", "@oh-my-pi/pi-mnemopi": "18.0.11", "@oh-my-pi/pi-natives": "18.0.11", "@oh-my-pi/pi-tui": "18.0.11", "@oh-my-pi/pi-utils": "18.0.11", "@oh-my-pi/pi-wire": "18.0.11", "@oh-my-pi/snapcompact": "18.0.11", "@opentelemetry/api": "^1.9.1", "@opentelemetry/api-logs": "^0.220.0", "@opentelemetry/context-async-hooks": "^2.9.0", "@opentelemetry/exporter-logs-otlp-proto": "^0.220.0", "@opentelemetry/exporter-metrics-otlp-proto": "^0.220.0", "@opentelemetry/exporter-trace-otlp-proto": "^0.220.0", "@opentelemetry/resources": "^2.9.0", "@opentelemetry/sdk-logs": "^0.220.0", "@opentelemetry/sdk-metrics": "^2.9.0", "@opentelemetry/sdk-trace-base": "^2.9.0", "@opentelemetry/sdk-trace-node": "^2.9.0", "puppeteer-core": "25.3.0" }, "optionalDependencies": { "@huggingface/transformers": "^4.2.0", "sherpa-onnx-node": "1.13.2" }, "bin": { "omp": "dist/cli.js" } }, "sha512-3H90cCc+3yLtvSKM2RooIvkhG+77OFFoXD6+9GPZDF3PQ3FF6uCnPP57OaUa8VZ8YwOm9Eio5ZmfdFuvwLn+VA=="], - "@oh-my-pi/pi-mnemopi": ["@oh-my-pi/pi-mnemopi@16.5.2", "", { "dependencies": { "@oh-my-pi/pi-ai": "16.5.2", "@oh-my-pi/pi-catalog": "16.5.2", "@oh-my-pi/pi-utils": "16.5.2", "lru-cache": "11.5.2" }, "peerDependencies": { "fastembed": "2.1.0", "onnxruntime-node": "1.21.0" }, "optionalPeers": ["fastembed", "onnxruntime-node"], "bin": { "mnemopi": "src/cli.ts" } }, "sha512-ITrBIahERF/QW/xn7BIwmRRFIGi5ESPHVBNnR2Xws2haUQQcIBLNv9WLhNYZNwzZrDRLsm/OvObIHdv5A2gtyw=="], + "@oh-my-pi/pi-mnemopi": ["@oh-my-pi/pi-mnemopi@18.0.11", "", { "dependencies": { "@oh-my-pi/pi-ai": "18.0.11", "@oh-my-pi/pi-catalog": "18.0.11", "@oh-my-pi/pi-natives": "18.0.11", "@oh-my-pi/pi-utils": "18.0.11" }, "peerDependencies": { "fastembed": "2.1.0", "onnxruntime-node": "1.21.0" }, "optionalPeers": ["fastembed", "onnxruntime-node"], "bin": { "mnemopi": "src/cli.ts" } }, "sha512-qnWEjWfEEV1qlUJcMS7IG1JVcOZ+jfyr8Hn6pII0+vZm+qVYEc3YMtjGRfpUwsgWUGHOVjYYiPbcTuCa9HFjlQ=="], - "@oh-my-pi/pi-natives": ["@oh-my-pi/pi-natives@16.5.2", "", { "optionalDependencies": { "@oh-my-pi/pi-natives-darwin-arm64": "16.5.2", "@oh-my-pi/pi-natives-darwin-x64": "16.5.2", "@oh-my-pi/pi-natives-linux-arm64": "16.5.2", "@oh-my-pi/pi-natives-linux-x64": "16.5.2", "@oh-my-pi/pi-natives-win32-x64": "16.5.2" } }, "sha512-H+yPlHarVyhmxfVY/2FMIpeP/Dmsmc5TCGLbEjDDoQ1DU97AMxw4rmf/99sNetz/82r0UF0ZbUsP6e+z/UO4cA=="], + "@oh-my-pi/pi-natives": ["@oh-my-pi/pi-natives@18.0.11", "", { "optionalDependencies": { "@oh-my-pi/pi-natives-darwin-arm64": "18.0.11", "@oh-my-pi/pi-natives-darwin-x64": "18.0.11", "@oh-my-pi/pi-natives-linux-arm64": "18.0.11", "@oh-my-pi/pi-natives-linux-x64": "18.0.11", "@oh-my-pi/pi-natives-win32-x64": "18.0.11" } }, "sha512-KnkRtWsk6feWaXeH4PGAPD9p4KHXGzy7EqVLa44eaePlc72T/5bUl7D03hrsUJfilbFaYpxyuhTflfOgK5ORXQ=="], - "@oh-my-pi/pi-natives-darwin-arm64": ["@oh-my-pi/pi-natives-darwin-arm64@16.5.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-NOMIrjK8NUHhM6+Wyb2t9UqNjhztMG102Dm1xlFBK7044LVYehxWZ1K+HBpluTo7Mmp7OIcVH72/y437TU3DPw=="], + "@oh-my-pi/pi-natives-darwin-arm64": ["@oh-my-pi/pi-natives-darwin-arm64@18.0.11", "", { "os": "darwin", "cpu": "arm64" }, "sha512-4XWCl30DLxRKRpcfi6OdtWhc5d7lh/f2fPkDO0xdo5n8yTkObJ+ZR9KlhJiyJI9T+e3zeztBtBMbU9ZmIgXOmg=="], - "@oh-my-pi/pi-natives-darwin-x64": ["@oh-my-pi/pi-natives-darwin-x64@16.5.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-ZR+8RytmuTcGchFJGmZVrqf3qiXiYKcWI7YYOOpsRu5sOHyhJQt1AQg6QHnGTTUAiMWILOOywQqDfWnS7Jm1bg=="], + "@oh-my-pi/pi-natives-darwin-x64": ["@oh-my-pi/pi-natives-darwin-x64@18.0.11", "", { "os": "darwin", "cpu": "x64" }, "sha512-yNSPyV8WAqhffUNkuWdgAN7c/qp+59HlEo0D8pIrou3PqmAU3MlES5pTEXngZtyUBgCah2WQ7hosKu7Z4WN8pQ=="], - "@oh-my-pi/pi-natives-linux-arm64": ["@oh-my-pi/pi-natives-linux-arm64@16.5.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-e3NmbZwu/SMvVdQV5Gvne8jMhpXE4+izTNQRtrFrNVvWaFf7JvLgOr61UFtu0en/OdS0pt8uj5KfKlwfJRC+Yw=="], + "@oh-my-pi/pi-natives-linux-arm64": ["@oh-my-pi/pi-natives-linux-arm64@18.0.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-vgdMvhx4M6836ppc9DiuxzAqO0HCkdmQcN/GVArirT84z7xYVyzb2N+AabR6kDwrKAVS3RnXVnxO9g4oTd9R7A=="], - "@oh-my-pi/pi-natives-linux-x64": ["@oh-my-pi/pi-natives-linux-x64@16.5.2", "", { "os": "linux", "cpu": "x64" }, "sha512-o0g7edSynuRGzn6AB8JykQwudX6mApqXl1riqj6hllaFnz2uBsFttHmleiBogY9jWB0AhsaHy5dQ9FWMMHxzSQ=="], + "@oh-my-pi/pi-natives-linux-x64": ["@oh-my-pi/pi-natives-linux-x64@18.0.11", "", { "os": "linux", "cpu": "x64" }, "sha512-M90qBlT5qb3ZuGikt9Mo7ge72XgGxvijDLFP3Jjz+qE0VIjAljDuXi1hkaxN207ngx9Rtb6uEJQkbpmWk/zfrA=="], - "@oh-my-pi/pi-natives-win32-x64": ["@oh-my-pi/pi-natives-win32-x64@16.5.2", "", { "os": "win32", "cpu": "x64" }, "sha512-gnZNte96lmdL0sSRzOaW4k4PEkK4HdirPI85Nwhd0pwPwH2z4YBG1Udz4mUfcRdosGppgUyhbhNOWzwo9QzrIQ=="], + "@oh-my-pi/pi-natives-win32-x64": ["@oh-my-pi/pi-natives-win32-x64@18.0.11", "", { "os": "win32", "cpu": "x64" }, "sha512-tqQtn1zxDQ6V/gfRhx6/AQqGdy8gPtpV8ndjINj3/piUGKqjrsinUU1XwWGgcKnII2a1tKV/wB4TSB4ieWq46w=="], - "@oh-my-pi/pi-tui": ["@oh-my-pi/pi-tui@16.5.2", "", { "dependencies": { "@oh-my-pi/pi-natives": "16.5.2", "@oh-my-pi/pi-utils": "16.5.2", "lru-cache": "11.5.2", "marked": "^18.0.6" } }, "sha512-U2kqQ4kHHwGvgsaTtO3EnVqMwphb7GEFizQA4vWuMjjt/ckdYEKlU2b/gJI86m99R5tZ3p951rTKmKMWC+RX9Q=="], + "@oh-my-pi/pi-tui": ["@oh-my-pi/pi-tui@18.0.11", "", { "dependencies": { "@oh-my-pi/pi-natives": "18.0.11", "@oh-my-pi/pi-utils": "18.0.11" } }, "sha512-lrQn5ly80f+OmlPRvMZYgpmtLoG46mLG/6w9QHccmichI0i/vOvwTdp201xKiFv1a4diFnm4058+ytRWegN4MQ=="], - "@oh-my-pi/pi-utils": ["@oh-my-pi/pi-utils@16.5.2", "", { "dependencies": { "@oh-my-pi/pi-natives": "16.5.2", "handlebars": "^4.7.9", "winston": "^3.19.0", "winston-daily-rotate-file": "^5.0.0" } }, "sha512-Ivwibl2xdec6tQv0Wca+xznf7ZrT5OaqlbW+nZwhPzmO5OTRwz3lceYSqoBdtAjmu3bRqDG1h5vhHr+cSXl4HA=="], + "@oh-my-pi/pi-utils": ["@oh-my-pi/pi-utils@18.0.11", "", { "dependencies": { "@oh-my-pi/pi-natives": "18.0.11" } }, "sha512-1H9GzSnA0X3gIMHiNm5ijxdVRHs7+158ohm8uCUv7GgSgMgcoQkxsHDLSJSCJy3mHqWw8HBbY2oqrtQSMhbiWg=="], - "@oh-my-pi/pi-wire": ["@oh-my-pi/pi-wire@16.5.2", "", {}, "sha512-ELdcx4Wow7zTVuj8YHfUdyhWwdalXsPB2Jtnp/h+x270Mwy4B0wUTeUNhRn9SVjPRtFgmDanAhLEjzOoLYu1uw=="], + "@oh-my-pi/pi-wire": ["@oh-my-pi/pi-wire@18.0.11", "", {}, "sha512-wtp8Eyy5ZcuVxcS2L4bE6ZCYHs+ZlD8tLlp9t2egeMXvxkEEQIE35TkSy7Ez1KwCBikAy8ulY0EVm9xHKQF4jA=="], - "@oh-my-pi/snapcompact": ["@oh-my-pi/snapcompact@16.5.2", "", { "dependencies": { "@oh-my-pi/pi-ai": "16.5.2", "@oh-my-pi/pi-natives": "16.5.2", "@oh-my-pi/pi-utils": "16.5.2", "@oh-my-pi/pi-wire": "16.5.2" } }, "sha512-ev9NHl3+cikPfydI2yMbwEoFdzAQzZ4evMHG0avC9d0NJFNE8ohRadRzceTQBlckBLot1YjM9QUu4QkBJPGrIQ=="], + "@oh-my-pi/snapcompact": ["@oh-my-pi/snapcompact@18.0.11", "", { "dependencies": { "@oh-my-pi/pi-ai": "18.0.11", "@oh-my-pi/pi-catalog": "18.0.11", "@oh-my-pi/pi-natives": "18.0.11", "@oh-my-pi/pi-utils": "18.0.11", "@oh-my-pi/pi-wire": "18.0.11" } }, "sha512-tAZFDZXCfvIPMCUncGs/KTL9uq91nHV7dUsISzEZ3NuGUzMX/y32Nhyuyn4lJaALM9di01lyd1CPECvGOnqx9w=="], "@opentelemetry/api": ["@opentelemetry/api@1.9.1", "", {}, "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q=="], - "@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.221.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-OlanaW1vv7ufTqQ3/fPLI4arGt5ZoM+P8abOMki6uEYnpRazepSWDwDnnw+la7kE26SHVC18//SMccrDvLKOXQ=="], + "@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.220.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-CmVa4ImJ+ynfrPMNaAXHET6Bhb44SwzmfyVJFq9ni2jgXJR/l7C6gfVFddNmHP+ZOkP9cf4f9DBe68qVLTHc9w=="], "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@2.10.0", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-bvyMcgLEkozzSzpEEEo1OMoeQ97bxj6Qs2uN3mPrSdDvObMI1myffD/BPqcLlzZO9//d1SqQA/WPw7Cz2AiqhA=="], "@opentelemetry/core": ["@opentelemetry/core@2.10.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-/wNZ8twnEQQA4HoHu22+vcsdru6pWPWxW+7w+FlxT6Id7PE/WIbZmVKkte+PF72e0F2dnImFeHD2syyE1Mw6MQ=="], + "@opentelemetry/exporter-logs-otlp-proto": ["@opentelemetry/exporter-logs-otlp-proto@0.220.0", "", { "dependencies": { "@opentelemetry/otlp-exporter-base": "0.220.0", "@opentelemetry/otlp-transformer": "0.220.0", "@opentelemetry/sdk-logs": "0.220.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-8LZAxdJ0ENDAFwr4j0oY35mHBltiSzvlhdQAPGiC7p9VnxtuSq4SW1gfBAdW6t6hiQG6OwUl8w7KHaOdJPKHWg=="], + "@opentelemetry/exporter-metrics-otlp-http": ["@opentelemetry/exporter-metrics-otlp-http@0.221.0", "", { "dependencies": { "@opentelemetry/core": "2.10.0", "@opentelemetry/otlp-exporter-base": "0.221.0", "@opentelemetry/otlp-transformer": "0.221.0", "@opentelemetry/resources": "2.10.0", "@opentelemetry/sdk-metrics": "2.10.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-sRfCKbOzgy8xZQV2as0RzIZlnCmCseCKZGLfRcrpo2CBngJDr+rPtX0zkG0+oUCV5kfQPUoW3W3C96Ag3Y/Clg=="], "@opentelemetry/exporter-metrics-otlp-proto": ["@opentelemetry/exporter-metrics-otlp-proto@0.221.0", "", { "dependencies": { "@opentelemetry/exporter-metrics-otlp-http": "0.221.0", "@opentelemetry/otlp-exporter-base": "0.221.0", "@opentelemetry/otlp-transformer": "0.221.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-YMF4LveY2I3yhw61rn6nmC9FE8U24IZHPeKU1Duc5+sbwjMd8FwZAwba318ImdThCg/HuVQvhm2y6bfgNPnfYg=="], @@ -809,7 +797,7 @@ "@opentelemetry/sdk-logs": ["@opentelemetry/sdk-logs@0.221.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.221.0", "@opentelemetry/core": "2.10.0", "@opentelemetry/resources": "2.10.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, "sha512-FaDcazjyMp7TZZZAsqbo4IkovP0UegoCu0EBkiNt+qCqvUf7FPAsfcrZ3+ZEkKgXZ/jHafop+JoGPDk3A0SmLg=="], - "@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.9.0", "", { "dependencies": { "@opentelemetry/core": "2.9.0", "@opentelemetry/resources": "2.9.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-Xx8RGS4H5XEBl01WuCreMIpiah9cCXMbSkeuIePPdD2cUpq/vUzYmj8E/MK1OsbOc93FuAD4jfn2WOacKwLn7Q=="], + "@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.10.0", "", { "dependencies": { "@opentelemetry/core": "2.10.0", "@opentelemetry/resources": "2.10.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-t6r1VSvXNtSDnPXU1FbZeetJb7yyovHmgu0wRSoftxtE0g2rSNhQZQUy69sRUCL+iioJpX8SN/S6wq6ZtvLySQ=="], "@opentelemetry/sdk-trace": ["@opentelemetry/sdk-trace@2.10.0", "", { "dependencies": { "@opentelemetry/core": "2.10.0", "@opentelemetry/resources": "2.10.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-MfQGq3GRmTh5fM/y+OjaO0vj6+luCB1XO2gfXCalKCfgKw0eHL++sm75DNweC6ohlp+aFvACqeE0fYayqdRaoQ=="], @@ -921,12 +909,8 @@ "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], - "@sindresorhus/is": ["@sindresorhus/is@4.6.0", "", {}, "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="], - "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="], - "@so-ric/colorspace": ["@so-ric/colorspace@1.1.6", "", { "dependencies": { "color": "^5.0.2", "text-hex": "1.0.x" } }, "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw=="], - "@solid-primitives/a11y": ["@solid-primitives/a11y@1.0.0-next.3", "", { "dependencies": { "@solid-primitives/utils": "^7.0.0-next.4" }, "peerDependencies": { "@solidjs/web": "^2.0.0-rc.0", "solid-js": "^2.0.0-rc.0" } }, "sha512-ohvuHYkxTNJtOPlhSHHCiLILE7KOQ3K6hcDrq4Fr69euk1Fnpct3d9VxFbgMPxBG31RJtJoD6Yh5BJNwFz84kw=="], "@solid-primitives/controlled-signal": ["@solid-primitives/controlled-signal@1.0.0-next.3", "", { "dependencies": { "@solid-primitives/utils": "^7.0.0-next.4" }, "peerDependencies": { "solid-js": "^2.0.0-rc.0" } }, "sha512-vcc3sI+0TFeqD6OWHr65LuH0x6OuRhmWQ9DxqGY53VIfvV5PFfIlBlxPidOyGbiN6VoHHMagZaXUq4ZnuH/KPg=="], @@ -1037,12 +1021,8 @@ "@types/sax": ["@types/sax@1.2.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A=="], - "@types/triple-beam": ["@types/triple-beam@1.3.5", "", {}, "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw=="], - "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], - "@types/turndown": ["@types/turndown@5.0.6", "", {}, "sha512-ru00MoyeeouE5BX4gRL+6m/BsDfbRayOskWqUvh7CLGW+UXxHQItqALa38kKnOiZPqJrtzJUgAC2+F0rL1S4Pg=="], - "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], "@types/whatwg-mimetype": ["@types/whatwg-mimetype@3.0.2", "", {}, "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA=="], @@ -1069,10 +1049,6 @@ "@wailsio/runtime": ["@wailsio/runtime@3.0.0-beta.13", "", {}, "sha512-59nmw/qiRN8LukEmIDDmyTZBZJ/pCoxpLowAtnS6VVJvoQhiTryB28menjgNhkbZg36g8nd4GifBlKzjmtycyA=="], - "@xmldom/xmldom": ["@xmldom/xmldom@0.8.13", "", {}, "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw=="], - - "@xterm/headless": ["@xterm/headless@6.0.0", "", {}, "sha512-5Yj1QINYCyzrZtf8OFIHi47iQtI+0qYFPHmouEfG8dHNxbZ9Tb9YGSuLcsEwj9Z+OL75GJqPyJbyoFer80a2Hw=="], - "acorn": ["acorn@8.18.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ=="], "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], @@ -1093,18 +1069,12 @@ "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], - "anynum": ["anynum@1.0.1", "", {}, "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A=="], - "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], - "argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], - "arkregex": ["arkregex@0.0.8", "", { "dependencies": { "@ark/util": "0.56.2" } }, "sha512-PJcx6G1kQTgLKPUbeYlYecDRaKq15AMSGVajlKFYWlPeJRQL+j3dKE6tyMs40HZ99djS1l9Vhl3ezAHy9JBIqQ=="], - - "arktype": ["arktype@2.2.3", "", { "dependencies": { "@ark/schema": "0.56.2", "@ark/util": "0.56.2", "arkregex": "0.0.8" } }, "sha512-7W+0RLTUNJiBFIIZXwOQxSR8Z273IAd6IvqBeG9+gHnQKFsIx2C0iOtGTmMrPnlX4qLXyc5+ll7A0BIj9WrbTg=="], - "array-iterate": ["array-iterate@2.0.1", "", {}, "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg=="], "astral-regex": ["astral-regex@2.0.0", "", {}, "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="], @@ -1115,25 +1085,19 @@ "astro-expressive-code": ["astro-expressive-code@0.44.1", "", { "dependencies": { "rehype-expressive-code": "^0.44.1", "url-extras": "^0.1.0" }, "peerDependencies": { "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta || ^7.0.0" } }, "sha512-DT1LnCqbHasBKlvzJ3m6LR4VI94wwx3W9EV/YbP1te4rqjOHsvsezHYuqb5MeLWLftXms/1FA9QBbwCo43DnJQ=="], - "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], - "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], "babel-preset-solid": ["babel-preset-solid@2.0.0-rc.1", "", { "dependencies": { "@dom-expressions/babel-plugin-jsx": "0.50.0-next.43" }, "peerDependencies": { "@babel/core": "^7.0.0", "solid-js": "^2.0.0-rc.1" }, "optionalPeers": ["solid-js"] }, "sha512-HMefWI9rhIGYmefNCmcX21p7di4UUeuayQceUG1Xi6l0/AEhqi6iqPKMr+vvqP31EkoJU9/EcjIBnqS5vSEEhw=="], "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], - "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.11.1", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-HYXq73DDpCtNzOmrFsm9eSwCvWCql0RzqjpDzXN9EadiLJ4DNat0nsZ/Bzmy+Ud12mb4/zKDY0cQ805ZzN+i0A=="], "bcp-47": ["bcp-47@2.1.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-KLw+H/gd2p4zly1X7Yh/qziuyae5/w/QFnvTng9eZL5fvszL7Whl3MBoWF8yxL7ksUjBfOD+OxkytiqbBpG+Fw=="], "bcp-47-match": ["bcp-47-match@2.0.3", "", {}, "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ=="], - "bluebird": ["bluebird@3.4.7", "", {}, "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA=="], - - "boolbase": ["boolbase@2.0.0", "", {}, "sha512-DkVaaQHymRhpYEYo9x1oo7Q7B0Y6KJUsjm3c9eTyFDby4MHLBTwZ6ZDWBel5zrYxj1WsZgC5oLpiz+93MluXeA=="], + "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], "boolean": ["boolean@3.2.0", "", {}, "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw=="], @@ -1153,7 +1117,7 @@ "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], - "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], @@ -1177,14 +1141,10 @@ "collapse-white-space": ["collapse-white-space@2.1.0", "", {}, "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw=="], - "color": ["color@5.0.3", "", { "dependencies": { "color-convert": "^3.1.3", "color-string": "^2.1.3" } }, "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA=="], - "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], - "color-string": ["color-string@2.1.4", "", { "dependencies": { "color-name": "^2.0.0" } }, "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg=="], - "colord": ["colord@2.9.3", "", {}, "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw=="], "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], @@ -1201,15 +1161,13 @@ "core-js": ["core-js@3.50.0", "", {}, "sha512-BRWgOLKkFeCgRudR6zrs8p9XJZcE14grzKMMssoYrk6krtuEZ7MTKPIY5RzOnqsEKIR9kst7wNzphttraT+Yqw=="], - "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], - "cosmiconfig": ["cosmiconfig@9.0.2", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg=="], "crossws": ["crossws@0.3.5", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="], "css-functions-list": ["css-functions-list@3.3.3", "", {}, "sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg=="], - "css-select": ["css-select@7.0.0", "", { "dependencies": { "boolbase": "^2.0.0", "css-what": "^8.0.0", "domhandler": "^6.0.1", "domutils": "^4.0.2", "nth-check": "^3.0.1" } }, "sha512-snmjEVXy+1LnwXdxhYvTMj1d9tOh4HxkA1YmoayVBeeyR2C14Pum7fcxJIm4SswYspVy866eYNwlH6xC3/VH5g=="], + "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], "css-selector-parser": ["css-selector-parser@3.3.0", "", {}, "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g=="], @@ -1223,12 +1181,8 @@ "csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="], - "cssom": ["cssom@0.5.0", "", {}, "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw=="], - "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], - "date-fns": ["date-fns@4.4.0", "", {}, "sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w=="], - "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="], @@ -1255,28 +1209,22 @@ "diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], - "dingbat-to-unicode": ["dingbat-to-unicode@1.0.1", "", {}, "sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w=="], - "direction": ["direction@2.0.1", "", { "bin": { "direction": "cli.js" } }, "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA=="], "dom-accessibility-api": ["dom-accessibility-api@0.6.3", "", {}, "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w=="], - "dom-serializer": ["dom-serializer@3.1.1", "", { "dependencies": { "domelementtype": "^3.0.0", "domhandler": "^6.0.0", "entities": "^8.0.0" } }, "sha512-4MEa38/QexBob6gFNwu+EGdWvhJ1OKuNwdYY3Y3NyeWDQfnGeDYQUDfIRzWu5B5gsv03so2Uxd28YC6zrsx3Lw=="], + "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], - "domhandler": ["domhandler@6.0.1", "", { "dependencies": { "domelementtype": "^3.0.0" } }, "sha512-gYzvtM72ZtxQO0T048kd6HWSbbGCNOUwcnfQ01cqIJ4X2IYKFFHZ5mKvrQETcFXxsRObZulDaKmy//R7TPtsBg=="], + "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], "dompurify": ["dompurify@3.4.14", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-dVoH9z+MY+C9IilgGCk3YfFqjLi3fChm2OiKJMzh6axrJ5qwxqWaZamgmHrpv22CN/KdbZJuGEGgfQoL00LTdg=="], - "domutils": ["domutils@4.0.2", "", { "dependencies": { "dom-serializer": "^3.0.0", "domelementtype": "^3.0.0", "domhandler": "^6.0.0" } }, "sha512-qI4JLRKnSzqFqr7hAlS5xQDusBCjKSEG4t4+7aNrIQMHBcsC2TGEhuyABJdYkgSewL57PNLYEiibY2iPKhKpaA=="], - - "dot-prop": ["dot-prop@6.0.1", "", { "dependencies": { "is-obj": "^2.0.0" } }, "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA=="], + "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], "dset": ["dset@3.1.4", "", {}, "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA=="], - "duck": ["duck@0.1.12", "", { "dependencies": { "underscore": "^1.13.1" } }, "sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg=="], - "effect": ["effect@3.22.1", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-TNoXushmPOBAjJlthF5d2QwnX2xBPEtcNJr5XKNKbRLbDvBcOYkXlYDfvGfSA0zriwLFuCll5MDtNMAdZL17PQ=="], "electron-to-chromium": ["electron-to-chromium@1.5.395", "", {}, "sha512-7zt9Aw+SrmxLWLN0zhaTWZQiCdryLVrYTq5R7iZakLvi2UQPYMMsROYV/2qVCzMeCiSXHwKOU+sZ4zOVVlrtKA=="], @@ -1287,8 +1235,6 @@ "empathic": ["empathic@2.0.1", "", {}, "sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q=="], - "enabled": ["enabled@2.0.0", "", {}, "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ=="], - "enhanced-resolve": ["enhanced-resolve@5.24.3", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ=="], "entities": ["entities@7.0.1", "", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="], @@ -1349,24 +1295,16 @@ "fast-wrap-ansi": ["fast-wrap-ansi@0.2.2", "", { "dependencies": { "fast-string-width": "^3.0.2" } }, "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q=="], - "fast-xml-builder": ["fast-xml-builder@1.3.0", "", { "dependencies": { "path-expression-matcher": "^1.6.2", "xml-naming": "^0.3.0" } }, "sha512-F74cZEdCvuw9P41GAC3rod4X04jjWGM1JPEv/GWSqFTWLsdyMSBMBMlm9Hk3GLBgLBbdBNY8yee0pQh2RBVESQ=="], - - "fast-xml-parser": ["fast-xml-parser@5.10.1", "", { "dependencies": { "@nodable/entities": "^3.0.0", "fast-xml-builder": "^1.2.0", "is-unsafe": "^2.0.0", "path-expression-matcher": "^1.6.2", "strnum": "^2.4.1", "xml-naming": "^0.3.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-IEMIf7298kXuZSRFoGfMYrl7is8LpavODgbNz1cwIudv7KwVFnuU+UsMporfq6PD6aXSlawZlARiA3UywCTfMw=="], - "fastest-levenshtein": ["fastest-levenshtein@1.0.16", "", {}, "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg=="], "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], - "fecha": ["fecha@4.2.3", "", {}, "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw=="], - "fflate": ["fflate@0.4.9", "", {}, "sha512-zdxgIEddhfsyCaWpJ2SdXEP8ZMrKJ6+5jl4OupODcywU0IhRk6gdXuVGcPICyfx2H97hVK7xmJtRLPjkxAX8Vw=="], "file-entry-cache": ["file-entry-cache@11.1.5", "", { "dependencies": { "flat-cache": "^6.1.23" } }, "sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q=="], - "file-stream-rotator": ["file-stream-rotator@0.6.1", "", { "dependencies": { "moment": "^2.29.1" } }, "sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ=="], - "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], "find-my-way-ts": ["find-my-way-ts@0.1.6", "", {}, "sha512-a85L9ZoXtNAey3Y6Z+eBWW658kO/MwR7zIafkIUPUMf3isZG0NCs2pjW2wtjxAKuJPxMAsHUIP4ZPGv0o5gyTA=="], @@ -1381,16 +1319,12 @@ "flattie": ["flattie@1.1.1", "", {}, "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ=="], - "fn.name": ["fn.name@1.1.0", "", {}, "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="], - "fontace": ["fontace@0.4.1", "", { "dependencies": { "fontkitten": "^1.0.2" } }, "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw=="], "fontkitten": ["fontkitten@1.0.3", "", { "dependencies": { "tiny-inflate": "^1.0.3" } }, "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw=="], "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - "generative-bayesian-network": ["generative-bayesian-network@2.1.83", "", { "dependencies": { "adm-zip": "^0.5.9", "tslib": "^2.4.0" } }, "sha512-LssI9es+oUoezoHloFGw0Hts0YEfujjBOE8KNl70oBt4HPjD/4rpUqcgZ/M7RCmgKvkmCyPB2KWowyJHuKyhfw=="], - "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], @@ -1423,8 +1357,6 @@ "h3": ["h3@1.15.11", "", { "dependencies": { "cookie-es": "^1.2.3", "crossws": "^0.3.5", "defu": "^6.1.6", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.4", "radix3": "^1.1.2", "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg=="], - "handlebars": ["handlebars@4.7.9", "", { "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, "optionalDependencies": { "uglify-js": "^3.1.4" }, "bin": { "handlebars": "bin/handlebars" } }, "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ=="], - "happy-dom": ["happy-dom@20.11.6", "", { "dependencies": { "@types/node": ">=20.0.0", "@types/whatwg-mimetype": "^3.0.2", "@types/ws": "^8.18.1", "buffer-image-size": "^0.6.4", "entities": "^7.0.1", "whatwg-mimetype": "^3.0.0", "ws": "^8.21.0" } }, "sha512-Hldbg8AdAa5a5oDcZpjqnGitp7JB0hqWmfv/8qr+kft4vzSD8BHsbdRfzYvL/0QcbKcURC/yyoygbeDQarPvYg=="], "has-flag": ["has-flag@5.0.1", "", {}, "sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA=="], @@ -1473,8 +1405,6 @@ "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], - "header-generator": ["header-generator@2.1.82", "", { "dependencies": { "browserslist": "^4.21.1", "generative-bayesian-network": "^2.1.82", "ow": "^0.28.1", "tslib": "^2.4.0" } }, "sha512-4NjPB0+bAKjPoponSmTOkK58IEF2W22sOJA5O48k/MxbCZgOm+jrU4WVR53Z2I6xFgIPkVrQmKtt1LAbWtfqXw=="], - "hookified": ["hookified@1.15.1", "", {}, "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg=="], "html-entities": ["html-entities@2.3.3", "", {}, "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA=="], @@ -1489,24 +1419,18 @@ "html-whitespace-sensitive-tag-names": ["html-whitespace-sensitive-tag-names@3.0.1", "", {}, "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA=="], - "htmlparser2": ["htmlparser2@10.1.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", "entities": "^7.0.1" } }, "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ=="], - "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="], "i18next": ["i18next@26.3.6", "", { "peerDependencies": { "typescript": "^5 || ^6 || ^7" }, "optionalPeers": ["typescript"] }, "sha512-Bu5Z2nAXgfVyM8xvW3jk9EKRIuX37PudsrBViThNFx7CR7aaYTpP01cxNB/E4c4UUzTDiAZRstEhsRfPOL/8xA=="], "ignore": ["ignore@7.0.6", "", {}, "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw=="], - "immediate": ["immediate@3.0.6", "", {}, "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="], - "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], "import-meta-resolve": ["import-meta-resolve@4.2.0", "", {}, "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg=="], "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], - "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], - "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="], @@ -1533,20 +1457,12 @@ "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], - "is-obj": ["is-obj@2.0.0", "", {}, "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="], - "is-path-inside": ["is-path-inside@4.0.0", "", {}, "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA=="], "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], - "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], - - "is-unsafe": ["is-unsafe@2.0.0", "", {}, "sha512-2LdV822R+wmI86unXA93WCFpL6g+av8ynWk0nrHyJqGop5VoocYsSLFgN8jrfalT6iGeLNM4KXuVSsULP53kEA=="], - "is-what": ["is-what@4.1.16", "", {}, "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="], - "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], - "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], "jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], @@ -1567,8 +1483,6 @@ "jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="], - "jszip": ["jszip@3.10.1", "", { "dependencies": { "lie": "~3.3.0", "pako": "~1.0.2", "readable-stream": "~2.3.6", "setimmediate": "^1.0.5" } }, "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g=="], - "keyv": ["keyv@5.6.0", "", { "dependencies": { "@keyv/serialize": "^1.1.1" } }, "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw=="], "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="], @@ -1577,10 +1491,6 @@ "klona": ["klona@2.0.6", "", {}, "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA=="], - "kuler": ["kuler@2.0.0", "", {}, "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="], - - "lie": ["lie@3.3.0", "", { "dependencies": { "immediate": "~3.0.5" } }, "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ=="], - "lightningcss": ["lightningcss@1.33.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.33.0", "lightningcss-darwin-arm64": "1.33.0", "lightningcss-darwin-x64": "1.33.0", "lightningcss-freebsd-x64": "1.33.0", "lightningcss-linux-arm-gnueabihf": "1.33.0", "lightningcss-linux-arm64-gnu": "1.33.0", "lightningcss-linux-arm64-musl": "1.33.0", "lightningcss-linux-x64-gnu": "1.33.0", "lightningcss-linux-x64-musl": "1.33.0", "lightningcss-win32-arm64-msvc": "1.33.0", "lightningcss-win32-x64-msvc": "1.33.0" } }, "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA=="], "lightningcss-android-arm64": ["lightningcss-android-arm64@1.33.0", "", { "os": "android", "cpu": "arm64" }, "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg=="], @@ -1607,22 +1517,14 @@ "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], - "linkedom": ["linkedom@0.18.13", "", { "dependencies": { "css-select": "^7.0.0", "cssom": "^0.5.0", "html-escaper": "^3.0.3", "htmlparser2": "^10.1.0", "uhyphen": "^0.2.0" }, "peerDependencies": { "canvas": ">= 2" }, "optionalPeers": ["canvas"] }, "sha512-ES/o9qotMpzpN2MHs+Iq/JcVoOj8Fa5wiQYrTdFpvAnwXL0g66XHHUc9WUMk6nAlBtGsFQ24ne+SYnvnaQ2FSw=="], - - "lodash.isequal": ["lodash.isequal@4.5.0", "", {}, "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="], - "lodash.truncate": ["lodash.truncate@4.4.2", "", {}, "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw=="], - "logform": ["logform@2.7.0", "", { "dependencies": { "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", "fecha": "^4.2.0", "ms": "^2.1.1", "safe-stable-stringify": "^2.3.1", "triple-beam": "^1.3.0" } }, "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ=="], - "loglevel": ["loglevel@1.9.2", "", {}, "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg=="], "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], - "lop": ["lop@0.4.2", "", { "dependencies": { "duck": "^0.1.12", "option": "~0.2.1", "underscore": "^1.13.1" } }, "sha512-RefILVDQ4DKoRZsJ4Pj22TxE3omDO47yFpkIBoDKzkqPRISs5U1cnAdg/5583YPkWPaLIYHOKRMQSvjFsO26cw=="], - "lru-cache": ["lru-cache@11.5.2", "", {}, "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="], "lucide-react": ["lucide-react@1.25.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-/mdJTRbiwcLOQ1NZZK1amZF9rIZyvO18D6r9TngE6TG1NmqHgFuT4eE7Xrkm9UsXMbBJD1NlfwHVltCDWHrOTw=="], @@ -1633,14 +1535,10 @@ "magicast": ["magicast@0.5.4", "", { "dependencies": { "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7", "source-map-js": "^1.2.1" } }, "sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w=="], - "mammoth": ["mammoth@1.12.0", "", { "dependencies": { "@xmldom/xmldom": "^0.8.6", "argparse": "~1.0.3", "base64-js": "^1.5.1", "bluebird": "~3.4.0", "dingbat-to-unicode": "^1.0.1", "jszip": "^3.7.1", "lop": "^0.4.2", "path-is-absolute": "^1.0.0", "underscore": "^1.13.1", "xmlbuilder": "^10.0.0" }, "bin": { "mammoth": "bin/mammoth" } }, "sha512-cwnK1RIcRdDMi2HRx2EXGYlxqIEh0Oo3bLhorgnsVJi2UkbX1+jKxuBNR9PC5+JaX7EkmJxFPmo6mjLpqShI2w=="], - "markdown-extensions": ["markdown-extensions@2.0.0", "", {}, "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q=="], "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], - "marked": ["marked@18.0.7", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-iDVQ5ldaiKXn6b2JroX5kgRfmwgqolW7NpaEzTl1k/2Zh1njIEN9yniyLV/mOvWwtsE8OGgkjsCYvijuPk1dtA=="], - "matcher": ["matcher@3.0.0", "", { "dependencies": { "escape-string-regexp": "^4.0.0" } }, "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng=="], "mathml-tag-names": ["mathml-tag-names@4.0.0", "", {}, "sha512-aa6AU2Pcx0VP/XWnh8IGL0SYSgQHDT6Ucror2j2mXeFAlN3ahaNs8EZtG1YiticMkSLj3Gt6VPFfZogt7G5iFQ=="], @@ -1765,14 +1663,10 @@ "min-indent": ["min-indent@1.0.1", "", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="], - "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], - "mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="], "modern-tar": ["modern-tar@0.7.7", "", {}, "sha512-t9VmxaqrmANnEOBhpSDI6HD192Ge48k8vmWqQQL7hSFEqHEYwZbbsu49+aKLWZeRvFs3j1pMhXOqqF4kPlvjkQ=="], - "moment": ["moment@2.30.1", "", {}, "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how=="], - "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], @@ -1785,12 +1679,8 @@ "multipasta": ["multipasta@0.2.8", "", {}, "sha512-ZPWuMKyv0cSO29f7hozp+k6+crZbQijV8ipMvxNxRf2SwtYGTX1ZX89Kd20VV4H9Znonx+EQn+iy1wGQsJ+b+Q=="], - "mupdf": ["mupdf@1.28.0", "", {}, "sha512-ACUnbpECaQ5JLq04pwd89lS+0IGMest5qL5tb08g9TAR7bDtfqflHEkb2Xm3o4rvC/szguLiV+WEbW9kstj8Sg=="], - "nanoid": ["nanoid@3.3.16", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q=="], - "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], - "neotraverse": ["neotraverse@1.0.1", "", {}, "sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w=="], "nlcst-to-string": ["nlcst-to-string@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0" } }, "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA=="], @@ -1807,8 +1697,6 @@ "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], - "object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="], - "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], "obug": ["obug@2.1.4", "", {}, "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA=="], @@ -1817,8 +1705,6 @@ "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], - "one-time": ["one-time@1.0.0", "", { "dependencies": { "fn.name": "1.x.x" } }, "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g=="], - "oniguruma-parser": ["oniguruma-parser@0.12.2", "", {}, "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw=="], "oniguruma-to-es": ["oniguruma-to-es@4.3.6", "", { "dependencies": { "oniguruma-parser": "^0.12.2", "regex": "^6.1.0", "regex-recursion": "^6.0.2" } }, "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA=="], @@ -1829,10 +1715,6 @@ "onnxruntime-web": ["onnxruntime-web@1.26.0-dev.20260416-b7804b056c", "", { "dependencies": { "flatbuffers": "^25.1.24", "guid-typescript": "^1.0.9", "long": "^5.2.3", "onnxruntime-common": "1.24.0-dev.20251116-b39e144322", "platform": "^1.3.6", "protobufjs": "^7.2.4" } }, "sha512-MD6Ss4GSpQBo6zqoJzyT9LRbKYs7x/JVN23FT24EcEvlqF4VuzPOeH6X38orZPKHQDbprn7K+SBpu0/mj2CQiw=="], - "option": ["option@0.2.4", "", {}, "sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A=="], - - "ow": ["ow@0.28.2", "", { "dependencies": { "@sindresorhus/is": "^4.2.0", "callsites": "^3.1.0", "dot-prop": "^6.0.1", "lodash.isequal": "^4.5.0", "vali-date": "^1.0.0" } }, "sha512-dD4UpyBh/9m4X2NVjA+73/ZPBRF+uF4zIMFvvQsabMiEK8x41L3rQ8EENOi35kyyoaJwNxEeJcP6Fj1H4U409Q=="], - "p-limit": ["p-limit@7.3.1", "", { "dependencies": { "yocto-queue": "^1.2.1" } }, "sha512-0trZaiG7Y7kN/Egy9a8j47t9osC0Tch4PaIWd9yGF6bvmlk7muExRvGNYb8sXBwEKMoNKsbNN9P8EefuQekE4Q=="], "p-queue": ["p-queue@9.3.3", "", { "dependencies": { "eventemitter3": "^5.0.4", "p-timeout": "^7.0.0" } }, "sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA=="], @@ -1843,8 +1725,6 @@ "pagefind": ["pagefind@1.5.2", "", { "optionalDependencies": { "@pagefind/darwin-arm64": "1.5.2", "@pagefind/darwin-x64": "1.5.2", "@pagefind/freebsd-x64": "1.5.2", "@pagefind/linux-arm64": "1.5.2", "@pagefind/linux-x64": "1.5.2", "@pagefind/windows-arm64": "1.5.2", "@pagefind/windows-x64": "1.5.2" }, "bin": { "pagefind": "lib/runner/bin.cjs" } }, "sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q=="], - "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], @@ -1857,10 +1737,6 @@ "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="], - "path-expression-matcher": ["path-expression-matcher@1.6.2", "", {}, "sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ=="], - - "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], - "piccolore": ["piccolore@0.1.3", "", {}, "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw=="], "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], @@ -1895,8 +1771,6 @@ "process-ancestry": ["process-ancestry@0.1.0", "", {}, "sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg=="], - "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], - "property-information": ["property-information@7.2.0", "", {}, "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg=="], "protobufjs": ["protobufjs@7.6.5", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.5", "@protobufjs/eventemitter": "^1.1.1", "@protobufjs/fetch": "^1.1.1", "@protobufjs/float": "^1.0.2", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.1", "@types/node": ">=13.7.0", "long": "^5.3.2" } }, "sha512-/FPD0nUc9jH6rfFjji9IBqOz4pcSE3CsT1m7Ep6Mdb0LxSUMj8hgl6GomOvZzpNpAqqGaXA0P3VSrZLFzIhQrw=="], @@ -1921,8 +1795,6 @@ "react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], - "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], "recma-build-jsx": ["recma-build-jsx@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-build-jsx": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew=="], @@ -1993,10 +1865,6 @@ "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], - "safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], - - "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="], - "satteri": ["satteri@0.9.5", "", { "dependencies": { "@types/estree-jsx": "^1.0.5", "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "@types/unist": "^3.0.3" }, "optionalDependencies": { "@bruits/satteri-darwin-arm64": "0.9.5", "@bruits/satteri-darwin-x64": "0.9.5", "@bruits/satteri-linux-arm64-gnu": "0.9.5", "@bruits/satteri-linux-arm64-musl": "0.9.5", "@bruits/satteri-linux-x64-gnu": "0.9.5", "@bruits/satteri-linux-x64-musl": "0.9.5", "@bruits/satteri-wasm32-wasi": "0.9.5", "@bruits/satteri-win32-arm64-msvc": "0.9.5", "@bruits/satteri-win32-x64-msvc": "0.9.5" } }, "sha512-ZuWVl+vnM64y+/TtX8Kosv2c00W+hLQiiwnEL6H0UKVVrxFqMw4D2CJHHQaouVd89OAhtBBfjWLqhKi3TVUV4w=="], "sax": ["sax@1.6.1", "", {}, "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q=="], @@ -2013,8 +1881,6 @@ "seroval-plugins": ["seroval-plugins@1.5.6", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-HXuLAX2pu/UByPpaeo/TaMfvMIi+1QqIoPJYCcAtU8QkVNwgR6MPlGuCQTErV1JwraaMbYaWVIBX7mppzGLATQ=="], - "setimmediate": ["setimmediate@1.0.5", "", {}, "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="], - "sharp": ["sharp@0.35.3", "", { "dependencies": { "@img/colour": "^1.1.0", "detect-libc": "^2.1.2", "semver": "^7.8.5" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.35.3", "@img/sharp-darwin-x64": "0.35.3", "@img/sharp-freebsd-wasm32": "0.35.3", "@img/sharp-libvips-darwin-arm64": "1.3.2", "@img/sharp-libvips-darwin-x64": "1.3.2", "@img/sharp-libvips-linux-arm": "1.3.2", "@img/sharp-libvips-linux-arm64": "1.3.2", "@img/sharp-libvips-linux-ppc64": "1.3.2", "@img/sharp-libvips-linux-riscv64": "1.3.2", "@img/sharp-libvips-linux-s390x": "1.3.2", "@img/sharp-libvips-linux-x64": "1.3.2", "@img/sharp-libvips-linuxmusl-arm64": "1.3.2", "@img/sharp-libvips-linuxmusl-x64": "1.3.2", "@img/sharp-linux-arm": "0.35.3", "@img/sharp-linux-arm64": "0.35.3", "@img/sharp-linux-ppc64": "0.35.3", "@img/sharp-linux-riscv64": "0.35.3", "@img/sharp-linux-s390x": "0.35.3", "@img/sharp-linux-x64": "0.35.3", "@img/sharp-linuxmusl-arm64": "0.35.3", "@img/sharp-linuxmusl-x64": "0.35.3", "@img/sharp-webcontainers-wasm32": "0.35.3", "@img/sharp-win32-arm64": "0.35.3", "@img/sharp-win32-ia32": "0.35.3", "@img/sharp-win32-x64": "0.35.3" }, "peerDependencies": { "@types/node": "*" }, "optionalPeers": ["@types/node"] }, "sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q=="], "sherpa-onnx-darwin-arm64": ["sherpa-onnx-darwin-arm64@1.13.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-QcYKzyrTzGSx6aKCD6hUODgRS1LetqfG57Z/+i5LCyfMlrgCvDc1lRcl9cdB+TozBsLha9QwLTlI0vmDcf5JKg=="], @@ -2047,30 +1913,24 @@ "solid-js": ["solid-js@2.0.0-rc.1", "", { "dependencies": { "@solidjs/signals": "^2.0.0-rc.1", "csstype": "^3.1.0", "seroval": "~1.5.4", "seroval-plugins": "~1.5.4" } }, "sha512-UD+UfqfiuuOTaDw01YeT+LwsYJC2ilTlMfs6h8EC8FFLmZD0ZjeZIoJXdZEo9uMzIof2tu0Rfh3dnzI7FAmuJQ=="], - "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], - "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], - - "stack-trace": ["stack-trace@0.0.10", "", {}, "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg=="], + "sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="], "stream-replace-string": ["stream-replace-string@2.0.0", "", {}, "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w=="], "string-width": ["string-width@8.2.2", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg=="], - "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], - "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], "strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], "strip-indent": ["strip-indent@3.0.0", "", { "dependencies": { "min-indent": "^1.0.0" } }, "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ=="], - "strnum": ["strnum@2.4.1", "", { "dependencies": { "anynum": "^1.0.1" } }, "sha512-M9eUSMT2dCB2cTNPG7UYj6KuK7RJR2SN2+yCV/fTW3xzTCS6EaGZ5pSMgDIjB7r8zSfTGk+dvvn9rTjpVS9Mwg=="], - "style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="], "style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="], @@ -2091,8 +1951,6 @@ "tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="], - "text-hex": ["text-hex@1.0.0", "", {}, "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="], - "tiny-inflate": ["tiny-inflate@1.0.3", "", {}, "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="], "tinyclip": ["tinyclip@0.1.15", "", {}, "sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A=="], @@ -2105,16 +1963,10 @@ "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], - "triple-beam": ["triple-beam@1.4.1", "", {}, "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg=="], - "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "turndown": ["turndown@7.2.4", "", { "dependencies": { "@mixmark-io/domino": "^2.2.0" } }, "sha512-I8yFsfRzmzK0WV1pNNOA4A7y4RDfFxPRxb3t+e3ui14qSGOxGtiSP6GjeX+Y6CHb7HYaFj7ECUD7VE5kQMZWGQ=="], - - "turndown-plugin-gfm": ["turndown-plugin-gfm@1.0.2", "", {}, "sha512-vwz9tfvF7XN/jE0dGoBei3FXWuvll78ohzCZQuOb+ZjWrs3a0XhQVomJEb2Qh4VHTPNRO4GPZh0V7VRbiWwkRg=="], - "type-fest": ["type-fest@0.13.1", "", {}, "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="], "typed-query-selector": ["typed-query-selector@2.12.2", "", {}, "sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ=="], @@ -2127,16 +1979,10 @@ "ufo": ["ufo@1.6.4", "", {}, "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA=="], - "uglify-js": ["uglify-js@3.19.3", "", { "bin": { "uglifyjs": "bin/uglifyjs" } }, "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ=="], - - "uhyphen": ["uhyphen@0.2.0", "", {}, "sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA=="], - "ultrahtml": ["ultrahtml@1.7.0", "", {}, "sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g=="], "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="], - "underscore": ["underscore@1.13.8", "", {}, "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ=="], - "undici": ["undici@8.10.0", "", {}, "sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ=="], "undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], @@ -2175,8 +2021,6 @@ "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], - "vali-date": ["vali-date@1.0.0", "", {}, "sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg=="], - "validate-html-nesting": ["validate-html-nesting@1.2.4", "", {}, "sha512-doQi7e8EJ2OWneSG1aZpJluS6A49aZM0+EICXWKm1i6WvqTLmq0tpUcImc4KTWG50mORO0C4YDBtOCSYvElftw=="], "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], @@ -2237,24 +2081,12 @@ "which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="], - "winston": ["winston@3.19.0", "", { "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.8", "async": "^3.2.3", "is-stream": "^2.0.0", "logform": "^2.7.0", "one-time": "^1.0.0", "readable-stream": "^3.4.0", "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", "winston-transport": "^4.9.0" } }, "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA=="], - - "winston-daily-rotate-file": ["winston-daily-rotate-file@5.0.0", "", { "dependencies": { "file-stream-rotator": "^0.6.1", "object-hash": "^3.0.0", "triple-beam": "^1.4.1", "winston-transport": "^4.7.0" }, "peerDependencies": { "winston": "^3" } }, "sha512-JDjiXXkM5qvwY06733vf09I2wnMXpZEhxEVOSPenZMii+g7pcDcTBt2MRugnoi8BwVSuCT2jfRXBUy+n1Zz/Yw=="], - - "winston-transport": ["winston-transport@4.9.0", "", { "dependencies": { "logform": "^2.7.0", "readable-stream": "^3.6.2", "triple-beam": "^1.3.0" } }, "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A=="], - - "wordwrap": ["wordwrap@1.0.0", "", {}, "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="], - "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], "write-file-atomic": ["write-file-atomic@7.0.1", "", { "dependencies": { "signal-exit": "^4.0.1" } }, "sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg=="], "ws": ["ws@8.21.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw=="], - "xml-naming": ["xml-naming@0.3.0", "", {}, "sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ=="], - - "xmlbuilder": ["xmlbuilder@10.1.1", "", {}, "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg=="], - "xxhash-wasm": ["xxhash-wasm@1.1.0", "", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="], "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], @@ -2275,8 +2107,6 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], - "@astrojs/mdx/source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], - "@babel/core/@babel/parser": ["@babel/parser@8.0.4", "", { "dependencies": { "@babel/types": "^8.0.4" }, "bin": "./bin/babel-parser.js" }, "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g=="], "@babel/generator/@babel/parser": ["@babel/parser@8.0.4", "", { "dependencies": { "@babel/types": "^8.0.4" }, "bin": "./bin/babel-parser.js" }, "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g=="], @@ -2305,17 +2135,21 @@ "@img/sharp-wasm32/@emnapi/runtime": ["@emnapi/runtime@1.11.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA=="], - "@mdx-js/mdx/source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], + "@oh-my-pi/pi-coding-agent/@opentelemetry/exporter-metrics-otlp-proto": ["@opentelemetry/exporter-metrics-otlp-proto@0.220.0", "", { "dependencies": { "@opentelemetry/core": "2.9.0", "@opentelemetry/exporter-metrics-otlp-http": "0.220.0", "@opentelemetry/otlp-exporter-base": "0.220.0", "@opentelemetry/otlp-transformer": "0.220.0", "@opentelemetry/resources": "2.9.0", "@opentelemetry/sdk-metrics": "2.9.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-lyO+IQBdSvqHN/ZOW/OzrSWemtfD+HgWngn+HBNLhjy0YrCQQTz0OE/kSekH2Pl340dn9DWzhqHdz5Eftr+HLA=="], "@oh-my-pi/pi-coding-agent/@opentelemetry/exporter-trace-otlp-proto": ["@opentelemetry/exporter-trace-otlp-proto@0.220.0", "", { "dependencies": { "@opentelemetry/core": "2.9.0", "@opentelemetry/otlp-exporter-base": "0.220.0", "@opentelemetry/otlp-transformer": "0.220.0", "@opentelemetry/resources": "2.9.0", "@opentelemetry/sdk-trace": "2.9.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-voTAD8XgJxlK7zLkXh8EzMB09zrQr3tyY/BsnDTlDiQU/UdK58MZ63A3mUjdEDrxMjCVmBHU3WQJhRmQe+Dvzg=="], - "@opentelemetry/exporter-metrics-otlp-http/@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.10.0", "", { "dependencies": { "@opentelemetry/core": "2.10.0", "@opentelemetry/resources": "2.10.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-t6r1VSvXNtSDnPXU1FbZeetJb7yyovHmgu0wRSoftxtE0g2rSNhQZQUy69sRUCL+iioJpX8SN/S6wq6ZtvLySQ=="], + "@oh-my-pi/pi-coding-agent/@opentelemetry/sdk-logs": ["@opentelemetry/sdk-logs@0.220.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.220.0", "@opentelemetry/core": "2.9.0", "@opentelemetry/resources": "2.9.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, "sha512-WywcTkQtv2iNmt+6y5Kcd4rzvx9bLVsBa2Nwcmg01IUaBTkTow3W4d9KE5vNBpEDtb9tp21WcRBY/lANRrApYA=="], - "@opentelemetry/otlp-transformer/@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.10.0", "", { "dependencies": { "@opentelemetry/core": "2.10.0", "@opentelemetry/resources": "2.10.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-t6r1VSvXNtSDnPXU1FbZeetJb7yyovHmgu0wRSoftxtE0g2rSNhQZQUy69sRUCL+iioJpX8SN/S6wq6ZtvLySQ=="], + "@opentelemetry/exporter-logs-otlp-proto/@opentelemetry/otlp-exporter-base": ["@opentelemetry/otlp-exporter-base@0.220.0", "", { "dependencies": { "@opentelemetry/core": "2.9.0", "@opentelemetry/otlp-transformer": "0.220.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-CXYo8UD5Mn9YbgebO2EL4wejtA+gxLmLiu6HCk2KH2BR7XhFN6/6p1UlCb23DYCjeYkndevLHuejCCN1yx4+OQ=="], - "@opentelemetry/sdk-metrics/@opentelemetry/core": ["@opentelemetry/core@2.9.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw=="], + "@opentelemetry/exporter-logs-otlp-proto/@opentelemetry/otlp-transformer": ["@opentelemetry/otlp-transformer@0.220.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.220.0", "@opentelemetry/core": "2.9.0", "@opentelemetry/resources": "2.9.0", "@opentelemetry/sdk-logs": "0.220.0", "@opentelemetry/sdk-metrics": "2.9.0", "@opentelemetry/sdk-trace": "2.9.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-lXGrv7KXZ0gNH9SVNUaa6vv6phVYGvJxfXAlMbzbakiXru75f5MZl8Z7oqiMMQD77riVHJCFlQvbZs/VVN2/4A=="], - "@opentelemetry/sdk-metrics/@opentelemetry/resources": ["@opentelemetry/resources@2.9.0", "", { "dependencies": { "@opentelemetry/core": "2.9.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-jyA5MBLQ+Dkl3+JsZkUoUvL7yHvU64kLsvpXKarWm6347Sl1t1bXFTFykUePNpT5WH5pm9a2Qtt03iIYQhZ1Fg=="], + "@opentelemetry/exporter-logs-otlp-proto/@opentelemetry/sdk-logs": ["@opentelemetry/sdk-logs@0.220.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.220.0", "@opentelemetry/core": "2.9.0", "@opentelemetry/resources": "2.9.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, "sha512-WywcTkQtv2iNmt+6y5Kcd4rzvx9bLVsBa2Nwcmg01IUaBTkTow3W4d9KE5vNBpEDtb9tp21WcRBY/lANRrApYA=="], + + "@opentelemetry/otlp-transformer/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.221.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-OlanaW1vv7ufTqQ3/fPLI4arGt5ZoM+P8abOMki6uEYnpRazepSWDwDnnw+la7kE26SHVC18//SMccrDvLKOXQ=="], + + "@opentelemetry/sdk-logs/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.221.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-OlanaW1vv7ufTqQ3/fPLI4arGt5ZoM+P8abOMki6uEYnpRazepSWDwDnnw+la7kE26SHVC18//SMccrDvLKOXQ=="], "@rolldown/binding-wasm32-wasi/@emnapi/core": ["@emnapi/core@2.0.0-alpha.3", "", { "dependencies": { "@emnapi/wasi-threads": "2.0.1", "tslib": "^2.4.0" } }, "sha512-AZypUeJ/yByuxyS7BlSNRDOMLMlROYtjYdIAuBmJssVz1UJDSeYxLrdizhXCFYhedC5bqd/ASy8EuNXbVVXp9g=="], @@ -2349,39 +2183,15 @@ "babel-preset-solid/@babel/core": ["@babel/core@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", "@babel/helper-compilation-targets": "^7.29.7", "@babel/helper-module-transforms": "^7.29.7", "@babel/helpers": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA=="], + "chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "chromium-bidi/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "cliui/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], - "color/color-convert": ["color-convert@3.1.3", "", { "dependencies": { "color-name": "^2.0.0" } }, "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg=="], - - "color-string/color-name": ["color-name@2.1.1", "", {}, "sha512-p2FdgwVx1a9yWBHP2wI0VgShkDpgN4kZISkxdNipGBJWpa5G6b04OINlVWCyJj0JmfvcPrgqt95E9k8yvaOJFg=="], - - "css-select/css-what": ["css-what@8.0.0", "", {}, "sha512-DH0Bqq3DNp5tdOReuNyAA+Ev4Y2GS5FMbZpeTLP6C4CDi0h5nL0BmUPChXw3o/qbHLDWHl49sbNqQVY7bMSDdw=="], - - "css-select/nth-check": ["nth-check@3.0.1", "", { "dependencies": { "boolbase": "^2.0.0" } }, "sha512-GX0gsdbGVCgnRgbeGaubfjpBXyYRWOOCVeYh08bSQvDZqxz5ndXs1OTfAt/h36G1xvI94YIspsI0sVFqAV9+RQ=="], - "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="], - "dom-serializer/domelementtype": ["domelementtype@3.0.0", "", {}, "sha512-umCQid3jKbDmVjx8jGaW7uUykm4DEUeyV21hPxNMo2nV955DhUThwqyOIDtreepP31hl84X7G5U9ZfsWvIB3Pg=="], - - "dom-serializer/entities": ["entities@8.0.0", "", {}, "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA=="], - - "domhandler/domelementtype": ["domelementtype@3.0.0", "", {}, "sha512-umCQid3jKbDmVjx8jGaW7uUykm4DEUeyV21hPxNMo2nV955DhUThwqyOIDtreepP31hl84X7G5U9ZfsWvIB3Pg=="], - - "domutils/domelementtype": ["domelementtype@3.0.0", "", {}, "sha512-umCQid3jKbDmVjx8jGaW7uUykm4DEUeyV21hPxNMo2nV955DhUThwqyOIDtreepP31hl84X7G5U9ZfsWvIB3Pg=="], - - "estree-util-to-js/source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], - - "find-process/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "htmlparser2/domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], - - "htmlparser2/domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], - - "js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], - - "jszip/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + "dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], "magicast/@babel/types": ["@babel/types@7.29.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA=="], @@ -2389,8 +2199,6 @@ "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], - "nth-check/boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], - "onnxruntime-web/onnxruntime-common": ["onnxruntime-common@1.24.0-dev.20251116-b39e144322", "", {}, "sha512-BOoomdHYmNRL5r4iQ4bMvsl2t0/hzVQ3OM3PHD0gxeXu1PmggqBv3puZicEUVOA3AtHHYmqZtjMj9FOfGrATTw=="], "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], @@ -2407,18 +2215,12 @@ "qified/hookified": ["hookified@2.2.0", "", {}, "sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA=="], - "roarr/sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="], - "sitemap/@types/node": ["@types/node@24.13.3", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q=="], - "string_decoder/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - "strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], "svgo/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], - "svgo/css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], - "table/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], "table/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -2517,6 +2319,18 @@ "@huggingface/transformers/sharp/@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], + "@oh-my-pi/pi-coding-agent/@opentelemetry/exporter-metrics-otlp-proto/@opentelemetry/core": ["@opentelemetry/core@2.9.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw=="], + + "@oh-my-pi/pi-coding-agent/@opentelemetry/exporter-metrics-otlp-proto/@opentelemetry/exporter-metrics-otlp-http": ["@opentelemetry/exporter-metrics-otlp-http@0.220.0", "", { "dependencies": { "@opentelemetry/core": "2.9.0", "@opentelemetry/otlp-exporter-base": "0.220.0", "@opentelemetry/otlp-transformer": "0.220.0", "@opentelemetry/resources": "2.9.0", "@opentelemetry/sdk-metrics": "2.9.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-Yqt3RBw/bRVncaE9qIIhk4WfjbAQqXuP9FgAaU+IKPndnLEp/cUqZlSC324+bpmduRz7DoTjig8Ub0PeILWXUA=="], + + "@oh-my-pi/pi-coding-agent/@opentelemetry/exporter-metrics-otlp-proto/@opentelemetry/otlp-exporter-base": ["@opentelemetry/otlp-exporter-base@0.220.0", "", { "dependencies": { "@opentelemetry/core": "2.9.0", "@opentelemetry/otlp-transformer": "0.220.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-CXYo8UD5Mn9YbgebO2EL4wejtA+gxLmLiu6HCk2KH2BR7XhFN6/6p1UlCb23DYCjeYkndevLHuejCCN1yx4+OQ=="], + + "@oh-my-pi/pi-coding-agent/@opentelemetry/exporter-metrics-otlp-proto/@opentelemetry/otlp-transformer": ["@opentelemetry/otlp-transformer@0.220.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.220.0", "@opentelemetry/core": "2.9.0", "@opentelemetry/resources": "2.9.0", "@opentelemetry/sdk-logs": "0.220.0", "@opentelemetry/sdk-metrics": "2.9.0", "@opentelemetry/sdk-trace": "2.9.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-lXGrv7KXZ0gNH9SVNUaa6vv6phVYGvJxfXAlMbzbakiXru75f5MZl8Z7oqiMMQD77riVHJCFlQvbZs/VVN2/4A=="], + + "@oh-my-pi/pi-coding-agent/@opentelemetry/exporter-metrics-otlp-proto/@opentelemetry/resources": ["@opentelemetry/resources@2.9.0", "", { "dependencies": { "@opentelemetry/core": "2.9.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-jyA5MBLQ+Dkl3+JsZkUoUvL7yHvU64kLsvpXKarWm6347Sl1t1bXFTFykUePNpT5WH5pm9a2Qtt03iIYQhZ1Fg=="], + + "@oh-my-pi/pi-coding-agent/@opentelemetry/exporter-metrics-otlp-proto/@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.9.0", "", { "dependencies": { "@opentelemetry/core": "2.9.0", "@opentelemetry/resources": "2.9.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-Xx8RGS4H5XEBl01WuCreMIpiah9cCXMbSkeuIePPdD2cUpq/vUzYmj8E/MK1OsbOc93FuAD4jfn2WOacKwLn7Q=="], + "@oh-my-pi/pi-coding-agent/@opentelemetry/exporter-trace-otlp-proto/@opentelemetry/core": ["@opentelemetry/core@2.9.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw=="], "@oh-my-pi/pi-coding-agent/@opentelemetry/exporter-trace-otlp-proto/@opentelemetry/otlp-exporter-base": ["@opentelemetry/otlp-exporter-base@0.220.0", "", { "dependencies": { "@opentelemetry/core": "2.9.0", "@opentelemetry/otlp-transformer": "0.220.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-CXYo8UD5Mn9YbgebO2EL4wejtA+gxLmLiu6HCk2KH2BR7XhFN6/6p1UlCb23DYCjeYkndevLHuejCCN1yx4+OQ=="], @@ -2527,6 +2341,24 @@ "@oh-my-pi/pi-coding-agent/@opentelemetry/exporter-trace-otlp-proto/@opentelemetry/sdk-trace": ["@opentelemetry/sdk-trace@2.9.0", "", { "dependencies": { "@opentelemetry/core": "2.9.0", "@opentelemetry/resources": "2.9.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-sGA19HvtrrSKYsseHphluH6j3p6Xa3fqc7c7y8f/7mYWejc1lyDFcpSdD1kYa50HCLUeEo4zA5bW0pniaPszuw=="], + "@oh-my-pi/pi-coding-agent/@opentelemetry/sdk-logs/@opentelemetry/core": ["@opentelemetry/core@2.9.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw=="], + + "@oh-my-pi/pi-coding-agent/@opentelemetry/sdk-logs/@opentelemetry/resources": ["@opentelemetry/resources@2.9.0", "", { "dependencies": { "@opentelemetry/core": "2.9.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-jyA5MBLQ+Dkl3+JsZkUoUvL7yHvU64kLsvpXKarWm6347Sl1t1bXFTFykUePNpT5WH5pm9a2Qtt03iIYQhZ1Fg=="], + + "@opentelemetry/exporter-logs-otlp-proto/@opentelemetry/otlp-exporter-base/@opentelemetry/core": ["@opentelemetry/core@2.9.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw=="], + + "@opentelemetry/exporter-logs-otlp-proto/@opentelemetry/otlp-transformer/@opentelemetry/core": ["@opentelemetry/core@2.9.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw=="], + + "@opentelemetry/exporter-logs-otlp-proto/@opentelemetry/otlp-transformer/@opentelemetry/resources": ["@opentelemetry/resources@2.9.0", "", { "dependencies": { "@opentelemetry/core": "2.9.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-jyA5MBLQ+Dkl3+JsZkUoUvL7yHvU64kLsvpXKarWm6347Sl1t1bXFTFykUePNpT5WH5pm9a2Qtt03iIYQhZ1Fg=="], + + "@opentelemetry/exporter-logs-otlp-proto/@opentelemetry/otlp-transformer/@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.9.0", "", { "dependencies": { "@opentelemetry/core": "2.9.0", "@opentelemetry/resources": "2.9.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-Xx8RGS4H5XEBl01WuCreMIpiah9cCXMbSkeuIePPdD2cUpq/vUzYmj8E/MK1OsbOc93FuAD4jfn2WOacKwLn7Q=="], + + "@opentelemetry/exporter-logs-otlp-proto/@opentelemetry/otlp-transformer/@opentelemetry/sdk-trace": ["@opentelemetry/sdk-trace@2.9.0", "", { "dependencies": { "@opentelemetry/core": "2.9.0", "@opentelemetry/resources": "2.9.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-sGA19HvtrrSKYsseHphluH6j3p6Xa3fqc7c7y8f/7mYWejc1lyDFcpSdD1kYa50HCLUeEo4zA5bW0pniaPszuw=="], + + "@opentelemetry/exporter-logs-otlp-proto/@opentelemetry/sdk-logs/@opentelemetry/core": ["@opentelemetry/core@2.9.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw=="], + + "@opentelemetry/exporter-logs-otlp-proto/@opentelemetry/sdk-logs/@opentelemetry/resources": ["@opentelemetry/resources@2.9.0", "", { "dependencies": { "@opentelemetry/core": "2.9.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-jyA5MBLQ+Dkl3+JsZkUoUvL7yHvU64kLsvpXKarWm6347Sl1t1bXFTFykUePNpT5WH5pm9a2Qtt03iIYQhZ1Fg=="], + "@rolldown/binding-wasm32-wasi/@emnapi/core/@emnapi/wasi-threads": ["@emnapi/wasi-threads@2.0.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9DsSk+o5NBX0CCJT8s0EROGSGxjR/tKu6aBTaVyq+SjAEQH4XcdcRxPBRzsBLizTTJ49MJjF+jgu3qnO9GLQcQ=="], "@solidjs/vite-plugin/@babel/core/@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="], @@ -2607,16 +2439,10 @@ "babel-preset-solid/@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "color/color-convert/color-name": ["color-name@2.1.1", "", {}, "sha512-p2FdgwVx1a9yWBHP2wI0VgShkDpgN4kZISkxdNipGBJWpa5G6b04OINlVWCyJj0JmfvcPrgqt95E9k8yvaOJFg=="], + "chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="], - "find-process/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - - "htmlparser2/domutils/dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], - - "jszip/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], - "magicast/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], "magicast/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], @@ -2627,12 +2453,6 @@ "sitemap/@types/node/undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], - "svgo/css-select/boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], - - "svgo/css-select/domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], - - "svgo/css-select/domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], - "table/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "unstorage/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], @@ -2657,9 +2477,9 @@ "@dom-expressions/babel-plugin-jsx/@babel/core/@babel/traverse/@babel/helper-globals": ["@babel/helper-globals@7.29.7", "", {}, "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA=="], - "@oh-my-pi/pi-coding-agent/@opentelemetry/exporter-trace-otlp-proto/@opentelemetry/otlp-transformer/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.220.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-CmVa4ImJ+ynfrPMNaAXHET6Bhb44SwzmfyVJFq9ni2jgXJR/l7C6gfVFddNmHP+ZOkP9cf4f9DBe68qVLTHc9w=="], + "@oh-my-pi/pi-coding-agent/@opentelemetry/exporter-metrics-otlp-proto/@opentelemetry/otlp-transformer/@opentelemetry/sdk-trace": ["@opentelemetry/sdk-trace@2.9.0", "", { "dependencies": { "@opentelemetry/core": "2.9.0", "@opentelemetry/resources": "2.9.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-sGA19HvtrrSKYsseHphluH6j3p6Xa3fqc7c7y8f/7mYWejc1lyDFcpSdD1kYa50HCLUeEo4zA5bW0pniaPszuw=="], - "@oh-my-pi/pi-coding-agent/@opentelemetry/exporter-trace-otlp-proto/@opentelemetry/otlp-transformer/@opentelemetry/sdk-logs": ["@opentelemetry/sdk-logs@0.220.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.220.0", "@opentelemetry/core": "2.9.0", "@opentelemetry/resources": "2.9.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, "sha512-WywcTkQtv2iNmt+6y5Kcd4rzvx9bLVsBa2Nwcmg01IUaBTkTow3W4d9KE5vNBpEDtb9tp21WcRBY/lANRrApYA=="], + "@oh-my-pi/pi-coding-agent/@opentelemetry/exporter-trace-otlp-proto/@opentelemetry/otlp-transformer/@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.9.0", "", { "dependencies": { "@opentelemetry/core": "2.9.0", "@opentelemetry/resources": "2.9.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-Xx8RGS4H5XEBl01WuCreMIpiah9cCXMbSkeuIePPdD2cUpq/vUzYmj8E/MK1OsbOc93FuAD4jfn2WOacKwLn7Q=="], "@solidjs/vite-plugin/@babel/core/@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], @@ -2700,13 +2520,5 @@ "babel-preset-solid/@babel/core/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], "babel-preset-solid/@babel/core/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], - - "find-process/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - - "htmlparser2/domutils/dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], - - "svgo/css-select/domutils/dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], - - "svgo/css-select/domutils/dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], } } diff --git a/packages/compass-agent/package.json b/packages/compass-agent/package.json index 2dd504637..c19590af9 100644 --- a/packages/compass-agent/package.json +++ b/packages/compass-agent/package.json @@ -16,9 +16,10 @@ "@connectrpc/connect-node": "^2.1.0", "@effect/opentelemetry": "catalog:", "@effect/platform": "catalog:", - "@oh-my-pi/pi-agent-core": "^16.4.8", - "@oh-my-pi/pi-ai": "^16.4.8", - "@oh-my-pi/pi-coding-agent": "^16.4.8", + "@oh-my-pi/pi-agent-core": "^18.0.11", + "@oh-my-pi/pi-ai": "^18.0.11", + "@oh-my-pi/pi-coding-agent": "^18.0.11", + "@oh-my-pi/omptype": "^18.0.11", "@opentelemetry/api": "catalog:", "@opentelemetry/exporter-metrics-otlp-proto": "catalog:", "@opentelemetry/exporter-trace-otlp-proto": "catalog:", @@ -29,7 +30,6 @@ "@opentelemetry/sdk-trace-node": "catalog:", "@opentelemetry/sdk-trace-web": "catalog:", "@opentelemetry/semantic-conventions": "catalog:", - "arktype": "2.2.3", "effect": "catalog:" }, "devDependencies": { diff --git a/packages/compass-agent/src/board.test.ts b/packages/compass-agent/src/board.test.ts index e87889dbb..5f97c4f5b 100644 --- a/packages/compass-agent/src/board.test.ts +++ b/packages/compass-agent/src/board.test.ts @@ -10,8 +10,8 @@ // result out, and the captured request asserted verbatim. Mirrors forge.test.ts. import { describe, expect, test } from "bun:test"; +import { ArkErrors, type Type } from "@oh-my-pi/omptype/ark"; import type { AgentTool, AgentToolResult } from "@oh-my-pi/pi-agent-core"; -import { ArkErrors, type Type } from "arktype"; import { BoardBroker, type BoardTransport, diff --git a/packages/compass-agent/src/board.ts b/packages/compass-agent/src/board.ts index cb0e150f0..48ab4b56c 100644 --- a/packages/compass-agent/src/board.ts +++ b/packages/compass-agent/src/board.ts @@ -30,11 +30,11 @@ // the RelayBoardCall payload on the Runner->Server leg (DL-049), one wire shape // for both hops. See packages/compass-agent/AGENTS.md for the package contract. +// The schema builder rides the SDK's own schema stack via its `/ark` compat +// facade — see the comms.ts note; one schema implementation in the graph, so +// there is no two-copy mismatch to catch. +import { type } from "@oh-my-pi/omptype/ark"; import type { AgentTool } from "@oh-my-pi/pi-agent-core"; -// `arktype` is pinned exact in package.json to whatever the SDK resolves — see -// the comms.ts note on this pin; a mismatch resolves two @ark/schema copies and -// `tsc` catches it. -import { type } from "arktype"; import { type BoardCallRequest, BoardCallRequestSchema, diff --git a/packages/compass-agent/src/cli.test.ts b/packages/compass-agent/src/cli.test.ts index d406c5fcb..f72dd2ae5 100644 --- a/packages/compass-agent/src/cli.test.ts +++ b/packages/compass-agent/src/cli.test.ts @@ -1624,9 +1624,18 @@ describe("main", () => { }); // A compaction round-trip: a fixture body whose file contains a superseded - // compaction loads through the SDK's own elision — proving the T5 - // reconstruction needs no compaction awareness beyond T4's supersession. - test("a superseded-compaction fixture loads via the SDK's own elision", async () => { + // compaction loads intact — proving the T5 reconstruction needs no compaction + // awareness beyond T4's supersession. + // + // The SDK moved WHERE supersession is applied. It used to elide the superseded + // summary at session LOAD (`elideSupersededCompactionEntries`, gone in 18.x); + // it now keeps stored entries verbatim and elides only when assembling the + // model-facing context (`buildSessionContext`, session-context.ts:174 -> + // `active ? entry.summary : SUPERSEDED_COMPACTION_SUMMARY` at :377). So the + // loaded entries carry BOTH real summaries, and this asserts the property that + // actually matters to compass either way: the round-trip preserves the whole + // compaction chain, so reconstruction never has to reason about supersession. + test("a superseded-compaction fixture round-trips with its chain intact", async () => { const session = fakeSession(); const cwd = process.cwd(); const sessionDir = SessionManager.getDefaultSessionDir(cwd); @@ -1659,13 +1668,12 @@ describe("main", () => { fakeCarrier(emptyLog(), { control: emptyControlStream }), }, ); - // The session loaded (post-compaction entry present) and the superseded - // compaction's summary was elided by the SDK loader. + // The session loaded with its full compaction chain intact — both summaries + // present, in order. (Supersession is applied downstream at context + // assembly, not here; compass never reads the elided form.) const summaries = compactionSummariesOf(entriesAtCreate); expect(summaries).toHaveLength(2); - expect(summaries[0]).toBe( - "[Superseded compaction summary elided during session load]", - ); + expect(summaries[0]).toBe("first compaction summary"); expect(summaries[1]).toBe("second compaction summary"); expect(textsOf(entriesAtCreate)).toContain("after compaction"); }); @@ -2894,9 +2902,14 @@ describe("main wires the mounted agent-config into createAgentSession", () => { // (2) rules survived (the custom template's list). expect(rendered).toContain("MP1-RULE-SENTINEL"); expect(rendered).toContain(""); - // (2) the project footer survived as its own block (environment + cwd). + // (2) the project footer survived as its own block. The SDK restructured + // this block: `project-prompt.md` renders `PROJECT` + `` (the + // environment list), while the cwd line moved out to its own + // `date-cwd-reminder` block (session/date-cwd-reminder.ts) that this render + // path does not include. Assert the footer's own markers, not the relocated + // cwd text. expect(rendered).toContain("PROJECT"); - expect(rendered).toContain("current working directory"); + expect(rendered).toContain(""); // The read tool stayed in the set (the gate's precondition). expect(systemPrompt.join("\n")).toContain("read"); }); diff --git a/packages/compass-agent/src/cli.ts b/packages/compass-agent/src/cli.ts index 63236c61f..646ec3516 100644 --- a/packages/compass-agent/src/cli.ts +++ b/packages/compass-agent/src/cli.ts @@ -700,12 +700,28 @@ export async function main( // onUpdate (e.g. wiring cancellation), it CANNOT go through this seam — the // SDK must gain a real native-registration path, or the tool must be a true // `ToolDefinition`. Do not consume args 3-5 here. + // + // `loadMode: "essential"` is REQUIRED, not decorative. SDK 18.x added + // progressive tool disclosure: an adapter boundary — extension + // `registerTool`, SDK custom tools, RPC host tools — defaults an omitted + // `loadMode` to `"discoverable"` + // (pi-coding-agent src/tools/essential-tools.ts:37-45). A discoverable tool + // is still REGISTERED, but it is not in the model's top-level callable + // schema; it is reached through the `xd://` device transport instead. These + // natives are the container agent's channel to the Manager and to forge/board, + // so they must stay top-level: without this the agent starts a session with + // none of `comms_*` / `agents_*` / `forge_*` / `board_*` directly callable. + // Set here at the single registration seam rather than in the four tool + // factories, so the whole native set gets one uniform, documented mode. const nativeTools = [ ...createCommsTools(commsBroker), ...createLifecycleTools(lifecycleBroker), ...createForgeTools(forgeBroker), ...createBoardTools(boardBroker), - ] as ToolDefinition[]; + ].map((tool) => ({ + ...tool, + loadMode: "essential" as const, + })) as ToolDefinition[]; // The tee session storage, wrapped + initialize()d (its scan of the session // dir must complete before SessionManager.create so synchronous resume diff --git a/packages/compass-agent/src/comms.test.ts b/packages/compass-agent/src/comms.test.ts index 1f954953b..0120c4366 100644 --- a/packages/compass-agent/src/comms.test.ts +++ b/packages/compass-agent/src/comms.test.ts @@ -11,8 +11,8 @@ // result out, and the captured request asserted verbatim. import { describe, expect, test } from "bun:test"; +import { ArkErrors, type Type } from "@oh-my-pi/omptype/ark"; import type { AgentTool, AgentToolResult } from "@oh-my-pi/pi-agent-core"; -import { ArkErrors, type Type } from "arktype"; import { CommsBroker, type CommsTransport, @@ -465,12 +465,12 @@ describe("comms parameter schemas", () => { }); // The bound the model is SHOWN, not the one enforced behind it. A `.narrow` - // predicate has no JSON Schema representation, so arktype cannot emit it — - // and the harness supplies a fallback that degrades the un-emittable node to - // its base rather than throwing, so the model sees a bare string and learns + // predicate has no JSON Schema representation, so the schema lib cannot emit + // it — and the harness supplies a fallback that degrades the un-emittable node + // to its base rather than throwing, so the model sees a bare string and learns // the rule only by being rejected. Asserting the DEGRADED OUTPUT, not a bare - // `toThrow()`: the harness never calls it bare, so a throw-assertion pins - // arktype's behaviour instead of this contract, and would stay green if the + // `toThrow()`: the harness never calls it bare, so a throw-assertion pins the + // schema lib's behaviour instead of this contract, and would stay green if the // fallback ever started emitting the narrow — the one change that would // actually make the descriptions redundant. The description is the only place // a caller can read these rules, which is why each is asserted rather than @@ -496,12 +496,18 @@ describe("comms parameter schemas", () => { "omit entirely for your home channel", ); - // Contrast: an expressible bound survives as real schema, which is what - // the asymmetry looks like from the model's side. Read off the numeric - // branch — the optional field is a union with `undefined`, and that union, - // not the range, is what stops the whole-schema emit here. - expect(listParameters.get("limit").expression).toContain("<= 100"); - expect(listParameters.get("limit").expression).toContain(">= 1"); + // Contrast: an expressible bound is genuinely ENFORCED, which is what the + // asymmetry looks like from the model's side — the `.narrow` non-blank rules + // above are silently dropped, while this range actually rejects. Asserted by + // enforcement rather than by the schema lib's `.expression` rendering: the + // rendering is an introspection detail that differs between schema + // implementations (omptype renders this optional node as + // `number % 1 | undefined`, folding the range into the compiled check), + // whereas rejection IS the contract the model runs into. + expect(rejects(listParameters, { limit: 0 })).toBe(true); + expect(rejects(listParameters, { limit: 101 })).toBe(true); + expect(rejects(listParameters, { limit: 1 })).toBe(false); + expect(rejects(listParameters, { limit: 100 })).toBe(false); expect(listParameters.get("limit").description).toContain("default 50"); }); diff --git a/packages/compass-agent/src/comms.ts b/packages/compass-agent/src/comms.ts index 9fe984fe1..17d100b7e 100644 --- a/packages/compass-agent/src/comms.ts +++ b/packages/compass-agent/src/comms.ts @@ -53,13 +53,16 @@ // Seven tools ship: post, post_ask, list, roster, set_status, open_dm, and dm; // search is deferred (OQ-3). +// The tool-parameter schema builder comes from the SDK's OWN schema stack +// (`@oh-my-pi/omptype`, pinned to the same 18.0.3 release as the SDK), via +// its `/ark` compatibility facade — arktype-authored code runs unchanged on the +// omptype lazy-JIT runtime. Sourcing it from the SDK's stack rather than a +// separately-versioned `arktype` is what keeps the tool parameter types +// assignable to the SDK's `TSchema`: there is only ever one schema +// implementation in the graph, so the two-copy mismatch `tsc` used to catch +// cannot arise. Keep the omptype pin in lockstep with the SDK pin. +import { type } from "@oh-my-pi/omptype/ark"; import type { AgentTool } from "@oh-my-pi/pi-agent-core"; -// `arktype` is pinned exact in package.json to whatever the SDK resolves -// (2.2.3, via @oh-my-pi/pi-coding-agent 16.5.2), NOT to a version of our -// choosing. A mismatch resolves two @ark/schema copies and the tool parameter -// types stop being assignable to the SDK's — `tsc` catches it, but the SDK dep -// floats on ^, so an SDK bump is the prompt to re-check this pin. -import { type } from "arktype"; import { AgentPresence, AskOptionSchema, diff --git a/packages/compass-agent/src/forge.test.ts b/packages/compass-agent/src/forge.test.ts index 7f5143c11..16c1570b5 100644 --- a/packages/compass-agent/src/forge.test.ts +++ b/packages/compass-agent/src/forge.test.ts @@ -12,8 +12,8 @@ // result out, and the captured request asserted verbatim. import { describe, expect, test } from "bun:test"; +import { ArkErrors, type Type } from "@oh-my-pi/omptype/ark"; import type { AgentTool, AgentToolResult } from "@oh-my-pi/pi-agent-core"; -import { ArkErrors, type Type } from "arktype"; import { CommentRefSchema, create, diff --git a/packages/compass-agent/src/forge.ts b/packages/compass-agent/src/forge.ts index 118f9904e..e83b0e16e 100644 --- a/packages/compass-agent/src/forge.ts +++ b/packages/compass-agent/src/forge.ts @@ -40,11 +40,11 @@ // `unimplemented` cleanly and their descriptions say so, so the surface never // changes shape when the writer lands. +// The schema builder rides the SDK's own schema stack via its `/ark` compat +// facade — see the comms.ts note; one schema implementation in the graph, so +// there is no two-copy mismatch to catch. +import { type } from "@oh-my-pi/omptype/ark"; import type { AgentTool } from "@oh-my-pi/pi-agent-core"; -// `arktype` is pinned exact in package.json to whatever the SDK resolves — see -// the comms.ts note on this pin; a mismatch resolves two @ark/schema copies and -// `tsc` catches it. -import { type } from "arktype"; import { CommentOnIssueRequestSchema, CommentOnPullRequestRequestSchema, diff --git a/packages/compass-agent/src/lifecycle.test.ts b/packages/compass-agent/src/lifecycle.test.ts index 70fc3d362..46690d8d6 100644 --- a/packages/compass-agent/src/lifecycle.test.ts +++ b/packages/compass-agent/src/lifecycle.test.ts @@ -11,9 +11,9 @@ // result out, and the captured request asserted verbatim. import { describe, expect, test } from "bun:test"; +import { ArkErrors, type Type } from "@oh-my-pi/omptype/ark"; import type { AgentTool, AgentToolResult } from "@oh-my-pi/pi-agent-core"; import { arkToWireSchema } from "@oh-my-pi/pi-ai/utils/schema"; -import { ArkErrors, type Type } from "arktype"; import { create, DespawnPeerResponseSchema, diff --git a/packages/compass-agent/src/lifecycle.ts b/packages/compass-agent/src/lifecycle.ts index 434d261f5..d79e01bfb 100644 --- a/packages/compass-agent/src/lifecycle.ts +++ b/packages/compass-agent/src/lifecycle.ts @@ -18,11 +18,11 @@ // authority is enforced Server-side — an unauthorized target comes back as a // `LifecycleCallError`, in-band, not as a transport teardown. +// The schema builder rides the SDK's own schema stack via its `/ark` compat +// facade — see the comms.ts note; one schema implementation in the graph, so +// there is no two-copy mismatch to catch. +import { type } from "@oh-my-pi/omptype/ark"; import type { AgentTool } from "@oh-my-pi/pi-agent-core"; -// `arktype` is pinned exact in package.json to whatever the SDK resolves — see -// the comms.ts note on this pin; a mismatch resolves two @ark/schema copies and -// `tsc` catches it. -import { type } from "arktype"; import { create, DespawnPeerRequestSchema, diff --git a/packages/compass-agent/src/subagent-tool-split.test.ts b/packages/compass-agent/src/subagent-tool-split.test.ts index 5b1e236d7..3b262150c 100644 --- a/packages/compass-agent/src/subagent-tool-split.test.ts +++ b/packages/compass-agent/src/subagent-tool-split.test.ts @@ -87,22 +87,30 @@ const lifecycleTransport: LifecycleTransport = { unreached("lifecycle"), }; -// The EXACT Compass native tool set cli.ts registers on the Manager session -// (cli.ts:703-708). Built from the same four factories over real brokers, so -// the expected set can never drift from what ships: a new native tool is -// automatically part of the pinned split. +// The EXACT Compass native tool set cli.ts registers on the Manager session. +// Built from the same four factories over real brokers, so the expected set can +// never drift from what ships: a new native tool is automatically part of the +// pinned split. function compassNativeTools(): ToolDefinition[] { - // Mirrors cli.ts:703-708: the factories return `AgentTool[]`, which the - // entrypoint widens to `ToolDefinition[]` for the `customTools` option - // (`customTools?: (CustomTool | ToolDefinition)[]`). The two are + // Mirrors the cli.ts registration seam: the factories return `AgentTool[]`, + // which the entrypoint widens to `ToolDefinition[]` for the `customTools` + // option (`customTools?: (CustomTool | ToolDefinition)[]`). The two are // structurally compatible for registration but inference will not unify // them, so this is the same widening the production callsite uses. + // + // `loadMode: "essential"` mirrors the same stamp cli.ts applies. SDK 18.x + // defaults an omitted `loadMode` at an adapter boundary to `"discoverable"` + // (registered but not top-level), so without it these tools would not be + // active and this file would be measuring the wrong surface. return [ ...createCommsTools(new CommsBroker(commsTransport)), ...createLifecycleTools(new LifecycleBroker(lifecycleTransport)), ...createForgeTools(new ForgeBroker(forgeTransport)), ...createBoardTools(new BoardBroker(boardTransport)), - ] as ToolDefinition[]; + ].map((tool) => ({ + ...tool, + loadMode: "essential" as const, + })) as ToolDefinition[]; } function compassNativeToolNames(): Set { @@ -167,7 +175,7 @@ function subagentActiveToolNames(cwd: string): Promise { return activeToolNames({ cwd, taskDepth: 1 }); } -describe("subagent comms/IRC tool split (design §T7)", () => { +describe("subagent comms/hub tool split (design §T7)", () => { test("the Manager session carries exactly the Compass native tool set", async () => { const cwd = scratch(); const active = new Set(await managerActiveToolNames(cwd)); @@ -195,18 +203,19 @@ describe("subagent comms/IRC tool split (design §T7)", () => { expect(leaked).toEqual([]); }); - test("a subagent session still carries irc (the COOP-advertised peer channel)", async () => { + test("a subagent session still carries hub (the COOP-advertised peer channel)", async () => { const cwd = scratch(); const active = new Set(await subagentActiveToolNames(cwd)); - // `irc` is active on this subagent via the availability gate - // isIrcEnabled(settings, taskDepth) (tools/index.ts:628): at taskDepth 1 - // the `taskDepth > 0` short-circuit returns true (irc.ts:45). (A - // tool-restricted subagent additionally force-includes it at - // executor.ts:2196-2197.) The split removes Compass's channel tools but - // MUST leave the OMP-internal peer channel, or workers cannot reach the - // Manager at all. - expect(active.has("irc")).toBe(true); + // `hub` is active on this subagent via the availability gate + // isIrcEnabled(settings, taskDepth) (tools/index.ts:679): at taskDepth 1 + // the `taskDepth > 0` short-circuit returns true + // (tools/hub/messaging.ts:109-110). (A tool-restricted subagent + // additionally force-includes it in the task executor.) The split removes + // Compass's channel tools but MUST leave the OMP-internal peer channel, or + // workers cannot reach the Manager at all. The SDK renamed this tool + // `irc` -> `hub`; the gate function kept its original name. + expect(active.has("hub")).toBe(true); }); test("the Manager carries Compass tools that the subagent drops — the split is real", async () => { diff --git a/packages/compass-agent/src/transport/control-metrics.test.ts b/packages/compass-agent/src/transport/control-metrics.test.ts index 5a41b4e19..35ddcc85b 100644 --- a/packages/compass-agent/src/transport/control-metrics.test.ts +++ b/packages/compass-agent/src/transport/control-metrics.test.ts @@ -23,7 +23,8 @@ // runtime — the no-op tracer discards spans — so it injects one through the // module-private `setTransportRuntime` channel (a test in src/transport/ may call // it) with an in-memory OTel exporter wired through effect's tracer via -// `NodeSdk.layer` (pattern: forks/oh-my-pi/packages/agent/test/otel.test.ts). A +// `NodeSdk.layer` (an in-memory span exporter registered as the effect runtime's +// tracer layer, so spans land in a readable array instead of the no-op sink). A // fake transport gives the test exact control over whether `onHeader` fires, so // the `established` span EVENT is present on a header-delivering attempt and // absent on a hung dial. From d6a85fda3a602b1c7d1ea41f777ca3072161b001 Mon Sep 17 00:00:00 2001 From: mintaka Date: Sun, 6 Sep 2026 00:43:14 -0400 Subject: [PATCH 2/4] fix(compass-agent): carry narrow rules into descriptions and stamp loadMode on all custom tools (RIG-2407) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Addresses the review of #924. Two `high` findings, both real defects the migration's own verification missed, plus the mediums and lows. ### high — a `.narrow` rule could reach the model through no channel at all Under omptype a `.describe()` applied after a `.narrow()` SHADOWS the narrow's `ctx.mustBe(...)` reason in the rejection message; arktype appended it. Since a `.narrow` predicate also has no JSON Schema form, a rule spelled only in the narrow became unreachable: the model was told the field's PURPOSE and never the violated RULE, so it could not self-correct and would retry the same invalid value. Verified in isolation (identical schema, same call): ``` withDescribe => must be A label (was "toolongvalue") noDescribe => must be at most 5 chars (was "toolongvalue") ``` Fixed by folding every narrow's rule into its description. The two shared `nonBlank` helpers (`forge.ts`, `board.ts`) now append `(must not be blank)` themselves, so no call site can forget it; the hand-written descriptions in `comms.ts` (`topic` ×3, `channel` ×2, both `peer_handle`s) state their non-blank and ≤120-character bounds explicitly. Audited all 22 `mustBe` sites across the four files; every rule now appears in its description. The blind spot was the assertion, not just the schema: the migration rewrote `comms.test.ts` to check `rejects(...)` booleans, and the boolean verdicts genuinely did not change. Added a regression test that pins the MESSAGE — the surface the harness feeds back to the model verbatim (`pi-ai/src/utils/validation.ts:1722`). Confirmed red-green: reverting one description to its pre-fix text fails the test, restoring it passes. ### high — the loadMode stamp missed every mounted-MCP tool The stamp was applied to `nativeTools` only, but MCP tools merge into the SAME `customTools` array and go through the same adapter. `MCPManager.getTools()` never sets `loadMode` (0 matches under `src/mcp/`), so every mounted-MCP tool silently defaulted to `"discoverable"` — registered but absent from the model's top-level callable schema. The `xd://` transport does not recover them in this session shape: it is gated on a top-level `write` tool this headless session never requests (`tools/index.ts:772`). Net effect was a tool neither top-level callable nor `xd://`-reachable, which is exactly the silent-no-surface failure the RIG-1741/CD-3 mount contract exists to prevent. Moved the stamp to the merged array at the real registration seam, so natives and MCP tools get one uniform documented mode. The mount test now asserts PRESENTATION (`loadMode: "essential"` per tool) rather than bare array membership — membership passed while the tool was unreachable. ### medium / low - Dropped the hardcoded `18.0.3` from the omptype pin note in `comms.ts` (every artifact in the tree says 18.0.11); the lockstep rule is the durable content and `package.json` is the authority for the number. - Recorded the second omptype introspection delta in the `comms.ts` header: `.get(k).description` on an optional UNION node returns the rendered union rather than the authored text, so description contracts must be asserted through `arkToWireSchema`, never `.get().description`. - Fixed the `cli.test.ts` in-body comment that still claimed `elideSupersededCompactionEntries` collapses a summary on load — it contradicted the rewritten assertion 30 lines below it. - Finished the `irc` → `hub` rename in `subagent-tool-split.test.ts`'s docblock (the file's own documentation of what it defends), corrected `lockfile 16.5.2` → `18.0.11`, and repointed the stale citations: `executor.ts:2394/:2489` → `src/task/executor.ts:3113/:3234`, `cli.ts:896` → `cli.ts:926`. - Sorted `@oh-my-pi/omptype` into alphabetical order in `package.json`. ### Verification - `bunx tsc --noEmit` — 0 errors - `bun test` — **678 pass / 0 fail** across 28 files (677 + the new message-level regression test) - `biome check packages/compass-agent` — 0 errors Spec-impact: none. Refs RIG-2407 Co-authored-by: Matt Wilkinson --- packages/compass-agent/package.json | 2 +- packages/compass-agent/src/board.ts | 13 +++-- packages/compass-agent/src/cli.test.ts | 24 +++++++-- packages/compass-agent/src/cli.ts | 40 +++++++------- packages/compass-agent/src/comms.test.ts | 29 ++++++++++ packages/compass-agent/src/comms.ts | 53 +++++++++++++------ packages/compass-agent/src/forge.ts | 12 +++-- .../src/subagent-tool-split.test.ts | 44 ++++++++------- 8 files changed, 150 insertions(+), 67 deletions(-) diff --git a/packages/compass-agent/package.json b/packages/compass-agent/package.json index c19590af9..770f0ed26 100644 --- a/packages/compass-agent/package.json +++ b/packages/compass-agent/package.json @@ -16,10 +16,10 @@ "@connectrpc/connect-node": "^2.1.0", "@effect/opentelemetry": "catalog:", "@effect/platform": "catalog:", + "@oh-my-pi/omptype": "^18.0.11", "@oh-my-pi/pi-agent-core": "^18.0.11", "@oh-my-pi/pi-ai": "^18.0.11", "@oh-my-pi/pi-coding-agent": "^18.0.11", - "@oh-my-pi/omptype": "^18.0.11", "@opentelemetry/api": "catalog:", "@opentelemetry/exporter-metrics-otlp-proto": "catalog:", "@opentelemetry/exporter-trace-otlp-proto": "catalog:", diff --git a/packages/compass-agent/src/board.ts b/packages/compass-agent/src/board.ts index 48ab4b56c..4b2d40c8c 100644 --- a/packages/compass-agent/src/board.ts +++ b/packages/compass-agent/src/board.ts @@ -73,13 +73,18 @@ export class BoardBroker { } // The required-non-blank string idiom (comms/lifecycle/forge precedent): the -// `.narrow` predicate is enforced at runtime but has no JSON Schema form -// (`toJsonSchema` drops it), so the model sees a bare string and learns the rule -// only from the description — hence the description repeats it. +// `.narrow` predicate is enforced at runtime but has no JSON Schema form (the +// harness degrades the node to its unconstrained base), so the model sees a +// bare string and learns the rule only from the description — hence the +// description repeats it. Appended here rather than hand-written into each +// caller's text so no call site can forget it: under omptype a `.describe()` +// SHADOWS the narrow's `ctx.mustBe(...)` reason in the rejection message, so if +// the rule is missing from the description it reaches the model through no +// channel at all. const nonBlank = (description: string) => type("string") .narrow((s, ctx) => s.trim().length > 0 || ctx.mustBe("non-blank")) - .describe(description); + .describe(`${description} (must not be blank)`); // The eight real board states, as the model-facing tokens the tool accepts. // ISSUE_STATE_UNSPECIFIED is deliberately absent: the closed enum rejects it at diff --git a/packages/compass-agent/src/cli.test.ts b/packages/compass-agent/src/cli.test.ts index f72dd2ae5..62ce845f7 100644 --- a/packages/compass-agent/src/cli.test.ts +++ b/packages/compass-agent/src/cli.test.ts @@ -1641,8 +1641,9 @@ describe("main", () => { const sessionDir = SessionManager.getDefaultSessionDir(cwd); mkdirSync(sessionDir, { recursive: true }); const resumeFile = join(sessionDir, "20260101-000000_compacted.jsonl"); - // Two compactions on the active branch; the earlier one is superseded and - // the SDK's elideSupersededCompactionEntries collapses its summary on load. + // Two compactions on the active branch; the earlier one is superseded. Both + // summaries are stored verbatim — supersession is applied downstream at + // context assembly, not at load. writeFileSync( resumeFile, sessionFixture([ @@ -2496,7 +2497,24 @@ describe("main wires the mounted agent-config into createAgentSession", () => { // comms/lifecycle tools (merged in main), so this is a containment check, // not identity — the dedicated native-tools test below pins those. expect(connectedWith).toEqual({ db: { command: "db-mcp" } }); - expect(opts.customTools).toEqual(expect.arrayContaining(mcpTools)); + // Asserted by PRESENTATION, not bare membership. main stamps the whole + // merged array `loadMode: "essential"`, and that stamp is the load-bearing + // part for a mounted-MCP tool: without it the SDK's adapter boundary + // defaults it to `"discoverable"`, which registers the tool but keeps it + // out of the model's top-level callable schema — and the `xd://` transport + // does not recover it in this headless session shape. A membership-only + // check passes while the tool is silently unreachable, which is the exact + // failure the RIG-1741/CD-3 mount contract exists to prevent. + for (const tool of mcpTools) { + expect(opts.customTools).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + name: tool.name, + loadMode: "essential", + }), + ]), + ); + } expect(opts.enableMCP).toBe(false); }); diff --git a/packages/compass-agent/src/cli.ts b/packages/compass-agent/src/cli.ts index 646ec3516..cfeadbb79 100644 --- a/packages/compass-agent/src/cli.ts +++ b/packages/compass-agent/src/cli.ts @@ -700,28 +700,12 @@ export async function main( // onUpdate (e.g. wiring cancellation), it CANNOT go through this seam — the // SDK must gain a real native-registration path, or the tool must be a true // `ToolDefinition`. Do not consume args 3-5 here. - // - // `loadMode: "essential"` is REQUIRED, not decorative. SDK 18.x added - // progressive tool disclosure: an adapter boundary — extension - // `registerTool`, SDK custom tools, RPC host tools — defaults an omitted - // `loadMode` to `"discoverable"` - // (pi-coding-agent src/tools/essential-tools.ts:37-45). A discoverable tool - // is still REGISTERED, but it is not in the model's top-level callable - // schema; it is reached through the `xd://` device transport instead. These - // natives are the container agent's channel to the Manager and to forge/board, - // so they must stay top-level: without this the agent starts a session with - // none of `comms_*` / `agents_*` / `forge_*` / `board_*` directly callable. - // Set here at the single registration seam rather than in the four tool - // factories, so the whole native set gets one uniform, documented mode. const nativeTools = [ ...createCommsTools(commsBroker), ...createLifecycleTools(lifecycleBroker), ...createForgeTools(forgeBroker), ...createBoardTools(boardBroker), - ].map((tool) => ({ - ...tool, - loadMode: "essential" as const, - })) as ToolDefinition[]; + ] as ToolDefinition[]; // The tee session storage, wrapped + initialize()d (its scan of the session // dir must complete before SessionManager.create so synchronous resume @@ -922,7 +906,27 @@ export async function main( // (RIG-1741 gap-1, constructed above): all reach the session as natives via // the same customTools→state.tools→#withNatives path, so the container // agent can spawn peers and post to channels. - customTools: [...mcp.tools, ...nativeTools], + // + // `loadMode: "essential"` is REQUIRED, not decorative, and it is stamped + // on the WHOLE merged array — natives AND mounted-MCP tools. SDK 18.x + // added progressive tool disclosure: at an adapter boundary an omitted + // `loadMode` defaults to `"discoverable"` + // (`defaultLoadModeForToolName`, pi-coding-agent + // src/tools/essential-tools.ts:43-45), which registers the tool but keeps + // it OUT of the model's top-level callable schema. `MCPManager.getTools()` + // never sets `loadMode`, so stamping only the natives would silently + // demote every mounted-MCP tool — and the `xd://` device transport does + // NOT recover them here, because it is gated on a top-level `write` tool + // this headless session does not request (`xdevEnabled`, pi-coding-agent + // src/tools/index.ts:772). A demoted MCP tool would therefore be neither + // top-level callable NOR xd://-reachable: registered and unreachable, + // which is exactly the silent-no-surface failure the RIG-1741/CD-3 mount + // contract exists to prevent. Stamped once here, at the single + // registration seam, rather than in the four native factories. + customTools: [...mcp.tools, ...nativeTools].map((tool) => ({ + ...tool, + loadMode: "essential" as const, + })), enableMCP: false, // Headless approval policy (RIG-1741, design compass-agent-comms-tools // §"the container runs headless with write-approval tools auto-executing"): diff --git a/packages/compass-agent/src/comms.test.ts b/packages/compass-agent/src/comms.test.ts index 0120c4366..f1bcc7c02 100644 --- a/packages/compass-agent/src/comms.test.ts +++ b/packages/compass-agent/src/comms.test.ts @@ -511,6 +511,35 @@ describe("comms parameter schemas", () => { expect(listParameters.get("limit").description).toContain("default 50"); }); + // The rule text must reach the MODEL, not just the validator. This is the + // contract a reject/accept boolean cannot defend, and it is + // schema-implementation-sensitive: under omptype a `.describe()` SHADOWS the + // narrow's `ctx.mustBe(...)` reason in the emitted message (arktype appended + // it), so a rule that lives ONLY in the narrow reaches the model through no + // channel at all — not the JSON Schema (a `.narrow` has no JSON Schema form), + // and not the rejection text. The rejection message is what the harness feeds + // back to the model verbatim (`pi-ai/src/utils/validation.ts:1722` maps each + // issue to `path: message`), so it is the surface asserted here. + test("a violated narrow rule names the RULE in the message the model sees", () => { + // `instanceof ArkErrors` is the real narrowing (same idiom as `rejects` + // above): it proves the value carries `summary` rather than asserting it. + const summaryOf = (params: unknown): string => { + const out = postParameters(params); + if (!(out instanceof ArkErrors)) { + throw new Error("expected the schema to reject these params"); + } + return out.summary; + }; + + // The violated bound itself, not merely the field's purpose. + expect( + summaryOf({ text: "hi", topic: "x".repeat(121), channel: "c" }), + ).toContain("120"); + expect(summaryOf({ text: "hi", topic: "t", channel: " " })).toContain( + "blank", + ); + }); + // open_dm requires a non-blank peer_handle — the same `.narrow` idiom. test("open_dm requires a non-blank peer_handle", () => { expect(rejects(openDmParameters, {})).toBe(true); diff --git a/packages/compass-agent/src/comms.ts b/packages/compass-agent/src/comms.ts index 17d100b7e..212a1a935 100644 --- a/packages/compass-agent/src/comms.ts +++ b/packages/compass-agent/src/comms.ts @@ -54,13 +54,29 @@ // search is deferred (OQ-3). // The tool-parameter schema builder comes from the SDK's OWN schema stack -// (`@oh-my-pi/omptype`, pinned to the same 18.0.3 release as the SDK), via -// its `/ark` compatibility facade — arktype-authored code runs unchanged on the -// omptype lazy-JIT runtime. Sourcing it from the SDK's stack rather than a +// (`@oh-my-pi/omptype`, pinned to the same release as the SDK), via its `/ark` +// compatibility facade — arktype-authored code runs unchanged on the omptype +// lazy-JIT runtime. Sourcing it from the SDK's stack rather than a // separately-versioned `arktype` is what keeps the tool parameter types // assignable to the SDK's `TSchema`: there is only ever one schema // implementation in the graph, so the two-copy mismatch `tsc` used to catch -// cannot arise. Keep the omptype pin in lockstep with the SDK pin. +// cannot arise. Keep the omptype pin in lockstep with the SDK pin; package.json +// is the authority for the version. +// +// TWO omptype introspection deltas to know when authoring schemas here: +// +// 1. A `.describe()` applied after a `.narrow()` SHADOWS the narrow's +// `ctx.mustBe(...)` reason in the rejection message (arktype appended it). +// Since that message is the model's ONLY channel for a bound absent from +// the JSON Schema, every `.narrow` rule MUST also be spelled out in the +// `.describe()` text — otherwise the model is told the field's purpose and +// never the violated rule, so it cannot self-correct. Assert rule text with +// a message assertion, not just a reject/accept boolean. +// 2. `.get(k).description` on an OPTIONAL UNION node returns the rendered +// union (`"github" or "linear" or undefined`) rather than the authored +// text. The model-facing wire schema is unaffected, so assert description +// contracts through `arkToWireSchema` (as lifecycle.test.ts does for +// `role`), never through `.get().description`. import { type } from "@oh-my-pi/omptype/ark"; import type { AgentTool } from "@oh-my-pi/pi-agent-core"; import { @@ -128,12 +144,15 @@ export class CommsBroker { /** Exported so a test can validate the wire contract the agent loop enforces. */ export const postParameters = type({ // The non-blank bound is enforced at runtime but is NOT expressible in JSON - // Schema — arktype drops the `.narrow` predicate from the wire schema the - // model is shown (`toJsonSchema` throws on it; the harness falls back to the - // unconstrained base, `pi-ai/src/utils/validation.ts:1640-1643`). So the - // model sees a bare string and learns the rule only by being rejected. The - // description carries it instead: a constraint the caller cannot see is one - // it will violate. + // Schema — a `.narrow` predicate has no JSON Schema form, so the harness + // degrades the node to its unconstrained base + // (`arkToWireSchema`'s `fallback: ctx => ctx.base`, + // `pi-ai/src/utils/schema/wire.ts:587`; the emitted-schema path is + // `pi-ai/src/utils/validation.ts:1713-1716`). So the model sees a bare + // string and learns the rule only by being rejected. The description must + // carry it: a constraint the caller cannot see is one it will violate — and + // under omptype a `.describe()` shadows the narrow's `mustBe` reason, so the + // description is the ONLY place the rule reaches the model. text: type("string") .narrow((s, ctx) => s.trim().length > 0 || ctx.mustBe("non-blank")) .describe("Markdown message body; must not be blank"), @@ -147,7 +166,7 @@ export const postParameters = type({ .narrow((s, ctx) => s.trim().length > 0 || ctx.mustBe("non-blank")) .narrow((s, ctx) => s.length <= 120 || ctx.mustBe("at most 120 characters")) .describe( - "Named conversation within the channel; a name-miss is an error unless create_topic is true", + "Named conversation within the channel, non-blank and at most 120 characters; a name-miss is an error unless create_topic is true", ), // The target channel BY NAME. Required (peer-DM record R1+R2+R5): the home // default is dropped at the tool level for post/ask — the agent must NAME its @@ -158,7 +177,7 @@ export const postParameters = type({ channel: type("string") .narrow((s, ctx) => s.trim().length > 0 || ctx.mustBe("non-blank")) .describe( - "Target channel by name (required); to post to your own channel, name it — there is no default", + "Target channel by name (required, must not be blank); to post to your own channel, name it — there is no default", ), // Gate get-or-create of an unknown `topic`: when true a name that names no // existing topic MINTS it; when false (default), a name-miss is an error, @@ -228,7 +247,7 @@ export const postAskParameters = type({ .narrow((s, ctx) => s.trim().length > 0 || ctx.mustBe("non-blank")) .narrow((s, ctx) => s.length <= 120 || ctx.mustBe("at most 120 characters")) .describe( - 'Named conversation within the channel; a name-miss is an error unless create_topic is true (default "general")', + 'Named conversation within the channel, non-blank and at most 120 characters; a name-miss is an error unless create_topic is true (default "general")', ), // The target channel BY NAME. Required, same rationale as // `postParameters.channel`: the home default is dropped at the tool level and @@ -236,7 +255,7 @@ export const postAskParameters = type({ channel: type("string") .narrow((s, ctx) => s.trim().length > 0 || ctx.mustBe("non-blank")) .describe( - "Target channel by name (required); to post to your own channel, name it — there is no default", + "Target channel by name (required, must not be blank); to post to your own channel, name it — there is no default", ), // Gate get-or-create of an unknown `topic`, mirroring `postParameters`. "create_topic?": type("boolean").describe( @@ -298,7 +317,7 @@ export const openDmParameters = type({ peer_handle: type("string") .narrow((s, ctx) => s.trim().length > 0 || ctx.mustBe("non-blank")) .describe( - "The peer agent's handle to open a DM with; unknown or cross-owner is an error", + "The peer agent's handle to open a DM with (must not be blank); unknown or cross-owner is an error", ), }); @@ -307,7 +326,7 @@ export const dmParameters = type({ peer_handle: type("string") .narrow((s, ctx) => s.trim().length > 0 || ctx.mustBe("non-blank")) .describe( - "The peer agent's handle to DM; unknown or cross-owner is an error", + "The peer agent's handle to DM (must not be blank); unknown or cross-owner is an error", ), text: type("string") .narrow((s, ctx) => s.trim().length > 0 || ctx.mustBe("non-blank")) @@ -316,7 +335,7 @@ export const dmParameters = type({ .narrow((s, ctx) => s.trim().length > 0 || ctx.mustBe("non-blank")) .narrow((s, ctx) => s.length <= 120 || ctx.mustBe("at most 120 characters")) .describe( - "Named conversation within the DM; a name-miss is an error unless create_topic is true", + "Named conversation within the DM, non-blank and at most 120 characters; a name-miss is an error unless create_topic is true", ), "create_topic?": type("boolean").describe( "When true, an unknown topic name is created; when false (default) a topic name-miss is an error", diff --git a/packages/compass-agent/src/forge.ts b/packages/compass-agent/src/forge.ts index e83b0e16e..b1137afd9 100644 --- a/packages/compass-agent/src/forge.ts +++ b/packages/compass-agent/src/forge.ts @@ -112,13 +112,17 @@ export class ForgeBroker { } // The required-non-blank string idiom (comms/lifecycle precedent): the `.narrow` -// predicate is enforced at runtime but has no JSON Schema form (`toJsonSchema` -// drops it), so the model sees a bare string and learns the rule only from the -// description — hence the description repeats it. +// predicate is enforced at runtime but has no JSON Schema form (the harness +// degrades the node to its unconstrained base), so the model sees a bare string +// and learns the rule only from the description — hence the description repeats +// it. Appended here rather than hand-written into each caller's text so no +// call site can forget it: under omptype a `.describe()` SHADOWS the narrow's +// `ctx.mustBe(...)` reason in the rejection message, so if the rule is missing +// from the description it reaches the model through no channel at all. const nonBlank = (description: string) => type("string") .narrow((s, ctx) => s.trim().length > 0 || ctx.mustBe("non-blank")) - .describe(description); + .describe(`${description} (must not be blank)`); // The optional multi-forge selector, spread into EVERY tool below. Unset = the // configured default GitHub forge (DL-202). Defined as a plain definition-object diff --git a/packages/compass-agent/src/subagent-tool-split.test.ts b/packages/compass-agent/src/subagent-tool-split.test.ts index 3b262150c..ea30a0c49 100644 --- a/packages/compass-agent/src/subagent-tool-split.test.ts +++ b/packages/compass-agent/src/subagent-tool-split.test.ts @@ -1,28 +1,31 @@ -// The comms/IRC tool split, pinned (design +// The comms/hub tool split, pinned (design // docs/designs/agent/compass-per-agent-overrides/design.md §Plan T7). // // WHAT THIS DEFENDS. Compass's native tools — the comms surface // (`comms_post_message`, `compass_roster`, …), the lifecycle surface // (`agents_spawn_peer`, `agents_despawn_peer`), and the forge surface -// (`forge_*`) — reach the Manager session as `customTools` (cli.ts:896: -// `customTools: [...mcp.tools, ...nativeTools]`). An in-process `task` -// subagent (the design's worker topology) runs at full Manager trust in the +// (`forge_*`) — reach the Manager session as `customTools` (cli.ts:926: +// `customTools: [...mcp.tools, ...nativeTools].map(… loadMode: "essential")`). +// An in-process `task` subagent (the design's worker topology) runs at full +// Manager trust in the // SAME container, so its Compass reach is NOT a security boundary — it is a // capability contract. The contract: a subagent gets the OMP builtin toolset -// (edit/read/bash/…) and `irc`, but NONE of Compass's native tools; peers and -// the Manager are reached over OMP-internal IRC, never a Compass channel. +// (edit/read/bash/…) and `hub`, but NONE of Compass's native tools; peers and +// the Manager are reached over the OMP-internal peer channel, never a Compass +// channel. // // WHY BY-CONSTRUCTION TODAY, AND WHY PIN IT ANYWAY. The exclusion falls out of // the SDK's subagent construction: a subagent session's `customTools` is // `mcpProxyTools = options.mcpManager ? createMCPProxyTools(...) : []` -// (executor.ts:2394/:2489), and Compass passes its native tools as +// (src/task/executor.ts:3113/:3234), and Compass passes its native tools as // `customTools`, never via an `mcpManager` — so a child's `customTools` is // empty and no Compass tool can transit. That is a property of a pinned SDK -// (lockfile 16.5.2), not a guarantee: an SDK upgrade, or a future refactor that -// hands Compass tools to subagents through an `mcpManager`, would silently widen -// the child's reach. This test is the DRIFT ALARM (design §Global Constraints: -// "T7's closed-set pin is a drift alarm, not a fence") — it reddens the day a -// Compass tool leaks into a subagent, or `irc` drops out of one. +// (lockfile 18.0.11), not a guarantee: an SDK upgrade, or a future refactor +// that hands Compass tools to subagents through an `mcpManager`, would silently +// widen the child's reach. This test is the DRIFT ALARM (design §Global +// Constraints: "T7's closed-set pin is a drift alarm, not a fence") — it +// reddens the day a Compass tool leaks into a subagent, or `hub` drops out of +// one. // // THE ASSERTION IS A CLOSED SET ON THE COMPASS DIMENSION, not a deny-list and // not an exact-equals against the whole OMP builtin list. The builtin list is @@ -31,9 +34,9 @@ // versions), so an exact-equals against it would be flaky. What is INVARIANT is // the split: the Manager session carries EXACTLY the Compass native tool set, // and the subagent session carries EXACTLY NONE of it while still carrying -// `irc`. Asserting the Compass-tool intersection in both directions is the +// `hub`. Asserting the Compass-tool intersection in both directions is the // closed set that matters — it cannot pass if a Compass tool leaks in, and -// cannot pass if `irc` is missing. +// cannot pass if `hub` is missing. // // Hermetic: a scratch cwd + scratch HOME (the SDK anchors discovery on the // launch HOME, os.homedir(); pinning it keeps ambient extensions/tools out) and @@ -98,10 +101,11 @@ function compassNativeTools(): ToolDefinition[] { // structurally compatible for registration but inference will not unify // them, so this is the same widening the production callsite uses. // - // `loadMode: "essential"` mirrors the same stamp cli.ts applies. SDK 18.x - // defaults an omitted `loadMode` at an adapter boundary to `"discoverable"` - // (registered but not top-level), so without it these tools would not be - // active and this file would be measuring the wrong surface. + // `loadMode: "essential"` mirrors the same stamp cli.ts applies to the whole + // merged `customTools` array (natives + mounted MCP). SDK 18.x defaults an + // omitted `loadMode` at an adapter boundary to `"discoverable"` (registered + // but not top-level), so without it these tools would not be active and this + // file would be measuring the wrong surface. return [ ...createCommsTools(new CommsBroker(commsTransport)), ...createLifecycleTools(new LifecycleBroker(lifecycleTransport)), @@ -162,10 +166,10 @@ async function activeToolNames( } // The Manager session shape: Compass native tools ride `customTools` -// (cli.ts:896). The subagent session shape: a real in-process subagent +// (cli.ts:926). The subagent session shape: a real in-process subagent // (`taskDepth: 1`) with no `customTools` — the SDK's subagent path sets // `customTools` from `mcpProxyTools`, which is empty because Compass passes no -// `mcpManager` (executor.ts:2394/:2489), so a child inherits none of the +// `mcpManager` (src/task/executor.ts:3113/:3234), so a child inherits none of the // native tools the Manager holds. function managerActiveToolNames(cwd: string): Promise { return activeToolNames({ cwd, customTools: compassNativeTools() }); From 534e6597d0029baf30d97b61464155e7372af4f5 Mon Sep 17 00:00:00 2001 From: mintaka Date: Sun, 6 Sep 2026 01:06:39 -0400 Subject: [PATCH 3/4] fix(compass-agent): preserve MCP tool prototypes when stamping loadMode (RIG-2407) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Addresses round 2 of the review of #924. The previous fix commit introduced a high-severity regression; this corrects it and adds the coverage that should have caught it. ### high — the loadMode stamp destroyed every mounted-MCP tool's `execute` The stamp was written as `.map((tool) => ({ ...tool, loadMode: "essential" }))`. `mcp.tools` are `MCPTool` CLASS instances (`pi-coding-agent src/mcp/tool-bridge.ts:492`, built by `fromTools` at `:514`) whose `execute` / `renderCall` / `renderResult` live on the **prototype**. An object spread copies only own enumerable properties, so all three were silently sheared off, and the SDK adapter's `tool.execute(...)` (`sdk.ts:989`) would throw `is not a function` at the model's first call. That traded a demoted-but-intact tool for a top-level-callable one that crashes — strictly worse than the bug the previous commit fixed. The natives are plain object literals, so they were unaffected, which is why nothing reddened. Reproduced directly: ``` instance execute: function | renderCall: function SPREAD execute: undefined | renderCall: undefined FIXED execute: function | renderCall: function | loadMode: essential ``` Fixed by cloning onto the original prototype (`Object.assign(Object.create(Object.getPrototypeOf(tool)), tool, { loadMode })`), which applies the mode without reconstructing the object or mutating the SDK's own instances. ### medium — the fixture could not see it The mount test's fake was `[{ name: "db.query" }]`, a prototype-less literal. Spreading a literal is lossless, so the assertion passed identically whether the implementation spread or not: the test validated the stamp while being blind to the damage the stamp did. Replaced with a class-based fake and added assertions that `execute` and `renderCall` survive. Confirmed red-green — reverting to the spread fails it, the corrected stamp passes. ### medium — the shared `nonBlank` helpers stuttered the rule The previous commit appended `(must not be blank)` unconditionally, but 17 of 18 call sites already ended their text with `must not be blank`, so the model-facing wire schema read `"... must not be blank (must not be blank)"`. The append is now gated on whether the caller already states the rule; the one site that genuinely needed it (`body: nonBlank(STAMP_DESC)`) still gets it. Probed across both helper modules: 0 duplicates, 16 fields each stating the rule exactly once. ### low — helper-path message coverage, and prose Round 1's regression test covered only the hand-written `comms.ts` descriptions, which is exactly how the stutter shipped past it green. Added a sibling test over the shared-helper path in `forge.test.ts` that pins both the rejection message and the absence of stutter in the model-facing schema (`arkToWireSchema`), also confirmed red-green. Re-wrapped a paragraph in `subagent-tool-split.test.ts` left broken by the previous commit's edit. ### Verification - `bunx tsc --noEmit` — 0 errors - `bun test` — **679 pass / 0 fail** across 28 files - `biome check packages/compass-agent` — 0 errors - All three new tests confirmed red-green against their specific defect Spec-impact: none. Refs RIG-2407 Co-authored-by: Matt Wilkinson --- packages/compass-agent/src/board.ts | 6 ++- packages/compass-agent/src/cli.test.ts | 49 +++++++++++++++---- packages/compass-agent/src/cli.ts | 25 ++++++++-- packages/compass-agent/src/forge.test.ts | 29 +++++++++++ packages/compass-agent/src/forge.ts | 6 ++- .../src/subagent-tool-split.test.ts | 11 ++--- 6 files changed, 105 insertions(+), 21 deletions(-) diff --git a/packages/compass-agent/src/board.ts b/packages/compass-agent/src/board.ts index 4b2d40c8c..9ee7bbad4 100644 --- a/packages/compass-agent/src/board.ts +++ b/packages/compass-agent/src/board.ts @@ -84,7 +84,11 @@ export class BoardBroker { const nonBlank = (description: string) => type("string") .narrow((s, ctx) => s.trim().length > 0 || ctx.mustBe("non-blank")) - .describe(`${description} (must not be blank)`); + .describe( + description.includes("must not be blank") + ? description + : `${description} (must not be blank)`, + ); // The eight real board states, as the model-facing tokens the tool accepts. // ISSUE_STATE_UNSPECIFIED is deliberately absent: the closed enum rejects it at diff --git a/packages/compass-agent/src/cli.test.ts b/packages/compass-agent/src/cli.test.ts index 62ce845f7..0335d185a 100644 --- a/packages/compass-agent/src/cli.test.ts +++ b/packages/compass-agent/src/cli.test.ts @@ -2402,7 +2402,15 @@ interface SeenConfig { skills?: unknown[]; additionalExtensionPaths?: string[]; disableExtensionDiscovery?: boolean; - customTools?: unknown[]; + // Typed to the fields these tests actually read (name/loadMode plus the + // callable surface a stamp must preserve), so the compiler checks the access + // instead of an inline assertion fabricating the shape. + customTools?: { + name?: unknown; + loadMode?: unknown; + execute?: unknown; + renderCall?: unknown; + }[]; enableMCP?: boolean; autoApprove?: boolean; customSystemPrompt?: string; @@ -2448,7 +2456,24 @@ describe("main wires the mounted agent-config into createAgentSession", () => { ); const session = fakeSession(); - const mcpTools = [{ name: "db.query" }]; + // A CLASS instance, not an object literal: the real `mcp.tools` are + // `MCPTool` instances (pi-coding-agent src/mcp/tool-bridge.ts:492) whose + // `execute`/`renderCall` live on the PROTOTYPE. A plain-literal fixture + // spreads losslessly and so cannot see a stamp implemented with + // `{ ...tool }` shearing those methods off — the fixture must carry a + // prototype for the assertion below to defend anything. + class FakeMcpTool { + readonly name = "db.query"; + readonly mcpServerName = "db"; + readonly mcpToolName = "query"; + async execute() { + return { content: [] }; + } + renderCall() { + return "db.query"; + } + } + const mcpTools = [new FakeMcpTool()]; let connectedWith: Record | undefined; const seen: SeenConfig[] = []; await main( @@ -2506,14 +2531,20 @@ describe("main wires the mounted agent-config into createAgentSession", () => { // check passes while the tool is silently unreachable, which is the exact // failure the RIG-1741/CD-3 mount contract exists to prevent. for (const tool of mcpTools) { - expect(opts.customTools).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - name: tool.name, - loadMode: "essential", - }), - ]), + const stamped = opts.customTools?.find((t) => t.name === tool.name); + expect(stamped).toEqual( + expect.objectContaining({ + name: tool.name, + loadMode: "essential", + }), ); + // The stamp must PRESERVE the tool's callable surface. An MCP tool's + // `execute`/`renderCall` are prototype methods, so a stamp implemented + // as `{ ...tool }` drops them and the SDK adapter's `tool.execute(...)` + // throws at the first model call — a tool the model can see and cannot + // use, which is worse than one it never sees. Reddens on a spread. + expect(typeof stamped?.execute).toBe("function"); + expect(typeof stamped?.renderCall).toBe("function"); } expect(opts.enableMCP).toBe(false); }); diff --git a/packages/compass-agent/src/cli.ts b/packages/compass-agent/src/cli.ts index cfeadbb79..095700a0f 100644 --- a/packages/compass-agent/src/cli.ts +++ b/packages/compass-agent/src/cli.ts @@ -923,10 +923,27 @@ export async function main( // which is exactly the silent-no-surface failure the RIG-1741/CD-3 mount // contract exists to prevent. Stamped once here, at the single // registration seam, rather than in the four native factories. - customTools: [...mcp.tools, ...nativeTools].map((tool) => ({ - ...tool, - loadMode: "essential" as const, - })), + // + // NOT a spread. `mcp.tools` are `MCPTool` CLASS instances + // (pi-coding-agent src/mcp/tool-bridge.ts:492, built by `fromTools` at + // :514), whose `execute`/`renderCall`/`renderResult` live on the + // PROTOTYPE. `{ ...tool }` copies only own enumerable properties, so it + // would silently shear those methods off and the SDK adapter's + // `tool.execute(...)` call (sdk.ts:989) would throw `is not a function` + // at the first model invocation — a top-level-callable tool that crashes, + // strictly worse than a demoted one. Cloning onto the original prototype + // keeps the methods while still applying the mode without mutating the + // SDK's own objects. The natives are plain object literals, so they are + // unaffected either way and go through the same path for uniformity. + customTools: [...mcp.tools, ...nativeTools].map((tool) => + Object.assign( + Object.create(Object.getPrototypeOf(tool) as object), + tool, + { + loadMode: "essential" as const, + }, + ), + ), enableMCP: false, // Headless approval policy (RIG-1741, design compass-agent-comms-tools // §"the container runs headless with write-approval tools auto-executing"): diff --git a/packages/compass-agent/src/forge.test.ts b/packages/compass-agent/src/forge.test.ts index 16c1570b5..c96cfef75 100644 --- a/packages/compass-agent/src/forge.test.ts +++ b/packages/compass-agent/src/forge.test.ts @@ -14,6 +14,7 @@ import { describe, expect, test } from "bun:test"; import { ArkErrors, type Type } from "@oh-my-pi/omptype/ark"; import type { AgentTool, AgentToolResult } from "@oh-my-pi/pi-agent-core"; +import { arkToWireSchema } from "@oh-my-pi/pi-ai/utils/schema"; import { CommentRefSchema, create, @@ -964,6 +965,34 @@ describe("forge parameter schemas", () => { ); }); + // Message-level coverage for the SHARED `nonBlank` helper path. The + // comms.test.ts sibling pins the hand-written descriptions; this pins the + // helper, which is where a rule can go missing (or get stuttered) for a dozen + // fields at once. Under omptype a `.describe()` shadows the narrow's + // `ctx.mustBe(...)` reason, so the description is the only channel the rule + // reaches the model through — and it must say it exactly once. + test("the nonBlank helper states its rule in the message, exactly once", () => { + const out = createIssueParameters({ repo: "o/r", title: " " }); + if (!(out instanceof ArkErrors)) { + throw new Error("expected a blank title to be rejected"); + } + expect(out.summary).toContain("blank"); + + // No stutter: the helper appends the rule only when the caller's own text + // does not already carry it. Asserted on the MODEL-FACING wire schema (the + // same conversion the agent loop runs), since that is where a doubled rule + // would actually be shown. Reddens on an unconditional append. + const wire = arkToWireSchema(createIssueParameters); + const properties = + wire && typeof wire === "object" && "properties" in wire + ? wire.properties + : undefined; + expect(properties).toBeDefined(); + expect(JSON.stringify(properties)).not.toContain( + "blank (must not be blank)", + ); + }); + test("get_issue rejects a non-positive or non-integer issue number", () => { expect(rejects(getIssueParameters, { repo: "o/r", issue_number: 0 })).toBe( true, diff --git a/packages/compass-agent/src/forge.ts b/packages/compass-agent/src/forge.ts index b1137afd9..3f24928e0 100644 --- a/packages/compass-agent/src/forge.ts +++ b/packages/compass-agent/src/forge.ts @@ -122,7 +122,11 @@ export class ForgeBroker { const nonBlank = (description: string) => type("string") .narrow((s, ctx) => s.trim().length > 0 || ctx.mustBe("non-blank")) - .describe(`${description} (must not be blank)`); + .describe( + description.includes("must not be blank") + ? description + : `${description} (must not be blank)`, + ); // The optional multi-forge selector, spread into EVERY tool below. Unset = the // configured default GitHub forge (DL-202). Defined as a plain definition-object diff --git a/packages/compass-agent/src/subagent-tool-split.test.ts b/packages/compass-agent/src/subagent-tool-split.test.ts index ea30a0c49..3f066cc6a 100644 --- a/packages/compass-agent/src/subagent-tool-split.test.ts +++ b/packages/compass-agent/src/subagent-tool-split.test.ts @@ -7,12 +7,11 @@ // (`forge_*`) — reach the Manager session as `customTools` (cli.ts:926: // `customTools: [...mcp.tools, ...nativeTools].map(… loadMode: "essential")`). // An in-process `task` subagent (the design's worker topology) runs at full -// Manager trust in the -// SAME container, so its Compass reach is NOT a security boundary — it is a -// capability contract. The contract: a subagent gets the OMP builtin toolset -// (edit/read/bash/…) and `hub`, but NONE of Compass's native tools; peers and -// the Manager are reached over the OMP-internal peer channel, never a Compass -// channel. +// Manager trust in the SAME container, so its Compass reach is NOT a security +// boundary — it is a capability contract. The contract: a subagent gets the OMP +// builtin toolset (edit/read/bash/…) and `hub`, but NONE of Compass's native +// tools; peers and the Manager are reached over the OMP-internal peer channel, +// never a Compass channel. // // WHY BY-CONSTRUCTION TODAY, AND WHY PIN IT ANYWAY. The exclusion falls out of // the SDK's subagent construction: a subagent session's `customTools` is From 2dabb9b2fdf1ac4ba0939d9415a1c79f549abd3f Mon Sep 17 00:00:00 2001 From: mintaka Date: Sun, 6 Sep 2026 01:38:54 -0400 Subject: [PATCH 4/4] fix(compass-agent): stamp loadMode in place so SDK tool instances stay callable (RIG-2407) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Addresses round 3 of the review of #924. The clone from the previous commit was correct for `MCPTool` but broke its sibling class; this replaces the whole approach with in-place assignment, which removes the defect class rather than the instance of it. ### medium — the prototype clone breaks `DeferredMCPTool` `mcp.tools` is typed to carry both bridge classes. `MCPTool` survived cloning because its `private` members are TypeScript parameter properties — ordinary own enumerable props at runtime — so `Object.assign` copied them. `DeferredMCPTool` (`pi-coding-agent src/mcp/tool-bridge.ts:604`) instead declares `readonly #fallbackProvider` / `#fallbackProviderName` as **ECMAScript** `#private` fields, which are branded to the constructed instance and are not own properties at all. `Object.assign` cannot copy them, and its `execute` reads one immediately, so a cloned instance throws `TypeError: Cannot access invalid private field` at the model's first call. Not reachable today — the only `DeferredMCPTool` construction site sits behind a `this.toolCache` check and compass builds `new MCPManager(cwd, null)` — but that gate is incidental to compass's needs, nothing pins it, and an SDK bump supplying a default cache converts it into a hard first-call crash. It is also the same failure mode the previous commit was fixing, relocated one class over. Reproduced against a `#private`-bearing class: ``` clone typeof execute: function <- passes a presence check clone execute THREW: TypeError: Cannot access invalid private field MUTATED execute OK: {"ok":"s"} | loadMode: essential ``` ### the fix: assign, don't copy `loadMode` is a mutable field on `CustomTool` (`extensibility/custom-tools/types.ts:224`), so the mode can be set without reconstructing anything. Extracted a small `stampEssential` helper that assigns in place and returns the same array. Assignment is strictly better than either copy here, for three reasons beyond the `#private` break: - It preserves object identity, so `MCPTool.execute`'s connection rebinding on the auth-retry and reconnect paths keeps working on the instance the session actually holds. - It cannot desynchronize. A clone is taken once at boot, so it could never observe `MCPManager`'s wholesale tool-instance replacement on `reconnectServer` / `refreshServerTools`. - Compass owns this manager exclusively (`getTools()` feeds `customTools` and nothing else), so the previous comment's "without mutating the SDK's own objects" rationale was protecting no second consumer. ### low — the test could not see the break, and two citations had rotted The assertion checked `typeof execute === "function"`, which passes on a clone whose `execute` throws when invoked — proven above. `FakeMcpTool` also had no `#private` state and no `renderResult`, the third prototype method the contract names. The fixture now carries a `#private` field its `execute` reads plus a `renderResult`, and the assertion **calls** `execute` and checks its resolved value instead of probing for a key. Confirmed red-green: the `Object.create` clone now fails this test, where it previously passed. Repointed the two `cli.ts:926` citations in `subagent-tool-split.test.ts` to name the `customTools:` seam rather than a line number — that one expression has had three different line numbers across three commits, and this file is the drift alarm for exactly this seam, so a rotting pointer in it is worse than elsewhere. ### Verification - `bunx tsc --noEmit` — 0 errors - `bun test` — **679 pass / 0 fail** across 28 files - `biome check packages/compass-agent` — 0 errors (12 pre-existing warnings, all outside this delta) - `moon run compass-agent:ci` — 5/5 tasks pass - The strengthened assertion confirmed red against the previous commit's clone and green on in-place assignment Spec-impact: none. Refs RIG-2407 Co-authored-by: Matt Wilkinson --- packages/compass-agent/src/cli.test.ts | 47 ++++++++++----- packages/compass-agent/src/cli.ts | 58 ++++++++++++------- .../src/subagent-tool-split.test.ts | 9 +-- 3 files changed, 77 insertions(+), 37 deletions(-) diff --git a/packages/compass-agent/src/cli.test.ts b/packages/compass-agent/src/cli.test.ts index 0335d185a..b98f7ec60 100644 --- a/packages/compass-agent/src/cli.test.ts +++ b/packages/compass-agent/src/cli.test.ts @@ -2410,6 +2410,7 @@ interface SeenConfig { loadMode?: unknown; execute?: unknown; renderCall?: unknown; + renderResult?: unknown; }[]; enableMCP?: boolean; autoApprove?: boolean; @@ -2456,22 +2457,31 @@ describe("main wires the mounted agent-config into createAgentSession", () => { ); const session = fakeSession(); - // A CLASS instance, not an object literal: the real `mcp.tools` are - // `MCPTool` instances (pi-coding-agent src/mcp/tool-bridge.ts:492) whose - // `execute`/`renderCall` live on the PROTOTYPE. A plain-literal fixture - // spreads losslessly and so cannot see a stamp implemented with - // `{ ...tool }` shearing those methods off — the fixture must carry a - // prototype for the assertion below to defend anything. + // A CLASS instance with `#private` state, not an object literal. The real + // `mcp.tools` are SDK class instances: `MCPTool` (pi-coding-agent + // src/mcp/tool-bridge.ts:492) keeps `execute`/`renderCall`/`renderResult` + // on the PROTOTYPE, and its sibling `DeferredMCPTool` (:604) also holds + // ECMAScript `#private` fields its `execute` reads. Both properties matter + // to the fixture: a plain literal spreads losslessly (so it cannot see a + // `{ ...tool }` stamp shear the methods off), and a fixture without + // `#private` state cannot see an `Object.create` clone re-home `this` — + // that break passes a `typeof execute === "function"` check and only + // surfaces when the method is actually CALLED, which is why the assertion + // below invokes it. class FakeMcpTool { readonly name = "db.query"; readonly mcpServerName = "db"; readonly mcpToolName = "query"; + readonly #server = "db"; async execute() { - return { content: [] }; + return { content: [], server: this.#server }; } renderCall() { return "db.query"; } + renderResult() { + return "db.query result"; + } } const mcpTools = [new FakeMcpTool()]; let connectedWith: Record | undefined; @@ -2538,13 +2548,24 @@ describe("main wires the mounted agent-config into createAgentSession", () => { loadMode: "essential", }), ); - // The stamp must PRESERVE the tool's callable surface. An MCP tool's - // `execute`/`renderCall` are prototype methods, so a stamp implemented - // as `{ ...tool }` drops them and the SDK adapter's `tool.execute(...)` - // throws at the first model call — a tool the model can see and cannot - // use, which is worse than one it never sees. Reddens on a spread. - expect(typeof stamped?.execute).toBe("function"); + // The stamp must preserve the tool's callable surface AND its identity. + // All three of `execute`/`renderCall`/`renderResult` are prototype + // methods, so a `{ ...tool }` stamp drops them outright; an + // `Object.create` clone keeps them but re-homes `this`, so a + // `#private` read throws only when the method is INVOKED. Presence + // checks pass in that second case, so the contract is asserted by + // actually calling `execute` — a tool the model can see and cannot + // call is worse than one it never sees. expect(typeof stamped?.renderCall).toBe("function"); + expect(typeof stamped?.renderResult).toBe("function"); + const execute = stamped?.execute; + if (typeof execute !== "function") { + throw new Error("the stamp dropped the tool's execute method"); + } + await expect(execute.call(stamped)).resolves.toEqual({ + content: [], + server: "db", + }); } expect(opts.enableMCP).toBe(false); }); diff --git a/packages/compass-agent/src/cli.ts b/packages/compass-agent/src/cli.ts index 095700a0f..aac6518c2 100644 --- a/packages/compass-agent/src/cli.ts +++ b/packages/compass-agent/src/cli.ts @@ -34,6 +34,7 @@ import type { Stats } from "node:fs"; import { lstat, mkdir, readlink, rm, symlink } from "node:fs/promises"; import { join } from "node:path"; +import type { ToolLoadMode } from "@oh-my-pi/pi-agent-core"; import type { ApiKey, Model } from "@oh-my-pi/pi-ai"; import { type AgentSession, @@ -382,6 +383,25 @@ async function connectMountedMcp( }; } +/** + * Mark every custom tool `essential` so it lands in the model's top-level + * callable schema, and return the same array. + * + * Assigns in place BY DESIGN — see the `customTools` seam in `main` for why + * copying is unsafe here (SDK tools are class instances with prototype methods + * and `#private` state, so a spread or clone yields a tool the model can see + * and cannot call). `loadMode` is a mutable field on `CustomTool`, so this + * preserves object identity. + */ +function stampEssential( + tools: T[], +): T[] { + for (const tool of tools) { + tool.loadMode = "essential"; + } + return tools; +} + /** * The user-level agent dir the SDK's native discovery anchors on inside the * container: `$HOME/.omp/agent` (`getAgentDir()` default, dirs.ts). The @@ -924,26 +944,24 @@ export async function main( // contract exists to prevent. Stamped once here, at the single // registration seam, rather than in the four native factories. // - // NOT a spread. `mcp.tools` are `MCPTool` CLASS instances - // (pi-coding-agent src/mcp/tool-bridge.ts:492, built by `fromTools` at - // :514), whose `execute`/`renderCall`/`renderResult` live on the - // PROTOTYPE. `{ ...tool }` copies only own enumerable properties, so it - // would silently shear those methods off and the SDK adapter's - // `tool.execute(...)` call (sdk.ts:989) would throw `is not a function` - // at the first model invocation — a top-level-callable tool that crashes, - // strictly worse than a demoted one. Cloning onto the original prototype - // keeps the methods while still applying the mode without mutating the - // SDK's own objects. The natives are plain object literals, so they are - // unaffected either way and go through the same path for uniformity. - customTools: [...mcp.tools, ...nativeTools].map((tool) => - Object.assign( - Object.create(Object.getPrototypeOf(tool) as object), - tool, - { - loadMode: "essential" as const, - }, - ), - ), + // Stamped IN PLACE, never by copying. `mcp.tools` are SDK class instances + // (`MCPTool`, pi-coding-agent src/mcp/tool-bridge.ts:492) whose + // `execute`/`renderCall`/`renderResult` live on the PROTOTYPE, and its + // sibling `DeferredMCPTool` (:604) additionally holds ECMAScript + // `#private` state. Neither a spread nor an `Object.create` clone can + // carry that: a spread drops the prototype methods outright, and a clone + // keeps the methods but re-homes `this`, so a `#private` read throws + // `Cannot access invalid private field` at the model's FIRST call — a + // tool the model can see and cannot use, which is worse than a demoted + // one. `loadMode` is a mutable field on `CustomTool` + // (extensibility/custom-tools/types.ts:224), so assigning it preserves + // object identity: the methods, the private state, and the connection + // rebinding `MCPTool.execute` performs on reconnect all keep working, + // and the session cannot drift onto a stale copy. Compass owns this + // manager exclusively (built above; `getTools()` feeds `customTools` and + // nothing else), so there is no second consumer to isolate from the + // assignment. + customTools: stampEssential([...mcp.tools, ...nativeTools]), enableMCP: false, // Headless approval policy (RIG-1741, design compass-agent-comms-tools // §"the container runs headless with write-approval tools auto-executing"): diff --git a/packages/compass-agent/src/subagent-tool-split.test.ts b/packages/compass-agent/src/subagent-tool-split.test.ts index 3f066cc6a..152f855dc 100644 --- a/packages/compass-agent/src/subagent-tool-split.test.ts +++ b/packages/compass-agent/src/subagent-tool-split.test.ts @@ -4,8 +4,9 @@ // WHAT THIS DEFENDS. Compass's native tools — the comms surface // (`comms_post_message`, `compass_roster`, …), the lifecycle surface // (`agents_spawn_peer`, `agents_despawn_peer`), and the forge surface -// (`forge_*`) — reach the Manager session as `customTools` (cli.ts:926: -// `customTools: [...mcp.tools, ...nativeTools].map(… loadMode: "essential")`). +// (`forge_*`) — reach the Manager session as `customTools` (cli.ts, the +// `customTools:` registration seam in `main`: +// `customTools: stampEssential([...mcp.tools, ...nativeTools])`). // An in-process `task` subagent (the design's worker topology) runs at full // Manager trust in the SAME container, so its Compass reach is NOT a security // boundary — it is a capability contract. The contract: a subagent gets the OMP @@ -164,8 +165,8 @@ async function activeToolNames( } } -// The Manager session shape: Compass native tools ride `customTools` -// (cli.ts:926). The subagent session shape: a real in-process subagent +// The Manager session shape: Compass native tools ride `customTools` (cli.ts, +// the `customTools:` seam). The subagent session shape: a real in-process subagent // (`taskDepth: 1`) with no `customTools` — the SDK's subagent path sets // `customTools` from `mcpProxyTools`, which is empty because Compass passes no // `mcpManager` (src/task/executor.ts:3113/:3234), so a child inherits none of the