diff --git a/.husky/commit-msg b/.husky/commit-msg index 5ade170..2e6b87e 100644 --- a/.husky/commit-msg +++ b/.husky/commit-msg @@ -1 +1 @@ -node node_modules/.bin/commitlint --edit "$1" +pnpm exec commitlint --edit "$1" diff --git a/.husky/pre-commit b/.husky/pre-commit index 3b17df7..bb3f578 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,4 @@ STAGED=$(git diff --cached --name-only --diff-filter=ACMR | grep -E '\.(ts|tsx)$' | grep -v '\.d\.ts$' || true) if [ -n "$STAGED" ]; then - node node_modules/.bin/eslint --fix $STAGED 2>&1 + pnpm exec eslint --fix $STAGED 2>&1 fi diff --git a/.husky/pre-push b/.husky/pre-push index 32e961f..67aa132 100644 --- a/.husky/pre-push +++ b/.husky/pre-push @@ -1 +1 @@ -node node_modules/.bin/eslint . 2>&1 && node node_modules/.bin/tsc --noEmit 2>&1 && node node_modules/.bin/vitest run 2>&1 +pnpm exec eslint . 2>&1 && pnpm exec tsc --noEmit 2>&1 && pnpm exec vitest run 2>&1 diff --git a/.npmrc b/.npmrc index aafbf83..98d78df 100644 --- a/.npmrc +++ b/.npmrc @@ -1,4 +1,2 @@ -minimum-release-age=10080 -minimum-release-age-exclude[]=@mariozechner/* -minimum-release-age-exclude[]=wire-mesh-core -minimum-release-age-exclude[]=cddl.js +save-exact=true +minimum-release-age-exclude[]=@exadev/eslint-config diff --git a/eslint.config.ts b/eslint.config.ts index d6bf5bf..5b2f798 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -1,62 +1,14 @@ import { dirname } from "node:path"; import { fileURLToPath } from "node:url"; import { defineConfig } from "eslint/config"; -import type { Rule } from "eslint"; import json from "@eslint/json"; import markdown from "@eslint/markdown"; import eslintConfigPrettier from "eslint-config-prettier/flat"; import eslintPluginPrettier from "eslint-plugin-prettier"; -import tseslint from "typescript-eslint"; +import exadev from "@exadev/eslint-config"; const tsconfigRootDir = dirname(fileURLToPath(import.meta.url)); -// ─── Custom rules ──────────────────────────────────────────────────────────── - -const noPointlessReassignments: Rule.RuleModule = { - meta: { - type: "problem", - messages: { - pointlessReassignment: - "Pointless reassignment. {{ name }} is just an alias for {{ value }}. Use the original directly instead.", - }, - }, - create(context) { - return { - VariableDeclarator(node) { - if (node.id.type !== "Identifier" || node.init?.type !== "Identifier") { - return; - } - if (node.id.name.startsWith("_")) { - return; - } - // A `let`/`var` binding can be legitimately reassigned later (e.g. a loop-mutated value initialised from a starting constant, then updated each iteration) -- only `const` genuinely guarantees the binding is nothing but a permanent alias for its initializer, since a `const` can never be written to again. Without this check the rule fired on exactly that pattern (`let delayMs = INITIAL_RETRY_DELAY_MS` ahead of a loop that reassigns `delayMs` every iteration), which is not a pointless reassignment at all. - if ( - node.parent.type === "VariableDeclaration" && - node.parent.kind !== "const" - ) { - return; - } - context.report({ - node, - messageId: "pointlessReassignment", - data: { - name: node.id.name, - value: node.init.name, - }, - }); - }, - }; - }, -}; - -const customPlugin = { - rules: { - "no-pointless-reassignments": noPointlessReassignments, - }, -}; - -// ─── Config ────────────────────────────────────────────────────────────────── - export default defineConfig( { // .stryker-tmp holds Stryker's own instrumented sandbox copies of the source (each mutant gets a full copy, deliberately carrying a @ts-nocheck pragma Stryker injects itself) -- linting them produces thousands of irrelevant errors against generated, throwaway code, not anything committed. reports/ is Stryker's own output (HTML/JSON), same reasoning. @@ -68,13 +20,14 @@ export default defineConfig( "reports/**", ], }, + ...exadev, + // Several directories under src/ use index.ts as a real module (interfaces, functions, a default export), not a re-export barrel -- barrel-policy only restricts files that actually contain re-exports, so this override is scoped to permitting the pattern, not to exempting those files from anything they weren't already going to pass. src/core/index.ts is a genuine re-export barrel and the package's own entry point; every one of its re-exports comes from a direct sibling (confirmed directly), so 'siblings' -- not 'single', which only ever recognises the literal path src/index.ts -- is the mode that actually matches this repo's real layout. Scoped to TS/TSX: the exadev plugin namespace is only registered on the JS/TS-scoped config objects @exadev/eslint-config's own array contributes, so an unscoped override here would fail to resolve "exadev/barrel-policy" while linting a JSON or Markdown file. + { + files: ["**/*.{ts,tsx}"], + rules: { "exadev/barrel-policy": ["error", { mode: "siblings" }] }, + }, { files: ["**/*.{ts,tsx}"], - extends: [ - ...tseslint.configs.recommendedTypeChecked, - ...tseslint.configs.strictTypeChecked, - ...tseslint.configs.stylisticTypeChecked, - ], languageOptions: { parserOptions: { projectService: { @@ -98,18 +51,12 @@ export default defineConfig( }, plugins: { prettier: eslintPluginPrettier, - custom: customPlugin, }, rules: { "@typescript-eslint/no-unused-vars": [ "error", { argsIgnorePattern: "^_" }, ], - "@typescript-eslint/consistent-type-assertions": [ - "error", - { assertionStyle: "never" }, - ], - "custom/no-pointless-reassignments": "error", "no-restricted-syntax": [ "error", { @@ -125,10 +72,6 @@ export default defineConfig( ], "prettier/prettier": "error", "@typescript-eslint/require-await": "warn", - "max-lines": [ - "error", - { max: 800, skipBlankLines: true, skipComments: true }, - ], }, }, eslintConfigPrettier, diff --git a/package.json b/package.json index 2bbe338..e00976f 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "2.21.6", "description": "Cross-harness communication mesh for LLM agents — rooms, DMs, presence, and real-time push delivery over TCP", "type": "module", - "packageManager": "pnpm@10.33.0", + "packageManager": "pnpm@12.4.1+sha512.2e81e399d73fe8390dab25e06aa788ab7a5908248d2f5a370f82b481147a6a7a367bf8048f9a6fdb6460f21a66f0542dedb8b94ca2c8723596741920b1656d4c", "repository": { "type": "git", "url": "git+https://github.com/ExaDev/agent-comms.git" @@ -66,6 +66,7 @@ "@commitlint/types": "21.2.0", "@eslint/json": "2.0.1", "@eslint/markdown": "8.0.3", + "@exadev/eslint-config": "2.12.3", "@mariozechner/pi-ai": "0.73.1", "@mariozechner/pi-coding-agent": "0.73.1", "@playwright/test": "1.61.1", @@ -112,7 +113,7 @@ }, "pi": { "extensions": [ - "./src/bridges/pi/index.ts" + "./src/bridges/pi/extension.ts" ] } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8e4dcf0..b438ae1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,3 +1,161 @@ +--- +lockfileVersion: '9.0' + +importers: + + .: + configDependencies: {} + packageManagerDependencies: + pnpm: + specifier: 12.4.1 + version: 12.4.1 + +packages: + + '@pnpm/exe.android-arm64@12.4.1': + resolution: {integrity: sha512-/HwsqXMSmlOfgtV9+O0ratzjV6Vd/8n1hh4rGHpCGmDURvt52MwZxdbhyxP4K03ZfvgSDvotFPr8O+RzE5Eu8A==} + cpu: [arm64] + os: [android] + + '@pnpm/exe.android-x64@12.4.1': + resolution: {integrity: sha512-+l74Qb4c2YjOzNKHXJLg+1wr8xHM1ckkUhnU5KRUK9TJqiiczt6yeTZqqzHIlJ8i6pAoj5V0OJevDRwnQKLgrQ==} + cpu: [x64] + os: [android] + + '@pnpm/exe.darwin-arm64@12.4.1': + resolution: {integrity: sha512-6rkZkT3iGfaxknUdGHraqSWFvTa6N0ajAHluv9Ax0GRWs0sIcGNiFhDopv6xSZCsJZmG483aNS/b6UEDy3blfw==} + cpu: [arm64] + os: [darwin] + + '@pnpm/exe.darwin-x64@12.4.1': + resolution: {integrity: sha512-Vb1CHlR88HghC1qUxjxjs82zQSXnXacPD+btG2CmG8Q/hBU7Q0/b2YWJKSQqZXicunV5khFtfTlAwJddV9RkYA==} + cpu: [x64] + os: [darwin] + + '@pnpm/exe.freebsd-x64@12.4.1': + resolution: {integrity: sha512-iT3iHz3Nl0Sxxj7UPOtZ/aQ81AFsQhjoeWMAlPkSRO04gsgDGAXv3UYxOFaesMWsfNxaGn0A+CITbuCHFF66FA==} + cpu: [x64] + os: [freebsd] + + '@pnpm/exe.linux-arm64-musl@12.4.1': + resolution: {integrity: sha512-aBooZfNXM5f+OGUgCAMFWpE/kAhsWfvmqIyMtHy6zl3aNxyInWrcY/Saln/UElzo7lZWMC0Yktroxd/2J26lNQ==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@pnpm/exe.linux-arm64@12.4.1': + resolution: {integrity: sha512-TlOdacTTP09BgcMvwWBFRsu8VAjfwqwnslBj+XSq1JFM3ck4f3k+1O/747EuctxZxs3/o785b6Q3s7Pd92Ptsg==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-ppc64@12.4.1': + resolution: {integrity: sha512-r/ab/MlIBo75oizUP5ITiziCCrnXz4SJwfErLQ+603AshB+Yq7xTMCoMtzTSCAMu6aaymIKkAFtZvd2J75Wq0w==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-riscv64@12.4.1': + resolution: {integrity: sha512-C/D1QWdKMiB8+wv/spl1rGITFUuqC+aI/fb6h8NB5sqxsOaGXeYc/g891oCuzggHn6SODk9p+I09hI76x/cMNw==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-s390x@12.4.1': + resolution: {integrity: sha512-nxz5zD4yXt94uzbStDk0QTPKW+aE92hH1b5tFXK9ctB1HE9Xcq1vjTiA2LsZMFC6p4gdu5OwQeFqYNAVGa6QlA==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-x64-musl@12.4.1': + resolution: {integrity: sha512-5AwgFdGhVUg2kIweYGfxzSLEHiIG77PQhZAkXC3TwofQHsu1Wr+TrV5/rNX2PopFnHRzuE581zoB8F6Wle32yg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@pnpm/exe.linux-x64@12.4.1': + resolution: {integrity: sha512-FJOZuuuQMhp0oLzBtcKkLXknBI92hfkmSnlKc47vfin4HrmfID5khY2lGekL9tCzk1cpR+HShEw/meFl+nHtzQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.win32-arm64@12.4.1': + resolution: {integrity: sha512-OO7eKBL9S+xk5hRy+JUUZSNJknGuGe3GEUffsrlC2LbqKF02g+VX1anGIzSbJDvkkdnpJhSlxF5AUz2JzJu2Jw==} + cpu: [arm64] + os: [win32] + + '@pnpm/exe.win32-x64@12.4.1': + resolution: {integrity: sha512-x7gJHZgHo6hp354xCYA2NvoFzYJkHwovt2kVsUBK5EmXULLcP51JGMq09CX+5FRFJUZFKoXjLu3mZWmfP7o6PQ==} + cpu: [x64] + os: [win32] + + pnpm@12.4.1: + resolution: {integrity: sha512-LoHjmdc/6DkNqyXgaqeIq3pZCCSNL1o3D4K0gRR6ano2e/gEj5pv22Rg8hpm8FQt7bi5TKLIcjWWdBkgsWVtTA==} + engines: {node: '>=18.*'} + hasBin: true + +snapshots: + + '@pnpm/exe.android-arm64@12.4.1': + optional: true + + '@pnpm/exe.android-x64@12.4.1': + optional: true + + '@pnpm/exe.darwin-arm64@12.4.1': + optional: true + + '@pnpm/exe.darwin-x64@12.4.1': + optional: true + + '@pnpm/exe.freebsd-x64@12.4.1': + optional: true + + '@pnpm/exe.linux-arm64-musl@12.4.1': + optional: true + + '@pnpm/exe.linux-arm64@12.4.1': + optional: true + + '@pnpm/exe.linux-ppc64@12.4.1': + optional: true + + '@pnpm/exe.linux-riscv64@12.4.1': + optional: true + + '@pnpm/exe.linux-s390x@12.4.1': + optional: true + + '@pnpm/exe.linux-x64-musl@12.4.1': + optional: true + + '@pnpm/exe.linux-x64@12.4.1': + optional: true + + '@pnpm/exe.win32-arm64@12.4.1': + optional: true + + '@pnpm/exe.win32-x64@12.4.1': + optional: true + + pnpm@12.4.1: + optionalDependencies: + '@pnpm/exe.android-arm64': 12.4.1 + '@pnpm/exe.android-x64': 12.4.1 + '@pnpm/exe.darwin-arm64': 12.4.1 + '@pnpm/exe.darwin-x64': 12.4.1 + '@pnpm/exe.freebsd-x64': 12.4.1 + '@pnpm/exe.linux-arm64': 12.4.1 + '@pnpm/exe.linux-arm64-musl': 12.4.1 + '@pnpm/exe.linux-ppc64': 12.4.1 + '@pnpm/exe.linux-riscv64': 12.4.1 + '@pnpm/exe.linux-s390x': 12.4.1 + '@pnpm/exe.linux-x64': 12.4.1 + '@pnpm/exe.linux-x64-musl': 12.4.1 + '@pnpm/exe.win32-arm64': 12.4.1 + '@pnpm/exe.win32-x64': 12.4.1 + +--- lockfileVersion: '9.0' settings: @@ -5,16 +163,16 @@ settings: excludeLinksFromLockfile: false overrides: + '@anthropic-ai/sdk': '>=0.91.1' + basic-ftp: '>=6.0.1' + brace-expansion: '>=5.0.6' + conventional-changelog-writer: ^9.2.0 fast-uri: '>=3.1.2' - protobufjs: ^7.6.1 fast-xml-parser: '>=5.8.0' - ip-address: '>=10.2.0' hono: ^4.12.18 - brace-expansion: '>=5.0.6' + ip-address: '>=10.2.0' + protobufjs: ^7.6.1 qs: '>=6.15.2' - basic-ftp: '>=6.0.1' - '@anthropic-ai/sdk': '>=0.91.1' - conventional-changelog-writer: ^9.2.0 importers: @@ -22,7 +180,7 @@ importers: dependencies: '@modelcontextprotocol/sdk': specifier: 1.30.0 - version: 1.30.0(zod@4.4.3) + version: 1.30.0(supports-color@7.2.0)(zod@4.4.3) '@sinclair/typebox': specifier: '*' version: 0.34.49 @@ -59,34 +217,37 @@ importers: version: 2.0.1 '@eslint/markdown': specifier: 8.0.3 - version: 8.0.3 + version: 8.0.3(supports-color@7.2.0) + '@exadev/eslint-config': + specifier: 2.12.3 + version: 2.12.3(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-eslint@8.69.0(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(typescript@6.0.3) '@mariozechner/pi-ai': specifier: 0.73.1 - version: 0.73.1(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(ws@8.21.1)(zod@4.4.3) + version: 0.73.1(@modelcontextprotocol/sdk@1.30.0(supports-color@7.2.0)(zod@4.4.3))(supports-color@7.2.0)(ws@8.21.1)(zod@4.4.3) '@mariozechner/pi-coding-agent': specifier: 0.73.1 - version: 0.73.1(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(ws@8.21.1)(zod@4.4.3) + version: 0.73.1(@modelcontextprotocol/sdk@1.30.0(supports-color@7.2.0)(zod@4.4.3))(supports-color@7.2.0)(ws@8.21.1)(zod@4.4.3) '@playwright/test': specifier: 1.61.1 version: 1.61.1 '@semantic-release/changelog': specifier: 6.0.3 - version: 6.0.3(semantic-release@25.0.7(typescript@6.0.3)) + version: 6.0.3(semantic-release@25.0.7(supports-color@7.2.0)(typescript@6.0.3)) '@semantic-release/commit-analyzer': specifier: 13.0.1 - version: 13.0.1(semantic-release@25.0.7(typescript@6.0.3)) + version: 13.0.1(semantic-release@25.0.7(supports-color@7.2.0)(typescript@6.0.3))(supports-color@7.2.0) '@semantic-release/exec': specifier: 7.1.0 - version: 7.1.0(semantic-release@25.0.7(typescript@6.0.3)) + version: 7.1.0(semantic-release@25.0.7(supports-color@7.2.0)(typescript@6.0.3))(supports-color@7.2.0) '@semantic-release/git': specifier: 10.0.1 - version: 10.0.1(semantic-release@25.0.7(typescript@6.0.3)) + version: 10.0.1(semantic-release@25.0.7(supports-color@7.2.0)(typescript@6.0.3))(supports-color@7.2.0) '@semantic-release/github': specifier: 12.0.9 - version: 12.0.9(semantic-release@25.0.7(typescript@6.0.3)) + version: 12.0.9(semantic-release@25.0.7(supports-color@7.2.0)(typescript@6.0.3))(supports-color@7.2.0) '@semantic-release/release-notes-generator': specifier: 14.1.1 - version: 14.1.1(semantic-release@25.0.7(typescript@6.0.3)) + version: 14.1.1(semantic-release@25.0.7(supports-color@7.2.0)(typescript@6.0.3))(supports-color@7.2.0) '@stryker-mutator/api': specifier: 10.0.0 version: 10.0.0 @@ -113,13 +274,13 @@ importers: version: 0.28.1 eslint: specifier: 10.7.0 - version: 10.7.0(jiti@2.7.0) + version: 10.7.0(jiti@2.7.0)(supports-color@7.2.0) eslint-config-prettier: specifier: 10.1.8 - version: 10.1.8(eslint@10.7.0(jiti@2.7.0)) + version: 10.1.8(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0)) eslint-plugin-prettier: specifier: 5.5.6 - version: 5.5.6(eslint-config-prettier@10.1.8(eslint@10.7.0(jiti@2.7.0)))(eslint@10.7.0(jiti@2.7.0))(prettier@3.9.5) + version: 5.5.6(eslint-config-prettier@10.1.8(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0)))(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(prettier@3.9.5) happy-dom: specifier: 20.10.6 version: 20.10.6 @@ -134,7 +295,7 @@ importers: version: 3.9.5 semantic-release: specifier: 25.0.7 - version: 25.0.7(typescript@6.0.3) + version: 25.0.7(supports-color@7.2.0)(typescript@6.0.3) tsx: specifier: ^4.23.1 version: 4.23.1 @@ -143,7 +304,7 @@ importers: version: 6.0.3 typescript-eslint: specifier: 8.69.0 - version: 8.69.0(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3) + version: 8.69.0(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) vitest: specifier: 5.0.0 version: 5.0.0(@types/node@26.1.1)(happy-dom@20.10.6)(vite@8.2.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) @@ -540,6 +701,14 @@ packages: resolution: {integrity: sha512-LfUFi+Vv4eDzj+XAtR89e3wwjXA/NZjUSwU5NhwbBrLecxPaBYFy3exCuc1j+D4UZeOVdqlsl8G7LmOt18V0tg==} engines: {node: '>=20'} + '@es-joy/jsdoccomment@0.97.0': + resolution: {integrity: sha512-EP8uoFfh6+GsdGCduYtmWAW0h7AO+Ayik9Vh5YbA2r/3N6lmJKkCNZX+q3QBXC1K6ixjQ/9igF2b7WVvLm063g==} + engines: {node: ^22.22.2 || >=24.15.0} + + '@es-joy/resolve.exports@1.2.0': + resolution: {integrity: sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==} + engines: {node: '>=10'} + '@esbuild/aix-ppc64@0.28.1': resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} engines: {node: '>=18'} @@ -724,6 +893,15 @@ packages: resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@eslint/js@10.0.1': + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true + '@eslint/json@2.0.1': resolution: {integrity: sha512-Thz2j92ceUF3Bq/0TuWb3MWn3Z+Cwc8k5ptF0fakl2D4Mp8mSx07Xr1aQM4R5NoihzarWUdxfOmQ8DesGy4jOg==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -740,6 +918,27 @@ packages: resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@exadev/eslint-config@2.12.3': + resolution: {integrity: sha512-gs6yKJhngCnC8AJtthvr8Tq0pNzmNzIKnFEJLaoh24sw8PK0WntpLUB+0Fxv53Soos4Ju0pSBNCufmYljGwaVg==} + engines: {node: '>=20'} + peerDependencies: + '@next/eslint-plugin-next': ^16.3.2 + eslint: '>=10.0.0' + eslint-plugin-jsx-a11y: ^6.10.2 + eslint-plugin-react: ^7.37.5 + eslint-plugin-react-hooks: ^7.1.1 + typescript: '>=4.8.4' + typescript-eslint: '>=8.0.0' + peerDependenciesMeta: + '@next/eslint-plugin-next': + optional: true + eslint-plugin-jsx-a11y: + optional: true + eslint-plugin-react: + optional: true + eslint-plugin-react-hooks: + optional: true + '@google/genai@1.52.0': resolution: {integrity: sha512-gwSvbpiN/17O9TbsqSsE/OzZcpv5Fo4RQjdngGgogtuB9RsyJ8ZHhX5KjHj1bp5N9snN2eK8LDGXSaWW2hof8Q==} engines: {node: '>=20.0.0'} @@ -1016,6 +1215,12 @@ packages: engines: {node: '>=20.0.0'} deprecated: please use @earendil-works/pi-tui instead going forward + '@microsoft/tsdoc-config@0.18.1': + resolution: {integrity: sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==} + + '@microsoft/tsdoc@0.16.0': + resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==} + '@mistralai/mistralai@2.4.1': resolution: {integrity: sha512-vNpR2GR76aW7fK8Dcu1NRx3fdSPO1QruRDo4GbfXfkro2mvp194xIAvJ2BP4ZykzyWtJoDmBe+Qsk9D443aqlg==} peerDependencies: @@ -1307,6 +1512,10 @@ packages: '@sinclair/typebox@0.34.49': resolution: {integrity: sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==} + '@sindresorhus/base62@1.0.0': + resolution: {integrity: sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==} + engines: {node: '>=18'} + '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} @@ -1420,6 +1629,9 @@ packages: '@types/node@26.1.1': resolution: {integrity: sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==} + '@types/node@26.5.1': + resolution: {integrity: sha512-CzNm2FezW4VR/LjG6yUdiEgLE/rAQ9Slj5gCu/C2VrdcW7I0ahNZ8DRbHT7zOZ6r3ONgd/bsQIeSaoDGrd1C6g==} + '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -1453,16 +1665,48 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/project-service@8.56.1': + resolution: {integrity: sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.67.0': + resolution: {integrity: sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/project-service@8.69.0': resolution: {integrity: sha512-yi4obFrHMmnsesWehHbkg9zMA7Jt8cXT+mKM08G999pH1yT6nqgsHx7MYm0uY1wAj8CqiBXYRJ7WAT0QdQHQXg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/scope-manager@8.56.1': + resolution: {integrity: sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/scope-manager@8.67.0': + resolution: {integrity: sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.69.0': resolution: {integrity: sha512-ewfspqWvSxKSOaplqAUNbaSFO0eB6w1EtQ+esfYFRm3614Ty4uNtExkcbgd6nWsXphbqKyf9ZYdbZdv2xEoWEQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/tsconfig-utils@8.56.1': + resolution: {integrity: sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/tsconfig-utils@8.67.0': + resolution: {integrity: sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/tsconfig-utils@8.69.0': resolution: {integrity: sha512-xNqK7YTDZsLniQMV/4rpFR8Z5JlqeRvVjuG1YgF/mdPVH84HSD19L8CczMA0qg2RfwEV231GHH3VnToJDo4MfQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1476,16 +1720,50 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/types@8.56.1': + resolution: {integrity: sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/types@8.67.0': + resolution: {integrity: sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.69.0': resolution: {integrity: sha512-K3VrubUPhlo9VDBS6QdI8YB5j7ClpqLRdefcz6PFrhnwicehBweqQ9Evhl4l+FYz0HdDmMqIiSX0aldGRYtDCA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.56.1': + resolution: {integrity: sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/typescript-estree@8.67.0': + resolution: {integrity: sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/typescript-estree@8.69.0': resolution: {integrity: sha512-AdFkgqck3Vudb/kWnxlyafU/4aBhHrbQ9locP2N4psXTy5mOBg0SHJumnLvx7r6g1gV4DKvUFwV2nJZBoqOD8w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/utils@8.56.1': + resolution: {integrity: sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@8.67.0': + resolution: {integrity: sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/utils@8.69.0': resolution: {integrity: sha512-tUbx60BBqQa31kXF5MCsOOLL5E/WzUuxIn7YpAvq+eaUlqvk8/NXnXMBNAdLCr0icjkzem7iUA5QqWHe/hJ1aw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1493,6 +1771,14 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/visitor-keys@8.56.1': + resolution: {integrity: sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/visitor-keys@8.67.0': + resolution: {integrity: sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.69.0': resolution: {integrity: sha512-+rmdgPA+EXkNgKYvHvFfhrs35utXbwaC5PGpDquSXcoXQDKUA5UjV0LmTucG/4JXkM31BTu4TilHtrN8IVBe8w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1552,6 +1838,9 @@ packages: ajv@6.15.0: resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + ajv@8.18.0: + resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} @@ -1586,6 +1875,10 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + are-docs-informative@0.1.1: + resolution: {integrity: sha512-sqRsNQBwbKLRX0jV5Cu5uzmtflf892n4Vukz7T659ebL4pz3mpOqCMU7lxMoBTFwnp10E3YB5ZcyHM41W5bcDA==} + engines: {node: '>=18'} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -1785,6 +2078,10 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} + comment-parser@1.4.8: + resolution: {integrity: sha512-rKZTGo4fzKYna8UcL0isTg5wkBNla7bxTypLwZQXjIdi++IdP1OJ41rI5Mti3/jltkPujbu4i9LIARYA+zpotQ==} + engines: {node: '>= 12.0.0'} + compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} @@ -2057,6 +2354,12 @@ packages: peerDependencies: eslint: '>=7.0.0' + eslint-plugin-jsdoc@64.3.6: + resolution: {integrity: sha512-lo7IXmgUUNy88SxW7KnJmmD2iPQBIRMomfCFPHidW1M3zNNVuzxlB2uoNrNyE1g4v2/L+RtYmiROPwQhSNzL8Q==} + engines: {node: ^22.22.2 || >=24.15.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 + eslint-plugin-prettier@5.5.6: resolution: {integrity: sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -2071,6 +2374,9 @@ packages: eslint-config-prettier: optional: true + eslint-plugin-tsdoc@0.5.2: + resolution: {integrity: sha512-BlvqjWZdBJDIPO/YU3zcPCF23CvjYT3gyu63yo6b609NNV3D1b6zceAREy2xnweuBoDpZcLNuPyAUq9cvx6bbQ==} + eslint-scope@9.1.2: resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -2423,6 +2729,9 @@ packages: resolution: {integrity: sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==} engines: {node: ^20.17.0 || >=22.9.0} + html-entities@2.6.0: + resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + http-errors@2.0.1: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} @@ -2527,6 +2836,10 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + engines: {node: '>= 0.4'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2596,6 +2909,9 @@ packages: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + jose@6.2.10: resolution: {integrity: sha512-iiW7J9qRFlGxvCOIBDBDxFePQSn7ZMAnrYGhrrOo6siO/MIqwfyilLR27pkfDgUk+raLuzADS8A3S/KLBisc0g==} @@ -2612,6 +2928,10 @@ packages: resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} hasBin: true + jsdoc-type-pratt-parser@9.2.1: + resolution: {integrity: sha512-V4Ww4EHnTcTLSOMoB0FsF72JhQvcAsriCm/LWnxJeGWoxIjEL2l9na11abQok5SYShq8m0Gl02el/xAbTCulvQ==} + engines: {node: ^22.22.2 || >=24.15.0} + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -3196,6 +3516,9 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + object-deep-merge@2.0.1: + resolution: {integrity: sha512-aKttDKcU3pyZqKcCkDhsMn70WmZFG2JGDQLP9EcLyTSIFQRCPWLAmBZRLJnrVUrhPG1jETEEbfdgbNtJf1LyMg==} + object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} @@ -3303,6 +3626,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-imports-exports@0.2.4: + resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==} + parse-json@4.0.0: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} engines: {node: '>=4'} @@ -3319,6 +3645,9 @@ packages: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} + parse-statements@1.0.11: + resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==} + parse5-htmlparser2-tree-adapter@6.0.1: resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} @@ -3351,6 +3680,9 @@ packages: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} engines: {node: '>=12'} + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@2.0.2: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} @@ -3522,6 +3854,10 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + reserved-identifiers@1.2.0: + resolution: {integrity: sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==} + engines: {node: '>=18'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -3530,6 +3866,11 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + restore-cursor@5.1.0: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} @@ -3677,6 +4018,9 @@ packages: spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@5.0.0: + resolution: {integrity: sha512-vngmw3Rgn+o2arXNbnZaj5UtOEBuWBfvaI+Wc8GFfykIhA5/vdK9/Sp/XkLv63dykz2rxKDvKEHupF5P0FORcQ==} + spdx-license-ids@3.0.23: resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} @@ -3766,6 +4110,10 @@ packages: resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} engines: {node: '>=14.18'} + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + synckit@0.11.13: resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -3816,6 +4164,10 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + to-valid-identifier@1.0.0: + resolution: {integrity: sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==} + engines: {node: '>=20'} + toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} @@ -3910,6 +4262,9 @@ packages: undici-types@8.3.0: resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} + undici-types@8.9.0: + resolution: {integrity: sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==} + undici@6.27.0: resolution: {integrity: sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==} engines: {node: '>=18.17'} @@ -4746,6 +5101,16 @@ snapshots: '@cto.af/wtf8@0.0.5': {} + '@es-joy/jsdoccomment@0.97.0': + dependencies: + '@types/estree': 1.0.9 + '@typescript-eslint/types': 8.69.0 + comment-parser: 1.4.8 + esquery: 1.7.0 + jsdoc-type-pratt-parser: 9.2.1 + + '@es-joy/resolve.exports@1.2.0': {} + '@esbuild/aix-ppc64@0.28.1': optional: true @@ -4824,22 +5189,22 @@ snapshots: '@esbuild/win32-x64@0.28.1': optional: true - '@eslint-community/eslint-utils@4.10.1(eslint@10.7.0(jiti@2.7.0))': + '@eslint-community/eslint-utils@4.10.1(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))': dependencies: - eslint: 10.7.0(jiti@2.7.0) + eslint: 10.7.0(jiti@2.7.0)(supports-color@7.2.0) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.1(eslint@10.7.0(jiti@2.7.0))': + '@eslint-community/eslint-utils@4.9.1(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))': dependencies: - eslint: 10.7.0(jiti@2.7.0) + eslint: 10.7.0(jiti@2.7.0)(supports-color@7.2.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.23.5': + '@eslint/config-array@0.23.5(supports-color@7.2.0)': dependencies: '@eslint/object-schema': 3.0.5 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) minimatch: 10.2.5 transitivePeerDependencies: - supports-color @@ -4852,6 +5217,10 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 + '@eslint/js@10.0.1(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))': + optionalDependencies: + eslint: 10.7.0(jiti@2.7.0)(supports-color@7.2.0) + '@eslint/json@2.0.1': dependencies: '@eslint/core': 1.2.1 @@ -4859,15 +5228,15 @@ snapshots: '@humanwhocodes/momoa': 3.3.10 natural-compare: 1.4.0 - '@eslint/markdown@8.0.3': + '@eslint/markdown@8.0.3(supports-color@7.2.0)': dependencies: '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.2 github-slugger: 2.0.0 - mdast-util-from-markdown: 2.0.3 - mdast-util-frontmatter: 2.0.1 - mdast-util-gfm: 3.1.0 - mdast-util-math: 3.0.0 + mdast-util-from-markdown: 2.0.3(supports-color@7.2.0) + mdast-util-frontmatter: 2.0.1(supports-color@7.2.0) + mdast-util-gfm: 3.1.0(supports-color@7.2.0) + mdast-util-math: 3.0.0(supports-color@7.2.0) micromark-extension-frontmatter: 2.0.0 micromark-extension-gfm: 3.0.0 micromark-extension-math: 3.1.0 @@ -4882,14 +5251,27 @@ snapshots: '@eslint/core': 1.2.1 levn: 0.4.1 - '@google/genai@1.52.0(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))': + '@exadev/eslint-config@2.12.3(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-eslint@8.69.0(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(typescript@6.0.3)': dependencies: - google-auth-library: 10.9.0 + '@eslint/js': 10.0.1(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0)) + '@typescript-eslint/utils': 8.67.0(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + eslint: 10.7.0(jiti@2.7.0)(supports-color@7.2.0) + eslint-plugin-jsdoc: 64.3.6(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + eslint-plugin-tsdoc: 0.5.2(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + typescript-eslint: 8.69.0(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + transitivePeerDependencies: + - supports-color + + '@google/genai@1.52.0(@modelcontextprotocol/sdk@1.30.0(supports-color@7.2.0)(zod@4.4.3))(supports-color@7.2.0)': + dependencies: + google-auth-library: 10.9.0(supports-color@7.2.0) p-retry: 4.6.2 protobufjs: 7.6.5 ws: 8.21.1 optionalDependencies: - '@modelcontextprotocol/sdk': 1.30.0(zod@4.4.3) + '@modelcontextprotocol/sdk': 1.30.0(supports-color@7.2.0)(zod@4.4.3) transitivePeerDependencies: - bufferutil - supports-color @@ -5094,9 +5476,9 @@ snapshots: '@mariozechner/clipboard-win32-x64-msvc': 0.3.9 optional: true - '@mariozechner/pi-agent-core@0.73.1(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(ws@8.21.1)(zod@4.4.3)': + '@mariozechner/pi-agent-core@0.73.1(@modelcontextprotocol/sdk@1.30.0(supports-color@7.2.0)(zod@4.4.3))(supports-color@7.2.0)(ws@8.21.1)(zod@4.4.3)': dependencies: - '@mariozechner/pi-ai': 0.73.1(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(ws@8.21.1)(zod@4.4.3) + '@mariozechner/pi-ai': 0.73.1(@modelcontextprotocol/sdk@1.30.0(supports-color@7.2.0)(zod@4.4.3))(supports-color@7.2.0)(ws@8.21.1)(zod@4.4.3) typebox: 1.3.6 transitivePeerDependencies: - '@modelcontextprotocol/sdk' @@ -5107,16 +5489,16 @@ snapshots: - ws - zod - '@mariozechner/pi-ai@0.73.1(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(ws@8.21.1)(zod@4.4.3)': + '@mariozechner/pi-ai@0.73.1(@modelcontextprotocol/sdk@1.30.0(supports-color@7.2.0)(zod@4.4.3))(supports-color@7.2.0)(ws@8.21.1)(zod@4.4.3)': dependencies: '@anthropic-ai/sdk': 0.111.0(zod@4.4.3) '@aws-sdk/client-bedrock-runtime': 3.1088.0 - '@google/genai': 1.52.0(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3)) + '@google/genai': 1.52.0(@modelcontextprotocol/sdk@1.30.0(supports-color@7.2.0)(zod@4.4.3))(supports-color@7.2.0) '@mistralai/mistralai': 2.4.1 chalk: 5.6.2 openai: 6.26.0(ws@8.21.1)(zod@4.4.3) partial-json: 0.1.7 - proxy-agent: 6.5.0 + proxy-agent: 6.5.0(supports-color@7.2.0) typebox: 1.3.6 undici: 7.28.0 zod-to-json-schema: 3.25.2(zod@4.4.3) @@ -5129,17 +5511,17 @@ snapshots: - ws - zod - '@mariozechner/pi-coding-agent@0.73.1(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(ws@8.21.1)(zod@4.4.3)': + '@mariozechner/pi-coding-agent@0.73.1(@modelcontextprotocol/sdk@1.30.0(supports-color@7.2.0)(zod@4.4.3))(supports-color@7.2.0)(ws@8.21.1)(zod@4.4.3)': dependencies: - '@mariozechner/pi-agent-core': 0.73.1(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(ws@8.21.1)(zod@4.4.3) - '@mariozechner/pi-ai': 0.73.1(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(ws@8.21.1)(zod@4.4.3) + '@mariozechner/pi-agent-core': 0.73.1(@modelcontextprotocol/sdk@1.30.0(supports-color@7.2.0)(zod@4.4.3))(supports-color@7.2.0)(ws@8.21.1)(zod@4.4.3) + '@mariozechner/pi-ai': 0.73.1(@modelcontextprotocol/sdk@1.30.0(supports-color@7.2.0)(zod@4.4.3))(supports-color@7.2.0)(ws@8.21.1)(zod@4.4.3) '@mariozechner/pi-tui': 0.73.1 '@silvia-odwyer/photon-node': 0.3.4 chalk: 5.6.2 cli-highlight: 2.1.11 diff: 8.0.4 - extract-zip: 2.0.1 - file-type: 21.3.4 + extract-zip: 2.0.1(supports-color@7.2.0) + file-type: 21.3.4(supports-color@7.2.0) glob: 13.0.6 hosted-git-info: 9.0.3 ignore: 7.0.6 @@ -5173,6 +5555,15 @@ snapshots: optionalDependencies: koffi: 2.16.2 + '@microsoft/tsdoc-config@0.18.1': + dependencies: + '@microsoft/tsdoc': 0.16.0 + ajv: 8.18.0 + jju: 1.4.0 + resolve: 1.22.12 + + '@microsoft/tsdoc@0.16.0': {} + '@mistralai/mistralai@2.4.1': dependencies: '@opentelemetry/semantic-conventions': 1.43.0 @@ -5183,7 +5574,7 @@ snapshots: - bufferutil - utf-8-validate - '@modelcontextprotocol/sdk@1.30.0(zod@4.4.3)': + '@modelcontextprotocol/sdk@1.30.0(supports-color@7.2.0)(zod@4.4.3)': dependencies: '@hono/node-server': 2.1.1(hono@4.13.5) ajv: 8.20.0 @@ -5193,8 +5584,8 @@ snapshots: cross-spawn: 7.0.6 eventsource: 3.0.7 eventsource-parser: 3.1.1 - express: 5.2.1 - express-rate-limit: 8.7.0(express@5.2.1) + express: 5.2.1(supports-color@7.2.0) + express-rate-limit: 8.7.0(express@5.2.1(supports-color@7.2.0))(supports-color@7.2.0) hono: 4.13.5 jose: 6.2.10 json-schema-typed: 8.0.2 @@ -5356,25 +5747,25 @@ snapshots: '@sec-ant/readable-stream@0.4.1': {} - '@semantic-release/changelog@6.0.3(semantic-release@25.0.7(typescript@6.0.3))': + '@semantic-release/changelog@6.0.3(semantic-release@25.0.7(supports-color@7.2.0)(typescript@6.0.3))': dependencies: '@semantic-release/error': 3.0.0 aggregate-error: 3.1.0 fs-extra: 11.3.6 lodash: 4.18.1 - semantic-release: 25.0.7(typescript@6.0.3) + semantic-release: 25.0.7(supports-color@7.2.0)(typescript@6.0.3) - '@semantic-release/commit-analyzer@13.0.1(semantic-release@25.0.7(typescript@6.0.3))': + '@semantic-release/commit-analyzer@13.0.1(semantic-release@25.0.7(supports-color@7.2.0)(typescript@6.0.3))(supports-color@7.2.0)': dependencies: conventional-changelog-angular: 8.3.1 conventional-changelog-writer: 9.2.0 conventional-commits-filter: 5.0.0 conventional-commits-parser: 6.4.0 - debug: 4.4.3 - import-from-esm: 2.0.0 + debug: 4.4.3(supports-color@7.2.0) + import-from-esm: 2.0.0(supports-color@7.2.0) lodash-es: 4.18.1 micromatch: 4.0.8 - semantic-release: 25.0.7(typescript@6.0.3) + semantic-release: 25.0.7(supports-color@7.2.0)(typescript@6.0.3) transitivePeerDependencies: - supports-color @@ -5382,33 +5773,33 @@ snapshots: '@semantic-release/error@4.0.0': {} - '@semantic-release/exec@7.1.0(semantic-release@25.0.7(typescript@6.0.3))': + '@semantic-release/exec@7.1.0(semantic-release@25.0.7(supports-color@7.2.0)(typescript@6.0.3))(supports-color@7.2.0)': dependencies: '@semantic-release/error': 4.0.0 aggregate-error: 3.1.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) execa: 9.6.1 lodash-es: 4.18.1 parse-json: 8.3.0 - semantic-release: 25.0.7(typescript@6.0.3) + semantic-release: 25.0.7(supports-color@7.2.0)(typescript@6.0.3) transitivePeerDependencies: - supports-color - '@semantic-release/git@10.0.1(semantic-release@25.0.7(typescript@6.0.3))': + '@semantic-release/git@10.0.1(semantic-release@25.0.7(supports-color@7.2.0)(typescript@6.0.3))(supports-color@7.2.0)': dependencies: '@semantic-release/error': 3.0.0 aggregate-error: 3.1.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) dir-glob: 3.0.1 execa: 5.1.1 lodash: 4.18.1 micromatch: 4.0.8 p-reduce: 2.1.0 - semantic-release: 25.0.7(typescript@6.0.3) + semantic-release: 25.0.7(supports-color@7.2.0)(typescript@6.0.3) transitivePeerDependencies: - supports-color - '@semantic-release/github@12.0.9(semantic-release@25.0.7(typescript@6.0.3))': + '@semantic-release/github@12.0.9(semantic-release@25.0.7(supports-color@7.2.0)(typescript@6.0.3))(supports-color@7.2.0)': dependencies: '@octokit/core': 7.0.6 '@octokit/plugin-paginate-rest': 14.0.0(@octokit/core@7.0.6) @@ -5416,15 +5807,15 @@ snapshots: '@octokit/plugin-throttling': 11.0.3(@octokit/core@7.0.6) '@semantic-release/error': 4.0.0 aggregate-error: 5.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) dir-glob: 3.0.1 - http-proxy-agent: 9.1.0 - https-proxy-agent: 9.1.0 + http-proxy-agent: 9.1.0(supports-color@7.2.0) + https-proxy-agent: 9.1.0(supports-color@7.2.0) issue-parser: 7.0.2 lodash-es: 4.18.1 mime: 4.1.0 p-filter: 4.1.0 - semantic-release: 25.0.7(typescript@6.0.3) + semantic-release: 25.0.7(supports-color@7.2.0)(typescript@6.0.3) tinyglobby: 0.2.17 undici: 7.28.0 url-join: 5.0.0 @@ -5432,7 +5823,7 @@ snapshots: - kerberos - supports-color - '@semantic-release/npm@13.1.5(semantic-release@25.0.7(typescript@6.0.3))': + '@semantic-release/npm@13.1.5(semantic-release@25.0.7(supports-color@7.2.0)(typescript@6.0.3))': dependencies: '@actions/core': 3.0.1 '@semantic-release/error': 4.0.0 @@ -5447,21 +5838,21 @@ snapshots: rc: 1.2.8 read-pkg: 10.1.0 registry-auth-token: 5.1.1 - semantic-release: 25.0.7(typescript@6.0.3) + semantic-release: 25.0.7(supports-color@7.2.0)(typescript@6.0.3) semver: 7.8.5 tempy: 3.2.0 - '@semantic-release/release-notes-generator@14.1.1(semantic-release@25.0.7(typescript@6.0.3))': + '@semantic-release/release-notes-generator@14.1.1(semantic-release@25.0.7(supports-color@7.2.0)(typescript@6.0.3))(supports-color@7.2.0)': dependencies: conventional-changelog-angular: 8.3.1 conventional-changelog-writer: 9.2.0 conventional-commits-filter: 5.0.0 conventional-commits-parser: 6.4.0 - debug: 4.4.3 - import-from-esm: 2.0.0 + debug: 4.4.3(supports-color@7.2.0) + import-from-esm: 2.0.0(supports-color@7.2.0) lodash-es: 4.18.1 read-package-up: 11.0.0 - semantic-release: 25.0.7(typescript@6.0.3) + semantic-release: 25.0.7(supports-color@7.2.0)(typescript@6.0.3) transitivePeerDependencies: - supports-color @@ -5477,6 +5868,8 @@ snapshots: '@sinclair/typebox@0.34.49': {} + '@sindresorhus/base62@1.0.0': {} + '@sindresorhus/is@4.6.0': {} '@sindresorhus/merge-streams@4.0.0': {} @@ -5581,9 +5974,9 @@ snapshots: '@stryker-mutator/util@10.0.0': {} - '@tokenizer/inflate@0.4.1': + '@tokenizer/inflate@0.4.1(supports-color@7.2.0)': dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) token-types: 6.1.2 transitivePeerDependencies: - supports-color @@ -5635,6 +6028,10 @@ snapshots: dependencies: undici-types: 8.3.0 + '@types/node@26.5.1': + dependencies: + undici-types: 8.9.0 + '@types/normalize-package-data@2.4.4': {} '@types/retry@0.12.0': {} @@ -5652,15 +6049,15 @@ snapshots: '@types/node': 26.1.1 optional: true - '@typescript-eslint/eslint-plugin@8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.69.0(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.69.0(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) '@typescript-eslint/scope-manager': 8.69.0 - '@typescript-eslint/type-utils': 8.69.0(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/utils': 8.69.0(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/type-utils': 8.69.0(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.69.0(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.69.0 - eslint: 10.7.0(jiti@2.7.0) + eslint: 10.7.0(jiti@2.7.0)(supports-color@7.2.0) ignore: 7.0.8 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -5668,57 +6065,127 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.69.0(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/parser@8.69.0(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: '@typescript-eslint/scope-manager': 8.69.0 '@typescript-eslint/types': 8.69.0 - '@typescript-eslint/typescript-estree': 8.69.0(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.69.0(supports-color@7.2.0)(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.69.0 - debug: 4.4.3 - eslint: 10.7.0(jiti@2.7.0) + debug: 4.4.3(supports-color@7.2.0) + eslint: 10.7.0(jiti@2.7.0)(supports-color@7.2.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.69.0(typescript@6.0.3)': + '@typescript-eslint/project-service@8.56.1(supports-color@7.2.0)(typescript@6.0.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.69.0(typescript@6.0.3) '@typescript-eslint/types': 8.69.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color + '@typescript-eslint/project-service@8.67.0(supports-color@7.2.0)(typescript@6.0.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.69.0(typescript@6.0.3) + '@typescript-eslint/types': 8.69.0 + debug: 4.4.3(supports-color@7.2.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.69.0(supports-color@7.2.0)(typescript@6.0.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.69.0(typescript@6.0.3) + '@typescript-eslint/types': 8.69.0 + debug: 4.4.3(supports-color@7.2.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.56.1': + dependencies: + '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/visitor-keys': 8.56.1 + + '@typescript-eslint/scope-manager@8.67.0': + dependencies: + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/visitor-keys': 8.67.0 + '@typescript-eslint/scope-manager@8.69.0': dependencies: '@typescript-eslint/types': 8.69.0 '@typescript-eslint/visitor-keys': 8.69.0 + '@typescript-eslint/tsconfig-utils@8.56.1(typescript@6.0.3)': + dependencies: + typescript: 6.0.3 + + '@typescript-eslint/tsconfig-utils@8.67.0(typescript@6.0.3)': + dependencies: + typescript: 6.0.3 + '@typescript-eslint/tsconfig-utils@8.69.0(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.69.0(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.69.0(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: '@typescript-eslint/types': 8.69.0 - '@typescript-eslint/typescript-estree': 8.69.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.69.0(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3) - debug: 4.4.3 - eslint: 10.7.0(jiti@2.7.0) + '@typescript-eslint/typescript-estree': 8.69.0(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.69.0(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + debug: 4.4.3(supports-color@7.2.0) + eslint: 10.7.0(jiti@2.7.0)(supports-color@7.2.0) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - supports-color + '@typescript-eslint/types@8.56.1': {} + + '@typescript-eslint/types@8.67.0': {} + '@typescript-eslint/types@8.69.0': {} - '@typescript-eslint/typescript-estree@8.69.0(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@8.56.1(supports-color@7.2.0)(typescript@6.0.3)': + dependencies: + '@typescript-eslint/project-service': 8.56.1(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@6.0.3) + '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/visitor-keys': 8.56.1 + debug: 4.4.3(supports-color@7.2.0) + minimatch: 10.2.6 + semver: 7.8.5 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@8.67.0(supports-color@7.2.0)(typescript@6.0.3)': + dependencies: + '@typescript-eslint/project-service': 8.67.0(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.67.0(typescript@6.0.3) + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/visitor-keys': 8.67.0 + debug: 4.4.3(supports-color@7.2.0) + minimatch: 10.2.6 + semver: 7.8.5 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@8.69.0(supports-color@7.2.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.69.0(typescript@6.0.3) + '@typescript-eslint/project-service': 8.69.0(supports-color@7.2.0)(typescript@6.0.3) '@typescript-eslint/tsconfig-utils': 8.69.0(typescript@6.0.3) '@typescript-eslint/types': 8.69.0 '@typescript-eslint/visitor-keys': 8.69.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) minimatch: 10.2.6 semver: 7.8.5 tinyglobby: 0.2.17 @@ -5727,17 +6194,49 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.69.0(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/utils@8.56.1(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0)) + '@typescript-eslint/scope-manager': 8.56.1 + '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/typescript-estree': 8.56.1(supports-color@7.2.0)(typescript@6.0.3) + eslint: 10.7.0(jiti@2.7.0)(supports-color@7.2.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.67.0(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0)) + '@typescript-eslint/scope-manager': 8.67.0 + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/typescript-estree': 8.67.0(supports-color@7.2.0)(typescript@6.0.3) + eslint: 10.7.0(jiti@2.7.0)(supports-color@7.2.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.69.0(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.7.0(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0)) '@typescript-eslint/scope-manager': 8.69.0 '@typescript-eslint/types': 8.69.0 - '@typescript-eslint/typescript-estree': 8.69.0(typescript@6.0.3) - eslint: 10.7.0(jiti@2.7.0) + '@typescript-eslint/typescript-estree': 8.69.0(supports-color@7.2.0)(typescript@6.0.3) + eslint: 10.7.0(jiti@2.7.0)(supports-color@7.2.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color + '@typescript-eslint/visitor-keys@8.56.1': + dependencies: + '@typescript-eslint/types': 8.56.1 + eslint-visitor-keys: 5.0.1 + + '@typescript-eslint/visitor-keys@8.67.0': + dependencies: + '@typescript-eslint/types': 8.67.0 + eslint-visitor-keys: 5.0.1 + '@typescript-eslint/visitor-keys@8.69.0': dependencies: '@typescript-eslint/types': 8.69.0 @@ -5790,6 +6289,13 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@8.18.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 4.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 @@ -5819,6 +6325,8 @@ snapshots: any-promise@1.3.0: {} + are-docs-informative@0.1.1: {} + argparse@2.0.1: {} argue-cli@3.1.0: {} @@ -5845,11 +6353,11 @@ snapshots: bignumber.js@9.3.1: {} - body-parser@2.3.0: + body-parser@2.3.0(supports-color@7.2.0): dependencies: bytes: 3.1.2 content-type: 2.1.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) http-errors: 2.0.1 iconv-lite: 0.7.3 on-finished: 2.4.1 @@ -6006,6 +6514,8 @@ snapshots: commander@8.3.0: {} + comment-parser@1.4.8: {} + compare-func@2.0.0: dependencies: array-ify: 1.0.0 @@ -6101,9 +6611,11 @@ snapshots: data-uri-to-buffer@6.0.2: {} - debug@4.4.3: + debug@4.4.3(supports-color@7.2.0): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 7.2.0 decode-named-character-reference@1.3.0: dependencies: @@ -6252,18 +6764,50 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@10.1.8(eslint@10.7.0(jiti@2.7.0)): + eslint-config-prettier@10.1.8(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0)): dependencies: - eslint: 10.7.0(jiti@2.7.0) + eslint: 10.7.0(jiti@2.7.0)(supports-color@7.2.0) - eslint-plugin-prettier@5.5.6(eslint-config-prettier@10.1.8(eslint@10.7.0(jiti@2.7.0)))(eslint@10.7.0(jiti@2.7.0))(prettier@3.9.5): + eslint-plugin-jsdoc@64.3.6(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3): dependencies: - eslint: 10.7.0(jiti@2.7.0) + '@es-joy/jsdoccomment': 0.97.0 + '@es-joy/resolve.exports': 1.2.0 + '@typescript-eslint/utils': 8.69.0(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + are-docs-informative: 0.1.1 + comment-parser: 1.4.8 + debug: 4.4.3(supports-color@7.2.0) + escape-string-regexp: 5.0.0 + eslint: 10.7.0(jiti@2.7.0)(supports-color@7.2.0) + espree: 11.2.0 + esquery: 1.7.0 + html-entities: 2.6.0 + object-deep-merge: 2.0.1 + parse-imports-exports: 0.2.4 + semver: 7.8.5 + spdx-expression-parse: 5.0.0 + to-valid-identifier: 1.0.0 + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-prettier@5.5.6(eslint-config-prettier@10.1.8(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0)))(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(prettier@3.9.5): + dependencies: + eslint: 10.7.0(jiti@2.7.0)(supports-color@7.2.0) prettier: 3.9.5 prettier-linter-helpers: 1.0.1 synckit: 0.11.13 optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@10.7.0(jiti@2.7.0)) + eslint-config-prettier: 10.1.8(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0)) + + eslint-plugin-tsdoc@0.5.2(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3): + dependencies: + '@microsoft/tsdoc': 0.16.0 + '@microsoft/tsdoc-config': 0.18.1 + '@typescript-eslint/utils': 8.56.1(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + transitivePeerDependencies: + - eslint + - supports-color + - typescript eslint-scope@9.1.2: dependencies: @@ -6276,11 +6820,11 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.7.0(jiti@2.7.0): + eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.5 + '@eslint/config-array': 0.23.5(supports-color@7.2.0) '@eslint/config-helpers': 0.6.0 '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.2 @@ -6290,7 +6834,7 @@ snapshots: '@types/estree': 1.0.9 ajv: 6.15.0 cross-spawn: 7.0.6 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) escape-string-regexp: 4.0.0 eslint-scope: 9.1.2 eslint-visitor-keys: 5.0.1 @@ -6388,28 +6932,28 @@ snapshots: expect-type@1.4.0: {} - express-rate-limit@8.7.0(express@5.2.1): + express-rate-limit@8.7.0(express@5.2.1(supports-color@7.2.0))(supports-color@7.2.0): dependencies: - debug: 4.4.3 - express: 5.2.1 + debug: 4.4.3(supports-color@7.2.0) + express: 5.2.1(supports-color@7.2.0) ip-address: 10.7.0 transitivePeerDependencies: - supports-color - express@5.2.1: + express@5.2.1(supports-color@7.2.0): dependencies: accepts: 2.0.0 - body-parser: 2.3.0 + body-parser: 2.3.0(supports-color@7.2.0) content-disposition: 1.1.0 content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) depd: 2.0.0 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 2.1.1 + finalhandler: 2.1.1(supports-color@7.2.0) fresh: 2.0.0 http-errors: 2.0.1 merge-descriptors: 2.0.0 @@ -6420,9 +6964,9 @@ snapshots: proxy-addr: 2.0.7 qs: 6.16.0 range-parser: 1.3.0 - router: 2.2.0 - send: 1.2.1 - serve-static: 2.2.1 + router: 2.2.0(supports-color@7.2.0) + send: 1.2.1(supports-color@7.2.0) + serve-static: 2.2.1(supports-color@7.2.0) statuses: 2.0.2 type-is: 2.1.0 vary: 1.1.2 @@ -6431,9 +6975,9 @@ snapshots: extend@3.0.2: {} - extract-zip@2.0.1: + extract-zip@2.0.1(supports-color@7.2.0): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -6492,9 +7036,9 @@ snapshots: dependencies: flat-cache: 4.0.1 - file-type@21.3.4: + file-type@21.3.4(supports-color@7.2.0): dependencies: - '@tokenizer/inflate': 0.4.1 + '@tokenizer/inflate': 0.4.1(supports-color@7.2.0) strtok3: 10.3.5 token-types: 6.1.2 uint8array-extras: 1.5.0 @@ -6505,9 +7049,9 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@2.1.1: + finalhandler@2.1.1(supports-color@7.2.0): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 @@ -6565,17 +7109,17 @@ snapshots: function-timeout@1.0.2: {} - gaxios@7.2.0: + gaxios@7.2.0(supports-color@7.2.0): dependencies: extend: 3.0.2 - https-proxy-agent: 7.0.6 + https-proxy-agent: 7.0.6(supports-color@7.2.0) node-fetch: 3.3.2 transitivePeerDependencies: - supports-color - gcp-metadata@8.1.2: + gcp-metadata@8.1.2(supports-color@7.2.0): dependencies: - gaxios: 7.2.0 + gaxios: 7.2.0(supports-color@7.2.0) google-logging-utils: 1.1.3 json-bigint: 1.0.0 transitivePeerDependencies: @@ -6618,11 +7162,11 @@ snapshots: '@sec-ant/readable-stream': 0.4.1 is-stream: 4.0.1 - get-uri@6.0.5: + get-uri@6.0.5(supports-color@7.2.0): dependencies: basic-ftp: 6.0.1 data-uri-to-buffer: 6.0.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -6651,12 +7195,12 @@ snapshots: dependencies: ini: 6.0.0 - google-auth-library@10.9.0: + google-auth-library@10.9.0(supports-color@7.2.0): dependencies: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 - gaxios: 7.2.0 - gcp-metadata: 8.1.2 + gaxios: 7.2.0(supports-color@7.2.0) + gcp-metadata: 8.1.2(supports-color@7.2.0) google-logging-utils: 1.1.3 jws: 4.0.1 transitivePeerDependencies: @@ -6707,6 +7251,8 @@ snapshots: dependencies: lru-cache: 11.5.2 + html-entities@2.6.0: {} + http-errors@2.0.1: dependencies: depd: 2.0.0 @@ -6715,33 +7261,33 @@ snapshots: statuses: 2.0.2 toidentifier: 1.0.1 - http-proxy-agent@7.0.2: + http-proxy-agent@7.0.2(supports-color@7.2.0): dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color - http-proxy-agent@9.1.0: + http-proxy-agent@9.1.0(supports-color@7.2.0): dependencies: agent-base: 9.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) proxy-agent-negotiate: 1.1.0 transitivePeerDependencies: - kerberos - supports-color - https-proxy-agent@7.0.6: + https-proxy-agent@7.0.6(supports-color@7.2.0): dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color - https-proxy-agent@9.1.0: + https-proxy-agent@9.1.0(supports-color@7.2.0): dependencies: agent-base: 9.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) proxy-agent-negotiate: 1.1.0 transitivePeerDependencies: - kerberos @@ -6772,9 +7318,9 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-from-esm@2.0.0: + import-from-esm@2.0.0(supports-color@7.2.0): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) import-meta-resolve: 4.2.0 transitivePeerDependencies: - supports-color @@ -6801,6 +7347,10 @@ snapshots: is-arrayish@0.2.1: {} + is-core-module@2.16.2: + dependencies: + hasown: 2.0.4 + is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -6847,6 +7397,8 @@ snapshots: jiti@2.7.0: {} + jju@1.4.0: {} + jose@6.2.10: {} js-md4@0.3.2: {} @@ -6859,6 +7411,11 @@ snapshots: dependencies: argparse: 2.0.1 + jsdoc-type-pratt-parser@9.2.1: + dependencies: + '@types/estree': 1.0.9 + '@types/node': 26.5.1 + jsesc@3.1.0: {} json-bigint@1.0.0: @@ -7075,14 +7632,14 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 - mdast-util-from-markdown@2.0.3: + mdast-util-from-markdown@2.0.3(supports-color@7.2.0): dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 decode-named-character-reference: 1.3.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 - micromark: 4.0.2 + micromark: 4.0.2(supports-color@7.2.0) micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-decode-string: 2.0.1 micromark-util-normalize-identifier: 2.0.1 @@ -7092,12 +7649,12 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-frontmatter@2.0.1: + mdast-util-frontmatter@2.0.1(supports-color@7.2.0): dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 escape-string-regexp: 5.0.0 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@7.2.0) mdast-util-to-markdown: 2.1.2 micromark-extension-frontmatter: 2.0.0 transitivePeerDependencies: @@ -7111,62 +7668,62 @@ snapshots: mdast-util-find-and-replace: 3.0.2 micromark-util-character: 2.1.1 - mdast-util-gfm-footnote@2.1.0: + mdast-util-gfm-footnote@2.1.0(supports-color@7.2.0): dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@7.2.0) mdast-util-to-markdown: 2.1.2 micromark-util-normalize-identifier: 2.0.1 transitivePeerDependencies: - supports-color - mdast-util-gfm-strikethrough@2.0.0: + mdast-util-gfm-strikethrough@2.0.0(supports-color@7.2.0): dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@7.2.0) mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - mdast-util-gfm-table@2.0.0: + mdast-util-gfm-table@2.0.0(supports-color@7.2.0): dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 markdown-table: 3.0.4 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@7.2.0) mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - mdast-util-gfm-task-list-item@2.0.0: + mdast-util-gfm-task-list-item@2.0.0(supports-color@7.2.0): dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@7.2.0) mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - mdast-util-gfm@3.1.0: + mdast-util-gfm@3.1.0(supports-color@7.2.0): dependencies: - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@7.2.0) mdast-util-gfm-autolink-literal: 2.0.1 - mdast-util-gfm-footnote: 2.1.0 - mdast-util-gfm-strikethrough: 2.0.0 - mdast-util-gfm-table: 2.0.0 - mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-gfm-footnote: 2.1.0(supports-color@7.2.0) + mdast-util-gfm-strikethrough: 2.0.0(supports-color@7.2.0) + mdast-util-gfm-table: 2.0.0(supports-color@7.2.0) + mdast-util-gfm-task-list-item: 2.0.0(supports-color@7.2.0) mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - mdast-util-math@3.0.0: + mdast-util-math@3.0.0(supports-color@7.2.0): dependencies: '@types/hast': 3.0.5 '@types/mdast': 4.0.4 devlop: 1.1.0 longest-streak: 3.1.0 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@7.2.0) mdast-util-to-markdown: 2.1.2 unist-util-remove-position: 5.0.0 transitivePeerDependencies: @@ -7387,10 +7944,10 @@ snapshots: micromark-util-types@2.0.2: {} - micromark@4.0.2: + micromark@4.0.2(supports-color@7.2.0): dependencies: '@types/debug': 4.1.13 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) decode-named-character-reference: 1.3.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -7524,6 +8081,8 @@ snapshots: object-assign@4.1.1: {} + object-deep-merge@2.0.1: {} + object-inspect@1.13.4: {} obug@2.1.4: {} @@ -7603,16 +8162,16 @@ snapshots: p-try@1.0.0: {} - pac-proxy-agent@7.2.0: + pac-proxy-agent@7.2.0(supports-color@7.2.0): dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.4 - debug: 4.4.3 - get-uri: 6.0.5 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 + debug: 4.4.3(supports-color@7.2.0) + get-uri: 6.0.5(supports-color@7.2.0) + http-proxy-agent: 7.0.2(supports-color@7.2.0) + https-proxy-agent: 7.0.6(supports-color@7.2.0) pac-resolver: 7.0.1 - socks-proxy-agent: 8.0.5 + socks-proxy-agent: 8.0.5(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -7625,6 +8184,10 @@ snapshots: dependencies: callsites: 3.1.0 + parse-imports-exports@0.2.4: + dependencies: + parse-statements: 1.0.11 + parse-json@4.0.0: dependencies: error-ex: 1.3.4 @@ -7645,6 +8208,8 @@ snapshots: parse-ms@4.0.0: {} + parse-statements@1.0.11: {} + parse5-htmlparser2-tree-adapter@6.0.1: dependencies: parse5: 6.0.1 @@ -7665,6 +8230,8 @@ snapshots: path-key@4.0.0: {} + path-parse@1.0.7: {} + path-scurry@2.0.2: dependencies: lru-cache: 11.5.2 @@ -7754,16 +8321,16 @@ snapshots: proxy-agent-negotiate@1.1.0: {} - proxy-agent@6.5.0: + proxy-agent@6.5.0(supports-color@7.2.0): dependencies: agent-base: 7.1.4 - debug: 4.4.3 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 + debug: 4.4.3(supports-color@7.2.0) + http-proxy-agent: 7.0.2(supports-color@7.2.0) + https-proxy-agent: 7.0.6(supports-color@7.2.0) lru-cache: 7.18.3 - pac-proxy-agent: 7.2.0 + pac-proxy-agent: 7.2.0(supports-color@7.2.0) proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.5 + socks-proxy-agent: 8.0.5(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -7843,10 +8410,19 @@ snapshots: require-from-string@2.0.2: {} + reserved-identifiers@1.2.0: {} + resolve-from@4.0.0: {} resolve-from@5.0.0: {} + resolve@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + restore-cursor@5.1.0: dependencies: onetime: 7.0.0 @@ -7879,9 +8455,9 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.2.7 '@rolldown/binding-win32-x64-msvc': 1.2.7 - router@2.2.0: + router@2.2.0(supports-color@7.2.0): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 @@ -7899,16 +8475,16 @@ snapshots: safer-buffer@2.1.2: {} - semantic-release@25.0.7(typescript@6.0.3): + semantic-release@25.0.7(supports-color@7.2.0)(typescript@6.0.3): dependencies: - '@semantic-release/commit-analyzer': 13.0.1(semantic-release@25.0.7(typescript@6.0.3)) + '@semantic-release/commit-analyzer': 13.0.1(semantic-release@25.0.7(supports-color@7.2.0)(typescript@6.0.3))(supports-color@7.2.0) '@semantic-release/error': 4.0.0 - '@semantic-release/github': 12.0.9(semantic-release@25.0.7(typescript@6.0.3)) - '@semantic-release/npm': 13.1.5(semantic-release@25.0.7(typescript@6.0.3)) - '@semantic-release/release-notes-generator': 14.1.1(semantic-release@25.0.7(typescript@6.0.3)) + '@semantic-release/github': 12.0.9(semantic-release@25.0.7(supports-color@7.2.0)(typescript@6.0.3))(supports-color@7.2.0) + '@semantic-release/npm': 13.1.5(semantic-release@25.0.7(supports-color@7.2.0)(typescript@6.0.3)) + '@semantic-release/release-notes-generator': 14.1.1(semantic-release@25.0.7(supports-color@7.2.0)(typescript@6.0.3))(supports-color@7.2.0) aggregate-error: 5.0.0 cosmiconfig: 9.0.2(typescript@6.0.3) - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) env-ci: 11.2.0 execa: 9.6.1 figures: 6.1.0 @@ -7917,7 +8493,7 @@ snapshots: git-log-parser: 1.2.1 hook-std: 4.0.0 hosted-git-info: 9.0.3 - import-from-esm: 2.0.0 + import-from-esm: 2.0.0(supports-color@7.2.0) lodash-es: 4.18.1 marked: 15.0.12 marked-terminal: 7.3.0(marked@15.0.12) @@ -7938,9 +8514,9 @@ snapshots: semver@7.8.5: {} - send@1.2.1: + send@1.2.1(supports-color@7.2.0): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -7954,12 +8530,12 @@ snapshots: transitivePeerDependencies: - supports-color - serve-static@2.2.1: + serve-static@2.2.1(supports-color@7.2.0): dependencies: encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 1.2.1 + send: 1.2.1(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -8027,10 +8603,10 @@ snapshots: smart-buffer@4.2.0: {} - socks-proxy-agent@8.0.5: + socks-proxy-agent@8.0.5(supports-color@7.2.0): dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) socks: 2.8.9 transitivePeerDependencies: - supports-color @@ -8061,6 +8637,11 @@ snapshots: spdx-exceptions: 2.5.0 spdx-license-ids: 3.0.23 + spdx-expression-parse@5.0.0: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.23 + spdx-license-ids@3.0.23: {} split2@1.0.0: @@ -8147,6 +8728,8 @@ snapshots: has-flag: 4.0.0 supports-color: 7.2.0 + supports-preserve-symlinks-flag@1.0.0: {} + synckit@0.11.13: dependencies: '@pkgr/core': 0.3.6 @@ -8194,6 +8777,11 @@ snapshots: dependencies: is-number: 7.0.0 + to-valid-identifier@1.0.0: + dependencies: + '@sindresorhus/base62': 1.0.0 + reserved-identifiers: 1.2.0 + toidentifier@1.0.1: {} token-types@6.1.2: @@ -8254,13 +8842,13 @@ snapshots: tunnel: 0.0.6 underscore: 1.13.8 - typescript-eslint@8.69.0(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3): + typescript-eslint@8.69.0(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/parser': 8.69.0(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/typescript-estree': 8.69.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.69.0(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.7.0(jiti@2.7.0) + '@typescript-eslint/eslint-plugin': 8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.69.0(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.69.0(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.69.0(eslint@10.7.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + eslint: 10.7.0(jiti@2.7.0)(supports-color@7.2.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -8273,6 +8861,8 @@ snapshots: undici-types@8.3.0: {} + undici-types@8.9.0: {} + undici@6.27.0: {} undici@7.28.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index a314305..ea1d90c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,13 +1,25 @@ +allowBuilds: + # Its own published scripts (preinstall, prepack) are no-ops, and the "prepare" script's target file isn't present in the published tarball -- nothing to run for a consumer. + '@google/genai': false + # postinstall downloads the platform-specific binary esbuild needs to run at all. + esbuild: true + # install prebuilds/fetches the native binary koffi's FFI calls depend on. + koffi: true + # No preinstall/install/postinstall script -- only dev-only build/bench scripts a consumer never runs. + protobufjs: false +minimumReleaseAgeExclude: + - '@exadev/eslint-config' overrides: - fast-uri: ">=3.1.2" - protobufjs: "^7.6.1" - fast-xml-parser: ">=5.8.0" - ip-address: ">=10.2.0" - hono: "^4.12.18" - brace-expansion: ">=5.0.6" - qs: ">=6.15.2" - basic-ftp: ">=6.0.1" "@anthropic-ai/sdk": ">=0.91.1" + basic-ftp: ">=6.0.1" + brace-expansion: ">=5.0.6" # @semantic-release/release-notes-generator pins conventional-changelog-writer to # ^8.0.0, which predates the breaking Handlebars-to-render-function template rewrite that conventional-changelog-conventionalcommits@10.x now requires -- without this override, generateNotes silently produces an empty changelog body (just the version header, no Features/Bug Fixes sections), which is what happened to v1.24.1's entry. Confirmed upstream: https://github.com/semantic-release/release-notes-generator/issues/992 conventional-changelog-writer: ^9.2.0 + fast-uri: ">=3.1.2" + fast-xml-parser: ">=5.8.0" + hono: "^4.12.18" + ip-address: ">=10.2.0" + protobufjs: "^7.6.1" + qs: ">=6.15.2" +saveExact: true diff --git a/scripts/publish-mcp-registry.ts b/scripts/publish-mcp-registry.ts index b9251fa..552db7f 100644 --- a/scripts/publish-mcp-registry.ts +++ b/scripts/publish-mcp-registry.ts @@ -9,7 +9,9 @@ import { nextRetryDelayMs, } from "../src/core/mcp-registry-retry.js"; -function run(command: string, args: string[]): void { +const MS_PER_SECOND = 1000; + +function run(command: string, args: readonly string[]): void { const result = spawnSync(command, args, { stdio: "inherit" }); if (result.status !== 0) { throw new Error(`Command failed: ${command} ${args.join(" ")}`); @@ -17,10 +19,10 @@ function run(command: string, args: string[]): void { } function sleepSync(ms: number): void { - spawnSync("sleep", [String(ms / 1000)]); + spawnSync("sleep", [String(ms / MS_PER_SECOND)]); } -function runPublishWithRetry(command: string, args: string[]): void { +function runPublishWithRetry(command: string, args: readonly string[]): void { const deadline = Date.now() + MAX_TOTAL_RETRY_MS; let delayMs = INITIAL_RETRY_DELAY_MS; for (let attempt = 1; ; attempt++) { @@ -34,7 +36,7 @@ function runPublishWithRetry(command: string, args: string[]): void { isRetryablePublishFailure(output) && Date.now() + delayMs < deadline; if (canRetry) { console.error( - `mcp-publisher publish hit a retryable failure (attempt ${String(attempt)}), retrying in ${String(delayMs / 1000)}s`, + `mcp-publisher publish hit a retryable failure (attempt ${String(attempt)}), retrying in ${String(delayMs / MS_PER_SECOND)}s`, ); sleepSync(delayMs); delayMs = nextRetryDelayMs(delayMs); diff --git a/src/bridges/claude-code/channel.ts b/src/bridges/claude-code/channel.ts index 78d25a1..cb51867 100644 --- a/src/bridges/claude-code/channel.ts +++ b/src/bridges/claude-code/channel.ts @@ -48,6 +48,12 @@ function cwdSlug(cwd: string): string { return cwd.replace(/[^a-zA-Z0-9]/g, "_"); } +/** Maximum number of process-tree ancestors to walk when hunting for the Claude Code CLI PID. */ +const MAX_PID_WALK_HOPS = 10; + +/** Length of the random suffix appended to an auto-generated agent display name. */ +const AUTO_NAME_SUFFIX_LENGTH = 4; + function pendingDir(): string { return path.join(os.homedir(), ".agents", "bus", "pending"); } @@ -66,7 +72,7 @@ function pendingDir(): string { */ function findClaudeCodePid(): number | undefined { let pid = process.ppid; - for (let i = 0; i < 10 && pid > 1; i++) { + for (let i = 0; i < MAX_PID_WALK_HOPS && pid > 1; i++) { let out: string; try { out = execFileSync("ps", ["-o", "ppid=,comm=", "-p", String(pid)], { @@ -219,11 +225,11 @@ export async function run(): Promise { async (rawParams: unknown) => { const params = isRecord(rawParams) ? rawParams : {}; const actionParam = params.action; - if (!agentId) { + if (agentId === undefined) { const name = actionParam === "register" && typeof params.name === "string" ? params.name - : `claude-code-${nanoid(4)}`; + : `claude-code-${nanoid(AUTO_NAME_SUFFIX_LENGTH)}`; const reg = await ensureRegistered({ cwd: process.cwd(), store, @@ -269,7 +275,7 @@ export async function run(): Promise { cwd: process.cwd(), store, harness: "claude-code", - defaultName: `claude-code-${nanoid(4)}`, + defaultName: `claude-code-${nanoid(AUTO_NAME_SUFFIX_LENGTH)}`, }); agentId = reg.agentId; diff --git a/src/bridges/codex/tool.ts b/src/bridges/codex/tool.ts index d25c5c2..dec3513 100644 --- a/src/bridges/codex/tool.ts +++ b/src/bridges/codex/tool.ts @@ -26,6 +26,9 @@ function isRecord(value: unknown): value is Record { return typeof value === "object" && value !== null && !Array.isArray(value); } +/** Length of the random suffix appended to an auto-generated `codex-` agent name. */ +const CODEX_AGENT_NAME_SUFFIX_LENGTH = 4; + export async function run(): Promise { // Persistent identity for this slot: a stable device-id means the agent ID survives restarts, so peers can keep targeting us. The stdio server has no graceful shutdown hook; a stale lock self-heals via the pid probe. const identitySlot: IdentitySlot = { harness: "codex", cwd: process.cwd() }; @@ -55,11 +58,11 @@ export async function run(): Promise { async (rawParams: unknown) => { const params = isRecord(rawParams) ? rawParams : {}; const actionParam = params.action; - if (!agentId) { + if (agentId === undefined) { const name = actionParam === "register" && typeof params.name === "string" ? params.name - : `codex-${nanoid(4)}`; + : `codex-${nanoid(CODEX_AGENT_NAME_SUFFIX_LENGTH)}`; const reg = await ensureRegistered({ cwd: process.cwd(), store, @@ -104,7 +107,7 @@ export async function run(): Promise { cwd: process.cwd(), store, harness: "codex", - defaultName: `codex-${nanoid(4)}`, + defaultName: `codex-${nanoid(CODEX_AGENT_NAME_SUFFIX_LENGTH)}`, }); agentId = reg.agentId; } diff --git a/src/bridges/mcp/index.ts b/src/bridges/mcp/server.ts similarity index 91% rename from src/bridges/mcp/index.ts rename to src/bridges/mcp/server.ts index c7ab95e..04f5bcf 100644 --- a/src/bridges/mcp/index.ts +++ b/src/bridges/mcp/server.ts @@ -22,6 +22,9 @@ import type { IdentitySlot } from "../../core/identity-store.js"; import { tryStartWebServer } from "../user/web/server.js"; import { nanoid } from "../../core/nanoid.js"; +/** Length of the random suffix appended to a default `mcp-` agent name when no explicit name is registered. */ +const DEFAULT_AGENT_NAME_SUFFIX_LENGTH = 4; + function isRecord(value: unknown): value is Record { return typeof value === "object" && value !== null && !Array.isArray(value); } @@ -56,11 +59,11 @@ export async function run(): Promise { const params = isRecord(rawParams) ? rawParams : {}; const actionParam = params.action; - if (!agentId) { + if (agentId === undefined) { const name = actionParam === "register" && typeof params.name === "string" ? params.name - : `mcp-${nanoid(4)}`; + : `mcp-${nanoid(DEFAULT_AGENT_NAME_SUFFIX_LENGTH)}`; const reg = await ensureRegistered({ cwd: process.cwd(), store, @@ -105,7 +108,7 @@ export async function run(): Promise { cwd: process.cwd(), store, harness: "mcp", - defaultName: `mcp-${nanoid(4)}`, + defaultName: `mcp-${nanoid(DEFAULT_AGENT_NAME_SUFFIX_LENGTH)}`, }); agentId = reg.agentId; } diff --git a/src/bridges/opencode/plugin.ts b/src/bridges/opencode/plugin.ts index 53527b6..548b321 100644 --- a/src/bridges/opencode/plugin.ts +++ b/src/bridges/opencode/plugin.ts @@ -20,18 +20,23 @@ import { nanoid } from "../../core/nanoid.js"; // Persistent identity for this slot: a stable device-id means the agent ID survives restarts, so peers can keep targeting us. A plugin unload has no hook here; a stale lock self-heals via the pid probe. const identitySlot: IdentitySlot = { harness: "opencode", cwd: process.cwd() }; +// Length (in characters) of the random suffix appended to the default auto-generated agent name. +const DEFAULT_NAME_SUFFIX_LENGTH = 4; + // Minimal interface for the OpenCode SDK client we actually use interface OpenCodeClient { tui: { - appendPrompt(body: { text: string }): Promise; - submitPrompt(): Promise; + appendPrompt: (body: Readonly<{ text: string }>) => Promise; + submitPrompt: () => Promise; }; session: { - list(): Promise<{ data: { id: string }[] }>; - prompt(opts: { - path: { id: string }; - body: { parts: { type: string; text: string }[] }; - }): Promise; + list: () => Promise<{ data: { id: string }[] }>; + prompt: ( + opts: Readonly<{ + path: { id: string }; + body: { parts: { type: string; text: string }[] }; + }>, + ) => Promise; }; } @@ -62,7 +67,7 @@ export const AgentCommsPlugin = async (opts: { cwd: process.cwd(), store, harness: "opencode", - defaultName: `opencode-${nanoid(4)}`, + defaultName: `opencode-${nanoid(DEFAULT_NAME_SUFFIX_LENGTH)}`, }); const agentId = reg.agentId; diff --git a/src/bridges/pi/index.ts b/src/bridges/pi/extension.ts similarity index 95% rename from src/bridges/pi/index.ts rename to src/bridges/pi/extension.ts index b4bcf5e..f367e3a 100644 --- a/src/bridges/pi/index.ts +++ b/src/bridges/pi/extension.ts @@ -55,14 +55,16 @@ export default function (pi: ExtensionAPI) { // LRU-style dedup for delivery events const recentDeliveries = new Set(); const MAX_DEDUP_ENTRIES = 100; + const AUTO_NAME_SUFFIX_LENGTH = 4; function refreshStatus(): void { if (!uiCtx) return; const parts: string[] = []; - if (projectRoom) parts.push(`💬 ${projectRoom}`); + if (projectRoom !== undefined) parts.push(`💬 ${projectRoom}`); if (webHandle) { const port = getWebPort(webHandle); - if (port) parts.push(`http://127.0.0.1:${String(port)}`); + if (port !== undefined && port !== 0) + parts.push(`http://127.0.0.1:${String(port)}`); } if (informationalBuffer.length > 0) { parts.push(`📬 ${String(informationalBuffer.length)}`); @@ -138,7 +140,7 @@ export default function (pi: ExtensionAPI) { store, cwd: process.cwd(), harness: "pi", - defaultName: `pi-${nanoid(4)}`, + defaultName: `pi-${nanoid(AUTO_NAME_SUFFIX_LENGTH)}`, }); agentId = reg.agentId; @@ -173,7 +175,7 @@ export default function (pi: ExtensionAPI) { webHandle.server.close(); webHandle = undefined; } - if (agentId) { + if (agentId !== undefined) { await store.setAgentOffline(agentId); } releaseIdentityLock(identitySlot); @@ -186,18 +188,18 @@ export default function (pi: ExtensionAPI) { pi.registerCommand("comms-url", { description: "Show the Agent Comms web UI URL", - // eslint-disable-next-line @typescript-eslint/require-await -- SDK requires Promise return handler: async (_args, ctx) => { if (!webHandle) { ctx.ui.notify("Web UI is not running.", "error"); - return; + return Promise.resolve(); } const port = getWebPort(webHandle); - if (!port) { + if (port === undefined || port === 0) { ctx.ui.notify("Web UI port not yet assigned.", "error"); - return; + return Promise.resolve(); } ctx.ui.notify(`http://127.0.0.1:${String(port)}`, "info"); + return Promise.resolve(); }, }); @@ -305,7 +307,7 @@ export default function (pi: ExtensionAPI) { }; } const port = getWebPort(webHandle); - if (!port) { + if (port === undefined || port === 0) { return { content: [{ type: "text", text: "Web UI port not yet assigned." }], details: { action: "web_url" }, @@ -319,7 +321,7 @@ export default function (pi: ExtensionAPI) { }; } - if (!agentId) { + if (agentId === undefined) { return { content: [{ type: "text", text: "Error: not registered" }], details: {}, diff --git a/src/bridges/index.ts b/src/bridges/registry.ts similarity index 86% rename from src/bridges/index.ts rename to src/bridges/registry.ts index c649b9a..141141b 100644 --- a/src/bridges/index.ts +++ b/src/bridges/registry.ts @@ -1,6 +1,6 @@ import * as claudeCode from "./claude-code/channel.js"; import * as codex from "./codex/tool.js"; -import * as mcp from "./mcp/index.js"; +import * as mcp from "./mcp/server.js"; export interface Bridge { run: () => void | Promise; diff --git a/src/bridges/user/cli.ts b/src/bridges/user/cli.ts index 99c9691..a9c5bc4 100644 --- a/src/bridges/user/cli.ts +++ b/src/bridges/user/cli.ts @@ -13,7 +13,7 @@ import { ChatController } from "./controller.js"; export async function runCli( command: string, - args: string[], + args: readonly string[], userName: string, ): Promise { const controller = new ChatController(userName); @@ -37,13 +37,13 @@ export async function runCli( async function dispatch( controller: ChatController, command: string, - args: string[], + args: readonly string[], ): Promise<{ content: string; isError: boolean }> { switch (command) { case "send": { const room = args[0]; const content = args.slice(1).join(" "); - if (!room || !content) { + if (room === undefined || room === "" || !content) { return { content: "Usage: agent-comms send ", isError: true, @@ -57,7 +57,7 @@ async function dispatch( case "dm": { const agent = args[0]; const content = args.slice(1).join(" "); - if (!agent || !content) { + if (agent === undefined || agent === "" || !content) { return { content: "Usage: agent-comms dm ", isError: true, @@ -71,7 +71,7 @@ async function dispatch( return controller.listAgents(); case "read": { const room = args[0]; - if (!room) { + if (room === undefined || room === "") { return { content: "Usage: agent-comms read [--since ]", isError: true, diff --git a/src/bridges/user/controller.ts b/src/bridges/user/controller.ts index 30df888..14d5f21 100644 --- a/src/bridges/user/controller.ts +++ b/src/bridges/user/controller.ts @@ -6,8 +6,8 @@ */ import { EventEmitter } from "node:events"; +import type { MeshStore } from "../../core/index.js"; import { - MeshStore, CommsTool, createBridgeMesh, ensureRegistered, @@ -44,8 +44,8 @@ export class ChatController extends EventEmitter { private currentRoom: string | undefined; constructor( - private userName: string, - private coordinatorPort?: number, + private readonly userName: string, + private readonly coordinatorPort?: number, ) { super(); } @@ -57,7 +57,10 @@ export class ChatController extends EventEmitter { * (e.g. pi, Claude Code) so the web UI shares the same mesh peer * instead of creating a redundant one. */ - static fromExisting(store: MeshStore, ctx: CommsContext): ChatController { + static fromExisting( + store: MeshStore, + ctx: Readonly, + ): ChatController { const ctrl = new ChatController(""); // Replace the store with the existing one ctrl.store = store; @@ -154,7 +157,7 @@ export class ChatController extends EventEmitter { async leaveRoom(roomId?: string): Promise { const target = roomId ?? this.currentRoom; - if (!target) { + if (target === undefined || target === "") { return { content: "No room to leave. Join a room first.", isError: true }; } const result = await this.tool.handle(this.ctx, { @@ -172,7 +175,7 @@ export class ChatController extends EventEmitter { } async sendToCurrentRoom(content: string): Promise { - if (!this.currentRoom) { + if (this.currentRoom === undefined || this.currentRoom === "") { return { content: "No active room. Join a room first.", isError: true }; } return this.send(this.currentRoom, content); @@ -188,13 +191,13 @@ export class ChatController extends EventEmitter { async readRoom(roomId?: string, since?: string): Promise { const target = roomId ?? this.currentRoom; - if (!target) { + if (target === undefined || target === "") { return { content: "No room to read. Join a room first.", isError: true }; } return this.tool.handle(this.ctx, { action: "read_room", room: target, - ...(since && { since }), + ...(since !== undefined && since !== "" && { since }), }); } diff --git a/src/bridges/user/tui.ts b/src/bridges/user/tui.ts index 3b39b36..33d0fd3 100644 --- a/src/bridges/user/tui.ts +++ b/src/bridges/user/tui.ts @@ -36,7 +36,7 @@ const CLEAR_LINE = "\r\x1b[2K"; function prompt(controller: ChatController): string { const room = controller.activeRoom; - return room ? `${GREEN}${room}${RESET} > ` : `${DIM}>${RESET} `; + return room !== undefined ? `${GREEN}${room}${RESET} > ` : `${DIM}>${RESET} `; } export async function runTui(userName: string): Promise { @@ -76,7 +76,7 @@ export async function runTui(userName: string): Promise { if (trimmed.startsWith("/")) { await handleCommand(trimmed, controller); - } else if (controller.activeRoom) { + } else if (controller.activeRoom !== undefined) { const result = await controller.sendToCurrentRoom(trimmed); if (result.isError) { process.stdout.write(`${RED}${result.content}${RESET}\n`); @@ -118,7 +118,7 @@ async function handleCommand(input: string, c: ChatController): Promise { switch (cmd) { case "join": { - if (!arg1) { + if (arg1 === undefined) { process.stdout.write(`${YELLOW}Usage: /join ${RESET}\n`); return; } @@ -153,7 +153,7 @@ async function handleCommand(input: string, c: ChatController): Promise { return; } case "dm": { - if (!arg1 || !arg2) { + if (arg1 === undefined || !arg2) { process.stdout.write(`${YELLOW}Usage: /dm ${RESET}\n`); return; } @@ -162,7 +162,7 @@ async function handleCommand(input: string, c: ChatController): Promise { return; } case "create": { - if (!arg1) { + if (arg1 === undefined) { process.stdout.write(`${YELLOW}Usage: /create ${RESET}\n`); return; } @@ -172,7 +172,7 @@ async function handleCommand(input: string, c: ChatController): Promise { } case "invite": { const agentId = parts[2]; - if (!arg1 || !agentId) { + if (arg1 === undefined || agentId === undefined) { process.stdout.write( `${YELLOW}Usage: /invite ${RESET}\n`, ); @@ -184,7 +184,7 @@ async function handleCommand(input: string, c: ChatController): Promise { } case "decline": { const reason = parts.slice(2).join(" "); - if (!arg1 || !reason) { + if (arg1 === undefined || !reason) { process.stdout.write( `${YELLOW}Usage: /decline ${RESET}\n`, ); @@ -196,7 +196,7 @@ async function handleCommand(input: string, c: ChatController): Promise { } case "kick": { const agentId = parts[2]; - if (!arg1 || !agentId) { + if (arg1 === undefined || agentId === undefined) { process.stdout.write(`${YELLOW}Usage: /kick ${RESET}\n`); return; } @@ -205,7 +205,7 @@ async function handleCommand(input: string, c: ChatController): Promise { return; } case "destroy": { - if (!arg1) { + if (arg1 === undefined) { process.stdout.write(`${YELLOW}Usage: /destroy ${RESET}\n`); return; } @@ -233,6 +233,8 @@ async function handleCommand(input: string, c: ChatController): Promise { case "quit": process.stdout.write(`${DIM}Goodbye!${RESET}\n`); process.exit(0); + return; + case undefined: default: process.stdout.write( `${YELLOW}Unknown command: /${String(cmd)}. Type /help for commands.${RESET}\n`, @@ -244,7 +246,9 @@ async function handleCommand(input: string, c: ChatController): Promise { // Formatting // --------------------------------------------------------------------------- -function printResult(result: { content: string; isError: boolean }): void { +function printResult( + result: Readonly<{ content: string; isError: boolean }>, +): void { if (result.isError) { process.stdout.write(`${RED}${result.content}${RESET}\n`); } else { @@ -282,5 +286,7 @@ function formatForTerminal(event: DeliveryEvent): string { return `${CYAN}✎ ${event.oldName} is now ${event.newName}${RESET}`; case "connection_request": return `${CYAN}🔗 Connection request from ${event.peerId} (${event.name})${RESET}`; + default: + return event satisfies never; } } diff --git a/src/bridges/user/web/e2e/connect-prompt.e2e.test.ts b/src/bridges/user/web/e2e/connect-prompt.e2e.test.ts index 69bcf65..6eb9d7f 100644 --- a/src/bridges/user/web/e2e/connect-prompt.e2e.test.ts +++ b/src/bridges/user/web/e2e/connect-prompt.e2e.test.ts @@ -12,7 +12,8 @@ */ import type { Page } from "@playwright/test"; -import { test, expect } from "./fixtures.js"; +import { expect } from "@playwright/test"; +import { test } from "./fixtures.js"; /** * Injects stub WebSocket and SharedWorker constructors that never connect. @@ -25,7 +26,7 @@ async function blockNetworkConnections(page: Page): Promise { static CONNECTING = 0; static OPEN = 1; static CLOSING = 2; - static CLOSED = 3; + static readonly CLOSED = 3; readyState = 0; bufferedAmount = 0; protocol = ""; diff --git a/src/bridges/user/web/e2e/deep-link.e2e.test.ts b/src/bridges/user/web/e2e/deep-link.e2e.test.ts index 3431071..b00dccd 100644 --- a/src/bridges/user/web/e2e/deep-link.e2e.test.ts +++ b/src/bridges/user/web/e2e/deep-link.e2e.test.ts @@ -5,7 +5,8 @@ * correct room or DM target. */ -import { test, expect } from "./fixtures.js"; +import { expect } from "@playwright/test"; +import { test } from "./fixtures.js"; let testCounter = 0; function uniqueName(prefix: string): string { diff --git a/src/bridges/user/web/e2e/fixtures.ts b/src/bridges/user/web/e2e/fixtures.ts index 1a57ff2..bb7c122 100644 --- a/src/bridges/user/web/e2e/fixtures.ts +++ b/src/bridges/user/web/e2e/fixtures.ts @@ -5,12 +5,12 @@ * Imports from source (tsx resolves at runtime). */ -import { test as base, expect } from "@playwright/test"; +import { test as base } from "@playwright/test"; import { createWebServer, type WebServerHandle } from "../server.js"; import net from "node:net"; /** Allocate a random free port by binding to port 0. */ -function allocFreePort(): Promise { +async function allocFreePort(): Promise { return new Promise((resolve, reject) => { const srv = net.createServer(); srv.listen(0, "127.0.0.1", () => { @@ -30,7 +30,10 @@ interface Fixtures { } export const test = base.extend({ - server: async ({}, use: (handle: WebServerHandle) => Promise) => { + server: async ( + _fixtures, + use: (handle: WebServerHandle) => Promise, + ) => { // Each test gets its own coordinator port to avoid EADDRINUSE races // when the previous test's TLS transport hasn't released 19876 yet. const coordinatorPort = await allocFreePort(); @@ -57,5 +60,3 @@ export const test = base.extend({ await use(port); }, }); - -export { expect }; diff --git a/src/bridges/user/web/e2e/pwa.e2e.test.ts b/src/bridges/user/web/e2e/pwa.e2e.test.ts index edf8ea8..73a4f3a 100644 --- a/src/bridges/user/web/e2e/pwa.e2e.test.ts +++ b/src/bridges/user/web/e2e/pwa.e2e.test.ts @@ -9,7 +9,11 @@ * is present. */ -import { test, expect } from "./fixtures.js"; +import { expect } from "@playwright/test"; +import { test } from "./fixtures.js"; + +const CACHE_POPULATE_WAIT_MS = 2000; +const HTTP_OK = 200; function hasSizes(value: unknown): value is { sizes: string } { return ( @@ -68,7 +72,7 @@ test.describe("PWA features", () => { const link = document.querySelector('link[rel="manifest"]'); if (!link) return null; const href = link.getAttribute("href"); - if (!href) return null; + if (href === null) return null; const res = await fetch(href); return res.json(); }, @@ -147,7 +151,7 @@ test.describe("PWA features", () => { // Give the service worker time to populate the cache via its // install handler (cache.addAll happens in waitUntil). - await page.waitForTimeout(2000); + await page.waitForTimeout(CACHE_POPULATE_WAIT_MS); // Check that the agent-comms cache exists and has app shell entries const cacheEntries = await page.evaluate<{ @@ -156,7 +160,7 @@ test.describe("PWA features", () => { }>(async () => { const names = await caches.keys(); const commsCache = names.find((n) => n.startsWith("agent-comms")); - if (!commsCache) return { found: false, entries: [] }; + if (commsCache === undefined) return { found: false, entries: [] }; const cache = await caches.open(commsCache); const requests = await cache.keys(); @@ -184,7 +188,7 @@ test.describe("PWA features", () => { }, { timeout: 15000 }, ); - await page.waitForTimeout(2000); + await page.waitForTimeout(CACHE_POPULATE_WAIT_MS); // Reload so the SW controls the page await page.reload(); @@ -218,7 +222,7 @@ test.describe("PWA features", () => { }, { timeout: 15000 }, ); - await page.waitForTimeout(2000); + await page.waitForTimeout(CACHE_POPULATE_WAIT_MS); // Reload so the SW controls the page await page.reload(); @@ -241,7 +245,7 @@ test.describe("PWA features", () => { }); expect(bundleStatus.ok).toBe(true); - expect(bundleStatus.status).toBe(200); + expect(bundleStatus.status).toBe(HTTP_OK); await context.setOffline(false); }); @@ -265,7 +269,7 @@ test.describe("PWA features", () => { async () => { const link = document.querySelector('link[rel="manifest"]'); const href = link?.getAttribute("href"); - if (!href) return null; + if (href === null || href === undefined || href === "") return null; const res = await fetch(href); return res.json(); }, diff --git a/src/bridges/user/web/e2e/standalone.e2e.test.ts b/src/bridges/user/web/e2e/standalone.e2e.test.ts index 24259f9..d88ecfc 100644 --- a/src/bridges/user/web/e2e/standalone.e2e.test.ts +++ b/src/bridges/user/web/e2e/standalone.e2e.test.ts @@ -6,7 +6,8 @@ * and attempt localhost port probing on connect. */ -import { test, expect } from "./fixtures.js"; +import { expect } from "@playwright/test"; +import { test } from "./fixtures.js"; test.describe("Standalone PWA mode", () => { test("page loads and shows connect prompt", async ({ page, port }) => { @@ -101,7 +102,7 @@ test.describe("Standalone PWA mode", () => { // Now intercept all fetch requests and abort them to simulate // the standalone PWA scenario where there's no backend. - await page.route("**/api/**", (route) => route.abort()); + await page.route("**/api/**", async (route) => route.abort()); // Reload — page should still render without crashing await page.reload(); diff --git a/src/bridges/user/web/e2e/ui-interactions.e2e.test.ts b/src/bridges/user/web/e2e/ui-interactions.e2e.test.ts index 15e87fb..efee385 100644 --- a/src/bridges/user/web/e2e/ui-interactions.e2e.test.ts +++ b/src/bridges/user/web/e2e/ui-interactions.e2e.test.ts @@ -5,7 +5,8 @@ * /leave, /rename, /dm, and agent list presence in the sidebar. */ -import { test, expect } from "./fixtures.js"; +import { expect } from "@playwright/test"; +import { test } from "./fixtures.js"; let testCounter = 0; function uniqueName(prefix: string): string { diff --git a/src/bridges/user/web/e2e/web-ui.e2e.test.ts b/src/bridges/user/web/e2e/web-ui.e2e.test.ts index 1db774a..6408136 100644 --- a/src/bridges/user/web/e2e/web-ui.e2e.test.ts +++ b/src/bridges/user/web/e2e/web-ui.e2e.test.ts @@ -7,7 +7,8 @@ * Each test uses a unique room name to avoid collisions. */ -import { test, expect } from "./fixtures.js"; +import { expect } from "@playwright/test"; +import { test } from "./fixtures.js"; import WS from "ws"; let testCounter = 0; @@ -285,8 +286,8 @@ test.describe("Web UI", () => { // Connect WebSocket and collect frames const ws = await new Promise((resolve) => { - const ws = new WS(`ws://127.0.0.1:${port}`); - ws.on("open", () => resolve(ws)); + const socket = new WS(`ws://127.0.0.1:${port}`); + socket.on("open", () => resolve(socket)); }); const frames: Record[] = []; @@ -305,7 +306,10 @@ test.describe("Web UI", () => { ); // Wait for frames to accumulate - await new Promise((r) => setTimeout(r, 500)); + const FRAME_ACCUMULATION_WAIT_MS = 500; + await new Promise((r) => { + setTimeout(r, FRAME_ACCUMULATION_WAIT_MS); + }); const results = frames.filter( (f) => diff --git a/src/bridges/user/web/frontend/api.ts b/src/bridges/user/web/frontend/api.ts index 8bd52e8..843828d 100644 --- a/src/bridges/user/web/frontend/api.ts +++ b/src/bridges/user/web/frontend/api.ts @@ -69,9 +69,10 @@ export async function fetchRoomMessages( roomId: string, since?: string, ): Promise { - const url = since - ? `/api/rooms/${encodeURIComponent(roomId)}/messages?since=${encodeURIComponent(since)}` - : `/api/rooms/${encodeURIComponent(roomId)}/messages`; + const url = + since !== undefined + ? `/api/rooms/${encodeURIComponent(roomId)}/messages?since=${encodeURIComponent(since)}` + : `/api/rooms/${encodeURIComponent(roomId)}/messages`; const res = await fetch(url); const body: unknown = await res.json(); if (!isMessagesResponse(body)) throw new Error("Invalid messages response"); @@ -93,6 +94,9 @@ export async function postAction(action: Action): Promise { // WebSocket client // --------------------------------------------------------------------------- +/** Delay before attempting to reconnect a dropped WebSocket connection. */ +const RECONNECT_DELAY_MS = 3000; + export interface WsEventHandler { onOpen?: () => void; onClose?: () => void; @@ -104,7 +108,7 @@ export class CommsWs { private reconnectTimer: ReturnType | undefined; private readonly handler: WsEventHandler; - constructor(handler: WsEventHandler) { + constructor(handler: Readonly) { this.handler = handler; } @@ -157,6 +161,6 @@ export class CommsWs { private scheduleReconnect(): void { this.reconnectTimer = setTimeout(() => { this.connect(); - }, 3000); + }, RECONNECT_DELAY_MS); } } diff --git a/src/bridges/user/web/frontend/components/App.tsx b/src/bridges/user/web/frontend/components/App.tsx index bdc0f2d..f4215f1 100644 --- a/src/bridges/user/web/frontend/components/App.tsx +++ b/src/bridges/user/web/frontend/components/App.tsx @@ -11,11 +11,11 @@ import { ChatArea } from "./ChatArea.js"; import { Sidebar } from "./Sidebar.js"; export interface AppProps { - rooms: Room[]; - agents: Agent[]; + rooms: readonly Room[]; + agents: readonly Agent[]; currentRoom: string | undefined; dmTarget: string | undefined; - messages: DisplayMessage[]; + messages: readonly DisplayMessage[]; connected: boolean; onJoinRoom: (roomId: string) => void; onSelectAgent: (agentId: string) => void; diff --git a/src/bridges/user/web/frontend/components/ChatArea.tsx b/src/bridges/user/web/frontend/components/ChatArea.tsx index 61c028a..fd1373f 100644 --- a/src/bridges/user/web/frontend/components/ChatArea.tsx +++ b/src/bridges/user/web/frontend/components/ChatArea.tsx @@ -9,7 +9,7 @@ import { parseInput } from "../input.js"; import { MessageList } from "./MessageList.js"; interface ChatAreaProps { - messages: DisplayMessage[]; + messages: readonly DisplayMessage[]; currentRoom: string | undefined; dmTarget: string | undefined; connected: boolean; @@ -30,7 +30,8 @@ export function ChatArea({ const [inputText, setInputText] = useState(""); const headerText = - currentRoom ?? (dmTarget ? `DM with ${dmTarget}` : "Select a room"); + currentRoom ?? + (dmTarget !== undefined ? `DM with ${dmTarget}` : "Select a room"); const handleSend = () => { const trimmed = inputText.trim(); @@ -58,7 +59,7 @@ export function ChatArea({